1 /******************** tabjson H Declares Source Code File (.H) *******************/ 2 /* Name: bsonudf.h Version 1.0 */ 3 /* */ 4 /* (C) Copyright to the author Olivier BERTRAND 2020 - 2021 */ 5 /* */ 6 /* This file contains the BSON UDF function and class declares. */ 7 /*********************************************************************************/ 8 #pragma once 9 #include "jsonudf.h" 10 #include "bson.h" 11 12 #if 0 13 #define UDF_EXEC_ARGS \ 14 UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* 15 16 // BSON size should be equal on Linux and Windows 17 #define BMX 255 18 typedef struct BSON* PBSON; 19 20 /***********************************************************************/ 21 /* Structure used to return binary json to Json UDF functions. */ 22 /***********************************************************************/ 23 struct BSON { 24 char Msg[BMX + 1]; 25 char *Filename; 26 PGLOBAL G; 27 int Pretty; 28 ulong Reslen; 29 my_bool Changed; 30 PJSON Top; 31 PJSON Jsp; 32 PBSON Bsp; 33 }; // end of struct BSON 34 35 PBSON JbinAlloc(PGLOBAL g, UDF_ARGS* args, ulong len, PJSON jsp); 36 37 /*********************************************************************************/ 38 /* The JSON tree node. Can be an Object or an Array. */ 39 /*********************************************************************************/ 40 typedef struct _jnode { 41 PSZ Key; // The key used for object 42 OPVAL Op; // Operator used for this node 43 PVAL CncVal; // To cont value used for OP_CNC 44 int Rank; // The rank in array 45 int Rx; // Read row number 46 int Nx; // Next to read row number 47 } JNODE, *PJNODE; 48 49 /*********************************************************************************/ 50 /* The JSON utility functions. */ 51 /*********************************************************************************/ 52 bool IsNum(PSZ s); 53 char *NextChr(PSZ s, char sep); 54 char *GetJsonNull(void); 55 uint GetJsonGrpSize(void); 56 my_bool JsonSubSet(PGLOBAL g, my_bool b = false); 57 my_bool CalcLen(UDF_ARGS* args, my_bool obj, unsigned long& reslen, 58 unsigned long& memlen, my_bool mod = false); 59 my_bool JsonInit(UDF_INIT* initid, UDF_ARGS* args, char* message, my_bool mbn, 60 unsigned long reslen, unsigned long memlen, 61 unsigned long more = 0); 62 my_bool CheckMemory(PGLOBAL g, UDF_INIT* initid, UDF_ARGS* args, uint n, 63 my_bool m, my_bool obj = false, my_bool mod = false); 64 PSZ MakePSZ(PGLOBAL g, UDF_ARGS* args, int i); 65 int IsArgJson(UDF_ARGS* args, uint i); 66 char *GetJsonFile(PGLOBAL g, char* fn); 67 68 /*********************************************************************************/ 69 /* Structure JPN. Used to make the locate path. */ 70 /*********************************************************************************/ 71 typedef struct _jpn { 72 int Type; 73 PCSZ Key; 74 int N; 75 } JPN, *PJPN; 76 77 #endif // 0 78 79 /* --------------------------- New Testing BJSON Stuff --------------------------*/ 80 extern uint JsonGrpSize; 81 uint GetJsonGroupSize(void); 82 83 84 typedef class BJNX* PBJNX; 85 86 /*********************************************************************************/ 87 /* Class BJNX: BJSON access methods. */ 88 /*********************************************************************************/ 89 class BJNX : public BDOC { 90 public: 91 // Constructors 92 BJNX(PGLOBAL g); 93 BJNX(PGLOBAL g, PBVAL row, int type, int len = 64, int prec = 0, my_bool wr = false); 94 95 // Implementation GetPrecision(void)96 int GetPrecision(void) { return Prec; } GetValue(void)97 PVAL GetValue(void) { return Value; } SetRow(PBVAL vp)98 void SetRow(PBVAL vp) { Row = vp; } SetChanged(my_bool b)99 void SetChanged(my_bool b) { Changed = b; } 100 101 // Methods 102 my_bool SetJpath(PGLOBAL g, char* path, my_bool jb = false); 103 my_bool ParseJpath(PGLOBAL g); 104 void ReadValue(PGLOBAL g); 105 PBVAL GetRowValue(PGLOBAL g, PBVAL row, int i); 106 PBVAL GetJson(PGLOBAL g); 107 my_bool CheckPath(PGLOBAL g); 108 my_bool CheckPath(PGLOBAL g, UDF_ARGS* args, PBVAL jsp, PBVAL& jvp, int n); 109 my_bool WriteValue(PGLOBAL g, PBVAL jvalp); 110 my_bool DeleteItem(PGLOBAL g, PBVAL vlp); 111 char *Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k = 1); 112 char *LocateAll(PGLOBAL g, PBVAL jsp, PBVAL jvp, int mx = 10); 113 PSZ MakeKey(UDF_ARGS* args, int i); 114 PBVAL MakeValue(UDF_ARGS* args, uint i, bool b = false, PBVAL* top = NULL); 115 PBVAL MakeTypedValue(PGLOBAL g, UDF_ARGS* args, uint i, 116 JTYP type, PBVAL* top = NULL); 117 PBVAL ParseJsonFile(PGLOBAL g, char* fn, int& pty, size_t& len); 118 char *MakeResult(UDF_ARGS* args, PBVAL top, uint n = 2); 119 PBSON MakeBinResult(UDF_ARGS* args, PBVAL top, ulong len, int n = 2); 120 121 protected: 122 my_bool SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm); 123 PVAL GetColumnValue(PGLOBAL g, PBVAL row, int i); 124 PVAL ExpandArray(PGLOBAL g, PBVAL arp, int n); 125 PVAL CalculateArray(PGLOBAL g, PBVAL arp, int n); 126 PVAL GetCalcValue(PGLOBAL g, PBVAL bap, int n); 127 PBVAL MakeJson(PGLOBAL g, PBVAL bvp, int n); 128 void SetJsonValue(PGLOBAL g, PVAL vp, PBVAL vlp); 129 PBVAL GetRow(PGLOBAL g); 130 PBVAL MoveVal(PBVAL vlp); 131 PBVAL MoveJson(PBJNX bxp, PBVAL jvp); 132 PBVAL MoveArray(PBJNX bxp, PBVAL jvp); 133 PBVAL MoveObject(PBJNX bxp, PBVAL jvp); 134 PBVAL MoveValue(PBJNX bxp, PBVAL jvp); 135 my_bool CompareValues(PGLOBAL g, PBVAL v1, PBVAL v2); 136 my_bool LocateArray(PGLOBAL g, PBVAL jarp); 137 my_bool LocateObject(PGLOBAL g, PBVAL jobp); 138 my_bool LocateValue(PGLOBAL g, PBVAL jvp); 139 my_bool LocateArrayAll(PGLOBAL g, PBVAL jarp); 140 my_bool LocateObjectAll(PGLOBAL g, PBVAL jobp); 141 my_bool LocateValueAll(PGLOBAL g, PBVAL jvp); 142 my_bool CompareTree(PGLOBAL g, PBVAL jp1, PBVAL jp2); 143 my_bool AddPath(void); 144 145 // Default constructor not to be used BJNX(void)146 BJNX(void) {} 147 148 // Members 149 PBVAL Row; 150 PBVAL Bvalp; 151 PJPN Jpnp; 152 JOUTSTR *Jp; 153 JNODE *Nodes; // The intermediate objects 154 PVAL Value; 155 //PVAL MulVal; // To value used by multiple column 156 char *Jpath; // The json path 157 int Buf_Type; 158 int Long; 159 int Prec; 160 int Nod; // The number of intermediate objects 161 int Xnod; // Index of multiple values 162 int K; // Kth item to locate 163 int I; // Index of JPN 164 int Imax; // Max number of JPN's 165 int B; // Index base 166 my_bool Xpd; // True for expandable column 167 my_bool Parsed; // True when parsed 168 my_bool Found; // Item found by locate 169 my_bool Wr; // Write mode 170 my_bool Jb; // Must return json item 171 my_bool Changed; // True when contains was modified 172 }; // end of class BJNX 173 174 extern "C" { 175 DllExport my_bool bson_test_init(UDF_INIT*, UDF_ARGS*, char*); 176 DllExport char* bson_test(UDF_EXEC_ARGS); 177 DllExport void bson_test_deinit(UDF_INIT*); 178 179 DllExport my_bool bsonvalue_init(UDF_INIT*, UDF_ARGS*, char*); 180 DllExport char* bsonvalue(UDF_EXEC_ARGS); 181 DllExport void bsonvalue_deinit(UDF_INIT*); 182 183 DllExport my_bool bson_make_array_init(UDF_INIT*, UDF_ARGS*, char*); 184 DllExport char* bson_make_array(UDF_EXEC_ARGS); 185 DllExport void bson_make_array_deinit(UDF_INIT*); 186 187 DllExport my_bool bson_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*); 188 DllExport char* bson_array_add_values(UDF_EXEC_ARGS); 189 DllExport void bson_array_add_values_deinit(UDF_INIT*); 190 191 DllExport my_bool bson_array_add_init(UDF_INIT*, UDF_ARGS*, char*); 192 DllExport char* bson_array_add(UDF_EXEC_ARGS); 193 DllExport void bson_array_add_deinit(UDF_INIT*); 194 195 DllExport my_bool bson_array_delete_init(UDF_INIT*, UDF_ARGS*, char*); 196 DllExport char* bson_array_delete(UDF_EXEC_ARGS); 197 DllExport void bson_array_delete_deinit(UDF_INIT*); 198 199 DllExport my_bool bsonlocate_init(UDF_INIT*, UDF_ARGS*, char*); 200 DllExport char* bsonlocate(UDF_EXEC_ARGS); 201 DllExport void bsonlocate_deinit(UDF_INIT*); 202 203 DllExport my_bool bson_locate_all_init(UDF_INIT*, UDF_ARGS*, char*); 204 DllExport char* bson_locate_all(UDF_EXEC_ARGS); 205 DllExport void bson_locate_all_deinit(UDF_INIT*); 206 207 DllExport my_bool bson_contains_init(UDF_INIT*, UDF_ARGS*, char*); 208 DllExport long long bson_contains(UDF_INIT*, UDF_ARGS*, char*, char*); 209 DllExport void bson_contains_deinit(UDF_INIT*); 210 211 DllExport my_bool bsoncontains_path_init(UDF_INIT*, UDF_ARGS*, char*); 212 DllExport long long bsoncontains_path(UDF_INIT*, UDF_ARGS*, char*, char*); 213 DllExport void bsoncontains_path_deinit(UDF_INIT*); 214 215 DllExport my_bool bson_make_object_init(UDF_INIT*, UDF_ARGS*, char*); 216 DllExport char* bson_make_object(UDF_EXEC_ARGS); 217 DllExport void bson_make_object_deinit(UDF_INIT*); 218 219 DllExport my_bool bson_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*); 220 DllExport char* bson_object_nonull(UDF_EXEC_ARGS); 221 DllExport void bson_object_nonull_deinit(UDF_INIT*); 222 223 DllExport my_bool bson_object_key_init(UDF_INIT*, UDF_ARGS*, char*); 224 DllExport char* bson_object_key(UDF_EXEC_ARGS); 225 DllExport void bson_object_key_deinit(UDF_INIT*); 226 227 DllExport my_bool bson_object_add_init(UDF_INIT*, UDF_ARGS*, char*); 228 DllExport char* bson_object_add(UDF_EXEC_ARGS); 229 DllExport void bson_object_add_deinit(UDF_INIT*); 230 231 DllExport my_bool bson_object_delete_init(UDF_INIT*, UDF_ARGS*, char*); 232 DllExport char* bson_object_delete(UDF_EXEC_ARGS); 233 DllExport void bson_object_delete_deinit(UDF_INIT*); 234 235 DllExport my_bool bson_object_list_init(UDF_INIT*, UDF_ARGS*, char*); 236 DllExport char* bson_object_list(UDF_EXEC_ARGS); 237 DllExport void bson_object_list_deinit(UDF_INIT*); 238 239 DllExport my_bool bson_object_values_init(UDF_INIT*, UDF_ARGS*, char*); 240 DllExport char* bson_object_values(UDF_EXEC_ARGS); 241 DllExport void bson_object_values_deinit(UDF_INIT*); 242 243 DllExport my_bool bson_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); 244 DllExport char* bson_item_merge(UDF_EXEC_ARGS); 245 DllExport void bson_item_merge_deinit(UDF_INIT*); 246 247 DllExport my_bool bson_get_item_init(UDF_INIT*, UDF_ARGS*, char*); 248 DllExport char* bson_get_item(UDF_EXEC_ARGS); 249 DllExport void bson_get_item_deinit(UDF_INIT*); 250 251 DllExport my_bool bsonget_string_init(UDF_INIT*, UDF_ARGS*, char*); 252 DllExport char* bsonget_string(UDF_EXEC_ARGS); 253 DllExport void bsonget_string_deinit(UDF_INIT*); 254 255 DllExport my_bool bsonget_int_init(UDF_INIT*, UDF_ARGS*, char*); 256 DllExport long long bsonget_int(UDF_INIT*, UDF_ARGS*, char*, char*); 257 DllExport void bsonget_int_deinit(UDF_INIT*); 258 259 DllExport my_bool bsonget_real_init(UDF_INIT*, UDF_ARGS*, char*); 260 DllExport double bsonget_real(UDF_INIT*, UDF_ARGS*, char*, char*); 261 DllExport void bsonget_real_deinit(UDF_INIT*); 262 263 DllExport my_bool bsonset_def_prec_init(UDF_INIT*, UDF_ARGS*, char*); 264 DllExport long long bsonset_def_prec(UDF_INIT*, UDF_ARGS*, char*, char*); 265 266 DllExport my_bool bsonget_def_prec_init(UDF_INIT*, UDF_ARGS*, char*); 267 DllExport long long bsonget_def_prec(UDF_INIT*, UDF_ARGS*, char*, char*); 268 269 DllExport my_bool bsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); 270 DllExport long long bsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); 271 272 DllExport my_bool bsonget_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); 273 DllExport long long bsonget_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); 274 275 DllExport my_bool bson_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); 276 DllExport void bson_array_grp_clear(UDF_INIT *, char *, char *); 277 DllExport void bson_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); 278 DllExport char *bson_array_grp(UDF_EXEC_ARGS); 279 DllExport void bson_array_grp_deinit(UDF_INIT*); 280 281 DllExport my_bool bson_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); 282 DllExport void bson_object_grp_clear(UDF_INIT *, char *, char *); 283 DllExport void bson_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); 284 DllExport char *bson_object_grp(UDF_EXEC_ARGS); 285 DllExport void bson_object_grp_deinit(UDF_INIT*); 286 287 DllExport my_bool bson_delete_item_init(UDF_INIT*, UDF_ARGS*, char*); 288 DllExport char *bson_delete_item(UDF_EXEC_ARGS); 289 DllExport void bson_delete_item_deinit(UDF_INIT*); 290 291 DllExport my_bool bson_set_item_init(UDF_INIT*, UDF_ARGS*, char*); 292 DllExport char *bson_set_item(UDF_EXEC_ARGS); 293 DllExport void bson_set_item_deinit(UDF_INIT*); 294 295 DllExport my_bool bson_insert_item_init(UDF_INIT*, UDF_ARGS*, char*); 296 DllExport char *bson_insert_item(UDF_EXEC_ARGS); 297 DllExport void bson_insert_item_deinit(UDF_INIT*); 298 299 DllExport my_bool bson_update_item_init(UDF_INIT*, UDF_ARGS*, char*); 300 DllExport char *bson_update_item(UDF_EXEC_ARGS); 301 DllExport void bson_update_item_deinit(UDF_INIT*); 302 303 DllExport my_bool bson_file_init(UDF_INIT*, UDF_ARGS*, char*); 304 DllExport char *bson_file(UDF_EXEC_ARGS); 305 DllExport void bson_file_deinit(UDF_INIT*); 306 307 DllExport my_bool bfile_make_init(UDF_INIT*, UDF_ARGS*, char*); 308 DllExport char* bfile_make(UDF_EXEC_ARGS); 309 DllExport void bfile_make_deinit(UDF_INIT*); 310 311 DllExport my_bool bfile_convert_init(UDF_INIT*, UDF_ARGS*, char*); 312 DllExport char* bfile_convert(UDF_EXEC_ARGS); 313 DllExport void bfile_convert_deinit(UDF_INIT*); 314 315 DllExport my_bool bfile_bjson_init(UDF_INIT*, UDF_ARGS*, char*); 316 DllExport char* bfile_bjson(UDF_EXEC_ARGS); 317 DllExport void bfile_bjson_deinit(UDF_INIT*); 318 319 DllExport my_bool bson_serialize_init(UDF_INIT*, UDF_ARGS*, char*); 320 DllExport char *bson_serialize(UDF_EXEC_ARGS); 321 DllExport void bson_serialize_deinit(UDF_INIT*); 322 323 DllExport my_bool bbin_make_array_init(UDF_INIT*, UDF_ARGS*, char*); 324 DllExport char* bbin_make_array(UDF_EXEC_ARGS); 325 DllExport void bbin_make_array_deinit(UDF_INIT*); 326 327 DllExport my_bool bbin_array_add_init(UDF_INIT*, UDF_ARGS*, char*); 328 DllExport char* bbin_array_add(UDF_EXEC_ARGS); 329 DllExport void bbin_array_add_deinit(UDF_INIT*); 330 331 DllExport my_bool bbin_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*); 332 DllExport char* bbin_array_add_values(UDF_EXEC_ARGS); 333 DllExport void bbin_array_add_values_deinit(UDF_INIT*); 334 335 DllExport my_bool bbin_array_delete_init(UDF_INIT*, UDF_ARGS*, char*); 336 DllExport char* bbin_array_delete(UDF_EXEC_ARGS); 337 DllExport void bbin_array_delete_deinit(UDF_INIT*); 338 339 DllExport my_bool bbin_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); 340 DllExport void bbin_array_grp_clear(UDF_INIT *, char *, char *); 341 DllExport void bbin_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); 342 DllExport char *bbin_array_grp(UDF_EXEC_ARGS); 343 DllExport void bbin_array_grp_deinit(UDF_INIT*); 344 345 DllExport my_bool bbin_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); 346 DllExport void bbin_object_grp_clear(UDF_INIT *, char *, char *); 347 DllExport void bbin_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); 348 DllExport char *bbin_object_grp(UDF_EXEC_ARGS); 349 DllExport void bbin_object_grp_deinit(UDF_INIT*); 350 351 DllExport my_bool bbin_make_object_init(UDF_INIT*, UDF_ARGS*, char*); 352 DllExport char* bbin_make_object(UDF_EXEC_ARGS); 353 DllExport void bbin_make_object_deinit(UDF_INIT*); 354 355 DllExport my_bool bbin_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*); 356 DllExport char* bbin_object_nonull(UDF_EXEC_ARGS); 357 DllExport void bbin_object_nonull_deinit(UDF_INIT*); 358 359 DllExport my_bool bbin_object_key_init(UDF_INIT*, UDF_ARGS*, char*); 360 DllExport char* bbin_object_key(UDF_EXEC_ARGS); 361 DllExport void bbin_object_key_deinit(UDF_INIT*); 362 363 DllExport my_bool bbin_object_add_init(UDF_INIT*, UDF_ARGS*, char*); 364 DllExport char *bbin_object_add(UDF_EXEC_ARGS); 365 DllExport void bbin_object_add_deinit(UDF_INIT*); 366 367 DllExport my_bool bbin_object_delete_init(UDF_INIT*, UDF_ARGS*, char*); 368 DllExport char *bbin_object_delete(UDF_EXEC_ARGS); 369 DllExport void bbin_object_delete_deinit(UDF_INIT*); 370 371 DllExport my_bool bbin_object_list_init(UDF_INIT*, UDF_ARGS*, char*); 372 DllExport char *bbin_object_list(UDF_EXEC_ARGS); 373 DllExport void bbin_object_list_deinit(UDF_INIT*); 374 375 DllExport my_bool bbin_object_values_init(UDF_INIT*, UDF_ARGS*, char*); 376 DllExport char* bbin_object_values(UDF_EXEC_ARGS); 377 DllExport void bbin_object_values_deinit(UDF_INIT*); 378 379 DllExport my_bool bbin_get_item_init(UDF_INIT*, UDF_ARGS*, char*); 380 DllExport char *bbin_get_item(UDF_EXEC_ARGS); 381 DllExport void bbin_get_item_deinit(UDF_INIT*); 382 383 DllExport my_bool bbin_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); 384 DllExport char* bbin_item_merge(UDF_EXEC_ARGS); 385 DllExport void bbin_item_merge_deinit(UDF_INIT*); 386 387 DllExport my_bool bbin_set_item_init(UDF_INIT*, UDF_ARGS*, char*); 388 DllExport char *bbin_set_item(UDF_EXEC_ARGS); 389 DllExport void bbin_set_item_deinit(UDF_INIT*); 390 391 DllExport my_bool bbin_insert_item_init(UDF_INIT*, UDF_ARGS*, char*); 392 DllExport char *bbin_insert_item(UDF_EXEC_ARGS); 393 DllExport void bbin_insert_item_deinit(UDF_INIT*); 394 395 DllExport my_bool bbin_update_item_init(UDF_INIT*, UDF_ARGS*, char*); 396 DllExport char *bbin_update_item(UDF_EXEC_ARGS); 397 DllExport void bbin_update_item_deinit(UDF_INIT*); 398 399 DllExport my_bool bbin_delete_item_init(UDF_INIT*, UDF_ARGS*, char*); 400 DllExport char *bbin_delete_item(UDF_EXEC_ARGS); 401 DllExport void bbin_delete_item_deinit(UDF_INIT*); 402 403 DllExport my_bool bbin_locate_all_init(UDF_INIT*, UDF_ARGS*, char*); 404 DllExport char* bbin_locate_all(UDF_EXEC_ARGS); 405 DllExport void bbin_locate_all_deinit(UDF_INIT*); 406 407 DllExport my_bool bbin_file_init(UDF_INIT*, UDF_ARGS*, char*); 408 DllExport char *bbin_file(UDF_EXEC_ARGS); 409 DllExport void bbin_file_deinit(UDF_INIT*); 410 } // extern "C" 411