diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-09-29 13:45:14 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-09-29 13:45:14 (GMT) |
commit | 522298cf50e67d92b0aa85a85177ed7c16b00e08 (patch) | |
tree | 134a48dfc67584fb8e147d326135f2bd109bdfac /src/common | |
parent | 034fda4f2b0eb1c2093b24eb749733ce1ea8791e (diff) |
Provided a generic way to update DB values.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/sqlite.c | 131 | ||||
-rw-r--r-- | src/common/sqlite.h | 3 |
2 files changed, 123 insertions, 11 deletions
diff --git a/src/common/sqlite.c b/src/common/sqlite.c index d497c81..3a94623 100644 --- a/src/common/sqlite.c +++ b/src/common/sqlite.c @@ -34,7 +34,7 @@ /* Attribue une définition aux valeurs paramétrées. */ -static bool bind_bound_values(sqlite3 *, sqlite3_stmt *, const char *, const bound_value *, size_t, bool, int *); +static bool bind_bound_values(sqlite3 *, sqlite3_stmt *, const char *, const bound_value *, size_t, int *); @@ -106,12 +106,11 @@ const bound_value *find_bound_value(const bound_value *values, size_t count, con /****************************************************************************** * * * Paramètres : db = base de données à consulter. * -* stmt = requête SQL en préparation à faire évoluer. * -* sql = définition brute de cette requête SQL. * -* values = tableau d'éléments à consulter. * -* count = nombre de descriptions renseignées. * -* has_value = fitre sur la définition des valeurs. * -* index = indice évolutif des valeurs paramétrées. [OUT] * +* stmt = requête SQL en préparation à faire évoluer. * +* sql = définition brute de cette requête SQL. * +* values = tableau d'éléments à consulter. * +* count = nombre de descriptions renseignées. * +* index = indice évolutif des valeurs paramétrées. [OUT] * * * * Description : Attribue une définition aux valeurs paramétrées. * * * @@ -121,7 +120,7 @@ const bound_value *find_bound_value(const bound_value *values, size_t count, con * * ******************************************************************************/ -static bool bind_bound_values(sqlite3 *db, sqlite3_stmt *stmt, const char *sql, const bound_value *values, size_t count, bool has_value, int *index) +static bool bind_bound_values(sqlite3 *db, sqlite3_stmt *stmt, const char *sql, const bound_value *values, size_t count, int *index) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ @@ -131,7 +130,7 @@ static bool bind_bound_values(sqlite3 *db, sqlite3_stmt *stmt, const char *sql, for (i = 0; i < count && result; i++) { - if (values[i].has_value != has_value) + if (!values[i].has_value) continue; switch (values[i].type) @@ -269,7 +268,7 @@ bool load_db_values(sqlite3 *db, const char *table, bound_value *values, size_t index = 1; - if (!bind_bound_values(db, stmt, sql, values, count, true, &index)) + if (!bind_bound_values(db, stmt, sql, values, count, &index)) goto bind_error; /* Chargement des valeurs existantes */ @@ -446,7 +445,7 @@ bool store_db_values(sqlite3 *db, const char *table, const bound_value *values, index = 1; - if (!bind_bound_values(db, stmt, sql, values, count, true, &index)) + if (!bind_bound_values(db, stmt, sql, values, count, &index)) goto bind_error; /* Exécution finale */ @@ -474,3 +473,113 @@ bool store_db_values(sqlite3 *db, const char *table, const bound_value *values, return result; } + + +/****************************************************************************** +* * +* Paramètres : db = base de données à mettre à jour. * +* table = nom de la table concernée. * +* values = champs avec leur valeur nouvelle. * +* vcount = quantité de ces champs. * +* values = champs avec leur valeur de condition. * +* ccount = quantité de ces champs. * +* * +* Description : Met à jour une série de valeurs dans une base de données. * +* * +* Retour : Bilan de l'exécution de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool update_db_values(sqlite3 *db, const char *table, const bound_value *values, size_t vcount, const bound_value *conds, size_t ccount) +{ + bool result; /* Conclusion à faire remonter */ + char *sql; /* Requête SQL à construire */ + size_t i; /* Boucle de parcours */ + sqlite3_stmt *stmt; /* Déclaration mise en place */ + int ret; /* Bilan d'un appel à SQLite */ + int index; /* Indice de valeur attachée */ + + result = false; + + /* Préparation de la requête */ + + sql = strdup("UPDATE "); + sql = stradd(sql, table); + sql = stradd(sql, " SET"); + + for (i = 0; i < vcount; i++) + { + assert(values[i].has_value); + + if (i > 0) sql = stradd(sql, " ,"); + + sql = stradd(sql, " "); + sql = stradd(sql, values[i].name); + + sql = stradd(sql, " = ?"); + + } + + if (ccount > 0) + { + sql = stradd(sql, " WHERE"); + + for (i = 0; i < ccount; i++) + { + if (i > 0) sql = stradd(sql, " AND"); + + sql = stradd(sql, " "); + sql = stradd(sql, conds[i].name); + + sql = stradd(sql, " = ?"); + + } + + } + + sql = stradd(sql, ";"); + + ret = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); + if (ret != SQLITE_OK) + { + fprintf(stderr, "Can't prepare UPDATE statment '%s' (ret=%d): %s\n", sql, ret, sqlite3_errmsg(db)); + goto prepare_error; + } + + /* Attribution des valeurs */ + + index = 1; + + if (!bind_bound_values(db, stmt, sql, values, vcount, &index)) + goto bind_error; + + if (!bind_bound_values(db, stmt, sql, conds, ccount, &index)) + goto bind_error; + + /* Exécution finale */ + + ret = sqlite3_step(stmt); + + if (ret != SQLITE_DONE) + { + fprintf(stderr, "UPDATE statement '%s' didn't return DONE (ret=%d): %s\n", sql, ret, sqlite3_errmsg(db)); + goto update_error; + } + + result = true; + + update_error: + + bind_error: + + sqlite3_finalize(stmt); + + prepare_error: + + free(sql); + + return result; + +} diff --git a/src/common/sqlite.h b/src/common/sqlite.h index 291eec8..99de12d 100644 --- a/src/common/sqlite.h +++ b/src/common/sqlite.h @@ -84,6 +84,9 @@ bool load_db_values(sqlite3 *, const char *, bound_value *, size_t, db_load_cb, /* Enregistre une série de valeurs dans une base de données. */ bool store_db_values(sqlite3 *, const char *, const bound_value *, size_t); +/* Met à jour une série de valeurs dans une base de données. */ +bool update_db_values(sqlite3 *, const char *, const bound_value *, size_t, const bound_value *, size_t); + #endif /* _COMMON_SQLITE_H */ |