diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-07-20 00:35:21 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2015-07-21 21:57:20 +0200 |
commit | 81135ae19c727df716d0c0945869462e75a53497 (patch) | |
tree | 5f6e0f4f92f32b133e76afa3eec1ecc0d6faee90 | |
parent | 877e284348becbb370c7a9aa510c06a4b347ed33 (diff) | |
download | tracker-81135ae19c727df716d0c0945869462e75a53497.tar.gz |
libtracker-data: Add function to delete an entire row from the FTS table
This can be used as an optimization, instead of updating each column
individually as we currently do.
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.c | 44 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.h | 2 |
2 files changed, 45 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c index 88b1301ed..7ea87c8f1 100644 --- a/src/libtracker-data/tracker-db-interface-sqlite.c +++ b/src/libtracker-data/tracker-db-interface-sqlite.c @@ -91,6 +91,7 @@ struct TrackerDBInterface { gchar *busy_status; gchar *fts_insert_str; + gchar *fts_delete_str; }; struct TrackerDBInterfaceClass { @@ -1149,17 +1150,20 @@ tracker_db_interface_sqlite_fts_init (TrackerDBInterface *db_interface, fts_columns = _fts_create_properties (properties); if (fts_columns) { - GString *insert, *select; + GString *insert, *select, *delete, cols; gint i = 0; insert = g_string_new ("INSERT INTO fts (docid"); select = g_string_new ("SELECT rowid"); + delete = g_string_new ("UPDATE fts SET docid=?"); while (fts_columns[i]) { g_string_append_printf (insert, ", \"%s\"", fts_columns[i]); g_string_append_printf (select, ", \"%s\"", fts_columns[i]); + g_string_append_printf (delete, ", \"%s\"=\"\"", + fts_columns[i]); i++; } @@ -1170,6 +1174,9 @@ tracker_db_interface_sqlite_fts_init (TrackerDBInterface *db_interface, g_string_free (select, TRUE); db_interface->fts_insert_str = g_string_free (insert, FALSE); + g_string_append (delete, " WHERE docid=?"); + db_interface->fts_delete_str = g_string_free (delete, FALSE); + g_strfreev (fts_columns); } #endif @@ -1287,6 +1294,40 @@ tracker_db_interface_sqlite_fts_delete_text (TrackerDBInterface *db_interface, return TRUE; } +gboolean +tracker_db_interface_sqlite_fts_delete_id (TrackerDBInterface *db_interface, + int id) +{ + TrackerDBStatement *stmt; + GError *error = NULL; + + stmt = tracker_db_interface_create_statement (db_interface, + TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, + &error, + db_interface->fts_delete_str); + if (!stmt || error) { + if (error) { + g_warning ("Could not create FTS delete statement: %s", + error->message); + g_error_free (error); + } + return FALSE; + } + + tracker_db_statement_bind_int (stmt, 0, id); + tracker_db_statement_bind_int (stmt, 1, id); + tracker_db_statement_execute (stmt, &error); + g_object_unref (stmt); + + if (error) { + g_warning ("Could not delete FTS content: %s", error->message); + g_error_free (error); + return FALSE; + } + + return TRUE; +} + void tracker_db_interface_sqlite_fts_rebuild_tokens (TrackerDBInterface *interface) { @@ -1341,6 +1382,7 @@ tracker_db_interface_sqlite_finalize (GObject *object) close_database (db_interface); g_free (db_interface->fts_insert_str); + g_free (db_interface->fts_delete_str); g_message ("Closed sqlite3 database:'%s'", db_interface->filename); diff --git a/src/libtracker-data/tracker-db-interface-sqlite.h b/src/libtracker-data/tracker-db-interface-sqlite.h index a6ac9bc45..18c020450 100644 --- a/src/libtracker-data/tracker-db-interface-sqlite.h +++ b/src/libtracker-data/tracker-db-interface-sqlite.h @@ -61,6 +61,8 @@ int tracker_db_interface_sqlite_fts_update_text (TrackerD gboolean tracker_db_interface_sqlite_fts_delete_text (TrackerDBInterface *db_interface, int id, const gchar *property); +gboolean tracker_db_interface_sqlite_fts_delete_id (TrackerDBInterface *interface, + int id); void tracker_db_interface_sqlite_fts_update_commit (TrackerDBInterface *interface); void tracker_db_interface_sqlite_fts_update_rollback (TrackerDBInterface *interface); |