Commit 63dda94a authored by Max Kellermann's avatar Max Kellermann

database: save database format version

parent 7f9ee009
...@@ -41,9 +41,14 @@ ...@@ -41,9 +41,14 @@
#define DIRECTORY_INFO_BEGIN "info_begin" #define DIRECTORY_INFO_BEGIN "info_begin"
#define DIRECTORY_INFO_END "info_end" #define DIRECTORY_INFO_END "info_end"
#define DB_FORMAT_PREFIX "format: "
#define DIRECTORY_MPD_VERSION "mpd_version: " #define DIRECTORY_MPD_VERSION "mpd_version: "
#define DIRECTORY_FS_CHARSET "fs_charset: " #define DIRECTORY_FS_CHARSET "fs_charset: "
enum {
DB_FORMAT = 0,
};
static char *database_path; static char *database_path;
static struct directory *music_root; static struct directory *music_root;
...@@ -233,6 +238,7 @@ db_save(void) ...@@ -233,6 +238,7 @@ db_save(void)
/* block signals when writing the db so we don't get a corrupted db */ /* block signals when writing the db so we don't get a corrupted db */
fprintf(fp, "%s\n", DIRECTORY_INFO_BEGIN); fprintf(fp, "%s\n", DIRECTORY_INFO_BEGIN);
fprintf(fp, DB_FORMAT_PREFIX "%u\n", DB_FORMAT);
fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION); fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION);
fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, path_get_fs_charset()); fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, path_get_fs_charset());
fprintf(fp, "%s\n", DIRECTORY_INFO_END); fprintf(fp, "%s\n", DIRECTORY_INFO_END);
...@@ -259,6 +265,7 @@ db_load(GError **error) ...@@ -259,6 +265,7 @@ db_load(GError **error)
struct stat st; struct stat st;
GString *buffer = g_string_sized_new(1024); GString *buffer = g_string_sized_new(1024);
char *line; char *line;
int format = 0;
bool found_charset = false, found_version = false; bool found_charset = false, found_version = false;
bool success; bool success;
...@@ -285,7 +292,9 @@ db_load(GError **error) ...@@ -285,7 +292,9 @@ db_load(GError **error)
while ((line = read_text_line(fp, buffer)) != NULL && while ((line = read_text_line(fp, buffer)) != NULL &&
strcmp(line, DIRECTORY_INFO_END) != 0) { strcmp(line, DIRECTORY_INFO_END) != 0) {
if (g_str_has_prefix(line, DIRECTORY_MPD_VERSION)) { if (g_str_has_prefix(line, DB_FORMAT_PREFIX)) {
format = atoi(line + sizeof(DB_FORMAT_PREFIX) - 1);
} else if (g_str_has_prefix(line, DIRECTORY_MPD_VERSION)) {
if (found_version) { if (found_version) {
fclose(fp); fclose(fp);
g_set_error(error, db_quark(), 0, g_set_error(error, db_quark(), 0,
...@@ -330,6 +339,13 @@ db_load(GError **error) ...@@ -330,6 +339,13 @@ db_load(GError **error)
} }
} }
if (format != DB_FORMAT) {
g_set_error(error, db_quark(), 0,
"Database format mismatch, "
"discarding database file");
return false;
}
g_debug("reading DB"); g_debug("reading DB");
success = directory_load(fp, music_root, buffer, error); success = directory_load(fp, music_root, buffer, error);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment