dbi: use repository_id field if front-end offers it

If repository_id json field is provided, use it to narrow down the image lookup.

After this, search use this same repository ID to fetch the IP address.

Old web console may not provide repository_id, infer it from the image name.

Always set image id field for creation and update.
master
OpenGnSys Support Team 2024-07-19 13:05:11 +02:00
parent 075725b1fe
commit a67c0d3d57
3 changed files with 18 additions and 13 deletions

View File

@ -242,9 +242,16 @@ 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);
/* old front-end needs this... */
if (image->repo_id) {
result = dbi_conn_queryf(dbi->conn,
"SELECT nombreca, idimagen FROM imagenes WHERE nombreca = '%s'",
image->name);
} else {
result = dbi_conn_queryf(dbi->conn,
"SELECT nombreca, idimagen FROM imagenes WHERE nombreca = '%s' AND idrepositorio = '%s'",
image->name, image->repo_id);
}
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
@ -262,17 +269,15 @@ bool og_dbi_get_image(struct og_dbi *dbi, struct og_image *image)
return false;
}
int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id,
int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint32_t repo_id,
char *repository_ip)
{
const char *msglog, *dbi_repository_ip;
dbi_result result;
result = dbi_conn_queryf(dbi->conn,
"SELECT r.ip FROM imagenes i "
"JOIN repositorios r USING (idrepositorio) "
"WHERE i.idimagen = %lu",
image_id);
"SELECT ip FROM repositorios WHERE idrepositorio = %u",
repo_id);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
@ -283,8 +288,8 @@ int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id,
if (!dbi_result_next_row(result)) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR,
"image with id %lu has no repository (%s:%d) %s\n",
image_id, __func__, __LINE__, msglog);
"repository with id %u does not exist (%s:%d) %s\n",
repo_id, __func__, __LINE__, msglog);
dbi_result_free(result);
return -1;
}

View File

@ -144,7 +144,7 @@ int og_dbi_add_image(struct og_dbi *dbi, struct og_image *image);
int og_dbi_schema_update(void);
int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint64_t image_id,
int og_dbi_get_repository_ip(const struct og_dbi *dbi, const uint32_t repo_id,
char *repository_ip);
#endif

View File

@ -3737,17 +3737,17 @@ static int og_cmd_add_image(json_t *element, struct og_msg_params *params,
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;
}
json_object_set_new(element, "id", json_string(params->id));
clients = json_copy(element);
json_object_del(clients, "clients");
err = og_dbi_get_repository_ip(dbi, atoll(params->id), repository_ip);
err = og_dbi_get_repository_ip(dbi, params->image.repo_id, repository_ip);
og_dbi_close(dbi);
if (err < 0)
return err;