database: implement database_load() 71/131171/8
authorŁukasz Stelmach <l.stelmach@samsung.com>
Thu, 25 May 2017 15:38:45 +0000 (17:38 +0200)
committerŁukasz Stelmach <l.stelmach@samsung.com>
Fri, 9 Jun 2017 15:39:37 +0000 (17:39 +0200)
Change-Id: Ieb99efe60e1de90ee2103843dcae0ff14ea96104

src/core/database.c
src/core/database.h

index 2824cab990e097922b087b26ffc59f51ef7d65d1..5d06143b2bf7ffb1495ae55804875f6660eed4b3 100644 (file)
@@ -124,9 +124,66 @@ abort:
        return -1;
 }
 
-int database_load(bson *q, bson *b)
+int database_load(bson *bq, bson *br, int *nr)
 {
-       return -ENOTSUP;
+       EJDB *db = database_adapter.db;
+       EJCOLL *coll = database_adapter.coll;
+       EJQ *q = NULL;
+       TCLIST *r = NULL;
+       uint32_t count = 0;
+       int ret = -EINVAL;
+       int qflags = 0;
+
+       if (br == NULL)
+               qflags |= JBQRYCOUNT;
+
+       q = ejdbcreatequery(db, bq, NULL, 0, NULL);
+       if (q == NULL) {
+               log_error("ejdbcreatequery failed: %s", ejdberrmsg(ejdbecode(db)));
+               goto finish;
+       }
+
+       r = ejdbqryexecute(coll, q, &count, qflags, NULL);
+       if ((r == NULL) && (ejdbecode(db) != TCESUCCESS)) {
+               log_error("ejdbqryexecute failed: %s", ejdberrmsg(ejdbecode(db)));
+               goto finish;
+       }
+
+       log_debug("ejdbqueryexecute: %d records", count);
+
+       if (br != NULL)
+               bson_init(br);
+
+       if (r == NULL) {
+               ret = 0;
+               goto finish;
+       }
+
+       for (int i = 0; i < count; ++i) {
+               void *bsdata = TCLISTVALPTR(r, i);
+               bson val;
+               char key[11]; /* strlen(itoa(1<<31, key, 10)) => 10 */
+
+               bson_init_finished_data(&val, bsdata);
+               snprintf(key, sizeof(key), "%d", i);
+               bson_append_bson(br, key, &val);
+       }
+
+       ret = 0;
+finish:
+       if (r != NULL)
+               tclistdel(r);
+
+       if (q != NULL)
+               ejdbquerydel(q);
+
+       if (nr != NULL)
+               *nr = count;
+
+       if (br != NULL && ret == 0)
+               bson_finish(br);
+
+       return ret;
 }
 
 int database_new_oid(bson_oid_t *oid)
index 96cfd7cbc249ffa9881d2d0f57878c8d8f44cff8..8220e93830bc2e6bd4c47de98bf528ae47c97c66 100644 (file)
@@ -22,7 +22,7 @@
 #include <ejdb/bson.h>
 
 int database_store(bson *b, bson_oid_t *oid);
-int database_load(bson *q, bson *b);
+int database_load(bson *q, bson *b, int *nr);
 int database_new_oid(bson_oid_t *oid);
 
 #endif /* _DATABASE_H_ */