Re: [Tracker] tracker: please consider dropping dependency on qdbm



On sam, nov 24, 2007 at 11:31:34 +0000, Pierre Habouzit wrote:
Package: tracker
Severity: normal
Tags: patch


  Hi, you may want to have a look at http://bugs.debian.org/452074 for a
background on why.

  Though, the same upstream author released a rework of QDBM named Tokyo
Cabinet, that just hit unstable. Here is a patch that does the following

  And of course I messed up and forgot to add the patch â here it is.

-- 
ÂOÂ  Pierre Habouzit
ÂÂO                                                madcoder debian org
OOO                                                http://www.madism.org
diff --git a/configure.ac b/configure.ac
index 126f653..9c305e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -207,7 +207,6 @@ fi
 AM_CONDITIONAL(HAVE_RECENT_GLIB, test "$have_recent_glib" = "yes")
 
 
-
 ####################################################################
 # External QDBM check
 ####################################################################
@@ -233,6 +232,17 @@ AC_SUBST(QDBM_CFLAGS)
 AC_SUBST(QDBM_LIBS)
 
 
+####################################################################
+# check for Tokyo Cabinet
+####################################################################
+
+TOKYOCABINET_REQUIRED=1.0.6
+
+PKG_CHECK_MODULES(TOKYOCABINET, [ tokyocabinet >= $TOKYOCABINET_REQUIRED ])
+
+AC_SUBST(TOKYOCABINET_CFLAGS)
+AC_SUBST(TOKYOCABINET_LIBS)
+
 
 ##################################################################
 # check for libxml2
diff --git a/src/trackerd/Makefile.am b/src/trackerd/Makefile.am
index 39fcc98..25f8076 100644
--- a/src/trackerd/Makefile.am
+++ b/src/trackerd/Makefile.am
@@ -9,6 +9,7 @@ INCLUDES =                              \
        $(DBUS_CFLAGS)                  \
        $(SQLITE3_CFLAGS)               \
        $(QDBM_CFLAGS)                  \
+       $(TOKYOCABINET_CFLAGS)          \
        $(UNAC_CFLAGS)          
 
 
@@ -107,6 +108,7 @@ trackerd_LDADD =                    \
        $(GMIME_LIBS)                   \
        $(SQLITE3_LIBS)                 \
        $(QDBM_LIBS)                    \
+       $(TOKYOCABINET_LIBS)            \
        $(UNAC_LIBS)                    \
        $(GTHREAD_LIBS)                 \
        -lz                             \
