[Openais] [PATCH 1/4] Add value types to objdb keys.

Steven Dake sdake at redhat.com
Fri Oct 9 10:51:04 PDT 2009


patck looks pretty good few comments inline

please fix the tabbing though its painful :)

Regards
-steve

On Wed, 2009-09-23 at 14:40 +1200, angus salkeld wrote:
> This allows you to create a key with a know type.
> And then get the type with the key value.
> 
> Signed-off-by: Angus Salkeld <angus.salkeld at alliedtelesis.co.nz>
> ---
>  exec/apidef.c                     |    3 +
>  exec/coroparse.c                  |    5 +-
>  exec/objdb.c                      |  115 ++++++++++++++++++----
>  exec/service.c                    |   20 ++--
>  include/corosync/confdb.h         |   37 +++++++
>  include/corosync/engine/coroapi.h |   36 +++++++
>  include/corosync/engine/objdb.h   |   35 +++++++
>  include/corosync/ipc_confdb.h     |   28 +++++-
>  lib/confdb.c                      |  200 +++++++++++++++++++++++++++++++++++++
>  lib/sa-confdb.c                   |   60 +++++++++++
>  lib/sa-confdb.h                   |   16 +++
>  services/confdb.c                 |  107 ++++++++++++++++++++
>  tools/corosync-objctl.c           |   65 ++++++++++---
>  13 files changed, 677 insertions(+), 50 deletions(-)
> 
> diff --git a/exec/apidef.c b/exec/apidef.c
> index a8ae751..9916d62 100644
> --- a/exec/apidef.c
> +++ b/exec/apidef.c
> @@ -172,6 +172,9 @@ void apidef_init (struct objdb_iface_ver0 *objdb) {
>  	apidef_corosync_api_v1.object_reload_config = objdb->object_reload_config;
>  	apidef_corosync_api_v1.object_key_increment = objdb->object_key_increment;
>  	apidef_corosync_api_v1.object_key_decrement = objdb->object_key_decrement;
> +	apidef_corosync_api_v1.object_key_create_ext = objdb->object_key_create_ext;
> +	apidef_corosync_api_v1.object_key_get_ext = objdb->object_key_get_ext;
> +	apidef_corosync_api_v1.object_key_iter_ext = objdb->object_key_iter_ext;
>  }
>  

instead of _ext can we call these _typed?

>  struct corosync_api_v1 *apidef_get (void)
> diff --git a/exec/coroparse.c b/exec/coroparse.c
> index 5c4b374..2a3a5ff 100644
> --- a/exec/coroparse.c
> +++ b/exec/coroparse.c
> @@ -172,9 +172,8 @@ static int parse_section(FILE *fp,
>  				    key, error_string))
>  					    return -1;
>  			}
> -			objdb->object_key_create (parent_handle, key,
> -				strlen (key),
> -				value, strlen (value) + 1);
> +			objdb->object_key_create_ext (parent_handle, key,
> +				value, strlen (value) + 1, OBJDB_VALUETYPE_STRING);
>  		}
>  
>  		if ((loc = strchr_rs (line, '}'))) {
> diff --git a/exec/objdb.c b/exec/objdb.c
> index 33688cb..9ae4c30 100644
> --- a/exec/objdb.c
> +++ b/exec/objdb.c
> @@ -53,6 +53,7 @@ struct object_key {
>  	size_t key_len;
>  	void *value;
>  	size_t value_len;
> +	objdb_value_types_t value_type;
>  	struct list_head list;
>  };
>  
> @@ -498,12 +499,12 @@ error_exit:
>  	return (-1);
>  }
>  
> -static int object_key_create (
> +static int object_key_create_ext(
>  	hdb_handle_t object_handle,
> -	const void *key_name,
> -	size_t key_len,
> +	const char *key_name,
>  	const void *value,
> -	size_t value_len)
> +	size_t value_len,
> +	objdb_value_types_t value_type)
>  {
>  	struct object_instance *instance;
>  	struct object_key *object_key;
> @@ -511,6 +512,7 @@ static int object_key_create (
>  	struct list_head *list;
>  	int found = 0;
>  	int i;
> +	size_t key_len = strlen(key_name);
>  
>  	objdb_rdlock();
>  
> @@ -574,11 +576,11 @@ static int object_key_create (
>  		if (object_key == 0) {
>  			goto error_put;
>  		}
> -		object_key->key_name = malloc (key_len);
> +		object_key->key_name = malloc (key_len + 1);
>  		if (object_key->key_name == 0) {
>  			goto error_put_object;
>  		}
> -		memcpy (object_key->key_name, key_name, key_len);
> +		memcpy (object_key->key_name, key_name, key_len + 1);
>  		list_init (&object_key->list);
>  		list_add_tail (&object_key->list, &instance->key_head);
>  	}
> @@ -590,6 +592,7 @@ static int object_key_create (
>  
>  	object_key->key_len = key_len;
>  	object_key->value_len = value_len;
> +	object_key->value_type = value_type;
>  
>  	object_key_changed_notification(object_handle, key_name, key_len,
>  					value, value_len, OBJECT_KEY_CREATED);
> @@ -610,6 +613,17 @@ error_exit:
>  	return (-1);
>  }
>  
> +static int object_key_create (
> +	hdb_handle_t object_handle,
> +	const void *key_name,
> +	size_t key_len,
> +	const void *value,
> +	size_t value_len)
> +{
> +	return object_key_create_ext (object_handle, key_name,
> +					value, value_len, OBJDB_VALUETYPE_ANY);
> +}
> +
>  static int _clear_object(struct object_instance *instance)
>  {
>  	struct list_head *list;
> @@ -861,18 +875,19 @@ error_exit:
>  	return (-1);
>  }
>  
> -static int object_key_get (
> +static int object_key_get_ext (
>  	hdb_handle_t object_handle,
> -	const void *key_name,
> -	size_t key_len,
> +	const char *key_name,
>  	void **value,
> -	size_t *value_len)
> +	size_t *value_len,
> +	objdb_value_types_t * type)
>  {
>  	unsigned int res = 0;
>  	struct object_instance *instance;
>  	struct object_key *object_key = NULL;
>  	struct list_head *list;
>  	int found = 0;
> +	size_t key_len = strlen(key_name);
>  
>  	objdb_rdlock();
>  	res = hdb_handle_get (&object_instance_database,
> @@ -896,6 +911,7 @@ static int object_key_get (
>  		if (value_len) {
>  			*value_len = object_key->value_len;
>  		}
> +		*type = object_key->value_type;
>  	}
>  	else {
>  		res = -1;
> @@ -910,6 +926,19 @@ error_exit:
>  	return (-1);
>  }
>  
> +static int object_key_get (
> +	hdb_handle_t object_handle,
> +	const void *key_name,
> +	size_t key_len,
> +	void **value,
> +	size_t *value_len)
> +{
> +	objdb_value_types_t t;
> +	return object_key_get_ext(object_handle,
> +							  key_name,
> +							  value, value_len, &t);
> +}
> +
>  static int object_key_increment (
>  	hdb_handle_t object_handle,
>  	const void *key_name,
> @@ -1205,8 +1234,40 @@ static int _dump_object(struct object_instance *instance, FILE *file, int depth)
>  
>  		memcpy(stringbuf1, object_key->key_name, object_key->key_len);
>  		stringbuf1[object_key->key_len] = '\0';
> -		memcpy(stringbuf2, object_key->value, object_key->value_len);
> -		stringbuf2[object_key->value_len] = '\0';
> +
> +
> +		switch (object_key->value_type) {
> +			case OBJDB_VALUETYPE_INT16:
> +				snprintf (stringbuf2, sizeof(int), "%hd",
> +						  *(unsigned int*)object_key->value);
> +				break;
> +			case OBJDB_VALUETYPE_UINT16:
> +				snprintf (stringbuf2, sizeof(int), "%hu",
> +						  *(unsigned int*)object_key->value);
> +				break;
> +			case OBJDB_VALUETYPE_INT32:
> +				snprintf (stringbuf2, sizeof(int), "%d",
> +						  *(int*)object_key->value);
> +				break;
> +			case OBJDB_VALUETYPE_UINT32:
> +				snprintf (stringbuf2, sizeof(int), "%u",
> +						  *(unsigned int*)object_key->value);
> +				break;
> +			case OBJDB_VALUETYPE_INT64:
> +				snprintf (stringbuf2, sizeof(int), "%ld",
> +						  *(long int*)object_key->value);
> +				break;
> +			case OBJDB_VALUETYPE_UINT64:
> +				snprintf (stringbuf2, sizeof(int), "%lu",
> +						  *(unsigned long int*)object_key->value);
> +				break;
> +			default:
> +			case OBJDB_VALUETYPE_STRING:
> +			case OBJDB_VALUETYPE_ANY:
> +				memcpy(stringbuf2, object_key->value, object_key->value_len);
> +				stringbuf2[object_key->value_len] = '\0';
> +				break;
> +		}
>  
>  		for (i=0; i<depth+1; i++)
>  			fprintf(file, "    ");
> @@ -1255,12 +1316,11 @@ error_exit:
>  	return (-1);
>  }
>  
> -
> -static int object_key_iter(hdb_handle_t parent_object_handle,
> -			   void **key_name,
> -			   size_t *key_len,
> +static int object_key_iter_ext (hdb_handle_t parent_object_handle,
> +			   char **key_name,
>  			   void **value,
> -			   size_t *value_len)
> +			   size_t *value_len,
> +			   objdb_value_types_t *type)
>  {
>  	unsigned int res;
>  	struct object_instance *instance;
> @@ -1284,9 +1344,8 @@ static int object_key_iter(hdb_handle_t parent_object_handle,
>  	instance->iter_key_list = list;
>  	if (found) {
>  		*key_name = find_key->key_name;
> -		if (key_len)
> -			*key_len = find_key->key_len;
>  		*value = find_key->value;
> +		*type = find_key->value_type;
>  		if (value_len)
>  			*value_len = find_key->value_len;
>  		res = 0;
> @@ -1304,6 +1363,21 @@ error_exit:
>  	return (-1);
>  }
>  
> +static int object_key_iter(hdb_handle_t parent_object_handle,
> +			   void **key_name,
> +			   size_t *key_len,
> +			   void **value,
> +			   size_t *value_len)
> +{
> +	objdb_value_types_t t;
> +	int ret;
> +	char *str;
> +	ret = object_key_iter_ext (parent_object_handle, (char**)key_name, value, value_len, &t);
> +	str = *key_name;
> +	*key_len = strlen(str);
> +	return ret;
> +}
> +
>  static int object_key_iter_from(hdb_handle_t parent_object_handle,
>  				hdb_handle_t start_pos,
>  				void **key_name,
> @@ -1599,6 +1673,9 @@ struct objdb_iface_ver0 objdb_iface = {
>  	.object_reload_config   = object_reload_config,
>  	.object_key_increment   = object_key_increment,
>  	.object_key_decrement   = object_key_decrement,
> +	.object_key_create_ext	= object_key_create_ext,
> +	.object_key_get_ext		= object_key_get_ext,
> +	.object_key_iter_ext	= object_key_iter_ext,
>  };
>  
>  struct lcr_iface objdb_iface_ver0[1] = {
> diff --git a/exec/service.c b/exec/service.c
> index ea58efb..b8933de 100644
> --- a/exec/service.c
> +++ b/exec/service.c
> @@ -179,29 +179,25 @@ unsigned int corosync_service_link_and_init (
>  		"service",
>  		strlen ("service"));
>  
> -	corosync_api->object_key_create (object_service_handle,
> +	corosync_api->object_key_create_ext (object_service_handle,
>  		"name",
> -		strlen ("name"),
>  		service_name,
> -		strlen (service_name) + 1);
> +		strlen (service_name) + 1, OBJDB_VALUETYPE_STRING);
>  
> -	corosync_api->object_key_create (object_service_handle,
> +	corosync_api->object_key_create_ext (object_service_handle,
>  		"ver",
> -		strlen ("ver"),
>  		&service_ver,
> -		sizeof (service_ver));
> +		sizeof (service_ver), OBJDB_VALUETYPE_UINT32);
>  
> -	res = corosync_api->object_key_create (object_service_handle,
> +	res = corosync_api->object_key_create_ext (object_service_handle,
>  		"handle",
> -		strlen ("handle"),
>  		&handle,
> -		sizeof (handle));
> +		sizeof (handle), OBJDB_VALUETYPE_UINT64);
>  
> -	corosync_api->object_key_create (object_service_handle,
> +	corosync_api->object_key_create_ext (object_service_handle,
>  		"service_id",
> -		strlen ("service_id"),
>  		&service->id,
> -		sizeof (service->id));
> +		sizeof (service->id), OBJDB_VALUETYPE_UINT16);
>  
>  	log_printf (LOGSYS_LEVEL_NOTICE, "Service initialized '%s'\n", service->name);
>  	return (res);
> diff --git a/include/corosync/confdb.h b/include/corosync/confdb.h
> index e0797bb..6fabc8d 100644
> --- a/include/corosync/confdb.h
> +++ b/include/corosync/confdb.h
> @@ -51,6 +51,19 @@ typedef uint64_t confdb_handle_t;
>  #define OBJECT_PARENT_HANDLE 0xFFFFFFFF00000000ULL
>  
>  typedef enum {
> +	CONFDB_VALUETYPE_INT16,
> +	CONFDB_VALUETYPE_UINT16,
> +	CONFDB_VALUETYPE_INT32,
> +	CONFDB_VALUETYPE_UINT32,
> +	CONFDB_VALUETYPE_INT64,
> +	CONFDB_VALUETYPE_UINT64,
> +	CONFDB_VALUETYPE_FLOAT,
> +	CONFDB_VALUETYPE_DOUBLE,
> +	CONFDB_VALUETYPE_STRING,
> +	CONFDB_VALUETYPE_ANY,
> +} confdb_value_types_t;
> +
> +typedef enum {
>  	CONFDB_TRACK_DEPTH_ONE,
>  	CONFDB_TRACK_DEPTH_RECURSIVE
>  } confdb_track_depth_t;
> @@ -181,6 +194,14 @@ cs_error_t confdb_key_create (
>  	const void *value,
>  	size_t value_len);
>  
> +cs_error_t confdb_key_create_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	const void *value,
> +	size_t value_len,
> +	confdb_value_types_t type);
> +
>  cs_error_t confdb_key_delete (
>  	confdb_handle_t handle,
>  	hdb_handle_t parent_object_handle,
> @@ -200,6 +221,14 @@ cs_error_t confdb_key_get (
>  	void *value,
>  	size_t *value_len);
>  
> +cs_error_t confdb_key_get_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	confdb_value_types_t *type);
> +

get_typed ?

>  cs_error_t confdb_key_replace (
>  	confdb_handle_t handle,
>  	hdb_handle_t parent_object_handle,
> @@ -275,6 +304,14 @@ cs_error_t confdb_key_iter (
>  	void *value,
>  	size_t *value_len);
>  
> +cs_error_t confdb_key_iter_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	confdb_value_types_t *type);
> +
>  /*
>   * Get/set context variable
>   */
> diff --git a/include/corosync/engine/coroapi.h b/include/corosync/engine/coroapi.h
> index e0d800b..b13d652 100644
> --- a/include/corosync/engine/coroapi.h
> +++ b/include/corosync/engine/coroapi.h
> @@ -170,6 +170,19 @@ struct object_key_valid {
>  /* deprecated */
>  
>  typedef enum {
> +	OBJDB_VALUETYPE_INT16,
> +	OBJDB_VALUETYPE_UINT16,
> +	OBJDB_VALUETYPE_INT32,
> +	OBJDB_VALUETYPE_UINT32,
> +	OBJDB_VALUETYPE_INT64,
> +	OBJDB_VALUETYPE_UINT64,
> +	OBJDB_VALUETYPE_FLOAT,
> +	OBJDB_VALUETYPE_DOUBLE,
> +	OBJDB_VALUETYPE_STRING,
> +	OBJDB_VALUETYPE_ANY,
> +} objdb_value_types_t;
> +
> +typedef enum {
>  	OBJECT_TRACK_DEPTH_ONE,
>  	OBJECT_TRACK_DEPTH_RECURSIVE
>  } object_track_depth_t;
> @@ -590,6 +603,29 @@ struct corosync_api_v1 {
>  	 * Please avoid using any of coropoll apis in your service engines.
>  	 */
>  	hdb_handle_t (*poll_handle_get) (void);
> +
> +
> +	int (*object_key_create_ext) (
> +		hdb_handle_t object_handle,
> +		const char *key_name,
> +		const void *value,
> +		size_t value_len,
> +		objdb_value_types_t type);
> +
> +	int (*object_key_get_ext) (
> +		hdb_handle_t object_handle,
> +		const char *key_name,
> +		void **value,
> +		size_t *value_len,
> +		objdb_value_types_t *type);
> +
> +	int (*object_key_iter_ext) (
> +		hdb_handle_t parent_object_handle,
> +		void **key_name,
> +		size_t *key_len,
> +		void **value,
> +		size_t *value_len,
> +		objdb_value_types_t *type);
>  };

this looks good

>  
>  #define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) )
> diff --git a/include/corosync/engine/objdb.h b/include/corosync/engine/objdb.h
> index d26b6f7..6df6863 100644
> --- a/include/corosync/engine/objdb.h
> +++ b/include/corosync/engine/objdb.h
> @@ -42,6 +42,19 @@
>  #include <corosync/hdb.h>
>  
>  typedef enum {
> +	OBJDB_VALUETYPE_INT16,
> +	OBJDB_VALUETYPE_UINT16,
> +	OBJDB_VALUETYPE_INT32,
> +	OBJDB_VALUETYPE_UINT32,
> +	OBJDB_VALUETYPE_INT64,
> +	OBJDB_VALUETYPE_UINT64,
> +	OBJDB_VALUETYPE_FLOAT,
> +	OBJDB_VALUETYPE_DOUBLE,
> +	OBJDB_VALUETYPE_STRING,
> +	OBJDB_VALUETYPE_ANY,
> +} objdb_value_types_t;
> +
> +typedef enum {
>  	OBJECT_TRACK_DEPTH_ONE,
>  	OBJECT_TRACK_DEPTH_RECURSIVE
>  } object_track_depth_t;
> @@ -235,6 +248,28 @@ struct objdb_iface_ver0 {
>  		const void *key_name,
>  		size_t key_len,
>  		unsigned int *value);
> +
> +	int (*object_key_create_ext) (
> +		hdb_handle_t object_handle,
> +		const char *key_name,
> +		const void *value,
> +		size_t value_len,
> +		objdb_value_types_t type);
> +
> +	int (*object_key_get_ext) (
> +		hdb_handle_t object_handle,
> +		const char *key_name,
> +		void **value,
> +		size_t *value_len,
> +		objdb_value_types_t *type);
> +
> +	int (*object_key_iter_ext) (
> +		hdb_handle_t parent_object_handle,
> +		void **key_name,
> +		size_t *key_len,
> +		void **value,
> +		size_t *value_len,
> +		objdb_value_types_t *type);
>  };
>  
>  #endif /* OBJDB_H_DEFINED */
> diff --git a/include/corosync/ipc_confdb.h b/include/corosync/ipc_confdb.h
> index c5c7c9b..2e6b42a 100644
> --- a/include/corosync/ipc_confdb.h
> +++ b/include/corosync/ipc_confdb.h
> @@ -55,7 +55,10 @@ enum req_confdb_types {
>  	MESSAGE_REQ_CONFDB_RELOAD = 13,
>  	MESSAGE_REQ_CONFDB_OBJECT_FIND_DESTROY = 14,
>  	MESSAGE_REQ_CONFDB_KEY_INCREMENT = 15,
> -	MESSAGE_REQ_CONFDB_KEY_DECREMENT = 16
> +	MESSAGE_REQ_CONFDB_KEY_DECREMENT = 16,
> +	MESSAGE_REQ_CONFDB_KEY_CREATE_EXT = 17,
> +	MESSAGE_REQ_CONFDB_KEY_GET_EXT = 18,
> +	MESSAGE_REQ_CONFDB_KEY_ITER_EXT = 19,
>  };
>  
>  enum res_confdb_types {
> @@ -78,7 +81,9 @@ enum res_confdb_types {
>  	MESSAGE_RES_CONFDB_RELOAD = 16,
>  	MESSAGE_RES_CONFDB_OBJECT_FIND_DESTROY = 17,
>  	MESSAGE_RES_CONFDB_KEY_INCREMENT = 18,
> -	MESSAGE_RES_CONFDB_KEY_DECREMENT = 19
> +	MESSAGE_RES_CONFDB_KEY_DECREMENT = 19,
> +	MESSAGE_RES_CONFDB_KEY_GET_EXT = 20,
> +	MESSAGE_RES_CONFDB_KEY_ITER_EXT = 21,
>  };
>  
> 
> @@ -116,6 +121,14 @@ struct req_lib_confdb_key_create {
>  	mar_name_t value __attribute__((aligned(8)));
>  };
>  
> +struct req_lib_confdb_key_create_ext {
> +	coroipc_request_header_t header __attribute__((aligned(8)));
> +	mar_uint64_t object_handle __attribute__((aligned(8)));
> +	mar_name_t key_name __attribute__((aligned(8)));
> +	mar_name_t value __attribute__((aligned(8)));
> +	mar_int32_t type __attribute__((aligned(8)));
> +};
> +
>  struct req_lib_confdb_key_delete {
>  	coroipc_request_header_t header __attribute__((aligned(8)));
>  	mar_uint64_t object_handle __attribute__((aligned(8)));
> @@ -168,6 +181,12 @@ struct res_lib_confdb_key_iter {
>  	mar_name_t key_name __attribute__((aligned(8)));
>  	mar_name_t value __attribute__((aligned(8)));
>  };
> +struct res_lib_confdb_key_iter_ext {
> +	coroipc_response_header_t header __attribute__((aligned(8)));
> +	mar_name_t key_name __attribute__((aligned(8)));
> +	mar_name_t value __attribute__((aligned(8)));
> +	mar_int32_t type __attribute__((aligned(8)));
> +};
>  
>  struct req_lib_confdb_key_get {
>  	coroipc_request_header_t header __attribute__((aligned(8)));
> @@ -184,6 +203,11 @@ struct res_lib_confdb_key_get {
>  	coroipc_response_header_t header __attribute__((aligned(8)));
>  	mar_name_t value __attribute__((aligned(8)));
>  };
> +struct res_lib_confdb_key_get_ext {
> +	coroipc_response_header_t header __attribute__((aligned(8)));
> +	mar_name_t value __attribute__((aligned(8)));
> +	mar_int32_t type __attribute__((aligned(8)));
> +};
>  
>  struct res_lib_confdb_key_incdec {
>  	coroipc_response_header_t header __attribute__((aligned(8)));
> diff --git a/lib/confdb.c b/lib/confdb.c
> index 8a0d159..6e72014 100644
> --- a/lib/confdb.c
> +++ b/lib/confdb.c
> @@ -722,6 +722,68 @@ error_exit:
>  	return (error);
>  }
>  
> +
> +cs_error_t confdb_key_create_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	const void *value,
> +	size_t value_len,
> +	confdb_value_types_t type)
> +{
> +	cs_error_t error;
> +	struct confdb_inst *confdb_inst;
> +	struct iovec iov;
> +	struct req_lib_confdb_key_create_ext request;
> +	coroipc_response_header_t res;
> +
> +	error = hdb_error_to_cs(hdb_handle_get (&confdb_handle_t_db, handle, (void *)&confdb_inst));
> +	if (error != CS_OK) {
> +		return (error);
> +	}
> +
> +	if (confdb_inst->standalone) {
> +		error = CS_OK;
> +
> +		if (confdb_sa_key_create_ext(parent_object_handle,
> +					 key_name, value, value_len, type))
> +			error = CS_ERR_ACCESS;
> +		goto error_exit;
> +	}
> +
> +	request.header.size = sizeof (struct req_lib_confdb_key_create_ext);
> +	request.header.id = MESSAGE_REQ_CONFDB_KEY_CREATE_EXT;
> +	request.object_handle = parent_object_handle;
> +	request.key_name.length = strlen(key_name)+1;
> +	memcpy(request.key_name.value, key_name, request.key_name.length);
> +	memcpy(request.value.value, value, value_len);
> +	request.value.length = value_len;
> +	request.type = type;
> +
> +	iov.iov_base = (char *)&request;
> +	iov.iov_len = sizeof (struct req_lib_confdb_key_create_ext);
> +
> +	error = coroipcc_msg_send_reply_receive (
> +		confdb_inst->handle,
> +		&iov,
> +		1,
> +		&res,
> +		sizeof (res));
> +
> +	if (error != CS_OK) {
> +		goto error_exit;
> +	}
> +
> +	error = res.error;
> +
> +error_exit:
> +	(void)hdb_handle_put (&confdb_handle_t_db, handle);
> +
> +	return (error);
> +}
> +
> +
> +
>  cs_error_t confdb_key_delete (
>  	confdb_handle_t handle,
>  	hdb_handle_t parent_object_handle,
> @@ -842,6 +904,69 @@ error_exit:
>  	return (error);
>  }
>  
> +
> +cs_error_t confdb_key_get_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	confdb_value_types_t *type)
> +{
> +	cs_error_t error;
> +	struct confdb_inst *confdb_inst;
> +	struct iovec iov;
> +	struct req_lib_confdb_key_get req_lib_confdb_key_get;
> +	struct res_lib_confdb_key_get_ext response;
> +
> +	error = hdb_error_to_cs(hdb_handle_get (&confdb_handle_t_db, handle, (void *)&confdb_inst));
> +	if (error != CS_OK) {
> +		return (error);
> +	}
> +
> +	if (confdb_inst->standalone) {
> +		error = CS_OK;
> +
> +		if (confdb_sa_key_get_ext(parent_object_handle,
> +				      key_name, value, value_len, (int*)type))
> +			error = CS_ERR_ACCESS;
> +		goto error_exit;
> +	}
> +
> +	req_lib_confdb_key_get.header.size = sizeof (struct req_lib_confdb_key_get);
> +	req_lib_confdb_key_get.header.id = MESSAGE_REQ_CONFDB_KEY_GET_EXT;
> +	req_lib_confdb_key_get.parent_object_handle = parent_object_handle;
> +	req_lib_confdb_key_get.key_name.length = strlen(key_name) + 1;
> +	memcpy(req_lib_confdb_key_get.key_name.value, key_name, req_lib_confdb_key_get.key_name.length);
> +
> +	iov.iov_base = (char *)&req_lib_confdb_key_get;
> +	iov.iov_len = sizeof (struct req_lib_confdb_key_get);
> +
> +        error = coroipcc_msg_send_reply_receive (
> +		confdb_inst->handle,
> +		&iov,
> +		1,
> +		&response,
> +		sizeof (struct res_lib_confdb_key_get_ext));
> +
> +	if (error != CS_OK) {
> +		goto error_exit;
> +	}
> +
> +	error = response.header.error;
> +	if (error == CS_OK) {
> +		*value_len = response.value.length;
> +		*type = response.type;
> +		memcpy(value, response.value.value, *value_len);
> +	}
> +
> +error_exit:
> +	(void)hdb_handle_put (&confdb_handle_t_db, handle);
> +
> +	return (error);
> +}
> +
> +
>  cs_error_t confdb_key_increment (
>  	confdb_handle_t handle,
>  	hdb_handle_t parent_object_handle,
> @@ -1345,6 +1470,81 @@ error_exit:
>  	return (error);
>  }
>  
> +cs_error_t confdb_key_iter_ext (
> +	confdb_handle_t handle,
> +	hdb_handle_t parent_object_handle,
> +	char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	confdb_value_types_t *type)
> +{
> +	cs_error_t error;
> +	struct confdb_inst *confdb_inst;
> +	struct iovec iov;
> +	struct iter_context *context;
> +	struct req_lib_confdb_key_iter req_lib_confdb_key_iter;
> +	struct res_lib_confdb_key_iter_ext response;
> +
> +	error = hdb_error_to_cs(hdb_handle_get (&confdb_handle_t_db, handle, (void *)&confdb_inst));
> +	if (error != CS_OK) {
> +		return (error);
> +	}
> +
> +	/* You MUST call confdb_key_iter_start first */
> +	context = find_iter_context(&confdb_inst->key_iter_head, parent_object_handle);
> +	if (!context) {
> +		error =	CS_ERR_CONTEXT_NOT_FOUND;
> +		goto error_exit;
> +	}
> +
> +	if (confdb_inst->standalone) {
> +		error = CS_OK;
> +
> +		if (confdb_sa_key_iter_ext(parent_object_handle,
> +				       context->next_entry,
> +				       key_name,
> +				       value, value_len, (int*)type))
> +			error = CS_ERR_ACCESS;
> +		goto sa_exit;
> +	}
> +
> +	req_lib_confdb_key_iter.header.size = sizeof (struct req_lib_confdb_key_iter);
> +	req_lib_confdb_key_iter.header.id = MESSAGE_REQ_CONFDB_KEY_ITER_EXT;
> +	req_lib_confdb_key_iter.parent_object_handle = parent_object_handle;
> +	req_lib_confdb_key_iter.next_entry= context->next_entry;
> +
> +	iov.iov_base = (char *)&req_lib_confdb_key_iter;
> +	iov.iov_len = sizeof (struct req_lib_confdb_key_iter);
> +
> +	error = coroipcc_msg_send_reply_receive (
> +		confdb_inst->handle,
> +		&iov,
> +		1,
> +		&response,
> +		sizeof (struct res_lib_confdb_key_iter_ext));
> +
> +	if (error != CS_OK) {
> +		goto error_exit;
> +	}
> +
> +	error = response.header.error;
> +	if (error == CS_OK) {
> +		memcpy(key_name, response.key_name.value, response.key_name.length);
> +		key_name[response.key_name.length] = '\0';
> +		*value_len = response.value.length;
> +		memcpy(value, response.value.value, *value_len);
> +		*type = response.type;
> +	}
> +
> +sa_exit:
> +	context->next_entry++;
> +
> +error_exit:
> +	(void)hdb_handle_put (&confdb_handle_t_db, handle);
> +
> +	return (error);
> +}
> +
>  cs_error_t confdb_write (
>  	confdb_handle_t handle,
>  	char *error_text,
> diff --git a/lib/sa-confdb.c b/lib/sa-confdb.c
> index 1178cff..12e86a4 100644
> --- a/lib/sa-confdb.c
> +++ b/lib/sa-confdb.c
> @@ -197,6 +197,18 @@ int confdb_sa_key_create (
>  					value, value_len);
>  }
>  
> +int confdb_sa_key_create_ext (
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	const void *value,
> +	size_t value_len,
> +	int type)
> +{
> +	return objdb->object_key_create_ext(parent_object_handle,
> +					key_name,
> +					value, value_len, type);
> +}
> +
>  int confdb_sa_key_delete (
>  	hdb_handle_t parent_object_handle,
>  	const void *key_name,
> @@ -227,6 +239,25 @@ int confdb_sa_key_get (
>  	return res;
>  }
>  
> +int confdb_sa_key_get_ext (
> +	hdb_handle_t parent_object_handle,
> +	const char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	int *type)
> +{
> +	int res;
> +	void *kvalue;
> +
> +	res = objdb->object_key_get_ext(parent_object_handle,
> +				    key_name,
> +				    &kvalue, value_len, (objdb_value_types_t*)type);
> +	if (!res) {
> +		memcpy(value, kvalue, *value_len);
> +	}
> +	return res;
> +}
> +
>  int confdb_sa_key_increment (
>  	hdb_handle_t parent_object_handle,
>  	const void *key_name,
> @@ -373,6 +404,35 @@ int confdb_sa_key_iter (
>  	return res;
>  }
>  
> +int confdb_sa_key_iter_ext (
> +	hdb_handle_t parent_object_handle,
> +	hdb_handle_t start_pos,
> +	char *key_name,
> +	void *value,
> +	size_t *value_len,
> +	int *type)
> +{
> +	int res;
> +	void *kname;
> +	void *kvalue;
> +	size_t key_name_len;
> +
> +	res = objdb->object_key_iter_from(parent_object_handle,
> +					  start_pos,
> +					  &kname, &key_name_len,
> +					  &kvalue, value_len);
> +
> +	if (!res) {
> +		memcpy(key_name, kname, key_name_len);
> +		memcpy(value, kvalue, *value_len);
> +
> +		objdb->object_key_get_ext(parent_object_handle,
> +					  key_name,
> +					  &kvalue, value_len, (objdb_value_types_t*)type);
> +	}
> +	return res;
> +}
> +
>  int confdb_sa_find_destroy(hdb_handle_t find_handle)
>  {
>  	return objdb->object_find_destroy(find_handle);
> diff --git a/lib/sa-confdb.h b/lib/sa-confdb.h
> index 102eaf5..dddb9cf 100644
> --- a/lib/sa-confdb.h
> +++ b/lib/sa-confdb.h
> @@ -45,6 +45,11 @@ extern int confdb_sa_key_create(hdb_handle_t parent_object_handle,
>  				size_t key_name_len,
>  				const void *value,
>  				size_t value_len);
> +extern int confdb_sa_key_create_ext (hdb_handle_t parent_object_handle,
> +				const char *key_name,
> +				const void *value,
> +				size_t value_len,
> +				int type);
>  extern int confdb_sa_key_delete(hdb_handle_t parent_object_handle,
>  				const void *key_name,
>  				size_t key_name_len,
> @@ -55,6 +60,11 @@ extern int confdb_sa_key_get(hdb_handle_t parent_object_handle,
>  			     size_t key_name_len,
>  			     void *value,
>  			     size_t *value_len);
> +extern int confdb_sa_key_get_ext(hdb_handle_t parent_object_handle,
> +			     const char *key_name,
> +			     void *value,
> +			     size_t *value_len,
> +			     int *type);
>  extern int confdb_sa_key_replace(hdb_handle_t parent_object_handle,
>  				 const void *key_name,
>  				 size_t key_name_len,
> @@ -80,6 +90,12 @@ extern int confdb_sa_key_iter(hdb_handle_t parent_object_handle,
>  			      size_t *key_name_len,
>  			      void *value,
>  			      size_t *value_len);
> +extern int confdb_sa_key_iter_ext (hdb_handle_t parent_object_handle,
> +				hdb_handle_t start_pos,
> +				char *key_name,
> +				void *value,
> +				size_t *value_len,
> +				int *type);
>  extern int confdb_sa_key_increment(hdb_handle_t parent_object_handle,
>  				   const void *key_name,
>  				   size_t key_name_len,
> diff --git a/services/confdb.c b/services/confdb.c
> index c7c7808..3cd8010 100644
> --- a/services/confdb.c
> +++ b/services/confdb.c
> @@ -80,14 +80,20 @@ static void message_handler_req_lib_confdb_object_find_destroy (void *conn,
>  
>  static void message_handler_req_lib_confdb_key_create (void *conn,
>  						       const void *message);
> +static void message_handler_req_lib_confdb_key_create_ext (void *conn,
> +						       const void *message);
>  static void message_handler_req_lib_confdb_key_get (void *conn,
>  						    const void *message);
> +static void message_handler_req_lib_confdb_key_get_ext (void *conn,
> +						    const void *message);
>  static void message_handler_req_lib_confdb_key_replace (void *conn,
>  							const void *message);
>  static void message_handler_req_lib_confdb_key_delete (void *conn,
>  						       const void *message);
>  static void message_handler_req_lib_confdb_key_iter (void *conn,
>  						     const void *message);
> +static void message_handler_req_lib_confdb_key_iter_ext (void *conn,
> +						     const void *message);
>  

wacky tabbing

>  static void message_handler_req_lib_confdb_key_increment (void *conn,
>  							  const void *message);
> @@ -204,6 +210,18 @@ static struct corosync_lib_handler confdb_lib_engine[] =
>  		.lib_handler_fn				= message_handler_req_lib_confdb_key_decrement,
>  		.flow_control				= CS_LIB_FLOW_CONTROL_NOT_REQUIRED
>  	},
> +	{ /* 17 */
> +		.lib_handler_fn				= message_handler_req_lib_confdb_key_create_ext,
> +		.flow_control				= CS_LIB_FLOW_CONTROL_NOT_REQUIRED
> +	},
> +	{ /* 18 */
> +		.lib_handler_fn				= message_handler_req_lib_confdb_key_get_ext,
> +		.flow_control				= CS_LIB_FLOW_CONTROL_NOT_REQUIRED
> +	},
> +	{ /* 19 */
> +		.lib_handler_fn				= message_handler_req_lib_confdb_key_iter_ext,
> +		.flow_control				= CS_LIB_FLOW_CONTROL_NOT_REQUIRED
> +	},
>  };
>  
> 
> @@ -373,6 +391,27 @@ static void message_handler_req_lib_confdb_key_create (void *conn,
>  	api->ipc_response_send(conn, &res, sizeof(res));
>  }
>  
> +static void message_handler_req_lib_confdb_key_create_ext (void *conn,
> +						       const void *message)
> +{
> +	const struct req_lib_confdb_key_create_ext *req_lib_confdb_key_create
> +	  = message;
> +	coroipc_response_header_t res;
> +	int ret = CS_OK;
> +
> +	if (api->object_key_create_ext(req_lib_confdb_key_create->object_handle,
> +					    (char*)req_lib_confdb_key_create->key_name.value,
> +					    req_lib_confdb_key_create->value.value,
> +					    req_lib_confdb_key_create->value.length,
> +					    req_lib_confdb_key_create->type))
> +		ret = CS_ERR_ACCESS;
> +
> +	res.size = sizeof(res);
> +	res.id = MESSAGE_RES_CONFDB_KEY_CREATE;
> +	res.error = ret;
> +	api->ipc_response_send(conn, &res, sizeof(res));
> +}
> +
>  static void message_handler_req_lib_confdb_key_get (void *conn,
>  						    const void *message)
>  {
> @@ -399,6 +438,35 @@ static void message_handler_req_lib_confdb_key_get (void *conn,
>  	api->ipc_response_send(conn, &res_lib_confdb_key_get, sizeof(res_lib_confdb_key_get));
>  }
>  
> +static void message_handler_req_lib_confdb_key_get_ext (void *conn,
> +						    const void *message)
> +{
> +	const struct req_lib_confdb_key_get *req_lib_confdb_key_get = message;
> +	struct res_lib_confdb_key_get_ext res_lib_confdb_key_get;
> +	size_t value_len;
> +	void *value;
> +	int ret = CS_OK;
> +	objdb_value_types_t type;
> +	char * key_name = (char*)req_lib_confdb_key_get->key_name.value;
> +	key_name[req_lib_confdb_key_get->key_name.length] = '\0';
> +
> +	if (api->object_key_get_ext(req_lib_confdb_key_get->parent_object_handle,
> +					 key_name,
> +					 &value,
> +					 &value_len, &type))
> +		ret = CS_ERR_ACCESS;
> +	else {
> +		memcpy(res_lib_confdb_key_get.value.value, value, value_len);
> +		res_lib_confdb_key_get.value.length = value_len;
> +		res_lib_confdb_key_get.type = type;
> +
> +	}
> +	res_lib_confdb_key_get.header.size = sizeof(res_lib_confdb_key_get);
> +	res_lib_confdb_key_get.header.id = MESSAGE_RES_CONFDB_KEY_GET_EXT;
> +	res_lib_confdb_key_get.header.error = ret;
> +	api->ipc_response_send(conn, &res_lib_confdb_key_get, sizeof(res_lib_confdb_key_get));
> +}
> +
>  static void message_handler_req_lib_confdb_key_increment (void *conn,
>  							  const void *message)
>  {
> @@ -529,6 +597,45 @@ static void message_handler_req_lib_confdb_key_iter (void *conn,
>  	api->ipc_response_send(conn, &res_lib_confdb_key_iter, sizeof(res_lib_confdb_key_iter));
>  }
>  
> +static void message_handler_req_lib_confdb_key_iter_ext (void *conn,
> +						     const void *message)
> +{
> +	const struct req_lib_confdb_key_iter *req_lib_confdb_key_iter = message;
> +	struct res_lib_confdb_key_iter_ext res_lib_confdb_key_iter;
> +	void *key_name;
> +	size_t key_name_len;
> +	void *value;
> +	size_t value_len;
> +	int ret = CS_OK;
> +	objdb_value_types_t my_type;
> +
> +	if (api->object_key_iter_from(req_lib_confdb_key_iter->parent_object_handle,
> +					       req_lib_confdb_key_iter->next_entry,
> +					       &key_name,
> +					       &key_name_len,
> +					       &value,
> +					       &value_len))
> +		ret = CS_ERR_ACCESS;
> +	else {
> +		memcpy(res_lib_confdb_key_iter.key_name.value, key_name, key_name_len);
> +		memcpy(res_lib_confdb_key_iter.value.value, value, value_len);
> +		res_lib_confdb_key_iter.key_name.length = key_name_len;
> +		res_lib_confdb_key_iter.key_name.value[key_name_len] = '\0';
> +		res_lib_confdb_key_iter.value.length = value_len;
> +		api->object_key_get_ext(req_lib_confdb_key_iter->parent_object_handle,
> +								res_lib_confdb_key_iter.key_name.value,
> +								&value,
> +								&value_len,
> +								&my_type);
> +		res_lib_confdb_key_iter.type = my_type;
> +	}
> +	res_lib_confdb_key_iter.header.size = sizeof(res_lib_confdb_key_iter);
> +	res_lib_confdb_key_iter.header.id = MESSAGE_RES_CONFDB_KEY_ITER_EXT;
> +	res_lib_confdb_key_iter.header.error = ret;
> +
> +	api->ipc_response_send(conn, &res_lib_confdb_key_iter, sizeof(res_lib_confdb_key_iter));
> +}
> +
>  static void message_handler_req_lib_confdb_object_iter (void *conn,
>  							const void *message)
>  {
> diff --git a/tools/corosync-objctl.c b/tools/corosync-objctl.c
> index 88098f3..765240c 100644
> --- a/tools/corosync-objctl.c
> +++ b/tools/corosync-objctl.c
> @@ -102,6 +102,44 @@ static confdb_callbacks_t callbacks = {
>  static int debug = 0;
>  static int action;
>  
> +static void print_key (char * key_name, void * value, size_t value_len, confdb_value_types_t type)

no spaces after *
ie: char *key_name, void *value
> +{
> +
> +		switch (type) {
> +			case CONFDB_VALUETYPE_INT16:
> +				printf ("%s=%hd\n", key_name,
> +						  *(int16_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_UINT16:
> +				printf ("%s=%hu\n", key_name,
> +						  *(uint16_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_INT32:
> +				printf ("%s=%d\n", key_name,
> +						  *(int32_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_UINT32:
> +				printf ("%s=%u\n", key_name,
> +						  *(uint32_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_INT64:
> +				printf ("%s=%lld\n", key_name,
> +						  *(int64_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_UINT64:
> +				printf ("%s=%llu\n", key_name,
> +						  *(uint64_t*)value);
> +				break;
> +			case CONFDB_VALUETYPE_STRING:
> +				printf ("%s=%s\n", key_name, (char*)value);
> +				break;
> +			default:
> +			case CONFDB_VALUETYPE_ANY:
> +				printf ("%s=**binary**(%d)\n", key_name, type);
> +				break;
> +		}
> +}
> +
>  /* Recursively dump the object tree */
>  static void print_config_tree(confdb_handle_t handle, hdb_handle_t parent_object_handle, char * parent_name)
>  {
> @@ -109,11 +147,11 @@ static void print_config_tree(confdb_handle_t handle, hdb_handle_t parent_object
>  	char object_name[OBJ_NAME_SIZE];
>  	size_t object_name_len;
>  	char key_name[OBJ_NAME_SIZE];
> -	size_t key_name_len;
>  	char key_value[OBJ_NAME_SIZE];
>  	size_t key_value_len;
>  	cs_error_t res;
>  	int children_printed;
> +	confdb_value_types_t type;
>  
>  	/* Show the keys */
>  	res = confdb_key_iter_start(handle, parent_object_handle);
> @@ -123,18 +161,17 @@ static void print_config_tree(confdb_handle_t handle, hdb_handle_t parent_object
>  	}
>  	children_printed = 0;
>  
> -	while ( (res = confdb_key_iter(handle,
> +	while ( (res = confdb_key_iter_ext(handle,
>  								   parent_object_handle,
>  								   key_name,
> -								   &key_name_len,
>  								   key_value,
> -								   &key_value_len)) == CS_OK) {
> -		key_name[key_name_len] = '\0';
> +								   &key_value_len,
> +								   &type)) == CS_OK) {
>  		key_value[key_value_len] = '\0';
>  		if (parent_name != NULL)
> -			printf("%s%c%s=%s\n", parent_name, SEPERATOR,key_name, key_value);
> -		else
> -			printf("%s=%s\n", key_name, key_value);
> +			printf("%s%c", parent_name, SEPERATOR);
> +
> +		print_key(key_name, key_value, key_value_len, type);
>  
>  		children_printed++;
>  	}
> @@ -404,6 +441,7 @@ static void write_key(confdb_handle_t handle, char * path_pt)
>  	char old_key_value[OBJ_NAME_SIZE];
>  	size_t old_key_value_len;
>  	cs_error_t res;
> +	confdb_value_types_t type;
>  
>  	/* find the parent object */
>  	get_parent_name(path_pt, parent_name);
> @@ -425,12 +463,11 @@ static void write_key(confdb_handle_t handle, char * path_pt)
>  	}
>  
>  	/* get the current key */
> -	res = confdb_key_get (handle,
> +	res = confdb_key_get_ext (handle,
>  						  obj_handle,
>  						  key_name,
> -						  strlen(key_name),
>  						  old_key_value,
> -						  &old_key_value_len);
> +						  &old_key_value_len, &type);
>  
>  	if (res == CS_OK) {
>  		/* replace the current value */
> @@ -447,12 +484,12 @@ static void write_key(confdb_handle_t handle, char * path_pt)
>  			fprintf(stderr, "Failed to replace the key %s=%s. Error %d\n", key_name, key_value, res);
>  	} else {
>  		/* not there, create a new key */
> -		res = confdb_key_create (handle,
> +		res = confdb_key_create_ext (handle,
>  								 obj_handle,
>  								 key_name,
> -								 strlen(key_name),
>  								 key_value,
> -								 strlen(key_value));
> +								 strlen(key_value),
> +								 CONFDB_VALUETYPE_STRING);
>  		if (res != CS_OK)
>  			fprintf(stderr, "Failed to create the key %s=%s. Error %d\n", key_name, key_value, res);
>  	}



More information about the Openais mailing list