Hey Jürg,

Can you review this one for me.

It fixes the issue that we had with the "DELETE FROM \"fts\" WHERE rowid
= ?" query.

I tried this in the tracker-fts-test.c program and I got the exact same
error, making be believe that FTS simply doesn't support this and that
we are getting a strange error back from sqlite.

I noticed that somewhere else in the code using the magic column "fts"
of that table, setting it to -1 for that rowid, appears to also delete. 

This however works only per column? 

So in this patch I iterate over all the properties that are fulltext and
I set the magic column "fts" to -1 for the rowid. Just like the other
place in the code does it (the else block a bit lower, but when the
predicate is rdfs:Resource we want to iter over all properties that are
possible, right? That's what this patch does indeed).



Feel free to take a look at these copy-pastes:

pvanh...@lors:~/repos/gnome/tracker/tracker-master/utils/tracker-fts$ 
./tracker-fts-test stew
Tracker-Message: Setting up monitor for changes to config 
file:'/home/pvanhoof/.config/tracker/tracker-fts.cfg'
** Message: Loading defaults into GKeyFile...
Tracker-Message: Setting up stopword list for language code:'en'
Tracker-Message: Setting up stemmer for language code:'en'
SQL error: bind or column index out of range
pvanh...@lors:~/repos/gnome/tracker/tracker-master/utils/tracker-fts$ git diff
diff --git a/utils/tracker-fts/tracker-fts-test.c 
b/utils/tracker-fts/tracker-fts-test.c
index 2ccf2e9..6acf77c 100644
--- a/utils/tracker-fts/tracker-fts-test.c
+++ b/utils/tracker-fts/tracker-fts-test.c
 -103,6 +103,7 @@ main (int argc, char **argv)
                exec_sql (db, "insert into recipe (cat, col_default, col_1, 
col_2) values (2, 'broccoli pie stew', 'broccoli,cheese
                exec_sql (db, "insert into recipe (cat, col_default, col_1, 
col_2) values (7, 'stew pumpkin pie stew', 'pumpkin,sug
                exec_sql (db, "insert into recipe (cat, col_default, col_1, 
col_2) values (6, 'stew pumpkin pie stew', 'pumpkin,sug
+               exec_sql (db, "delete from recipe where rowid = 1");
        }
 //     sql = g_strdup_printf ("select cat, count (*) from recipe where recipe 
match '%s' group by Cat", argv[1]);
 //     exec_sql (db, sql);
pvanh...@lors:~/repos/gnome/tracker/tracker-master/utils/tracker-fts$


(tracker-store:29814): Tracker-DEBUG: Preparing query: 'DELETE FROM "fts" WHERE 
rowid = ?'

Tracker-WARNING **: Could not perform SQLite operation, error:25->'bind or 
column index out of range'
aborting...

Program received signal SIGABRT, Aborted.
0xb7fe1424 in __kernel_vsyscall ()
(gdb) bt
#0  0xb7fe1424 in __kernel_vsyscall ()
#1  0xb7a273d0 in raise () from /lib/i686/cmov/libc.so.6
#2  0xb7a2aa85 in abort () from /lib/i686/cmov/libc.so.6
#3  0xb7c3740c in IA__g_logv (log_domain=0xb7f7d3fd "Tracker", 
log_level=G_LOG_LEVEL_WARNING, 
    format=0xb7f7d788 "Could not perform SQLite operation, error:%d->'%s'", 
args1=0xbfffe89c "\31")
    at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmessages.c:506
#4  0xb7c37436 in IA__g_log (log_domain=0xb7f7d3fd "Tracker", 
log_level=G_LOG_LEVEL_WARNING, 
    format=0xb7f7d788 "Could not perform SQLite operation, error:%d->'%s'")
    at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmessages.c:526
#5  0xb7f79941 in create_result_set_from_stmt (interface=0x8075520, 
stmt=0x84469c0, error=0x0)
    at tracker-db-interface-sqlite.c:604
#6  0xb7f7a19c in tracker_db_statement_sqlite_execute (stmt=0x8071f08, 
error=0x0) at tracker-db-interface-sqlite.c:875
#7  0xb7f772e2 in tracker_db_statement_execute (stmt=0x8071f08, error=0x0) at 
tracker-db-interface.c:424
#8  0xb7f945f6 in tracker_data_delete_statement (
    subject=0x8199ab0 
"file:///home/pvanhoof/repos/gnome/tracker/tracker-master/bleh", 
    predicate=0x81b7530 "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";, 
    object=0x84331c0 "http://www.w3.org/2000/01/rdf-schema#Resource";) at 
tracker-data-update.c:785
#9  0xb7f99e6f in tracker_sparql_query_execute_update (self=0x81a7178, 
query=0x8072000, delete_statements=1, error=0xbfffeac0)
    at tracker-sparql-query.c:1181
