1// TABXCL.H Olivier Bertrand 2013
2// Defines the XCOL tables
3
4#include "tabutil.h"
5
6typedef class XCLDEF *PXCLDEF;
7typedef class TDBXCL *PTDBXCL;
8typedef class XCLCOL *PXCLCOL;
9
10/* -------------------------- XCOL classes --------------------------- */
11
12/***********************************************************************/
13/* XCOL: table having one column containing several values comma */
14/* (or any other character) separated. When creating the table, the */
15/* name of the X column is given by the NAME option. */
16/* This sample has a limitation: */
17/* - The X column has the same length than in the physical file. */
18/* This tables produces as many rows for a physical row than the */
19/* number of items in the X column (eventually 0). */
20/***********************************************************************/
21
22/***********************************************************************/
23/* XCL table. */
24/***********************************************************************/
25class XCLDEF : public PRXDEF { /* Logical table description */
26 friend class TDBXCL;
27 public:
28 // Constructor
29 XCLDEF(void);
30
31 // Implementation
32 virtual const char *GetType(void) {return "XCL";}
33
34 // Methods
35 virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
36 virtual PTDB GetTable(PGLOBAL g, MODE mode);
37
38 protected:
39 // Members
40 char *Xcol; /* The column containing separated fields */
41 char Sep; /* The field separator, defaults to comma */
42 int Mult; /* Multiplication factor */
43 }; // end of XCLDEF
44
45/***********************************************************************/
46/* This is the class declaration for the XCOL table. */
47/***********************************************************************/
48class TDBXCL : public TDBPRX {
49 friend class XCLDEF;
50 friend class PRXCOL;
51 friend class XCLCOL;
52 public:
53 // Constructor
54 TDBXCL(PXCLDEF tdp);
55
56 // Implementation
57 virtual AMT GetAmType(void) {return TYPE_AM_XCOL;}
58
59 // Methods
60 virtual void ResetDB(void) {N = 0; Tdbp->ResetDB();}
61 virtual int RowNumber(PGLOBAL g, bool b = FALSE);
62
63 // Database routines
64 virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
65 virtual int GetMaxSize(PGLOBAL g);
66 virtual bool OpenDB(PGLOBAL g);
67 virtual int ReadDB(PGLOBAL g);
68
69 protected:
70 // Members
71 char *Xcolumn; // Multiple column name
72 PXCLCOL Xcolp; // To the XCVCOL column
73 int Mult; // Multiplication factor
74 int N; // The current table index
75 int M; // The occurence rank
76 BYTE RowFlag; // 0: Ok, 1: Same, 2: Skip
77 bool New; // TRUE for new line
78 char Sep; // The Xcol separator
79 }; // end of class TDBXCL
80
81/***********************************************************************/
82/* Class XCLCOL: for the multiple CSV column. */
83/***********************************************************************/
84class XCLCOL : public PRXCOL {
85 friend class TDBXCL;
86 public:
87 // Constructors
88 XCLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i);
89
90 // Methods
91 using PRXCOL::Init;
92 virtual void Reset(void) {} // Evaluated only by TDBXCL
93 virtual void ReadColumn(PGLOBAL g);
94 virtual bool Init(PGLOBAL g, PTDB tp = NULL);
95
96 protected:
97 // Default constructor not to be used
98 XCLCOL(void) {}
99
100 // Members
101 char *Cbuf; // The column buffer
102 char *Cp; // Pointer to current position
103 char Sep; // The separator
104 }; // end of class XCLCOL
105