Xbase64 Class Library 3.1.2

xbcdx.h

Go to the documentation of this file.
00001 #ifndef cdx_h
00002 #define cdx_h
00003 
00004 #include "xbmindex.h"
00005 
00006 struct CdxHeader
00007 {
00008   xbLong rootNode;
00009   xbLong freeNode;
00010   xbLong reserved;
00011   xbShort keyLen;
00012   union cdxFeatures
00013   {
00014     struct Features
00015     {
00016       bool unique:1;
00017       int:2;
00018       bool hasFor:1;
00019       bool:1;
00020       bool cdxHeader:1;
00021       bool cdxFmt:1;
00022       bool cdxTagHeader:1;
00023     } features;
00024     char feature;
00025   } features;
00026   char signature;
00027   xbLong reserved1[5];
00028   char reserved2[466];
00029   xbShort descending;
00030   xbShort totalExprLen;
00031   xbShort forExprLen;
00032   xbShort reserved4;
00033   xbShort keyExprLen;
00034   char keyforBuffer[512];
00035 };
00036 
00037 struct CdxNode
00038 {
00039   xbShort attr;
00040   xbShort keyCount;
00041   xbLong leftSibling;
00042   xbLong rightSibling;
00043 }
00044 #ifdef __GNU LesserC__
00045         __attribute__((packed))
00046 #endif
00047 ;
00048 
00049 struct CdxInnerNode: public CdxNode
00050 {
00051   char keys[500];
00052 }
00053 #ifdef __GNU LesserC__
00054         __attribute__((packed))
00055 #endif
00056 ;
00057 
00058 struct CdxLeafNode: public CdxNode
00059 {
00060   xbShort freeSpace;
00061   xbLong recNumberMask;
00062   char dupByteCounterMask;
00063   char tailByteCounterMask;
00064   char recBitUsing;
00065   char dupBitUsing;
00066   char tailBitUsing;
00067   char byteCount;
00068   char keys[488];
00069 } 
00070 #ifdef __GNU LesserC__
00071         __attribute__((packed))
00072 #endif
00073 ;
00074 
00075 class XBDLLEXPORT xbCdx: public xbMultiIndex
00076 {
00077   public:
00078 //    xbCdx() {} I don't like to make empty object with no protection 
00079 // to method method call. And I don't see any need of it.
00080     xbCdx(xbDbf* dbf): xbMultiIndex(dbf) 
00081     {
00082       memset(&indexHeader_, 0, sizeof(indexHeader_));
00083       memset(&tagHeader_, 0, sizeof(tagHeader_));
00084     }
00085 
00086     virtual ~xbCdx() {CloseIndex();}
00087 
00088     virtual xbShort CreateIndex(const char *filename, const char *expr, 
00089          xbShort unique, xbShort overwrite);
00090     virtual xbShort CreateIndex(const char *filename, const char* tagname, 
00091          const char *expr, xbShort unique, xbShort overwrite);
00092 
00093     virtual xbShort AddTag(const char* tagname, const char *expr, 
00094          xbShort unique, xbShort overwrite) {return 0;}
00095 
00096     virtual xbLong   GetTotalNodes() {return 0;}
00097     virtual xbULong  GetCurDbfRec() {return 0;}
00098     virtual xbShort  CreateKey( xbShort, xbShort ) {return 0;}
00099     virtual xbShort  GetCurrentKey(char *key) {return 0;}
00100     virtual xbShort  AddKey( xbLong ) {return 0;}
00101     virtual xbShort  UniqueIndex() {return 0;}
00102     virtual xbShort  DeleteKey( xbLong ) {return 0;}
00103     virtual xbShort  KeyWasChanged() {return 0;}
00104     virtual xbShort  FindKey( const char * ) {return 0;}
00105     virtual xbShort  FindKey() {return 0;}
00106     virtual xbShort  FindKey( xbDouble ) {return 0;}
00107     virtual xbShort  GetNextKey() {return 0;}
00108     virtual xbShort  GetLastKey() {return 0;}
00109     virtual xbShort  GetFirstKey() {return 0;}
00110     virtual xbShort  GetPrevKey() {return 0;}
00111     virtual xbShort  ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) {return 0;}
00112     virtual xbShort  KeyExists( xbDouble ) {return 0;}
00113     virtual void     GetExpression(char *buf, int len) {}
00114 #ifdef XBASE_DEBUG
00115     virtual void     DumpHdrNode( xbShort Option ) {};
00116     virtual void     DumpNodeRec( xbLong ) {};
00117     virtual void     DumpNodeChain() {};
00118     virtual xbShort  CheckIndexIntegrity( xbShort ) {return 0;};
00119 #endif
00120     
00121 //    static xbString CreateIndexName(const xbString& dbfName);
00122     virtual const char* GetExtWithDot(bool lower);
00123     const CdxHeader& GetIndexHeader() {return indexHeader_;}
00124     const CdxHeader& GetTagHeader() {return tagHeader_;}
00125   
00126   protected:
00127     virtual xbShort GetHeadNode();
00128     virtual xbUShort GetKeyLen() {return 0;}
00129     virtual const char* GetKeyExpression() {return "";}
00130     virtual void FreeNodesMemory() {}
00131     void ReadTagHeader();
00132     xbLong GetIndexTagOffset() {return 0;}
00133     void ReadIndexHeader(xbLong) {}
00134 
00135   private:
00136     xbCdx(const xbCdx&);
00137     xbCdx& operator=(const xbCdx&);
00138     void WriteTagHeader(const char* tagName);
00139     void WriteTagRoot(const char* tagName);
00140     void WriteIndexHeader(const char* expr);
00141     void WriteIndexRoot();
00142   
00143   private:
00144     CdxHeader tagHeader_;
00145     CdxLeafNode tagRootNode_;
00146     CdxHeader indexHeader_;
00147     CdxLeafNode indexRootNode_;
00148 };
00149 
00150 #endif