From ea703e9e25343d1c0d91097de43393c900887002 Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Mon, 24 Sep 2012 05:09:41 +0300 Subject: [PATCH] resource: insert application classes into the database --- src/resource/application-class.c | 72 ++++++++++++++++++++++++++++++++++++++-- src/resource/config-api.h | 4 +-- src/resource/resource-owner.c | 6 ++-- 3 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/resource/application-class.c b/src/resource/application-class.c index 03f6e67..0dbcd1f 100644 --- a/src/resource/application-class.c +++ b/src/resource/application-class.c @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -39,11 +40,17 @@ #include #include +#include + #include "application-class.h" #include "resource-set.h" #include "zone.h" -#define CLASS_MAX 64 +#define CLASS_MAX 64 +#define NAME_LENGTH 24 + +#define CLASS_NAME_IDX 0 +#define PRIORITY_IDX 1 /* @@ -75,6 +82,11 @@ #define USAGE_KEY(p) (((uint32_t)(p) & USAGE_MASK) << USAGE_SHIFT) #define PRIORITY_KEY(p) (((uint32_t)(p) & PRIORITY_MASK) << PRIORITY_SHIFT) +typedef struct { + const char *class_name; + uint32_t priority; +} class_row_t; + static MRP_LIST_HOOK(class_list); static mrp_htbl_t *name_hash; @@ -85,8 +97,12 @@ static int add_to_name_hash(mrp_application_class_t *); static void remove_from_name_hash(mrp_application_class_t *); #endif +static mqi_handle_t get_database_table(void); +static void insert_into_application_class_table(const char *, uint32_t); + -mrp_application_class_t *mrp_resource_class_create(const char *name, uint32_t pri) +mrp_application_class_t *mrp_application_class_create(const char *name, + uint32_t pri) { mrp_application_class_t *class; mrp_list_hook_t *insert_before, *clhook, *n; @@ -134,6 +150,8 @@ mrp_application_class_t *mrp_resource_class_create(const char *name, uint32_t pr add_to_name_hash(class); + insert_into_application_class_table(class->name, class->priority); + return class; } @@ -405,6 +423,56 @@ static void remove_from_name_hash(mrp_application_class_t *class) } #endif + +static mqi_handle_t get_database_table(void) +{ + MQI_COLUMN_DEFINITION_LIST(coldefs, + MQI_COLUMN_DEFINITION( "name" , MQI_VARCHAR(NAME_LENGTH), 0 ), + MQI_COLUMN_DEFINITION( "priority" , MQI_UNSIGNED , 0 ) + ); + + MQI_INDEX_DEFINITION(indexdef, + MQI_INDEX_COLUMN("priority") + ); + + static mqi_handle_t table = MQI_HANDLE_INVALID; + static char *name = "application_classes"; + + if (table == MQI_HANDLE_INVALID) { + mqi_open(); + + table = MQI_CREATE_TABLE(name, MQI_TEMPORARY, coldefs, indexdef); + + if (table == MQI_HANDLE_INVALID) + mrp_log_error("Can't create table '%s': %s", name,strerror(errno)); + } + + return table; +} + +static void insert_into_application_class_table(const char *name, uint32_t pri) +{ + MQI_COLUMN_SELECTION_LIST(cols, + MQI_COLUMN_SELECTOR(CLASS_NAME_IDX, class_row_t, class_name), + MQI_COLUMN_SELECTOR(PRIORITY_IDX , class_row_t, priority ) + ); + + class_row_t row; + mqi_handle_t table = get_database_table(); + class_row_t *rows[2] = {&row, NULL}; + + MRP_ASSERT(name, "invalid argument"); + MRP_ASSERT(table != MQI_HANDLE_INVALID, "database problem"); + + row.class_name = name; + row.priority = pri; + + if (MQI_INSERT_INTO(table, cols, rows) != 1) + mrp_log_error("Failed to add application class '%s' to database",name); +} + + + /* * Local Variables: * c-basic-offset: 4 diff --git a/src/resource/config-api.h b/src/resource/config-api.h index d0de33d..d723593 100644 --- a/src/resource/config-api.h +++ b/src/resource/config-api.h @@ -35,8 +35,8 @@ int mrp_zone_definition_create(mrp_attr_def_t *attrdefs); uint32_t mrp_zone_create(const char *name, mrp_attr_t *attrs); -mrp_application_class_t *mrp_resource_class_create(const char *name, - uint32_t priority); +mrp_application_class_t *mrp_application_class_create(const char *name, + uint32_t priority); int mrp_application_class_print(char *buf, int len); diff --git a/src/resource/resource-owner.c b/src/resource/resource-owner.c index 65465cc..a489413 100644 --- a/src/resource/resource-owner.c +++ b/src/resource/resource-owner.c @@ -88,9 +88,9 @@ static void set_attr_descriptors(mqi_column_desc_t *, mrp_resource_t *); int mrp_resource_owner_create_database_table(mrp_resource_def_t *rdef) { MQI_COLUMN_DEFINITION_LIST(base_coldefs, - MQI_COLUMN_DEFINITION( "zone_id" , MQI_UNSIGNED , 0 ), - MQI_COLUMN_DEFINITION( "zone_name" , MQI_VARCHAR(NAME_LENGTH), 0 ), - MQI_COLUMN_DEFINITION( "resource_class", MQI_VARCHAR(NAME_LENGTH), 0 ) + MQI_COLUMN_DEFINITION("zone_id" , MQI_UNSIGNED ,0), + MQI_COLUMN_DEFINITION("zone_name" , MQI_VARCHAR(NAME_LENGTH) ,0), + MQI_COLUMN_DEFINITION("application_class", MQI_VARCHAR(NAME_LENGTH),0) ); MQI_INDEX_DEFINITION(indexdef, -- 2.7.4