Lines Matching refs:pNode
369 #define NCELL(pNode) readInt16(&(pNode)->zData[2]) argument
640 static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){ in nodeHashInsert() argument
642 assert( pNode->pNext==0 ); in nodeHashInsert()
643 iHash = nodeHash(pNode->iNode); in nodeHashInsert()
644 pNode->pNext = pRtree->aHash[iHash]; in nodeHashInsert()
645 pRtree->aHash[iHash] = pNode; in nodeHashInsert()
651 static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ in nodeHashDelete() argument
653 if( pNode->iNode!=0 ){ in nodeHashDelete()
654 pp = &pRtree->aHash[nodeHash(pNode->iNode)]; in nodeHashDelete()
655 for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); } in nodeHashDelete()
656 *pp = pNode->pNext; in nodeHashDelete()
657 pNode->pNext = 0; in nodeHashDelete()
668 RtreeNode *pNode; in nodeNew() local
669 pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); in nodeNew()
670 if( pNode ){ in nodeNew()
671 memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); in nodeNew()
672 pNode->zData = (u8 *)&pNode[1]; in nodeNew()
673 pNode->nRef = 1; in nodeNew()
675 pNode->pParent = pParent; in nodeNew()
676 pNode->isDirty = 1; in nodeNew()
679 return pNode; in nodeNew()
703 RtreeNode *pNode = 0; in nodeAcquire() local
708 if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ in nodeAcquire()
709 if( pParent && pParent!=pNode->pParent ){ in nodeAcquire()
713 pNode->nRef++; in nodeAcquire()
714 *ppNode = pNode; in nodeAcquire()
745 pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); in nodeAcquire()
746 if( !pNode ){ in nodeAcquire()
749 pNode->pParent = pParent; in nodeAcquire()
750 pNode->zData = (u8 *)&pNode[1]; in nodeAcquire()
751 pNode->nRef = 1; in nodeAcquire()
753 pNode->iNode = iNode; in nodeAcquire()
754 pNode->isDirty = 0; in nodeAcquire()
755 pNode->pNext = 0; in nodeAcquire()
756 rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, in nodeAcquire()
767 if( rc==SQLITE_OK && pNode && iNode==1 ){ in nodeAcquire()
768 pRtree->iDepth = readInt16(pNode->zData); in nodeAcquire()
779 if( pNode && rc==SQLITE_OK ){ in nodeAcquire()
780 if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ in nodeAcquire()
787 if( pNode!=0 ){ in nodeAcquire()
789 nodeHashInsert(pRtree, pNode); in nodeAcquire()
794 *ppNode = pNode; in nodeAcquire()
796 if( pNode ){ in nodeAcquire()
798 sqlite3_free(pNode); in nodeAcquire()
811 RtreeNode *pNode, /* The node into which the cell is to be written */ in nodeOverwriteCell() argument
816 u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; in nodeOverwriteCell()
821 pNode->isDirty = 1; in nodeOverwriteCell()
827 static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){ in nodeDeleteCell() argument
828 u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; in nodeDeleteCell()
830 int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell; in nodeDeleteCell()
832 writeInt16(&pNode->zData[2], NCELL(pNode)-1); in nodeDeleteCell()
833 pNode->isDirty = 1; in nodeDeleteCell()
844 RtreeNode *pNode, /* Write new cell into this node */ in nodeInsertCell() argument
851 nCell = NCELL(pNode); in nodeInsertCell()
855 nodeOverwriteCell(pRtree, pNode, pCell, nCell); in nodeInsertCell()
856 writeInt16(&pNode->zData[2], nCell+1); in nodeInsertCell()
857 pNode->isDirty = 1; in nodeInsertCell()
866 static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ in nodeWrite() argument
868 if( pNode->isDirty ){ in nodeWrite()
870 if( pNode->iNode ){ in nodeWrite()
871 sqlite3_bind_int64(p, 1, pNode->iNode); in nodeWrite()
875 sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC); in nodeWrite()
877 pNode->isDirty = 0; in nodeWrite()
880 if( pNode->iNode==0 && rc==SQLITE_OK ){ in nodeWrite()
881 pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); in nodeWrite()
882 nodeHashInsert(pRtree, pNode); in nodeWrite()
892 static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ in nodeRelease() argument
894 if( pNode ){ in nodeRelease()
895 assert( pNode->nRef>0 ); in nodeRelease()
897 pNode->nRef--; in nodeRelease()
898 if( pNode->nRef==0 ){ in nodeRelease()
900 if( pNode->iNode==1 ){ in nodeRelease()
903 if( pNode->pParent ){ in nodeRelease()
904 rc = nodeRelease(pRtree, pNode->pParent); in nodeRelease()
907 rc = nodeWrite(pRtree, pNode); in nodeRelease()
909 nodeHashDelete(pRtree, pNode); in nodeRelease()
910 sqlite3_free(pNode); in nodeRelease()
923 RtreeNode *pNode, /* The node from which to extract the ID */ in nodeGetRowid() argument
926 assert( iCell<NCELL(pNode) ); in nodeGetRowid()
927 return readInt64(&pNode->zData[4 + pRtree->nBytesPerCell*iCell]); in nodeGetRowid()
935 RtreeNode *pNode, /* The node from which to extract a coordinate */ in nodeGetCoord() argument
940 readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); in nodeGetCoord()
949 RtreeNode *pNode, /* The node containing the cell to be read */ in nodeGetCell() argument
956 pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell); in nodeGetCell()
957 pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell); in nodeGetCell()
1359 RtreeNode *pNode, in nodeRowidIndex() argument
1364 int nCell = NCELL(pNode); in nodeRowidIndex()
1367 if( nodeGetRowid(pRtree, pNode, ii)==iRowid ){ in nodeRowidIndex()
1380 static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){ in nodeParentIndex() argument
1381 RtreeNode *pParent = pNode->pParent; in nodeParentIndex()
1383 return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex); in nodeParentIndex()
1612 RtreeNode *pNode; in rtreeStepToLeaf() local
1624 pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); in rtreeStepToLeaf()
1626 nCell = NCELL(pNode); in rtreeStepToLeaf()
1628 pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); in rtreeStepToLeaf()
1712 RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); in rtreeRowid() local
1714 *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); in rtreeRowid()
1728 RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); in rtreeColumn() local
1733 sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); in rtreeColumn()
1735 nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c); in rtreeColumn()
1753 nodeGetRowid(pRtree, pNode, p->iCell)); in rtreeColumn()
2205 RtreeNode *pNode = 0; in ChooseLeaf() local
2206 rc = nodeAcquire(pRtree, 1, 0, &pNode); in ChooseLeaf()
2215 int nCell = NCELL(pNode); in ChooseLeaf()
2229 nodeGetCell(pRtree, pNode, iCell, &cell); in ChooseLeaf()
2243 rc = nodeAcquire(pRtree, iBest, pNode, &pChild); in ChooseLeaf()
2244 nodeRelease(pRtree, pNode); in ChooseLeaf()
2245 pNode = pChild; in ChooseLeaf()
2248 *ppLeaf = pNode; in ChooseLeaf()
2259 RtreeNode *pNode, /* Adjust ancestry of this node. */ in AdjustTree() argument
2262 RtreeNode *p = pNode; in AdjustTree()
2558 RtreeNode *pNode, in updateMapping() argument
2566 for(p=pNode; p; p=p->pParent){ in updateMapping()
2571 nodeReference(pNode); in updateMapping()
2572 pChild->pParent = pNode; in updateMapping()
2575 if( NEVER(pNode==0) ) return SQLITE_ERROR; in updateMapping()
2576 return xSetMapping(pRtree, iRowid, pNode->iNode); in updateMapping()
2581 RtreeNode *pNode, in SplitNode() argument
2589 int nCell = NCELL(pNode); in SplitNode()
2610 nodeGetCell(pRtree, pNode, i, &aCell[i]); in SplitNode()
2612 nodeZero(pRtree, pNode); in SplitNode()
2616 if( pNode->iNode==1 ){ in SplitNode()
2617 pRight = nodeNew(pRtree, pNode); in SplitNode()
2618 pLeft = nodeNew(pRtree, pNode); in SplitNode()
2620 pNode->isDirty = 1; in SplitNode()
2621 writeInt16(pNode->zData, pRtree->iDepth); in SplitNode()
2623 pLeft = pNode; in SplitNode()
2656 if( pNode->iNode==1 ){ in SplitNode()
2688 if( pNode->iNode==1 ){ in SplitNode()
2762 static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){ in removeNode() argument
2768 assert( pNode->nRef==1 ); in removeNode()
2771 rc = nodeParentIndex(pRtree, pNode, &iCell); in removeNode()
2773 pParent = pNode->pParent; in removeNode()
2774 pNode->pParent = 0; in removeNode()
2787 sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode); in removeNode()
2794 sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode); in removeNode()
2803 nodeHashDelete(pRtree, pNode); in removeNode()
2804 pNode->iNode = iHeight; in removeNode()
2805 pNode->pNext = pRtree->pDeleted; in removeNode()
2806 pNode->nRef++; in removeNode()
2807 pRtree->pDeleted = pNode; in removeNode()
2812 static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){ in fixBoundingBox() argument
2813 RtreeNode *pParent = pNode->pParent; in fixBoundingBox()
2817 int nCell = NCELL(pNode); in fixBoundingBox()
2819 nodeGetCell(pRtree, pNode, 0, &box); in fixBoundingBox()
2822 nodeGetCell(pRtree, pNode, ii, &cell); in fixBoundingBox()
2825 box.iRowid = pNode->iNode; in fixBoundingBox()
2826 rc = nodeParentIndex(pRtree, pNode, &ii); in fixBoundingBox()
2839 static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){ in deleteCell() argument
2843 if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){ in deleteCell()
2850 nodeDeleteCell(pRtree, pNode, iCell); in deleteCell()
2857 pParent = pNode->pParent; in deleteCell()
2858 assert( pParent || pNode->iNode==1 ); in deleteCell()
2860 if( NCELL(pNode)<RTREE_MINCELLS(pRtree) ){ in deleteCell()
2861 rc = removeNode(pRtree, pNode, iHeight); in deleteCell()
2863 rc = fixBoundingBox(pRtree, pNode); in deleteCell()
2872 RtreeNode *pNode, in Reinsert() argument
2889 nCell = NCELL(pNode)+1; in Reinsert()
2912 nodeGetCell(pRtree, pNode, ii, &aCell[ii]); in Reinsert()
2934 nodeZero(pRtree, pNode); in Reinsert()
2938 nodeInsertCell(pRtree, pNode, p); in Reinsert()
2941 rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); in Reinsert()
2943 rc = parentWrite(pRtree, p->iRowid, pNode->iNode); in Reinsert()
2948 rc = fixBoundingBox(pRtree, pNode); in Reinsert()
2977 RtreeNode *pNode, in rtreeInsertCell() argument
2986 nodeReference(pNode); in rtreeInsertCell()
2987 pChild->pParent = pNode; in rtreeInsertCell()
2990 if( nodeInsertCell(pRtree, pNode, pCell) ){ in rtreeInsertCell()
2991 if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){ in rtreeInsertCell()
2992 rc = SplitNode(pRtree, pNode, pCell, iHeight); in rtreeInsertCell()
2995 rc = Reinsert(pRtree, pNode, pCell, iHeight); in rtreeInsertCell()
2998 rc = AdjustTree(pRtree, pNode, pCell); in rtreeInsertCell()
3001 rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode); in rtreeInsertCell()
3003 rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode); in rtreeInsertCell()
3010 static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){ in reinsertNodeContent() argument
3013 int nCell = NCELL(pNode); in reinsertNodeContent()
3018 nodeGetCell(pRtree, pNode, ii, &cell); in reinsertNodeContent()
3023 rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert); in reinsertNodeContent()
3026 rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode); in reinsertNodeContent()
4049 const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); in rtreeCheckGetNode() local
4054 memcpy(pRet, pNode, nNode); in rtreeCheckGetNode()