• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "ejdb_test.h"
2 #include <CUnit/Basic.h>
3 
4 #include <ejdb2/iowow/iwuuid.h>
5 
init_suite(void)6 int init_suite(void) {
7   iwrc rc = ejdb_init();
8   return rc;
9 }
10 
clean_suite()11 int clean_suite() {
12   return 0;
13 }
14 
free_iwpool(void * ptr,void * op)15 static void free_iwpool(void *ptr, void *op) {
16   iwpool_destroy((IWPOOL*) op);
17 }
18 
set_apply_int(JQL q,int idx,const char * key,int64_t id)19 static void set_apply_int(JQL q, int idx, const char *key, int64_t id) {
20   JBL_NODE n;
21   IWPOOL *pool = iwpool_create(64);
22   iwrc rc = jbn_from_json("{}", &n, pool);
23   CU_ASSERT_EQUAL_FATAL(rc, 0);
24   rc = jbn_add_item_i64(n, key, id, 0, pool);
25   CU_ASSERT_EQUAL_FATAL(rc, 0);
26   rc = jql_set_json2(q, 0, idx, n, free_iwpool, pool);
27   CU_ASSERT_EQUAL_FATAL(rc, 0);
28 }
29 
ejdb_test4_1(void)30 static void ejdb_test4_1(void) {
31   EJDB_OPTS opts = {
32     .kv       = {
33       .path   = "ejdb_test4_1.db",
34       .oflags = IWKV_TRUNC
35     },
36     .no_wal   = true
37   };
38 
39   EJDB db;
40   JQL q;
41   int64_t id = 0;
42   EJDB_LIST list = 0;
43   IWXSTR *xstr = iwxstr_new();
44 
45   iwrc rc = ejdb_open(&opts, &db);
46   CU_ASSERT_EQUAL_FATAL(rc, 0);
47 
48   rc = put_json2(db, "artists", "{'name':'Leonardo Da Vinci', 'years':[1452,1519]}", &id);
49   CU_ASSERT_EQUAL_FATAL(rc, 0);
50 
51   rc = put_json(db, "paintings", "{'name':'Mona Lisa', 'year':1490, 'origin':'Italy'}");
52   CU_ASSERT_EQUAL_FATAL(rc, 0);
53   rc = jql_create(&q, "paintings", "/[name=:?] | apply :?");
54   CU_ASSERT_EQUAL_FATAL(rc, 0);
55   rc = jql_set_str(q, 0, 0, "Mona Lisa");
56   CU_ASSERT_EQUAL_FATAL(rc, 0);
57   set_apply_int(q, 1, "artist_ref", id);
58   rc = ejdb_update(db, q);
59   CU_ASSERT_EQUAL_FATAL(rc, 0);
60   jql_destroy(&q);
61 
62   rc = put_json(db, "paintings", "{'name':'Madonna Litta - Madonna And The Child', 'year':1490, 'origin':'Italy'}");
63   CU_ASSERT_EQUAL_FATAL(rc, 0);
64   rc = jql_create(&q, "paintings", "/[name=:?] | apply :?");
65   CU_ASSERT_EQUAL_FATAL(rc, 0);
66   rc = jql_set_str(q, 0, 0, "Madonna Litta - Madonna And The Child");
67   CU_ASSERT_EQUAL_FATAL(rc, 0);
68   set_apply_int(q, 1, "artist_ref", id);
69   rc = ejdb_update(db, q);
70   CU_ASSERT_EQUAL_FATAL(rc, 0);
71   jql_destroy(&q);
72   id = 0;
73 
74   rc = jql_create(&q, "paintings", "/* | /artist_ref<artists");
75   CU_ASSERT_EQUAL_FATAL(rc, 0);
76   rc = ejdb_list4(db, q, 0, 0, &list);
77   CU_ASSERT_EQUAL_FATAL(rc, 0);
78 
79   for (EJDB_DOC doc = list->first; doc; doc = doc->next) {
80     JBL_NODE n;
81     iwxstr_clear(xstr);
82     rc = jbn_as_json(doc->node, jbl_xstr_json_printer, xstr, 0);
83     CU_ASSERT_EQUAL_FATAL(rc, 0);
84     //fprintf(stderr, "%s\n", iwxstr_ptr(xstr));
85     rc = jbn_at(doc->node, "/artist_ref/name", &n);
86     CU_ASSERT_EQUAL_FATAL(rc, 0);
87     CU_ASSERT_EQUAL(n->type, JBV_STR);
88     CU_ASSERT_NSTRING_EQUAL(n->vptr, "Leonardo Da Vinci", n->vsize);
89 
90     rc = jbn_at(doc->node, "/year", &n);
91     CU_ASSERT_EQUAL_FATAL(rc, 0);
92     CU_ASSERT_EQUAL(n->type, JBV_I64);
93     CU_ASSERT_EQUAL(n->vi64, 1490);
94   }
95   jql_destroy(&q);
96   ejdb_list_destroy(&list);
97 
98 
99   // Next mode
100   rc = jql_create(&q, "paintings", "/* | /{name, artist_ref<artists} - /artist_ref/years/0");
101   CU_ASSERT_EQUAL_FATAL(rc, 0);
102   rc = ejdb_list4(db, q, 0, 0, &list);
103   CU_ASSERT_EQUAL_FATAL(rc, 0);
104 
105   for (EJDB_DOC doc = list->first; doc; doc = doc->next) {
106     JBL_NODE n;
107     iwxstr_clear(xstr);
108     rc = jbn_as_json(doc->node, jbl_xstr_json_printer, xstr, 0);
109     CU_ASSERT_EQUAL_FATAL(rc, 0);
110     //fprintf(stderr, "%s\n", iwxstr_ptr(xstr));
111 
112     rc = jbn_at(doc->node, "/name", &n);
113     CU_ASSERT_EQUAL_FATAL(rc, 0);
114     CU_ASSERT_EQUAL(n->type, JBV_STR);
115 
116     rc = jbn_at(doc->node, "/artist_ref/name", &n);
117     CU_ASSERT_EQUAL_FATAL(rc, 0);
118     CU_ASSERT_EQUAL(n->type, JBV_STR);
119     CU_ASSERT_NSTRING_EQUAL(n->vptr, "Leonardo Da Vinci", n->vsize);
120 
121     rc = jbn_at(doc->node, "/artist_ref/years/1", &n); // todo: review
122     CU_ASSERT_EQUAL_FATAL(rc, 0);
123     CU_ASSERT_EQUAL(n->type, JBV_I64);
124     CU_ASSERT_EQUAL(n->vi64, 1519);
125   }
126   jql_destroy(&q);
127   ejdb_list_destroy(&list);
128 
129   rc = ejdb_close(&db);
130   CU_ASSERT_EQUAL_FATAL(rc, 0);
131   iwxstr_destroy(xstr);
132 }
133 
ejdb_test4_2(void)134 static void ejdb_test4_2(void) {
135   EJDB_OPTS opts = {
136     .kv       = {
137       .path   = "ejdb_test4_2.db",
138       .oflags = IWKV_TRUNC
139     },
140     .no_wal   = true
141   };
142 
143   EJDB db;
144   JQL q;
145   JBL_NODE n, n2;
146   int i = 0;
147   EJDB_LIST list = 0;
148   IWPOOL *pool = iwpool_create_empty();
149 
150   char uuid[IW_UUID_STR_LEN + 1] = { 0 };
151   iwu_uuid4_fill(uuid);
152 
153   iwrc rc = ejdb_open(&opts, &db);
154   CU_ASSERT_EQUAL_FATAL(rc, 0);
155 
156   rc = ejdb_ensure_index(db, "users", "/uuid", EJDB_IDX_STR | EJDB_IDX_UNIQUE);
157   CU_ASSERT_EQUAL_FATAL(rc, 0);
158 
159   rc = jql_create(&q, "users", "/[uuid = :?] | upsert :?");
160   CU_ASSERT_EQUAL_FATAL(rc, 0);
161 
162   rc = jql_set_str(q, 0, 0, uuid);
163   CU_ASSERT_EQUAL_FATAL(rc, 0);
164 
165   rc = jbn_from_json("{}", &n, pool);
166   CU_ASSERT_EQUAL_FATAL(rc, 0);
167 
168   rc = jbn_add_item_str(n, "uuid", uuid, -1, 0, pool);
169   CU_ASSERT_EQUAL_FATAL(rc, 0);
170 
171   rc = jbn_add_item_str(n, "name", "a", -1, 0, pool);
172   CU_ASSERT_EQUAL_FATAL(rc, 0);
173 
174   rc = jql_set_json(q, 0, 1, n);
175   CU_ASSERT_EQUAL_FATAL(rc, 0);
176 
177   rc = ejdb_update(db, q);
178   CU_ASSERT_EQUAL_FATAL(rc, 0);
179 
180   rc = jbn_at(n, "/name", &n2);
181   CU_ASSERT_EQUAL_FATAL(rc, 0);
182 
183   n2->vptr = "b";
184   rc = jql_set_json(q, 0, 1, n);
185   CU_ASSERT_EQUAL_FATAL(rc, 0);
186 
187   rc = ejdb_update(db, q);
188   CU_ASSERT_EQUAL_FATAL(rc, 0);
189 
190   jql_destroy(&q);
191   rc = jql_create(&q, "users", "/* | /name");
192   CU_ASSERT_EQUAL_FATAL(rc, 0);
193 
194   rc = ejdb_list4(db, q, 0, 0, &list);
195   CU_ASSERT_EQUAL_FATAL(rc, 0);
196 
197   for (EJDB_DOC doc = list->first; doc; doc = doc->next, ++i) {
198     CU_ASSERT_PTR_NOT_NULL_FATAL(doc->node);
199     rc = jbn_at(doc->node, "/name", &n2);
200     CU_ASSERT_EQUAL_FATAL(rc, 0);
201     CU_ASSERT_STRING_EQUAL(n2->vptr, "b");
202   }
203   CU_ASSERT_EQUAL(i, 1);
204 
205   jql_destroy(&q);
206   ejdb_list_destroy(&list);
207   iwpool_destroy(pool);
208   rc = ejdb_close(&db);
209   CU_ASSERT_EQUAL_FATAL(rc, 0);
210 }
211 
main()212 int main() {
213   CU_pSuite pSuite = NULL;
214   if (CUE_SUCCESS != CU_initialize_registry()) {
215     return CU_get_error();
216   }
217   pSuite = CU_add_suite("ejdb_test4", init_suite, clean_suite);
218   if (NULL == pSuite) {
219     CU_cleanup_registry();
220     return CU_get_error();
221   }
222   if (  (NULL == CU_add_test(pSuite, "ejdb_test4_1", ejdb_test4_1))
223      || (NULL == CU_add_test(pSuite, "ejdb_test4_2", ejdb_test4_2))) {
224     CU_cleanup_registry();
225     return CU_get_error();
226   }
227   CU_basic_set_mode(CU_BRM_VERBOSE);
228   CU_basic_run_tests();
229   int ret = CU_get_error() || CU_get_number_of_failures();
230   CU_cleanup_registry();
231   return ret;
232 }
233