Add support for more advanced querying database 24/151724/8
authorKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 21 Sep 2017 15:14:16 +0000 (17:14 +0200)
committerKonrad Kuchciak <k.kuchciak@samsung.com>
Thu, 12 Oct 2017 10:34:01 +0000 (12:34 +0200)
Query can now be expanded with another faultd_object called "hints"
which
provides additional querying options like ex. sorting.

Change-Id: I7167e742b16653e37d36a0d310388523c15ab50d
Signed-off-by: Konrad Kuchciak <k.kuchciak@samsung.com>
src/core/database.c
src/core/database.h
src/database/database_nop.c
src/database/ejdb.c
src/decision_makers/standard_fault_dm.c
src/util/common.c
src/util/common.h
tests/unit/test_dbadapter.c

index bb83a943aeba333abd999d90821db29ae287e02b..eac6024bd5ca3c4707ae697abd298fd30c806a3f 100644 (file)
@@ -53,12 +53,13 @@ int database_store(struct faultd_object *obj, faultd_oid_t *oid)
        return database_adapter->store(database_adapter, obj, oid);
 }
 
-int database_load(struct faultd_object *query, struct faultd_object *result, uint32_t *nr)
+int database_load(struct faultd_object *query, struct faultd_object *hints,
+                                 struct faultd_object *result, uint32_t *nr)
 {
        if (!database_adapter)
                return -ENOSYS;
 
-       return database_adapter->load(database_adapter, query, result, nr);
+       return database_adapter->load(database_adapter, query, hints, result, nr);
 }
 
 int database_new_oid(faultd_oid_t *oid)
index 8e50fbeeee296e067e0c45707c35e9359890ee2f..e866d4ed2d350f82002dccbc6ee72a33b10b2f59 100644 (file)
@@ -37,8 +37,8 @@ struct faultd_database_adapter {
                                          faultd_oid_t *oid, struct faultd_object *result);
 
        int (*load)(struct faultd_database_adapter *adapter,
-                               struct faultd_object *query, struct faultd_object *result,
-                               uint32_t *nr);
+                               struct faultd_object *query, struct faultd_object *hints,
+                               struct faultd_object *result, uint32_t *nr);
 
        int (*new_oid)(faultd_oid_t *oid);
 
@@ -56,7 +56,8 @@ struct faultd_database_adapter *faultd_get_database_adapter(void);
 int faultd_set_database_adapter(struct faultd_database_adapter *adapter);
 int database_store(struct faultd_object *obj, faultd_oid_t *oid);
 int database_get_by_oid(faultd_oid_t *oid, struct faultd_object *result);
-int database_load(struct faultd_object *query, struct faultd_object *result, uint32_t *nr);
+int database_load(struct faultd_object *query, struct faultd_object *hints,
+                                 struct faultd_object *result, uint32_t *nr);
 int database_new_oid(faultd_oid_t *oid);
 int database_get_well_known_oid(const char *name, faultd_oid_t *oid);
 bool database_is_oid_valid(faultd_oid_t *oid);
