You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			1161 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1161 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2014 InfiniDB, Inc.
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; version 2 of
 | |
|    the License.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | |
|    MA 02110-1301, USA. */
 | |
| 
 | |
| /* ========================================================================== */
 | |
| /*                                                                            */
 | |
| /*   Filename.c                                                               */
 | |
| /*   (c) 2001 Author                                                          */
 | |
| /*                                                                            */
 | |
| /*   Description                                                              */
 | |
| /*                                                                            */
 | |
| /* ========================================================================== */
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #ifndef _MSC_VER
 | |
| #include <inttypes.h>
 | |
| #endif
 | |
| #include "we_indextree.h"
 | |
| #include "we_indexlist.h"
 | |
| 
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| namespace WriteEngine
 | |
| {
 | |
| 
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * Find a entry for the given rowId and Key
 | |
|  * Then Delete it from the list
 | |
|  * Move the rest of the row id up in the same
 | |
|  * sub block an decrement the count in that subblock
 | |
|  * decrement the header size
 | |
|  * Converted
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     rowId       -- row id
 | |
|  *     key         -- value
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  *
 | |
|  * return value
 | |
|  *        Success -- 0
 | |
|  *        Fail    -- ERR_IDX_LIST_INVALID_DELETE
 | |
|  ************************************************/
 | |
| const int  IndexList::deleteInSub( const RID& rowId)
 | |
| {
 | |
| 
 | |
|     int rc = ERR_IDX_LIST_INVALID_DELETE;
 | |
|     DataBlock prevDataBlock;
 | |
|     int pos = 0, totalbytes = 0;
 | |
|     IdxRidListPtr* lastIdxRidListPtr;
 | |
|     int type;
 | |
| 
 | |
|     CommBlock cb;
 | |
|     cb.file.oid   = m_oid;
 | |
|     cb.file.pFile = m_pFile;
 | |
| 
 | |
|     //get thelbid sbid and entry out from the header last entry
 | |
|     //First Sub-block
 | |
|     m_lbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->fbo;
 | |
|     m_sbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->sbid;
 | |
|     m_entry = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->entry;
 | |
|     //Read the pointer entry at LIST_SUB_LLP_POS location
 | |
| 
 | |
|     IdxRidListEntry rowIdArray[MAX_BLOCK_ENTRY];
 | |
|     IdxRidListEntry newRowIdArray[MAX_BLOCK_ENTRY];
 | |
|     memset(rowIdArray, 0, BYTE_PER_BLOCK);
 | |
|     memset(newRowIdArray, 0, BYTE_PER_BLOCK);
 | |
|     //First link
 | |
|     pos = LIST_SUB_LLP_POS;
 | |
|     totalbytes = SUBBLOCK_TOTAL_BYTES;
 | |
|     m_entryGroup = ENTRY_32;
 | |
| 
 | |
|     if (m_lbid != m_hdrLbid)
 | |
|     {
 | |
|         rc = readDBFile(cb, &m_curBlock, m_lbid );
 | |
| 
 | |
|         if (rc != NO_ERROR)
 | |
|             return rc;
 | |
| 
 | |
|         rc = readSubBlockEntry(cb, &m_curBlock, m_lbid,
 | |
|                                m_sbid, 0, totalbytes,
 | |
|                                rowIdArray);
 | |
| 
 | |
|         if (rc != NO_ERROR)
 | |
|             return rc;
 | |
| 
 | |
|         m_curBlock.dirty = true;
 | |
|         m_curBlock.lbid = m_lbid;
 | |
|         m_curBlock.state = BLK_READ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         if (m_hdrBlock.state >= BLK_READ)
 | |
|             getSubBlockEntry(m_hdrBlock.data, m_sbid,
 | |
|                              0, totalbytes, rowIdArray );
 | |
|         else
 | |
|             return ERR_IDX_LIST_INVALID_DELETE;
 | |
|     }
 | |
| 
 | |
|     lastIdxRidListPtr = (IdxRidListPtr*)&rowIdArray[pos];
 | |
|     int count;
 | |
|     type  = lastIdxRidListPtr->type;  //next type
 | |
|     count = lastIdxRidListPtr->count;//current count
 | |
| 
 | |
|     for (int i = 0; i < count; i++)
 | |
|     {
 | |
|         if (rowIdArray[i].rid == rowId)
 | |
|         {
 | |
|             //found
 | |
|             m_dLbid = m_lbid;
 | |
|             m_dSbid = m_sbid;
 | |
|             m_dEntry = i;
 | |
|             rc = NO_ERROR;
 | |
|             memcpy(&newRowIdArray[0],
 | |
|                    &rowIdArray[0], totalbytes);
 | |
|             lastIdxRidListPtr->count--;
 | |
| 
 | |
|             if (lastIdxRidListPtr->count == 0)
 | |
|             {
 | |
|                 if (type == LIST_SIZE_TYPE)
 | |
|                 {
 | |
|                     //header has no link
 | |
|                     m_curIdxRidListHdr.nextIdxRidListPtr.type
 | |
|                         = LIST_NOT_USED_TYPE;
 | |
|                     m_curIdxRidListHdr.nextIdxRidListPtr.llp = 0;
 | |
| 
 | |
|                 }
 | |
|             }//header's link block has nothing now
 | |
|             else //still have more
 | |
|             {
 | |
|                 memcpy(&rowIdArray[i], &newRowIdArray[i + 1], (count - (i + 1))*LIST_ENTRY_WIDTH);
 | |
|             }
 | |
| 
 | |
|             //last row id entry now moved up, so not used
 | |
|             rowIdArray[count - 1].type  = LIST_NOT_USED_TYPE;
 | |
|             rowIdArray[count - 1].rid   = 0;
 | |
|             rowIdArray[count - 1].spare = 0;
 | |
|             //header update the size
 | |
|             m_curIdxRidListHdr.idxRidListSize.size--;
 | |
| 
 | |
|             if (m_lbid != m_hdrLbid)
 | |
|             {
 | |
|                 setSubBlockEntry( m_curBlock.data,
 | |
|                                   m_sbid, 0, totalbytes,
 | |
|                                   rowIdArray );
 | |
|                 rc = writeDBFile( cb, m_curBlock.data,  m_lbid);
 | |
| 
 | |
|                 if (rc != NO_ERROR)
 | |
|                     return rc;
 | |
| 
 | |
|                 m_curBlock.state = BLK_READ;
 | |
|                 rc = writeSubBlockEntry(cb, &m_hdrBlock,
 | |
|                                         m_hdrLbid, m_hdrSbid,
 | |
|                                         m_hdrEntry,
 | |
|                                         LIST_HDR_SIZE,
 | |
|                                         &m_curIdxRidListHdr );
 | |
| 
 | |
|                 if (rc != NO_ERROR)
 | |
|                     return rc;
 | |
| 
 | |
|                 m_hdrBlock.state = BLK_READ;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 //m_lbid==m_hdrLbid
 | |
|                 setSubBlockEntry( m_hdrBlock.data,
 | |
|                                   m_sbid, 0, totalbytes,
 | |
|                                   rowIdArray );
 | |
|                 setSubBlockEntry( m_hdrBlock.data,
 | |
|                                   m_hdrSbid, m_hdrEntry,
 | |
|                                   LIST_HDR_SIZE,
 | |
|                                   &m_curIdxRidListHdr);
 | |
|                 m_hdrBlock.state = BLK_WRITE;
 | |
|                 rc = writeDBFile( cb, m_hdrBlock.data,
 | |
|                                   m_hdrLbid);
 | |
| 
 | |
|                 if (rc != NO_ERROR)
 | |
|                     return rc;
 | |
| 
 | |
|                 m_hdrBlock.state = BLK_READ;
 | |
|             } //end if m_lbid==m_hdrHdrLbid
 | |
| 
 | |
|             m_dEntry = i;
 | |
|             return rc;
 | |
|         }//endif  found
 | |
|     }//end for
 | |
| 
 | |
|     return rc;
 | |
| }
 | |
| /************************************************
 | |
|    * Description:
 | |
|    * Find a entry for the given rowId and Key
 | |
|    * Then Delete it from the list
 | |
|    * Move the rest of the row id up in the same
 | |
|    * sub block an decrement the count in that subblock
 | |
|    * decrement the header size
 | |
|    * Converted
 | |
|    * input
 | |
|    *     pFile       -- File Handler
 | |
|    *     rowId       -- row id
 | |
|    *     key         -- value
 | |
|    *     curIdxRidListHdrPtr - point to the header
 | |
|    *
 | |
|    * return value
 | |
|    *        Success -- 0
 | |
|    *        Fail    -- ERR_IDX_LIST_INVALID_DELETE
 | |
|    ************************************************/
 | |
| 
 | |
| const int IndexList::deleteInBlock(const RID& rowId)
 | |
| {
 | |
|     int width = LIST_ENTRY_WIDTH;
 | |
|     int rc = ERR_IDX_LIST_INVALID_DELETE;
 | |
|     IdxRidListPtr* lastIdxRidListPtr;
 | |
|     IdxRidListPtr lastSubIdxRidListPtr;
 | |
|     bool found;
 | |
|     int type, count;
 | |
|     IdxRidListPtr prevIdxRidListPtr;
 | |
|     int  prevSbid, prevEntry, prevType;
 | |
|     uint64_t prevLbid;
 | |
|     DataBlock prevDataBlock;
 | |
|     int pos = 0, totalbytes = 0;
 | |
|     int preTotalBytes, prevPos ;
 | |
|     //IdxRidNextListPtr *nextIdxListPtr;
 | |
| 
 | |
|     IdxRidListEntry rowIdArray[MAX_BLOCK_ENTRY];
 | |
|     IdxRidListEntry newRowIdArray[MAX_BLOCK_ENTRY];
 | |
| 
 | |
|     CommBlock cb;
 | |
|     cb.file.oid   = m_oid;
 | |
|     cb.file.pFile = m_pFile;
 | |
|     //This is the sub block info
 | |
|     prevLbid   = m_lbid;
 | |
|     prevSbid   = m_sbid;
 | |
|     prevEntry  = m_entry;
 | |
|     prevPos = LIST_SUB_LLP_POS;
 | |
|     preTotalBytes = SUBBLOCK_TOTAL_BYTES;
 | |
| 
 | |
|     if (prevLbid == m_hdrLbid)
 | |
|     {
 | |
|         if (m_hdrBlock.state >= BLK_READ)
 | |
|             getSubBlockEntry(m_hdrBlock.data, m_sbid,
 | |
|                              prevPos, LIST_ENTRY_WIDTH, &lastSubIdxRidListPtr );
 | |
|         else
 | |
|             return ERR_IDX_LIST_INVALID_DELETE;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         if (m_curBlock.state >= BLK_READ)
 | |
|             getSubBlockEntry(m_curBlock.data, m_sbid,
 | |
|                              prevPos, LIST_ENTRY_WIDTH, &lastSubIdxRidListPtr );
 | |
|         else
 | |
|             return ERR_IDX_LIST_INVALID_DELETE;
 | |
|     }
 | |
| 
 | |
|     found = false;
 | |
|     m_lbid    = ((IdxEmptyListEntry*)&lastSubIdxRidListPtr)->fbo;
 | |
|     m_sbid    = 0;
 | |
|     m_entry   = 0;
 | |
| 
 | |
|     type  = lastSubIdxRidListPtr.type;
 | |
|     count = lastSubIdxRidListPtr.count;
 | |
|     pos = LIST_BLOCK_LLP_POS;
 | |
|     totalbytes = BYTE_PER_BLOCK;
 | |
| 
 | |
|     //Not found in the first sub
 | |
|     while ((!found) && (type == LIST_BLOCK_TYPE))
 | |
|     {
 | |
|         rc = readSubBlockEntry(cb, &m_curBlock, m_lbid, 0, 0,
 | |
|                                totalbytes, rowIdArray);
 | |
| 
 | |
|         if (rc != NO_ERROR)
 | |
|             return rc;
 | |
| 
 | |
|         m_curBlock.dirty = true;
 | |
|         m_curBlock.state = BLK_READ;
 | |
|         m_curBlock.lbid = m_lbid;
 | |
|         prevType = type; //Save it just in case not found here
 | |
|         lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
|         type  = lastIdxRidListPtr->type;
 | |
|         count = lastIdxRidListPtr->count;
 | |
| 
 | |
|         //prepared for not found in current block
 | |
|         //find out what is the next type
 | |
|         //Next Type is needed here
 | |
|         for (int i = 0; i < count; i++)
 | |
|         {
 | |
|             if (rowIdArray[i].rid == rowId)
 | |
|             {
 | |
|                 //found the rowid
 | |
|                 memcpy(&newRowIdArray[0], &rowIdArray[0], totalbytes);
 | |
|                 found = true;
 | |
|                 m_dLbid = m_lbid;
 | |
|                 m_dSbid = m_sbid;
 | |
|                 m_dEntry = i;
 | |
|                 lastIdxRidListPtr->count--;
 | |
| 
 | |
|                 if (lastIdxRidListPtr->count == 0)
 | |
|                 {
 | |
|                     if (!m_useNarray)
 | |
|                     {
 | |
|                         //get the previous value out, could be a sub block
 | |
|                         if (prevLbid == m_hdrLbid)
 | |
|                             getSubBlockEntry(m_hdrBlock.data, prevSbid,
 | |
|                                              prevPos, LIST_ENTRY_WIDTH,
 | |
|                                              &prevIdxRidListPtr);
 | |
|                         else if (prevLbid == m_lbid)
 | |
|                             getSubBlockEntry(m_curBlock.data, prevSbid,
 | |
|                                              prevPos, LIST_ENTRY_WIDTH,
 | |
|                                              &prevIdxRidListPtr);
 | |
|                         else
 | |
|                             rc = readSubBlockEntry(cb, &prevDataBlock, prevLbid,
 | |
|                                                    prevSbid, prevPos, LIST_ENTRY_WIDTH,
 | |
|                                                    &prevIdxRidListPtr);
 | |
| 
 | |
|                         if (rc != NO_ERROR)
 | |
|                             return rc;
 | |
| 
 | |
|                         //check the type before set
 | |
|                         if (type == LIST_BLOCK_TYPE)
 | |
|                         {
 | |
|                             ((IdxEmptyListEntry*)&prevIdxRidListPtr)->fbo
 | |
|                                 = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
|                             ((IdxEmptyListEntry*)&prevIdxRidListPtr)->sbid
 | |
|                                 = ((IdxEmptyListEntry*)lastIdxRidListPtr)->sbid;
 | |
|                             ((IdxEmptyListEntry*)&prevIdxRidListPtr)->entry
 | |
|                                 = ((IdxEmptyListEntry*)lastIdxRidListPtr)->entry;
 | |
|                             //safety check
 | |
|                             prevIdxRidListPtr.type = type;
 | |
|                         }
 | |
|                         else // If no more links, the current one is gone also
 | |
|                         {
 | |
|                             if (prevIdxRidListPtr.count > 0)
 | |
|                             {
 | |
|                                 prevIdxRidListPtr.type = 0;
 | |
|                                 prevIdxRidListPtr.llp = 0;
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 //In case it is a sub block, not released with 0 count
 | |
|                                 prevIdxRidListPtr.type = LIST_NOT_USED_TYPE;
 | |
|                                 prevIdxRidListPtr.llp = 0;
 | |
|                             }
 | |
|                         }//end if type =LIST_SUBBLOCK_TYPE,LIST_BLOCK_TYPE
 | |
| 
 | |
|                         //;set to LIST_NOT_USED_TYPE--unused before release
 | |
|                         lastIdxRidListPtr->type = LIST_NOT_USED_TYPE;
 | |
|                         lastIdxRidListPtr->llp = 0;
 | |
| 
 | |
|                         if (prevPos == LIST_BLOCK_LLP_POS)
 | |
|                         {
 | |
|                             if (prevLbid < m_lastLbid)
 | |
|                                 rc = setLastLbid(prevLbid);
 | |
|                         }
 | |
|                     }
 | |
|                 } //end if count==0
 | |
|                 else
 | |
|                 {
 | |
|                     memcpy(&rowIdArray[i], &newRowIdArray[i + 1], (count - (i + 1))*LIST_ENTRY_WIDTH);
 | |
| 
 | |
|                     if (m_lastLbid > m_lbid)
 | |
|                         rc = setLastLbid(m_lbid);
 | |
| 
 | |
|                 }//count check
 | |
| 
 | |
|                 //Found rowId
 | |
|                 rowIdArray[count - 1].type = LIST_NOT_USED_TYPE;
 | |
|                 rowIdArray[count - 1].rid = 0;
 | |
| 
 | |
|                 m_curIdxRidListHdr.idxRidListSize.size--;
 | |
|                 //Write Out Put in another routine
 | |
| 
 | |
|                 if ((prevLbid == m_hdrLbid) && (m_lbid != m_hdrLbid))
 | |
|                 {
 | |
|                     // AAC --3
 | |
|                     if (!m_useNarray)
 | |
|                     {
 | |
|                         if (lastIdxRidListPtr->count == 0)
 | |
|                         {
 | |
|                             setSubBlockEntry( m_hdrBlock.data, prevSbid,
 | |
|                                               prevPos, width,
 | |
|                                               &prevIdxRidListPtr );
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     setSubBlockEntry( m_curBlock.data, m_sbid,
 | |
|                                       0, totalbytes,
 | |
|                                       rowIdArray );
 | |
|                     setSubBlockEntry( m_hdrBlock.data, m_hdrSbid,
 | |
|                                       m_hdrEntry, LIST_HDR_SIZE,
 | |
|                                       &m_curIdxRidListHdr );
 | |
|                     rc = writeDBFile( cb, m_hdrBlock.data,  m_hdrLbid);
 | |
| 
 | |
|                     if (rc != NO_ERROR)
 | |
|                         return rc;
 | |
| 
 | |
|                     rc = writeDBFile( cb, m_curBlock.data,  m_lbid);
 | |
| 
 | |
|                     if (rc != NO_ERROR)
 | |
|                         return rc;
 | |
| 
 | |
|                     m_hdrBlock.state = BLK_READ;
 | |
|                     m_curBlock.state = BLK_READ;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     //ABC --
 | |
|                     if (!m_useNarray)
 | |
|                     {
 | |
|                         if (lastIdxRidListPtr->count == 0)
 | |
|                         {
 | |
|                             setSubBlockEntry( prevDataBlock.data, prevSbid,
 | |
|                                               prevPos, LIST_ENTRY_WIDTH,
 | |
|                                               &prevIdxRidListPtr );
 | |
|                             rc = writeDBFile( cb, prevDataBlock.data, prevLbid);
 | |
| 
 | |
|                             if (rc != NO_ERROR)
 | |
|                                 return rc;
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     setSubBlockEntry( m_curBlock.data, m_sbid,
 | |
|                                       0, totalbytes,
 | |
|                                       rowIdArray );
 | |
|                     setSubBlockEntry( m_hdrBlock.data, m_hdrSbid,
 | |
|                                       m_hdrEntry, LIST_HDR_SIZE,
 | |
|                                       &m_curIdxRidListHdr );
 | |
|                     rc = writeDBFile( cb, m_hdrBlock.data,  m_hdrLbid);
 | |
| 
 | |
|                     if (rc != NO_ERROR)
 | |
|                         return rc;
 | |
| 
 | |
|                     rc = writeDBFile( cb, m_curBlock.data,  m_lbid);
 | |
|                     memset(m_hdrBlock.data, 0,
 | |
|                            sizeof(m_hdrBlock.data));
 | |
| 
 | |
|                     if (rc != NO_ERROR)
 | |
|                         return rc;
 | |
| 
 | |
|                     m_hdrBlock.state = BLK_READ;
 | |
|                     m_curBlock.state = BLK_READ;
 | |
|                 } //last case A B C  --end 5
 | |
| 
 | |
|                 //Done with writing to disk
 | |
|                 // Now we need to release the segment
 | |
|                 if (!m_useNarray)
 | |
|                 {
 | |
|                     if (lastIdxRidListPtr->count == 0)
 | |
|                     {
 | |
|                         rc = releaseSegment();
 | |
| 
 | |
|                         if (rc != NO_ERROR)
 | |
|                             return rc;
 | |
|                     }// end release segment when count ==0
 | |
|                 }
 | |
| 
 | |
|                 m_entry = i; //for use in findRow ID
 | |
|                 return rc; //DONE !!!found then we return, no need to go on
 | |
|             }//FOUND THE ROWID returned !!!!
 | |
|         }//for loop i not found continue to i++
 | |
| 
 | |
|         //NOT FOUND in this block go to next block
 | |
|         //assigning the current llp as previous llp:lbid, sbid, entry
 | |
|         prevLbid    = m_lbid;
 | |
|         prevSbid    = 0;
 | |
|         prevEntry   = 0;
 | |
|         prevPos     = pos;
 | |
|         preTotalBytes = totalbytes;
 | |
| 
 | |
|         m_lbid     = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
|         m_sbid     = 0;
 | |
|         m_entry    = 0;
 | |
|     }// end while
 | |
| 
 | |
|     if (!found)
 | |
|         rc = ERR_IDX_LIST_INVALID_DELETE;
 | |
| 
 | |
|     return rc;
 | |
| }
 | |
| 
 | |
| 
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * Converted
 | |
|  * Find an entry for the given rowId and Key
 | |
|  * Then Delete it from the list
 | |
|  * Move the rest of the row id up in the same
 | |
|  * sub block an decrement the count in that subblock
 | |
|  * decrement the header size
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     rowId       -- row id
 | |
|  *     key         -- value
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  *
 | |
|  * return value
 | |
|  *        Success -- 0
 | |
|  *        Fail    -- ERR_IDX_LIST_INVALID_DELETE
 | |
|  ************************************************/
 | |
| const int      IndexList::deleteIndexList( FILE* pFile, const RID& rowId,
 | |
|         const uint64_t& key, IdxEmptyListEntry* curIdxRidListHdrPtr,
 | |
|         uint64_t& lbid, int& sbid, int& entry)
 | |
| {
 | |
|     int rc = ERR_IDX_LIST_INVALID_DELETE;
 | |
|     bool found = false;
 | |
| 
 | |
|     m_pFile = pFile;
 | |
|     getHdrInfo(curIdxRidListHdrPtr);
 | |
| 
 | |
|     if (key != m_curIdxRidListHdr.key)
 | |
|     {
 | |
|         return ERR_IDX_LIST_INVALID_KEY;
 | |
|     }
 | |
| 
 | |
|     uint64_t dlbid = -1LL;
 | |
|     int dsbid = -1;
 | |
|     int dentry = -1;
 | |
|     rc = deleteIndexList(rowId, key, dlbid, dsbid, dentry);
 | |
| 
 | |
|     if (rc != NO_ERROR)
 | |
|     {
 | |
|         lbid = -1LL;
 | |
|         sbid = -1;
 | |
|         entry = -1;
 | |
|         found = false;
 | |
|         return rc;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         lbid = dlbid;
 | |
|         sbid = dsbid;
 | |
|         entry = dentry;
 | |
|     }
 | |
| 
 | |
|     return rc;
 | |
| }
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * No change
 | |
|  * Find a entry for the given rowId and Key
 | |
|  * Then Delete it from the list
 | |
|  * Move the rest of the row id up in the same
 | |
|  * sub block an decrement the count in that subblock
 | |
|  * decrement the header size
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     rowId       -- row id
 | |
|  *     key         -- value
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  *
 | |
|  * return value
 | |
|  *        Success -- 0
 | |
|  *        Fail    -- ERR_IDX_LIST_INVALID_DELETE
 | |
|  ************************************************/
 | |
| const int      IndexList::deleteIndexList(const RID& rowId,
 | |
|         const uint64_t& key,
 | |
|         uint64_t& lbid, int& sbid, int& entry)
 | |
| {
 | |
|     int rc = ERR_IDX_LIST_INVALID_DELETE;
 | |
|     rc = deleteIndexList(rowId, key);
 | |
| 
 | |
|     lbid   = m_dLbid;
 | |
|     sbid   = m_dSbid;
 | |
|     entry  = m_dEntry;
 | |
|     return rc;
 | |
| }
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * Converted
 | |
|  * Find all of the row Id or toke from list
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  *
 | |
|  * return value
 | |
|  *        Success -- 0
 | |
|  *        Fail    -- ERR_IDX_LIST_INVALID_DELETE
 | |
|  ************************************************/
 | |
| const int    IndexList::getRIDArrayFromListHdr(FILE* pFile, uint64_t& key,
 | |
|         IdxEmptyListEntry* curIdxRidListHdrPtr,
 | |
|         RID* ridArray, int& size)
 | |
| {
 | |
|     int rc = NO_ERROR;
 | |
|     int arrayCount = 0;
 | |
|     IdxRidNextListPtr* nextIdxListPtr = NULL;
 | |
| 
 | |
|     m_pFile = pFile;
 | |
|     CommBlock cb;
 | |
|     cb.file.oid = m_oid;
 | |
|     cb.file.pFile = m_pFile;
 | |
| 
 | |
|     rc = getHdrInfo(curIdxRidListHdrPtr);
 | |
| 
 | |
|     if (m_curIdxRidListHdr.idxRidListSize.size == 0)
 | |
|     {
 | |
|         size = 0;
 | |
|         return NO_ERROR;
 | |
|     }
 | |
| 
 | |
|     if (key != m_curIdxRidListHdr.key)
 | |
|     {
 | |
|         return ERR_IDX_LIST_WRONG_KEY;
 | |
|     }
 | |
| 
 | |
|     // cout << "IndexList::getRIDArrayFromListHdr->KEY ------>" << key << endl;
 | |
|     //Check the first row location, 3rd enty
 | |
|     if (m_curIdxRidListHdr.firstIdxRidListEntry.type == (int)LIST_RID_TYPE)
 | |
|     {
 | |
|         ridArray[arrayCount] = (RID)m_curIdxRidListHdr.firstIdxRidListEntry.rid;
 | |
|         //cout<<" IndexList::getRIDArrayFromListHdr->header Lbid->" << m_hdrLbid <<" count->" << arrayCount <<endl;
 | |
| 
 | |
|         arrayCount++;
 | |
|         //cout << "RID = " << (RID)m_curIdxRidListHdr.firstIdxRidListEntry.rid << endl;
 | |
|     };
 | |
| 
 | |
|     //Check Header last entry's type
 | |
|     int type = m_curIdxRidListHdr.nextIdxRidListPtr.type;
 | |
| 
 | |
|     switch (type)
 | |
|     {
 | |
|         case LIST_RID_TYPE:// There is a row id here, Check!
 | |
|             ridArray[arrayCount] = (RID)m_curIdxRidListHdr.nextIdxRidListPtr.llp;
 | |
|             //cout<<"arrayCount->" << arrayCount << "rid->" << ridArray[arrayCount]<<endl;
 | |
|             arrayCount++;
 | |
|             //cout << "RID = " << (RID)m_curIdxRidListHdr.nextIdxRidListPtr.llp << endl;
 | |
| 
 | |
|             size = arrayCount;
 | |
|             return NO_ERROR;
 | |
| 
 | |
|         case LIST_SUBBLOCK_TYPE://Not found in header, so go to the sub-block
 | |
|             //get thelbid sbid and entry out from the header last entry
 | |
| 
 | |
|             m_lbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->fbo;
 | |
|             m_sbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->sbid;
 | |
|             m_entry = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->entry;
 | |
|             m_curType = type;
 | |
|             //Read the pointer entry at LIST_SUB_LLP_POS location
 | |
|             IdxRidListPtr* lastIdxRidListPtr;
 | |
|             IdxRidListEntry rowIdArray[MAX_BLOCK_ENTRY];
 | |
|             memset(rowIdArray, 0, BYTE_PER_BLOCK);
 | |
|             int  pos = 0, totalbytes = 0;
 | |
|             pos = LIST_SUB_LLP_POS;
 | |
|             totalbytes = SUBBLOCK_TOTAL_BYTES;
 | |
| 
 | |
|             if (m_lbid != m_hdrLbid)
 | |
|             {
 | |
|                 rc = readSubBlockEntry(cb, &m_curBlock, m_lbid,
 | |
|                                        m_sbid, 0, totalbytes,
 | |
|                                        rowIdArray);
 | |
|                 m_curBlock.lbid = m_lbid;
 | |
|                 m_curBlock.state = BLK_READ;
 | |
|                 m_curBlock.dirty = true;
 | |
|             }
 | |
|             else
 | |
|                 getSubBlockEntry(m_hdrBlock.data, m_sbid,
 | |
|                                  0, totalbytes,
 | |
|                                  rowIdArray );
 | |
| 
 | |
|             int type, count;
 | |
| 
 | |
|             lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
|             type  = lastIdxRidListPtr->type;
 | |
|             count = lastIdxRidListPtr->count;
 | |
| 
 | |
|             //cout << "count->" << count << endl;
 | |
|             //type should be LIST_BLOCK_TYPE from now on
 | |
|             for (int i = 0; i < count; i++)
 | |
|             {
 | |
|                 ridArray[arrayCount] = (RID)(rowIdArray[i].rid);
 | |
|                 //cout << "RID =" << (RID)(rowIdArray[i].rid) << endl;
 | |
|                 //cout<<"arrayCount->" << arrayCount << "rid->" << ridArray[arrayCount]<<endl;
 | |
|                 arrayCount++;
 | |
|             }
 | |
| 
 | |
|             //cout << "    Lbid->" << m_lbid ;
 | |
|             //cout << "    count->" << count << endl;
 | |
|             m_lbid = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
| 
 | |
|             while  (type == LIST_BLOCK_TYPE)
 | |
|             {
 | |
|                 //cout << "    Lbid->" << m_lbid ;
 | |
| 
 | |
|                 pos = LIST_BLOCK_LLP_POS;
 | |
|                 totalbytes = BYTE_PER_BLOCK;
 | |
|                 rc = readSubBlockEntry(cb, &m_curBlock, m_lbid, 0, 0,
 | |
|                                        totalbytes, rowIdArray);
 | |
|                 m_curBlock.lbid = m_lbid;
 | |
|                 m_curBlock.state = BLK_READ;
 | |
|                 m_curBlock.dirty = true;
 | |
| 
 | |
|                 if (!m_useNarray)
 | |
|                 {
 | |
|                     lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
|                     type  = lastIdxRidListPtr->type;
 | |
|                     count = lastIdxRidListPtr->count;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     nextIdxListPtr = (IdxRidNextListPtr*)&rowIdArray[pos];
 | |
|                     type  = nextIdxListPtr->type;
 | |
|                     count = nextIdxListPtr->count;
 | |
|                 }
 | |
| 
 | |
|                 //cout << "    count->" << count << endl;
 | |
|                 for (int i = 0; i < count; i++)
 | |
|                 {
 | |
|                     ridArray[arrayCount] = (RID)(rowIdArray[i].rid) ;
 | |
|                     //cout << "RID =" << (RID)(rowIdArray[i].rid) << endl;
 | |
|                     //cout<<"arrayCount->" << arrayCount << "rid->" << ridArray[arrayCount]<<endl;
 | |
|                     arrayCount++;
 | |
|                 }
 | |
| 
 | |
|                 if (type == LIST_BLOCK_TYPE)
 | |
|                 {
 | |
|                     if (m_useNarray)
 | |
|                         m_lbid     = nextIdxListPtr->nextLbid;
 | |
|                     else
 | |
|                         m_lbid     = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
|                 }
 | |
| 
 | |
|             }//end while
 | |
|     };//end of switch
 | |
| 
 | |
|     size = arrayCount;
 | |
| 
 | |
|     return rc;
 | |
| }//end getRIDArrayFromListHdr
 | |
| 
 | |
| const int    IndexList::getRIDArrayFromListHdrNarray(FILE* pFile, uint64_t& key,
 | |
|         IdxEmptyListEntry* curIdxRidListHdrPtr,
 | |
|         RID* ridArray, int& size, bool flag)
 | |
| {
 | |
|     int rc = NO_ERROR;
 | |
|     IdxRidNextListPtr* nextIdxListPtr;
 | |
|     int  pos = 0, totalbytes = 0;
 | |
|     IdxRidListPtr* lastIdxRidListPtr;
 | |
|     IdxRidListEntry rowIdArray[MAX_BLOCK_ENTRY * 10];
 | |
|     int type = 0, count = 0;
 | |
| 
 | |
| 
 | |
| 
 | |
|     m_pFile = pFile;
 | |
|     CommBlock cb;
 | |
|     cb.file.oid = m_oid;
 | |
|     cb.file.pFile = m_pFile;
 | |
| 
 | |
|     if (flag)
 | |
|     {
 | |
|         rc = getHdrInfo(curIdxRidListHdrPtr);
 | |
| 
 | |
|         if (m_curIdxRidListHdr.idxRidListSize.size == 0)
 | |
|         {
 | |
|             size = 0;
 | |
|             return NO_ERROR;
 | |
|         }
 | |
| 
 | |
|         if (key != m_curIdxRidListHdr.key)
 | |
|         {
 | |
|             return ERR_IDX_LIST_WRONG_KEY;
 | |
|         }
 | |
| 
 | |
|         // cout << "IndexList::getRIDArrayFromListHdr->KEY ------>" << key << endl;
 | |
|         //Check the first row location, 3rd enty
 | |
|         if (m_curIdxRidListHdr.firstIdxRidListEntry.type == (int)LIST_RID_TYPE)
 | |
|         {
 | |
|             ridArray[size] = (RID)m_curIdxRidListHdr.firstIdxRidListEntry.rid;
 | |
|             //cout<<" IndexList::getRIDArrayFromListHdr->header Lbid->" << m_hdrLbid <<" count->" << arrayCount <<endl;
 | |
| 
 | |
|             size++;
 | |
|             //cout << "RID = " << (RID)m_curIdxRidListHdr.firstIdxRidListEntry.rid << endl;
 | |
|         };
 | |
| 
 | |
|         //Check Header last entry's type
 | |
|         int type = m_curIdxRidListHdr.nextIdxRidListPtr.type;
 | |
| 
 | |
|         switch (type)
 | |
|         {
 | |
|             case LIST_RID_TYPE:// There is a row id here, Check!
 | |
|                 ridArray[size] = (RID)m_curIdxRidListHdr.nextIdxRidListPtr.llp;
 | |
|                 //cout<<"arrayCount->" << arrayCount << "rid->" << ridArray[arrayCount]<<endl;
 | |
|                 size++;
 | |
|                 //cout << "RID = " << (RID)m_curIdxRidListHdr.nextIdxRidListPtr.llp << endl;
 | |
|                 return NO_ERROR;
 | |
| 
 | |
|             case LIST_SUBBLOCK_TYPE://Not found in header, so go to the sub-block
 | |
|                 //get thelbid sbid and entry out from the header last entry
 | |
| 
 | |
|                 m_lbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->fbo;
 | |
|                 m_sbid = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->sbid;
 | |
|                 m_entry = ((IdxEmptyListEntry*) & (m_curIdxRidListHdr.nextIdxRidListPtr))->entry;
 | |
|                 m_curType = type;
 | |
|                 //Read the pointer entry at LIST_SUB_LLP_POS location
 | |
| 
 | |
|                 memset(rowIdArray, 0, BYTE_PER_BLOCK);
 | |
| 
 | |
|                 pos = LIST_SUB_LLP_POS;
 | |
|                 totalbytes = SUBBLOCK_TOTAL_BYTES;
 | |
| 
 | |
|                 if (m_lbid != m_hdrLbid)
 | |
|                 {
 | |
|                     rc = readSubBlockEntry(cb, &m_curBlock, m_lbid,
 | |
|                                            m_sbid, 0, totalbytes,
 | |
|                                            rowIdArray);
 | |
|                     m_curBlock.lbid = m_lbid;
 | |
|                     m_curBlock.state = BLK_READ;
 | |
|                     m_curBlock.dirty = true;
 | |
|                 }
 | |
|                 else
 | |
|                     getSubBlockEntry(m_hdrBlock.data, m_sbid,
 | |
|                                      0, totalbytes,
 | |
|                                      rowIdArray );
 | |
| 
 | |
|                 lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
|                 type  = lastIdxRidListPtr->type;
 | |
|                 count = lastIdxRidListPtr->count;
 | |
| 
 | |
|                 //cout << "count->" << count << endl;
 | |
|                 //type should be LIST_BLOCK_TYPE from now on
 | |
|                 for (int i = 0; i < count; i++)
 | |
|                 {
 | |
|                     ridArray[size] = (RID)(rowIdArray[i].rid);
 | |
|                     //cout << "RID =" << (RID)(rowIdArray[i].rid) << endl;
 | |
|                     //cout<<"arrayCount->" << arrayCount << "rid->" << ridArray[arrayCount]<<endl;
 | |
|                     size++;
 | |
|                 }
 | |
| 
 | |
|                 //cout << "    Lbid->" << m_lbid ;
 | |
|                 //cout << "    count->" << count << endl;
 | |
|                 m_lbid = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
|                 m_curType = type;
 | |
|         }//end of switch
 | |
|     }//end if flag
 | |
| 
 | |
|     if (m_curType == LIST_BLOCK_TYPE)
 | |
|     {
 | |
|         pos = LIST_BLOCK_LLP_POS;
 | |
|         totalbytes = BYTE_PER_BLOCK;
 | |
|         rc = readSubBlockEntry(cb, &m_curBlock, m_lbid, 0, 0,
 | |
|                                totalbytes, rowIdArray);
 | |
|         m_curBlock.lbid = m_lbid;
 | |
|         m_curBlock.state = BLK_READ;
 | |
|         m_curBlock.dirty = true;
 | |
| 
 | |
|         nextIdxListPtr = (IdxRidNextListPtr*)&rowIdArray[pos];
 | |
|         type  = nextIdxListPtr->type;
 | |
| 
 | |
|         count = nextIdxListPtr->count;
 | |
| 
 | |
|         for (int i = 0; i < count; i++)
 | |
|         {
 | |
|             ridArray[size] = (RID)(rowIdArray[i].rid) ;
 | |
|             size++;
 | |
|         }
 | |
| 
 | |
|         IdxRidListArrayPtr idxRidListArrayPtr;
 | |
|         int curLevel = 0, curCount = 0;
 | |
| 
 | |
|         memset(&idxRidListArrayPtr, 0, sizeof(idxRidListArrayPtr));
 | |
|         getSubBlockEntry(m_curBlock.data, 0,
 | |
|                          BEGIN_LIST_BLK_LLP_POS,
 | |
|                          LIST_BLK_LLP_ENTRY_WIDTH,
 | |
|                          &idxRidListArrayPtr);
 | |
|         curLevel     = idxRidListArrayPtr.nextIdxListPtr.curLevel;
 | |
|         curCount     = idxRidListArrayPtr.nextIdxListPtr.count;
 | |
| 
 | |
|         for (int i = 0; i < TOTAL_NUM_ARRAY_PTR; i++)
 | |
|         {
 | |
|             m_lbid = idxRidListArrayPtr.childIdxRidListPtr[i].childLbid;
 | |
|             int type = idxRidListArrayPtr.childIdxRidListPtr[i].type;
 | |
| 
 | |
|             if ((m_lbid != (uint64_t)INVALID_LBID) && (type == LIST_BLOCK_TYPE))
 | |
|             {
 | |
|                 m_curType = LIST_BLOCK_TYPE;
 | |
|                 getRIDArrayFromListHdrNarray(pFile, key, curIdxRidListHdrPtr,
 | |
|                                              ridArray, size, false);
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|     }//end if block
 | |
| 
 | |
|     return rc;
 | |
| }//end getRIDArrayFromListHdrNarray
 | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------
 | |
|  * Description:  Output the info of this company to an abstract stream
 | |
|  *
 | |
|  * Input:        None
 | |
|  *
 | |
|  * Output:       None
 | |
|  *
 | |
|  * Comments:     None
 | |
|  *
 | |
|  * Return Code:  the abstract output stream
 | |
|  *------------------------------------------------------------------*/
 | |
| ostream& operator<<(ostream& os, IndexList& rhs)
 | |
| {
 | |
|     os   << rhs.m_curIdxRidListHdr.idxRidListSize.size << "\t"
 | |
|          << rhs.m_curIdxRidListHdr.key << "\t"
 | |
|          << rhs.m_curIdxRidListHdr.firstIdxRidListEntry.type << "\t"
 | |
|          << rhs.m_curIdxRidListHdr.firstIdxRidListEntry.rid << "\t"
 | |
|          << rhs.m_curIdxRidListHdr.nextIdxRidListPtr.type << "\t"
 | |
|          << rhs.m_curIdxRidListHdr.nextIdxRidListPtr.llp << "\t"
 | |
|          << endl;
 | |
|     return os;
 | |
| }
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * Find a entry for the given rowId and Key
 | |
|  * Converted
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     rowId       -- row id
 | |
|  *     key         -- value
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  * output
 | |
|  *     lbid       -- File block id
 | |
|  *     sbid      -- Sub Block id
 | |
|  *     entry     -- Entry id
 | |
|  *
 | |
|  *
 | |
|  * return value
 | |
|  *        true --found
 | |
|  *        false--not found
 | |
|  ************************************************/
 | |
| bool IndexList::findRowId(FILE* pFile, const RID& rowId, const uint64_t& key,
 | |
|                           IdxEmptyListEntry* curIdxRidListHdrPtr,
 | |
|                           uint64_t& lbid, int& sbid, int& entry)
 | |
| {
 | |
|     bool found = false;
 | |
|     int rc;
 | |
| 
 | |
|     m_pFile = pFile;
 | |
|     rc = getHdrInfo(curIdxRidListHdrPtr);
 | |
| 
 | |
|     if (key != m_curIdxRidListHdr.key)
 | |
|     {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     found = findRowId(rowId, key, lbid, sbid, entry);
 | |
|     return found;
 | |
| }
 | |
| 
 | |
| /************************************************
 | |
|  * Description:
 | |
|  * Find a entry for the given rowId and Key
 | |
|  * Converted
 | |
|  * input
 | |
|  *     pFile       -- File Handler
 | |
|  *     rowId       -- row id
 | |
|  *     key         -- value
 | |
|  *     curIdxRidListHdrPtr - point to the header
 | |
|  * output --
 | |
|  *     lbid       -- File block id
 | |
|  *     sbid      -- Sub Block id
 | |
|  *     entry     -- Entry id
 | |
|  *
 | |
|  * return value
 | |
|  *        true --found
 | |
|  *        false--not found
 | |
|  ************************************************/
 | |
| bool IndexList::findRowId(const RID& rowId, const int64_t& key,
 | |
|                           int64_t& lbid, int& sbid, int& entry)
 | |
| {
 | |
|     bool found = false;
 | |
|     int rc;
 | |
|     RID savedRid;
 | |
|     CommBlock cb;
 | |
|     int count;
 | |
|     uint64_t prevLbid;
 | |
|     int prevType;
 | |
| 
 | |
|     cb.file.oid = m_oid;
 | |
|     cb.file.pFile = m_pFile;
 | |
|     //Check the first row location, 3rd enty--0,1,2
 | |
| 
 | |
|     if (m_curIdxRidListHdr.firstIdxRidListEntry.type == (int)LIST_RID_TYPE)
 | |
|     {
 | |
|         if (m_curIdxRidListHdr.firstIdxRidListEntry.rid == rowId)
 | |
|         {
 | |
|             lbid   = m_hdrLbid;
 | |
|             sbid   = m_hdrSbid;
 | |
|             entry  = m_hdrEntry + 2;
 | |
|             found  = true;
 | |
|             return found;
 | |
|         }
 | |
|     }; //endif type=LIST_RID_TYPE
 | |
| 
 | |
|     //Check Header last entry's type
 | |
|     int type = m_curIdxRidListHdr.nextIdxRidListPtr.type;
 | |
| 
 | |
|     int pos = 0, totalbytes = 0;
 | |
| 
 | |
|     switch (type)
 | |
|     {
 | |
|         case LIST_NOT_USED_TYPE://Header is not full, no sub-block linked
 | |
|             //No RowId here then on
 | |
|             lbid = -1LL;
 | |
|             sbid = -1;
 | |
|             entry = -1;
 | |
|             found = false;
 | |
|             return found;  //not found
 | |
| 
 | |
|         case LIST_RID_TYPE:// There is a row id here, Check!
 | |
| 
 | |
|             savedRid = (RID)m_curIdxRidListHdr.nextIdxRidListPtr.llp;
 | |
| 
 | |
|             if (savedRid == rowId)
 | |
|             {
 | |
|                 lbid   = m_hdrLbid;
 | |
|                 sbid  = m_hdrSbid;
 | |
|                 entry = m_hdrEntry + 3;
 | |
|                 found = true;
 | |
|                 return found;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 lbid = -1LL;
 | |
|                 sbid = -1;
 | |
|                 entry = -1;
 | |
|                 found = false;
 | |
|                 return found;
 | |
|             }
 | |
| 
 | |
|         case LIST_SUBBLOCK_TYPE://Not found in header
 | |
|             //get the lbid sbid and entry out from the header last entry
 | |
| 
 | |
|             m_lbid  = ((IdxEmptyListEntry*)
 | |
|                        & (m_curIdxRidListHdr.nextIdxRidListPtr))->fbo;
 | |
|             m_sbid = ((IdxEmptyListEntry*)
 | |
|                       & (m_curIdxRidListHdr.nextIdxRidListPtr))->sbid;
 | |
|             m_entry = ((IdxEmptyListEntry*)
 | |
|                        & (m_curIdxRidListHdr.nextIdxRidListPtr))->entry;
 | |
| 
 | |
|             //Read the pointer entry at LIST_SUB_LLP_POS
 | |
|             //reserve enough space for rowIdArray
 | |
|             IdxRidListPtr* lastIdxRidListPtr;
 | |
|             IdxRidListEntry rowIdArray[MAX_BLOCK_ENTRY];
 | |
|             memset(rowIdArray, 0, BYTE_PER_BLOCK);
 | |
|             //first link
 | |
|             pos = LIST_SUB_LLP_POS;
 | |
|             totalbytes = SUBBLOCK_TOTAL_BYTES;
 | |
| 
 | |
|             //check if the sub block is on the header block
 | |
|             if (m_lbid != m_hdrLbid)
 | |
|             {
 | |
|                 rc = readSubBlockEntry( cb, &m_curBlock, m_lbid, m_sbid, 0,
 | |
|                                         totalbytes, rowIdArray);
 | |
|                 m_curBlock.dirty = true;
 | |
|                 m_curBlock.state = BLK_READ;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 getSubBlockEntry(m_hdrBlock.data, m_sbid,
 | |
|                                  0, totalbytes,  rowIdArray );
 | |
| 
 | |
|             }
 | |
| 
 | |
|             lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
| 
 | |
|             prevLbid = m_lbid; //sub block
 | |
|             prevType = type; //sub block
 | |
|             count = lastIdxRidListPtr->count;  //current count
 | |
|             type  = lastIdxRidListPtr->type;    //block
 | |
|             found = false;
 | |
| 
 | |
|             //look inside the first sub block
 | |
|             for (int i = 0; i < count; i++)
 | |
|             {
 | |
|                 if (rowIdArray[i].rid == rowId)
 | |
|                 {
 | |
|                     found = true;
 | |
|                     lbid = m_lbid;
 | |
|                     sbid = m_sbid;
 | |
|                     entry = i;
 | |
|                     return found;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             while  ((!found) && (type == LIST_BLOCK_TYPE))
 | |
|             {
 | |
|                 //There are more to check on the next link
 | |
|                 m_lbid  = ((IdxEmptyListEntry*)lastIdxRidListPtr)->fbo;
 | |
|                 m_sbid  = 0;
 | |
|                 m_entry = 0;
 | |
| 
 | |
|                 pos        = LIST_BLOCK_LLP_POS;
 | |
|                 totalbytes = BYTE_PER_BLOCK;
 | |
| 
 | |
|                 if ((m_lbid != m_hdrLbid) && (m_lbid != prevLbid))
 | |
|                 {
 | |
|                     // the only case for block
 | |
|                     rc = readSubBlockEntry( cb, &m_curBlock, m_lbid,
 | |
|                                             m_sbid, 0, totalbytes,
 | |
|                                             rowIdArray);
 | |
|                     m_curBlock.dirty = true;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     printf("error in findRowID\n");
 | |
|                     return false;
 | |
|                 }
 | |
| 
 | |
|                 prevType = type;
 | |
|                 lastIdxRidListPtr = (IdxRidListPtr*) &rowIdArray[pos];
 | |
|                 type  = lastIdxRidListPtr->type;
 | |
|                 count = lastIdxRidListPtr->count;
 | |
|                 found = false;
 | |
| 
 | |
|                 for (int i = 0; i < count; i++)
 | |
|                 {
 | |
|                     if (rowIdArray[i].rid == rowId)
 | |
|                     {
 | |
|                         found = true;
 | |
|                         lbid = m_lbid;
 | |
|                         sbid = m_sbid;
 | |
|                         entry = i;
 | |
|                         return found;
 | |
|                     }
 | |
|                 }//end for i
 | |
| 
 | |
|                 prevLbid = m_lbid;
 | |
|             } //end while
 | |
| 
 | |
|             break;
 | |
| 
 | |
|         default:
 | |
|             printf ("FIND ROWID got no where, error out !! \n");
 | |
|             break;
 | |
|     }; //end switch
 | |
| 
 | |
|     lbid = INVALID_LBID;
 | |
| 
 | |
|     sbid = INVALID_NUM;
 | |
| 
 | |
|     entry = INVALID_NUM;
 | |
| 
 | |
|     found = false;
 | |
| 
 | |
|     return found;
 | |
| } //end function
 | |
| 
 | |
| } //end of namespace
 | |
| 
 | |
| 
 |