Commit dc8f914c authored by Olivier Bertrand's avatar Olivier Bertrand

Remove based enum not accepted by most gcc compilers

parent dae4bd0b
This diff is collapsed.
...@@ -16,20 +16,25 @@ ...@@ -16,20 +16,25 @@
#define X #define X
#endif #endif
#define ARGS MY_MIN(24,(int)len-i),s+MY_MAX(i-3,0)
#define MOF(X) MakeOff(Base, X)
#define MP(X) MakePtr(Base, X)
#define MPP(X) (PBPR)MakePtr(Base, X)
#define MVP(X) (PBVAL)MakePtr(Base, X)
#define MZP(X) (PSZ)MakePtr(Base, X)
#define LLN(X) *(longlong*)MakePtr(Base, X)
#define DBL(X) *(double*)MakePtr(Base, X)
class BDOC; class BDOC;
class BOUT; class BOUT;
//class JSON; class BJSON;
typedef class BDOC* PBDOC; typedef class BDOC* PBDOC;
//typedef class BJSON* PBSON; typedef class BJSON* PBJSON;
// BSON size should be equal on Linux and Windows
#define BMX 255
typedef uint OFFSET; typedef uint OFFSET;
/***********************************************************************/ /***********************************************************************/
/* Structure JVALUE. */ /* Structure BVAL. Binary representation of a JVALUE. */
/***********************************************************************/ /***********************************************************************/
typedef struct _jvalue { typedef struct _jvalue {
union { union {
...@@ -39,12 +44,12 @@ typedef struct _jvalue { ...@@ -39,12 +44,12 @@ typedef struct _jvalue {
bool B; // A boolean value True or false (0) bool B; // A boolean value True or false (0)
}; };
short Nd; // Number of decimals short Nd; // Number of decimals
JTYP Type; // The value type short Type; // The value type
OFFSET Next; // Offset to the next value in array OFFSET Next; // Offset to the next value in array
} BVAL, *PBVAL; // end of struct BVALUE } BVAL, *PBVAL; // end of struct BVALUE
/***********************************************************************/ /***********************************************************************/
/* Structure JPAIR. The pairs of a json Object. */ /* Structure BPAIR. The pairs of a json Object. */
/***********************************************************************/ /***********************************************************************/
typedef struct _jpair { typedef struct _jpair {
OFFSET Key; // Offset to this pair key name OFFSET Key; // Offset to this pair key name
...@@ -52,26 +57,6 @@ typedef struct _jpair { ...@@ -52,26 +57,6 @@ typedef struct _jpair {
OFFSET Next; // Offset to the next pair in object OFFSET Next; // Offset to the next pair in object
} BPAIR, *PBPR; // end of struct BPAIR } BPAIR, *PBPR; // end of struct BPAIR
#if 0
/***********************************************************************/
/* Structure used to return binary json to Json UDF functions. */
/* (should be moved to jsonudf.h). */
/***********************************************************************/
typedef struct _JsonBin {
char Msg[BMX + 1];
char *Filename;
PGLOBAL G;
int Pretty;
ulong Reslen;
my_bool Changed;
PBSON Top;
PBSON Jsp;
PBJN Bsp;
} BJSON, *PBJN ; // end of struct BJSON
PBJN JbinAlloc(PGLOBAL g, UDF_ARGS* args, ulong len, PJSON jsp);
#endif // 0
char* NextChr(PSZ s, char sep); char* NextChr(PSZ s, char sep);
char* GetJsonNull(void); char* GetJsonNull(void);
const char* GetFmt(int type, bool un); const char* GetFmt(int type, bool un);
...@@ -79,15 +64,84 @@ const char* GetFmt(int type, bool un); ...@@ -79,15 +64,84 @@ const char* GetFmt(int type, bool un);
DllExport bool IsNum(PSZ s); DllExport bool IsNum(PSZ s);
/***********************************************************************/ /***********************************************************************/
/* Class JDOC. The class for parsing and serializing json documents. */ /* Class BJSON. The class handling all BJSON operations. */
/***********************************************************************/ /***********************************************************************/
class BDOC : public BLOCK { class BJSON : public BLOCK {
public: public:
BDOC(void); // Constructor
BJSON(void* base, PBVAL vp = NULL) { Base = base; Bvp = vp; }
void *BsonSubAlloc(PGLOBAL g, size_t size); void* GetBase(void) { return Base; }
PBPR SubAllocPair(PGLOBAL g, OFFSET key);
// SubAlloc functions
void* BsonSubAlloc(PGLOBAL g, size_t size);
PBPR SubAllocPair(PGLOBAL g, OFFSET key, OFFSET val = 0);
PBVAL SubAllocVal(PGLOBAL g); PBVAL SubAllocVal(PGLOBAL g);
PBVAL SubAllocVal(PGLOBAL g, OFFSET toval, JTYP type = TYPE_UNKNOWN, short nd = 0);
PBVAL SubAllocVal(PGLOBAL g, PVAL valp);
PBVAL DupVal(PGLOBAL g, PBVAL bvp);
// Array functions
int GetArraySize(PBVAL bap, bool b = false);
PBVAL GetArrayValue(PBVAL bap, int i);
PSZ GetArrayText(PGLOBAL g, PBVAL bap, PSTRG text);
PBVAL MergeArray(PGLOBAL g, PBVAL bap1,PBVAL bap2);
PBVAL DeleteValue(PBVAL bap, int n);
PBVAL AddArrayValue(PGLOBAL g, PBVAL bap, PBVAL nvp = NULL, int* x = NULL);
PBVAL SetArrayValue(PGLOBAL g, PBVAL bap, PBVAL nvp, int n);
bool IsArrayNull(PBVAL bap);
// Object functions
int GetObjectSize(PBPR bop, bool b = false);
PSZ GetObjectText(PGLOBAL g, PBPR bop, PSTRG text);
PBPR MergeObject(PGLOBAL g, PBPR bop1, PBPR bop2);
PBPR AddPair(PGLOBAL g, PBPR bop, PSZ key, OFFSET val = 0);
PBVAL GetKeyValue(PBPR bop, PSZ key);
PBVAL GetKeyList(PGLOBAL g, PBPR bop);
PBVAL GetObjectValList(PGLOBAL g, PBPR bop);
PBPR SetKeyValue(PGLOBAL g, PBPR bop, OFFSET bvp, PSZ key);
PBPR DeleteKey(PBPR bop, PCSZ k);
bool IsObjectNull(PBPR bop);
// Value functions
int GetSize(PBVAL vlp, bool b = false);
PBPR GetObject(PBVAL vlp);
PBVAL GetArray(PBVAL vlp);
//PJSON GetJsp(void) { return (DataType == TYPE_JSON ? Jsp : NULL); }
PSZ GetValueText(PGLOBAL g, PBVAL vlp, PSTRG text);
//inline PJSON GetJson(void) { return (DataType == TYPE_JSON ? Jsp : this); }
PSZ GetString(PGLOBAL g, PBVAL vp, char* buff = NULL);
int GetInteger(PBVAL vp);
long long GetBigint(PBVAL vp);
double GetDouble(PBVAL vp);
PVAL GetValue(PGLOBAL g, PBVAL vp);
void SetValueObj(PBVAL vlp, PBPR bop);
void SetValueArr(PBVAL vlp, PBVAL bap);
void SetValueVal(PBVAL vlp, PBVAL vp);
void SetValue(PGLOBAL g, PBVAL vlp, PVAL valp);
void SetString(PBVAL vlp, PSZ s, int ci = 0);
void SetInteger(PBVAL vlp, int n);
void SetBigint(PGLOBAL g, PBVAL vlp, longlong ll);
void SetFloat(PBVAL vlp, double f);
void SetBool(PBVAL vlp, bool b);
bool IsValueNull(PBVAL vlp);
// Members
PBVAL Bvp;
void* Base;
protected:
// Default constructor not to be used
BJSON(void) {}
}; // end of class BJSON
/***********************************************************************/
/* Class JDOC. The class for parsing and serializing json documents. */
/***********************************************************************/
class BDOC : public BJSON {
public:
BDOC(void *);
PBVAL ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL); PBVAL ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL);
PSZ Serialize(PGLOBAL g, PBVAL bvp, char* fn, int pretty); PSZ Serialize(PGLOBAL g, PBVAL bvp, char* fn, int pretty);
...@@ -103,67 +157,16 @@ class BDOC : public BLOCK { ...@@ -103,67 +157,16 @@ class BDOC : public BLOCK {
bool SerializeValue(PBVAL vp); bool SerializeValue(PBVAL vp);
// Members used when parsing and serializing // Members used when parsing and serializing
private:
JOUT* jp; // Used with serialize JOUT* jp; // Used with serialize
void* base; // The base for making offsets or pointers
char* s; // The Json string to parse char* s; // The Json string to parse
int len; // The Json string length int len; // The Json string length
bool pty[3]; // Used to guess what pretty is bool pty[3]; // Used to guess what pretty is
// Default constructor not to be used
BDOC(void) {}
}; // end of class BDOC }; // end of class BDOC
#if 0 #if 0
/***********************************************************************/
/* Class BJSON. The class handling all BSON operations. */
/***********************************************************************/
class BJSON : public BLOCK {
public:
// Constructor
BJSON(PBVAL vp, void* base) { Vlp = vp; Base = base; }
// Array functions
int GetSize(bool b);
PBVAL GetArrayValue(int i);
PSZ GetText(PGLOBAL g, PSTRG text);
bool Merge(PGLOBAL g, PBVAL jsp);
bool DeleteValue(int n);
PBVAL AddArrayValue(PGLOBAL g, PBVAL jvp = NULL, int* x = NULL);
bool SetArrayValue(PGLOBAL g, PBVAL jvp, int i);
// Object functions
int GetObjectSize(PBPR prp, bool b);
PSZ GetObjectText(PGLOBAL g, PBPR prp, PSTRG text);
bool MergeObject(PGLOBAL g, PBPR prp);
PJPR AddPair(PGLOBAL g, PCSZ key);
PJVAL GetKeyValue(const char* key);
PJAR GetKeyList(PGLOBAL g);
PJAR GetValList(PGLOBAL g);
void SetKeyValue(PGLOBAL g, PBVAL jvp, PCSZ key);
void DeleteKey(PCSZ k);
// Value functions
PBPR GetObject(void);
PBVAL GetArray(void);
PJSON GetJsp(void) { return (DataType == TYPE_JSON ? Jsp : NULL); }
PSZ GetValueText(PGLOBAL g, PSTRG text);
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);
// Members
PBVAL Vlp;
void* Base;
}; // end of class BJSON
/***********************************************************************/ /***********************************************************************/
/* Class JOBJECT: contains a list of value pairs. */ /* Class JOBJECT: contains a list of value pairs. */
/***********************************************************************/ /***********************************************************************/
......
...@@ -15,10 +15,7 @@ ...@@ -15,10 +15,7 @@
#define X #define X
#endif #endif
// Required by some compilers enum JTYP {
enum JTYP : short;
enum JTYP : short {
TYPE_NULL = TYPE_VOID, TYPE_NULL = TYPE_VOID,
TYPE_STRG = TYPE_STRING, TYPE_STRG = TYPE_STRING,
TYPE_DBL = TYPE_DOUBLE, TYPE_DBL = TYPE_DOUBLE,
...@@ -48,9 +45,6 @@ typedef class JVALUE *PJVAL; ...@@ -48,9 +45,6 @@ typedef class JVALUE *PJVAL;
typedef class JOBJECT *PJOB; typedef class JOBJECT *PJOB;
typedef class JARRAY *PJAR; typedef class JARRAY *PJAR;
// BSON size should be equal on Linux and Windows
#define BMX 255
typedef struct BSON *PBSON;
typedef struct JPAIR *PJPR; typedef struct JPAIR *PJPR;
//typedef struct VAL *PVL; //typedef struct VAL *PVL;
...@@ -63,39 +57,6 @@ struct JPAIR { ...@@ -63,39 +57,6 @@ struct JPAIR {
PJPR Next; // To the next pair PJPR Next; // To the next pair
}; // end of struct JPAIR }; // end of struct JPAIR
#if 0
/***********************************************************************/
/* Structure VAL (string, int, float, bool or null) */
/***********************************************************************/
struct VAL {
union {
char *Strp; // Ptr to a string
int N; // An integer value
long long LLn; // A big integer value
double F; // A float value
bool B; // True or false
};
int Nd; // Decimal number
JTYP Type; // The value type
}; // end of struct VAL
#endif // 0
/***********************************************************************/
/* Structure used to return binary json to Json UDF functions. */
/***********************************************************************/
struct BSON {
char Msg[BMX + 1];
char *Filename;
PGLOBAL G;
int Pretty;
ulong Reslen;
my_bool Changed;
PJSON Top;
PJSON Jsp;
PBSON Bsp;
}; // end of struct BSON
PBSON JbinAlloc(PGLOBAL g, UDF_ARGS* args, ulong len, PJSON jsp);
//PVL AllocVal(PGLOBAL g, JTYP type); //PVL AllocVal(PGLOBAL g, JTYP type);
char *NextChr(PSZ s, char sep); char *NextChr(PSZ s, char sep);
char *GetJsonNull(void); char *GetJsonNull(void);
......
This diff is collapsed.
/******************** tabjson H Declares Source Code File (.H) *******************/ /******************** tabjson H Declares Source Code File (.H) *******************/
/* Name: jsonudf.h Version 1.3 */ /* Name: jsonudf.h Version 1.4 */
/* */ /* */
/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */ /* (C) Copyright to the author Olivier BERTRAND 2015-2020 */
/* */ /* */
/* This file contains the JSON UDF function and class declares. */ /* This file contains the JSON UDF function and class declares. */
/*********************************************************************************/ /*********************************************************************************/
...@@ -15,6 +15,27 @@ ...@@ -15,6 +15,27 @@
#define UDF_EXEC_ARGS \ #define UDF_EXEC_ARGS \
UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*
// BSON size should be equal on Linux and Windows
#define BMX 255
typedef struct BSON* PBSON;
/***********************************************************************/
/* Structure used to return binary json to Json UDF functions. */
/***********************************************************************/
struct BSON {
char Msg[BMX + 1];
char *Filename;
PGLOBAL G;
int Pretty;
ulong Reslen;
my_bool Changed;
PJSON Top;
PJSON Jsp;
PBSON Bsp;
}; // end of struct BSON
PBSON JbinAlloc(PGLOBAL g, UDF_ARGS* args, ulong len, PJSON jsp);
/*********************************************************************************/ /*********************************************************************************/
/* The JSON tree node. Can be an Object or an Array. */ /* The JSON tree node. Can be an Object or an Array. */
/*********************************************************************************/ /*********************************************************************************/
...@@ -29,8 +50,6 @@ typedef struct _jnode { ...@@ -29,8 +50,6 @@ typedef struct _jnode {
} JNODE, *PJNODE; } JNODE, *PJNODE;
typedef class JSNX *PJSNX; typedef class JSNX *PJSNX;
typedef class JOUTPATH *PJTP;
typedef class JOUTALL *PJTA;
extern "C" { extern "C" {
DllExport my_bool jsonvalue_init(UDF_INIT*, UDF_ARGS*, char*); DllExport my_bool jsonvalue_init(UDF_INIT*, UDF_ARGS*, char*);
...@@ -368,3 +387,90 @@ class JUP : public BLOCK { ...@@ -368,3 +387,90 @@ class JUP : public BLOCK {
int k, recl; int k, recl;
}; // end of class JUP }; // end of class JUP
/* --------------------------- New Testing BJSON Stuff --------------------------*/
typedef class BJNX* PBJNX;
/*********************************************************************************/
/* Class BJNX: BJSON access methods. */
/*********************************************************************************/
class BJNX : public BDOC {
public:
// Constructors
BJNX(PGLOBAL g, PBVAL row, int type, int len = 64, int prec = 0, my_bool wr = false);
// Implementation
int GetPrecision(void) { return Prec; }
PVAL GetValue(void) { return Value; }
// Methods
my_bool SetJpath(PGLOBAL g, char* path, my_bool jb = false);
my_bool ParseJpath(PGLOBAL g);
void ReadValue(PGLOBAL g);
PBVAL GetRowValue(PGLOBAL g, PBVAL row, int i, my_bool b = true);
PBVAL GetJson(PGLOBAL g);
my_bool CheckPath(PGLOBAL g);
my_bool WriteValue(PGLOBAL g, PBVAL jvalp);
char* Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k = 1);
char* LocateAll(PGLOBAL g, PBVAL jsp, PBVAL jvp, int mx = 10);
protected:
my_bool SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm);
PVAL GetColumnValue(PGLOBAL g, PBVAL row, int i);
PVAL ExpandArray(PGLOBAL g, PBVAL arp, int n);
PVAL CalculateArray(PGLOBAL g, PBVAL arp, int n);
PVAL MakeJson(PGLOBAL g, PBVAL bvp);
void SetJsonValue(PGLOBAL g, PVAL vp, PBVAL vlp);
PBVAL GetRow(PGLOBAL g);
my_bool CompareValues(PGLOBAL g, PBVAL v1, PBVAL v2);
my_bool LocateArray(PGLOBAL g, PBVAL jarp);
my_bool LocateObject(PGLOBAL g, PBPR jobp);
my_bool LocateValue(PGLOBAL g, PBVAL jvp);
my_bool LocateArrayAll(PGLOBAL g, PBVAL jarp);
my_bool LocateObjectAll(PGLOBAL g, PBPR jobp);
my_bool LocateValueAll(PGLOBAL g, PBVAL jvp);
my_bool CompareTree(PGLOBAL g, PBVAL jp1, PBVAL jp2);
my_bool AddPath(void);
// Default constructor not to be used
BJNX(void) {}
// Members
PBVAL Row;
PBVAL Bvalp;
PJPN Jpnp;
JOUTSTR* Jp;
JNODE* Nodes; // The intermediate objects
PVAL Value;
PVAL MulVal; // To value used by multiple column
char* Jpath; // The json path
int Buf_Type;
int Long;
int Prec;
int Nod; // The number of intermediate objects
int Xnod; // Index of multiple values
int K; // Kth item to locate
int I; // Index of JPN
int Imax; // Max number of JPN's
int B; // Index base
my_bool Xpd; // True for expandable column
my_bool Parsed; // True when parsed
my_bool Found; // Item found by locate
my_bool Wr; // Write mode
my_bool Jb; // Must return json item
}; // end of class BJNX
extern "C" {
DllExport my_bool json_test_bson_init(UDF_INIT*, UDF_ARGS*, char*);
DllExport char* json_test_bson(UDF_EXEC_ARGS);
DllExport void json_test_bson_deinit(UDF_INIT*);
DllExport my_bool jsonlocate_bson_init(UDF_INIT*, UDF_ARGS*, char*);
DllExport char* jsonlocate_bson(UDF_EXEC_ARGS);
DllExport void jsonlocate_bson_deinit(UDF_INIT*);
DllExport my_bool json_locate_all_bson_init(UDF_INIT*, UDF_ARGS*, char*);
DllExport char* json_locate_all_bson(UDF_EXEC_ARGS);
DllExport void json_locate_all_bson_deinit(UDF_INIT*);
} // extern "C"
...@@ -1596,6 +1596,7 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp) ...@@ -1596,6 +1596,7 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp)
if (Value->IsTypeNum()) { if (Value->IsTypeNum()) {
strcpy(g->Message, "Cannot make Json for a numeric column"); strcpy(g->Message, "Cannot make Json for a numeric column");
Value->Reset(); Value->Reset();
#if 0
} else if (Value->GetType() == TYPE_BIN) { } else if (Value->GetType() == TYPE_BIN) {
if ((unsigned)Value->GetClen() >= sizeof(BSON)) { if ((unsigned)Value->GetClen() >= sizeof(BSON)) {
ulong len = Tjp->Lrecl ? Tjp->Lrecl : 500; ulong len = Tjp->Lrecl ? Tjp->Lrecl : 500;
...@@ -1607,6 +1608,7 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp) ...@@ -1607,6 +1608,7 @@ PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp)
strcpy(g->Message, "Column size too small"); strcpy(g->Message, "Column size too small");
Value->SetValue_char(NULL, 0); Value->SetValue_char(NULL, 0);
} // endif Clen } // endif Clen
#endif 0
} else } else
Value->SetValue_psz(Serialize(g, jsp, NULL, 0)); Value->SetValue_psz(Serialize(g, jsp, NULL, 0));
......
...@@ -197,7 +197,7 @@ const char *GetFormatType(int type) ...@@ -197,7 +197,7 @@ const char *GetFormatType(int type)
case TYPE_DOUBLE: c = "F"; break; case TYPE_DOUBLE: c = "F"; break;
case TYPE_DATE: c = "D"; break; case TYPE_DATE: c = "D"; break;
case TYPE_TINY: c = "T"; break; case TYPE_TINY: c = "T"; break;
case TYPE_DECIM: c = "M"; break; case TYPE_DECIM: c = "F"; break;
case TYPE_BIN: c = "B"; break; case TYPE_BIN: c = "B"; break;
case TYPE_PCHAR: c = "P"; break; case TYPE_PCHAR: c = "P"; break;
} // endswitch type } // endswitch type
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment