From ef0efc2840290aeaec96acd302ef5bfde5598cc2 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Fri, 14 May 2010 10:59:45 +1000 Subject: [PATCH] add a libctdb version of the control to create a database --- include/ctdb.h | 23 ++++++++++-- libctdb/libctdb.c | 90 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 4 deletions(-) diff --git a/include/ctdb.h b/include/ctdb.h index b0748761..bebf8042 100644 --- a/include/ctdb.h +++ b/include/ctdb.h @@ -99,8 +99,9 @@ ctdb_remove_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid, int ctdb_remove_message_handler_recv(struct ctdb_context *ctdb, ctdb_handle *handle); -int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, - void *private_data); +int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid); + + /* * send a message to a specific node/port @@ -151,6 +152,24 @@ int ctdb_getrecmaster(struct ctdb_context *ctdb, +/* + * functions to create a database + * if the database already exists this function is a NOP + */ +typedef void (*ctdb_createdb_cb)(int32_t status, void *private_data); + +ctdb_handle * +ctdb_createdb_send(struct ctdb_context *ctdb, uint32_t destnode, + const char *name, bool persistent, + ctdb_createdb_cb callback, + void *private_data); +int ctdb_createdb_recv(struct ctdb_context *ctdb, + ctdb_handle *handle); +int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode, + const char *name, bool persistent); + + + /* * cancel a request/call */ diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c index 19ec8cea..f91dd93f 100644 --- a/libctdb/libctdb.c +++ b/libctdb/libctdb.c @@ -450,11 +450,11 @@ int ctdb_remove_message_handler_recv(struct ctdb_context *ctdb, ctdb_handle *han /* tell the daemon we no longer want a srvid */ -int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data) +int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid) { struct ctdb_client_control_state *state; - state = ctdb_remove_message_handler_send(ctdb, srvid, NULL, private_data); + state = ctdb_remove_message_handler_send(ctdb, srvid, NULL, NULL); if (state == NULL) { DEBUG(DEBUG_ERR,(__location__ " ctdb_remove_message_handler_send() failed.\n")); return -1; @@ -462,3 +462,89 @@ int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void return ctdb_remove_message_handler_recv(ctdb, state); } + + + + + + + +/* + * Create a database. If the database already exists this is a NOP. + */ +static void +ctdb_createdb_recv_cb(struct ctdb_client_control_state *state) +{ + struct ctdb_control_cb_data *cb_data = state->async.private_data; + ctdb_createdb_cb callback = (ctdb_createdb_cb)cb_data->callback; + + callback(state->status, cb_data->private_data); +} + + +ctdb_handle * +ctdb_createdb_send(struct ctdb_context *ctdb, uint32_t destnode, + const char *name, bool persistent, + ctdb_createdb_cb callback, + void *private_data) + +{ + struct ctdb_client_control_state *state; + struct ctdb_control_cb_data *cb_data; + TDB_DATA data; + + data.dptr = discard_const(name); + data.dsize = strlen(name)+1; + + state = ctdb_control_send(ctdb, destnode, 0, + persistent?CTDB_CONTROL_DB_ATTACH_PERSISTENT:CTDB_CONTROL_DB_ATTACH, + 0, data, + ctdb, NULL); + if (state == NULL) { + DEBUG(DEBUG_ERR,(__location__ " Failed to send CREATEDB control\n")); + return NULL; + } + + if (callback != NULL) { + cb_data = talloc(state, struct ctdb_control_cb_data); + cb_data->callback = callback; + cb_data->private_data = private_data; + + state->async.fn = ctdb_createdb_recv_cb; + state->async.private_data = cb_data; + } + + return (ctdb_handle *)state; +} + + +int ctdb_createdb_recv(struct ctdb_context *ctdb, ctdb_handle *handle) +{ + struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state); + int ret; + int32_t res; + + ret = ctdb_control_recv(ctdb, state, state, NULL, &res, NULL); + if (ret != 0 || res != 0) { + DEBUG(DEBUG_ERR,(__location__ " ctdb_createdb_recv failed\n")); + return -1; + } + + return state->status; +} + +int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode, const char *name, bool persistent) +{ + struct ctdb_client_control_state *state; + + state = ctdb_createdb_send(ctdb, destnode, name, persistent, NULL, NULL); + if (state == NULL) { + DEBUG(DEBUG_ERR,(__location__ " ctdb_createdb_send() failed.\n")); + return -1; + } + + return ctdb_createdb_recv(ctdb, state); +} + + + -- 2.34.1