1 /************** FilAMVct H Declares Source Code File (.H) **************/
2 /*  Name: FILAMVCT.H    Version 1.5                                    */
3 /*                                                                     */
4 /*  (C) Copyright to the author Olivier BERTRAND          2005-2012    */
5 /*                                                                     */
6 /*  This file contains the VCT file access method classes declares.    */
7 /***********************************************************************/
8 #ifndef __FILAMVCT__
9 #define __FILAMVCT__
10 
11 #include "filamfix.h"
12 
13 typedef class VCTFAM *PVCTFAM;
14 typedef class VCTCOL *PVCTCOL;
15 typedef class VCMFAM *PVCMFAM;
16 typedef class VECFAM *PVECFAM;
17 typedef class VMPFAM *PVMPFAM;
18 typedef class BGVFAM *PBGVFAM;
19 
20 /***********************************************************************/
21 /*  This is the DOS/UNIX Access Method class declaration for files     */
22 /*  in vector format. If MaxBlk=0, each block containing "Elements"    */
23 /*  records, values of each columns are consecutively stored (vector). */
24 /*  Otherwise, data is arranged by column in the file and MaxBlk is    */
25 /*  used to set the maximum number of blocks. This leave some white    */
26 /*  space allowing to insert new values up to this maximum size.       */
27 /***********************************************************************/
28 class DllExport VCTFAM : public FIXFAM {
29   friend class TDBVCT;
30   friend class VCTCOL;
31  public:
32   // Constructor
33   VCTFAM(PVCTDEF tdp);
34   VCTFAM(PVCTFAM txfp);
35 
36   // Implementation
GetAmType(void)37   virtual AMT  GetAmType(void) {return TYPE_AM_VCT;}
Duplicate(PGLOBAL g)38   virtual PTXF Duplicate(PGLOBAL g)
39                 {return (PTXF)new(g) VCTFAM(this);}
40   virtual int  GetFileLength(PGLOBAL g);
41 
42   // Methods
43   virtual void Reset(void);
44   virtual int  MaxBlkSize(PGLOBAL g, int s);
45   virtual bool AllocateBuffer(PGLOBAL g);
46   virtual bool InitInsert(PGLOBAL g);
ResetBuffer(PGLOBAL g)47   virtual void ResetBuffer(PGLOBAL g) {}
48   virtual int  Cardinality(PGLOBAL g);
49   virtual int  GetRowID(void);
50 
51   // Database routines
52   virtual bool OpenTableFile(PGLOBAL g);
53   virtual int  ReadBuffer(PGLOBAL g);
54   virtual int  WriteBuffer(PGLOBAL g);
55   virtual int  DeleteRecords(PGLOBAL g, int irc);
56   virtual void CloseTableFile(PGLOBAL g, bool abort);
57   virtual void Rewind(void);
58 
59   // Specific functions
60   virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
61   virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);
62 
63  protected:
64   virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
65   virtual bool OpenTempFile(PGLOBAL g);
MoveLines(PGLOBAL g)66   virtual bool MoveLines(PGLOBAL g) {return false;}
67   virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
68   virtual bool CleanUnusedSpace(PGLOBAL g);
69   virtual int  GetBlockInfo(PGLOBAL g);
70   virtual bool SetBlockInfo(PGLOBAL g);
71           bool ResetTableSize(PGLOBAL g, int block, int last);
72 
73   // Members
74   char   *NewBlock;         // To block written on Insert
75   char   *Colfn;            // Pattern for column file names (VEC)
76   char   *Tempat;           // Pattern for temp file names (VEC)
77   int    *Clens;            // Pointer to col size array
78   int    *Deplac;           // Pointer to col start position array
79   bool   *Isnum;            // Pointer to buffer type isnum result
80   bool    AddBlock;         // True when adding new blocks on Insert
81   bool    Split;            // true: split column file vector format
82   int     Header;           // 0: no, 1: separate, 2: in data file
83   int     MaxBlk;           // Max number of blocks (True vector format)
84   int     Bsize;            // Because Nrec can be modified
85   int     Ncol;             // The number of columns;
86   }; // end of class VCTFAM
87 
88 /***********************************************************************/
89 /*  This is the DOS/UNIX Access Method class declaration for files     */
90 /*  in vector format accessed using file mapping.                      */
91 /***********************************************************************/
92 class DllExport VCMFAM : public VCTFAM {
93   friend class TDBVCT;
94   friend class VCTCOL;
95  public:
96   // Constructor
97   VCMFAM(PVCTDEF tdp);
98   VCMFAM(PVCMFAM txfp);
99 
100   // Implementation
GetAmType(void)101   virtual AMT  GetAmType(void) {return TYPE_AM_VMP;}
Duplicate(PGLOBAL g)102   virtual PTXF Duplicate(PGLOBAL g)
103                 {return (PTXF)new(g) VCMFAM(this);}
104 
105   // Methods
106   virtual bool AllocateBuffer(PGLOBAL g);
107   virtual bool InitInsert(PGLOBAL g);
108 
109   // Database routines
110   virtual bool OpenTableFile(PGLOBAL g);
111   virtual int  WriteBuffer(PGLOBAL g);
112   virtual int  DeleteRecords(PGLOBAL g, int irc);
113   virtual void CloseTableFile(PGLOBAL g, bool abort);
114 
115  protected:
116   // Specific functions
117   virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
118   virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
119   virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);
120 
121   // Members
122   char*   Memory;               // Pointer on file mapping view.
123   char*  *Memcol;               // Pointer on column start.
124   }; // end of class VCMFAM
125 
126 /***********************************************************************/
127 /*  This is the DOS/UNIX Access Method class declaration for files     */
128 /*  in full vertical format. Each column is contained in a separate    */
129 /*  file whose name is the table name followed by the column number.   */
130 /***********************************************************************/
131 class DllExport VECFAM : public VCTFAM {
132   friend class TDBVCT;
133   friend class VCTCOL;
134  public:
135   // Constructor
136   VECFAM(PVCTDEF tdp);
137   VECFAM(PVECFAM txfp);
138 
139   // Implementation
Duplicate(PGLOBAL g)140   virtual PTXF Duplicate(PGLOBAL g)
141                 {return (PTXF)new(g) VECFAM(this);}
142 
143   // Methods
144   virtual bool AllocateBuffer(PGLOBAL g);
145   virtual bool InitInsert(PGLOBAL g);
146   virtual void ResetBuffer(PGLOBAL g);
147 
148   // Database routines
149   virtual bool OpenTableFile(PGLOBAL g);
150   virtual int  WriteBuffer(PGLOBAL g);
151   virtual int  DeleteRecords(PGLOBAL g, int irc);
152   virtual void CloseTableFile(PGLOBAL g, bool abort);
153 
154   // Specific functions
155   virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
156   virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);
157 
158  protected:
159   virtual bool OpenTempFile(PGLOBAL g);
160   virtual bool MoveLines(PGLOBAL g);
161   virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
162   virtual int  RenameTempFile(PGLOBAL g);
163           bool OpenColumnFile(PGLOBAL g, PCSZ opmode, int i);
164 
165   // Members
166   FILE*   *Streams;             // Points to Dos file structure array
167   FILE*   *T_Streams;           // Points to temp file structure array
168   PFBLOCK *To_Fbs;              // Pointer to file block array
169   PFBLOCK *T_Fbs;               // Pointer to temp file block array
170   void*   *To_Bufs;             // Pointer to col val block array
171   bool     InitUpdate;          // Used to initialize updating
172   }; // end of class VECFAM
173 
174 /***********************************************************************/
175 /*  This is the DOS/UNIX Access Method class declaration for files     */
176 /*  in full vertical format accessed using file mapping.               */
177 /***********************************************************************/
178 class DllExport VMPFAM : public VCMFAM {
179   friend class TDBVCT;
180   friend class VCTCOL;
181  public:
182   // Constructor
183   VMPFAM(PVCTDEF tdp);
184   VMPFAM(PVMPFAM txfp);
185 
186   // Implementation
Duplicate(PGLOBAL g)187   virtual PTXF Duplicate(PGLOBAL g)
188                 {return (PTXF)new(g) VMPFAM(this);}
189 
190   // Methods
191   virtual bool AllocateBuffer(PGLOBAL g);
192 
193   // Database routines
194   virtual bool OpenTableFile(PGLOBAL g);
195   virtual int  DeleteRecords(PGLOBAL g, int irc);
196   virtual void CloseTableFile(PGLOBAL g, bool abort);
197 
198  protected:
199           bool MapColumnFile(PGLOBAL g, MODE mode, int i);
200 
201   // Members
202   PFBLOCK *To_Fbs;              // Pointer to file block array
203   }; // end of class VMPFAM
204 
205 /***********************************************************************/
206 /*  This is the DOS/UNIX Access Method class declaration for files     */
207 /*  in (possibly blocked) vector format that can be larger than 2GB.   */
208 /***********************************************************************/
209 class BGVFAM : public VCTFAM {
210   friend class VCTCOL;
211  public:
212   // Constructors
213   BGVFAM(PVCTDEF tdp);
214   BGVFAM(PBGVFAM txfp);
215 
216   // Implementation
Duplicate(PGLOBAL g)217   virtual PTXF Duplicate(PGLOBAL g)
218                 {return (PTXF)new(g) BGVFAM(this);}
219 
220   // Methods
221   virtual bool AllocateBuffer(PGLOBAL g);
222 
223   // Database routines
224   virtual bool OpenTableFile(PGLOBAL g);
225   virtual int  WriteBuffer(PGLOBAL g);
226   virtual int  DeleteRecords(PGLOBAL g, int irc);
227   virtual void CloseTableFile(PGLOBAL g, bool abort);
228   virtual void Rewind(void);
229 
230   // Specific functions
231   virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
232   virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);
233 
234  protected:
235           bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b = false);
236           bool BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req);
237           bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req);
238   virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
239   virtual bool OpenTempFile(PGLOBAL g);
240   virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
241   virtual bool CleanUnusedSpace(PGLOBAL g);
242   virtual bool SetBlockInfo(PGLOBAL g);
243   virtual int  GetBlockInfo(PGLOBAL g);
244 
245   // Members
246   HANDLE  Hfile;                // Handle to big file
247   HANDLE  Tfile;                // Handle to temporary file
248   BIGINT *BigDep;               // Pointer to col start position array
249   }; // end of class BGVFAM
250 
251 #endif // __FILAMVCT__
252 
253