#10 0xb7f9948e in tracker_sparql_query_execute_delete (self=0x81a7178, 
query=0x8072000, error=0xbfffeaf8)
    at tracker-sparql-query.c:1007
#11 0xb7f9820f in tracker_sparql_query_execute (self=0x81a7178, 
error=0xbfffebb8) at tracker-sparql-query.c:629
#12 0xb7f96067 in tracker_data_update_sparql (update=0x8097020 "DELETE { <bleh> 
a rdfs:Resource }", error=0xbfffebb8)
    at tracker-data-update.c:1507
#13 0x0805791c in tracker_store_sparql_update (sparql=0x8097020 "DELETE { 
<bleh> a rdfs:Resource }", error=0xbfffebb8)
    at tracker-store.c:393
#14 0x0805302b in tracker_resources_sparql_update (self=0x840c8a8, 
update=0x8097020 "DELETE { <bleh> a rdfs:Resource }", 
    context=0x8096e08, error=0x0) at tracker-resources.c:294
#15 0x0804fa53 in dbus_glib_marshal_tracker_resources_VOID__STRING_POINTER 
(closure=0xbfffeeb8, return_value=0x0, 
    n_param_values=3, param_values=0x8426a18, invocation_hint=0x0, 
marshal_data=0x8052f6d) at tracker-resources-glue.h:93
#16 0xb7e05ff1 in ?? () from /usr/lib/libdbus-glib-1.so.2
#17 0xb7de0695 in ?? () from /lib/libdbus-1.so.3
#18 0xb7dd1dc4 in dbus_connection_dispatch () from /lib/libdbus-1.so.3
#19 0xb7e03b1d in ?? () from /usr/lib/libdbus-glib-1.so.2
---Type <return> to continue, or q <return> to quit---
#20 0xb7c2d368 in g_main_dispatch (context=0x806b740)
    at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmain.c:1824
#21 IA__g_main_context_dispatch (context=0x806b740) at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmain.c:2377
#22 0xb7c308c3 in g_main_context_iterate (context=0x806b740, block=1, 
dispatch=1, self=0x805fd08)
    at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmain.c:2455
#23 0xb7c30d8a in IA__g_main_loop_run (loop=0x807f788)
    at 
/build/buildd-glib2.0_2.20.4-1-i386-6KfM1O/glib2.0-2.20.4/glib/gmain.c:2663
#24 0x080519d8 in main (argc=1, argv=0xbffff264) at tracker-main.c:803
(gdb)



-- 
Philip Van Hoof, freelance software developer
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org 
http://pvanhoof.be/blog
http://codeminded.be
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 039bc95..f75d38f 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -737,6 +737,8 @@ tracker_data_delete_statement (const gchar            *subject,
 	types = tracker_data_query_rdf_type (subject_id);
 
 	if (object && g_strcmp0 (predicate, RDF_PREFIX "type") == 0) {
+		gboolean remove_fts;
+
 		class = tracker_ontology_get_class_by_uri (object);
 		if (class != NULL) {
 			TrackerDBInterface *iface;
@@ -779,14 +781,23 @@ tracker_data_delete_statement (const gchar            *subject,
 			tracker_db_statement_execute (stmt, NULL);
 			g_object_unref (stmt);
 
-			if (strcmp (tracker_class_get_name (class), "rdfs:Resource") == 0) {
-				stmt = tracker_db_interface_create_statement (iface, "DELETE FROM \"fts\" WHERE rowid = ?");
-				tracker_db_statement_bind_int (stmt, 0, subject_id);
-				tracker_db_statement_execute (stmt, NULL);
-				g_object_unref (stmt);
-			}
+			remove_fts = (strcmp (tracker_class_get_name (class), "rdfs:Resource") == 0);
 
 			for (prop = properties; *prop; prop++) {
+
+				if (remove_fts && tracker_property_get_domain (*prop) != class) {
+
+					if (tracker_property_get_fulltext_indexed (*prop)) {
+						stmt = tracker_db_interface_create_statement (iface,
+								"UPDATE \"fts\" SET \"%s\" = ?, \"fts\" = -1 WHERE rowid = ?",
+								tracker_property_get_name (*prop));
+						tracker_db_statement_bind_text (stmt, 0, object);
+						tracker_db_statement_bind_int (stmt, 1, subject_id);
+						tracker_db_statement_execute (stmt, NULL);
+						g_object_unref (stmt);
+					}
+				}
+
 				if (tracker_property_get_domain (*prop) != class
 				    || !tracker_property_get_multiple_values (*prop)) {
 					continue;
_______________________________________________
tracker-list mailing list
tracker-list@gnome.org
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to