summaryrefslogtreecommitdiff
path: root/storage/connect/tabjson.h
blob: 68f79a1526ae15681e831571b7a6752435f3c4c7 (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
/*************** tabjson H Declares Source Code File (.H) **************/
/*  Name: tabjson.h   Version 1.0                                      */
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          2014 - 2015  */
/*                                                                     */
/*  This file contains the JSON classes declares.                      */
/***********************************************************************/
#include "osutil.h"
#include "block.h"
#include "colblk.h"
#include "json.h"

enum JMODE {MODE_OBJECT, MODE_ARRAY, MODE_VALUE};

typedef class JSONDEF *PJDEF;
typedef class TDBJSON *PJTDB;
typedef class JSONCOL *PJCOL;

class TDBJSN;

/***********************************************************************/
/*  The JSON tree node. Can be an Object or an Array.           	  	 */
/***********************************************************************/
typedef struct _jnode {
  PSZ   Key;                    // The key used for object
  OPVAL Op;                     // Operator used for this node
  PVAL  CncVal;                 // To cont value used for OP_CNC
  int   Rank;                   // The rank in array
} JNODE, *PJNODE;

/***********************************************************************/
/*  JSON table.                                                        */
/***********************************************************************/
class JSONDEF : public DOSDEF {                   /* Table description */
  friend class TDBJSON;
  friend class TDBJSN;
 public:
  // Constructor
  JSONDEF(void);

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

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

 protected:
  // Members
  JMODE Jmode;                  /* MODE_OBJECT by default              */
  char *Objname;                /* Name of first level object          */
  char *Xcol;                   /* Name of expandable column           */
  int   Limit;                  /* Limit of multiple values            */
  int   Pretty;                 /* Depends on file structure           */
  bool  Strict;                 /* Strict syntax checking              */
  }; // end of JSONDEF

/* -------------------------- TDBJSN class --------------------------- */

/***********************************************************************/
/*  This is the JSN Access Method class declaration.                   */
/*  The table is a DOS file, each record being a JSON object.          */
/***********************************************************************/
class TDBJSN : public TDBDOS {
  friend class JSONCOL;
 public:
  // Constructor
   TDBJSN(PJDEF tdp, PTXF txfp);
   TDBJSN(TDBJSN *tdbp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_JSN;}
  virtual bool SkipHeader(PGLOBAL g);
  virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);}

  // Methods
  virtual PTDB CopyOne(PTABS t);
  virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
  virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp);
  virtual int  RowNumber(PGLOBAL g, BOOL b = FALSE)
                {return (b) ? N : Fpos + 1;}

  // Database routines
  virtual int  Cardinality(PGLOBAL g);
  virtual int  GetMaxSize(PGLOBAL g);
  virtual bool OpenDB(PGLOBAL g);
  virtual bool PrepareWriting(PGLOBAL g);
  virtual int  ReadDB(PGLOBAL g);

 protected:
  // Members
  PJSON Row;                       // The current row
  PJCOL Colp;                      // The multiple column
  JMODE Jmode;                     // MODE_OBJECT by default
  char *Xcol;                      // Name of expandable column
  int   Fpos;                      // The current row index
  int   Spos;                      // DELETE start index
  int   N;                         // The current Rownum
	int   Limit;		    				     // Limit of multiple values
  int   Pretty;                    // Depends on file structure
  bool  Strict;                    // Strict syntax checking
  bool  NextSame;                  // Same next row
  bool  Comma;                     // Row has final comma
  int   SameRow;                   // Same row nb
  int   Xval;                      // Index of expandable array
  }; // end of class TDBJSN

/* -------------------------- JSONCOL class -------------------------- */

/***********************************************************************/
/*  Class JSONCOL: JSON access method column descriptor.               */
/***********************************************************************/
class JSONCOL : public DOSCOL {
  friend class TDBJSN;
  friend class TDBJSON;
 public:
  // Constructors
  JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i);
  JSONCOL(JSONCOL *colp, PTDB tdbp); // Constructor used in copy process

  // Implementation
  virtual int  GetAmType(void) {return Tjp->GetAmType();}

  // Methods
  virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check);
          bool ParseJpath(PGLOBAL g);
  virtual void ReadColumn(PGLOBAL g);
  virtual void WriteColumn(PGLOBAL g);

 protected:
  bool    CheckExpand(PGLOBAL g, int i, PSZ nm, bool b);
  bool    SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm);
  PJSON   GetRow(PGLOBAL g, int mode);
  void    SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n);

  // Default constructor not to be used
  JSONCOL(void) {}

  // Members
  TDBJSN *Tjp;                  // To the JSN table block
  PVAL    MulVal;               // To value used by multiple column
  PJAR    Arp;                  // The intermediate array
  char   *Jpath;                // The json path
  JNODE  *Nodes  ;              // The intermediate objects
  int     Nod;                  // The number of intermediate objects
  int     Ival;                 // Index of multiple values
  int     Nx;                   // The last read sub-row
  bool    Xpd;                  // True for expandable column
  bool    Parsed;               // True when parsed
  }; // end of class JSONCOL

/* -------------------------- TDBJSON class -------------------------- */

/***********************************************************************/
/*  This is the JSON Access Method class declaration.                  */
/***********************************************************************/
class TDBJSON : public TDBJSN {
  friend class JSONCOL;
 public:
  // Constructor
   TDBJSON(PJDEF tdp, PTXF txfp);
   TDBJSON(PJTDB tdbp);

  // Implementation
  virtual AMT  GetAmType(void) {return TYPE_AM_JSON;}
  virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSON(this);}

  // Methods
  virtual PTDB CopyOne(PTABS t);

  // Database routines
  virtual int  Cardinality(PGLOBAL g);
  virtual int  GetMaxSize(PGLOBAL g);
  virtual void ResetSize(void);
	virtual int  GetRecpos(void) {return Fpos;}
  virtual bool OpenDB(PGLOBAL g);
  virtual int  ReadDB(PGLOBAL g);
  virtual bool PrepareWriting(PGLOBAL g) {return false;}
  virtual int  WriteDB(PGLOBAL g);
  virtual int  DeleteDB(PGLOBAL g, int irc);
  virtual void CloseDB(PGLOBAL g);

  // Optimization routines
  virtual int  MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add);

 protected:
          int  MakeNewDoc(PGLOBAL g);
          int  MakeDocument(PGLOBAL g);

  // Members
  PJSON Top;                       // The file JSON tree
  PJAR  Doc;                       // The document array
  char *Objname;                   // The table object name
  int   Multiple;                  // 0: No 1: DIR 2: Section 3: filelist
  bool  Done;                      // True when document parsing is done
  bool  Changed;                   // After Update, Insert or Delete
  }; // end of class TDBJSON