You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			1068 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1068 lines
		
	
	
		
			45 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    
 | 
						|
    
 | 
						|
    
 |