Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 24735df7 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

DB: Field in table description have a minimal version attached to them

parent d46beb7a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!192Resolve "FEATURE: Use time stamp from kurisu in update process"
...@@ -4,68 +4,84 @@ ...@@ -4,68 +4,84 @@
#include <lektor/database.h> #include <lektor/database.h>
#include <lektor/internal/dbmacro.h> #include <lektor/internal/dbmacro.h>
struct sql_table_description { struct sql_field_description {
const char *name; const char *name;
const char *fields[LKT_TABLE_FIELDS_MAX];
const LKT_DATABASE_VERSION minimal_version; const LKT_DATABASE_VERSION minimal_version;
}; };
#define DCL_SQL_TABLE(tbl_name, ...) \ struct sql_table_description {
UNUSED static struct sql_table_description sql_table_##tbl_name = { \ const char *name;
.name = #tbl_name, \ const struct sql_field_description fields[LKT_TABLE_FIELDS_MAX];
.fields = { __VA_ARGS__, NULL }, \ const LKT_DATABASE_VERSION minimal_version;
.minimal_version = LKT_DATABASE_VERSION_ALPHA, \
}; };
#define DCL_SQL_TABLE_NAMED(var_name, tbl_name, ...) \ #define DCL_SQL_FIELD(field_name, version) \
UNUSED static struct sql_table_description sql_table_##var_name = { \ ((struct sql_field_description){ .name = field_name, \
.minimal_version = (LKT_DATABASE_VERSION_##version) })
#define DCL_SQL_FIELD_NULL ((struct sql_field_description){ .name = NULL, .minimal_version = 0 })
#define DCL_SQL_TABLE(tbl_name, ...) \
((struct sql_table_description){ \
.name = #tbl_name, \ .name = #tbl_name, \
.fields = { __VA_ARGS__, NULL }, \ .fields = { __VA_ARGS__, DCL_SQL_FIELD_NULL }, \
.minimal_version = LKT_DATABASE_VERSION_ALPHA, \ .minimal_version = LKT_DATABASE_VERSION_ALPHA, \
}; })
#define DCL_SQL_TABLE_NAMED_WITH_VERSION(var_name, tbl_name, version, ...) \ #define DCL_SQL_TABLE_VERSION(tbl_name, version, ...) \
UNUSED static struct sql_table_description sql_table_##var_name = { \ ((struct sql_table_description){ \
.name = #tbl_name, \ .name = #tbl_name, \
.fields = { __VA_ARGS__, NULL }, \ .fields = { __VA_ARGS__, DCL_SQL_FIELD_NULL }, \
.minimal_version = LKT_DATABASE_VERSION_##version, \ .minimal_version = LKT_DATABASE_VERSION_##version, \
}; })
static struct sql_table_description sql_tables_list[] = {
DCL_SQL_TABLE(kara, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("song_name", ALPHA),
DCL_SQL_FIELD("source_name", ALPHA), DCL_SQL_FIELD("category", ALPHA),
DCL_SQL_FIELD("song_type", ALPHA), DCL_SQL_FIELD("song_number", ALPHA),
DCL_SQL_FIELD("language", ALPHA), DCL_SQL_FIELD("file_path", ALPHA),
DCL_SQL_FIELD("is_new", ALPHA), DCL_SQL_FIELD("author_name", ALPHA),
DCL_SQL_FIELD("available", ALPHA), DCL_SQL_FIELD("repo_timestamp", MK_7_3)),
DCL_SQL_TABLE(kara_type, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA)),
DCL_SQL_TABLE(kara_category, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA)),
DCL_SQL_TABLE(language, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA)),
DCL_SQL_TABLE(kara, "id", "song_name", "source_name", "category", "song_type", "song_number", DCL_SQL_TABLE(playlist, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA),
"language", "file_path", "is_new", "author_name", "available"); DCL_SQL_FIELD("last_update", ALPHA)),
DCL_SQL_TABLE(kara_type, "id", "name");
DCL_SQL_TABLE(kara_category, "id", "name"); DCL_SQL_TABLE(kara_playlist, DCL_SQL_FIELD("kara_id", ALPHA),
DCL_SQL_TABLE(language, "id", "name"); DCL_SQL_FIELD("playlist_id", ALPHA)),
DCL_SQL_TABLE(playlist, "id", "name", "last_update");
DCL_SQL_TABLE(kara_playlist, "kara_id", "playlist_id"); DCL_SQL_TABLE(queue, DCL_SQL_FIELD("position", ALPHA), DCL_SQL_FIELD("kara_id", ALPHA),
DCL_SQL_TABLE(queue, "position", "kara_id", "priority"); DCL_SQL_FIELD("priority", ALPHA)),
DCL_SQL_TABLE(users, "username", "password");
DCL_SQL_TABLE(updates, "job", "kara_id"); DCL_SQL_TABLE(users, DCL_SQL_FIELD("username", ALPHA), DCL_SQL_FIELD("password", ALPHA)),
DCL_SQL_TABLE(misc, "id", "last_update", "last_end_update", "update_job", "opened", "obfuscation"); DCL_SQL_TABLE(updates, DCL_SQL_FIELD("job", ALPHA), DCL_SQL_FIELD("kara_id", ALPHA)),
DCL_SQL_TABLE_NAMED(stickers, 'stickers', "id", "name")
DCL_SQL_TABLE_NAMED(stickers_kara, 'stickers.kara', "id", "sticker", "value") DCL_SQL_TABLE(misc, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("last_update", ALPHA),
DCL_SQL_TABLE_NAMED(stickers_plt, 'stickers.plt', "id", "sticker", "value") DCL_SQL_FIELD("last_end_update", ALPHA), DCL_SQL_FIELD("update_job", ALPHA),
DCL_SQL_FIELD("opened", ALPHA), DCL_SQL_FIELD("obfuscation", ALPHA)),
DCL_SQL_TABLE_NAMED_WITH_VERSION(kara_mk_7_3, kara, MK_7_3, "repo_timestamp");
DCL_SQL_TABLE('stickers', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA)),
UNUSED static struct sql_table_description *sql_tables_list[] = {
&sql_table_kara, &sql_table_kara_type, DCL_SQL_TABLE('stickers.kara', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("sticker", ALPHA),
&sql_table_kara_category, &sql_table_language, DCL_SQL_FIELD("value", ALPHA)),
&sql_table_playlist, &sql_table_kara_playlist,
&sql_table_queue, &sql_table_users, DCL_SQL_TABLE('stickers.plt', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("sticker", ALPHA),
&sql_table_updates, &sql_table_misc, DCL_SQL_FIELD("value", ALPHA)),
&sql_table_stickers, &sql_table_stickers_kara,
&sql_table_stickers_plt, NULL,
}; };
static size_t sql_tables_list_count =
sizeof(sql_tables_list) / sizeof(struct sql_table_description);
CONSTRUCTOR_FUNCTION CONSTRUCTOR_FUNCTION
___verify_table_descriptions(void) ___verify_table_descriptions(void)
{ {
for (size_t i = 0; sql_tables_list[i]; ++i) { for (size_t i = 0; i < sql_tables_list_count; ++i) {
struct sql_table_description *table = sql_tables_list[i]; struct sql_table_description *table = &sql_tables_list[i];
size_t j = LKT_TABLE_FIELDS_MAX - 1; size_t j = LKT_TABLE_FIELDS_MAX - 1;
while (j) { while (j) {
if (table->fields[j] == NULL) if (table->fields[j].name == NULL)
break; break;
--j; --j;
} }
...@@ -78,7 +94,8 @@ ___verify_table_descriptions(void) ...@@ -78,7 +94,8 @@ ___verify_table_descriptions(void)
} }
PRIVATE_FUNCTION bool PRIVATE_FUNCTION bool
___compute_upgrade_sql_query(const struct sql_table_description *table, char *buffer, ___compute_upgrade_sql_query(LKT_DATABASE_VERSION base_version,
const struct sql_table_description *table, char *buffer,
size_t buffer_length) size_t buffer_length)
{ {
/* The query template: /* The query template:
...@@ -92,9 +109,17 @@ ___compute_upgrade_sql_query(const struct sql_table_description *table, char *bu ...@@ -92,9 +109,17 @@ ___compute_upgrade_sql_query(const struct sql_table_description *table, char *bu
/* Create the comma separated list for the table's fields */ /* Create the comma separated list for the table's fields */
size_t field_list_length = 0; size_t field_list_length = 0;
for (size_t i = 0; table->fields[i]; ++i) { size_t added_fields = 0;
for (size_t i = 0; table->fields[i].name != NULL; ++i) {
if (table->fields[i].minimal_version <= base_version) {
field_list_length += 1; /* The comma */ field_list_length += 1; /* The comma */
field_list_length += strlen(table->fields[i]); /* The field name */ field_list_length += strlen(table->fields[i].name); /* The field name */
added_fields += 1;
}
}
if (added_fields == 0) {
LOG_ERROR("DB-UPGRADE", "No fields where found for the database table %s", table->name);
return false;
} }
if (field_list_length >= LKT_MAX_SQLITE_STATEMENT) { if (field_list_length >= LKT_MAX_SQLITE_STATEMENT) {
...@@ -108,9 +133,17 @@ ___compute_upgrade_sql_query(const struct sql_table_description *table, char *bu ...@@ -108,9 +133,17 @@ ___compute_upgrade_sql_query(const struct sql_table_description *table, char *bu
char field_list[LKT_MAX_SQLITE_STATEMENT]; char field_list[LKT_MAX_SQLITE_STATEMENT];
memset(field_list, 0, sizeof(field_list)); memset(field_list, 0, sizeof(field_list));
for (size_t i = 0; table->fields[i]; ++i) { added_fields = 0;
strcat(field_list, table->fields[i]); for (size_t i = 0; table->fields[i].name; ++i) {
if (table->fields[i].minimal_version <= base_version) {
strcat(field_list, table->fields[i].name);
strcat(field_list, ","); strcat(field_list, ",");
added_fields += 1;
}
}
if (added_fields == 0) {
LOG_ERROR("DB-UPGRADE", "No fields where found for the database table %s", table->name);
return false;
} }
field_list[strlen(field_list) - 1] = '\0'; /* Crop the last "," */ field_list[strlen(field_list) - 1] = '\0'; /* Crop the last "," */
...@@ -158,8 +191,8 @@ database_upgrade_scheme(va_list *db_list_ptr) ...@@ -158,8 +191,8 @@ database_upgrade_scheme(va_list *db_list_ptr)
/* Copy the content of the old db into the new one */ /* Copy the content of the old db into the new one */
char sql_upgrade_query[LKT_MAX_SQLITE_STATEMENT]; char sql_upgrade_query[LKT_MAX_SQLITE_STATEMENT];
for (size_t i = 0; sql_tables_list[i]; ++i) { for (size_t i = 0; i < sql_tables_list_count; ++i) {
const struct sql_table_description *sql_table = sql_tables_list[i]; const struct sql_table_description *sql_table = &sql_tables_list[i];
if (sql_table->minimal_version > version) { if (sql_table->minimal_version > version) {
LOG_INFO("DB-UPGRADE", LOG_INFO("DB-UPGRADE",
"Don't apply upgrade rule '%s' because the minimal database version " "Don't apply upgrade rule '%s' because the minimal database version "
...@@ -169,8 +202,8 @@ database_upgrade_scheme(va_list *db_list_ptr) ...@@ -169,8 +202,8 @@ database_upgrade_scheme(va_list *db_list_ptr)
continue; continue;
} }
unless ( unless (___compute_upgrade_sql_query(version, sql_table, sql_upgrade_query,
___compute_upgrade_sql_query(sql_table, sql_upgrade_query, LKT_MAX_SQLITE_STATEMENT)) { LKT_MAX_SQLITE_STATEMENT)) {
LOG_ERROR("DB-UPGRADE", "Can't upgrade the database, detach the new one and exit"); LOG_ERROR("DB-UPGRADE", "Can't upgrade the database, detach the new one and exit");
database_unprotected_detach(db, LKT_PROTECTED_DATABASE_NEW); database_unprotected_detach(db, LKT_PROTECTED_DATABASE_NEW);
return false; return false;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter