[tracker/no-query-cache] libtracker-data: Disable query cache to avoid excessive memory use



commit 0ba51b39b7c2d65dc7a55d98feede2e7ccd7d81b
Author: Jürg Billeter <j bitron ch>
Date:   Mon Sep 20 16:37:48 2010 +0200

    libtracker-data: Disable query cache to avoid excessive memory use

 src/libtracker-data/libtracker-data.vapi          |    1 +
 src/libtracker-data/tracker-db-interface-sqlite.c |   66 ++++++++++++---------
 src/libtracker-data/tracker-db-interface.h        |    4 +
 src/libtracker-data/tracker-sparql-query.vala     |    2 +-
 4 files changed, 45 insertions(+), 28 deletions(-)
---
diff --git a/src/libtracker-data/libtracker-data.vapi b/src/libtracker-data/libtracker-data.vapi
index 4bdef4f..44e7a00 100644
--- a/src/libtracker-data/libtracker-data.vapi
+++ b/src/libtracker-data/libtracker-data.vapi
@@ -36,6 +36,7 @@ namespace Tracker {
 
 	[CCode (cheader_filename = "libtracker-data/tracker-db-interface.h")]
 	public interface DBInterface : GLib.Object {
+		public abstract DBStatement create_statement_uncached (string query) throws DBInterfaceError;
 		[PrintfFormat]
 		public abstract DBStatement create_statement (...) throws DBInterfaceError;
 	}
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c
index 5e45fa8..b1444df 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -813,6 +813,42 @@ add_row (TrackerDBResultSet *result_set,
 
 
 TrackerDBStatement *
+tracker_db_interface_create_statement_uncached (TrackerDBInterface  *db_interface,
+                                                const gchar         *query,
+                                                GError             **error)
+{
+	sqlite3_stmt *sqlite_stmt;
+	int retval;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (db_interface), NULL);
+	g_return_val_if_fail (!db_interface->pending, NULL);
+
+	g_debug ("Preparing query: '%s'", query);
+
+	retval = sqlite3_prepare_v2 (db_interface->db, query, -1, &sqlite_stmt, NULL);
+
+	if (retval != SQLITE_OK) {
+
+		if (retval == SQLITE_INTERRUPT) {
+			g_set_error (error,
+			             TRACKER_DB_INTERFACE_ERROR,
+			             TRACKER_DB_INTERRUPTED,
+			             "Interrupted");
+		} else {
+			g_set_error (error,
+			             TRACKER_DB_INTERFACE_ERROR,
+			             TRACKER_DB_QUERY_ERROR,
+			             "%s",
+			             sqlite3_errmsg (db_interface->db));
+		}
+
+		return NULL;
+	}
+
+	return tracker_db_statement_sqlite_new (db_interface, sqlite_stmt);
+}
+
+TrackerDBStatement *
 tracker_db_interface_create_statement (TrackerDBInterface  *db_interface,
                                        GError             **error,
                                        const gchar         *query,
@@ -837,40 +873,16 @@ tracker_db_interface_create_statement (TrackerDBInterface  *db_interface,
 	}
 
 	if (!stmt) {
-		sqlite3_stmt *sqlite_stmt;
-		int retval;
-
-		g_debug ("Preparing query: '%s'", full_query);
-
-		retval = sqlite3_prepare_v2 (db_interface->db, full_query, -1, &sqlite_stmt, NULL);
-
-		if (retval != SQLITE_OK) {
-
-			if (retval == SQLITE_INTERRUPT) {
-				g_set_error (error,
-				             TRACKER_DB_INTERFACE_ERROR,
-				             TRACKER_DB_INTERRUPTED,
-				             "Interrupted");
-			} else {
-				g_set_error (error,
-				             TRACKER_DB_INTERFACE_ERROR,
-				             TRACKER_DB_QUERY_ERROR,
-				             "%s",
-				             sqlite3_errmsg (db_interface->db));
-			}
-
-			g_free (full_query);
-
+		stmt = tracker_db_interface_create_statement_uncached (db_interface, full_query, error);
+		if (!stmt) {
 			return NULL;
 		}
 
-		stmt = tracker_db_statement_sqlite_new (db_interface, sqlite_stmt);
-
 		/* use replace instead of insert to make sure we store the string that
 		   belongs to the right sqlite statement to ensure the lifetime of the string
 		   matches the statement */
 		g_hash_table_replace (db_interface->dynamic_statements,
-		                      (gpointer) sqlite3_sql (sqlite_stmt),
+		                      (gpointer) sqlite3_sql (stmt->stmt),
 		                      stmt);
 	} else {
 		tracker_db_statement_sqlite_reset (stmt);
diff --git a/src/libtracker-data/tracker-db-interface.h b/src/libtracker-data/tracker-db-interface.h
index d63e1b1..f50dedb 100644
--- a/src/libtracker-data/tracker-db-interface.h
+++ b/src/libtracker-data/tracker-db-interface.h
@@ -87,6 +87,10 @@ GType                   tracker_db_cursor_get_type              (void);
 GType                   tracker_db_result_set_get_type          (void);
 
 /* Functions to create queries/procedures */
+TrackerDBStatement *    tracker_db_interface_create_statement_uncached
+                                                                (TrackerDBInterface   *interface,
+                                                                 const gchar          *query,
+                                                                 GError              **error);
 TrackerDBStatement *    tracker_db_interface_create_statement   (TrackerDBInterface   *interface,
                                                                  GError              **error,
                                                                  const gchar          *query,
diff --git a/src/libtracker-data/tracker-sparql-query.vala b/src/libtracker-data/tracker-sparql-query.vala
index 4238a10..4c3c845 100644
--- a/src/libtracker-data/tracker-sparql-query.vala
+++ b/src/libtracker-data/tracker-sparql-query.vala
@@ -486,7 +486,7 @@ public class Tracker.Sparql.Query : Object {
 
 	DBStatement prepare_for_exec (string sql) throws DBInterfaceError, Sparql.Error, DateError {
 		var iface = DBManager.get_db_interface ();
-		var stmt = iface.create_statement ("%s", sql);
+		var stmt = iface.create_statement_uncached (sql);
 
 		// set literals specified in query
 		int i = 0;



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