index a06169cde88a2324c1ea7776a477a254368e86af..f088533503411bc89717a78c3cf1e889bc09e9e3 100644 (file)
@@ -49,6 +49,7 @@ static int nop_get_by_oid(struct faultd_database_adapter *adapter,
 
 static int nop_load(struct faultd_database_adapter *adapter,
                                        struct faultd_object *query,
+                                       struct faultd_object *hints,
                                        struct faultd_object *result, uint32_t *nr)
 {
        *nr = 0;
index 13652526a740327daf1fb5f3e010caa0678e1627..e69dfc83d074bbdd5ecb5061424abfc6d4bcebac 100644 (file)
@@ -96,7 +96,10 @@ static int faultd_object_to_bson(struct faultd_object *obj, bson *out)
        if (obj->type != TYPE_OBJECT)
                return -EINVAL;
 
-       bson_init(out);
+       if (obj->flags & FAULTD_FLAG_QUERY_MODE)
+               bson_init_as_query(out);
+       else
+               bson_init(out);
 
        list_for_each_entry(child, &obj->val.children, node) {
                switch (child->type) {
@@ -304,7 +307,8 @@ static int ejdb_get_by_oid(struct faultd_database_adapter *adapter, faultd_oid_t
        return ret;
 }
 
-static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_object *query, struct faultd_object *result, uint32_t *nr)
+static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_object *query,
+                                        struct faultd_object *hints, struct faultd_object *result, uint32_t *nr)
 {
        struct ejdb_adapter *da = to_ejdb_adapter(adapter);
        EJDB *db = da->db;
@@ -315,6 +319,7 @@ static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_obje
        int ret = -EINVAL;
        int qflags = 0;
        bson bq;
+       bson *bhints = NULL;
 
        if (result == NULL)
                qflags |= JBQRYCOUNT;
@@ -323,7 +328,19 @@ static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_obje
        if (ret < 0)
                return ret;
 
-       q = ejdbcreatequery(db, &bq, NULL, 0, NULL);
+       if (hints) {
+               bhints = bson_create();
+               if (bhints == NULL) {
+                       log_error("Unable to create bson object");
+                       goto finish;
+               }
+               ret = faultd_object_to_bson(hints, bhints);
+               if (ret < 0)
+                       goto finish;
+       }
+
+       q = ejdbcreatequery(db, &bq, NULL, 0, bhints);
+
        if (q == NULL) {
                log_error("ejdbcreatequery failed: %s", ejdberrmsg(ejdbecode(db)));
                goto finish;
@@ -361,6 +378,9 @@ static int ejdb_load(struct faultd_database_adapter *adapter, struct faultd_obje
 
        ret = 0;
 finish:
+       if (bhints != NULL)
+               bson_del(bhints);
+
        bson_destroy(&bq);
 
        if (r != NULL)
index 1678467549e3518ea09863984b15f97139577694..5eb9e69f03dd6bdf63e1cd473dccbb11fcf12670 100644 (file)
@@ -81,7 +81,7 @@ static int sf_make_decision(struct faultd_event_handler *handler)
        faultd_object_append_object(query, SYSD_SERVICE, service_obj);
        faultd_object_unref(service_obj);
 
-       ret = database_load(query, NULL, &nr);
+       ret = database_load(query, NULL, NULL, &nr);
        faultd_object_unref(query);
        if (ret < 0) {
                log_error("Unable to load database");
index fdb2af88b9b8fd14adb61cbef64b148a269d6674..560ece70bd3c45df9290e230882435d87b448434 100644 (file)
@@ -82,7 +82,7 @@ int faultd_object_fill_empty(struct faultd_object *obj)
        return 0;
 }
 
-int faultd_object_new(struct faultd_object **obj)
+int faultd_object_new_flags(struct faultd_object **obj, int flags)
 {
        assert(obj);
 
@@ -90,6 +90,7 @@ int faultd_object_new(struct faultd_object **obj)
        if (!*obj)
                return -ENOMEM;
 
+       (*obj)->flags = flags;
        return 0;
 }
 
index e64549ba625e20eb89c74a0dc08a51898f6d83c1..2b480f31b2bab1a9e6f90f9d8f9c77d6422558fe 100644 (file)
@@ -74,6 +74,10 @@ enum faultd_object_type {
        TYPE_OBJECT,
 };
 
+enum faultd_object_flags {
+       FAULTD_FLAG_QUERY_MODE = 1
+};
+
 #define OID_NOP_SIZE 4
 typedef union {
        bson_oid_t bson;
@@ -94,6 +98,7 @@ struct faultd_object {
                struct list_head children;
        } val;
 
+       int flags;
        struct uref uref;
        struct list_head node;
 };
@@ -115,7 +120,13 @@ static inline struct faultd_object *faultd_object_ref(struct faultd_object *obj)
        return obj;
 }
 
-int faultd_object_new(struct faultd_object **obj);
+int faultd_object_new_flags(struct faultd_object **obj, int flags);
+
+static inline int faultd_object_new(struct faultd_object **obj)
+{
+       return faultd_object_new_flags(obj, 0);
+}
+
 void faultd_object_init(struct faultd_object *obj);
 void faultd_object_destroy(struct faultd_object *obj);
 
index 5b546100e8c472d8aac3ff2b5280568ecffd848d..9b38eeae32509580b114fdbc05253000294925c8 100644 (file)
@@ -51,6 +51,7 @@ static int testdb_get_by_oid(struct faultd_database_adapter *adapter,
 
 static int testdb_load(struct faultd_database_adapter *adapter,
                                        struct faultd_object *query,
+                                       struct faultd_object *hints,
                                        struct faultd_object *result, uint32_t *nr)
 {
        *nr = 0;