[tracker/wip/carlosg/anonymous-nodes: 20/24] libtracker-data: Refurbish version management




commit 9497965b88e66a55e8d46fb8263c9cb50f9d1d5f
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Sep 27 11:56:42 2021 +0200

    libtracker-data: Refurbish version management
    
    Since 3.0, this version check just ensured we didn't open too old
    database versions. Add some infrastructure so the TrackerDataManager
    can handle format changes as new versions come in the 3.x series.

 src/libtracker-data/tracker-data-manager.c | 28 ++++++++++++++
 src/libtracker-data/tracker-db-manager.c   | 61 +++++++++++-------------------
 src/libtracker-data/tracker-db-manager.h   | 13 +++++++
 3 files changed, 63 insertions(+), 39 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index d94e8bb7e..0fe0f8ca0 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -4107,6 +4107,15 @@ update_interface_cb (TrackerDBManager   *db_manager,
        }
 }
 
+static gboolean
+tracker_data_manager_update_from_version (TrackerDataManager  *manager,
+                                          TrackerDBVersion     version,
+                                          GError             **error)
+{
+       tracker_db_manager_update_version (manager->db_manager);
+       return TRUE;
+}
+
 static gboolean
 tracker_data_manager_initable_init (GInitable     *initable,
                                     GCancellable  *cancellable,
@@ -4210,6 +4219,8 @@ tracker_data_manager_initable_init (GInitable     *initable,
                        return FALSE;
                }
 
+               tracker_db_manager_update_version (manager->db_manager);
+
                for (l = sorted; l; l = l->next) {
                        GError *ontology_error = NULL;
                        GFile *ontology_file = l->data;
@@ -4352,6 +4363,23 @@ tracker_data_manager_initable_init (GInitable     *initable,
                GError *n_error = NULL;
                gboolean transaction_started = FALSE;
                guint num_parsing_errors = 0;
+               TrackerDBVersion cur_version;
+
+               cur_version = tracker_db_manager_get_version (manager->db_manager);
+
+               if (cur_version < TRACKER_DB_VERSION_NOW) {
+                       tracker_data_begin_ontology_transaction (manager->data_update, &internal_error);
+                       if (internal_error) {
+                               g_propagate_error (error, internal_error);
+                               return FALSE;
+                       }
+                       transaction_started = TRUE;
+
+                       if (!tracker_data_manager_update_from_version (manager,
+                                                                      cur_version,
+                                                                      error))
+                               return FALSE;
+               }
 
                seen_classes = g_ptr_array_new_with_free_func (g_object_unref);
                seen_properties = g_ptr_array_new_with_free_func (g_object_unref);
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c
index 63a7989b0..bd8b067e9 100644
--- a/src/libtracker-data/tracker-db-manager.c
+++ b/src/libtracker-data/tracker-db-manager.c
@@ -53,9 +53,6 @@
 /* Required minimum space needed to create databases (5Mb) */
 #define TRACKER_DB_MIN_REQUIRED_SPACE 5242880
 
-/* Set current database version we are working with */
-#define TRACKER_DB_VERSION_NOW        TRACKER_DB_VERSION_2_3
-
 #define TRACKER_VACUUM_CHECK_SIZE     ((goffset) 4 * 1024 * 1024 * 1024) /* 4GB */
 
 #define IN_USE_FILENAME               ".meta.isrunning"
@@ -69,35 +66,6 @@
                    TRACKER_DB_MANAGER_FTS_ENABLE_STOP_WORDS |    \
                    TRACKER_DB_MANAGER_FTS_IGNORE_NUMBERS)
 
-typedef enum {
-       TRACKER_DB_VERSION_UNKNOWN, /* Unknown */
-       TRACKER_DB_VERSION_0_6_6,   /* before indexer-split */
-       TRACKER_DB_VERSION_0_6_90,  /* after  indexer-split */
-       TRACKER_DB_VERSION_0_6_91,  /* stable release */
-       TRACKER_DB_VERSION_0_6_92,  /* current TRUNK */
-       TRACKER_DB_VERSION_0_7_0,   /* vstore branch */
-       TRACKER_DB_VERSION_0_7_4,   /* nothing special */
-       TRACKER_DB_VERSION_0_7_12,  /* nmo ontology */
-       TRACKER_DB_VERSION_0_7_13,  /* coalesce & writeback */
-       TRACKER_DB_VERSION_0_7_17,  /* mlo ontology */
-       TRACKER_DB_VERSION_0_7_20,  /* nco im ontology */
-       TRACKER_DB_VERSION_0_7_21,  /* named graphs/localtime */
-       TRACKER_DB_VERSION_0_7_22,  /* fts-limits branch */
-       TRACKER_DB_VERSION_0_7_28,  /* RC1 + mto + nco:url */
-       TRACKER_DB_VERSION_0_8_0,   /* stable release */
-       TRACKER_DB_VERSION_0_9_0,   /* unstable release */
-       TRACKER_DB_VERSION_0_9_8,   /* affiliation cardinality + volumes */
-       TRACKER_DB_VERSION_0_9_15,  /* mtp:hidden */
-       TRACKER_DB_VERSION_0_9_16,  /* Fix for NB#184823 */
-       TRACKER_DB_VERSION_0_9_19,  /* collation */
-       TRACKER_DB_VERSION_0_9_21,  /* Fix for NB#186055 */
-       TRACKER_DB_VERSION_0_9_24,  /* nmo:PhoneMessage class */
-       TRACKER_DB_VERSION_0_9_34,  /* ontology cache */
-       TRACKER_DB_VERSION_0_9_38,  /* nie:url an inverse functional property */
-       TRACKER_DB_VERSION_0_15_2,  /* fts4 */
-       TRACKER_DB_VERSION_2_3      /* sparql1.1 */
-} TrackerDBVersion;
-
 typedef struct {
        TrackerDBInterface *iface;
        const gchar        *file;
@@ -129,6 +97,7 @@ struct _TrackerDBManager {
        guint s_cache_size;
        guint u_cache_size;
        gboolean first_time;
+       TrackerDBVersion db_version;
 
        gpointer vtab_data;
 
@@ -323,7 +292,7 @@ db_get_version (TrackerDBManager *db_manager)
        return version;
 }
 
-static void
+void
 tracker_db_manager_update_version (TrackerDBManager *db_manager)
 {
        TrackerDBInterface *iface;
@@ -554,7 +523,6 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
                         GError                **error)
 {
        TrackerDBManager *db_manager;
-       TrackerDBVersion version;
        int in_use_file;
        TrackerDBInterface *resources_iface;
        GError *internal_error = NULL;
@@ -607,14 +575,25 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
                        return NULL;
                }
        } else if ((flags & TRACKER_DB_MANAGER_SKIP_VERSION_CHECK) == 0) {
-               version = db_get_version (db_manager);
+               db_manager->db_version = db_get_version (db_manager);
 
-               if (version < TRACKER_DB_VERSION_NOW) {
+               if (db_manager->db_version < TRACKER_DB_VERSION_3_0 ||
+                   ((flags & TRACKER_DB_MANAGER_READONLY) != 0 &&
+                    db_manager->db_version < TRACKER_DB_VERSION_NOW)) {
                        g_set_error (error,
                                     TRACKER_DB_INTERFACE_ERROR,
                                     TRACKER_DB_OPEN_ERROR,
                                     "Database version is too old: got version %i, but %i is needed",
-                                    version, TRACKER_DB_VERSION_NOW);
+                                    db_manager->db_version, TRACKER_DB_VERSION_NOW);
+
+                       g_object_unref (db_manager);
+                       return NULL;
+               } else if (db_manager->db_version > TRACKER_DB_VERSION_NOW) {
+                       g_set_error (error,
+                                    TRACKER_DB_INTERFACE_ERROR,
+                                    TRACKER_DB_OPEN_ERROR,
+                                    "Database version is too new: got version %i, but %i is needed",
+                                    db_manager->db_version, TRACKER_DB_VERSION_NOW);
 
                        g_object_unref (db_manager);
                        return NULL;
@@ -666,8 +645,6 @@ tracker_db_manager_new (TrackerDBManagerFlags   flags,
                }
 
                g_clear_object (&db_manager->db.iface);
-
-               tracker_db_manager_update_version (db_manager);
        } else {
                TRACKER_NOTE (SQLITE, g_message ("Loading files for database %s...", 
db_manager->db.abs_filename));
 
@@ -1166,3 +1143,9 @@ tracker_db_manager_release_memory (TrackerDBManager *db_manager)
 
        g_async_queue_unlock (db_manager->interfaces);
 }
+
+TrackerDBVersion
+tracker_db_manager_get_version (TrackerDBManager *db_manager)
+{
+       return db_manager->db_version;
+}
diff --git a/src/libtracker-data/tracker-db-manager.h b/src/libtracker-data/tracker-db-manager.h
index 62bf3b944..eba56ce43 100644
--- a/src/libtracker-data/tracker-db-manager.h
+++ b/src/libtracker-data/tracker-db-manager.h
@@ -50,6 +50,15 @@ typedef enum {
        TRACKER_DB_MANAGER_SKIP_VERSION_CHECK    = 1 << 9,
 } TrackerDBManagerFlags;
 
+typedef enum {
+       TRACKER_DB_VERSION_UNKNOWN = 0,
+       /* Starts at 25 because we forgot to clean up */
+       TRACKER_DB_VERSION_3_0 = 25, /* 3.0 */
+} TrackerDBVersion;
+
+/* Set current database version we are working with */
+#define TRACKER_DB_VERSION_NOW        TRACKER_DB_VERSION_3_0
+
 int                 tracker_db_manager_rollback_db_creation   (TrackerDBManager *db_manager,
                                                                GError **error);
 
@@ -98,6 +107,10 @@ gboolean            tracker_db_manager_detach_database        (TrackerDBManager
                                                                GError               **error);
 void                tracker_db_manager_release_memory         (TrackerDBManager      *db_manager);
 
+TrackerDBVersion    tracker_db_manager_get_version            (TrackerDBManager      *db_manager);
+void                tracker_db_manager_update_version         (TrackerDBManager      *db_manager);
+
+
 G_END_DECLS
 
 #endif /* __LIBTRACKER_DB_MANAGER_H__ */


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