mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
0f18135ec8
modified: storage/connect/bsonudf.cpp modified: storage/connect/jsonudf.cpp - Stringify option is now a ; separated list of columns modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/mongo.h modified: storage/connect/tabbson.cpp modified: storage/connect/tabcmg.cpp modified: storage/connect/tabcmg.h modified: storage/connect/tabjmg.cpp modified: storage/connect/tabjmg.h modified: storage/connect/tabjson.cpp - PrepareColist not a static function anymore (+ typo) modified: storage/connect/taboccur.cpp - JDVC: Recognize schema (database) from a wrapper server modified: storage/connect/tabjdbc.cpp
364 lines
11 KiB
C++
364 lines
11 KiB
C++
/**************** json H Declares Source Code File (.H) ****************/
|
|
/* Name: json.h Version 1.2 */
|
|
/* */
|
|
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2020 */
|
|
/* */
|
|
/* This file contains the JSON classes declares. */
|
|
/***********************************************************************/
|
|
#pragma once
|
|
#include <mysql_com.h>
|
|
#include "value.h"
|
|
#include "xobject.h"
|
|
|
|
#if defined(_DEBUG)
|
|
#define X assert(false);
|
|
#else
|
|
#define X
|
|
#endif
|
|
|
|
enum JTYP {
|
|
TYPE_NULL = TYPE_VOID,
|
|
TYPE_STRG = TYPE_STRING,
|
|
TYPE_DBL = TYPE_DOUBLE,
|
|
TYPE_BOOL = TYPE_TINY,
|
|
TYPE_BINT = TYPE_BIGINT,
|
|
TYPE_INTG = TYPE_INT,
|
|
TYPE_DTM = TYPE_DATE,
|
|
TYPE_FLOAT,
|
|
TYPE_JAR,
|
|
TYPE_JOB,
|
|
TYPE_JVAL,
|
|
TYPE_JSON,
|
|
TYPE_DEL,
|
|
TYPE_UNKNOWN
|
|
};
|
|
|
|
class JDOC;
|
|
class JOUT;
|
|
class JSON;
|
|
class JVALUE;
|
|
class JOBJECT;
|
|
class JARRAY;
|
|
|
|
typedef class JDOC *PJDOC;
|
|
typedef class JSON *PJSON;
|
|
typedef class JVALUE *PJVAL;
|
|
typedef class JOBJECT *PJOB;
|
|
typedef class JARRAY *PJAR;
|
|
|
|
typedef struct JPAIR *PJPR;
|
|
//typedef struct VAL *PVL;
|
|
|
|
/***********************************************************************/
|
|
/* Structure JPAIR. The pairs of a json Object. */
|
|
/***********************************************************************/
|
|
struct JPAIR {
|
|
PCSZ Key; // This pair key name
|
|
PJVAL Val; // To the value of the pair
|
|
PJPR Next; // To the next pair
|
|
}; // end of struct JPAIR
|
|
|
|
//PVL AllocVal(PGLOBAL g, JTYP type);
|
|
char *NextChr(PSZ s, char sep);
|
|
char *GetJsonNull(void);
|
|
const char* GetFmt(int type, bool un);
|
|
|
|
PJSON ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL);
|
|
PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty);
|
|
DllExport bool IsNum(PSZ s);
|
|
bool IsArray(PSZ s);
|
|
bool Stringified(PCSZ strfy, char *colname);
|
|
|
|
/***********************************************************************/
|
|
/* Class JDOC. The class for parsing and serializing json documents. */
|
|
/***********************************************************************/
|
|
class JDOC: public BLOCK {
|
|
friend PJSON ParseJson(PGLOBAL, char*, size_t, int*, bool*);
|
|
friend PSZ Serialize(PGLOBAL, PJSON, char*, int);
|
|
public:
|
|
JDOC(void) : js(NULL), s(NULL), len(0), dfp(0), pty(NULL) {}
|
|
|
|
void SetJp(JOUT* jp) { js = jp; }
|
|
|
|
protected:
|
|
PJAR ParseArray(PGLOBAL g, int& i);
|
|
PJOB ParseObject(PGLOBAL g, int& i);
|
|
PJVAL ParseValue(PGLOBAL g, int& i);
|
|
char *ParseString(PGLOBAL g, int& i);
|
|
void ParseNumeric(PGLOBAL g, int& i, PJVAL jvp);
|
|
PJAR ParseAsArray(PGLOBAL g, int& i, int pretty, int *ptyp);
|
|
bool SerializeArray(PJAR jarp, bool b);
|
|
bool SerializeObject(PJOB jobp);
|
|
bool SerializeValue(PJVAL jvp);
|
|
|
|
// Members used when parsing and serializing
|
|
private:
|
|
JOUT* js;
|
|
char *s;
|
|
int len, dfp;
|
|
bool *pty;
|
|
}; // end of class JDOC
|
|
|
|
/***********************************************************************/
|
|
/* Class JSON. The base class for all other json classes. */
|
|
/***********************************************************************/
|
|
class JSON : public BLOCK {
|
|
public:
|
|
// Constructor
|
|
JSON(void) { Type = TYPE_JSON; }
|
|
JSON(int) {}
|
|
|
|
// Implementation
|
|
inline JTYP GetType(void) { return Type; }
|
|
|
|
// Methods
|
|
virtual int size(void) { return 1; }
|
|
virtual void Clear(void) { X }
|
|
virtual PJOB GetObject(void) { return NULL; }
|
|
virtual PJAR GetArray(void) { return NULL; }
|
|
virtual PJVAL GetArrayValue(int i) { X return NULL; }
|
|
virtual int GetSize(bool b) { X return 0; }
|
|
virtual PJSON GetJsp(void) { X return NULL; }
|
|
virtual PJPR GetFirst(void) { X return NULL; }
|
|
virtual PSZ GetText(PGLOBAL g, PSTRG text) { X return NULL; }
|
|
virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; }
|
|
virtual void SetValue(PJSON jsp) { X }
|
|
virtual bool DeleteValue(int i) { X return true; }
|
|
virtual bool IsNull(void) { X return true; }
|
|
|
|
// Members
|
|
JTYP Type;
|
|
}; // end of class JSON
|
|
|
|
/***********************************************************************/
|
|
/* Class JOBJECT: contains a list of value pairs. */
|
|
/***********************************************************************/
|
|
class JOBJECT : public JSON {
|
|
friend class JDOC;
|
|
friend class JSNX;
|
|
friend class SWAP;
|
|
public:
|
|
JOBJECT(void) : JSON() { Type = TYPE_JOB; First = Last = NULL; }
|
|
JOBJECT(int i) : JSON(i) {}
|
|
|
|
// Methods
|
|
virtual void Clear(void) {First = Last = NULL;}
|
|
//virtual JTYP GetValType(void) {return TYPE_JOB;}
|
|
virtual PJPR GetFirst(void) {return First;}
|
|
virtual int GetSize(bool b);
|
|
virtual PJOB GetObject(void) {return this;}
|
|
virtual PSZ GetText(PGLOBAL g, PSTRG text);
|
|
virtual bool Merge(PGLOBAL g, PJSON jsp);
|
|
virtual bool IsNull(void);
|
|
|
|
// Specific
|
|
PJPR AddPair(PGLOBAL g, PCSZ key);
|
|
PJVAL GetKeyValue(const char* key);
|
|
PJAR GetKeyList(PGLOBAL g);
|
|
PJAR GetValList(PGLOBAL g);
|
|
void SetKeyValue(PGLOBAL g, PJVAL jvp, PCSZ key);
|
|
void DeleteKey(PCSZ k);
|
|
|
|
protected:
|
|
PJPR First;
|
|
PJPR Last;
|
|
}; // end of class JOBJECT
|
|
|
|
/***********************************************************************/
|
|
/* Class JARRAY. */
|
|
/***********************************************************************/
|
|
class JARRAY : public JSON {
|
|
friend class SWAP;
|
|
public:
|
|
JARRAY(void);
|
|
JARRAY(int i) : JSON(i) {}
|
|
|
|
// Methods
|
|
virtual void Clear(void) {First = Last = NULL; Size = 0;}
|
|
virtual int size(void) { return Size; }
|
|
virtual PJAR GetArray(void) {return this;}
|
|
virtual int GetSize(bool b);
|
|
virtual PJVAL GetArrayValue(int i);
|
|
virtual PSZ GetText(PGLOBAL g, PSTRG text);
|
|
virtual bool Merge(PGLOBAL g, PJSON jsp);
|
|
virtual bool DeleteValue(int n);
|
|
virtual bool IsNull(void);
|
|
|
|
// Specific
|
|
PJVAL AddArrayValue(PGLOBAL g, PJVAL jvp = NULL, int* x = NULL);
|
|
void SetArrayValue(PGLOBAL g, PJVAL jvp, int i);
|
|
void InitArray(PGLOBAL g);
|
|
|
|
protected:
|
|
// Members
|
|
int Size; // The number of items in the array
|
|
int Alloc; // The Mvals allocated size
|
|
PJVAL First; // Used when constructing
|
|
PJVAL Last; // Last constructed value
|
|
PJVAL *Mvals; // Allocated when finished
|
|
}; // end of class JARRAY
|
|
|
|
/***********************************************************************/
|
|
/* Class JVALUE. */
|
|
/***********************************************************************/
|
|
class JVALUE : public JSON {
|
|
friend class JARRAY;
|
|
friend class JSNX;
|
|
friend class JSONDISC;
|
|
friend class JSONCOL;
|
|
friend class JSON;
|
|
friend class JDOC;
|
|
friend class SWAP;
|
|
public:
|
|
JVALUE(void) : JSON() { Type = TYPE_JVAL; Clear(); }
|
|
JVALUE(PJSON jsp);
|
|
//JVALUE(PGLOBAL g, PVL vlp);
|
|
JVALUE(PGLOBAL g, PVAL valp);
|
|
JVALUE(PGLOBAL g, PCSZ strp);
|
|
JVALUE(int i) : JSON(i) {}
|
|
|
|
//using JSON::GetVal;
|
|
//using JSON::SetVal;
|
|
|
|
// Methods
|
|
virtual void Clear(void);
|
|
//virtual JTYP GetType(void) {return TYPE_JVAL;}
|
|
virtual JTYP GetValType(void);
|
|
virtual PJOB GetObject(void);
|
|
virtual PJAR GetArray(void);
|
|
virtual PJSON GetJsp(void) {return (DataType == TYPE_JSON ? Jsp : NULL);}
|
|
virtual PSZ GetText(PGLOBAL g, PSTRG text);
|
|
virtual bool IsNull(void);
|
|
|
|
// Specific
|
|
//inline PVL GetVal(void) { return Val; }
|
|
//inline void SetVal(PVL vlp) { Val = vlp; }
|
|
inline PJSON GetJson(void) { return (DataType == TYPE_JSON ? Jsp : this); }
|
|
PSZ GetString(PGLOBAL g, char* buff = NULL);
|
|
int GetInteger(void);
|
|
long long GetBigint(void);
|
|
double GetFloat(void);
|
|
PVAL GetValue(PGLOBAL g);
|
|
void SetValue(PJSON jsp);
|
|
void SetValue(PGLOBAL g, PVAL valp);
|
|
void SetString(PGLOBAL g, PSZ s, int ci = 0);
|
|
void SetInteger(PGLOBAL g, int n);
|
|
void SetBigint(PGLOBAL g, longlong ll);
|
|
void SetFloat(PGLOBAL g, double f);
|
|
void SetBool(PGLOBAL g, bool b);
|
|
|
|
protected:
|
|
union {
|
|
PJSON Jsp; // To the json value
|
|
char *Strp; // Ptr to a string
|
|
int N; // An integer value
|
|
long long LLn; // A big integer value
|
|
double F; // A (double) float value
|
|
bool B; // True or false
|
|
};
|
|
//PVL Val; // To the string or numeric value
|
|
PJVAL Next; // Next value in array
|
|
JTYP DataType; // The data value type
|
|
int Nd; // Decimal number
|
|
bool Del; // True when deleted
|
|
}; // end of class JVALUE
|
|
|
|
|
|
/***********************************************************************/
|
|
/* Class JOUT. Used by Serialize. */
|
|
/***********************************************************************/
|
|
class JOUT : public BLOCK {
|
|
public:
|
|
JOUT(PGLOBAL gp) : BLOCK() { g = gp; Pretty = 3; }
|
|
|
|
virtual bool WriteStr(const char* s) = 0;
|
|
virtual bool WriteChr(const char c) = 0;
|
|
virtual bool Escape(const char* s) = 0;
|
|
int Prty(void) { return Pretty; }
|
|
|
|
// Member
|
|
PGLOBAL g;
|
|
int Pretty;
|
|
}; // end of class JOUT
|
|
|
|
/***********************************************************************/
|
|
/* Class JOUTSTR. Used to Serialize to a string. */
|
|
/***********************************************************************/
|
|
class JOUTSTR : public JOUT {
|
|
public:
|
|
JOUTSTR(PGLOBAL g);
|
|
|
|
virtual bool WriteStr(const char* s);
|
|
virtual bool WriteChr(const char c);
|
|
virtual bool Escape(const char* s);
|
|
|
|
// Member
|
|
char* Strp; // The serialized string
|
|
size_t N; // Position of next char
|
|
size_t Max; // String max size
|
|
}; // end of class JOUTSTR
|
|
|
|
/***********************************************************************/
|
|
/* Class JOUTFILE. Used to Serialize to a file. */
|
|
/***********************************************************************/
|
|
class JOUTFILE : public JOUT {
|
|
public:
|
|
JOUTFILE(PGLOBAL g, FILE* str, int pty) : JOUT(g) { Stream = str; Pretty = pty; }
|
|
|
|
virtual bool WriteStr(const char* s);
|
|
virtual bool WriteChr(const char c);
|
|
virtual bool Escape(const char* s);
|
|
|
|
// Member
|
|
FILE* Stream;
|
|
}; // end of class JOUTFILE
|
|
|
|
/***********************************************************************/
|
|
/* Class JOUTPRT. Used to Serialize to a pretty file. */
|
|
/***********************************************************************/
|
|
class JOUTPRT : public JOUTFILE {
|
|
public:
|
|
JOUTPRT(PGLOBAL g, FILE* str) : JOUTFILE(g, str, 2) { M = 0; B = false; }
|
|
|
|
virtual bool WriteStr(const char* s);
|
|
virtual bool WriteChr(const char c);
|
|
|
|
// Member
|
|
int M;
|
|
bool B;
|
|
}; // end of class JOUTPRT
|
|
|
|
|
|
/***********************************************************************/
|
|
/* Class SWAP. Used to make or unmake a JSON tree movable. */
|
|
/* This is done by making all pointers to offsets. */
|
|
/***********************************************************************/
|
|
class SWAP : public BLOCK {
|
|
public:
|
|
// Constructor
|
|
SWAP(PGLOBAL g, PJSON jsp)
|
|
{
|
|
G = g, Base = (char*)jsp - 8;
|
|
}
|
|
|
|
// Methods
|
|
void SwapJson(PJSON jsp, bool move);
|
|
|
|
protected:
|
|
size_t MoffJson(PJSON jnp);
|
|
size_t MoffArray(PJAR jarp);
|
|
size_t MoffObject(PJOB jobp);
|
|
size_t MoffJValue(PJVAL jvp);
|
|
size_t MoffPair(PJPR jpp);
|
|
//size_t MoffVal(PVL vlp);
|
|
PJSON MptrJson(PJSON jnp);
|
|
PJAR MptrArray(PJAR jarp);
|
|
PJOB MptrObject(PJOB jobp);
|
|
PJVAL MptrJValue(PJVAL jvp);
|
|
PJPR MptrPair(PJPR jpp);
|
|
//PVL MptrVal(PVL vlp);
|
|
|
|
// Member
|
|
PGLOBAL G;
|
|
void *Base;
|
|
}; // end of class SWAP
|