Skip to content
GitLab
Explorer
Connexion
Navigation principale
Rechercher ou aller à…
Projet
lektor
Gestion
Activité
Membres
Labels
Programmation
Tickets
Tableaux des tickets
Jalons
Code
Requêtes de fusion
Dépôt
Branches
Validations
Étiquettes
Graphe du dépôt
Comparer les révisions
Compilation
Pipelines
Jobs
Planifications de pipeline
Artéfacts
Aide
Aide
Support
Documentation de GitLab
Comparer les forfaits GitLab
Forum de la communauté GitLab
Contribuer à GitLab
Donner votre avis
Raccourcis clavier
?
Extraits de code
Groupes
Projets
Afficher davantage de fils d'Ariane
Kubat
lektor
Validations
24735df7
Vérifiée
Valider
24735df7
rédigé
17 févr. 2022
par
Kubat
Parcourir les fichiers
Options
Téléchargements
Correctifs
Plain Diff
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
!192
Resolve "FEATURE: Use time stamp from kurisu in update process"
Modifications
1
Afficher les modifications d'espaces
En ligne
Côte à côte
Affichage de
1 fichier modifié
src/database/upgrade.c
+94
-61
94 ajouts, 61 suppressions
src/database/upgrade.c
avec
94 ajouts
et
61 suppressions
src/database/upgrade.c
+
94
−
61
Voir le fichier @
24735df7
...
@@ -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
;
...
...
Ce diff est replié.
Cliquez pour l'agrandir.
Aperçu
0%
Chargement en cours
Veuillez réessayer
ou
joindre un nouveau fichier
.
Annuler
You are about to add
0
people
to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Enregistrer le commentaire
Annuler
Veuillez vous
inscrire
ou vous
se connecter
pour commenter