summaryrefslogtreecommitdiff
path: root/xbase64/xbcdx.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbase64/xbcdx.h')
-rwxr-xr-xxbase64/xbcdx.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/xbase64/xbcdx.h b/xbase64/xbcdx.h
new file mode 100755
index 0000000..f76a45f
--- /dev/null
+++ b/xbase64/xbcdx.h
@@ -0,0 +1,150 @@
+#ifndef cdx_h
+#define cdx_h
+
+#include "xbmindex.h"
+
+struct CdxHeader
+{
+ xbLong rootNode;
+ xbLong freeNode;
+ xbLong reserved;
+ xbShort keyLen;
+ union cdxFeatures
+ {
+ struct Features
+ {
+ bool unique:1;
+ int:2;
+ bool hasFor:1;
+ bool:1;
+ bool cdxHeader:1;
+ bool cdxFmt:1;
+ bool cdxTagHeader:1;
+ } features;
+ char feature;
+ } features;
+ char signature;
+ xbLong reserved1[5];
+ char reserved2[466];
+ xbShort descending;
+ xbShort totalExprLen;
+ xbShort forExprLen;
+ xbShort reserved4;
+ xbShort keyExprLen;
+ char keyforBuffer[512];
+};
+
+struct CdxNode
+{
+ xbShort attr;
+ xbShort keyCount;
+ xbLong leftSibling;
+ xbLong rightSibling;
+}
+#ifdef __GNU LesserC__
+ __attribute__((packed))
+#endif
+;
+
+struct CdxInnerNode: public CdxNode
+{
+ char keys[500];
+}
+#ifdef __GNU LesserC__
+ __attribute__((packed))
+#endif
+;
+
+struct CdxLeafNode: public CdxNode
+{
+ xbShort freeSpace;
+ xbLong recNumberMask;
+ char dupByteCounterMask;
+ char tailByteCounterMask;
+ char recBitUsing;
+ char dupBitUsing;
+ char tailBitUsing;
+ char byteCount;
+ char keys[488];
+}
+#ifdef __GNU LesserC__
+ __attribute__((packed))
+#endif
+;
+
+class XBDLLEXPORT xbCdx: public xbMultiIndex
+{
+ public:
+// xbCdx() {} I don't like to make empty object with no protection
+// to method method call. And I don't see any need of it.
+ xbCdx(xbDbf* dbf): xbMultiIndex(dbf)
+ {
+ memset(&indexHeader_, 0, sizeof(indexHeader_));
+ memset(&tagHeader_, 0, sizeof(tagHeader_));
+ }
+
+ virtual ~xbCdx() {CloseIndex();}
+
+ virtual xbShort CreateIndex(const char *filename, const char *expr,
+ xbShort unique, xbShort overwrite);
+ virtual xbShort CreateIndex(const char *filename, const char* tagname,
+ const char *expr, xbShort unique, xbShort overwrite);
+
+ virtual xbShort AddTag(const char* tagname, const char *expr,
+ xbShort unique, xbShort overwrite) {return 0;}
+
+ virtual xbLong GetTotalNodes() {return 0;}
+ virtual xbULong GetCurDbfRec() {return 0;}
+ virtual xbShort CreateKey( xbShort, xbShort ) {return 0;}
+ virtual xbShort GetCurrentKey(char *key) {return 0;}
+ virtual xbShort AddKey( xbLong ) {return 0;}
+ virtual xbShort UniqueIndex() {return 0;}
+ virtual xbShort DeleteKey( xbLong ) {return 0;}
+ virtual xbShort KeyWasChanged() {return 0;}
+ virtual xbShort FindKey( const char * ) {return 0;}
+ virtual xbShort FindKey() {return 0;}
+ virtual xbShort FindKey( xbDouble ) {return 0;}
+ virtual xbShort GetNextKey() {return 0;}
+ virtual xbShort GetLastKey() {return 0;}
+ virtual xbShort GetFirstKey() {return 0;}
+ virtual xbShort GetPrevKey() {return 0;}
+ virtual xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) {return 0;}
+ virtual xbShort KeyExists( xbDouble ) {return 0;}
+ virtual void GetExpression(char *buf, int len) {}
+#ifdef XBASE_DEBUG
+ virtual void DumpHdrNode( xbShort Option ) {};
+ virtual void DumpNodeRec( xbLong ) {};
+ virtual void DumpNodeChain() {};
+ virtual xbShort CheckIndexIntegrity( xbShort ) {return 0;};
+#endif
+
+// static xbString CreateIndexName(const xbString& dbfName);
+ virtual const char* GetExtWithDot(bool lower);
+ const CdxHeader& GetIndexHeader() {return indexHeader_;}
+ const CdxHeader& GetTagHeader() {return tagHeader_;}
+
+ protected:
+ virtual xbShort GetHeadNode();
+ virtual xbUShort GetKeyLen() {return 0;}
+ virtual const char* GetKeyExpression() {return "";}
+ virtual void FreeNodesMemory() {}
+ void ReadTagHeader();
+ xbLong GetIndexTagOffset() {return 0;}
+ void ReadIndexHeader(xbLong) {}
+
+ private:
+ xbCdx(const xbCdx&);
+ xbCdx& operator=(const xbCdx&);
+ void WriteTagHeader(const char* tagName);
+ void WriteTagRoot(const char* tagName);
+ void WriteIndexHeader(const char* expr);
+ void WriteIndexRoot();
+
+ private:
+ CdxHeader tagHeader_;
+ CdxLeafNode tagRootNode_;
+ CdxHeader indexHeader_;
+ CdxLeafNode indexRootNode_;
+};
+
+#endif