[tracker/wip/carlosg/sparql1.1: 172/201] libtracker-data: Use user_version pragma to store database version



commit 54994a6116ba35fad6729ffa42d897df235a2ccf
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Jul 18 21:59:21 2019 +0200

    libtracker-data: Use user_version pragma to store database version
    
    Keep it inside the database, instead of in an additional file.

 src/libtracker-data/tracker-data-backup.c |   5 +-
 src/libtracker-data/tracker-db-manager.c  | 111 ++++++++++++------------------
 src/libtracker-data/tracker-db-manager.h  |   3 +-
 src/tracker/tracker-reset.c               |   1 -
 4 files changed, 45 insertions(+), 75 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-backup.c b/src/libtracker-data/tracker-data-backup.c
index 35acf7cbf..3ae82962b 100644
--- a/src/libtracker-data/tracker-data-backup.c
+++ b/src/libtracker-data/tracker-data-backup.c
@@ -259,10 +259,7 @@ tracker_data_backup_restore (TrackerDataManager   *manager,
 
                tracker_db_manager_ensure_locations (db_manager, cache_location, data_location);
 
-               /* Re-set the DB version file, so that its mtime changes. The mtime of this
-                * file will change only when the whole DB is recreated (after a hard reset
-                * or after a backup restoration). */
-               tracker_db_manager_create_version_file (db_manager);
+               tracker_db_manager_update_version (db_manager);
 
                manager = tracker_data_manager_new (flags, cache_location, data_location, ontology_location,
                                                    TRUE, select_cache_size, update_cache_size);
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c
index 769bec0f6..f70699081 100644
--- a/src/libtracker-data/tracker-db-manager.c
+++ b/src/libtracker-data/tracker-db-manager.c
@@ -61,7 +61,6 @@
 
 /* Set current database version we are working with */
 #define TRACKER_DB_VERSION_NOW        TRACKER_DB_VERSION_0_15_2
-#define TRACKER_DB_VERSION_FILE       "db-version.txt"
 #define TRACKER_DB_LOCALE_FILE        "db-locale.txt"
 
 #define TRACKER_VACUUM_CHECK_SIZE     ((goffset) 4 * 1024 * 1024 * 1024) /* 4GB */
@@ -290,73 +289,51 @@ tracker_db_manager_remove_all (TrackerDBManager *db_manager)
 static TrackerDBVersion
 db_get_version (TrackerDBManager *db_manager)
 {
-       TrackerDBVersion  version;
-       gchar            *filename;
-
-       filename = g_build_filename (db_manager->data_dir, TRACKER_DB_VERSION_FILE, NULL);
-
-       if (G_LIKELY (g_file_test (filename, G_FILE_TEST_EXISTS))) {
-               gchar *contents;
-
-               /* Check version is correct */
-               if (G_LIKELY (g_file_get_contents (filename, &contents, NULL, NULL))) {
-                       if (contents && strlen (contents) <= 2) {
-                               version = atoi (contents);
-                       } else {
-                               g_info ("  Version file content size is either 0 or bigger than expected");
-
-                               version = TRACKER_DB_VERSION_UNKNOWN;
-                       }
+       TrackerDBInterface *iface;
+       TrackerDBStatement *stmt;
+       TrackerDBCursor *cursor;
+       TrackerDBVersion version;
 
-                       g_free (contents);
-               } else {
-                       g_info ("  Could not get content of file '%s'", filename);
+       iface = tracker_db_manager_get_writable_db_interface (db_manager);
+       stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+                                                     NULL, "PRAGMA user_version");
+       if (!stmt)
+               return TRACKER_DB_VERSION_UNKNOWN;
 
-                       version = TRACKER_DB_VERSION_UNKNOWN;
-               }
-       } else {
-               g_info ("  Could not find database version file:'%s'", filename);
-               g_info ("  Current databases are either old or no databases are set up yet");
+       cursor = tracker_db_statement_start_cursor (stmt, NULL);
+       g_object_unref (stmt);
 
-               version = TRACKER_DB_VERSION_UNKNOWN;
+       if (!cursor || !tracker_db_cursor_iter_next (cursor, NULL, NULL)) {
+               g_clear_object (&cursor);
+               return TRACKER_DB_VERSION_UNKNOWN;
        }
 
-       g_free (filename);
+       version = tracker_db_cursor_get_int (cursor, 0);
+       g_object_unref (cursor);
 
        return version;
 }
 
 void
-tracker_db_manager_create_version_file (TrackerDBManager *db_manager)
+tracker_db_manager_update_version (TrackerDBManager *db_manager)
 {
+       TrackerDBInterface *iface;
+       TrackerDBStatement *stmt;
        GError *error = NULL;
-       gchar  *filename;
-       gchar  *str;
 
-       filename = g_build_filename (db_manager->data_dir, TRACKER_DB_VERSION_FILE, NULL);
-       g_info ("  Creating version file '%s'", filename);
-
-       str = g_strdup_printf ("%d", TRACKER_DB_VERSION_NOW);
-
-       if (!g_file_set_contents (filename, str, -1, &error)) {
-               g_info ("  Could not set file contents, %s",
-                       error ? error->message : "no error given");
-               g_clear_error (&error);
+       iface = tracker_db_manager_get_writable_db_interface (db_manager);
+       stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+                                                     &error, "PRAGMA user_version = %d",
+                                                     TRACKER_DB_VERSION_NOW);
+       if (stmt) {
+               tracker_db_statement_execute (stmt, &error);
+               g_object_unref (stmt);
        }
 
-       g_free (str);
-       g_free (filename);
-}
-
-void
-tracker_db_manager_remove_version_file (TrackerDBManager *db_manager)
-{
-       gchar *filename;
-
-       filename = g_build_filename (db_manager->data_dir, TRACKER_DB_VERSION_FILE, NULL);
-       g_info ("  Removing db-version file:'%s'", filename);
-       g_unlink (filename);
-       g_free (filename);
+       if (error) {
+               g_critical ("Could not set database version: %s\n", error->message);
+               g_error_free (error);
+       }
 }
 
 static void
@@ -651,19 +628,6 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
 
                g_mkdir_with_parents (db_manager->data_dir, 00755);
                g_mkdir_with_parents (db_manager->user_data_dir, 00755);
-
-               g_info ("Checking database version");
-
-               version = db_get_version (db_manager);
-
-               if (version < TRACKER_DB_VERSION_NOW) {
-                       g_info ("  A reindex will be forced");
-                       need_reindex = TRUE;
-               }
-
-               if (need_reindex) {
-                       tracker_db_manager_create_version_file (db_manager);
-               }
        }
 
        g_info ("Checking whether database files exist");
@@ -674,8 +638,7 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
         * There's no need to check for files not existing (for
         * reindex) if reindexing is already needed.
         */
-       if (!need_reindex &&
-           !g_file_test (db_manager->db.abs_filename, G_FILE_TEST_EXISTS)) {
+       if (!g_file_test (db_manager->db.abs_filename, G_FILE_TEST_EXISTS)) {
                if ((flags & TRACKER_DB_MANAGER_READONLY) == 0) {
                        g_info ("Could not find database file:'%s', reindex will be forced", 
db_manager->db.abs_filename);
                        need_reindex = TRUE;
@@ -688,8 +651,18 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
                        g_object_unref (db_manager);
                        return NULL;
                }
+       } else {
+               g_info ("Checking database version");
+
+               version = db_get_version (db_manager);
+
+               if (version < TRACKER_DB_VERSION_NOW) {
+                       g_info ("  A reindex will be forced");
+                       need_reindex = TRUE;
+               }
        }
 
+
        db_manager->locations_initialized = TRUE;
 
        /* Don't do remove-dbs for readonly (direct-access) */
@@ -735,6 +708,8 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
                        return NULL;
                }
 
+               tracker_db_manager_update_version (db_manager);
+
                /* Load databases */
                g_info ("Loading databases files...");
 
diff --git a/src/libtracker-data/tracker-db-manager.h b/src/libtracker-data/tracker-db-manager.h
index 5ce937773..8ec850e7f 100644
--- a/src/libtracker-data/tracker-db-manager.h
+++ b/src/libtracker-data/tracker-db-manager.h
@@ -71,8 +71,7 @@ void                tracker_db_manager_ensure_locations       (TrackerDBManager
                                                               GFile                 *cache_location,
                                                                GFile                 *data_location);
 gboolean            tracker_db_manager_has_enough_space       (TrackerDBManager      *db_manager);
-void                tracker_db_manager_create_version_file    (TrackerDBManager      *db_manager);
-void                tracker_db_manager_remove_version_file    (TrackerDBManager      *db_manager);
+void                tracker_db_manager_update_version         (TrackerDBManager      *db_manager);
 
 TrackerDBManagerFlags
                     tracker_db_manager_get_flags              (TrackerDBManager      *db_manager,
diff --git a/src/tracker/tracker-reset.c b/src/tracker/tracker-reset.c
index 18dab4e0d..8457f6261 100644
--- a/src/tracker/tracker-reset.c
+++ b/src/tracker/tracker-reset.c
@@ -263,7 +263,6 @@ reset_run (void)
 
                tracker_db_manager_remove_all (db_manager);
 
-               tracker_db_manager_remove_version_file (db_manager);
                g_object_unref (db_manager);
 
                /* Unset log handler */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]