[tracker] Performance improvement for the cursor API



commit 7845cc2d32a1542e110bd50f438a49332c69a835
Author: Philip Van Hoof <philip codeminded be>
Date:   Fri Aug 28 11:10:58 2009 +0200

    Performance improvement for the cursor API

 src/libtracker-db/tracker-db-backup.c           |   18 ++++--------
 src/libtracker-db/tracker-db-interface-sqlite.c |   35 ++++++++++++++++++++++-
 src/libtracker-db/tracker-db-interface.c        |   25 ++++++++++++++++
 src/libtracker-db/tracker-db-interface.h        |   14 +++++++++
 4 files changed, 79 insertions(+), 13 deletions(-)
---
diff --git a/src/libtracker-db/tracker-db-backup.c b/src/libtracker-db/tracker-db-backup.c
index 5905b69..d80f6cb 100644
--- a/src/libtracker-db/tracker-db-backup.c
+++ b/src/libtracker-db/tracker-db-backup.c
@@ -274,8 +274,6 @@ tracker_db_backup_sync_fts (void)
 	TrackerDBInterface *iface;
 	TrackerDBStatement *stmt;
 	TrackerDBCursor    *cursor;
-	GValue              id   = { 0 };
-	GValue              text = { 0 };
 	TrackerClass       *prop_class;
 	gchar              *query;
 
