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 | /*********************************************************************************/ |
21 | typedef 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 | |
31 | typedef class JSNX *PJSNX; |
32 | typedef class JOUTPATH *PJTP; |
33 | typedef class JOUTALL *PJTA; |
34 | |
35 | extern "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 | /*********************************************************************************/ |
249 | typedef struct _jpn { |
250 | enum JTYP Type; |
251 | PCSZ Key; |
252 | int N; |
253 | } JPN, *PJPN; |
254 | |
255 | /*********************************************************************************/ |
256 | /* Class JSNX: JSON access method. */ |
257 | /*********************************************************************************/ |
258 | class JSNX : public BLOCK { |
259 | public: |
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 | |
278 | protected: |
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 | |