[tracker/collation] libtracker-data: integrate collation function if envvar set



commit d10e3f15b3b57f8a1fc038863bed4bd72fe41f47
Author: Aleksander Morgado <aleksander lanedo com>
Date:   Mon Aug 16 16:34:34 2010 +0200

    libtracker-data: integrate collation function if envvar set

 src/libtracker-data/tracker-collation.c           |   58 ++++++++++-----------
 src/libtracker-data/tracker-collation.h           |   13 +++--
 src/libtracker-data/tracker-db-interface-sqlite.c |   43 +++++++++++----
 src/libtracker-data/tracker-db-interface-sqlite.h |    9 ++--
 4 files changed, 71 insertions(+), 52 deletions(-)
---
diff --git a/src/libtracker-data/tracker-collation.c b/src/libtracker-data/tracker-collation.c
index 441f22b..46bd98d 100644
--- a/src/libtracker-data/tracker-collation.c
+++ b/src/libtracker-data/tracker-collation.c
@@ -33,36 +33,35 @@
 
 #ifdef HAVE_LIBUNISTRING /* ---- GNU libunistring based collation ---- */
 
-gboolean
+gpointer
 tracker_collation_init (void)
 {
 	/* Nothing to do */
-	return TRUE;
+	return NULL;
 }
 
 void
-tracker_collation_deinit (void)
+tracker_collation_deinit (gpointer collator)
 {
 	/* Nothing to do */
 }
 
 gint
-tracker_collation_utf8 (gchar *str1,
-                        gint   len1,
-                        gchar *str2,
-                        gint   len2)
+tracker_collation_utf8 (gpointer      collator,
+                        gint          len1,
+                        gconstpointer str1,
+                        gint          len2,
+                        gconstpointer str2)
 {
 	return u8_strcoll (str1, str2);
 }
 
 #elif HAVE_LIBICU /* ---- ICU based collation (UTF-16) ----*/
 
-/* Global collator to be re-used every time */
-UCollator *collator;
-
-gboolean
+gpointer
 tracker_collation_init (void)
 {
+	UCollator *collator = NULL;
 	UErrorCode status = U_ZERO_ERROR;
 	const gchar *locale = setlocale (LC_ALL, NULL);
 
@@ -77,26 +76,24 @@ tracker_collation_init (void)
 		if (!collator) {
 			g_critical ("UCA Collator cannot be created: %s",
 			            u_errorName (status));
-			return FALSE;
 		}
 	}
-	return TRUE;
+	return collator;
 }
 
 void
-tracker_collation_deinit (void)
+tracker_collation_deinit (gpointer collator)
 {
-	if (collator) {
-		ucol_close (collator);
-		collator = NULL;
-	}
+	if (collator)
+		ucol_close ((UCollator *)collator);
 }
 
 gint