@@ -314,22 +312,18 @@ tracker_db_backup_sync_fts (void)
 
 			if (cursor) {
 				while (tracker_db_cursor_iter_next (cursor)) {
-					guint32 vid;
+					guint32 id;
+					const gchar *text;
 
-					tracker_db_cursor_get_value (cursor, 0, &id);
-					tracker_db_cursor_get_value (cursor, 1, &text);
-
-					vid = (guint32) g_value_get_int (&id);
+					id = tracker_db_cursor_get_int (cursor, 0);
+					text = tracker_db_cursor_get_string (cursor, 1);
 
 					// TODO we need to retrieve all existing (FTS indexed) property values for
 					// this resource to properly support incremental FTS updates
 					// (like calling deleteTerms and then calling insertTerms)
 
-					tracker_fts_update_init (vid);
-					tracker_fts_update_text (vid, 0,  g_value_get_string (&text));
-
-					g_value_unset (&id);
-					g_value_unset (&text);
+					tracker_fts_update_init (id);
+					tracker_fts_update_text (id, 0,  text);
 				}
 
 				g_object_unref (cursor);
diff --git a/src/libtracker-db/tracker-db-interface-sqlite.c b/src/libtracker-db/tracker-db-interface-sqlite.c
index 08d09ff..5884481 100644
--- a/src/libtracker-db/tracker-db-interface-sqlite.c
+++ b/src/libtracker-db/tracker-db-interface-sqlite.c
@@ -42,7 +42,8 @@
 
 #define TRACKER_DB_STATEMENT_SQLITE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_DB_STATEMENT_SQLITE, TrackerDBStatementSqlitePrivate))
 
-#define TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_DB_CURSOR_SQLITE, TrackerDBCursorSqlitePrivate))
+#define TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE_O(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_DB_CURSOR_SQLITE, TrackerDBCursorSqlitePrivate))
+#define TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE(o) (((TrackerDBCursorSqlite *)o)->priv)
 
 typedef struct TrackerDBInterfaceSqlitePrivate TrackerDBInterfaceSqlitePrivate;
 typedef struct TrackerDBStatementSqlitePrivate TrackerDBStatementSqlitePrivate;
@@ -55,6 +56,7 @@ typedef struct TrackerDBCursorSqliteClass TrackerDBCursorSqliteClass;
 
 struct TrackerDBCursorSqlite {
 	GObject parent_instance;
+	TrackerDBCursorSqlitePrivate *priv;
 };
 
 struct TrackerDBCursorSqliteClass {
@@ -1074,6 +1076,32 @@ tracker_db_cursor_sqlite_get_value (TrackerDBCursor *cursor,  guint column, GVal
 
 }
 
+static gint
+tracker_db_cursor_sqlite_get_int (TrackerDBCursor *cursor,  guint column)
+{
+	TrackerDBCursorSqlitePrivate *priv;
+	priv = TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE (cursor);
+	return (gint) sqlite3_column_int (priv->stmt, column);
+}
+
+
+static gdouble
+tracker_db_cursor_sqlite_get_double (TrackerDBCursor *cursor,  guint column)
+{
+	TrackerDBCursorSqlitePrivate *priv;
+	priv = TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE (cursor);
+	return (gdouble) sqlite3_column_double (priv->stmt, column);
+}
+
+
+static const gchar*
+tracker_db_cursor_sqlite_get_string (TrackerDBCursor *cursor,  guint column)
+{
+	TrackerDBCursorSqlitePrivate *priv;
+	priv = TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE (cursor);
+	return (const gchar *) sqlite3_column_text (priv->stmt, column);
+}
+
 static void
 tracker_db_interface_sqlite_disconnect (TrackerDBInterface *db_interface)
 {
@@ -1141,6 +1169,9 @@ tracker_db_cursor_sqlite_iface_init (TrackerDBCursorIface *iface)
 	iface->iter_next = tracker_db_cursor_sqlite_iter_next;
 	iface->get_n_columns = tracker_db_cursor_sqlite_get_n_columns;
 	iface->get_value = tracker_db_cursor_sqlite_get_value;
+	iface->get_int = tracker_db_cursor_sqlite_get_int;
+	iface->get_double = tracker_db_cursor_sqlite_get_double;
+	iface->get_string = tracker_db_cursor_sqlite_get_string;
 }
 
 static void
@@ -1151,6 +1182,8 @@ tracker_db_statement_sqlite_init (TrackerDBStatementSqlite *stmt)
 static void
 tracker_db_cursor_sqlite_init (TrackerDBCursorSqlite *cursor)
 {
+	TrackerDBCursorSqlitePrivate *priv = TRACKER_DB_CURSOR_SQLITE_GET_PRIVATE_O (cursor);
+	cursor->priv = priv;
 }
 
 static void
diff --git a/src/libtracker-db/tracker-db-interface.c b/src/libtracker-db/tracker-db-interface.c
index 8ec1ee0..9f63df7 100644
--- a/src/libtracker-db/tracker-db-interface.c
+++ b/src/libtracker-db/tracker-db-interface.c
@@ -504,6 +504,31 @@ tracker_db_cursor_get_value (TrackerDBCursor *cursor,  guint column, GValue *val
 	TRACKER_DB_CURSOR_GET_IFACE (cursor)->get_value (cursor, column, value);
 }
 
+const gchar*
+tracker_db_cursor_get_string (TrackerDBCursor *cursor, guint            column)
+{
+	g_return_if_fail (TRACKER_IS_DB_CURSOR (cursor));
+
+	return TRACKER_DB_CURSOR_GET_IFACE (cursor)->get_string (cursor, column);
+}
+
+gint
+tracker_db_cursor_get_int (TrackerDBCursor *cursor, guint            column)
+{
+	g_return_if_fail (TRACKER_IS_DB_CURSOR (cursor));
+
+	return TRACKER_DB_CURSOR_GET_IFACE (cursor)->get_int (cursor, column);
+}
+
+gdouble
+tracker_db_cursor_get_double (TrackerDBCursor *cursor, guint            column)
+{
+	g_return_if_fail (TRACKER_IS_DB_CURSOR (cursor));
+
+	return TRACKER_DB_CURSOR_GET_IFACE (cursor)->get_double (cursor, column);
+}
+
+
 
 /* TrackerDBResultSet semiprivate API */
 TrackerDBResultSet *
diff --git a/src/libtracker-db/tracker-db-interface.h b/src/libtracker-db/tracker-db-interface.h
index 99af0d9..cf59daf 100644
--- a/src/libtracker-db/tracker-db-interface.h
+++ b/src/libtracker-db/tracker-db-interface.h
@@ -181,6 +181,14 @@ struct TrackerDBCursorIface {
 	void     (*get_value)       (TrackerDBCursor *cursor, 
 	                             guint            column,
 	                             GValue          *value);
+
+	const gchar*  (*get_string) (TrackerDBCursor *cursor, 
+	                             guint            column);
+	gint          (*get_int)    (TrackerDBCursor *cursor, 
+	                             guint            column);
+	gdouble       (*get_double) (TrackerDBCursor *cursor, 
+	                             guint            column);
+
 };
 
 /* Functions to deal with a cursor */
@@ -190,6 +198,12 @@ guint			  tracker_db_cursor_get_n_columns   (TrackerDBCursor *cursor);
 void 			  tracker_db_cursor_get_value       (TrackerDBCursor *cursor, 
 			                                     guint            column, 
 			                                     GValue          *value);
+const gchar*		  tracker_db_cursor_get_string      (TrackerDBCursor *cursor, 
+			                                     guint            column);
+gint 			  tracker_db_cursor_get_int         (TrackerDBCursor *cursor, 
+			                                     guint            column);
+gdouble			  tracker_db_cursor_get_double      (TrackerDBCursor *cursor, 
+			                                     guint            column);
 
 
 G_END_DECLS



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