summaryrefslogtreecommitdiffstats
path: root/storage/connect/filamvct.h
blob: 85982403270d323b32e2697c528b89ea47215d31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/************** FilAMVct H Declares Source Code File (.H) **************/
/*  Name: FILAMVCT.H    Version 1.5                                    */
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          2005-2012    */
/*                                                                     */
/*  This file contains the VCT file access method classes declares.    */
/***********************************************************************/
#ifndef __FILAMVCT__
#define __FILAMVCT__

#include "filamfix.h"

typedef class VCTFAM *PVCTFAM;
typedef class VCTCOL *PVCTCOL;
typedef class VCMFAM *PVCMFAM;
typedef class VECFAM *PVECFAM;
typedef class VMPFAM *PVMPFAM;
typedef class BGVFAM *PBGVFAM;

/***********************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for files     */
/*  in vector format. If MaxBlk=0, each block containing "Elements"    */
/*  records, values of each columns are consecutively stored (vector). */
/*  Otherwise, data is arranged by column in the file and MaxBlk is    */
/*  used to set the maximum number of blocks. This leave some white    */
/*  space allowing to insert new values up to this maximum size.       */
/***********************************************************************/
class DllExport VCTFAM : public FIXFAM {
  friend class TDBVCT;
  friend class VCTCOL;
 public:
  // Constructor
  VCTFAM(PVCTDEF tdp);
  VCTFAM(PVCTFAM txfp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_VCT;}
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) VCTFAM(this);}
  virtual int  GetFileLength(PGLOBAL g);

  // Methods
  virtual void Reset(void);
  virtual int  MaxBlkSize(PGLOBAL g, int s);
  virtual bool AllocateBuffer(PGLOBAL g);
  virtual bool InitInsert(PGLOBAL g);
  virtual void ResetBuffer(PGLOBAL g) {}
  virtual int  Cardinality(PGLOBAL g);
  virtual int  GetRowID(void);

  // Database routines
  virtual bool OpenTableFile(PGLOBAL g);
  virtual int  ReadBuffer(PGLOBAL g);
  virtual int  WriteBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);
  virtual void Rewind(void);

  // Specific functions
  virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
  virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);

 protected:
  virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
  virtual bool OpenTempFile(PGLOBAL g);
  virtual bool MoveLines(PGLOBAL g) {return false;}
  virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
  virtual bool CleanUnusedSpace(PGLOBAL g);
  virtual int  GetBlockInfo(PGLOBAL g);
  virtual bool SetBlockInfo(PGLOBAL g);
          bool ResetTableSize(PGLOBAL g, int block, int last);

  // Members
  char   *NewBlock;         // To block written on Insert
  char   *Colfn;            // Pattern for column file names (VEC)
  char   *Tempat;           // Pattern for temp file names (VEC)
  int    *Clens;            // Pointer to col size array
  int    *Deplac;           // Pointer to col start position array
  bool   *Isnum;            // Pointer to buffer type isnum result
  bool    AddBlock;         // True when adding new blocks on Insert
  bool    Split;            // true: split column file vector format
  int     Header;           // 0: no, 1: separate, 2: in data file
  int     MaxBlk;           // Max number of blocks (True vector format)
  int     Bsize;            // Because Nrec can be modified
  int     Ncol;             // The number of columns;
  }; // end of class VCTFAM

/***********************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for files     */
/*  in vector format accessed using file mapping.                      */
/***********************************************************************/
class DllExport VCMFAM : public VCTFAM {
  friend class TDBVCT;
  friend class VCTCOL;
 public:
  // Constructor
  VCMFAM(PVCTDEF tdp);
  VCMFAM(PVCMFAM txfp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_VMP;}
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) VCMFAM(this);}

  // Methods
  virtual bool AllocateBuffer(PGLOBAL g);
  virtual bool InitInsert(PGLOBAL g);

  // Database routines
  virtual bool OpenTableFile(PGLOBAL g);
  virtual int  WriteBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);

 protected:
  // Specific functions
  virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
  virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
  virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);

  // Members
  char*   Memory;               // Pointer on file mapping view.
  char*  *Memcol;               // Pointer on column start.
  }; // end of class VCMFAM

