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