1/*************** TabDos H Declares Source Code File (.H) ***************/
2/* Name: TABDOS.H Version 3.3 */
3/* */
4/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */
5/* */
6/* This file contains the DOS classes declares. */
7/***********************************************************************/
8
9#ifndef __TABDOS_H
10#define __TABDOS_H
11
12#include "xtable.h" // Table base class declares
13#include "colblk.h" // Column base class declares
14#include "xindex.h"
15#include "filter.h"
16
17//pedef struct _tabdesc *PTABD; // For friend setting
18typedef class TXTFAM *PTXF;
19typedef class BLOCKFILTER *PBF;
20typedef class BLOCKINDEX *PBX;
21
22/***********************************************************************/
23/* DOS table. */
24/***********************************************************************/
25class DllExport DOSDEF : public TABDEF { /* Logical table description */
26 friend class OEMDEF;
27 friend class TDBDOS;
28 friend class TDBFIX;
29 friend class TXTFAM;
30 friend class DBFBASE;
31 friend class UNZIPUTL;
32 friend class JSONCOL;
33 public:
34 // Constructor
35 DOSDEF(void);
36
37 // Implementation
38 virtual AMT GetDefType(void) {return TYPE_AM_DOS;}
39 virtual const char *GetType(void) {return "DOS";}
40 virtual PIXDEF GetIndx(void) {return To_Indx;}
41 virtual void SetIndx(PIXDEF xdp) {To_Indx = xdp;}
42 virtual bool IsHuge(void) {return Huge;}
43 PCSZ GetFn(void) {return Fn;}
44 PCSZ GetOfn(void) {return Ofn;}
45 PCSZ GetEntry(void) {return Entry;}
46 bool GetMul(void) {return Mulentries;}
47 bool GetAppend(void) {return Append;}
48 void SetBlock(int block) { Block = block; }
49 int GetBlock(void) {return Block;}
50 int GetLast(void) {return Last;}
51 void SetLast(int last) {Last = last;}
52 int GetLrecl(void) {return Lrecl;}
53 void SetLrecl(int lrecl) {Lrecl = lrecl;}
54 bool GetPadded(void) {return Padded;}
55 bool GetEof(void) {return Eof;}
56 int GetBlksize(void) {return Blksize;}
57 int GetEnding(void) {return Ending;}
58 bool IsOptimized(void) {return (Optimized == 1);}
59 void SetOptimized(int opt) {Optimized = opt;}
60 void SetAllocBlks(int blks) {AllocBlks = blks;}
61 int GetAllocBlks(void) {return AllocBlks;}
62 int *GetTo_Pos(void) {return To_Pos;}
63
64 // Methods
65 virtual int Indexable(void)
66 {return (!Multiple && !Mulentries && Compressed != 1) ? 1 : 0;}
67 virtual bool DeleteIndexFile(PGLOBAL g, PIXDEF pxdf);
68 virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
69 virtual PTDB GetTable(PGLOBAL g, MODE mode);
70 bool InvalidateIndex(PGLOBAL g);
71 bool GetOptFileName(PGLOBAL g, char *filename);
72 void RemoveOptValues(PGLOBAL g);
73
74 protected:
75//virtual bool Erase(char *filename);
76
77 // Members
78 PCSZ Fn; /* Path/Name of corresponding file */
79 PCSZ Ofn; /* Base Path/Name of matching index files*/
80 PCSZ Entry; /* Zip entry name or pattern */
81 PCSZ Pwd; /* Zip password */
82 PIXDEF To_Indx; /* To index definitions blocks */
83 RECFM Recfm; /* 0:VAR, 1:FIX, 2:BIN, 3:VCT, 6:DBF */
84 bool Mapped; /* 0: disk file, 1: memory mapped file */
85 bool Zipped; /* true for zipped table file */
86 bool Mulentries; /* true for multiple entries */
87 bool Append; /* Used when creating zipped table */
88 bool Padded; /* true for padded table file */
89 bool Huge; /* true for files larger than 2GB */
90 bool Accept; /* true if wrong lines are accepted */
91 bool Eof; /* true if an EOF (0xA) character exists */
92 int *To_Pos; /* To array of block starting positions */
93 int Optimized; /* 0: No, 1:Yes, 2:Redo optimization */
94 int AllocBlks; /* Number of suballocated opt blocks */
95 int Compressed; /* 0: No, 1: gz, 2:zlib compressed file */
96 int Lrecl; /* Size of biggest record */
97 int AvgLen; /* Average size of records */
98 int Block; /* Number de blocks of FIX/VCT tables */
99 int Last; /* Number of elements of last block */
100 int Blksize; /* Size of padded blocks */
101 int Maxerr; /* Maximum number of bad records (DBF) */
102 int ReadMode; /* Specific to DBF */
103 int Ending; /* Length of end of lines */
104 char Teds; /* Binary table default endian setting */
105 }; // end of DOSDEF
106
107/***********************************************************************/
108/* This is the DOS/UNIX Access Method class declaration for files */
109/* that are standard files with columns starting at fixed offset. */
110/* The last column (and record) is of variable length. */
111/***********************************************************************/
112class DllExport TDBDOS : public TDBASE {
113 friend class XINDEX;
114 friend class DOSCOL;
115 friend class MAPCOL;
116 friend class TXTFAM;
117 friend class DOSFAM;
118 friend class VCTCOL;
119 friend RCODE CntDeleteRow(PGLOBAL, PTDB, bool);
120 public:
121 // Constructors
122 TDBDOS(PDOSDEF tdp, PTXF txfp);
123 TDBDOS(PGLOBAL g, PTDBDOS tdbp);
124
125 // Inline functions
126 inline void SetTxfp(PTXF txfp) {Txfp = txfp; Txfp->SetTdbp(this);}
127 inline PTXF GetTxfp(void) {return Txfp;}
128 inline char *GetLine(void) {return To_Line;}
129 inline int GetCurBlk(void) {return Txfp->GetCurBlk();}
130 inline void SetLine(char *toline) {To_Line = toline;}
131 inline void IncLine(int inc) {To_Line += inc;}
132 inline bool IsRead(void) {return Txfp->IsRead;}
133 inline PXOB *GetLink(void) {return To_Link;}
134
135 // Implementation
136 virtual AMT GetAmType(void) {return Txfp->GetAmType();}
137 virtual PCSZ GetFile(PGLOBAL) {return Txfp->To_File;}
138 virtual void SetFile(PGLOBAL, PCSZ fn) {Txfp->To_File = fn;}
139 virtual void SetAbort(bool b) {Abort = b;}
140 virtual RECFM GetFtype(void) {return Ftype;}
141 virtual bool SkipHeader(PGLOBAL) {return false;}
142 virtual void RestoreNrec(void) {Txfp->SetNrec(1);}
143 virtual PTDB Duplicate(PGLOBAL g)
144 {return (PTDB)new(g) TDBDOS(g, this);}
145
146 // Methods
147 virtual PTDB Clone(PTABS t);
148 virtual void ResetDB(void) {Txfp->Reset();}
149 virtual bool IsUsingTemp(PGLOBAL g);
150 virtual bool IsIndexed(void) {return Indxd;}
151 virtual void ResetSize(void) {MaxSize = Cardinal = -1;}
152 virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox);
153 virtual int MakeBlockValues(PGLOBAL g);
154 virtual bool SaveBlockValues(PGLOBAL g);
155 virtual bool GetBlockValues(PGLOBAL g);
156 virtual PBF InitBlockFilter(PGLOBAL g, PFIL filp);
157//virtual PBX InitBlockIndex(PGLOBAL g);
158 virtual int TestBlock(PGLOBAL g);
159 virtual void PrintAM(FILE *f, char *m);
160
161 // Database routines
162 virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
163 virtual char *GetOpenMode(PGLOBAL, char*) {return NULL;}
164 virtual int GetFileLength(PGLOBAL g) {return Txfp->GetFileLength(g);}
165 virtual int GetProgMax(PGLOBAL g);
166 virtual int GetProgCur(void);
167//virtual int GetAffectedRows(void) {return Txfp->GetDelRows();}
168 virtual int GetRecpos(void) {return Txfp->GetPos();}
169 virtual bool SetRecpos(PGLOBAL g, int recpos)
170 {return Txfp->SetPos(g, recpos);}
171 virtual int RowNumber(PGLOBAL g, bool b = false);
172 virtual int Cardinality(PGLOBAL g);
173 virtual int GetMaxSize(PGLOBAL g);
174 virtual bool OpenDB(PGLOBAL g);
175 virtual int ReadDB(PGLOBAL g);
176 virtual int WriteDB(PGLOBAL g);
177 virtual int DeleteDB(PGLOBAL g, int irc);
178 virtual void CloseDB(PGLOBAL g);
179 virtual int ReadBuffer(PGLOBAL g) {return Txfp->ReadBuffer(g);}
180
181 // Specific routine
182 virtual int EstimatedLength(void);
183
184 // Optimization routines
185 virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add);
186 bool InitialyzeIndex(PGLOBAL g, PIXDEF xdp, bool sorted);
187 void ResetBlockFilter(PGLOBAL g);
188 bool GetDistinctColumnValues(PGLOBAL g, int nrec);
189
190 protected:
191 virtual bool PrepareWriting(PGLOBAL g);
192 PBF CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv);
193
194 // Members
195 PTXF Txfp; // To the File access method class
196//PBX To_BlkIdx; // To index test block
197 PBF To_BlkFil; // To evaluation block filter
198 PFIL SavFil; // Saved hidden filter
199 char *To_Line; // Points to current processed line
200 bool Abort; // TRUE when aborting UPDATE/DELETE
201 bool Indxd; // TRUE for indexed UPDATE/DELETE
202 int Lrecl; // Logical Record Length
203 int AvgLen; // Logical Record Average Length
204//int Xeval; // BlockTest return value
205 int Beval; // BlockEval return value
206 }; // end of class TDBDOS
207
208/***********************************************************************/
209/* Class DOSCOL: DOS access method column descriptor. */
210/* This A.M. is used for text file tables under operating systems */
211/* DOS, OS2, UNIX, WIN16 and WIN32. */
212/***********************************************************************/
213class DllExport DOSCOL : public COLBLK {
214 friend class TDBDOS;
215 friend class TDBFIX;
216 public:
217 // Constructors
218 DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am = "DOS");
219 DOSCOL(DOSCOL *colp, PTDB tdbp); // Constructor used in copy process
220
221 // Implementation
222 virtual int GetAmType(void) {return TYPE_AM_DOS;}
223 virtual void SetTo_Val(PVAL valp) {To_Val = valp;}
224 virtual int GetClustered(void) {return Clustered;}
225 virtual int IsClustered(void) {return (Clustered &&
226 ((PDOSDEF)(((PTDBDOS)To_Tdb)->To_Def))->IsOptimized());}
227 virtual int IsSorted(void) {return Sorted;}
228 virtual PVBLK GetMin(void) {return Min;}
229 virtual PVBLK GetMax(void) {return Max;}
230 virtual int GetNdv(void) {return Ndv;}
231 virtual int GetNbm(void) {return Nbm;}
232 virtual PVBLK GetBmap(void) {return Bmap;}
233 virtual PVBLK GetDval(void) {return Dval;}
234
235 // Methods
236 virtual bool VarSize(void);
237 virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check);
238 virtual void ReadColumn(PGLOBAL g);
239 virtual void WriteColumn(PGLOBAL g);
240
241 protected:
242 virtual bool SetMinMax(PGLOBAL g);
243 virtual bool SetBitMap(PGLOBAL g);
244 bool CheckSorted(PGLOBAL g);
245 bool AddDistinctValue(PGLOBAL g);
246
247 // Default constructor not to be used
248 DOSCOL(void) {}
249
250 // Members
251 PVBLK Min; // Array of block min values
252 PVBLK Max; // Array of block max values
253 PVBLK Bmap; // Array of block bitmap values
254 PVBLK Dval; // Array of column distinct values
255 PVAL To_Val; // To value used for Update/Insert
256 PVAL OldVal; // The previous value of the object.
257 char *Buf; // Buffer used in read/write operations
258 char Dsp; // The decimal separator
259 bool Ldz; // True if field contains leading zeros
260 bool Nod; // True if no decimal point
261 int Dcm; // Last Dcm digits are decimals
262 int Deplac; // Offset in dos_buf
263 int Clustered; // 0:No 1:Yes
264 int Sorted; // 0:No 1:Asc (2:Desc - NIY)
265 int Ndv; // Number of distinct values
266 int Nbm; // Number of uint in bitmap
267 }; // end of class DOSCOL
268
269#endif // __TABDOS_H
270