dbutils/json.c

Fri, 19 Dec 2025 17:22:03 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 19 Dec 2025 17:22:03 +0100
changeset 31
287484519844
parent 30
d33eaaec15da
permissions
-rw-r--r--

update ucx

26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "json.h"
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 CxJsonValue* dbuObjectToJson(DBUClass *type, void *obj, const CxAllocator *a) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 return dbuObjectToJson2(type, obj, a, false, false);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 CxJsonValue* dbuObjectToJson2(DBUClass *type, void *obj, const CxAllocator *a, bool setNull, bool forceString) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 if(obj == NULL) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 return cxJsonCreateLiteral(a, CX_JSON_NULL);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 if(!a) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 a = cxDefaultAllocator;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 CxJsonValue *value = cxJsonCreateObj(a);
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 if(!value) {
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 return NULL;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 // add all primitive values
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 CxMapIterator i = cxMapIteratorValues(type->fields);
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
50 for(int n=0;n<2;n++) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
51 cx_foreach(DBUField *, field, i) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
52 CxJsonValue *child = NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
53 if(field->toBool) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
54 bool b = field->toBool(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
55 child = cxJsonCreateLiteral(a, b ? CX_JSON_TRUE : CX_JSON_FALSE);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
56 } else if(field->toInt64) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
57 int64_t i = field->toInt64(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
58 child = cxJsonCreateInteger(a, i);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
59 } else if(field->toUInt64) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
60 uint64_t u = field->toUInt64(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
61 child = cxJsonCreateInteger(a, (int64_t)u);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
62 } else if(field->toDouble) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
63 double d = field->toDouble(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
64 child = cxJsonCreateNumber(a, d);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
65 } else if(field->toString) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
66 cxmutstr s = field->toString(field, obj, a);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
67 if(s.ptr) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
68 // we don't want to copy the string again, therefore
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
69 // we can't use cxJsonCreateString
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
70 child = cxMalloc(a, sizeof(CxJsonValue));
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
71 if(!child) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
72 cxFree(a, s.ptr);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
73 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
74 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
75 child->allocator = a;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
76 child->type = CX_JSON_STRING;
30
d33eaaec15da update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 29
diff changeset
77 child->string = s;
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
79 } else if(field->toBinary) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
80 // TODO
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
81 } else if(field->toObject) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
82 DBUObject child_obj = field->toObject(field, obj);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
83 if(child_obj == NULL) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
84 child = CX_JSON_NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
85 } else if(field->objType) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
86 child = dbuObjectToJson2(field->objType, child_obj, a, setNull, forceString);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
87 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
88 } else if(field->toList) {
29
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
89 DBUAbstractList *list = field->toList(field, obj);
31
287484519844 update ucx
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 30
diff changeset
90 child = cxJsonCreateArr(a, list->length(list));
29
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
91 if(child) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
92 if(list->iterator) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
93 CxIterator iter = list->iterator(list);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
94 cx_foreach(void *, elm, iter) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
95 DBUField *f = list->elementField(list, elm);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
96 if(f->toObject) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
97 DBUObject child_obj = f->toObject(field, elm);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
98 if(f->objType) {
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
99 CxJsonValue *array_elm = dbuObjectToJson2(f->objType, child_obj, a, setNull, forceString);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
100 cxJsonArrAddValues(child, &array_elm, 1);
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
101 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
102 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
103 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
104 }
b8c826c720f3 implement list to json serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 28
diff changeset
105 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
106 } else {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
107 continue; // non-serializable field
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
109
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
110 if(!child) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
111 cxJsonValueFree(value);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
112 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
113 }
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
114
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
115 if(cxJsonObjPut(value, field->name, child)) {
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
116 cxJsonValueFree(child);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
117 cxJsonValueFree(value);
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
118 return NULL;
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
119 }
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 }
28
e46f9f254fcd implement json child object serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 26
diff changeset
121 i = cxMapIteratorValues(type->obj_fields);
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 }
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 return value;
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }

mercurial