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 |
18 | typedef class TXTFAM *PTXF; |
19 | typedef class BLOCKFILTER *PBF; |
20 | typedef class BLOCKINDEX *PBX; |
21 | |
22 | /***********************************************************************/ |
23 | /* DOS table. */ |
24 | /***********************************************************************/ |
25 | class 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 | /***********************************************************************/ |
112 | class 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 (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 | /***********************************************************************/ |
213 | class 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 | |