00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef __XB_NTX_H__
00043 #define __XB_NTX_H__
00044
00045 #ifdef __GNU LesserG__
00046 #pragma interface
00047 #endif
00048
00049 #include <xbase64/xbase64.h>
00050 #include <string.h>
00051
00055 #define XB_NTX_NODE_SIZE 1024
00056
00058
00061 struct NtxHeadNode {
00062 xbUShort Signature;
00063 xbUShort Version;
00064
00065 xbLong StartNode;
00066 xbULong UnusedOffset;
00067 xbUShort KeySize;
00068 xbUShort KeyLen;
00069 xbUShort DecimalCount;
00070 xbUShort KeysPerNode;
00071 xbUShort HalfKeysPerNode;
00072 char KeyExpression[256];
00073 unsigned Unique;
00074 char NotUsed[745];
00075 };
00076
00078
00081 struct NtxLeafNode {
00082 xbUShort NoOfKeysThisNode;
00083 char KeyRecs[XB_NTX_NODE_SIZE];
00084 };
00085
00086
00088
00091 struct NtxItem
00092 {
00093 xbULong Node;
00094 xbULong RecordNumber;
00095 char Key[256];
00096 };
00097
00099
00102 struct xbNodeLink {
00103 xbNodeLink * PrevNode;
00104 xbNodeLink * NextNode;
00105 xbUShort CurKeyNo;
00106 xbLong NodeNo;
00107 struct NtxLeafNode Leaf;
00108 xbUShort * offsets;
00109 };
00110
00112
00115 class XBDLLEXPORT xbNtx : public xbIndex
00116 {
00117 protected:
00118 NtxHeadNode HeadNode;
00119 NtxLeafNode LeafNode;
00120 xbLong NodeLinkCtr;
00121 xbLong ReusedNodeLinks;
00122 char Node[XB_NTX_NODE_SIZE];
00123 xbNodeLink * NodeChain;
00124 xbNodeLink * FreeNodeChain;
00125 xbNodeLink * CurNode;
00126 xbNodeLink * DeleteChain;
00127
00128 NtxItem PushItem;
00129
00130
00131 xbLong GetLeftNodeNo( xbShort, xbNodeLink * );
00132 xbShort CompareKey( const char *, const char *, xbShort );
00133 xbShort CompareKey( const char *, const char * );
00134 xbLong GetDbfNo( xbShort, xbNodeLink * );
00135 char * GetKeyData( xbShort, xbNodeLink * );
00136 xbUShort GetItemOffset ( xbShort, xbNodeLink *, xbShort );
00137 xbUShort InsertKeyOffset ( xbShort, xbNodeLink * );
00138 xbUShort GetKeysPerNode();
00139 virtual xbShort GetHeadNode();
00140 xbShort GetLeafNode( xbLong, xbShort );
00141 xbNodeLink * GetNodeMemory();
00142 xbLong GetNextNodeNo();
00143 void ReleaseNodeMemory(xbNodeLink *n, xbBool doFree = false);
00144 xbULong GetLeafFromInteriorNode( const char *, xbShort );
00145 xbShort CalcKeyLen();
00146 xbShort PutKeyData( xbShort, xbNodeLink * );
00147 xbShort PutLeftNodeNo( xbShort, xbNodeLink *, xbLong );
00148 xbShort PutLeafNode( xbLong, xbNodeLink * );
00149 xbShort PutHeadNode( NtxHeadNode *, FILE *, xbShort );
00150 xbShort TouchIndex();
00151 xbShort PutDbfNo( xbShort, xbNodeLink *, xbLong );
00152 xbShort PutKeyInNode( xbNodeLink *, xbShort, xbLong, xbLong, xbShort );
00153 xbShort SplitLeafNode( xbNodeLink *, xbNodeLink *, xbShort, xbLong );
00154 xbShort SplitINode( xbNodeLink *, xbNodeLink *, xbLong );
00155 xbShort AddToIxList();
00156 xbShort RemoveFromIxList();
00157 xbShort RemoveKeyFromNode( xbShort, xbNodeLink * );
00158 xbShort DeleteKeyFromNode( xbShort, xbNodeLink * );
00159 xbShort JoinSiblings(xbNodeLink *, xbShort, xbNodeLink *, xbNodeLink *);
00160 xbUShort DeleteKeyOffset( xbShort, xbNodeLink *);
00161 xbShort FindKey( const char *, xbShort, xbShort );
00162 xbShort UpdateParentKey( xbNodeLink * );
00163 xbShort GetFirstKey( xbShort );
00164 xbShort GetNextKey( xbShort );
00165 xbShort GetLastKey( xbLong, xbShort );
00166 xbShort GetPrevKey( xbShort );
00167 void UpdateDeleteList( xbNodeLink * );
00168 void ProcessDeleteList();
00169 xbShort FindKey( const char *, xbLong );
00170
00171 public:
00172 xbNtx();
00173 xbNtx(xbDbf *);
00174 virtual ~xbNtx();
00175
00176
00177
00178
00179 void DumpHdrNode ( xbShort Option );
00180 void DumpNodeRec ( xbLong );
00181 xbShort CreateIndex( const char *, const char *, xbShort, xbShort );
00182 xbLong GetTotalNodes();
00183 xbULong GetCurDbfRec() { return CurDbfRec; }
00184 void DumpNodeChain();
00185 xbShort CreateKey( xbShort, xbShort );
00186 xbShort GetCurrentKey(char *key);
00187 xbShort AddKey( xbLong );
00188 xbShort UniqueIndex() { return HeadNode.Unique; }
00189 xbShort DeleteKey( xbLong DbfRec );
00190 xbShort KeyWasChanged();
00191 xbShort FindKey( const char * );
00192 xbShort FindKey();
00193 xbShort FindKey( xbDouble );
00194 xbShort GetNextKey() { return GetNextKey( 1 ); }
00195 xbShort GetLastKey() { return GetLastKey( 0, 1 ); }
00196 xbShort GetFirstKey() { return GetFirstKey( 1 ); }
00197 xbShort GetPrevKey() { return GetPrevKey( 1 ); }
00198 xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) ;
00199 xbShort KeyExists( char * Key ) { return FindKey( Key, strlen( Key ), 0 ); }
00200 xbShort KeyExists( xbDouble );
00201 virtual void GetExpression(char *buf, int len);
00202 #ifdef XBASE_DEBUG
00203 xbShort CheckIndexIntegrity( xbShort Option );
00204 #endif
00205
00206 virtual const char* GetExtWithDot(bool lower);
00207
00208 protected:
00209 virtual xbUShort GetKeyLen();
00210 virtual const char* GetKeyExpression();
00211 virtual void FreeNodesMemory();
00212 };
00213 #endif