-tracker_collation_utf8 (gchar *str1,
-                        gint   len1,
-                        gchar *str2,
-                        gint   len2)
+tracker_collation_utf8 (gpointer      collator,
+                        gint          len1,
+                        gconstpointer str1,
+                        gint          len2,
+                        gconstpointer str2)
 {
 	UErrorCode status = U_ZERO_ERROR;
 	UCharIterator iter1;
@@ -110,7 +107,7 @@ tracker_collation_utf8 (gchar *str1,
 	uiter_setUTF8 (&iter1, str1, len1);
 	uiter_setUTF8 (&iter2, str2, len2);
 
-	result = ucol_strcollIter (collator,
+	result = ucol_strcollIter ((UCollator *)collator,
 	                           &iter1,
 	                           &iter2,
 	                           &status);
@@ -126,24 +123,25 @@ tracker_collation_utf8 (gchar *str1,
 
 #else /* ---- GLib based collation ---- */
 
-gboolean
+gpointer
 tracker_collation_init (void)
 {
 	/* Nothing to do */
-	return TRUE;
+	return NULL;
 }
 
 void
-tracker_collation_deinit (void)
+tracker_collation_deinit (gpointer collator)
 {
 	/* Nothing to do */
 }
 
 gint
-tracker_collation_utf8 (gchar *str1,
-                        gint   len1,
-                        gchar *str2,
-                        gint   len2)
+tracker_collation_utf8 (gpointer      collator,
+                        gint          len1,
+                        gconstpointer str1,
+                        gint          len2,
+                        gconstpointer str2)
 {
 	return g_utf8_collate (str1, str2);
 }
diff --git a/src/libtracker-data/tracker-collation.h b/src/libtracker-data/tracker-collation.h
index 5e3472c..c32b293 100644
--- a/src/libtracker-data/tracker-collation.h
+++ b/src/libtracker-data/tracker-collation.h
@@ -26,12 +26,13 @@ G_BEGIN_DECLS
 #error "only <libtracker-common/tracker-common.h> must be included directly."
 #endif
 
-gboolean tracker_collation_init   (void);
-void     tracker_collation_deinit (void);
-gint     tracker_collation_utf8   (gchar *str1,
-                                   gint   len1,
-                                   gchar *str2,
-                                   gint   len2);
+gpointer tracker_collation_init   (void);
+void     tracker_collation_deinit (gpointer  collator);
+gint     tracker_collation_utf8   (gpointer      collator,
+                                   gint          len1,
+                                   gconstpointer str1,
+                                   gint          len2,
+                                   gconstpointer str2);
 
 G_END_DECLS
 
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c
index 391ed0f..72fb28d 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -32,8 +32,13 @@
 #include <libtracker-fts/tracker-fts.h>
 #endif
 
+#include "tracker-collation.h"
+
 #include "tracker-db-interface-sqlite.h"
 
+/* Envvar to enable collation in sqlite */
+#define TRACKER_COLLATION_ENABLED "TRACKER_COLLATION_ENABLED"
+
 struct TrackerDBInterface {
 	GObject parent_instance;
 
@@ -44,6 +49,8 @@ struct TrackerDBInterface {
 
 	GSList *function_data;
 
+	gpointer collator;
+
 	guint ro : 1;
 #if HAVE_TRACKER_FTS
 	guint fts_initialized : 1;
@@ -642,6 +649,8 @@ tracker_db_interface_sqlite_finalize (GObject *object)
 
 	g_free (db_interface->filename);
 
+	tracker_collation_deinit (db_interface->collator);
+
 	G_OBJECT_CLASS (tracker_db_interface_parent_class)->finalize (object);
 }
 
@@ -686,6 +695,16 @@ tracker_db_interface_init (TrackerDBInterface *db_interface)
 	db_interface->ro = FALSE;
 
 	prepare_database (db_interface);
+
+	/* Set collation function if envvar set */
+	if (g_getenv (TRACKER_COLLATION_ENABLED)) {
+		db_interface->collator = tracker_collation_init ();
+		tracker_db_interface_sqlite_set_collation_function (db_interface,
+		                                                    "tracker-collation-utf8",
+		                                                    tracker_collation_utf8);
+	} else {
+		db_interface->collator = NULL;
+	}
 }
 
 static TrackerDBResultSet *
@@ -965,19 +984,19 @@ tracker_db_interface_sqlite_new_ro (const gchar *filename)
 	                     NULL);
 }
 
-static gint
-collation_function (gpointer      data,
-                    int           len1,
-                    gconstpointer str1,
-                    int           len2,
-                    gconstpointer str2)
-{
-	TrackerDBCollationFunc func;
+/* static gint */
+/* collation_function (gpointer      data, */
+/*                     int           len1, */
+/*                     gconstpointer str1, */
+/*                     int           len2, */
+/*                     gconstpointer str2) */
+/* { */
+/* 	TrackerDBCollationFunc func; */
 
-	func = (TrackerDBCollationFunc) data;
+/* 	func = (TrackerDBCollationFunc) data; */
 
-	return (func) ((gchar *) str1, len1, (gchar *) str2, len2);
-}
+/* 	return (func) ((gchar *) str1, len1, (gchar *) str2, len2); */
+/* } */
 
 gboolean
 tracker_db_interface_sqlite_set_collation_function (TrackerDBInterface       *interface,
@@ -988,7 +1007,7 @@ tracker_db_interface_sqlite_set_collation_function (TrackerDBInterface       *in
 
 	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (interface), FALSE);
 
-	result = sqlite3_create_collation (interface->db, name, SQLITE_UTF8, func, &collation_function);
+	result = sqlite3_create_collation (interface->db, name, SQLITE_UTF8, interface->collator, func);
 
 	return (result == SQLITE_OK);
 }
diff --git a/src/libtracker-data/tracker-db-interface-sqlite.h b/src/libtracker-data/tracker-db-interface-sqlite.h
index 52a45d2..680397a 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.h
+++ b/src/libtracker-data/tracker-db-interface-sqlite.h
@@ -28,10 +28,11 @@ G_BEGIN_DECLS
 #error "only <libtracker-data/tracker-data.h> must be included directly."
 #endif
 
-typedef gint (* TrackerDBCollationFunc) (gchar *str1,
-                                         gint   len1,
-                                         gchar *str2,
-                                         gint   len2);
+typedef gint (* TrackerDBCollationFunc) (gpointer      collator,
+                                         gint          len1,
+                                         gconstpointer str1,
+                                         gint          len2,
+                                         gconstpointer str2);
 
 TrackerDBInterface *tracker_db_interface_sqlite_new                    (const gchar              *filename);
 TrackerDBInterface *tracker_db_interface_sqlite_new_ro                 (const gchar              *filename);



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