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)
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);
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);
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;
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) {
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;
int ret = -EINVAL;
int qflags = 0;
bson bq;
+ bson *bhints = NULL;
if (result == NULL)
qflags |= JBQRYCOUNT;
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;
ret = 0;
finish:
+ if (bhints != NULL)
+ bson_del(bhints);
+
bson_destroy(&bq);
if (r != NULL)
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");
return 0;
}
-int faultd_object_new(struct faultd_object **obj)
+int faultd_object_new_flags(struct faultd_object **obj, int flags)
{
assert(obj);
if (!*obj)
return -ENOMEM;
+ (*obj)->flags = flags;
return 0;
}
TYPE_OBJECT,
};
+enum faultd_object_flags {
+ FAULTD_FLAG_QUERY_MODE = 1
+};
+
#define OID_NOP_SIZE 4
typedef union {
bson_oid_t bson;
struct list_head children;
} val;
+ int flags;
struct uref uref;
struct list_head node;
};
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);
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;