From 7292c306593b348463916130c23b86a9021866f1 Mon Sep 17 00:00:00 2001 From: OpenGnSys Support Team Date: Tue, 19 Dec 2023 12:02:55 +0100 Subject: rest: no assumption on description field in create/image do not use description field to decide if this is a new image or an update. add og_dbi_get_image() to check if the image exists. If it is not found, then add new image entry to database. update og_dbi_add_image() to update the image.id field. --- src/dbi.c | 48 +++++++++++++++++++++++++++++------------------- src/dbi.h | 3 ++- src/rest.c | 15 +++++++++++---- 3 files changed, 42 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/dbi.c b/src/dbi.c index 0c7f030..fd93fcf 100644 --- a/src/dbi.c +++ b/src/dbi.c @@ -169,28 +169,11 @@ int og_dbi_get_room_info(struct og_dbi *dbi, struct og_room *room, #define OG_UNASSIGNED_SW_ID 0 #define OG_IMAGE_DEFAULT_TYPE 1 /* monolithic */ -int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image) +int og_dbi_add_image(struct og_dbi *dbi, struct og_image *image) { const char *msglog; dbi_result result; - result = dbi_conn_queryf(dbi->conn, - "SELECT nombreca FROM imagenes WHERE nombreca = '%s'", - image->name); - if (!result) { - dbi_conn_error(dbi->conn, &msglog); - syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", - __func__, __LINE__, msglog); - return -1; - } - - if (dbi_result_next_row(result)) { - syslog(LOG_ERR, "image creation attempt with already used image name (%s:%d)\n", - __func__, __LINE__); - dbi_result_free(result); - return -1; - } - dbi_result_free(result); result = dbi_conn_queryf(dbi->conn, "INSERT INTO imagenes (nombreca, " @@ -216,7 +199,34 @@ int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image) } dbi_result_free(result); - return dbi_conn_sequence_last(dbi->conn, NULL); + image->id = dbi_conn_sequence_last(dbi->conn, NULL); + + return 0; +} + +bool og_dbi_get_image(struct og_dbi *dbi, struct og_image *image) +{ + const char *msglog; + dbi_result result; + + result = dbi_conn_queryf(dbi->conn, + "SELECT nombreca, idimagen FROM imagenes WHERE nombreca = '%s'", + image->name); + if (!result) { + dbi_conn_error(dbi->conn, &msglog); + syslog(LOG_ERR, "failed to query database (%s:%d) %s\n", + __func__, __LINE__, msglog); + return false; + } + + if (dbi_result_next_row(result)) { + image->id = dbi_result_get_uint(result, "idimagen"); + dbi_result_free(result); + return true; + } + dbi_result_free(result); + + return false; } int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id, diff --git a/src/dbi.h b/src/dbi.h index feac3fb..c9ef037 100644 --- a/src/dbi.h +++ b/src/dbi.h @@ -119,7 +119,8 @@ int og_dbi_get_computer_info(struct og_dbi *dbi, struct og_computer *computer, struct in_addr addr); int og_dbi_get_room_info(struct og_dbi *dbi, struct og_room *room, uint32_t room_id); -int og_dbi_add_image(struct og_dbi *dbi, const struct og_image *image); +bool og_dbi_get_image(struct og_dbi *dbi, struct og_image *image); +int og_dbi_add_image(struct og_dbi *dbi, struct og_image *image); int og_dbi_schema_update(void); diff --git a/src/rest.c b/src/rest.c index 7685e05..c72d91e 100644 --- a/src/rest.c +++ b/src/rest.c @@ -2644,6 +2644,7 @@ static int og_cmd_create_image(json_t *element, struct og_msg_params *params) struct og_dbi *dbi; json_t *clients; int err = 0; + bool found; err = og_json_parse_create_image(element, params); if (err < 0) @@ -2665,23 +2666,29 @@ static int og_cmd_create_image(json_t *element, struct og_msg_params *params) return -1; } - /* If there is a description, this means the image is not in the DB. */ - if (params->image.description[0]) { + found = og_dbi_get_image(dbi, ¶ms->image); + if (!found) { if (!og_msg_params_validate(params, OG_REST_PARAM_REPO)) { + syslog(LOG_ERR, + "missing repo parameter in request (%s:%d)\n", + __func__, __LINE__); og_dbi_close(dbi); return -1; } err = og_dbi_add_image(dbi, ¶ms->image); - if (err < 0) { og_dbi_close(dbi); return err; } - snprintf(new_image_id, sizeof(new_image_id), "%u", err); + snprintf(new_image_id, sizeof(new_image_id), "%lu", params->image.id); params->id = new_image_id; json_object_set_new(element, "id", json_string(params->id)); + } else { + syslog(LOG_INFO, "updating existing image `%s'\n", params->image.name); + snprintf(new_image_id, sizeof(new_image_id), "%lu", params->image.id); + params->id = new_image_id; } clients = json_copy(element); -- cgit v1.2.3-18-g5258