[tracker/wip/carlosg/sparql1.1: 143/145] libtracker-data: Store database locale inside meta.db
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/sparql1.1: 143/145] libtracker-data: Store database locale inside meta.db
- Date: Thu, 18 Jul 2019 22:36:03 +0000 (UTC)
commit 7b1c9a908c0581422655f31cb274ffcebe818524
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Jul 18 22:30:45 2019 +0200
libtracker-data: Store database locale inside meta.db
Instead of using a separate file for it. A "metadata" table was added
for this data, will also be useful for other ancillary data.
src/libtracker-data/tracker-data-manager.c | 16 +++-
src/libtracker-data/tracker-db-manager.c | 130 +++++++++++++++--------------
2 files changed, 82 insertions(+), 64 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index bc23740e7..f165eb241 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3478,6 +3478,14 @@ create_base_tables (TrackerDataManager *manager,
return FALSE;
}
+ tracker_db_interface_execute_query (iface, &internal_error,
+ "CREATE TABLE metadata (key TEXT NOT NULL PRIMARY KEY, value
TEXT)");
+
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ return FALSE;
+ }
+
return TRUE;
}
@@ -4949,9 +4957,11 @@ tracker_data_manager_initable_init (GInitable *initable,
return FALSE;
skip_ontology_check:
- /* If locale changed, re-create indexes */
- if (!read_only && tracker_db_manager_locale_changed (manager->db_manager, NULL)) {
- /* No need to reset the collator in the db interface,
+ if (!read_only && is_first_time_index) {
+ tracker_db_manager_set_current_locale (manager->db_manager);
+ } else if (!read_only && tracker_db_manager_locale_changed (manager->db_manager, NULL)) {
+ /* If locale changed, re-create indexes.
+ * No need to reset the collator in the db interface,
* as this is only executed during startup, which should
* already have the proper locale set in the collator */
tracker_data_manager_recreate_indexes (manager, &internal_error);
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c
index b741f0d6e..0a1a75439 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_LOCALE_FILE "db-locale.txt"
#define TRACKER_VACUUM_CHECK_SIZE ((goffset) 4 * 1024 * 1024 * 1024) /* 4GB */
@@ -163,7 +162,6 @@ static gboolean db_exec_no_reply (TrackerDBInt
static TrackerDBInterface *tracker_db_manager_create_db_interface (TrackerDBManager *db_manager,
gboolean readonly,
GError **error);
-static void db_remove_locale_file (TrackerDBManager *db_manager);
static TrackerDBInterface * init_writable_db_interface (TrackerDBManager *db_manager);
@@ -281,9 +279,64 @@ tracker_db_manager_remove_all (TrackerDBManager *db_manager)
filename = g_strdup_printf ("%s-wal", db_manager->db.abs_filename);
g_unlink (filename);
g_free (filename);
+}
+
+static gboolean
+tracker_db_manager_get_metadata (TrackerDBManager *db_manager,
+ const gchar *key,
+ GValue *value)
+{
+ TrackerDBInterface *iface;
+ TrackerDBStatement *stmt;
+ TrackerDBCursor *cursor;
+
+ iface = tracker_db_manager_get_writable_db_interface (db_manager);
+ stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+ NULL,
+ "SELECT value FROM metadata WHERE key = ?");
+ if (!stmt)
+ return FALSE;
+
+ tracker_db_statement_bind_text (stmt, 0, key);
+ cursor = tracker_db_statement_start_cursor (stmt, NULL);
+ g_object_unref (stmt);
+
+ if (!cursor || !tracker_db_cursor_iter_next (cursor, NULL, NULL)) {
+ g_clear_object (&cursor);
+ return FALSE;
+ }
+
+ tracker_db_cursor_get_value (cursor, 0, value);
+ g_object_unref (cursor);
+
+ return G_VALUE_TYPE (value) != G_TYPE_INVALID;
+}
+
+static void
+tracker_db_manager_set_metadata (TrackerDBManager *db_manager,
+ const gchar *key,
+ GValue *value)
+{
+ TrackerDBInterface *iface;
+ TrackerDBStatement *stmt;
+ GError *error = NULL;
+
+ iface = tracker_db_manager_get_writable_db_interface (db_manager);
+ stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
+ &error,
+ "INSERT OR REPLACE INTO metadata VALUES (?, ?)");
+ if (stmt) {
+ tracker_db_statement_bind_text (stmt, 0, key);
+ tracker_db_statement_bind_value (stmt, 1, value);
+ tracker_db_statement_execute (stmt, &error);
+
+ g_object_unref (stmt);
+ }
- /* Remove locale file also */
- db_remove_locale_file (db_manager);
+ if (error) {
+ g_critical ("Could not store database metadata: %s\n", error->message);
+ g_error_free (error);
+ }
}
static TrackerDBVersion
@@ -336,47 +389,17 @@ tracker_db_manager_update_version (TrackerDBManager *db_manager)
}
}
-static void
-db_remove_locale_file (TrackerDBManager *db_manager)
-{
- gchar *filename;
-
- filename = g_build_filename (db_manager->data_dir, TRACKER_DB_LOCALE_FILE, NULL);
- g_info (" Removing db-locale file:'%s'", filename);
- g_unlink (filename);
- g_free (filename);
-}
-
static gchar *
db_get_locale (TrackerDBManager *db_manager)
{
+ GValue value = G_VALUE_INIT;
gchar *locale = NULL;
- gchar *filename;
- filename = g_build_filename (db_manager->data_dir, TRACKER_DB_LOCALE_FILE, NULL);
-
- if (G_LIKELY (g_file_test (filename, G_FILE_TEST_EXISTS))) {
- gchar *contents;
-
- /* Check locale is correct */
- if (G_LIKELY (g_file_get_contents (filename, &contents, NULL, NULL))) {
- if (contents && strlen (contents) == 0) {
- g_critical (" Empty locale file found at '%s'", filename);
- g_free (contents);
- } else {
- /* Re-use contents */
- locale = contents;
- }
- } else {
- g_critical (" Could not get content of file '%s'", filename);
- }
- } else {
- /* expected when restoring from backup, always recreate indices */
- g_info (" Could not find database locale file:'%s'", filename);
- locale = g_strdup ("unknown");
- }
+ if (!tracker_db_manager_get_metadata (db_manager, "locale", &value))
+ return NULL;
- g_free (filename);
+ locale = g_value_dup_string (&value);
+ g_value_unset (&value);
return locale;
}
@@ -385,23 +408,13 @@ static void
db_set_locale (TrackerDBManager *db_manager,
const gchar *locale)
{
- GError *error = NULL;
- gchar *filename;
- gchar *str;
-
- filename = g_build_filename (db_manager->data_dir, TRACKER_DB_LOCALE_FILE, NULL);
- g_info (" Creating locale file '%s'", filename);
+ GValue value = G_VALUE_INIT;
- str = g_strdup_printf ("%s", locale ? locale : "");
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, locale);
- 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);
- }
-
- g_free (str);
- g_free (filename);
+ tracker_db_manager_set_metadata (db_manager, "locale", &value);
+ g_value_unset (&value);
}
gboolean
@@ -432,7 +445,8 @@ tracker_db_manager_locale_changed (TrackerDBManager *db_manager,
TRACKER_DB_INTERFACE_ERROR,
TRACKER_DB_OPEN_ERROR,
"Locale change detected (DB:%s, User/App:%s)",
- db_locale, current_locale);
+ db_locale ? db_locale : "unknown",
+ current_locale);
changed = TRUE;
} else {
g_info ("Current and DB locales match: '%s'", db_locale);
@@ -480,7 +494,6 @@ static void
db_recreate_all (TrackerDBManager *db_manager,
GError **error)
{
- gchar *locale;
GError *internal_error = NULL;
/* We call an internal version of this function here
@@ -502,11 +515,6 @@ db_recreate_all (TrackerDBManager *db_manager,
g_clear_object (&db_manager->db.iface);
g_clear_object (&db_manager->db.wal_iface);
-
- locale = tracker_locale_get (TRACKER_LOCALE_COLLATE);
- /* Initialize locale file */
- db_set_locale (db_manager, locale);
- g_free (locale);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]