diff options
Diffstat (limited to 'storage/connect/xindex.h')
-rw-r--r-- | storage/connect/xindex.h | 974 |
1 files changed, 487 insertions, 487 deletions
diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index c60ec7ab743..d0e55f488dc 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -1,487 +1,487 @@ -/*************** Xindex H Declares Source Code File (.H) ***************/
-/* Name: XINDEX.H Version 3.4 */
-/* */
-/* (C) Copyright to the author Olivier BERTRAND 2004 - 2012 */
-/* */
-/* This file contains the XINDEX class declares. */
-/***********************************************************************/
-#ifndef __XINDEX_H__
-#define __XINDEX_H__
-#include "block.h"
-#include "csort.h" /* Base class declares */
-#include "xtable.h"
-#include "valblk.h"
-
-enum IDT {TYPE_IDX_ERROR = 0, /* Type not defined */
- TYPE_IDX_INDX = 4, /* Permanent standard index */
- TYPE_IDX_XROW = 5}; /* Permanent row index */
-
-typedef struct mem_map *MMP;
-typedef class INDEXDEF *PIXDEF;
-typedef class KPARTDEF *PKPDEF;
-typedef class XINDEX *PXINDEX;
-typedef class XLOAD *PXLOAD;
-typedef class KXYCOL *PXCOL;
-
-/***********************************************************************/
-/* Structures used when checking for possible indexing */
-/***********************************************************************/
-typedef struct index_col *PICOL;
-typedef struct index_val *PIVAL;
-typedef struct index_def *PINDX;
-typedef struct indx_used *PXUSED;
-
-typedef struct index_val : public BLOCK {
- index_val(PXOB xp) {Next = NULL; Xval = xp; Kp = NULL;}
- PIVAL Next; // Next value
- PXOB Xval; // To value or array
- int *Kp; // The coordonates in a LSTBLK
- } IVAL;
-
-typedef struct index_col : public BLOCK {
- index_col(PCOL cp)
- {Next = Nxtgrp = NULL; Colp = cp; Ngrp = N = 0; Vals = NULL;}
- PICOL Next; // Next column
- PICOL Nxtgrp; // Next group
- PCOL Colp; // The column
- PIVAL Vals; // To column values
- int Ngrp; // Group number of values
- int N; // Column number of values
- } ICOL;
-
-typedef struct index_def : public BLOCK {
- index_def(PIXDEF xdp)
- {Next = NULL; Pxdf = xdp; Cols = NULL; Alloc = false;}
- PINDX Next;
- PIXDEF Pxdf;
- PICOL Cols;
- bool Alloc; // Must allocate values
- } INDX;
-
-/***********************************************************************/
-/* Index definition block. */
-/***********************************************************************/
-class DllExport INDEXDEF : public BLOCK { /* Index description block */
- friend class PLUGCAT;
- friend class DOSDEF;
- friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add);
- public:
- // Constructor
- INDEXDEF(char *name, bool uniq = false, int n = 0);
-
- // Implementation
- PIXDEF GetNext(void) {return Next;}
- void SetNext(PIXDEF pxdf) {Next = pxdf;}
- PSZ GetName(void) {return (PSZ)Name;}
- bool IsUnique(void) {return Unique;}
- bool IsAuto(void) {return AutoInc;}
- void SetAuto(bool b) {AutoInc = b;}
- void SetInvalid(bool b) {Invalid = b;}
- int GetNparts(void) {return Nparts;}
- int GetID(void) {return ID;}
- void SetID(int n) {ID = n;}
- PKPDEF GetToKeyParts(void) {return ToKeyParts;}
- void SetToKeyParts(PKPDEF kp) {ToKeyParts = kp;}
- void SetNParts(uint np) {Nparts = (signed)np;}
- void SetMaxSame(int mxs) {MaxSame = mxs;}
- void SetMxsame(PXINDEX x);
- int GetOffset(void) {return Offset;}
- void SetOffset(int off) {Offset = off;}
- int GetOffhigh(void) {return Offhigh;}
- void SetOffhigh(int hof) {Offhigh = hof;}
- int GetSize(void) {return Size;}
- void SetSize(int size) {Size = size;}
- int GetMaxSame(void) {return MaxSame;}
- bool Define(PGLOBAL g, void *memp, PTABDEF dfp, LPCSTR p);
- PIXDEF GetIndexOf(PCOL colp, bool hd = false);
- int IsIndexOf(PCOL colp);
- PKXBASE CheckIndexing(PGLOBAL g, PTDBDOS tdbp);
- PINDX CheckAND(PGLOBAL g, PINDX pix1, PINDX pix2);
- PINDX CheckOR(PGLOBAL g, PINDX pix1, PINDX pix2);
- PINDX CheckEQ(PGLOBAL g, PTDB tdbp, PXOB *arg, int op, int *kp = NULL);
- bool TestEQ(PGLOBAL g, PTDB tdbp, PXOB *arg, int op, bool b = false);
-
- protected:
- PIXDEF Next; /* To next block */
- PKPDEF ToKeyParts; /* To the key part definitions */
- char *Name; /* Index name */
- bool Unique; /* true if defined as unique */
- bool Invalid; /* true if marked as Invalid */
- bool AutoInc; /* true if unique key in auto increment */
- int Nparts; /* Number of key parts */
- int ID; /* Index ID number */
- int Offset; /* Offset in index file */
- int Offhigh; /* Offset high in big index file */
- int Size; /* Size of index file */
- int MaxSame; /* Max number of same values */
- }; // end of INDEXDEF
-
-typedef struct indx_used : public BLOCK {
- indx_used(PTDB tp, PIXDEF xdp, PCOL *cp, int k)
- {Tname = (char*)tp->GetName(); Xname = xdp->GetName(); Cp = cp; K = k;}
- PXUSED Next;
- char *Tname;
- PSZ Xname;
- PCOL *Cp;
- int K;
- } XUSED;
-
-/***********************************************************************/
-/* Index Key Part definition block. */
-/***********************************************************************/
-class DllExport KPARTDEF : public BLOCK { /* Index Key Part desc block */
- friend class INDEXDEF;
- friend class XINDEX;
- friend class PLUGCAT;
- friend class DOSDEF;
- friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add);
- public:
- KPARTDEF(PSZ name, int n); // Constructor
-
- // Implementation
- PKPDEF GetNext(void) {return Next;}
- PSZ GetName(void) {return (PSZ)Name;}
- int GetNcol(void) {return Ncol;}
- void SetNext(PKPDEF pkdf) {Next = pkdf;}
- void SetKlen(int len) {Klen = len;}
- void SetMxsame(int mxs) {Mxsame = mxs;}
-
- protected:
- PKPDEF Next; /* To next block */
- PSZ Name; /* Field name */
- int Mxsame; /* Field max same values */
- int Ncol; /* Field number */
- int Klen; /* Key length */
- }; // end of KPARTDEF
-
-/***********************************************************************/
-/* This is the XDB Index virtual base class declaration. */
-/***********************************************************************/
-class DllExport XXBASE : public CSORT, public BLOCK {
- friend class INDEXDEF;
- friend class KXYCOL;
- public:
- // Constructor
- XXBASE(PTDBDOS tbxp, bool b);
-
- // Implementation
- virtual IDT GetType(void) = 0;
- virtual void Reset(void) = 0;
- virtual bool IsMul(void) {return false;}
- virtual bool IsRandom(void) {return true;}
- virtual bool HaveSame(void) {return false;}
- virtual int GetCurPos(void) {return Cur_K;}
- virtual void SetNval(int n) {assert(n == 1);}
- virtual void SetOp(OPVAL op) {Op = op;}
- int GetNdif(void) {return Ndif;}
- int GetNum_K(void) {return Num_K;}
- int GetCur_K(void) {return Cur_K;}
- int GetID(void) {return ID;}
- void SetID(int id) {ID = id;}
- void SetNth(int n) {Nth = n;}
- int *GetPof(void) {return Pof;}
- int *GetPex(void) {return Pex;}
- void FreeIndex(void) {PlgDBfree(Index);}
-
- // Methods
- virtual void Print(PGLOBAL g, FILE *f, uint n);
- virtual void Print(PGLOBAL g, char *ps, uint z);
- virtual bool Init(PGLOBAL g) = 0;
- virtual int MaxRange(void) {return 1;}
- virtual int Fetch(PGLOBAL g) = 0;
- virtual bool NextVal(bool eq) {return true;}
- virtual int FastFind(int nk) = 0;
- virtual bool Reorder(PGLOBAL g) {return true;}
- virtual int Range(PGLOBAL g, int limit = 0, bool incl = true)
- {return -1;} // Means error
- virtual int Qcompare(int *, int *) = 0;
- virtual int GroupSize(void) {return 1;}
- virtual void Close(void) = 0;
-
- protected:
- // Members
- PTDBASE Tbxp; // Points to calling table TDB
- PXCOL To_KeyCol; // To KeyCol class list
- MBLOCK Record; // Record allocation block
- int* &To_Rec; // We are using ftell, fseek
- int Cur_K; // Index of current record
- int Old_K; // Index of last record
- int Num_K; // Size of Rec_K pointer array
- int Ndif; // Number of distinct values
- int Bot; // Bottom of research index
- int Top; // Top of research index
- int Inf, Sup; // Used for block optimization
- OPVAL Op; // Search operator
- bool Mul; // true if multiple
- bool Srtd; // true for sorted column
- int Val_K; // Index of current value
- int Nblk; // Number of blocks
- int Sblk; // Block size
- int Thresh; // Thresh for sorting join indexes
- int ID; // Index ID number
- int Nth; // Nth constant to fetch
- }; // end of class XXBASE
-
-/***********************************************************************/
-/* This is the standard (multicolumn) Index class declaration. */
-/***********************************************************************/
-class DllExport XINDEX : public XXBASE {
- friend class KXYCOL;
- public:
- // Constructor
- XINDEX(PTDBDOS tdbp, PIXDEF xdp, PXLOAD pxp,
- PCOL *cp, PXOB *xp = NULL, int k = 0);
-
- // Implementation
- virtual IDT GetType(void) {return TYPE_IDX_INDX;}
- virtual bool IsMul(void) {return (Nval < Nk) ? true : Mul;}
- virtual bool HaveSame(void) {return Op == OP_SAME;}
- virtual int GetCurPos(void) {return (Pex) ? Pex[Cur_K] : Cur_K;}
- virtual void SetNval(int n) {Nval = n;}
- int GetMaxSame(void) {return MaxSame;}
- int GetDefoff(void) {return Defoff;}
- int GetDefhigh(void) {return Defhigh;}
- int GetSize(void) {return Size;}
-
- // Methods
- virtual void Reset(void);
- virtual bool Init(PGLOBAL g);
- virtual int Qcompare(int *, int *);
- virtual int Fetch(PGLOBAL g);
- virtual int FastFind(int nk);
- virtual int GroupSize(void);
- virtual int Range(PGLOBAL g, int limit = 0, bool incl = true);
- virtual int MaxRange(void) {return MaxSame;}
- virtual int ColMaxSame(PXCOL kp);
- virtual void Close(void);
- virtual bool NextVal(bool eq);
- virtual bool Make(PGLOBAL g, PIXDEF sxp);
- virtual bool SaveIndex(PGLOBAL g, PIXDEF sxp);
- virtual bool Reorder(PGLOBAL g);
- bool GetAllSizes(PGLOBAL g, int &ndif, int &numk);
-
- protected:
- bool NextValDif(void);
-
- // Members
- PIXDEF Xdp; // To index definition
- PTDBDOS Tdbp; // Points to calling table TDB
- PXLOAD X; // To XLOAD class
- PXCOL To_LastCol; // To the last key part block
- PXCOL To_LastVal; // To the last used key part block
- PCOL *To_Cols; // To array of indexed columns
- PXOB *To_Vals; // To array of column values
- int Nk; // The number of indexed columns
- int Nval; // The number of used columns
- int Incr; // Increment of record position
- int Defoff; // Offset of definition in index file
- int Defhigh; // High order of offset big value
- int Size; // Size of definition in index file
- int MaxSame; // Max number of same values
- }; // end of class XINDEX
-
-/***********************************************************************/
-/* This is the fast single column index class declaration. */
-/***********************************************************************/
-class DllExport XINDXS : public XINDEX {
- friend class KXYCOL;
- public:
- // Constructor
- XINDXS(PTDBDOS tdbp, PIXDEF xdp, PXLOAD pxp, PCOL *cp, PXOB *xp = NULL);
-
- // Implementation
- virtual void SetNval(int n) {assert(n == 1);}
-
- // Methods
- virtual int Qcompare(int *, int *);
- virtual int Fetch(PGLOBAL g);
- virtual int FastFind(int nk);
- virtual bool NextVal(bool eq);
- virtual int Range(PGLOBAL g, int limit = 0, bool incl = true);
- virtual int GroupSize(void);
-
- protected:
- // Members
- }; // end of class XINDXS
-
-/***********************************************************************/
-/* This is the saving/loading index utility base class. */
-/***********************************************************************/
-class DllExport XLOAD : public BLOCK {
- friend class XBIGEX;
- friend class XBIGXS;
- public:
- // Constructor
- XLOAD(void);
-
- // Methods
- virtual bool Open(PGLOBAL g, char *filename, MODE mode) = 0;
- virtual bool GetOff(int& low, int& high, PIXDEF sxp) = 0;
- virtual bool Seek(PGLOBAL g, int low, int high, int origin) = 0;
- virtual bool Read(PGLOBAL g, void *buf, int n, int size) = 0;
- virtual int Write(PGLOBAL g, void *buf, int n,
- int size, bool& rc) = 0;
- virtual void Close(void);
-#if defined(XMAP)
- virtual void *FileView(PGLOBAL g, char *fn, int loff,
- int hoff, int size) = 0;
-#endif // XMAP
-
- protected:
- // Members
-#if defined(WIN32)
- HANDLE Hfile; // Handle to file or map
-#if defined(XMAP)
- void *ViewBase; // Mapped view base address
-#endif // XMAP
-#else // UNIX
- int Hfile; // Descriptor to file or map
-#endif // UNIX
- }; // end of class XLOAD
-
-/***********************************************************************/
-/* This is the saving/loading indexes utility class. */
-/***********************************************************************/
-class DllExport XFILE : public XLOAD {
- public:
- // Constructor
- XFILE(void);
-
- // Methods
- virtual bool Open(PGLOBAL g, char *filename, MODE mode);
- virtual bool GetOff(int& low, int& high, PIXDEF sxp);
- virtual bool Seek(PGLOBAL g, int low, int high, int origin);
- virtual bool Read(PGLOBAL g, void *buf, int n, int size);
- virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc);
- virtual void Close(void);
-#if defined(XMAP)
- virtual void *FileView(PGLOBAL g, char *fn, int loff,
- int hoff, int size);
-#endif // XMAP
-
- protected:
- // Members
- FILE *Xfile; // Index stream file
-#if defined(XMAP) && !defined(WIN32)
- MMP Mmp; // To UNIX mapped index file
-#endif // XMAP
- }; // end of class XFILE
-
-/***********************************************************************/
-/* This is the saving/loading huge indexes utility class. */
-/***********************************************************************/
-class DllExport XHUGE : public XLOAD {
- public:
- // Constructor
- XHUGE(void) : XLOAD() {}
-
- // Methods
- virtual bool Open(PGLOBAL g, char *filename, MODE mode);
- virtual bool GetOff(int& low, int& high, PIXDEF sxp);
- virtual bool Seek(PGLOBAL g, int low, int high, int origin);
- virtual bool Read(PGLOBAL g, void *buf, int n, int size);
- virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc);
-#if defined(XMAP)
- virtual void *FileView(PGLOBAL g, char *fn, int loff,
- int hoff, int size);
-#endif // XMAP
-
- protected:
- // Members
- }; // end of class XHUGE
-
-/***********************************************************************/
-/* This is the XDB index for columns containing ROWID values. */
-/***********************************************************************/
-class DllExport XXROW : public XXBASE {
- friend class KXYCOL;
- public:
- // Constructor
- XXROW(PTDBDOS tbxp);
-
- // Implementation
- virtual IDT GetType(void) {return TYPE_IDX_XROW;}
- virtual void Reset(void);
-
- // Methods
- virtual bool Init(PGLOBAL g);
- virtual int Fetch(PGLOBAL g);
- virtual int FastFind(int nk);
- virtual int MaxRange(void) {return 1;}
- virtual int Range(PGLOBAL g, int limit = 0, bool incl = true);
- virtual int Qcompare(int *, int *) {assert(false); return 0;}
- virtual void Close(void) {}
-
- protected:
- // Members
- PTDBDOS Tdbp; // Points to calling table TDB
- PVAL Valp; // The value to match in index
- }; // end of class XXROW
-
-/***********************************************************************/
-/* Definition of class KXYCOL used to store values of indexed columns */
-/***********************************************************************/
-class KXYCOL: public BLOCK {
- friend class INDEXDEF;
- friend class XINDEX;
- friend class XINDXS;
- friend class XBIGEX;
- friend class XBIGXS;
- friend class TDBDOS;
- public:
- // Constructors
- KXYCOL(PKXBASE kp);
-
- // Implementation
- int GetType(void) {return Type;}
- void SetValue(PCOL colp, int i);
-
- public:
- // Methods
- virtual bool Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln);
- virtual bool InitFind(PGLOBAL g, PXOB xp);
- virtual void ReAlloc(PGLOBAL g, int n);
- virtual void FreeData(void);
- virtual void FillValue(PVAL valp);
- virtual int CompVal(int i);
- void InitBinFind(void *vp);
- bool MakeBlockArray(PGLOBAL g, int nb, int size);
- int Compare(int i1, int i2);
- int CompBval(int i);
- void Save(int i) {Valp->SetBinValue(Kblp->GetValPtr(i));}
- void Restore(int j) {Kblp->SetValue(Valp, j);}
- void Move(int j, int k) {Kblp->Move(k, j);}
-
- // Specific functions
-#if defined(XMAP)
- BYTE *MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m);
-#endif // XMAP
- int *MakeOffset(PGLOBAL g, int n);
-
- protected:
- // Members
- PXCOL Next; // To next in the key part list
- PXCOL Previous; // To previous in the key part list
- PKXBASE Kxp; // To the INDEX class block
- PCOL Colp; // To matching object if a column
- bool IsSorted; // true if column is already sorted
- bool Asc; // true for ascending sort, false for Desc
- MBLOCK Keys; // Data array allocation block
- void* &To_Keys; // To data array
- PVBLK Kblp; // To Valblock of the data array
- MBLOCK Bkeys; // Block array allocation block
- void* &To_Bkeys; // To block array
- PVBLK Blkp; // To Valblock of the block array
- PVAL Valp; // Value use by Find
- int Klen; // Length of character string or num value
- int Kprec; // The Value(s) precision or CI
- int Type; // The Value(s) type
- bool Prefix; // Key on CHAR column prefix
- MBLOCK Koff; // Offset allocation block
- CPINT &Kof; // Reference to offset array
- int Val_K; // Index of current column value
- int Ndf; // Number of stored values
- int Mxs; // Max same for this column
- }; // end of class KXYCOL
-
-#endif // __XINDEX_H__
+/*************** Xindex H Declares Source Code File (.H) ***************/ +/* Name: XINDEX.H Version 3.4 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2004 - 2012 */ +/* */ +/* This file contains the XINDEX class declares. */ +/***********************************************************************/ +#ifndef __XINDEX_H__ +#define __XINDEX_H__ +#include "block.h" +#include "csort.h" /* Base class declares */ +#include "xtable.h" +#include "valblk.h" + +enum IDT {TYPE_IDX_ERROR = 0, /* Type not defined */ + TYPE_IDX_INDX = 4, /* Permanent standard index */ + TYPE_IDX_XROW = 5}; /* Permanent row index */ + +typedef struct mem_map *MMP; +typedef class INDEXDEF *PIXDEF; +typedef class KPARTDEF *PKPDEF; +typedef class XINDEX *PXINDEX; +typedef class XLOAD *PXLOAD; +typedef class KXYCOL *PXCOL; + +/***********************************************************************/ +/* Structures used when checking for possible indexing */ +/***********************************************************************/ +typedef struct index_col *PICOL; +typedef struct index_val *PIVAL; +typedef struct index_def *PINDX; +typedef struct indx_used *PXUSED; + +typedef struct index_val : public BLOCK { + index_val(PXOB xp) {Next = NULL; Xval = xp; Kp = NULL;} + PIVAL Next; // Next value + PXOB Xval; // To value or array + int *Kp; // The coordonates in a LSTBLK + } IVAL; + +typedef struct index_col : public BLOCK { + index_col(PCOL cp) + {Next = Nxtgrp = NULL; Colp = cp; Ngrp = N = 0; Vals = NULL;} + PICOL Next; // Next column + PICOL Nxtgrp; // Next group + PCOL Colp; // The column + PIVAL Vals; // To column values + int Ngrp; // Group number of values + int N; // Column number of values + } ICOL; + +typedef struct index_def : public BLOCK { + index_def(PIXDEF xdp) + {Next = NULL; Pxdf = xdp; Cols = NULL; Alloc = false;} + PINDX Next; + PIXDEF Pxdf; + PICOL Cols; + bool Alloc; // Must allocate values + } INDX; + +/***********************************************************************/ +/* Index definition block. */ +/***********************************************************************/ +class DllExport INDEXDEF : public BLOCK { /* Index description block */ + friend class PLUGCAT; + friend class DOSDEF; + friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add); + public: + // Constructor + INDEXDEF(char *name, bool uniq = false, int n = 0); + + // Implementation + PIXDEF GetNext(void) {return Next;} + void SetNext(PIXDEF pxdf) {Next = pxdf;} + PSZ GetName(void) {return (PSZ)Name;} + bool IsUnique(void) {return Unique;} + bool IsAuto(void) {return AutoInc;} + void SetAuto(bool b) {AutoInc = b;} + void SetInvalid(bool b) {Invalid = b;} + int GetNparts(void) {return Nparts;} + int GetID(void) {return ID;} + void SetID(int n) {ID = n;} + PKPDEF GetToKeyParts(void) {return ToKeyParts;} + void SetToKeyParts(PKPDEF kp) {ToKeyParts = kp;} + void SetNParts(uint np) {Nparts = (signed)np;} + void SetMaxSame(int mxs) {MaxSame = mxs;} + void SetMxsame(PXINDEX x); + int GetOffset(void) {return Offset;} + void SetOffset(int off) {Offset = off;} + int GetOffhigh(void) {return Offhigh;} + void SetOffhigh(int hof) {Offhigh = hof;} + int GetSize(void) {return Size;} + void SetSize(int size) {Size = size;} + int GetMaxSame(void) {return MaxSame;} + bool Define(PGLOBAL g, void *memp, PTABDEF dfp, LPCSTR p); + PIXDEF GetIndexOf(PCOL colp, bool hd = false); + int IsIndexOf(PCOL colp); + PKXBASE CheckIndexing(PGLOBAL g, PTDBDOS tdbp); + PINDX CheckAND(PGLOBAL g, PINDX pix1, PINDX pix2); + PINDX CheckOR(PGLOBAL g, PINDX pix1, PINDX pix2); + PINDX CheckEQ(PGLOBAL g, PTDB tdbp, PXOB *arg, int op, int *kp = NULL); + bool TestEQ(PGLOBAL g, PTDB tdbp, PXOB *arg, int op, bool b = false); + + protected: + PIXDEF Next; /* To next block */ + PKPDEF ToKeyParts; /* To the key part definitions */ + char *Name; /* Index name */ + bool Unique; /* true if defined as unique */ + bool Invalid; /* true if marked as Invalid */ + bool AutoInc; /* true if unique key in auto increment */ + int Nparts; /* Number of key parts */ + int ID; /* Index ID number */ + int Offset; /* Offset in index file */ + int Offhigh; /* Offset high in big index file */ + int Size; /* Size of index file */ + int MaxSame; /* Max number of same values */ + }; // end of INDEXDEF + +typedef struct indx_used : public BLOCK { + indx_used(PTDB tp, PIXDEF xdp, PCOL *cp, int k) + {Tname = (char*)tp->GetName(); Xname = xdp->GetName(); Cp = cp; K = k;} + PXUSED Next; + char *Tname; + PSZ Xname; + PCOL *Cp; + int K; + } XUSED; + +/***********************************************************************/ +/* Index Key Part definition block. */ +/***********************************************************************/ +class DllExport KPARTDEF : public BLOCK { /* Index Key Part desc block */ + friend class INDEXDEF; + friend class XINDEX; + friend class PLUGCAT; + friend class DOSDEF; + friend int PlgMakeIndex(PGLOBAL g, PSZ name, PIXDEF pxdf, bool add); + public: + KPARTDEF(PSZ name, int n); // Constructor + + // Implementation + PKPDEF GetNext(void) {return Next;} + PSZ GetName(void) {return (PSZ)Name;} + int GetNcol(void) {return Ncol;} + void SetNext(PKPDEF pkdf) {Next = pkdf;} + void SetKlen(int len) {Klen = len;} + void SetMxsame(int mxs) {Mxsame = mxs;} + + protected: + PKPDEF Next; /* To next block */ + PSZ Name; /* Field name */ + int Mxsame; /* Field max same values */ + int Ncol; /* Field number */ + int Klen; /* Key length */ + }; // end of KPARTDEF + +/***********************************************************************/ +/* This is the XDB Index virtual base class declaration. */ +/***********************************************************************/ +class DllExport XXBASE : public CSORT, public BLOCK { + friend class INDEXDEF; + friend class KXYCOL; + public: + // Constructor + XXBASE(PTDBDOS tbxp, bool b); + + // Implementation + virtual IDT GetType(void) = 0; + virtual void Reset(void) = 0; + virtual bool IsMul(void) {return false;} + virtual bool IsRandom(void) {return true;} + virtual bool HaveSame(void) {return false;} + virtual int GetCurPos(void) {return Cur_K;} + virtual void SetNval(int n) {assert(n == 1);} + virtual void SetOp(OPVAL op) {Op = op;} + int GetNdif(void) {return Ndif;} + int GetNum_K(void) {return Num_K;} + int GetCur_K(void) {return Cur_K;} + int GetID(void) {return ID;} + void SetID(int id) {ID = id;} + void SetNth(int n) {Nth = n;} + int *GetPof(void) {return Pof;} + int *GetPex(void) {return Pex;} + void FreeIndex(void) {PlgDBfree(Index);} + + // Methods + virtual void Print(PGLOBAL g, FILE *f, uint n); + virtual void Print(PGLOBAL g, char *ps, uint z); + virtual bool Init(PGLOBAL g) = 0; + virtual int MaxRange(void) {return 1;} + virtual int Fetch(PGLOBAL g) = 0; + virtual bool NextVal(bool eq) {return true;} + virtual int FastFind(int nk) = 0; + virtual bool Reorder(PGLOBAL g) {return true;} + virtual int Range(PGLOBAL g, int limit = 0, bool incl = true) + {return -1;} // Means error + virtual int Qcompare(int *, int *) = 0; + virtual int GroupSize(void) {return 1;} + virtual void Close(void) = 0; + + protected: + // Members + PTDBASE Tbxp; // Points to calling table TDB + PXCOL To_KeyCol; // To KeyCol class list + MBLOCK Record; // Record allocation block + int* &To_Rec; // We are using ftell, fseek + int Cur_K; // Index of current record + int Old_K; // Index of last record + int Num_K; // Size of Rec_K pointer array + int Ndif; // Number of distinct values + int Bot; // Bottom of research index + int Top; // Top of research index + int Inf, Sup; // Used for block optimization + OPVAL Op; // Search operator + bool Mul; // true if multiple + bool Srtd; // true for sorted column + int Val_K; // Index of current value + int Nblk; // Number of blocks + int Sblk; // Block size + int Thresh; // Thresh for sorting join indexes + int ID; // Index ID number + int Nth; // Nth constant to fetch + }; // end of class XXBASE + +/***********************************************************************/ +/* This is the standard (multicolumn) Index class declaration. */ +/***********************************************************************/ +class DllExport XINDEX : public XXBASE { + friend class KXYCOL; + public: + // Constructor + XINDEX(PTDBDOS tdbp, PIXDEF xdp, PXLOAD pxp, + PCOL *cp, PXOB *xp = NULL, int k = 0); + + // Implementation + virtual IDT GetType(void) {return TYPE_IDX_INDX;} + virtual bool IsMul(void) {return (Nval < Nk) ? true : Mul;} + virtual bool HaveSame(void) {return Op == OP_SAME;} + virtual int GetCurPos(void) {return (Pex) ? Pex[Cur_K] : Cur_K;} + virtual void SetNval(int n) {Nval = n;} + int GetMaxSame(void) {return MaxSame;} + int GetDefoff(void) {return Defoff;} + int GetDefhigh(void) {return Defhigh;} + int GetSize(void) {return Size;} + + // Methods + virtual void Reset(void); + virtual bool Init(PGLOBAL g); + virtual int Qcompare(int *, int *); + virtual int Fetch(PGLOBAL g); + virtual int FastFind(int nk); + virtual int GroupSize(void); + virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); + virtual int MaxRange(void) {return MaxSame;} + virtual int ColMaxSame(PXCOL kp); + virtual void Close(void); + virtual bool NextVal(bool eq); + virtual bool Make(PGLOBAL g, PIXDEF sxp); + virtual bool SaveIndex(PGLOBAL g, PIXDEF sxp); + virtual bool Reorder(PGLOBAL g); + bool GetAllSizes(PGLOBAL g, int &ndif, int &numk); + + protected: + bool NextValDif(void); + + // Members + PIXDEF Xdp; // To index definition + PTDBDOS Tdbp; // Points to calling table TDB + PXLOAD X; // To XLOAD class + PXCOL To_LastCol; // To the last key part block + PXCOL To_LastVal; // To the last used key part block + PCOL *To_Cols; // To array of indexed columns + PXOB *To_Vals; // To array of column values + int Nk; // The number of indexed columns + int Nval; // The number of used columns + int Incr; // Increment of record position + int Defoff; // Offset of definition in index file + int Defhigh; // High order of offset big value + int Size; // Size of definition in index file + int MaxSame; // Max number of same values + }; // end of class XINDEX + +/***********************************************************************/ +/* This is the fast single column index class declaration. */ +/***********************************************************************/ +class DllExport XINDXS : public XINDEX { + friend class KXYCOL; + public: + // Constructor + XINDXS(PTDBDOS tdbp, PIXDEF xdp, PXLOAD pxp, PCOL *cp, PXOB *xp = NULL); + + // Implementation + virtual void SetNval(int n) {assert(n == 1);} + + // Methods + virtual int Qcompare(int *, int *); + virtual int Fetch(PGLOBAL g); + virtual int FastFind(int nk); + virtual bool NextVal(bool eq); + virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); + virtual int GroupSize(void); + + protected: + // Members + }; // end of class XINDXS + +/***********************************************************************/ +/* This is the saving/loading index utility base class. */ +/***********************************************************************/ +class DllExport XLOAD : public BLOCK { + friend class XBIGEX; + friend class XBIGXS; + public: + // Constructor + XLOAD(void); + + // Methods + virtual bool Open(PGLOBAL g, char *filename, MODE mode) = 0; + virtual bool GetOff(int& low, int& high, PIXDEF sxp) = 0; + virtual bool Seek(PGLOBAL g, int low, int high, int origin) = 0; + virtual bool Read(PGLOBAL g, void *buf, int n, int size) = 0; + virtual int Write(PGLOBAL g, void *buf, int n, + int size, bool& rc) = 0; + virtual void Close(void); +#if defined(XMAP) + virtual void *FileView(PGLOBAL g, char *fn, int loff, + int hoff, int size) = 0; +#endif // XMAP + + protected: + // Members +#if defined(WIN32) + HANDLE Hfile; // Handle to file or map +#if defined(XMAP) + void *ViewBase; // Mapped view base address +#endif // XMAP +#else // UNIX + int Hfile; // Descriptor to file or map +#endif // UNIX + }; // end of class XLOAD + +/***********************************************************************/ +/* This is the saving/loading indexes utility class. */ +/***********************************************************************/ +class DllExport XFILE : public XLOAD { + public: + // Constructor + XFILE(void); + + // Methods + virtual bool Open(PGLOBAL g, char *filename, MODE mode); + virtual bool GetOff(int& low, int& high, PIXDEF sxp); + virtual bool Seek(PGLOBAL g, int low, int high, int origin); + virtual bool Read(PGLOBAL g, void *buf, int n, int size); + virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc); + virtual void Close(void); +#if defined(XMAP) + virtual void *FileView(PGLOBAL g, char *fn, int loff, + int hoff, int size); +#endif // XMAP + + protected: + // Members + FILE *Xfile; // Index stream file +#if defined(XMAP) && !defined(WIN32) + MMP Mmp; // To UNIX mapped index file +#endif // XMAP + }; // end of class XFILE + +/***********************************************************************/ +/* This is the saving/loading huge indexes utility class. */ +/***********************************************************************/ +class DllExport XHUGE : public XLOAD { + public: + // Constructor + XHUGE(void) : XLOAD() {} + + // Methods + virtual bool Open(PGLOBAL g, char *filename, MODE mode); + virtual bool GetOff(int& low, int& high, PIXDEF sxp); + virtual bool Seek(PGLOBAL g, int low, int high, int origin); + virtual bool Read(PGLOBAL g, void *buf, int n, int size); + virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc); +#if defined(XMAP) + virtual void *FileView(PGLOBAL g, char *fn, int loff, + int hoff, int size); +#endif // XMAP + + protected: + // Members + }; // end of class XHUGE + +/***********************************************************************/ +/* This is the XDB index for columns containing ROWID values. */ +/***********************************************************************/ +class DllExport XXROW : public XXBASE { + friend class KXYCOL; + public: + // Constructor + XXROW(PTDBDOS tbxp); + + // Implementation + virtual IDT GetType(void) {return TYPE_IDX_XROW;} + virtual void Reset(void); + + // Methods + virtual bool Init(PGLOBAL g); + virtual int Fetch(PGLOBAL g); + virtual int FastFind(int nk); + virtual int MaxRange(void) {return 1;} + virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); + virtual int Qcompare(int *, int *) {assert(false); return 0;} + virtual void Close(void) {} + + protected: + // Members + PTDBDOS Tdbp; // Points to calling table TDB + PVAL Valp; // The value to match in index + }; // end of class XXROW + +/***********************************************************************/ +/* Definition of class KXYCOL used to store values of indexed columns */ +/***********************************************************************/ +class KXYCOL: public BLOCK { + friend class INDEXDEF; + friend class XINDEX; + friend class XINDXS; + friend class XBIGEX; + friend class XBIGXS; + friend class TDBDOS; + public: + // Constructors + KXYCOL(PKXBASE kp); + + // Implementation + int GetType(void) {return Type;} + void SetValue(PCOL colp, int i); + + public: + // Methods + virtual bool Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln); + virtual bool InitFind(PGLOBAL g, PXOB xp); + virtual void ReAlloc(PGLOBAL g, int n); + virtual void FreeData(void); + virtual void FillValue(PVAL valp); + virtual int CompVal(int i); + void InitBinFind(void *vp); + bool MakeBlockArray(PGLOBAL g, int nb, int size); + int Compare(int i1, int i2); + int CompBval(int i); + void Save(int i) {Valp->SetBinValue(Kblp->GetValPtr(i));} + void Restore(int j) {Kblp->SetValue(Valp, j);} + void Move(int j, int k) {Kblp->Move(k, j);} + + // Specific functions +#if defined(XMAP) + BYTE *MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m); +#endif // XMAP + int *MakeOffset(PGLOBAL g, int n); + + protected: + // Members + PXCOL Next; // To next in the key part list + PXCOL Previous; // To previous in the key part list + PKXBASE Kxp; // To the INDEX class block + PCOL Colp; // To matching object if a column + bool IsSorted; // true if column is already sorted + bool Asc; // true for ascending sort, false for Desc + MBLOCK Keys; // Data array allocation block + void* &To_Keys; // To data array + PVBLK Kblp; // To Valblock of the data array + MBLOCK Bkeys; // Block array allocation block + void* &To_Bkeys; // To block array + PVBLK Blkp; // To Valblock of the block array + PVAL Valp; // Value use by Find + int Klen; // Length of character string or num value + int Kprec; // The Value(s) precision or CI + int Type; // The Value(s) type + bool Prefix; // Key on CHAR column prefix + MBLOCK Koff; // Offset allocation block + CPINT &Kof; // Reference to offset array + int Val_K; // Index of current column value + int Ndf; // Number of stored values + int Mxs; // Max same for this column + }; // end of class KXYCOL + +#endif // __XINDEX_H__ |