summaryrefslogtreecommitdiff
path: root/storage/connect/tabpivot.h
blob: 11af4d69bc6bc10c8818f4dff8189eef736c0bb9 (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
/************** TabPivot H Declares Source Code File (.H) **************/
/*  Name: TABPIVOT.H    Version 1.3                                    */
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          2005-2012    */
/*                                                                     */
/*  This file contains the PIVOT classes declares.                     */
/***********************************************************************/
typedef class TDBPIVOT *PTDBPIVOT;
typedef class FNCCOL   *PFNCCOL;
typedef class SRCCOL   *PSRCCOL;
typedef class TDBQRS   *PTDBQRS;
typedef class QRSCOL   *PQRSCOL;

/* -------------------------- PIVOT classes -------------------------- */

/***********************************************************************/
/*  PIVOT: table that provides a view of a source table where the      */
/*  pivot column is expended in as many columns as there are distinct  */
/*  values in it and containing the function value matching other cols.*/
/***********************************************************************/

/***********************************************************************/
/*  PIVOT table.                                                       */
/***********************************************************************/
//ass DllExport PIVOTDEF : public TABDEF {/* Logical table description */
class PIVOTDEF : public TABDEF {          /* Logical table description */
	friend class TDBPIVOT;
 public:
  // Constructor
	PIVOTDEF(void) {Pseudo = 3;
									Tabname = Tabsrc = Picol = Fncol = Function = NULL;}

  // Implementation
  virtual const char *GetType(void) {return "PIVOT";}

  // Methods
  virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
  virtual PTDB GetTable(PGLOBAL g, MODE m);

 protected:
  // Members
  char  *Host;               /* Host machine to use										 */
  char  *User;               /* User logon info												 */
  char  *Pwd;                /* Password logon info										 */
  char  *DB;                 /* Database to be used by server					 */
	char  *Tabname;					   /* Name of source table									 */
	char	*Tabsrc;					   /* The source table SQL description       */
	char	*Picol;							 /* The pivot column                       */
  char	*Fncol;           	 /* The function column                    */
  char	*Function;        	 /* The function applying to group by      */
	bool   GBdone;						 /* True if tabname as group by format     */
	int    Port;							 /* MySQL port number											 */
  }; // end of PIVOTDEF

/***********************************************************************/
/*  This is the class declaration for the PIVOT table.                 */
/***********************************************************************/
//ass DllExport TDBPIVOT : public TDBASE, public CSORT {
class TDBPIVOT : public TDBASE, public CSORT {
  friend class FNCCOL;
	friend class SRCCOL;
 public:
  // Constructor
  TDBPIVOT(PPIVOTDEF tdp);
//TDBPIVOT(PTDBPIVOT tdbp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_PIVOT;}
//virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBPIVOT(this);}
//				void SetTdbp(PTDB tdbp) {Tdbp = tdbp;}

  // Methods
//virtual PTDB CopyOne(PTABS t);
	virtual int  GetRecpos(void) {return N;}
	virtual void ResetDB(void) {N = 0;}
	virtual int  RowNumber(PGLOBAL g, bool b = FALSE);

  // Database routines
	virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
  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);

	// The sorting function
  virtual int  Qcompare(int *, int *);

 protected:
	PQRYRES GetSourceTable(PGLOBAL g);
	int			MakePivotColumns(PGLOBAL g);
	bool		UpdateTableFields(PGLOBAL g, int n);

  // Members
  MYSQLC  Myc;                      // MySQL connection class
	PTDBQRS Tqrp;						  				// To the source table result
  char   *Host;                     // Host machine to use
  char   *User;                     // User logon info
  char   *Pwd;                      // Password logon info
  char   *Database;                 // Database to be used by server
	PQRYRES Qryp;                     // Points to Query result block
	char   *Tabname;				  				// Name of source table
	char   *Tabsrc;					  				// SQL of source table
	char   *Picol;                    // Pivot column	name
	char   *Fncol;  				  				// Function column name
  char	 *Function;                 // The function applying to group by
	PQRSCOL Fcolp;					  				// To the function column in source
	PQRSCOL Xcolp;					  				// To the pivot column in source
	PCOLRES Xresp;					  				// To the pivot result column
//PCOLRES To_Sort;				  				// Saved Qryp To_Sort pointer
	PVBLK   Rblkp;					  				// The value block of the pivot column
	bool    GBdone;										// True when subtable is "Group by"
	int     Mult;						  				// Multiplication factor
	int     Ncol;                     // The number of generated columns
	int     N;							  				// The current table index
	int		  M;               	        // The occurence rank
	int     Port;											// MySQL port number 
	BYTE    FileStatus;				        // 0: First 1: Rows 2: End-of-File
	BYTE    RowFlag;				  				// 0: Ok, 1: Same, 2: Skip
  }; // end of class TDBPIVOT

