summaryrefslogtreecommitdiffstats
path: root/storage/connect/xtable.h
blob: 58acf550a0b4202cae9107e4408ea7ea64b41efb (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
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/**************** Table H Declares Source Code File (.H) ***************/
/*  Name: TABLE.H    Version 2.4                                       */
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          1999-2017    */
/*                                                                     */
/*  This file contains the TBX, OPJOIN and TDB class definitions.      */
/***********************************************************************/
#if !defined(TABLE_DEFINED)
#define      TABLE_DEFINED


/***********************************************************************/
/*  Include required application header files                          */
/*  block.h      is header containing Block    global declarations.    */
/***********************************************************************/
#include "assert.h"
#include "block.h"
#include "colblk.h"
//#include "m_ctype.h"
#include "reldef.h"

typedef class CMD *PCMD;
typedef struct st_key_range key_range;

// Commands executed by XDBC and MYX tables
class CMD : public BLOCK {
 public:
  // Constructor
  CMD(PGLOBAL g, char *cmd) {Cmd = PlugDup(g, cmd); Next = NULL;}

  // Members
  PCMD  Next;
  char *Cmd;
}; // end of class CMD

typedef class EXTCOL *PEXTCOL;
typedef class CONDFIL *PCFIL;
typedef class TDBCAT *PTDBCAT;
typedef class CATCOL *PCATCOL;

/***********************************************************************/
/*  Definition of class TDB with all its method functions.             */
/***********************************************************************/
class DllExport TDB: public BLOCK {     // Table Descriptor Block.
 public:
  // Constructors
  TDB(PTABDEF tdp = NULL);
  TDB(PTDB tdbp);

  // Implementation
  static  void    SetTnum(int n) {Tnum = n;}
	inline  PTABDEF GetDef(void) {return To_Def;}
	inline  PTDB    GetOrig(void) {return To_Orig;}
	inline  TUSE    GetUse(void) {return Use;}
	inline  PCFIL   GetCondFil(void) {return To_CondFil;}
	inline  LPCSTR  GetName(void) {return Name;}
	inline  PTABLE  GetTable(void) {return To_Table;}
	inline  PCOL    GetColumns(void) {return Columns;}
	inline  int     GetDegree(void) {return Degree;}
	inline  MODE    GetMode(void) {return Mode;}
	inline  PFIL    GetFilter(void) {return To_Filter;}
  inline  PCOL    GetSetCols(void) {return To_SetCols;}
  inline  void    SetSetCols(PCOL colp) {To_SetCols = colp;}
	inline  void    SetOrig(PTDB txp) {To_Orig = txp;}
	inline  void    SetUse(TUSE n) {Use = n;}
	inline  void    SetCondFil(PCFIL cfp) {To_CondFil = cfp;}
	inline  void    SetNext(PTDB tdbp) {Next = tdbp;}
	inline  void    SetName(LPCSTR name) {Name = name;}
	inline  void    SetTable(PTABLE tablep) {To_Table = tablep;}
	inline  void    SetColumns(PCOL colp) {Columns = colp;}
	inline  void    SetDegree(int degree) {Degree = degree;}
	inline  void    SetMode(MODE mode) {Mode = mode;}
	inline  const	Item *GetCond(void) {return Cond;}
	inline  void    SetCond(const Item *cond) {Cond = cond;}

  // Properties
  virtual AMT     GetAmType(void) {return TYPE_AM_ERROR;}
	virtual bool    IsRemote(void) {return false;}
  virtual bool    IsIndexed(void) {return false;}
	virtual void    SetFilter(PFIL fp) {To_Filter = fp;}
	virtual int     GetTdb_No(void) {return Tdb_No;}
  virtual PTDB    GetNext(void) {return Next;}
  virtual PCATLG  GetCat(void) {return NULL;}
  virtual void    SetAbort(bool) {;}
	virtual PKXBASE GetKindex(void) {return NULL;}

  // Methods
  virtual bool   IsSame(PTDB tp) {return tp == this;}
  virtual bool   IsSpecial(PSZ name);
	virtual bool   IsReadOnly(void) {return Read_Only;}
  virtual bool   IsView(void) {return FALSE;}
	virtual PCSZ   GetPath(void);
	virtual RECFM  GetFtype(void) {return RECFM_NAF;}
	virtual bool   GetBlockValues(PGLOBAL) { return false; }
  virtual int    Cardinality(PGLOBAL) {return 0;}
	virtual int    GetRecpos(void) = 0;
	virtual bool   SetRecpos(PGLOBAL g, int recpos);
	virtual int    GetMaxSize(PGLOBAL) = 0;
  virtual int    GetProgMax(PGLOBAL) = 0;
	virtual int    GetProgCur(void) {return GetRecpos();}
	virtual PCSZ   GetFile(PGLOBAL) {return "Not a file";}
	virtual void   SetFile(PGLOBAL, PCSZ) {}
	virtual void   ResetDB(void) {}
	virtual void   ResetSize(void) {MaxSize = -1;}
	virtual int    RowNumber(PGLOBAL g, bool b = false);
	virtual bool   CanBeFiltered(void) {return true;}
  virtual PTDB   Duplicate(PGLOBAL) {return NULL;}
  virtual PTDB   Clone(PTABS) {return this;}
  virtual PTDB   Copy(PTABS t);
  virtual void   PrintAM(FILE *f, char *m)
                  {fprintf(f, "%s AM(%d)\n",  m, GetAmType());}
  virtual void   Printf(PGLOBAL g, FILE *f, uint n);
  virtual void   Prints(PGLOBAL g, char *ps, uint z);
  virtual PCSZ   GetServer(void) = 0;
  virtual int    GetBadLines(void) {return 0;}
	virtual CHARSET_INFO *data_charset(void);

  // Database routines
  virtual PCOL   ColDB(PGLOBAL g, PSZ name, int num);
	virtual PCOL   MakeCol(PGLOBAL, PCOLDEF, PCOL, int)
	                      {assert(false); return NULL;}
	virtual PCOL   InsertSpecialColumn(PCOL colp);
	virtual PCOL   InsertSpcBlk(PGLOBAL g, PCOLDEF cdp);
	virtual void   MarkDB(PGLOBAL g, PTDB tdb2);
  virtual bool   OpenDB(PGLOBAL) = 0;
  virtual int    ReadDB(PGLOBAL) = 0;
  virtual int    WriteDB(PGLOBAL) = 0;
  virtual int    DeleteDB(PGLOBAL, int) = 0;
  virtual void   CloseDB(PGLOBAL) = 0;
  virtual int    CheckWrite(PGLOBAL) {return 0;}
  virtual bool   ReadKey(PGLOBAL, OPVAL, const key_range *) = 0;

 protected:
  // Members
  PTDB    To_Orig;      // Pointer to original if it is a copy
	PTABDEF To_Def;       // Points to catalog description block
	TUSE    Use;
	PFIL    To_Filter;
	PCFIL   To_CondFil;   // To condition filter structure
	const Item *Cond;			// The condition used to make filters
	static  int Tnum;     // Used to generate Tdb_no's
	const   int Tdb_No;   // GetTdb_No() is always 0 for OPJOIN
	PTDB    Next;         // Next in linearized queries
	PTABLE  To_Table;     // Points to the XTAB object
	LPCSTR  Name;         // Table name
	PCOL    Columns;      // Points to the first column of the table
	PCOL    To_SetCols;   // Points to updated columns
	MODE    Mode;         // 10 Read, 30 Update, 40 Insert, 50 Delete
	int     Degree;       // Number of columns
	int     Cardinal;     // Table number of rows
	int     MaxSize;      // Max size in number of lines
	bool    Read_Only;    // True for read only tables
	const CHARSET_INFO *m_data_charset;
	const char *csname;   // Table charset name
}; // end of class TDB

/***********************************************************************/
/*  This is the base class for all query tables (except decode).       */
/***********************************************************************/
class DllExport TDBASE : public TDB {
  friend class INDEXDEF;
  friend class XINDEX;
  friend class XINDXS;
 public:
  // Constructor
  TDBASE(PTABDEF tdp = NULL);
  TDBASE(PTDBASE tdbp);

  // Implementation
  inline  int     GetKnum(void) {return Knum;}
  inline  void    SetKey_Col(PCOL *cpp) {To_Key_Col = cpp;}
  inline  void    SetXdp(PIXDEF xdp) {To_Xdp = xdp;}
  inline  void    SetKindex(PKXBASE kxp) {To_Kindex = kxp;}

  // Properties
	PKXBASE GetKindex(void) {return To_Kindex;}
	PXOB   *GetLink(void) {return To_Link;}
	PIXDEF  GetXdp(void) {return To_Xdp;}
	void    ResetKindex(PGLOBAL g, PKXBASE kxp);
  PCOL    Key(int i) {return (To_Key_Col) ? To_Key_Col[i] : NULL;}
	PXOB    Link(int i) { return (To_Link) ? To_Link[i] : NULL; }

  // Methods
  virtual bool   IsUsingTemp(PGLOBAL) {return false;}
  virtual PCATLG GetCat(void);
  virtual void   PrintAM(FILE *f, char *m);
  virtual int    GetProgMax(PGLOBAL g) {return GetMaxSize(g);}
  virtual void   RestoreNrec(void) {}
  virtual int    ResetTableOpt(PGLOBAL g, bool dop, bool dox);
  virtual PCSZ   GetServer(void) {return "Current";}

  // Database routines
  virtual int  MakeIndex(PGLOBAL g, PIXDEF, bool)
                {strcpy(g->Message, "Remote index"); return RC_INFO;}
  virtual bool ReadKey(PGLOBAL, OPVAL, const key_range *)
                      {assert(false); return true;}

 protected:
  virtual bool PrepareWriting(PGLOBAL g) {strcpy(g->Message,
    "This function should not be called for this table"); return true;}

  // Members
  PXOB    *To_Link;           // Points to column of previous relations
  PCOL    *To_Key_Col;        // Points to key columns in current file
  PKXBASE  To_Kindex;         // Points to table key index
  PIXDEF   To_Xdp;            // To the index definition block
  RECFM    Ftype;             // File type: 0-var 1-fixed 2-binary (VCT)
  int      Knum;              // Size of key arrays
}; // end of class TDBASE

/***********************************************************************/
/*  The abstract base class declaration for the catalog tables.        */
/***********************************************************************/
class DllExport TDBCAT : public TDBASE {
  friend class CATCOL;
 public:
  // Constructor
  TDBCAT(PTABDEF tdp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_CAT;}

  // Methods
  virtual int  GetRecpos(void) {return N;}
  virtual int  GetProgCur(void) {return N;}
  virtual int  RowNumber(PGLOBAL, bool = false) {return N + 1;}
  virtual bool SetRecpos(PGLOBAL g, int recpos);

  // Database routines
  virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
	virtual int  Cardinality(PGLOBAL) {return 10;}	 // To avoid assert
	virtual int  GetMaxSize(PGLOBAL g);
  virtual bool OpenDB(PGLOBAL g);
  virtual int  ReadDB(PGLOBAL g);
  virtual int  WriteDB(PGLOBAL g);
  virtual int  DeleteDB(PGLOBAL g, int irc);
  virtual void CloseDB(PGLOBAL g);

 protected:
  // Specific routines
  virtual PQRYRES GetResult(PGLOBAL g) = 0;
          bool Initialize(PGLOBAL g);
          bool InitCol(PGLOBAL g);

  // Members
  PQRYRES Qrp;
  int     N;                  // Row number
  bool    Init;
  }; // end of class TDBCAT

/***********************************************************************/
/*  Class CATCOL: ODBC info column.                                    */
/***********************************************************************/
class DllExport CATCOL : public COLBLK {
  friend class TDBCAT;
 public:
  // Constructors
  CATCOL(PCOLDEF cdp, PTDB tdbp, int n);

  // Implementation
  virtual int  GetAmType(void) {return TYPE_AM_ODBC;}

  // Methods
	virtual void ReadColumn(PGLOBAL g);

 protected:
  CATCOL(void) = default;              // Default constructor not to be used

  // Members
  PTDBCAT Tdbp;                // Points to ODBC table block
  PCOLRES Crp;                // The column data array
  int     Flag;
  }; // end of class CATCOL

#endif  // TABLE_DEFINED