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
Branches
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 @@
#include <lektor/database.h>
#include <lektor/internal/dbmacro.h>
struct sql_table_description {
struct sql_field_description {
const char *name;
const char *fields[LKT_TABLE_FIELDS_MAX];
const LKT_DATABASE_VERSION minimal_version;
};
#define DCL_SQL_TABLE(tbl_name, ...) \
UNUSED static struct sql_table_description sql_table_##tbl_name = { \
.name = #tbl_name, \
.fields = { __VA_ARGS__, NULL }, \
.minimal_version = LKT_DATABASE_VERSION_ALPHA, \
struct sql_table_description {
const char *name;
const struct sql_field_description fields[LKT_TABLE_FIELDS_MAX];
const LKT_DATABASE_VERSION minimal_version;
};
#define DCL_SQL_TABLE_NAMED(var_name, tbl_name, ...) \
UNUSED static struct sql_table_description sql_table_##var_name = { \
#define DCL_SQL_FIELD(field_name, version) \
((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, \
.fields = { __VA_ARGS__, NULL }, \
.fields = { __VA_ARGS__, DCL_SQL_FIELD_NULL }, \
.minimal_version = LKT_DATABASE_VERSION_ALPHA, \
};
})
#define DCL_SQL_TABLE_NAMED_WITH_VERSION(var_name, tbl_name, version, ...) \
UNUSED static struct sql_table_description sql_table_##var_name = { \
#define DCL_SQL_TABLE_VERSION(tbl_name, version, ...) \
((struct sql_table_description){ \
.name = #tbl_name, \
.fields = { __VA_ARGS__, NULL }, \
.fields = { __VA_ARGS__, DCL_SQL_FIELD_NULL }, \
.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",
"language", "file_path", "is_new", "author_name", "available");
DCL_SQL_TABLE(kara_type, "id", "name");
DCL_SQL_TABLE(kara_category, "id", "name");
DCL_SQL_TABLE(language, "id", "name");
DCL_SQL_TABLE(playlist, "id", "name", "last_update");
DCL_SQL_TABLE(kara_playlist, "kara_id", "playlist_id");
DCL_SQL_TABLE(queue, "position", "kara_id", "priority");
DCL_SQL_TABLE(users, "username", "password");
DCL_SQL_TABLE(updates, "job", "kara_id");
DCL_SQL_TABLE(misc, "id", "last_update", "last_end_update", "update_job", "opened", "obfuscation");
DCL_SQL_TABLE_NAMED(stickers, 'stickers', "id", "name")
DCL_SQL_TABLE_NAMED(stickers_kara, 'stickers.kara', "id", "sticker", "value")
DCL_SQL_TABLE_NAMED(stickers_plt, 'stickers.plt', "id", "sticker", "value")
DCL_SQL_TABLE_NAMED_WITH_VERSION(kara_mk_7_3, kara, MK_7_3, "repo_timestamp");
UNUSED static struct sql_table_description *sql_tables_list[] = {
&sql_table_kara, &sql_table_kara_type,
&sql_table_kara_category, &sql_table_language,
&sql_table_playlist, &sql_table_kara_playlist,
&sql_table_queue, &sql_table_users,
&sql_table_updates, &sql_table_misc,
&sql_table_stickers, &sql_table_stickers_kara,
&sql_table_stickers_plt, NULL,
DCL_SQL_TABLE(playlist, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA),
DCL_SQL_FIELD("last_update", ALPHA)),
DCL_SQL_TABLE(kara_playlist, DCL_SQL_FIELD("kara_id", ALPHA),
DCL_SQL_FIELD("playlist_id", ALPHA)),
DCL_SQL_TABLE(queue, DCL_SQL_FIELD("position", ALPHA), DCL_SQL_FIELD("kara_id", ALPHA),
DCL_SQL_FIELD("priority", ALPHA)),
DCL_SQL_TABLE(users, DCL_SQL_FIELD("username", ALPHA), DCL_SQL_FIELD("password", ALPHA)),
DCL_SQL_TABLE(updates, DCL_SQL_FIELD("job", ALPHA), DCL_SQL_FIELD("kara_id", ALPHA)),
DCL_SQL_TABLE(misc, DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("last_update", ALPHA),
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('stickers', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("name", ALPHA)),
DCL_SQL_TABLE('stickers.kara', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("sticker", ALPHA),
DCL_SQL_FIELD("value", ALPHA)),
DCL_SQL_TABLE('stickers.plt', DCL_SQL_FIELD("id", ALPHA), DCL_SQL_FIELD("sticker", ALPHA),
DCL_SQL_FIELD("value", ALPHA)),
};
static size_t sql_tables_list_count =
sizeof(sql_tables_list) / sizeof(struct sql_table_description);
CONSTRUCTOR_FUNCTION
___verify_table_descriptions(void)
{
for (size_t i = 0; sql_tables_list[i]; ++i) {
struct sql_table_description *table = sql_tables_list[i];
for (size_t i = 0; i < sql_tables_list_count; ++i) {
struct sql_table_description *table = &sql_tables_list[i];
size_t j = LKT_TABLE_FIELDS_MAX - 1;
while (j) {
if (table->fields[j] == NULL)
if (table->fields[j].name == NULL)
break;
--j;
}
......@@ -78,7 +94,8 @@ ___verify_table_descriptions(void)
}
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)
{
/* The query template:
......@@ -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 */
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 += 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) {
......@@ -108,9 +133,17 @@ ___compute_upgrade_sql_query(const struct sql_table_description *table, char *bu
char field_list[LKT_MAX_SQLITE_STATEMENT];
memset(field_list, 0, sizeof(field_list));
for (size_t i = 0; table->fields[i]; ++i) {
strcat(field_list, table->fields[i]);
added_fields = 0;
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, ",");
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 "," */
......@@ -158,8 +191,8 @@ database_upgrade_scheme(va_list *db_list_ptr)
/* Copy the content of the old db into the new one */
char sql_upgrade_query[LKT_MAX_SQLITE_STATEMENT];
for (size_t i = 0; sql_tables_list[i]; ++i) {
const struct sql_table_description *sql_table = sql_tables_list[i];
for (size_t i = 0; i < sql_tables_list_count; ++i) {
const struct sql_table_description *sql_table = &sql_tables_list[i];
if (sql_table->minimal_version > version) {
LOG_INFO("DB-UPGRADE",
"Don't apply upgrade rule '%s' because the minimal database version "
......@@ -169,8 +202,8 @@ database_upgrade_scheme(va_list *db_list_ptr)
continue;
}
unless (
___compute_upgrade_sql_query(sql_table, sql_upgrade_query, LKT_MAX_SQLITE_STATEMENT)) {
unless (___compute_upgrade_sql_query(version, sql_table, sql_upgrade_query,
LKT_MAX_SQLITE_STATEMENT)) {
LOG_ERROR("DB-UPGRADE", "Can't upgrade the database, detach the new one and exit");
database_unprotected_detach(db, LKT_PROTECTED_DATABASE_NEW);
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