Xbase64 Class Library  3.1.2
xbcdx.h
Go to the documentation of this file.
1 #ifndef cdx_h
2 #define cdx_h
3 
4 #include "xbmindex.h"
5 
6 struct CdxHeader
7 {
13  {
14  struct Features
15  {
16  bool unique:1;
17  int:2;
18  bool hasFor:1;
19  bool:1;
20  bool cdxHeader:1;
21  bool cdxFmt:1;
22  bool cdxTagHeader:1;
23  } features;
24  char feature;
25  } features;
26  char signature;
28  char reserved2[466];
34  char keyforBuffer[512];
35 };
36 
37 struct CdxNode
38 {
43 }
44 #ifdef __GNU LesserC__
45  __attribute__((packed))
46 #endif
47 ;
48 
49 struct CdxInnerNode: public CdxNode
50 {
51  char keys[500];
52 }
53 #ifdef __GNU LesserC__
54  __attribute__((packed))
55 #endif
56 ;
57 
58 struct CdxLeafNode: public CdxNode
59 {
67  char byteCount;
68  char keys[488];
69 }
70 #ifdef __GNU LesserC__
71  __attribute__((packed))
72 #endif
73 ;
74 
76 {
77  public:
78 // xbCdx() {} I don't like to make empty object with no protection
79 // to method method call. And I don't see any need of it.
80  xbCdx(xbDbf* dbf): xbMultiIndex(dbf)
81  {
82  memset(&indexHeader_, 0, sizeof(indexHeader_));
83  memset(&tagHeader_, 0, sizeof(tagHeader_));
84  }
85 
86  virtual ~xbCdx() {CloseIndex();}
87 
88  virtual xbShort CreateIndex(const char *filename, const char *expr,
89  xbShort unique, xbShort overwrite);
90  virtual xbShort CreateIndex(const char *filename, const char* tagname,
91  const char *expr, xbShort unique, xbShort overwrite);
92 
93  virtual xbShort AddTag(const char* tagname, const char *expr,
94  xbShort unique, xbShort overwrite) {return 0;}
95 
96  virtual xbLong GetTotalNodes() {return 0;}
97  virtual xbULong GetCurDbfRec() {return 0;}
98  virtual xbShort CreateKey( xbShort, xbShort ) {return 0;}
99  virtual xbShort GetCurrentKey(char *key) {return 0;}
100  virtual xbShort AddKey( xbLong ) {return 0;}
101  virtual xbShort UniqueIndex() {return 0;}
102  virtual xbShort DeleteKey( xbLong ) {return 0;}
103  virtual xbShort KeyWasChanged() {return 0;}
104  virtual xbShort FindKey( const char * ) {return 0;}
105  virtual xbShort FindKey() {return 0;}
106  virtual xbShort FindKey( xbDouble ) {return 0;}
107  virtual xbShort GetNextKey() {return 0;}
108  virtual xbShort GetLastKey() {return 0;}
109  virtual xbShort GetFirstKey() {return 0;}
110  virtual xbShort GetPrevKey() {return 0;}
111  virtual xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) {return 0;}
112  virtual xbShort KeyExists( xbDouble ) {return 0;}
113  virtual void GetExpression(char *buf, int len) {}
114 #ifdef XBASE_DEBUG
115  virtual void DumpHdrNode( xbShort Option ) {};
116  virtual void DumpNodeRec( xbLong ) {};
117  virtual void DumpNodeChain() {};
118  virtual xbShort CheckIndexIntegrity( xbShort ) {return 0;};
119 #endif
120 
121 // static xbString CreateIndexName(const xbString& dbfName);
122  virtual const char* GetExtWithDot(bool lower);
123  const CdxHeader& GetIndexHeader() {return indexHeader_;}
124  const CdxHeader& GetTagHeader() {return tagHeader_;}
125 
126  protected:
127  virtual xbShort GetHeadNode();
128  virtual xbUShort GetKeyLen() {return 0;}
129  virtual const char* GetKeyExpression() {return "";}
130  virtual void FreeNodesMemory() {}
131  void ReadTagHeader();
132  xbLong GetIndexTagOffset() {return 0;}
134 
135  private:
136  xbCdx(const xbCdx&);
137  xbCdx& operator=(const xbCdx&);
138  void WriteTagHeader(const char* tagName);
139  void WriteTagRoot(const char* tagName);
140  void WriteIndexHeader(const char* expr);
141  void WriteIndexRoot();
142 
143  private:
144  CdxHeader tagHeader_;
145  CdxLeafNode tagRootNode_;
146  CdxHeader indexHeader_;
147  CdxLeafNode indexRootNode_;
148 };
149 
150 #endif