/***********************************************************************/
/*  Class FNCCOL: for the multiple generated column.                   */
/***********************************************************************/
class FNCCOL : public COLBLK {
	friend class TDBPIVOT;
 public:
  // Constructor
  FNCCOL(PCOL colp, PTDBPIVOT tdbp);

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

	// Methods
  virtual void Reset(void) {}
					bool InitColumn(PGLOBAL g, PVAL valp);

 protected:
	// Member
	PVAL Hval;			// The original value used to generate the header
  }; // end of class FNCCOL

/***********************************************************************/
/*  Class SRCCOL: for other source columns.                            */
/***********************************************************************/
class SRCCOL : public COLBLK {
	friend class TDBPIVOT;
 public:
  // Constructors
//SRCCOL(PCOLDEF cdp, PTDBPIVOT tdbp, int n);
	SRCCOL(PCOL cp, PTDBPIVOT tdbp, int n);
//SRCCOL(SRCCOL *colp, PTDB tdbp); // Constructor used in copy process

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

  // Methods
  virtual void Reset(void) {}
					void SetColumn(void);
	        bool Init(PGLOBAL g, PTDBPIVOT tdbp);
					bool CompareColumn(void);

 protected:
  // Default constructor not to be used
  SRCCOL(void) {}

  // Members
	PQRSCOL Colp;
	PVAL    Cnval;
  }; // end of class SRCCOL

/***********************************************************************/
/*  TDBQRS: This is the Access Method class declaration for the Query  */
/*  Result stored in memory in the current work area (volatil).        */
/***********************************************************************/
class DllExport TDBQRS : public TDBASE {
  friend class QRSCOL;
 public:
  // Constructor
	TDBQRS(PQRYRES qrp) : TDBASE() {Qrp = qrp; CurPos = 0;}
  TDBQRS(PTDBQRS tdbp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_QRS;}
  virtual PTDB Duplicate(PGLOBAL g)
    {return (PTDB)new(g) TDBQRS(this);}
					PQRYRES GetQrp(void) {return Qrp;}

  // Methods
  virtual PTDB   CopyOne(PTABS t);
  virtual int    RowNumber(PGLOBAL g, BOOL b = FALSE);
  virtual int    GetRecpos(void);
//virtual PCATLG GetCat(void);
//virtual PSZ    GetPath(void);
	virtual int    GetBadLines(void) {return Qrp->BadLines;}

  // Database routines
  virtual PCOL ColDB(PGLOBAL g, PSZ name, int num);
  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);

 private:
  TDBQRS(void) : TDBASE() {}   // Standard constructor not to be used

 protected:
  // Members
  PQRYRES Qrp;                 // Points to Query Result block
  int     CurPos;              // Current line position
  }; // end of class TDBQRS

/***********************************************************************/
/*  Class QRSCOL: QRS access method column descriptor.                 */
/***********************************************************************/
class DllExport QRSCOL : public COLBLK {
  friend class TDBQRS;
 public:
  // Constructors
  QRSCOL(PGLOBAL g, PCOLRES crp, PTDB tdbp, PCOL cprec, int i);
  QRSCOL(QRSCOL *colp, PTDB tdbp);  // Constructor used in copy process

  // Implementation
  virtual int     GetAmType(void) {return TYPE_AM_QRS;}
					PCOLRES GetCrp(void) {return Crp;}
          void   *GetQrsData(void) {return Crp->Kdata;}

  // Methods
  virtual void    ReadColumn(PGLOBAL g);
  virtual void    Print(PGLOBAL g, FILE *, UINT);

 protected:
  QRSCOL(void) {}    // Default constructor not to be used

  // Members
  PCOLRES Crp;
  }; // end of class QRSCOL