8
8
/* Include relevant sections of the MariaDB header file. */
9
9
/* **********************************************************************/
10
10
#include < my_global.h>
11
+ #include < mysqld.h>
11
12
#include < mysql.h>
13
+ #include < sql_error.h>
12
14
13
15
#include " global.h"
14
16
#include " plgdbsem.h"
15
17
#include " json.h"
16
18
19
+ #define MEMFIX 512
20
+
21
+ uint GetJsonGrpSize (void );
22
+
17
23
extern " C" {
18
24
DllExport my_bool Json_Value_init (UDF_INIT*, UDF_ARGS*, char *);
19
25
DllExport char *Json_Value (UDF_INIT*, UDF_ARGS*, char *,
@@ -23,6 +29,10 @@ DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*);
23
29
DllExport char *Json_Array (UDF_INIT*, UDF_ARGS*, char *,
24
30
unsigned long *, char *, char *);
25
31
DllExport void Json_Array_deinit (UDF_INIT*);
32
+ DllExport my_bool Json_Array_Add_init (UDF_INIT*, UDF_ARGS*, char *);
33
+ DllExport char *Json_Array_Add (UDF_INIT*, UDF_ARGS*, char *,
34
+ unsigned long *, char *, char *);
35
+ DllExport void Json_Array_Add_deinit (UDF_INIT*);
26
36
DllExport my_bool Json_Object_init (UDF_INIT*, UDF_ARGS*, char *);
27
37
DllExport char *Json_Object (UDF_INIT*, UDF_ARGS*, char *,
28
38
unsigned long *, char *, char *);
@@ -44,8 +54,8 @@ DllExport void Json_Object_Grp_deinit(UDF_INIT*);
44
54
/* **********************************************************************/
45
55
/* Allocate and initialise the memory area. */
46
56
/* **********************************************************************/
47
- static my_bool JsonInit (UDF_INIT *initid, char *message, unsigned long reslen,
48
- unsigned long memlen)
57
+ static my_bool JsonInit (UDF_INIT *initid, char *message,
58
+ unsigned long reslen, unsigned long memlen)
49
59
{
50
60
PGLOBAL g = PlugInit (NULL , memlen);
51
61
@@ -119,7 +129,7 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj,
119
129
} // endfor i
120
130
121
131
// Calculate the amount of memory needed
122
- memlen = 1024 + sizeof (JOUTSTR) + reslen;
132
+ memlen = MEMFIX + sizeof (JOUTSTR) + reslen;
123
133
124
134
for (i = 0 ; i < args->arg_count ; i++) {
125
135
memlen += (args->lengths [i] + sizeof (JVALUE));
@@ -219,14 +229,23 @@ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i)
219
229
static PJVAL MakeValue (PGLOBAL g, UDF_ARGS *args, int i)
220
230
{
221
231
char *sap = args->args [i];
232
+ PJSON jsp;
222
233
PJVAL jvp = new (g) JVALUE;
223
234
224
235
if (sap) switch (args->arg_type [i]) {
225
236
case STRING_RESULT:
226
237
if (args->lengths [i]) {
227
- if (IsJson (args, i))
228
- jvp->SetValue (ParseJson (g, sap, args->lengths [i], 0 ));
229
- else
238
+ if (IsJson (args, i)) {
239
+ if (!(jsp = ParseJson (g, sap, args->lengths [i], 0 )))
240
+ push_warning (current_thd, Sql_condition::WARN_LEVEL_WARN, 0 ,
241
+ g->Message );
242
+
243
+ if (jsp && jsp->GetType () == TYPE_JVAL)
244
+ jvp = (PJVAL)jsp;
245
+ else
246
+ jvp->SetValue (jsp);
247
+
248
+ } else
230
249
jvp->SetString (g, MakePSZ (g, args, i));
231
250
232
251
} // endif str
@@ -328,6 +347,59 @@ void Json_Array_deinit(UDF_INIT* initid)
328
347
PlugExit ((PGLOBAL)initid->ptr );
329
348
} // end of Json_Array_deinit
330
349
350
+ /* **********************************************************************/
351
+ /* Add values to a Json array. */
352
+ /* **********************************************************************/
353
+ my_bool Json_Array_Add_init (UDF_INIT *initid, UDF_ARGS *args, char *message)
354
+ {
355
+ unsigned long reslen, memlen;
356
+
357
+ if (args->arg_count < 2 ) {
358
+ strcpy (message, " Json_Value_Add must have at least 2 arguments" );
359
+ return true ;
360
+ } else if (!IsJson (args, 0 )) {
361
+ strcpy (message, " Json_Value_Add first argument must be a json array" );
362
+ return true ;
363
+ } else
364
+ CalcLen (args, false , reslen, memlen);
365
+
366
+ return JsonInit (initid, message, reslen, memlen);
367
+ } // end of Json_Array_Add_init
368
+
369
+ char *Json_Array_Add (UDF_INIT *initid, UDF_ARGS *args, char *result,
370
+ unsigned long *res_length, char *is_null, char *error)
371
+ {
372
+ char *str;
373
+ PJVAL jvp;
374
+ PJAR arp;
375
+ PGLOBAL g = (PGLOBAL)initid->ptr ;
376
+
377
+ PlugSubSet (g, g->Sarea , g->Sarea_Size );
378
+ jvp = MakeValue (g, args, 0 );
379
+
380
+ if (jvp->GetValType () != TYPE_JAR) {
381
+ arp = new (g) JARRAY;
382
+ arp->AddValue (g, jvp);
383
+ } else
384
+ arp = jvp->GetArray ();
385
+
386
+ for (uint i = 1 ; i < args->arg_count ; i++)
387
+ arp->AddValue (g, MakeValue (g, args, i));
388
+
389
+ arp->InitArray (g);
390
+
391
+ if (!(str = Serialize (g, arp, NULL , 0 )))
392
+ str = strcpy (result, g->Message );
393
+
394
+ *res_length = strlen (str);
395
+ return str;
396
+ } // end of Json_Array_Add
397
+
398
+ void Json_Array_Add_deinit (UDF_INIT* initid)
399
+ {
400
+ PlugExit ((PGLOBAL)initid->ptr );
401
+ } // end of Json_Array_Add_deinit
402
+
331
403
/* **********************************************************************/
332
404
/* Make a Json Oject containing all the parameters. */
333
405
/* **********************************************************************/
@@ -370,7 +442,7 @@ void Json_Object_deinit(UDF_INIT* initid)
370
442
/* **********************************************************************/
371
443
my_bool Json_Array_Grp_init (UDF_INIT *initid, UDF_ARGS *args, char *message)
372
444
{
373
- unsigned long reslen, memlen, n = 10 ;
445
+ unsigned long reslen, memlen, n = GetJsonGrpSize () ;
374
446
375
447
if (args->arg_count != 1 ) {
376
448
strcpy (message, " Json_Array_Grp can only accept 1 argument" );
@@ -379,7 +451,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
379
451
CalcLen (args, false , reslen, memlen);
380
452
381
453
reslen *= n;
382
- memlen *= n ;
454
+ memlen += ((memlen - MEMFIX) * (n - 1 )) ;
383
455
384
456
if (JsonInit (initid, message, reslen, memlen))
385
457
return true ;
@@ -388,6 +460,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
388
460
389
461
PlugSubSet (g, g->Sarea , g->Sarea_Size );
390
462
g->Activityp = (PACTIVITY)new (g) JARRAY;
463
+ g->N = (int )n;
391
464
return false ;
392
465
} // end of Json_Array_Grp_init
393
466
@@ -397,7 +470,9 @@ void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args,
397
470
PGLOBAL g = (PGLOBAL)initid->ptr ;
398
471
PJAR arp = (PJAR)g->Activityp ;
399
472
400
- arp->AddValue (g, MakeValue (g, args, 0 ));
473
+ if (g->N -- > 0 )
474
+ arp->AddValue (g, MakeValue (g, args, 0 ));
475
+
401
476
} // end of Json_Array_Grp_add
402
477
403
478
char *Json_Array_Grp (UDF_INIT *initid, UDF_ARGS *args, char *result,
@@ -407,6 +482,10 @@ char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result,
407
482
PGLOBAL g = (PGLOBAL)initid->ptr ;
408
483
PJAR arp = (PJAR)g->Activityp ;
409
484
485
+ if (g->N < 0 )
486
+ push_warning (current_thd, Sql_condition::WARN_LEVEL_WARN, 0 ,
487
+ " Result truncated to json_grp_size values" );
488
+
410
489
arp->InitArray (g);
411
490
412
491
if (!(str = Serialize (g, arp, NULL , 0 )))
@@ -422,6 +501,7 @@ void Json_Array_Grp_clear(UDF_INIT *initid, char *is_null, char *error)
422
501
423
502
PlugSubSet (g, g->Sarea , g->Sarea_Size );
424
503
g->Activityp = (PACTIVITY)new (g) JARRAY;
504
+ g->N = GetJsonGrpSize ();
425
505
} // end of Json_Array_Grp_clear
426
506
427
507
void Json_Array_Grp_deinit (UDF_INIT* initid)
@@ -434,7 +514,7 @@ void Json_Array_Grp_deinit(UDF_INIT* initid)
434
514
/* **********************************************************************/
435
515
my_bool Json_Object_Grp_init (UDF_INIT *initid, UDF_ARGS *args, char *message)
436
516
{
437
- unsigned long reslen, memlen, n = 10 ;
517
+ unsigned long reslen, memlen, n = GetJsonGrpSize () ;
438
518
439
519
if (args->arg_count != 2 ) {
440
520
strcpy (message, " Json_Array_Grp can only accept 2 argument" );
@@ -443,7 +523,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
443
523
CalcLen (args, true , reslen, memlen);
444
524
445
525
reslen *= n;
446
- memlen *= n ;
526
+ memlen += ((memlen - MEMFIX) * (n - 1 )) ;
447
527
448
528
if (JsonInit (initid, message, reslen, memlen))
449
529
return true ;
@@ -452,6 +532,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
452
532
453
533
PlugSubSet (g, g->Sarea , g->Sarea_Size );
454
534
g->Activityp = (PACTIVITY)new (g) JOBJECT;
535
+ g->N = (int )n;
455
536
return false ;
456
537
} // end of Json_Object_Grp_init
457
538
@@ -461,7 +542,9 @@ void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args,
461
542
PGLOBAL g = (PGLOBAL)initid->ptr ;
462
543
PJOB objp = (PJOB)g->Activityp ;
463
544
464
- objp->SetValue (g, MakeValue (g, args, 0 ), MakePSZ (g, args, 1 ));
545
+ if (g->N -- > 0 )
546
+ objp->SetValue (g, MakeValue (g, args, 0 ), MakePSZ (g, args, 1 ));
547
+
465
548
} // end of Json_Object_Grp_add
466
549
467
550
char *Json_Object_Grp (UDF_INIT *initid, UDF_ARGS *args, char *result,
@@ -471,6 +554,10 @@ char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result,
471
554
PGLOBAL g = (PGLOBAL)initid->ptr ;
472
555
PJOB objp = (PJOB)g->Activityp ;
473
556
557
+ if (g->N < 0 )
558
+ push_warning (current_thd, Sql_condition::WARN_LEVEL_WARN, 0 ,
559
+ " Result truncated to json_grp_size values" );
560
+
474
561
if (!(str = Serialize (g, objp, NULL , 0 )))
475
562
str = strcpy (result, g->Message );
476
563
@@ -484,6 +571,7 @@ void Json_Object_Grp_clear(UDF_INIT *initid, char *is_null, char *error)
484
571
485
572
PlugSubSet (g, g->Sarea , g->Sarea_Size );
486
573
g->Activityp = (PACTIVITY)new (g) JOBJECT;
574
+ g->N = GetJsonGrpSize ();
487
575
} // end of Json_Object_Grp_clear
488
576
489
577
void Json_Object_Grp_deinit (UDF_INIT* initid)
0 commit comments