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
00079
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
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