diff options
Diffstat (limited to 'storage/connect/tabjson.h')
-rw-r--r-- | storage/connect/tabjson.h | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h new file mode 100644 index 00000000000..68f79a1526a --- /dev/null +++ b/storage/connect/tabjson.h @@ -0,0 +1,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 |