summaryrefslogtreecommitdiffstats
path: root/src/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c98
1 files changed, 91 insertions, 7 deletions
diff --git a/src/client.c b/src/client.c
index 93bd8f8..9c4ec59 100644
--- a/src/client.c
+++ b/src/client.c
@@ -497,6 +497,96 @@ static int og_resp_refresh(json_t *data, struct og_client *cli)
return 0;
}
+static bool og_dbi_update_image(struct og_dbi *dbi,
+ const struct og_image_legacy *img_info,
+ const char *computer_id)
+{
+ const char *msglog;
+ dbi_result result;
+ int repo_id, sw_id;
+
+ /* find repository identifier by repository ip and computer ID. */
+ result = dbi_conn_queryf(dbi->conn,
+ "SELECT repositorios.idrepositorio"
+ " FROM repositorios"
+ " LEFT JOIN ordenadores USING (idrepositorio)"
+ " WHERE repositorios.ip='%s' AND ordenadores.idordenador=%s",
+ img_info->repo, computer_id);
+ 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)) {
+ syslog(LOG_ERR,
+ "repository does not exist in database (%s:%d)\n",
+ __func__, __LINE__);
+ dbi_result_free(result);
+ return false;
+ }
+ repo_id = dbi_result_get_uint(result, "idrepositorio");
+ dbi_result_free(result);
+
+ /* find software id by computer ID, disk number and partition. */
+ result = dbi_conn_queryf(dbi->conn,
+ "SELECT idperfilsoft"
+ " FROM ordenadores_particiones"
+ " WHERE idordenador=%s AND numdisk=%s AND numpar=%s",
+ computer_id, img_info->disk, img_info->part);
+ 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)) {
+ syslog(LOG_ERR,
+ "software profile does not exist in database (%s:%d)\n",
+ __func__, __LINE__);
+ dbi_result_free(result);
+ return false;
+ }
+ sw_id = dbi_result_get_uint(result, "idperfilsoft");
+ dbi_result_free(result);
+
+ /* update image table with this new image. */
+ result = dbi_conn_queryf(dbi->conn,
+ "UPDATE imagenes"
+ " SET idordenador=%s, numdisk=%s, numpar=%s, codpar=%s,"
+ " idperfilsoft=%d, idrepositorio=%d,"
+ " fechacreacion=NOW(), revision=revision+1"
+ " WHERE idimagen=%s",
+ computer_id, img_info->disk, img_info->part, img_info->code,
+ sw_id, repo_id, img_info->image_id);
+
+ if (!result) {
+ dbi_conn_error(dbi->conn, &msglog);
+ syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
+ __func__, __LINE__, msglog);
+ return false;
+ }
+ dbi_result_free(result);
+
+ /* attach image to partition. */
+ result = dbi_conn_queryf(dbi->conn,
+ "UPDATE ordenadores_particiones"
+ " SET idimagen=%s, revision=(SELECT revision FROM imagenes WHERE idimagen=%s),"
+ " fechadespliegue=NOW()"
+ " WHERE idordenador=%s AND numdisk=%s AND numpar=%s",
+ img_info->image_id, img_info->image_id,
+ computer_id, img_info->disk, img_info->part);
+ if (!result) {
+ dbi_conn_error(dbi->conn, &msglog);
+ syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
+ __func__, __LINE__, msglog);
+ return false;
+ }
+ dbi_result_free(result);
+
+ return true;
+}
+
static int update_image_info(struct og_dbi *dbi, const char *image_id,
const char *clonator, const char *compressor,
const char *filesystem, const uint64_t datasize,
@@ -628,13 +718,7 @@ static int og_resp_image_create(json_t *data, struct og_client *cli)
return -1;
}
- res = actualizaCreacionImagen(dbi,
- img_legacy.image_id,
- img_legacy.disk,
- img_legacy.part,
- img_legacy.code,
- img_legacy.repo,
- soft_legacy.id);
+ res = og_dbi_update_image(dbi, &img_legacy, soft_legacy.id);
if (!res) {
og_dbi_close(dbi);
syslog(LOG_ERR, "Problem updating client configuration\n");