diff options
author | Michal Hruby <michal.mhr@gmail.com> | 2012-04-06 10:43:18 +0200 |
---|---|---|
committer | Michal Hruby <michal.mhr@gmail.com> | 2012-04-06 10:43:18 +0200 |
commit | a1d5b19d396d24c4515b731f91f7b9b48092573e (patch) | |
tree | 3e9a9f4a29204936830c45517067643f7a1b72cd | |
parent | da41a43d7863e70030983b93ed1845e9715e3317 (diff) | |
parent | 6ed90110219c3df15437eac253d91067b9795020 (diff) | |
download | zeitgeist-a1d5b19d396d24c4515b731f91f7b9b48092573e.tar.gz |
Merge lp:~rainct/zeitgeist/rebuild-fts-on-new-db
-rw-r--r-- | extensions/fts++/controller.cpp | 5 | ||||
-rw-r--r-- | extensions/fts++/indexer.cpp | 26 | ||||
-rw-r--r-- | extensions/fts++/indexer.h | 1 | ||||
-rw-r--r-- | src/sql-schema.vala | 68 |
4 files changed, 78 insertions, 22 deletions
diff --git a/extensions/fts++/controller.cpp b/extensions/fts++/controller.cpp index ece90590..e8ce8f52 100644 --- a/extensions/fts++/controller.cpp +++ b/extensions/fts++/controller.cpp @@ -81,6 +81,11 @@ void Controller::RebuildIndex () // Set the db metadata key only once we're done PushTask (new MetadataTask ("fts_index_version", INDEX_VERSION)); + gint64 zg_creation_date = indexer->GetZeitgeistCreationDate (); + gchar *creation = g_strdup_printf ("%" G_GINT64_FORMAT, zg_creation_date); + std::string zg_creation_date_str (creation); + PushTask (new MetadataTask ("zg_db_creation_date", zg_creation_date_str)); + g_free (creation); } g_object_unref (time_range); diff --git a/extensions/fts++/indexer.cpp b/extensions/fts++/indexer.cpp index d2a09cd1..af96eac7 100644 --- a/extensions/fts++/indexer.cpp +++ b/extensions/fts++/indexer.cpp @@ -146,6 +146,14 @@ void Indexer::Initialize (GError **error) } } +gint64 Indexer::GetZeitgeistCreationDate () +{ + ZeitgeistSQLiteDatabase *database = zeitgeist_db_reader_get_database ( + zg_reader); + return zeitgeist_sq_lite_database_schema_get_creation_date ( + database->database); +} + /** * Returns true if and only if the index is good. * Otherwise the index should be rebuild. @@ -164,6 +172,24 @@ bool Indexer::CheckIndex () return false; } + // Get stored Zeitgeist DB creation date + gint64 metadata_date; + std::string metadata_date_str (db->get_metadata ("zg_db_creation_date")); + if (metadata_date_str.empty ()) + metadata_date = -1; + else + metadata_date = g_ascii_strtoll (metadata_date_str.c_str (), NULL, 0); + + // In case the Zeitgeist DB is newer than Xapian, we need to re-build. + // This may happen if the Zeitgeist DB gets corrupt and is re-created + // from scratch. + gint64 database_creation_date = GetZeitgeistCreationDate (); + if (database_creation_date != metadata_date) + { + g_message ("Zeitgeist database has been replaced. Doing full rebuild"); + return false; + } + return true; } diff --git a/extensions/fts++/indexer.h b/extensions/fts++/indexer.h index 309ca5df..cc00fe66 100644 --- a/extensions/fts++/indexer.h +++ b/extensions/fts++/indexer.h @@ -80,6 +80,7 @@ public: void IndexEvent (ZeitgeistEvent *event); void DeleteEvent (guint32 event_id); void SetDbMetadata (std::string const& key, std::string const& value); + gint64 GetZeitgeistCreationDate (); GPtrArray* Search (const gchar *search, ZeitgeistTimeRange *time_range, diff --git a/src/sql-schema.vala b/src/sql-schema.vala index 04f38cf0..4c369a96 100644 --- a/src/sql-schema.vala +++ b/src/sql-schema.vala @@ -38,6 +38,8 @@ namespace Zeitgeist.SQLite public const string CORE_SCHEMA = "core"; public const int CORE_SCHEMA_VERSION = 6; + private const string DATABASE_CREATION = "database_creation"; + public static void ensure_schema (Sqlite.Database database) throws EngineError { @@ -48,6 +50,12 @@ namespace Zeitgeist.SQLite { // most likely a new DB create_schema (database); + + // set database creation date + var schema_sql = ("INSERT INTO schema_version VALUES ('%s', %" + + int64.FORMAT + ")").printf (DATABASE_CREATION, + Timestamp.now ()); + exec_query (database, schema_sql); } else if (schema_version == 4 || schema_version == 5) { @@ -123,28 +131,44 @@ namespace Zeitgeist.SQLite public static int get_schema_version (Sqlite.Database database) throws EngineError { - var sql = "SELECT version FROM schema_version WHERE schema='core'"; - int schema_version = -1; - database.exec (sql, - (n_cols, values, column_names) => - { - if (values[0] != null) - { - schema_version = int.parse (values[0]); - } - return 0; - }, null); - - // we don't really care about the return value of exec, the result - // will be -1 if something went wrong anyway - debug ("schema_version is %d", schema_version); - - if (schema_version < -1) - { - throw new EngineError.DATABASE_CORRUPT ( - "Database corruption flag is set."); - } - return schema_version; + int schema_version = (int) get_schema_metadata (database, CORE_SCHEMA); + debug ("schema_version is %d", schema_version); + + if (schema_version < -1) + { + throw new EngineError.DATABASE_CORRUPT ( + "Database corruption flag is set."); + } + return schema_version; + } + + public static int64 get_creation_date (Sqlite.Database database) + { + return get_schema_metadata (database, DATABASE_CREATION); + } + + private static int64 get_schema_metadata (Sqlite.Database database, + string key) + { + var sql = "SELECT version FROM schema_version " + + "WHERE schema='%s'".printf (key); + + int64 schema_version = -1; + + database.exec (sql, + (n_cols, values, column_names) => + { + if (values[0] != null) + { + schema_version = int64.parse (values[0]); + } + return 0; + }, null); + + // we don't really care about the return value of exec, the result + // will be -1 if something went wrong anyway + + return schema_version; } public static void set_corruption_flag (Sqlite.Database database) |