| 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 | |