[tracker/no-query-cache] libtracker-data: Disable query cache to avoid excessive memory use
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/no-query-cache] libtracker-data: Disable query cache to avoid excessive memory use
- Date: Mon, 20 Sep 2010 14:38:19 +0000 (UTC)
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]