1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-23 07:05:36 +03:00
2016-01-06 14:08:59 -06:00

424 lines
18 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. */
/******************************************************************************************
* $Id: we_indexlist.h 33 2006-07-19 09:18:27Z jhuang $
*
******************************************************************************************/
/** @file */
#ifndef _WE_IndexList_H_
#define _WE_IndexList_H_
#include <stdlib.h>
#include <sys/types.h>
#include <we_dbfileop.h>
#include <we_index.h>
#include <iostream>
#include <sstream>
#include <cstddef>
#include "we_freemgr.h"
/** Namespace WriteEngine */
namespace WriteEngine
{
class IndexList : public DbFileOp
{
public:
/**
* @brief Constructor
*/
IndexList();
//IndexList(FILE* pFile, IdxEmptyListEntry* newHeaderListPtr);
/**
* @brief Default Destructor
*/
~IndexList(){};
/**
* @brief Public index List related functions
*/
/**
* @brief Add a 4 bytes header for a rowid, key in the index list
*/
const int addIndexListHdr( FILE* pFile, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* newHeaderListPtr );
const int addIndexListHdr( CommBlock& cbList, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* newHeaderListPtr )
{
m_oid = cbList.file.oid; m_pFile = cbList.file.pFile;
int rc = addIndexListHdr( m_pFile, listRid, key, newHeaderListPtr);
return rc;
}
const int addIndexListHdr( FILE* pFile, const RID* ridList, const int size, const uint64_t& key,
IdxEmptyListEntry* newHeaderListPtr );
const int addIndexListHdr( CommBlock& cbList, RID* ridList, int& size, const uint64_t& key,
IdxEmptyListEntry* newHeaderListPtr )
{
m_oid = cbList.file.oid; m_pFile = cbList.file.pFile;
int rc = addIndexListHdr( m_pFile, ridList, size, key, newHeaderListPtr);
return rc;
}
const int addIndexListHdr( CommBlock& cbList, const IdxMultiRid& multiRids,
const uint64_t& key, IdxEmptyListEntry* newHeaderListPtr)
{
m_oid = cbList.file.oid; m_pFile = cbList.file.pFile;
int size = multiRids.totalRid;
return addIndexListHdr( m_pFile, multiRids.ridArray, size,
key, newHeaderListPtr );
}
/**
* @brief Update the indexlist when a new rowid an key inserted
*/
const int updateIndexList( FILE* pFile, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr );
const int updateIndexList( CommBlock& cbList, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr )
{
m_oid = cbList.file.oid; m_pFile = cbList.file.pFile;
int rc = updateIndexList( m_pFile, listRid, key, oldHeaderListPtr);
return rc;
};
const int updateIndexList( FILE* pFile, const RID* ridList, const int size,const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr );
const int updateIndexList( CommBlock& cbList, const RID* ridList, const int size,const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr )
{
m_oid = cbList.file.oid; m_pFile = cbList.file.pFile;
int rc = updateIndexList( m_pFile, ridList, size,key, oldHeaderListPtr);
return rc;
}
const int updateIndexList( CommBlock& cbList, const IdxMultiRid& multiRids,
const uint64_t& key, IdxEmptyListEntry* oldHeaderListPtr)
{
return updateIndexList( cbList, multiRids.ridArray, multiRids.totalRid,
key, oldHeaderListPtr );
}
/**
* @brief Delete the rowid in the key indexlist
*/
const int deleteIndexList( FILE* pFile, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr );
const int deleteIndexList( CommBlock& cbList, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr )
{
m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
int rc = deleteIndexList( m_pFile, listRid, key, oldHeaderListPtr );
return rc;
};
/**
* @brief delete a row id from the key index list and return the location
*/
const int deleteIndexList( FILE* pFile, const RID& listRid, const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr,
uint64_t& lbid, int& sbid, int& entry );
const int deleteIndexList( CommBlock& cbList, const RID& listRid,
const uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr,
uint64_t& lbid, int& sbid, int& entry )
{
m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
int rc = deleteIndexList( m_pFile, listRid, key,
oldHeaderListPtr,
lbid, sbid, entry);
return rc;
};
/**
* @brief find a row id from the key index list and return the location
*/
bool findRowId(FILE* pFile, const RID& rid, const uint64_t& key,
IdxEmptyListEntry* oldIdxRidListHdrPtr,
uint64_t& lbid, int& sbid, int& entry);
bool findRowId(CommBlock& cbList, const RID& rid, const uint64_t& key,
IdxEmptyListEntry* oldIdxRidListHdrPtr,
uint64_t& lbid, int& sbid, int& entry)
{ m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
bool found =findRowId(m_pFile, rid, key,
oldIdxRidListHdrPtr,lbid,
sbid, entry);
return found;
};
/**
* @brief get the total row ids or tokens from the index list header
*/
const int getRIDArrayFromListHdr(FILE* pFile, uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr,
RID* ridArrary, int& size);
const int getRIDArrayFromListHdr(CommBlock& cbList, uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr,
RID* ridArrary, int& size)
{ m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
int rc = getRIDArrayFromListHdr(m_pFile, key,
oldHeaderListPtr,
ridArrary, size);
return rc;
};
const int getRIDArrayFromListHdrNarray(FILE* pFile, uint64_t& key,
IdxEmptyListEntry* curIdxRidListHdrPtr,
RID* ridArray, int& size, bool flag);
const int getRIDArrayFromListHdrNarray(CommBlock& cbList, uint64_t& key,
IdxEmptyListEntry* oldHeaderListPtr,
RID* ridArrary, int& size, bool flag)
{ m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
int rc = getRIDArrayFromListHdrNarray(m_pFile, key,
oldHeaderListPtr,
ridArrary, size, flag);
return rc;
};
const int init (CommBlock& cbList, const int& freemgr_type)
{
m_oid = cbList.file.oid ; m_pFile = cbList.file.pFile;
int rc = m_freemgr.init(cbList,freemgr_type);
return rc;
};
const int closeList(){int rc = updateIndexListWrite(); return rc;}
void setTransId( const TxnID txnId ) {FileOp::setTransId( txnId );m_freemgr.setTransId(txnId);}
IdxRidListHdr m_curIdxRidListHdr; /**@brief current list header */
const int getHdrInfo(IdxEmptyListEntry* curIdxRidListHdrPtr);
const int getHdrInfo(IdxEmptyListEntry* curIdxRidListHdrPtr, IdxRidListHdr* idxRidListHdr)
{ int rc= 0; rc =getHdrInfo(curIdxRidListHdrPtr);
memcpy(idxRidListHdr, &m_curIdxRidListHdr, LIST_HDR_SIZE);
return rc;
}
/**
* @brief Timer functions
*/
void startTimer() { time( &m_startTime ); }
void stopTimer() { time( &m_endTime ); m_totalTime = difftime( m_endTime, m_startTime); }
double getTotalRunTime() const { return m_totalTime; }
void setDebugLevel(const DebugLevel level){m_freemgr.setDebugLevel(level);}
void setUseSortFlag(const bool flag){m_useSortFlag = flag;}
void startfTimer(){ftime(&t_start);};
void stopfTimer(){ftime(&t_current);};
int getTotalfRunTime()
{int t_diff;
t_diff= (int) (1000.0 * (t_current.time - t_start.time)+ (t_current.millitm - t_start.millitm));
return t_diff;}
/**
* @brief Private index List member functions
*/
const int updateIndexListWrite();
const int init();
const int initBlksGetHdrBlk();
const int initGetHdr(const uint64_t &key, IdxEmptyListEntry* curIdxRidListHdrPtr);
const int resetBlk(DataBlock* dataBlk) ;
const int resetBlkZero(uint64_t& lbid0);
const int writeBlkZero(uint64_t& lbid0);
const int setLastLbid( uint64_t& lastLbid);
const int getLastLbid();
const int findLastBlk(int& count);
const int readCurBlk();
const int writeCurBlk();
const int addRidInBlk( const RID& newRid);
const int insertRid(const RID& newRid, int& pos);
const int updateCurCount(int frequency =1);
const int getNextInfo(int& count);
const int getNextInfoFromBlk( IdxRidListPtr& idxRidListPtr);
const int getNextInfoFromBlk(){return getNextInfoFromBlk(m_lastIdxRidListPtr); };
const int getLastFboPtr(uint64_t& lbid, int& sbid, IdxRidListPtr& lastFboListPtr);
const int setLastFboPtr(uint64_t& lbid, int& sbid, IdxRidListPtr& lastFboListPtr);
const int setNextInfoFromBlk( IdxRidListPtr& idxRidListPtr);
const int setNarray(bool flag){m_useNarray= flag; return NO_ERROR;};
const int findFirstBlk(FILE* pFile, const uint64_t& key,
IdxEmptyListEntry* curIdxRidListHdrPtr,
uint64_t& lbid);
bool getUseNarray(){return m_useNarray;};
const int printBlocks(uint64_t& lbid);
const int getBlk(uint64_t& lbid);
const int getSubBlk();
const int getSubBlk(uint64_t& lbid, int& sbid, int& entry);
private:
struct timeb t_start, t_current;
const int getLastFbo();
const int setLastFbo(int* fbo);
//const int addRidList(RID* ridList, int & size);
/**
* @brief get a segment from freemanager
*/
const int getSegment( FILE* pfile, const IdxTreeGroupType segmentType,
IdxEmptyListEntry* assignPtr );
/**
* @brief insert a rowid into the key index list
*/
const int updateIndexList( const RID& listRid, const uint64_t& key,
uint64_t& startLbid, int& startSbid, int& startEntry,
uint64_t& endLbid, int& endSbid, int& endEntry
);
/**
* @brief insert a rowid into the key index list
*/
const int updateIndexList( const RID& listRid, const uint64_t& key);
const int updateIndexList( const RID* ridList, const int size, int& startPos);
const int addRid(const RID& newRid, IdxRidListPtr& lastIdxRidListPtr);
const int addRidList(const RID* ridList, const int size, int& startPos);
/**
* @brief write all of the blocks in the same time at the end
*/
/**
* @brief add a new subblock segment to the linked list
*/
const int addNextIdxRidList(FILE* pFile, const RID& rowId,
IdxEmptyListEntry* newIdxListEntryPtr);
/**
* @brief find a row id from the key index list and return the location
*/
bool findRowId( const RID& rowId,const uint64_t& key, uint64_t& lbid, int& sbid, int& entry);
/**
* @brief delete a row id from the key index list
*/
const int deleteIndexList( const RID& rowId, const uint64_t& key);
/**
* @brief delete a row id from the key index list and return a location
*/
const int deleteIndexList(const RID& rowId,
const uint64_t& key,
uint64_t& lbid, int&sbid, int& entry);
/**
* @brief insert a new row id to the key index list
*/
const int updateIdxRidList(const RID& rid, DataBlock* dataBlock,
const int& sbid, const int& entry,
IdxRidListPtr* idxRidListPtr);
const int deleteInSub( const RID& rowId) ;
const int deleteInBlock(const RID& newRid);
const int releaseSegment() ;
void setListOid(const OID& listOid){m_oid = listOid;}
const OID getListOid(){return m_oid;}
const int insertRowId( uint64_t& curLbid, int& pos, uint64_t& parentLbid);
const int setupBlock ( uint64_t& curLbid, int& pos, uint64_t& parentLbid);
const int updateHdrSub(const RID& newRid, const uint64_t &key);
const int addRidInSub(const RID& newRid,
IdxRidListPtr& lastIdxRidListPtr);
const int moveRidsToNewSub(FILE* pFile, const RID& oldRid,
const RID& newRid,
IdxEmptyListEntry* newIdxListEntryPtr);
const int updateHdrCount();
const int setParentStatus(uint64_t& pLbid);
const int setCurBlkNextPtr(uint64_t& nextLbid, int count);
const int initNewBlock(int64_t& lbid, DataBlock* dataBlock, uint64_t& pLbid);
const int initNewBlock(DataBlock* dataBlock, uint64_t& pLbid);
const int initCurBlock();
const int getNextInfoFromArray(IdxRidNextListPtr& nextIdxListPtr);
const int getParentInfoFromArray(IdxRidParentListPtr& parentIdxListPtr);
const int updateCurCountInArray(int insCnt=1);
const int updateParentStatus(uint64_t& childLbid);
const int updateLastPtrAndParent(const int lastCount);
const int updateLastPtr(const int lastCount);
const int updateParent();
/**
* @brief private member data
*/
DataBlock m_curBlock; /**@brief the current block buffer */
DataBlock m_hdrBlock; /**@brief the header block buffer*/
DataBlock m_blockZero; /**@brief 0,0,0 for free manager*/
DataBlock m_parentBlock;
DataBlock m_nextBlock;
uint64_t m_hdrLbid; /**@brief the header block number */
int m_hdrSbid; /**@brief the header subblock number */
int m_hdrEntry; /**@brief the header entry number */
uint64_t m_lbid; /**@brief the current block number */
int m_sbid; /**@brief the current subblock number */
int m_entry; /**@brief the current entry number */
uint64_t m_newLbid;
int m_newSbid;
int m_newEntry;
uint64_t m_parentLbid;
int m_parentSbid;
int m_parentEntry;
uint64_t m_nextLbid; /**@brief the next block number */
int m_nextSbid; /**@brief the next subblock number */
int m_nextEntry; /**@brief the next entry number */
uint64_t m_dLbid; /**@brief the next block number */
int m_dSbid; /**@brief the next subblock number */
int m_dEntry; /**@brief the next entry number */
FILE* m_pFile; /**@brief file handle for index list */
OID m_oid;
int m_llpPos;
bool m_useBlock;
int m_entryGroup;
int m_type;
int m_segType;
int m_curType;
int m_nextType;
int m_totalbytes;
int m_lastFbo;
uint64_t m_lastLbid;
FreeMgr m_freemgr;
time_t m_startTime; // start time
time_t m_endTime; // end time
double m_totalTime;
DebugLevel m_debugLevel; // internal use debug level
bool m_useSortFlag;
bool m_useNarray;
IdxRidChildListPtr m_childIdxRidListPtr[4];
IdxRidNextListPtr m_nextIdxListPtr;
IdxRidParentListPtr m_parentIdxListPtr;
IdxRidListArrayPtr m_idxRidListArrayPtr;
IdxRidLastListPtr m_lastBLKIdxListPtr;
IdxRidListPtr m_lastIdxRidListPtr;
int m_curLevel;
int m_curBlkPos;
int m_curLevelPos;
int m_curCount;
bool m_flag;
};
//std::ostream& operator<<(std::ostream& os, const IndexList& rhs);
} //end of namespace
#endif // _WE_IndexList_H_