database: implement database_load() 71/131171/12
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>
Mon, 12 Jun 2017 13:38:46 +0000 (15:38 +0200)
Change-Id: Ieb99efe60e1de90ee2103843dcae0ff14ea96104

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

index 2824cab990e097922b087b26ffc59f51ef7d65d1..493185233f51846b7399b4926cb23b948a9246e6 100644 (file)
@@ -124,9 +124,68 @@ abort:
        return -1;
 }
 
-int database_load(bson *q, bson *b)
+int database_load(bson *bq, bson *br, uint32_t *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: %u records", count);
+
+       if (br != NULL)
+               bson_init(br);
+
+       if (r == NULL) {
+               ret = 0;
+               goto finish;
+       }
+
+       for (uint32_t i = 0; i < count; ++i) {
+               void *bsdata = TCLISTVALPTR(r, i);
+               bson val;
+               char key[11]; /* strlen(itoa(1U<<31, key, 10)) => 10 */
+
+               bson_init_finished_data(&val, bsdata);
+               snprintf(key, sizeof(key), "%u", i);
+               bson_append_bson(br, key, &val);
+       }
+
+       ret = 0;
+finish:
+       if (r != NULL)
+               tclistdel(r);
+
+       if (q != NULL)
+               ejdbquerydel(q);
+
+       if (ret == 0) {
+               if (nr != NULL)
+                       *nr = count;
+
+               if (br != NULL)
+                       bson_finish(br);
+       }
+
+       return ret;
 }
 
 int database_new_oid(bson_oid_t *oid)
index 96cfd7cbc249ffa9881d2d0f57878c8d8f44cff8..6c54f2b0903dfec56460b432cfcfc927ef54b059 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, uint32_t *nr);
 int database_new_oid(bson_oid_t *oid);
 
 #endif /* _DATABASE_H_ */