/***********************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for files     */
/*  in full vertical format. Each column is contained in a separate    */
/*  file whose name is the table name followed by the column number.   */
/***********************************************************************/
class DllExport VECFAM : public VCTFAM {
  friend class TDBVCT;
  friend class VCTCOL;
 public:
  // Constructor
  VECFAM(PVCTDEF tdp);
  VECFAM(PVECFAM txfp);

  // Implementation
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) VECFAM(this);}

  // Methods
  virtual bool AllocateBuffer(PGLOBAL g);
  virtual bool InitInsert(PGLOBAL g);
  virtual void ResetBuffer(PGLOBAL g);

  // Database routines
  virtual bool OpenTableFile(PGLOBAL g);
  virtual int  WriteBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);

  // Specific functions
  virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
  virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);

 protected:
  virtual bool OpenTempFile(PGLOBAL g);
  virtual bool MoveLines(PGLOBAL g);
  virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
  virtual int  RenameTempFile(PGLOBAL g);
          bool OpenColumnFile(PGLOBAL g, PCSZ opmode, int i);

  // Members
  FILE*   *Streams;             // Points to Dos file structure array
  FILE*   *T_Streams;           // Points to temp file structure array
  PFBLOCK *To_Fbs;              // Pointer to file block array
  PFBLOCK *T_Fbs;               // Pointer to temp file block array
  void*   *To_Bufs;             // Pointer to col val block array
  bool     InitUpdate;          // Used to initialize updating
  }; // end of class VECFAM

/***********************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for files     */
/*  in full vertical format accessed using file mapping.               */
/***********************************************************************/
class DllExport VMPFAM : public VCMFAM {
  friend class TDBVCT;
  friend class VCTCOL;
 public:
  // Constructor
  VMPFAM(PVCTDEF tdp);
  VMPFAM(PVMPFAM txfp);

  // Implementation
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) VMPFAM(this);}

  // Methods
  virtual bool AllocateBuffer(PGLOBAL g);

  // Database routines
  virtual bool OpenTableFile(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);

 protected:
          bool MapColumnFile(PGLOBAL g, MODE mode, int i);

  // Members
  PFBLOCK *To_Fbs;              // Pointer to file block array
  }; // end of class VMPFAM

/***********************************************************************/
/*  This is the DOS/UNIX Access Method class declaration for files     */
/*  in (possibly blocked) vector format that can be larger than 2GB.   */
/***********************************************************************/
class BGVFAM : public VCTFAM {
  friend class VCTCOL;
 public:
  // Constructors
  BGVFAM(PVCTDEF tdp);
  BGVFAM(PBGVFAM txfp);

  // Implementation
  virtual PTXF Duplicate(PGLOBAL g)
                {return (PTXF)new(g) BGVFAM(this);}

  // Methods
  virtual bool AllocateBuffer(PGLOBAL g);

  // Database routines
  virtual bool OpenTableFile(PGLOBAL g);
  virtual int  WriteBuffer(PGLOBAL g);
  virtual int  DeleteRecords(PGLOBAL g, int irc);
  virtual void CloseTableFile(PGLOBAL g, bool abort);
  virtual void Rewind(void);

  // Specific functions
  virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp);
  virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp);

 protected:
          bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b = false);
          bool BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req);
          bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req);
  virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn);
  virtual bool OpenTempFile(PGLOBAL g);
  virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL);
  virtual bool CleanUnusedSpace(PGLOBAL g);
  virtual bool SetBlockInfo(PGLOBAL g);
  virtual int  GetBlockInfo(PGLOBAL g);

  // Members
  HANDLE  Hfile;                // Handle to big file
  HANDLE  Tfile;                // Handle to temporary file
  BIGINT *BigDep;               // Pointer to col start position array
  }; // end of class BGVFAM

#endif // __FILAMVCT__