diff --git a/src/trackerd/tracker-cache.c b/src/trackerd/tracker-cache.c
index 7b9ef15..f04eff9 100644
--- a/src/trackerd/tracker-cache.c
+++ b/src/trackerd/tracker-cache.c
@@ -156,7 +156,7 @@ tracker_cache_flush_all (gboolean cache_full)
                /* determine is index has been written to significantly before and create new ones if so */
                if (tracker_indexer_size (tracker->file_index) > 4000000) {
                        index_con.file_index = create_merge_index ("file-index.tmp.");
-                       tracker_log ("flushing to %s", dpname (index_con.file_index->word_index));
+                       tracker_log ("flushing to %s", index_con.file_index->word_index->path);
                        using_file_tmp = TRUE;
                } else {
                        index_con.file_index = tracker->file_index;
diff --git a/src/trackerd/tracker-dbus-search.c b/src/trackerd/tracker-dbus-search.c
index ae29f3b..e2e1100 100644
--- a/src/trackerd/tracker-dbus-search.c
+++ b/src/trackerd/tracker-dbus-search.c
@@ -956,20 +956,20 @@ tracker_dbus_method_search_suggest (DBusRec *rec)
 
        Indexer *index = tracker->file_index;
 
-       dpiterinit (index->word_index);
+       tchdbiterinit (index->word_index);
 
        g_get_current_time (&start);
 
-       str = dpiternext (index->word_index, NULL);
+       str = tchdbiternext (index->word_index, NULL);
        while (str != NULL) {
                dist = levenshtein (term, str, 0);
                if (dist != -1 && dist < maxdist) {
                        hits = 0;
-                       if ((tmp = dpget (index->word_index, str, -1, 0, -1, &tsiz)) != NULL) {
+                       if ((tmp = tchdbget3 (index->word_index, str, -1, &tsiz, -1)) != NULL) {
                                hits = tsiz / sizeof (WordDetails);
                                free (tmp);
                                if (tsiz % sizeof (WordDetails) != 0) {
-                                       tracker_set_error (rec, "Possible data error from dpget  Aborting 
tracker_dbus_method_search_suggest.");
+                                       tracker_set_error (rec, "Possible data error from tchdbget  Aborting 
tracker_dbus_method_search_suggest.");
                                        g_free (str);
                                        if (winner_str) {
                                                g_free (winner_str);
@@ -998,7 +998,7 @@ tracker_dbus_method_search_suggest (DBusRec *rec)
                        tracker_log ("Timeout in tracker_dbus_method_search_suggest");
                        break;
                }
-               str = dpiternext (index->word_index, NULL);
+               str = tchdbiternext (index->word_index, NULL);
        }
 
        if (winner_str == NULL) {
diff --git a/src/trackerd/tracker-indexer.c b/src/trackerd/tracker-indexer.c
index e0db318..478c5b0 100644
--- a/src/trackerd/tracker-indexer.c
+++ b/src/trackerd/tracker-indexer.c
@@ -45,7 +45,7 @@ get_score (WordDetails *details)
        a[0] = (details->amalgamated >> 16) & 0xFF;
        a[1] = (details->amalgamated >> 8) & 0xFF;
 
-       return (a[0] << 8) | (a[1]);    
+       return (a[0] << 8) | (a[1]);
 }
 
 
@@ -71,13 +71,13 @@ tracker_indexer_calc_amalgamated (gint service, gint score)
 
        service_type = (guint8) service;
 
-       /* amalgamate and combine score and service_type into a single 32-bit int for compact storage */      
  
+       /* amalgamate and combine score and service_type into a single 32-bit int for compact storage */
        a[0] = service_type;
        a[1] = (score16 >> 8 ) & 0xFF ;
        a[2] = score16 & 0xFF ;
        a[3] = 0;
 
-       return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];        
+       return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
 }
 
 
@@ -107,7 +107,7 @@ copy_search_hit (SearchHit *src)
 }
 
 
-static gint 
+static gint
 compare_words (const void *a, const void *b)
 {
        WordDetails *ap, *bp;
@@ -119,7 +119,7 @@ compare_words (const void *a, const void *b)
 }
 
 
-static gint 
+static gint
 compare_search_hits (const void *a, const void *b)
 {
        SearchHit *ap, *bp;
@@ -131,7 +131,7 @@ compare_search_hits (const void *a, const void *b)
 }
 
 
-static gint 
+static gint
 compare_search_words (const void *a, const void *b)
 {
        SearchWord *ap, *bp;
@@ -139,11 +139,11 @@ compare_search_words (const void *a, const void *b)
        ap = (SearchWord *)a;
        bp = (SearchWord *)b;
 
-       return (ap->hit_count - bp->hit_count); 
+       return (ap->hit_count - bp->hit_count);
 }
 
 
-void           
+void
 tracker_index_free_hit_list (GSList *hit_list)
 {
        GSList *lst;
@@ -167,15 +167,15 @@ get_preferred_bucket_count (Indexer *indexer)
 
        if (tracker->index_bucket_ratio < 1) {
 
-               result = (dprnum (indexer->word_index)/2);
+               result = (tchdbrnum (indexer->word_index)/2);
 
        } else if (tracker->index_bucket_ratio > 3) {
 
-               result = (dprnum (indexer->word_index) * 4);
+               result = (tchdbrnum (indexer->word_index) * 4);
 
        } else {
 
-               result = (tracker->index_bucket_ratio * dprnum (indexer->word_index));
+               result = (tracker->index_bucket_ratio * tchdbrnum (indexer->word_index));
        }
 
        tracker_log ("Preferred bucket count is %d", result);
@@ -183,31 +183,52 @@ get_preferred_bucket_count (Indexer *indexer)
        return  result;
 }
 
+bool
+tracker_update_index (const gchar *name, TCHDB *db)
+{
+       DEPOT *qdb = dpopen (name, DP_OREADER | DP_ONOLCK, 0);
+       char *k, *v;
+       int klen, vlen;
+
+       if (!qdb)
+               return false;
+
+       unlink (name);
+       if (!tchdbopen (db, name, HDBOWRITER | HDBOCREAT | HDBONOLCK)) {
+               g_assert ("FATAL: index file is dead (suggest delete index file and restart trackerd)");
+       }
+
+       dpiterinit (qdb);
+       while ((k = dpiternext (qdb, &klen))) {
+               v = dpget (qdb, k, klen, 0, -1, &vlen);
+               tchdbput (db, k, klen, v, vlen);
+               free (v);
+               free (k);
+       }
+       dpclose (qdb);
+       return true;
+}
+
 
-static inline DEPOT *
+static inline TCHDB *
 open_index (const gchar *name)
 {
-       DEPOT *word_index;
+       TCHDB *word_index = tchdbnew();
+       bool result;
 
        tracker_log ("Opening index %s", name);
 
-       if (strstr (name, "tmp")) {
-               word_index = dpopen (name, DP_OWRITER | DP_OCREAT | DP_ONOLCK, 
tracker->min_index_bucket_count);
-       } else {
-               word_index = dpopen (name, DP_OWRITER | DP_OCREAT | DP_ONOLCK, 
tracker->max_index_bucket_count);
+       result = tchdbopen (word_index, name, HDBOWRITER | HDBOCREAT | HDBONOLCK);
+       if (!result && tchdbecode (word_index) == TCEMETA) {
+               /* probably a qdbm database, try to upgrade it */
+               result = tracker_update_index (name, word_index);
        }
 
-       if (!word_index) {
-               tracker_log ("%s index was not closed properly and caused error %s- attempting repair", name, 
dperrmsg (dpecode));
-               if (dprepair (name)) {
-                       word_index = dpopen (name, DP_OWRITER | DP_OCREAT | DP_ONOLCK, 
tracker->min_index_bucket_count);
-               } else {
-                       g_assert ("FATAL: index file is dead (suggest delete index file and restart 
trackerd)");
-               }
+       if (!result) {
+               g_assert ("FATAL: index file is dead (suggest delete index file and restart trackerd)");
        }
 
        return word_index;
-
 }
 
 
@@ -215,19 +236,19 @@ Indexer *
 tracker_indexer_open (const gchar *name)
 {
        char *word_dir;
-       DEPOT *word_index;
+       TCHDB *word_index;
        Indexer *result;
 
        word_dir = g_build_filename (tracker->data_dir, name, NULL);
 
        word_index = open_index (word_dir);
-       
+
        g_free (word_dir);
 
        result = g_new0 (Indexer, 1);
 
        result->main_index = FALSE;
-       
+
        result->needs_merge = FALSE;
 
        result->name = g_strdup (name);
@@ -236,14 +257,12 @@ tracker_indexer_open (const gchar *name)
 
        result->word_mutex = g_mutex_new ();
 
-       dpsetalign (word_index , 8);
-
        /* re optimize database if bucket count < rec count */
 
        int bucket_count, rec_count;
 
-       bucket_count = dpbnum (result->word_index);
-       rec_count = dprnum (result->word_index);
+       bucket_count = tchdbbnum (result->word_index);
+       rec_count = tchdbrnum (result->word_index);
 
        tracker_log ("Bucket count (max is %d) is %d and Record Count is %d", 
tracker->max_index_bucket_count, bucket_count, rec_count);
 
@@ -253,14 +272,15 @@ tracker_indexer_open (const gchar *name)
 
 void
 tracker_indexer_close (Indexer *indexer)
-{      
+{
        g_return_if_fail (indexer);
 
        g_mutex_lock (indexer->word_mutex);
 
-       if (!dpclose (indexer->word_index)) {
-               tracker_log ("Index closure has failed due to %s", dperrmsg (dpecode));
+       if (!tchdbclose (indexer->word_index)) {
+               tracker_log ("Index closure has failed due to %s", tchdberrmsg (tchdbecode 
(indexer->word_index)));
        }
+       tchdbdel (indexer->word_index);
 
        g_mutex_unlock (indexer->word_mutex);
        g_mutex_free (indexer->word_mutex);
@@ -272,7 +292,7 @@ tracker_indexer_close (Indexer *indexer)
 void
 tracker_indexer_free (Indexer *indexer, gboolean remove_file)
 {
-       
+
 
        if (remove_file) {
 
@@ -282,14 +302,14 @@ tracker_indexer_free (Indexer *indexer, gboolean remove_file)
 
                g_mutex_lock (indexer->word_mutex);
 
-               dpremove (dbname);
+               unlink (dbname);
 
                g_mutex_unlock (indexer->word_mutex);
 
                g_free (dbname);
        } else {
                g_mutex_lock (indexer->word_mutex);
-               dpclose (indexer->word_index);
+               tchdbdel (indexer->word_index);
                g_mutex_unlock (indexer->word_mutex);
        }
 
@@ -299,14 +319,14 @@ tracker_indexer_free (Indexer *indexer, gboolean remove_file)
 
        g_free (indexer);
 
-       
+
 }
 
 
 guint32
 tracker_indexer_size (Indexer *indexer)
 {
-       return dpfsiz (indexer->word_index);
+       return tchdbfsiz (indexer->word_index);
 }
 
 
@@ -314,7 +334,7 @@ void
 tracker_indexer_sync (Indexer *indexer)
 {
        g_mutex_lock (indexer->word_mutex);
-       dpsync (indexer->word_index);
+       tchdbsync (indexer->word_index);
        g_mutex_unlock (indexer->word_mutex);
 }
 
@@ -322,7 +342,7 @@ tracker_indexer_sync (Indexer *indexer)
 gboolean
 tracker_indexer_optimize (Indexer *indexer)
 {
- 
+
        int num, b_count;
 
         if (tracker->shutdown) {
@@ -344,34 +364,33 @@ tracker_indexer_optimize (Indexer *indexer)
        tracker_log ("No. of buckets per division is %d", b_count);
 
        tracker_log ("Please wait while optimization of indexes takes place...");
-       tracker_log ("Index has file size %10.0f and bucket count of %d of which %d are used...", 
tracker_indexer_size (indexer), dpbnum (indexer->word_index), dpbusenum (indexer->word_index));
-       
+       tracker_log ("Index has file size %10.0f and bucket count of %d...", tracker_indexer_size (indexer), 
indexer->word_index->bnum);
+
        g_mutex_lock (indexer->word_mutex);
 
-       if (!dpoptimize (indexer->word_index, b_count)) {
+       if (!tchdboptimize (indexer->word_index, b_count, 8, -1, UINT8_MAX)) {
 
                g_mutex_unlock (indexer->word_mutex);
-               tracker_log ("Optimization has failed due to %s", dperrmsg (dpecode));
+               tracker_log ("Optimization has failed due to %s", tchdberrmsg (tchdbecode 
(indexer->word_index)));
                return FALSE;
        }
 
        g_mutex_unlock (indexer->word_mutex);
 
-       tracker_log ("Index has been successfully optimized to file size %10.0f and with bucket count of %d 
of which %d are used...", tracker_indexer_size (indexer), dpbnum (indexer->word_index), dpbusenum 
(indexer->word_index));
-       
-       
+       tracker_log ("Index has been successfully optimized to file size %10.0f and with bucket count of 
%d...", tracker_indexer_size (indexer), indexer->word_index->bnum);
+
+
        return TRUE;
 }
 
-static inline gboolean 
+static inline gboolean
 has_word (Indexer *index, const char *word)
 {
        char buffer [32];
 
-       int count = dpgetwb (index->word_index, word, -1, 0, 32, buffer);
+       int count = tchdbget3(index->word_index, word, -1, buffer, sizeof(buffer));
 
        return (count > 7);
-
 }
 
 
@@ -405,23 +424,23 @@ tracker_indexer_apply_changes (Indexer *dest, Indexer *src,  gboolean update)
        /* halve the interval value as notebook hard drives are smaller */
        if (tracker->battery_state_file) interval = interval / 2;
 
-       dpiterinit (src->word_index);
-       
-       while ((str = dpiternext (src->word_index, NULL))) {
-               
+       tchdbiterinit (src->word_index);
+
+       while ((str = tchdbiternext (src->word_index, NULL))) {
+
                i++;
 
                if (i > 1 && (i % interval == 0)) {
-                       dpsync (dest->word_index);
+                       tchdbsync (dest->word_index);
 
                        LoopEvent event = tracker_cache_event_check (NULL, FALSE);
 
                        if (event==EVENT_SHUTDOWN) {
                                return;
-                       }       
+                       }
                }
-                       
-               bytes = dpgetwb (src->word_index, str, -1, 0, buff_size, buffer);
+
+               bytes = tchdbget3 (src->word_index, str, -1, buffer, buff_size);
 
                if (bytes < 1) continue;
 
@@ -435,13 +454,13 @@ tracker_indexer_apply_changes (Indexer *dest, Indexer *src,  gboolean update)
                } else {
                        tracker_indexer_append_word_chunk (dest, str, (WordDetails *) buffer, bytes / sz);
                }
-               
-               dpout (src->word_index, str, -1);
+
+               tchdbout (src->word_index, str, -1);
 
                g_free (str);
        }
-       
-       dpsync (dest->word_index);
+
+       tchdbsync (dest->word_index);
 
        /* delete src and recreate if file update index */
 
@@ -499,7 +518,7 @@ tracker_indexer_merge_indexes (IndexType type)
        const char *prefix;
        int i = 0, index_count, interval = 5000;
        gboolean final_exists;
-       
+
        if (type == INDEX_TYPE_FILES) {
                prefix = "file-index.tmp.";
                index_list = g_slist_prepend (index_list, tracker->file_index);
@@ -520,7 +539,7 @@ tracker_indexer_merge_indexes (IndexType type)
 
                g_free (tmp);
        }
-       
+
        file_list = tracker_get_files_with_prefix (tracker->data_dir, prefix);
 
        if (!file_list || !file_list->data) {
@@ -584,16 +603,16 @@ tracker_indexer_merge_indexes (IndexType type)
        for (l=index_list; l && l->data; l=l->next) {
                index = l->data;
 
-               dpiterinit (index->word_index);
-       
-               while ((str = dpiternext (index->word_index, NULL))) {
+               tchdbiterinit (index->word_index);
+
+               while ((str = tchdbiternext (index->word_index, NULL))) {
 
                        char buffer[MAX_HIT_BUFFER];
                        int offset;
                        int sz = sizeof (WordDetails);
                        int buff_size = MAX_HITS_FOR_WORD * sz;
 
-                                                               
+
 
                        if (!has_word (final_index, str)) {
 
@@ -606,10 +625,10 @@ tracker_indexer_merge_indexes (IndexType type)
                                                return;
                                        }
                                }
-                               
+
 
                                if (i > interval && (i % interval == 0)) {
-                                       dpsync (final_index->word_index);
+                                       tchdbsync (final_index->word_index);
 
                                        guint32 size = tracker_indexer_size (final_index);
 
@@ -628,8 +647,8 @@ tracker_indexer_merge_indexes (IndexType type)
                                        /* halve the interval value as notebook hard drives are smaller */
                                        if (tracker->battery_state_file) interval = interval / 2;
                                }
-                       
-                               offset = dpgetwb (index->word_index, str, -1, 0, buff_size, buffer);
+
+                               offset = tchdbget3 (index->word_index, str, -1, buffer, buff_size);
 
                                if (offset < 1) continue;
 
@@ -639,7 +658,7 @@ tracker_indexer_merge_indexes (IndexType type)
                                }
 
                                if (offset > 7 && offset < buff_size) {
-                               
+
                                        GSList  *list;
                                        Indexer *tmp_index;
                                        int     tmp_offset;
@@ -650,9 +669,9 @@ tracker_indexer_merge_indexes (IndexType type)
                                                tmp_index = list->data;
 
                                                if (!tmp_index) continue;
-                       
-                                               tmp_offset = dpgetwb (tmp_index->word_index, str, -1, 0, 
(buff_size - offset), tmp_buffer);     
-                               
+
+                                               tmp_offset = tchdbget3 (tmp_index->word_index, str, -1, 
tmp_buffer, (buff_size - offset));
+
                                                if (tmp_offset > 0 && (tmp_offset % sz != 0)) {
                                                        tracker_error ("possible corruption found during 
merge of word %s - purging word from index", str);
                                                        continue;
@@ -664,15 +683,15 @@ tracker_indexer_merge_indexes (IndexType type)
 
                                                        offset += tmp_offset;
 
-                                               }                                                             
                                  
+                                               }
                                        }
 
-                                       
-                                       dpput (final_index->word_index, str, -1, buffer, offset, DP_DOVER);
+
+                                       tchdbput (final_index->word_index, str, -1, buffer, offset);
 
                                }
 
-                               
+
                        }
 
                        g_free (str);
@@ -687,33 +706,33 @@ tracker_indexer_merge_indexes (IndexType type)
                        /* remove existing main index */
                        g_mutex_lock (index->word_mutex);
 
-                       char *fname = dpname (index->word_index);
+                       char *fname = g_strdup (index->word_index->path);
+
+                       tchdbdel (index->word_index);
 
-                       dpclose (index->word_index);
+                       unlink (fname);
 
-                       dpremove (fname);
+                       char *final_name = g_strdup (final_index->word_index->path);
 
-                       char *final_name = dpname (final_index->word_index);
-                       
                        tracker_indexer_close (final_index);
-               
+
                        /* rename and reopen final index as main index */
-                       
+
                        rename (final_name, fname);
 
-                       index->word_index = open_index (fname); 
+                       index->word_index = open_index (fname);
 
                        g_free (fname);
-                       g_free (final_name);            
+                       g_free (final_name);
 
                        g_mutex_unlock (index->word_mutex);
                }
-               
+
        }
 
-               
+
        g_slist_free (index_list);
-       
+
 }
 
 
@@ -735,13 +754,13 @@ tracker_indexer_append_word_chunk (Indexer *indexer, const gchar *word, WordDeta
        g_return_val_if_fail (word_detail_count > 0, FALSE);
 
        g_mutex_lock (indexer->word_mutex);
-       if (!dpput (indexer->word_index, word, -1, (char *) details, (word_detail_count * sizeof 
(WordDetails)), DP_DCAT)) {
+       if (!tchdbputcat (indexer->word_index, word, -1, (char *) details, (word_detail_count * sizeof 
(WordDetails)))) {
                g_mutex_unlock (indexer->word_mutex);
                return FALSE;
        }
        g_mutex_unlock (indexer->word_mutex);
 
-       return TRUE;    
+       return TRUE;
 }
 
 
@@ -804,7 +823,7 @@ tracker_indexer_append_word_list (Indexer *indexer, const gchar *word, GSList *l
 /* use for deletes or updates of multiple entities when they are not new */
 gboolean
 tracker_indexer_update_word_chunk (Indexer *indexer, const gchar *word, WordDetails *detail_chunk, gint 
word_detail_count)
-{      
+{
        int  tsiz, j, i, score;
        char *tmp;
        WordDetails *word_details;
@@ -821,7 +840,7 @@ tracker_indexer_update_word_chunk (Indexer *indexer, const gchar *word, WordDeta
 
        g_mutex_lock (indexer->word_mutex);
 
-       if ((tmp = dpget (indexer->word_index, word, -1, 0, MAX_HIT_BUFFER, &tsiz)) != NULL) {
+       if ((tmp = tchdbget (indexer->word_index, word, -1, &tsiz)) != NULL) {
 
 
                WordDetails *details = (WordDetails *) tmp;
@@ -843,19 +862,19 @@ tracker_indexer_update_word_chunk (Indexer *indexer, const gchar *word, WordDeta
 
                                        /* NB the paramter score can be negative */
                                        score = get_score (&details[i]) + get_score (word_details);
-                                                       
-                                       /* check for deletion */                
+
+                                       /* check for deletion */
                                        if (score < 1) {
-                                               
+
                                                gint k;
-                                       
+
                                                /* shift all subsequent records in array down one place */
                                                for (k = i + 1; k < hit_count; k++) {
                                                        details[k - 1] = details[k];
                                                }
 
                                                hit_count--;
-       
+
                                        } else {
                                                details[i].amalgamated = tracker_indexer_calc_amalgamated 
(get_service_type (&details[i]), score);
                                        }
@@ -871,23 +890,23 @@ tracker_indexer_update_word_chunk (Indexer *indexer, const gchar *word, WordDeta
                                tracker_debug ("could not update word hit %s - appending", word);
                        }
                }
-       
+
                /* write back if we have modded anything */
                if (write_back) {
-                       dpput (indexer->word_index, word, -1, (char *) details, (hit_count * sizeof 
(WordDetails)), DP_DOVER);
+                       tchdbput (indexer->word_index, word, -1, (char *) details, (hit_count * sizeof 
(WordDetails)));
                }
 
-               g_mutex_unlock (indexer->word_mutex);   
+               g_mutex_unlock (indexer->word_mutex);
 
                if (list) {
                        tracker_indexer_append_word_list (indexer, word, list);
                        g_slist_free (list);
                }
-       
+
                return TRUE;
        }
 
-       g_mutex_unlock (indexer->word_mutex);   
+       g_mutex_unlock (indexer->word_mutex);
 
        /* none of the updates can be applied if word does not exist so return them all to be appended later 
*/
        return tracker_indexer_append_word_chunk (indexer, word, detail_chunk, word_detail_count);
@@ -939,11 +958,11 @@ tracker_remove_dud_hits (Indexer *indexer, const gchar *word, GSList *dud_list)
        g_return_val_if_fail (indexer, FALSE);
        g_return_val_if_fail (word, FALSE);
        g_return_val_if_fail (dud_list, FALSE);
-       
+
        g_mutex_lock (indexer->word_mutex);
 
        /* check if existing record is there  */
-       if ((tmp = dpget (indexer->word_index, word, -1, 0, MAX_HIT_BUFFER, &tsiz)) != NULL) {
+       if ((tmp = tchdbget (indexer->word_index, word, -1, &tsiz)) != NULL) {
 
                if (tsiz >= (int) sizeof (WordDetails)) {
 
@@ -952,7 +971,7 @@ tracker_remove_dud_hits (Indexer *indexer, const gchar *word, GSList *dud_list)
 
                        details = (WordDetails *) tmp;
                        pnum = tsiz / sizeof (WordDetails);
-                       wi = 0; 
+                       wi = 0;
 
                        for (i = 0; i < pnum; i++) {
 
@@ -972,7 +991,7 @@ tracker_remove_dud_hits (Indexer *indexer, const gchar *word, GSList *dud_list)
                                                        }
 
                                                        /* make size of array one size smaller */
-                                                       tsiz -= sizeof (WordDetails); 
+                                                       tsiz -= sizeof (WordDetails);
                                                        pnum--;
 
                                                        break;
@@ -981,10 +1000,10 @@ tracker_remove_dud_hits (Indexer *indexer, const gchar *word, GSList *dud_list)
                                }
                        }
 
-                       dpput (indexer->word_index, word, -1, (char *) details, tsiz, DP_DOVER);
-                       
-                       g_mutex_unlock (indexer->word_mutex);   
-       
+                       tchdbput (indexer->word_index, word, -1, (char *) details, tsiz);
+
+                       g_mutex_unlock (indexer->word_mutex);
+
                        g_free (tmp);
 
                        return TRUE;
@@ -1014,9 +1033,9 @@ count_hit_size_for_word (Indexer *indexer, const gchar *word)
 {
        int  tsiz;
 
-       g_mutex_lock (indexer->word_mutex);     
-       tsiz = dpvsiz (indexer->word_index, word, -1);
-       g_mutex_unlock (indexer->word_mutex);   
+       g_mutex_lock (indexer->word_mutex);
+       tsiz = tchdbvsiz (indexer->word_index, word, -1);
+       g_mutex_unlock (indexer->word_mutex);
 
        return tsiz;
 }
@@ -1046,7 +1065,7 @@ tracker_create_query (Indexer *indexer, gint *service_array, gint service_array_
        result->service_array = service_array;
        result->service_array_count = service_array_count;
        result->offset = offset;
-       result->limit = limit;  
+       result->limit = limit;
 
        return result;
 }
@@ -1105,14 +1124,14 @@ get_hits_for_single_word (SearchQuery *query, SearchWord *search_word, gint *ret
 
        /* some results might be dud so get an extra 50 to compensate */
        int limit = query->limit + 50;
-       
+
        if (tracker->shutdown) {
                 return NULL;
         }
 
        g_mutex_lock (query->indexer->word_mutex);
 
-       if ((tmp = dpget (query->indexer->word_index, search_word->word, -1, 0, MAX_HIT_BUFFER, &tsiz)) != 
NULL) {
+       if ((tmp = tchdbget (query->indexer->word_index, search_word->word, -1, &tsiz)) != NULL) {
 
                g_mutex_unlock (query->indexer->word_mutex);
 
@@ -1121,11 +1140,11 @@ get_hits_for_single_word (SearchQuery *query, SearchWord *search_word, gint *ret
                        int pnum;
 
                        details = (WordDetails *) tmp;
-                       
+
                        pnum = tsiz / sizeof (WordDetails);
 
                        tracker_debug ("total hit count (excluding service divisions) is %d", pnum);
-               
+
                        qsort (details, pnum, sizeof (WordDetails), compare_words);
 
                        int i;
@@ -1149,7 +1168,7 @@ get_hits_for_single_word (SearchQuery *query, SearchWord *search_word, gint *ret
                                                hit = word_details_to_search_hit (&details[i]);
 
                                                result = g_slist_prepend (result, hit);
-               
+
                                                limit--;
 
                                        } else {
@@ -1188,7 +1207,7 @@ get_intermediate_hits (SearchQuery *query, GHashTable *match_table, SearchWord *
 
        g_mutex_lock (query->indexer->word_mutex);
 
-       if ((tmp = dpget (query->indexer->word_index, search_word->word, -1, 0, MAX_HIT_BUFFER, &tsiz)) != 
NULL) {
+       if ((tmp = tchdbget (query->indexer->word_index, search_word->word, -1, &tsiz)) != NULL) {
 
                g_mutex_unlock (query->indexer->word_mutex);
 
@@ -1198,9 +1217,9 @@ get_intermediate_hits (SearchQuery *query, GHashTable *match_table, SearchWord *
                        int count;
 
                        details = (WordDetails *) tmp;
-                       
+
                        count = tsiz / sizeof (WordDetails);
-                               
+
                        int i;
                        for (i = 0; i < count; i++) {
 
@@ -1212,7 +1231,7 @@ get_intermediate_hits (SearchQuery *query, GHashTable *match_table, SearchWord *
                                        if (match_table) {
                                                gpointer pscore;
                                                guint32 score;
-                                       
+
                                                pscore = g_hash_table_lookup (match_table, GUINT_TO_POINTER 
(details[i].id));
 
                                                if (bool_op == BoolAnd && !pscore) {
@@ -1221,7 +1240,7 @@ get_intermediate_hits (SearchQuery *query, GHashTable *match_table, SearchWord *
 
                                                score = GPOINTER_TO_UINT (pscore) +  get_idf_score 
(&details[i], search_word->idf);
 
-                                               g_hash_table_insert (result, GUINT_TO_POINTER 
(details[i].id), GUINT_TO_POINTER (score));       
+                                               g_hash_table_insert (result, GUINT_TO_POINTER 
(details[i].id), GUINT_TO_POINTER (score));
 
                                        } else {
                                                int idf_score = get_idf_score (&details[i], search_word->idf);
@@ -1271,10 +1290,10 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
        if (!match_table || g_hash_table_size (match_table) < 1) {
                return NULL;
        }
-                               
+
        g_mutex_lock (query->indexer->word_mutex);
 
-       if ((tmp = dpget (query->indexer->word_index, search_word->word, -1, 0, MAX_HIT_BUFFER, &tsiz)) != 
NULL) {
+       if ((tmp = tchdbget (query->indexer->word_index, search_word->word, -1, &tsiz)) != NULL) {
 
                g_mutex_unlock (query->indexer->word_mutex);
 
@@ -1284,9 +1303,9 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
                        int size, count;
 
                        details = (WordDetails *) tmp;
-                       
+
                        count = tsiz / sizeof (WordDetails);
-       
+
                        size = g_hash_table_size (match_table);
 
                        if (bool_op == BoolAnd) {
@@ -1294,7 +1313,7 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
                        } else {
                                result = g_malloc0 (sizeof (SearchHit) * (size + count));
                        }
-                               
+
                        int i;
                        for (i = 0; i < count; i++) {
 
@@ -1305,7 +1324,7 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
 
                                        gpointer pscore;
                                        int score;
-                               
+
                                        pscore = g_hash_table_lookup (match_table, GUINT_TO_POINTER 
(details[i].id));
 
                                        if (bool_op == BoolAnd && !pscore) {
@@ -1318,7 +1337,7 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
                                        result[rnum].service_id = details[i].id;
                                        result[rnum].service_type_id = service;
                                        result[rnum].score = score;
-                                   
+
                                        rnum++;
                                }
                        }
@@ -1334,7 +1353,7 @@ get_final_hits (SearchQuery *query, GHashTable *match_table, SearchWord *search_
                                return NULL;
                        }
 
-                       if ((limit + offset) < rnum) { 
+                       if ((limit + offset) < rnum) {
                                count = limit + offset;
                        } else {
                                count = rnum;
@@ -1428,7 +1447,7 @@ tracker_indexer_get_hits (SearchQuery *query)
                        if (table) {
                                g_hash_table_destroy (table);
                        }
-                               
+
                        return TRUE;
                }
         }
@@ -1446,7 +1465,7 @@ prepend_key_pointer (gpointer key, gpointer value, gpointer data)
 }
 
 
-static GSList * 
+static GSList *
 g_hash_table_key_slist (GHashTable *table)
 {
        GSList *rv = NULL;
@@ -1494,7 +1513,7 @@ tracker_get_hit_counts (SearchQuery *query)
 
                        if (parent_id != -1) {
                                count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER 
(parent_id))) + 1;
-       
+
                                g_hash_table_insert (table, GUINT_TO_POINTER (parent_id), GUINT_TO_POINTER 
(count));
                        }
                }
@@ -1509,7 +1528,7 @@ tracker_get_hit_counts (SearchQuery *query)
 
        if (tracker_indexer_get_hits (query)) {
                GSList *tmp;
-       
+
                for (tmp = query->hits; tmp; tmp=tmp->next) {
                        SearchHit *hit = tmp->data;
                        guint32 count = GPOINTER_TO_UINT (g_hash_table_lookup (table, GUINT_TO_POINTER 
(hit->service_type_id))) + 1;
@@ -1540,7 +1559,7 @@ tracker_get_hit_counts (SearchQuery *query)
 
        gint len, i;
        len = g_slist_length (list);
-       
+
        gchar **res = g_new0 (gchar *, len + 1);
 
        res[len] = NULL;
diff --git a/src/trackerd/tracker-indexer.h b/src/trackerd/tracker-indexer.h
index eb3b035..26f2d4a 100644
--- a/src/trackerd/tracker-indexer.h
+++ b/src/trackerd/tracker-indexer.h
@@ -23,8 +23,13 @@
 #define _TRACKER_INDEXER_H
 
 
+#include <stdbool.h>
+#include <stdint.h>
 #include <stdlib.h>
+#include <time.h>
 #include <glib.h>
+#include <tcutil.h>
+#include <tchdb.h>
 #include <depot.h>
 
 #include "tracker-utils.h"
@@ -52,7 +57,7 @@ typedef struct {
 
 
 typedef struct {
-       DEPOT           *word_index;    /* file hashtable handle for the word -> {serviceID, ServiceTypeID, 
Score}  */
+       TCHDB           *word_index;    /* file hashtable handle for the word -> {serviceID, ServiceTypeID, 
Score}  */
        GMutex          *word_mutex;
        char            *name;
        gpointer        emails; /* pointer to email indexer */

Attachment: pgpvTTcyihzmW.pgp
Description: PGP signature



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