[tracker] tracker-extract: Use g_pattern_match() instead of g_pattern_match_simple()
- From: Aleksander Morgado <aleksm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] tracker-extract: Use g_pattern_match() instead of g_pattern_match_simple()
- Date: Wed, 15 Sep 2010 12:11:59 +0000 (UTC)
commit 1394664ce56f56ebbd8bd7829c3124036987ddda
Author: Aleksander Morgado <aleksander lanedo com>
Date: Wed Sep 15 13:15:59 2010 +0200
tracker-extract: Use g_pattern_match() instead of g_pattern_match_simple()
* Around 5% improvement in extraction speed
src/tracker-extract/tracker-extract.c | 43 ++++++++++++++++++++++++++++----
1 files changed, 37 insertions(+), 6 deletions(-)
---
diff --git a/src/tracker-extract/tracker-extract.c b/src/tracker-extract/tracker-extract.c
index dbf1b17..16a77a2 100644
--- a/src/tracker-extract/tracker-extract.c
+++ b/src/tracker-extract/tracker-extract.c
@@ -62,6 +62,7 @@ typedef struct {
typedef struct {
const GModule *module;
const TrackerExtractData *edata;
+ GPatternSpec *pattern; /* For a fast g_pattern_match() */
} ModuleData;
@@ -92,6 +93,7 @@ tracker_extract_init (TrackerExtract *object)
static void
tracker_extract_finalize (GObject *object)
{
+ guint i;
TrackerExtractPrivate *priv;
priv = TRACKER_EXTRACT_GET_PRIVATE (object);
@@ -100,7 +102,20 @@ tracker_extract_finalize (GObject *object)
tracker_topanalyzer_shutdown ();
#endif /* HAVE_STREAMANALYZER */
+ for (i = 0; i < priv->specific_extractors->len; i++) {
+ ModuleData mdata;
+
+ mdata = g_array_index (priv->specific_extractors, ModuleData, i);
+ g_pattern_spec_free (mdata.pattern);
+ }
g_array_free (priv->specific_extractors, TRUE);
+
+ for (i = 0; i < priv->generic_extractors->len; i++) {
+ ModuleData mdata;
+
+ mdata = g_array_index (priv->generic_extractors, ModuleData, i);
+ g_pattern_spec_free (mdata.pattern);
+ }
g_array_free (priv->generic_extractors, TRUE);
G_OBJECT_CLASS (tracker_extract_parent_class)->finalize (object);
@@ -201,6 +216,9 @@ load_modules (const gchar *force_module,
g_module_name ((GModule*) mdata.module));
for (; mdata.edata->mime; mdata.edata++) {
+ /* Compile pattern from mime */
+ mdata.pattern = g_pattern_spec_new (mdata.edata->mime);
+
if (G_UNLIKELY (strchr (mdata.edata->mime, '*') != NULL)) {
g_message (" Generic match for mime:'%s'",
mdata.edata->mime);
@@ -380,6 +398,15 @@ get_file_metadata (TrackerExtract *extract,
*/
if (mime_used) {
guint i;
+ glong length;
+ gchar *reversed;
+
+ /* Using a reversed string while pattern matching is faster
+ * if we have lots of patterns with wildcards. Probably
+ * not needed to assume the mime type could be non-ASCII,
+ * but anyway... */
+ reversed = g_utf8_strreverse (mime_used, -1);
+ length = g_utf8_strlen (mime_used, -1);
for (i = 0; i < priv->specific_extractors->len; i++) {
const TrackerExtractData *edata;
@@ -388,7 +415,7 @@ get_file_metadata (TrackerExtract *extract,
mdata = g_array_index (priv->specific_extractors, ModuleData, i);
edata = mdata.edata;
- if (g_pattern_match_simple (edata->mime, mime_used)) {
+ if (g_pattern_match (mdata.pattern, length, mime_used, reversed)) {
gint items;
tracker_dbus_request_comment (request_id,
@@ -411,10 +438,10 @@ get_file_metadata (TrackerExtract *extract,
tracker_sparql_builder_insert_close (statements);
g_free (mime_used);
+ g_free (reversed);
*preupdate_out = preupdate;
*statements_out = statements;
-
return TRUE;
}
}
@@ -426,7 +453,7 @@ get_file_metadata (TrackerExtract *extract,
mdata = g_array_index (priv->generic_extractors, ModuleData, i);
edata = mdata.edata;
- if (g_pattern_match_simple (edata->mime, mime_used)) {
+ if (g_pattern_match (mdata.pattern, length, mime_used, reversed)) {
gint items;
tracker_dbus_request_comment (request_id,
@@ -449,6 +476,7 @@ get_file_metadata (TrackerExtract *extract,
tracker_sparql_builder_insert_close (statements);
g_free (mime_used);
+ g_free (reversed);
*preupdate_out = preupdate;
*statements_out = statements;
@@ -457,11 +485,14 @@ get_file_metadata (TrackerExtract *extract,
}
}
- g_free (mime_used);
-
tracker_dbus_request_comment (request_id,
context,
- " Could not find any extractors to handle metadata type");
+ " Could not find any extractors to handle metadata type "
+ "(mime: %s)",
+ mime_used);
+
+ g_free (mime_used);
+ g_free (reversed);
} else {
tracker_dbus_request_comment (request_id,
context,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]