1/******************** tabjson H Declares Source Code File (.H) *******************/
2/* Name: jsonudf.h Version 1.3 */
3/* */
4/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */
5/* */
6/* This file contains the JSON UDF function and class declares. */
7/*********************************************************************************/
8#include "global.h"
9#include "plgdbsem.h"
10#include "block.h"
11#include "osutil.h"
12#include "maputil.h"
13#include "json.h"
14
15#define UDF_EXEC_ARGS \
16 UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*
17
18/*********************************************************************************/
19/* The JSON tree node. Can be an Object or an Array. */
20/*********************************************************************************/
21typedef struct _jnode {
22 PSZ Key; // The key used for object
23 OPVAL Op; // Operator used for this node
24 PVAL CncVal; // To cont value used for OP_CNC
25 PVAL Valp; // The internal array VALUE
26 int Rank; // The rank in array
27 int Rx; // Read row number
28 int Nx; // Next to read row number
29} JNODE, *PJNODE;
30
31typedef class JSNX *PJSNX;
32typedef class JOUTPATH *PJTP;
33typedef class JOUTALL *PJTA;
34
35extern "C" {
36 DllExport my_bool jsonvalue_init(UDF_INIT*, UDF_ARGS*, char*);
37 DllExport char *jsonvalue(UDF_EXEC_ARGS);
38 DllExport void jsonvalue_deinit(UDF_INIT*);
39
40 DllExport my_bool json_make_array_init(UDF_INIT*, UDF_ARGS*, char*);
41 DllExport char *json_make_array(UDF_EXEC_ARGS);
42 DllExport void json_make_array_deinit(UDF_INIT*);
43
44 DllExport my_bool json_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*);
45 DllExport char *json_array_add_values(UDF_EXEC_ARGS);
46 DllExport void json_array_add_values_deinit(UDF_INIT*);
47
48 DllExport my_bool json_array_add_init(UDF_INIT*, UDF_ARGS*, char*);
49 DllExport char *json_array_add(UDF_EXEC_ARGS);
50 DllExport void json_array_add_deinit(UDF_INIT*);
51
52 DllExport my_bool json_array_delete_init(UDF_INIT*, UDF_ARGS*, char*);
53 DllExport char *json_array_delete(UDF_EXEC_ARGS);
54 DllExport void json_array_delete_deinit(UDF_INIT*);
55
56 DllExport my_bool jsonsum_int_init(UDF_INIT*, UDF_ARGS*, char*);
57 DllExport long long jsonsum_int(UDF_INIT*, UDF_ARGS*, char*, char*);
58 DllExport void jsonsum_int_deinit(UDF_INIT*);
59
60 DllExport my_bool jsonsum_real_init(UDF_INIT*, UDF_ARGS*, char*);
61 DllExport double jsonsum_real(UDF_INIT*, UDF_ARGS*, char*, char*);
62 DllExport void jsonsum_real_deinit(UDF_INIT*);
63
64 DllExport my_bool jsonavg_real_init(UDF_INIT*, UDF_ARGS*, char*);
65 DllExport double jsonavg_real(UDF_INIT*, UDF_ARGS*, char*, char*);
66 DllExport void jsonavg_real_deinit(UDF_INIT*);
67
68 DllExport my_bool json_make_object_init(UDF_INIT*, UDF_ARGS*, char*);
69 DllExport char *json_make_object(UDF_EXEC_ARGS);
70 DllExport void json_make_object_deinit(UDF_INIT*);
71
72 DllExport my_bool json_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*);
73 DllExport char *json_object_nonull(UDF_EXEC_ARGS);
74 DllExport void json_object_nonull_deinit(UDF_INIT*);
75
76 DllExport my_bool json_object_key_init(UDF_INIT*, UDF_ARGS*, char*);
77 DllExport char *json_object_key(UDF_EXEC_ARGS);
78 DllExport void json_object_key_deinit(UDF_INIT*);
79
80 DllExport my_bool json_object_add_init(UDF_INIT*, UDF_ARGS*, char*);
81 DllExport char *json_object_add(UDF_EXEC_ARGS);
82 DllExport void json_object_add_deinit(UDF_INIT*);
83
84 DllExport my_bool json_object_delete_init(UDF_INIT*, UDF_ARGS*, char*);
85 DllExport char *json_object_delete(UDF_EXEC_ARGS);
86 DllExport void json_object_delete_deinit(UDF_INIT*);
87
88 DllExport my_bool json_object_list_init(UDF_INIT*, UDF_ARGS*, char*);
89 DllExport char *json_object_list(UDF_EXEC_ARGS);
90 DllExport void json_object_list_deinit(UDF_INIT*);
91
92 DllExport my_bool json_object_values_init(UDF_INIT*, UDF_ARGS*, char*);
93 DllExport char *json_object_values(UDF_EXEC_ARGS);
94 DllExport void json_object_values_deinit(UDF_INIT*);
95
96 DllExport my_bool jsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*);
97 DllExport long long jsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*);
98
99 DllExport my_bool jsonget_grp_size_init(UDF_INIT*, UDF_ARGS*, char*);
100 DllExport long long jsonget_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*);
101
102 DllExport my_bool json_array_grp_init(UDF_INIT*, UDF_ARGS*, char*);
103 DllExport void json_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *);
104 DllExport char *json_array_grp(UDF_EXEC_ARGS);
105 DllExport void json_array_grp_clear(UDF_INIT *, char *, char *);
106 DllExport void json_array_grp_deinit(UDF_INIT*);
107
108 DllExport my_bool json_object_grp_init(UDF_INIT*, UDF_ARGS*, char*);
109 DllExport void json_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *);
110 DllExport char *json_object_grp(UDF_EXEC_ARGS);
111 DllExport void json_object_grp_clear(UDF_INIT *, char *, char *);
112 DllExport void json_object_grp_deinit(UDF_INIT*);
113
114 DllExport my_bool json_item_merge_init(UDF_INIT*, UDF_ARGS*, char*);
115 DllExport char *json_item_merge(UDF_EXEC_ARGS);
116 DllExport void json_item_merge_deinit(UDF_INIT*);
117
118 DllExport my_bool json_get_item_init(UDF_INIT*, UDF_ARGS*, char*);
119 DllExport char *json_get_item(UDF_EXEC_ARGS);
120 DllExport void json_get_item_deinit(UDF_INIT*);
121
122 DllExport my_bool jsonget_string_init(UDF_INIT*, UDF_ARGS*, char*);
123 DllExport char *jsonget_string(UDF_EXEC_ARGS);
124 DllExport void jsonget_string_deinit(UDF_INIT*);
125
126 DllExport my_bool jsonget_int_init(UDF_INIT*, UDF_ARGS*, char*);
127 DllExport long long jsonget_int(UDF_INIT*, UDF_ARGS*, char*, char*);
128 DllExport void jsonget_int_deinit(UDF_INIT*);
129
130 DllExport my_bool jsonget_real_init(UDF_INIT*, UDF_ARGS*, char*);
131 DllExport double jsonget_real(UDF_INIT*, UDF_ARGS*, char*, char*);
132 DllExport void jsonget_real_deinit(UDF_INIT*);
133
134 DllExport my_bool jsoncontains_init(UDF_INIT*, UDF_ARGS*, char*);
135 DllExport long long jsoncontains(UDF_EXEC_ARGS);
136 DllExport void jsoncontains_deinit(UDF_INIT*);
137
138 DllExport my_bool jsonlocate_init(UDF_INIT*, UDF_ARGS*, char*);
139 DllExport char *jsonlocate(UDF_EXEC_ARGS);
140 DllExport void jsonlocate_deinit(UDF_INIT*);
141
142 DllExport my_bool json_locate_all_init(UDF_INIT*, UDF_ARGS*, char*);
143 DllExport char *json_locate_all(UDF_EXEC_ARGS);
144 DllExport void json_locate_all_deinit(UDF_INIT*);
145
146 DllExport my_bool jsoncontains_path_init(UDF_INIT*, UDF_ARGS*, char*);
147 DllExport long long jsoncontains_path(UDF_EXEC_ARGS);
148 DllExport void jsoncontains_path_deinit(UDF_INIT*);
149
150 DllExport my_bool json_set_item_init(UDF_INIT*, UDF_ARGS*, char*);
151 DllExport char *json_set_item(UDF_EXEC_ARGS);
152 DllExport void json_set_item_deinit(UDF_INIT*);
153
154 DllExport my_bool json_insert_item_init(UDF_INIT*, UDF_ARGS*, char*);
155 DllExport char *json_insert_item(UDF_EXEC_ARGS);
156 DllExport void json_insert_item_deinit(UDF_INIT*);
157
158 DllExport my_bool json_update_item_init(UDF_INIT*, UDF_ARGS*, char*);
159 DllExport char *json_update_item(UDF_EXEC_ARGS);
160 DllExport void json_update_item_deinit(UDF_INIT*);
161
162 DllExport my_bool json_file_init(UDF_INIT*, UDF_ARGS*, char*);
163 DllExport char *json_file(UDF_EXEC_ARGS);
164 DllExport void json_file_deinit(UDF_INIT*);
165
166 DllExport my_bool jfile_make_init(UDF_INIT*, UDF_ARGS*, char*);
167 DllExport char *jfile_make(UDF_EXEC_ARGS);
168 DllExport void jfile_make_deinit(UDF_INIT*);
169
170 DllExport my_bool jbin_array_init(UDF_INIT*, UDF_ARGS*, char*);
171 DllExport char *jbin_array(UDF_EXEC_ARGS);
172 DllExport void jbin_array_deinit(UDF_INIT*);
173
174 DllExport my_bool jbin_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*);
175 DllExport char *jbin_array_add_values(UDF_EXEC_ARGS);
176 DllExport void jbin_array_add_values_deinit(UDF_INIT*);
177
178 DllExport my_bool jbin_array_add_init(UDF_INIT*, UDF_ARGS*, char*);
179 DllExport char *jbin_array_add(UDF_EXEC_ARGS);
180 DllExport void jbin_array_add_deinit(UDF_INIT*);
181
182 DllExport my_bool jbin_array_delete_init(UDF_INIT*, UDF_ARGS*, char*);
183 DllExport char *jbin_array_delete(UDF_EXEC_ARGS);
184 DllExport void jbin_array_delete_deinit(UDF_INIT*);
185
186 DllExport my_bool jbin_object_init(UDF_INIT*, UDF_ARGS*, char*);
187 DllExport char *jbin_object(UDF_EXEC_ARGS);
188 DllExport void jbin_object_deinit(UDF_INIT*);
189
190 DllExport my_bool jbin_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*);
191 DllExport char *jbin_object_nonull(UDF_EXEC_ARGS);
192 DllExport void jbin_object_nonull_deinit(UDF_INIT*);
193
194 DllExport my_bool jbin_object_key_init(UDF_INIT*, UDF_ARGS*, char*);
195 DllExport char *jbin_object_key(UDF_EXEC_ARGS);
196 DllExport void jbin_object_key_deinit(UDF_INIT*);
197
198 DllExport my_bool jbin_object_add_init(UDF_INIT*, UDF_ARGS*, char*);
199 DllExport char *jbin_object_add(UDF_EXEC_ARGS);
200 DllExport void jbin_object_add_deinit(UDF_INIT*);
201
202 DllExport my_bool jbin_object_delete_init(UDF_INIT*, UDF_ARGS*, char*);
203 DllExport char *jbin_object_delete(UDF_EXEC_ARGS);
204 DllExport void jbin_object_delete_deinit(UDF_INIT*);
205
206 DllExport my_bool jbin_object_list_init(UDF_INIT*, UDF_ARGS*, char*);
207 DllExport char *jbin_object_list(UDF_EXEC_ARGS);
208 DllExport void jbin_object_list_deinit(UDF_INIT*);
209
210 DllExport my_bool jbin_get_item_init(UDF_INIT*, UDF_ARGS*, char*);
211 DllExport char *jbin_get_item(UDF_EXEC_ARGS);
212 DllExport void jbin_get_item_deinit(UDF_INIT*);
213
214 DllExport my_bool jbin_item_merge_init(UDF_INIT*, UDF_ARGS*, char*);
215 DllExport char *jbin_item_merge(UDF_EXEC_ARGS);
216 DllExport void jbin_item_merge_deinit(UDF_INIT*);
217
218 DllExport my_bool jbin_set_item_init(UDF_INIT*, UDF_ARGS*, char*);
219 DllExport char *jbin_set_item(UDF_EXEC_ARGS);
220 DllExport void jbin_set_item_deinit(UDF_INIT*);
221
222 DllExport my_bool jbin_insert_item_init(UDF_INIT*, UDF_ARGS*, char*);
223 DllExport char *jbin_insert_item(UDF_EXEC_ARGS);
224 DllExport void jbin_insert_item_deinit(UDF_INIT*);
225
226 DllExport my_bool jbin_update_item_init(UDF_INIT*, UDF_ARGS*, char*);
227 DllExport char *jbin_update_item(UDF_EXEC_ARGS);
228 DllExport void jbin_update_item_deinit(UDF_INIT*);
229
230 DllExport my_bool jbin_file_init(UDF_INIT*, UDF_ARGS*, char*);
231 DllExport char *jbin_file(UDF_EXEC_ARGS);
232 DllExport void jbin_file_deinit(UDF_INIT*);
233
234 DllExport my_bool json_serialize_init(UDF_INIT*, UDF_ARGS*, char*);
235 DllExport char *json_serialize(UDF_EXEC_ARGS);
236 DllExport void json_serialize_deinit(UDF_INIT*);
237
238 DllExport my_bool envar_init(UDF_INIT*, UDF_ARGS*, char*);
239 DllExport char *envar(UDF_EXEC_ARGS);
240
241 DllExport my_bool countin_init(UDF_INIT*, UDF_ARGS*, char*);
242 DllExport long long countin(UDF_EXEC_ARGS);
243} // extern "C"
244
245
246/*********************************************************************************/
247/* Structure JPN. Used to make the locate path. */
248/*********************************************************************************/
249typedef struct _jpn {
250 enum JTYP Type;
251 PCSZ Key;
252 int N;
253} JPN, *PJPN;
254
255/*********************************************************************************/
256/* Class JSNX: JSON access method. */
257/*********************************************************************************/
258class JSNX : public BLOCK {
259public:
260 // Constructors
261 JSNX(PGLOBAL g, PJSON row, int type, int len = 64, int prec = 0, my_bool wr = false);
262
263 // Implementation
264 int GetPrecision(void) {return Prec;}
265 PVAL GetValue(void) {return Value;}
266
267 // Methods
268 my_bool SetJpath(PGLOBAL g, char *path, my_bool jb = false);
269 my_bool ParseJpath(PGLOBAL g);
270 void ReadValue(PGLOBAL g);
271 PJVAL GetRowValue(PGLOBAL g, PJSON row, int i, my_bool b = true);
272 PJVAL GetJson(PGLOBAL g);
273 my_bool CheckPath(PGLOBAL g);
274 my_bool WriteValue(PGLOBAL g, PJVAL jvalp);
275 char *Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k = 1);
276 char *LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx = 10);
277
278protected:
279 my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm);
280 PVAL GetColumnValue(PGLOBAL g, PJSON row, int i);
281 PVAL ExpandArray(PGLOBAL g, PJAR arp, int n);
282 PVAL CalculateArray(PGLOBAL g, PJAR arp, int n);
283 PVAL MakeJson(PGLOBAL g, PJSON jsp);
284 void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n);
285 PJSON GetRow(PGLOBAL g);
286 my_bool LocateArray(PJAR jarp);
287 my_bool LocateObject(PJOB jobp);
288 my_bool LocateValue(PJVAL jvp);
289 my_bool LocateArrayAll(PJAR jarp);
290 my_bool LocateObjectAll(PJOB jobp);
291 my_bool LocateValueAll(PJVAL jvp);
292 my_bool CompareTree(PJSON jp1, PJSON jp2);
293 my_bool AddPath(void);
294
295 // Default constructor not to be used
296 JSNX(void) {}
297
298 // Members
299 PJSON Row;
300 PJVAL Jvalp;
301 PJPN Jpnp;
302 JOUTSTR *Jp;
303 JNODE *Nodes; // The intermediate objects
304 PVAL Value;
305 PVAL MulVal; // To value used by multiple column
306 char *Jpath; // The json path
307 int Buf_Type;
308 int Long;
309 int Prec;
310 int Nod; // The number of intermediate objects
311 int Xnod; // Index of multiple values
312 int K; // Kth item to locate
313 int I; // Index of JPN
314 int Imax; // Max number of JPN's
315 int B; // Index base
316 my_bool Xpd; // True for expandable column
317 my_bool Parsed; // True when parsed
318 my_bool Found; // Item found by locate
319 my_bool Wr; // Write mode
320 my_bool Jb; // Must return json item
321}; // end of class JSNX
322