Xbase64 Class Library
3.1.2
|
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