From 830026e3e135264ff6b0431f3cbdb761844a81d5 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Mon, 18 Feb 2013 08:15:20 +0100 Subject: [PATCH] Rename Tracker 0.6 module to RDF --- etc/netatalk/Makefile.am | 1 + etc/netatalk/netatalk.c | 19 +- etc/spotlight/Makefile.am | 24 +- .../{slmod_tracker_0_6.c => slmod_rdf.c} | 10 +- etc/spotlight/slmod_rdf_map.c | 101 ++++++ ...lmod_tracker_0_6_map.h => slmod_rdf_map.h} | 31 +- ...racker_0_6_parser.c => slmod_rdf_parser.c} | 278 +++++++++-------- ...racker_0_6_parser.h => slmod_rdf_parser.h} | 14 +- etc/spotlight/slmod_rdf_parser.y | 293 ++++++++++++++++++ etc/spotlight/slmod_tracker_0_6_map.c | 62 ---- etc/spotlight/slmod_tracker_0_6_parser.y | 270 ---------------- etc/spotlight/spotlight_rawquery_lexer.c | 6 +- etc/spotlight/spotlight_rawquery_lexer.l | 6 +- include/atalk/spotlight.h | 2 +- macros/netatalk.m4 | 10 +- 15 files changed, 604 insertions(+), 523 deletions(-) rename etc/spotlight/{slmod_tracker_0_6.c => slmod_rdf.c} (95%) create mode 100644 etc/spotlight/slmod_rdf_map.c rename etc/spotlight/{slmod_tracker_0_6_map.h => slmod_rdf_map.h} (54%) rename etc/spotlight/{slmod_tracker_0_6_parser.c => slmod_rdf_parser.c} (89%) rename etc/spotlight/{slmod_tracker_0_6_parser.h => slmod_rdf_parser.h} (91%) create mode 100644 etc/spotlight/slmod_rdf_parser.y delete mode 100644 etc/spotlight/slmod_tracker_0_6_map.c delete mode 100644 etc/spotlight/slmod_tracker_0_6_parser.y diff --git a/etc/netatalk/Makefile.am b/etc/netatalk/Makefile.am index 06e5a8c3..6cf95eb6 100644 --- a/etc/netatalk/Makefile.am +++ b/etc/netatalk/Makefile.am @@ -7,6 +7,7 @@ sbin_PROGRAMS = netatalk netatalk_SOURCES = netatalk.c netatalk_CFLAGS = \ -D_PATH_CONFDIR=\"$(pkgconfdir)/\" \ + -D_PATH_STATEDIR='"$(localstatedir)/netatalk/"' \ -D_PATH_AFPD=\"$(sbindir)/afpd\" \ -D_PATH_CNID_METAD=\"$(sbindir)/cnid_metad\" diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index 085aa4d1..7d3a3e00 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -241,11 +241,11 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) } } -#ifdef HAVE_TRACKER_0_6 +#ifdef HAVE_TRACKER_RDF if (trackerd_pid == -1) { trackerd_restarts++; LOG(log_note, logtype_afpd, "Restarting 'trackerd' (restarts: %u)", trackerd_restarts); - if ((trackerd_pid = run_process(TRACKER_0_6_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { + if ((trackerd_pid = run_process(TRACKER_RDF_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { LOG(log_error, logtype_default, "Error starting '%s'", "/usr/bin/trackerd"); } } @@ -396,12 +396,9 @@ int main(int argc, char **argv) #ifdef HAVE_TRACKER setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); -#endif -#if 0 - setenv("XDG_DATA_DIRS", TRACKER_PREFIX "/share/:/usr/share/", 1); - setenv("TRACKER_DB_ONTOLOGIES_DIR", TRACKER_PREFIX "/share/tracker/ontologies", 1); - setenv("TRACKER_EXTRACTOR_RULES_DIR", TRACKER_PREFIX "/share/tracker/extract-rules", 1); - setenv("TRACKER_LANGUAGE_STOPWORDS_DIR", TRACKER_PREFIX "/share/tracker/languages", 1); + setenv("XDG_DATA_HOME", _PATH_STATEDIR, 0); + setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0); + setenv("XDG_CONFIG_HOME", _PATH_CONFDIR, 0); #endif dbus_path = iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon path", "/bin/dbus-daemon"); @@ -418,9 +415,9 @@ int main(int argc, char **argv) set_sl_volumes(); system(TRACKER_PREFIX "/bin/tracker-control -s"); #endif -#ifdef HAVE_TRACKER_0_6 - if ((trackerd_pid = run_process(TRACKER_0_6_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", TRACKER_0_6_PREFIX "/bin/trackerd"); +#ifdef HAVE_TRACKER_RDF + if ((trackerd_pid = run_process(TRACKER_RDF_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { + LOG(log_error, logtype_default, "Error starting '%s'", TRACKER_RDF_PREFIX "/bin/trackerd"); netatalk_exit(EXITERR_CONF); } #endif diff --git a/etc/spotlight/Makefile.am b/etc/spotlight/Makefile.am index 8e2bd9ef..e0210b63 100644 --- a/etc/spotlight/Makefile.am +++ b/etc/spotlight/Makefile.am @@ -4,7 +4,7 @@ pkgconfdir = @PKGCONFDIR@ moduledir = @UAMS_PATH@ module_LTLIBRARIES = noinst_PROGRAMS = -noinst_HEADERS = slmod_sparql_map.h slmod_tracker_0_6_map.h +noinst_HEADERS = slmod_sparql_map.h slmod_rdf_map.h BUILT_SOURCES = AM_YFLAGS = -d @@ -32,23 +32,23 @@ srp_CFLAGS = -DMAIN -I$(top_srcdir)/include @TRACKER_CFLAGS@ srp_LDADD = $(top_builddir)/libatalk/libatalk.la endif -if HAVE_TRACKER_0_6 -BUILT_SOURCES += slmod_tracker_0_6_parser.h +if HAVE_TRACKER_RDF +BUILT_SOURCES += slmod_rdf_parser.h noinst_PROGRAMS += stp -module_LTLIBRARIES += slmod_tracker_0_6.la +module_LTLIBRARIES += slmod_rdf.la -slmod_tracker_0_6_la_SOURCES = \ - slmod_tracker_0_6.c \ - slmod_tracker_0_6_map.c \ - slmod_tracker_0_6_parser.y \ +slmod_rdf_la_SOURCES = \ + slmod_rdf.c \ + slmod_rdf_map.c \ + slmod_rdf_parser.y \ spotlight_rawquery_lexer.l -slmod_tracker_0_6_la_CFLAGS = @TRACKER_CFLAGS@ -slmod_tracker_0_6_la_LDFLAGS = -module -avoid-version @TRACKER_LIBS@ +slmod_rdf_la_CFLAGS = @TRACKER_CFLAGS@ +slmod_rdf_la_LDFLAGS = -module -avoid-version @TRACKER_LIBS@ stp_SOURCES = \ - slmod_tracker_0_6_map.c \ - slmod_tracker_0_6_parser.y \ + slmod_rdf_map.c \ + slmod_rdf_parser.y \ spotlight_rawquery_lexer.l stp_CFLAGS = -DMAIN @TRACKER_CFLAGS@ stp_LDADD = $(top_builddir)/libatalk/libatalk.la @TRACKER_LIBS@ diff --git a/etc/spotlight/slmod_tracker_0_6.c b/etc/spotlight/slmod_rdf.c similarity index 95% rename from etc/spotlight/slmod_tracker_0_6.c rename to etc/spotlight/slmod_rdf.c index 42d71623..4c75a8f2 100644 --- a/etc/spotlight/slmod_tracker_0_6.c +++ b/etc/spotlight/slmod_rdf.c @@ -28,7 +28,7 @@ #include #include -#include "slmod_tracker_0_6_parser.h" +#include "slmod_rdf_parser.h" #define MAX_SL_RESULTS 20 @@ -40,7 +40,7 @@ static int sl_mod_init(void *p) GError *error = NULL; const char *msg = p; - LOG(log_info, logtype_sl, "Initializing Tracker 0.6 Spotlight module"); + LOG(log_info, logtype_sl, "Initializing Tracker 0.6 RDF Spotlight module"); g_type_init(); setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); @@ -67,9 +67,9 @@ static int sl_mod_start_search(void *p) LOG(log_debug, logtype_sl, "sl_mod_start_search: Spotlight query: \"%s\"", slq->slq_qstring); - EC_ZERO_LOG( map_spotlight_to_tracker_0_6_query(slq, - (ServiceType *)(&slq->slq_service), - &slq->slq_trackerquery) ); + EC_ZERO_LOG( map_spotlight_to_rdf_query(slq, +// (ServiceType *)(&slq->slq_service), + &slq->slq_trackerquery) ); LOG(log_debug, logtype_sl, "sl_mod_start_search: Tracker service: %s, query: \"%s\"", tracker_type_to_service_name(slq->slq_service), diff --git a/etc/spotlight/slmod_rdf_map.c b/etc/spotlight/slmod_rdf_map.c new file mode 100644 index 00000000..99b32153 --- /dev/null +++ b/etc/spotlight/slmod_rdf_map.c @@ -0,0 +1,101 @@ +/* + Copyright (c) 2012 Frank Lahm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include + +#include "slmod_rdf_map.h" + +#define NOTSUPPORTED NULL +#define SPECIAL NULL + +struct spotlight_rdf_map spotlight_rdf_map[] = { + /* ssm_spotlight_attr srm_type, ssm_sparql_attr */ + {"*", srmt_str, "File:Name"}, + {"kMDItemTextContent", srmt_fts, SPECIAL}, + + /* Filesystem metadata */ + {"kMDItemFSLabel", srmt_num, NOTSUPPORTED}, + {"kMDItemDisplayName", srmt_str, "File:Name"}, + {"kMDItemFSName", srmt_str, "File:Name"}, +#if 0 + {"kMDItemFSContentChangeDate", ssmt_date, "nfo:fileLastModified"}, + + /* Common metadata */ + {"kMDItemContentCreationDate", ssmt_date, "nie:contentCreated"}, + {"kMDItemContentModificationDate", ssmt_date, "nfo:fileLastModified"}, + {"kMDItemAttributeChangeDate", ssmt_date, "nfo:fileLastModified"}, + {"kMDItemAuthors", ssmt_str, "dc:creator"}, + {"kMDItemCopyright", ssmt_str, "nie:copyright"}, + {"kMDItemCountry", ssmt_str, "nco:country"}, + {"kMDItemCreator", ssmt_str, "dc:creator"}, + {"kMDItemDurationSeconds", ssmt_num, "nfo:duration"}, + {"kMDItemNumberOfPages", ssmt_num, "nfo:pageCount"}, + {"kMDItemTitle", ssmt_str, "nie:title"}, + {"_kMDItemGroupId", ssmt_type, SPECIAL}, + {"kMDItemContentTypeTree", ssmt_type, SPECIAL}, + + /* Image metadata */ + {"kMDItemPixelWidth", ssmt_num, "nfo:width"}, + {"kMDItemPixelHeight", ssmt_num, "nfo:height"}, + {"kMDItemColorSpace", ssmt_str, "nexif:colorSpace"}, + {"kMDItemBitsPerSample", ssmt_num, "nfo:colorDepth"}, + {"kMDItemFocalLength", ssmt_num, "nmm:focalLength"}, + {"kMDItemISOSpeed", ssmt_num, "nmm:isoSpeed"}, + {"kMDItemOrientation", ssmt_bool, "nfo:orientation"}, + {"kMDItemResolutionWidthDPI", ssmt_num, "nfo:horizontalResolution"}, + {"kMDItemResolutionHeightDPI", ssmt_num, "nfo:verticalResolution"}, + {"kMDItemExposureTimeSeconds", ssmt_num, "nmm:exposureTime"}, + + /* Audio metadata */ + {"kMDItemComposer", ssmt_str, "nmm:composer"}, + {"kMDItemMusicalGenre", ssmt_str, "nfo:genre"}, +#endif + {NULL, srmt_str, NULL} +}; + +struct MDTypeMap MDTypeMap[] = { + {"1", "http://www.semanticdesktop.org/ontologies/2007/03/22/nmo#Email"}, + {"2", "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact"}, + {"3", NULL}, /* PrefPane */ + {"4", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Font"}, + {"5", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Bookmark"}, + {"6", "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact"}, + {"7", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Video"}, + {"8", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Executable"}, + {"9", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Folder"}, + {"10", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio"}, + {"11", "application/pdf"}, + {"12", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Presentation"}, + {"13", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Image"}, + {"public.jpeg", "image/jpeg"}, + {"public.tiff", "image/tiff"}, + {"com.compuserve.gif", "image/gif"}, + {"public.png", "image/png"}, + {"com.microsoft.bmp", "image/bmp"}, + {"public.content", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Document"}, + {"public.mp3", "audio/mpeg"}, + {"public.mpeg-4-audio", "audio/x-aac"}, + {"com.apple.application", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Software"}, + {"public.text", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#TextDocument"}, + {"public.plain-text", "text/plain"}, + {"public.rtf", "text/rtf"}, + {"public.html", "text/html"}, + {"public.xml", "text/xml"}, + {"public.source-code", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#SourceCode"}, + {NULL, NULL} +}; diff --git a/etc/spotlight/slmod_tracker_0_6_map.h b/etc/spotlight/slmod_rdf_map.h similarity index 54% rename from etc/spotlight/slmod_tracker_0_6_map.h rename to etc/spotlight/slmod_rdf_map.h index 520fff02..2096c756 100644 --- a/etc/spotlight/slmod_tracker_0_6_map.h +++ b/etc/spotlight/slmod_rdf_map.h @@ -16,27 +16,30 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ -#ifndef SLMOD_TRACKER_0_6_MAP_H -#define SLMOD_TRACKER_0_6_MAP_H - -#include - -enum stm_type { - stmt_fts, /* Full text search */ - stmt_name, /* Object name */ - stmt_type /* Object type */ +#ifndef SLMOD_RDF_MAP_H +#define SLMOD_RDF_MAP_H + +/* Spotlight -> RDF mapping (srm) */ +enum srm_type { + srmt_bool, /* a boolean value */ + srmt_num, /* a numeric value */ + srmt_str, /* a string value */ + srmt_fts, /* a string value for full text search */ + srmt_date, /* date values are handled in a special map function map_daterange() */ + srmt_type /* kMDItemContentType, requires special mapping */ }; -struct spotlight_tracker_map { - const char *stm_spotlight_attr; - enum stm_type stm_type; +struct spotlight_rdf_map { + const char *srm_spotlight_attr; + enum srm_type srm_type; + const char *srm_rdf_attr; }; struct MDTypeMap { const char *mdtm_value; /* Value of '_kMDItemGroupId' or 'kMDItemContentTypeTree' */ - ServiceType mdtm_type; /* Tracker 0.6 service type */ + const char *mdtm_type; /* MIME type */ }; -extern struct spotlight_tracker_map spotlight_tracker_map[]; +extern struct spotlight_rdf_map spotlight_rdf_map[]; extern struct MDTypeMap MDTypeMap[]; #endif diff --git a/etc/spotlight/slmod_tracker_0_6_parser.c b/etc/spotlight/slmod_rdf_parser.c similarity index 89% rename from etc/spotlight/slmod_tracker_0_6_parser.c rename to etc/spotlight/slmod_rdf_parser.c index 147070ca..71de561c 100644 --- a/etc/spotlight/slmod_tracker_0_6_parser.c +++ b/etc/spotlight/slmod_rdf_parser.c @@ -58,9 +58,12 @@ /* Pull parsers. */ #define YYPULL 1 -/* "%code top" blocks. */ -/* Line 349 of yacc.c */ -#line 1 "slmod_tracker_0_6_parser.y" + + + +/* Copy the first part of user declarations. */ +/* Line 371 of yacc.c */ +#line 1 "slmod_rdf_parser.y" #include @@ -70,14 +73,13 @@ #include #include - #include #include #include #include #include - #include "slmod_tracker_0_6_map.h" + #include "slmod_rdf_map.h" struct yy_buffer_state; typedef struct yy_buffer_state *YY_BUFFER_STATE; @@ -88,26 +90,18 @@ extern void yy_delete_buffer ( YY_BUFFER_STATE buffer ); /* forward declarations */ - static char *map_expr(const char *attr, char op, const char *val); + static const char *map_expr(const char *attr, char op, const char *val); + static const char *map_daterange(const char *dateattr, time_t date1, time_t date2); static time_t isodate2unix(const char *s); /* global vars, eg needed by the lexer */ - slq_t *ts_slq; + slq_t *srp_slq; /* local vars */ - static ServiceType ts_type; /* Tracker query object type */ - static gchar *ts_search; /* Tracker query search term */ - - -/* Line 349 of yacc.c */ -#line 104 "slmod_tracker_0_6_parser.c" - - - -/* Copy the first part of user declarations. */ + static gchar *ssp_result; /* Line 371 of yacc.c */ -#line 111 "slmod_tracker_0_6_parser.c" +#line 105 "slmod_rdf_parser.c" # ifndef YY_NULL # if defined __cplusplus && 201103L <= __cplusplus @@ -181,16 +175,16 @@ extern int yydebug; typedef union YYSTYPE { /* Line 387 of yacc.c */ -#line 45 "slmod_tracker_0_6_parser.y" +#line 44 "slmod_rdf_parser.y" int ival; - char *sval; + const char *sval; bool bval; time_t tval; /* Line 387 of yacc.c */ -#line 194 "slmod_tracker_0_6_parser.c" +#line 188 "slmod_rdf_parser.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -214,22 +208,22 @@ int yyparse (); #endif /* ! YYPARSE_PARAM */ /* "%code provides" blocks. */ /* Line 387 of yacc.c */ -#line 39 "slmod_tracker_0_6_parser.y" +#line 38 "slmod_rdf_parser.y" #define SPRAW_TIME_OFFSET 978307200 - extern int map_spotlight_to_tracker_0_6_query(slq_t *slq, ServiceType *type, gchar **search); - extern slq_t *ts_slq; + extern int map_spotlight_to_rdf_query(slq_t *slq, gchar **sparql_result); + extern slq_t *srp_slq; /* Line 387 of yacc.c */ -#line 226 "slmod_tracker_0_6_parser.c" +#line 220 "slmod_rdf_parser.c" #endif /* !YY_YY_Y_TAB_H_INCLUDED */ /* Copy the second part of user declarations. */ /* Line 390 of yacc.c */ -#line 233 "slmod_tracker_0_6_parser.c" +#line 227 "slmod_rdf_parser.c" #ifdef short # undef short @@ -528,9 +522,9 @@ static const yytype_int8 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 67, 67, 69, 73, 80, 86, 92, 93, 94, - 95, 108, 112, 113, 114, 115, 116, 117, 118, 119, - 123, 127, 128 + 0, 66, 66, 68, 72, 89, 95, 101, 102, 103, + 104, 105, 114, 115, 116, 117, 118, 119, 120, 121, + 125, 129, 130 }; #endif @@ -1451,16 +1445,26 @@ yyreduce: { case 4: /* Line 1792 of yacc.c */ -#line 73 "slmod_tracker_0_6_parser.y" +#line 72 "slmod_rdf_parser.y" { - ts_search = (yyvsp[(1) - (1)].sval); - (yyval.sval) = (yyvsp[(1) - (1)].sval); + ssp_result = talloc_asprintf(srp_slq, + "" + " " + " " + " " + " %s" + " " + " %s" + " " + "", + srp_slq->slq_vol->v_path, (yyvsp[(1) - (1)].sval)); + (yyval.sval) = ssp_result; } break; case 5: /* Line 1792 of yacc.c */ -#line 80 "slmod_tracker_0_6_parser.y" +#line 89 "slmod_rdf_parser.y" { if ((yyvsp[(1) - (1)].bval) == false) YYACCEPT; @@ -1471,126 +1475,119 @@ yyreduce: case 6: /* Line 1792 of yacc.c */ -#line 86 "slmod_tracker_0_6_parser.y" +#line 95 "slmod_rdf_parser.y" { if (strcmp((yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)) != 0) - YYABORT; + (yyval.sval) = talloc_asprintf(srp_slq, "{ %s } UNION { %s }", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)); else - (yyval.sval) = (yyvsp[(1) - (3)].sval); + (yyval.sval) = talloc_asprintf(srp_slq, "%s", (yyvsp[(1) - (3)].sval)); } break; case 7: /* Line 1792 of yacc.c */ -#line 92 "slmod_tracker_0_6_parser.y" - {(yyval.sval) = (yyvsp[(1) - (1)].sval);} +#line 101 "slmod_rdf_parser.y" + {(yyval.sval) = (yyvsp[(1) - (1)].sval); if ((yyval.sval) == NULL) YYABORT;} break; case 8: /* Line 1792 of yacc.c */ -#line 93 "slmod_tracker_0_6_parser.y" +#line 102 "slmod_rdf_parser.y" {(yyval.sval) = (yyvsp[(1) - (1)].sval);} break; case 9: /* Line 1792 of yacc.c */ -#line 94 "slmod_tracker_0_6_parser.y" - {(yyval.sval) = (yyvsp[(2) - (3)].sval);} +#line 103 "slmod_rdf_parser.y" + {(yyval.sval) = talloc_asprintf(srp_slq, "%s", (yyvsp[(2) - (3)].sval));} break; case 10: /* Line 1792 of yacc.c */ -#line 95 "slmod_tracker_0_6_parser.y" - { - if ((yyvsp[(1) - (3)].sval) && (yyvsp[(3) - (3)].sval)) { - if (strcmp((yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)) != 0) - YYABORT; - else - (yyval.sval) = (yyvsp[(1) - (3)].sval); - } else if ((yyvsp[(1) - (3)].sval)) - (yyval.sval) = (yyvsp[(1) - (3)].sval); - else if ((yyvsp[(3) - (3)].sval)) - (yyval.sval) = (yyvsp[(3) - (3)].sval); - else - YYABORT; -} +#line 104 "slmod_rdf_parser.y" + {(yyval.sval) = talloc_asprintf(srp_slq, "%s . %s", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval));} break; case 11: /* Line 1792 of yacc.c */ -#line 108 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 105 "slmod_rdf_parser.y" + { + if (strcmp((yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)) != 0) + (yyval.sval) = talloc_asprintf(srp_slq, "{ %s } UNION { %s }", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)); + else + (yyval.sval) = talloc_asprintf(srp_slq, "%s", (yyvsp[(1) - (3)].sval)); +} break; case 12: /* Line 1792 of yacc.c */ -#line 112 "slmod_tracker_0_6_parser.y" +#line 114 "slmod_rdf_parser.y" {(yyval.sval) = map_expr((yyvsp[(1) - (5)].sval), '=', (yyvsp[(4) - (5)].sval));} break; case 13: /* Line 1792 of yacc.c */ -#line 113 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 115 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (5)].sval), '!', (yyvsp[(4) - (5)].sval));} break; case 14: /* Line 1792 of yacc.c */ -#line 114 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 116 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (5)].sval), '<', (yyvsp[(4) - (5)].sval));} break; case 15: /* Line 1792 of yacc.c */ -#line 115 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 117 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (5)].sval), '>', (yyvsp[(4) - (5)].sval));} break; case 16: /* Line 1792 of yacc.c */ -#line 116 "slmod_tracker_0_6_parser.y" +#line 118 "slmod_rdf_parser.y" {(yyval.sval) = map_expr((yyvsp[(1) - (6)].sval), '=', (yyvsp[(4) - (6)].sval));} break; case 17: /* Line 1792 of yacc.c */ -#line 117 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 119 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (6)].sval), '!', (yyvsp[(4) - (6)].sval));} break; case 18: /* Line 1792 of yacc.c */ -#line 118 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 120 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (6)].sval), '<', (yyvsp[(4) - (6)].sval));} break; case 19: /* Line 1792 of yacc.c */ -#line 119 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 121 "slmod_rdf_parser.y" + {(yyval.sval) = map_expr((yyvsp[(1) - (6)].sval), '>', (yyvsp[(4) - (6)].sval));} break; case 20: /* Line 1792 of yacc.c */ -#line 123 "slmod_tracker_0_6_parser.y" - {YYABORT;} +#line 125 "slmod_rdf_parser.y" + {(yyval.sval) = map_daterange((yyvsp[(3) - (8)].sval), (yyvsp[(5) - (8)].tval), (yyvsp[(7) - (8)].tval));} break; case 21: /* Line 1792 of yacc.c */ -#line 127 "slmod_tracker_0_6_parser.y" +#line 129 "slmod_rdf_parser.y" {(yyval.tval) = isodate2unix((yyvsp[(3) - (4)].sval));} break; case 22: /* Line 1792 of yacc.c */ -#line 128 "slmod_tracker_0_6_parser.y" +#line 130 "slmod_rdf_parser.y" {(yyval.tval) = atoi((yyvsp[(1) - (1)].sval)) + SPRAW_TIME_OFFSET;} break; /* Line 1792 of yacc.c */ -#line 1594 "slmod_tracker_0_6_parser.c" +#line 1591 "slmod_rdf_parser.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1822,7 +1819,7 @@ yyreturn: /* Line 2055 of yacc.c */ -#line 131 "slmod_tracker_0_6_parser.y" +#line 133 "slmod_rdf_parser.y" static time_t isodate2unix(const char *s) @@ -1834,45 +1831,67 @@ static time_t isodate2unix(const char *s) return mktime(&tm); } -static void map_type_search(const char *val) +const char *map_daterange(const char *dateattr, time_t date1, time_t date2) { - for (struct MDTypeMap *p = MDTypeMap; p->mdtm_value; p++) { - if (strcmp(p->mdtm_value, val) == 0) { - if (p->mdtm_type == -1) - ts_type = SERVICE_OTHER_FILES; - else - ts_type = p->mdtm_type; - return; + EC_INIT; + char *result = NULL; + struct spotlight_rdf_map *p; + struct tm *tmp; + char buf1[64], buf2[64]; + + EC_NULL_LOG( tmp = localtime(&date1) ); + strftime(buf1, sizeof(buf1), "%Y-%m-%dT%H:%M:%SZ", tmp); + EC_NULL_LOG( tmp = localtime(&date2) ); + strftime(buf2, sizeof(buf2), "%Y-%m-%dT%H:%M:%SZ", tmp); + + for (p = spotlight_rdf_map; p->srm_spotlight_attr; p++) { + if (strcmp(dateattr, p->srm_spotlight_attr) == 0) { + /* do something */ + break; } } - ts_type = SERVICE_OTHER_FILES; + +EC_CLEANUP: + if (ret != 0) + return NULL; + return result; } -static char *map_expr(const char *attr, char op, const char *val) +const char *map_expr(const char *attr, char op, const char *val) { EC_INIT; - bstring q, search, replace; char *result = NULL; - - for (struct spotlight_tracker_map *p = spotlight_tracker_map; p->stm_spotlight_attr; p++) { - if (strcmp(p->stm_spotlight_attr, attr) == 0) { - switch (p->stm_type) { - case stmt_name: - case stmt_fts: - q = bfromcstr(val); + struct spotlight_rdf_map *p; + time_t t; + struct tm *tmp; + char buf1[64]; + bstring q = NULL, search = NULL, replace = NULL; + + for (p = spotlight_rdf_map; p->srm_spotlight_attr; p++) { + if (p->srm_rdf_attr && strcmp(p->srm_spotlight_attr, attr) == 0) { + switch (p->srm_type) { + case srmt_bool: + /* do something */ + break; + case srmt_num: + /* do something */ + break; + case srmt_str: + q = bformat("^%s$", val); search = bfromcstr("*"); - replace = bfromcstr(""); + replace = bfromcstr(".*"); bfindreplace(q, search, replace, 0); - result = talloc_strdup(ts_slq, bdata(q)); - bdestroy(q); - bdestroy(search); - bdestroy(replace); + /* do something */ + break; + case srmt_fts: + /* do something */ + break; + case srmt_date: + t = atoi(val) + SPRAW_TIME_OFFSET; + EC_NULL( tmp = localtime(&t) ); + strftime(buf1, sizeof(buf1), "%Y-%m-%dT%H:%M:%SZ", tmp); + /* do something */ break; - - case stmt_type: - map_type_search(val); - return NULL; - default: yyerror("unknown Spotlight attribute type"); EC_FAIL; @@ -1881,9 +1900,13 @@ static char *map_expr(const char *attr, char op, const char *val) } } - - EC_CLEANUP: + if (q) + bdestroy(q); + if (search) + bdestroy(search); + if (replace) + bdestroy(replace); return result; } @@ -1902,34 +1925,31 @@ int yywrap() } /** - * Map a Spotlight RAW query string to a Tracker 0.6 query + * Map a Spotlight RAW query string to a SPARQL query string * - * @param[in] slq Spotlight query handle - * @param[out] type mapped file type - * @param[out] search mapped search term + * @param[in] slq Spotlight query handle + * @param[out] sparql_result Mapped SPARQL query, string is allocated in + * talloc context of slq * @return 0 on success, -1 on error **/ -int map_spotlight_to_tracker_0_6_query(slq_t *slq_in, - ServiceType *type, - gchar **search) +int map_spotlight_to_sparql_query(slq_t *slq, gchar **sparql_result) { EC_INIT; YY_BUFFER_STATE s = NULL; + ssp_result = NULL; - ts_slq = slq_in; - s = yy_scan_string(ts_slq->slq_qstring); - - /* Default object type is file */ - *type = SERVICE_FILES; - *search = NULL; + srp_slq = slq; + s = yy_scan_string(slq->slq_qstring); EC_ZERO( yyparse() ); - *type = ts_type; - *search = ts_search; EC_CLEANUP: if (s) yy_delete_buffer(s); + if (ret == 0) + *sparql_result = ssp_result; + else + *sparql_result = NULL; EC_EXIT; } @@ -1944,10 +1964,10 @@ int main(int argc, char **argv) return 1; } - ts_slq = talloc_zero(NULL, slq_t); - struct vol *vol = talloc_zero(ts_slq, struct vol); + srp_slq = talloc_zero(NULL, slq_t); + struct vol *vol = talloc_zero(srp_slq, struct vol); vol->v_path = "/Volumes/test"; - ts_slq->slq_vol = vol; + srp_slq->slq_vol = vol; s = yy_scan_string(argv[1]); @@ -1955,11 +1975,9 @@ int main(int argc, char **argv) yy_delete_buffer(s); - if (ret == 0) { - printf("Tracker 0.6 query: service: %s, searchterm: %s\n", - tracker_type_to_service_name(ts_type), ts_search); - } + if (ret == 0) + printf("SPARQL: %s\n", ssp_result ? ssp_result : "(empty)"); - return ret; + return 0; } #endif diff --git a/etc/spotlight/slmod_tracker_0_6_parser.h b/etc/spotlight/slmod_rdf_parser.h similarity index 91% rename from etc/spotlight/slmod_tracker_0_6_parser.h rename to etc/spotlight/slmod_rdf_parser.h index 9be6861e..9b28f837 100644 --- a/etc/spotlight/slmod_tracker_0_6_parser.h +++ b/etc/spotlight/slmod_rdf_parser.h @@ -84,16 +84,16 @@ extern int yydebug; typedef union YYSTYPE { /* Line 2058 of yacc.c */ -#line 45 "slmod_tracker_0_6_parser.y" +#line 44 "slmod_rdf_parser.y" int ival; - char *sval; + const char *sval; bool bval; time_t tval; /* Line 2058 of yacc.c */ -#line 97 "slmod_tracker_0_6_parser.h" +#line 97 "slmod_rdf_parser.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -117,14 +117,14 @@ int yyparse (); #endif /* ! YYPARSE_PARAM */ /* "%code provides" blocks. */ /* Line 2058 of yacc.c */ -#line 39 "slmod_tracker_0_6_parser.y" +#line 38 "slmod_rdf_parser.y" #define SPRAW_TIME_OFFSET 978307200 - extern int map_spotlight_to_tracker_0_6_query(slq_t *slq, ServiceType *type, gchar **search); - extern slq_t *ts_slq; + extern int map_spotlight_to_rdf_query(slq_t *slq, gchar **sparql_result); + extern slq_t *srp_slq; /* Line 2058 of yacc.c */ -#line 129 "slmod_tracker_0_6_parser.h" +#line 129 "slmod_rdf_parser.h" #endif /* !YY_YY_Y_TAB_H_INCLUDED */ diff --git a/etc/spotlight/slmod_rdf_parser.y b/etc/spotlight/slmod_rdf_parser.y new file mode 100644 index 00000000..74630fd0 --- /dev/null +++ b/etc/spotlight/slmod_rdf_parser.y @@ -0,0 +1,293 @@ +%{ + #include + + #include + #include + #include + #include + + #include + + #include + #include + #include + #include + + #include "slmod_rdf_map.h" + + struct yy_buffer_state; + typedef struct yy_buffer_state *YY_BUFFER_STATE; + extern int yylex (void); + extern void yyerror (char const *); + extern void *yyterminate(void); + extern YY_BUFFER_STATE yy_scan_string( const char *str); + extern void yy_delete_buffer ( YY_BUFFER_STATE buffer ); + + /* forward declarations */ + static const char *map_expr(const char *attr, char op, const char *val); + static const char *map_daterange(const char *dateattr, time_t date1, time_t date2); + static time_t isodate2unix(const char *s); + + /* global vars, eg needed by the lexer */ + slq_t *srp_slq; + + /* local vars */ + static gchar *ssp_result; +%} + +%code provides { + #define SPRAW_TIME_OFFSET 978307200 + extern int map_spotlight_to_rdf_query(slq_t *slq, gchar **sparql_result); + extern slq_t *srp_slq; +} + +%union { + int ival; + const char *sval; + bool bval; + time_t tval; +} + +%expect 5 +%error-verbose + +%type match expr line function +%type date + +%token WORD +%token BOOL +%token FUNC_INRANGE +%token DATE_ISO +%token OBRACE CBRACE EQUAL UNEQUAL GT LT COMMA QUOTE +%left AND +%left OR +%% + +input: +/* empty */ +| input line +; + +line: +expr { + ssp_result = talloc_asprintf(srp_slq, + "" + " " + " " + " " + " %s" + " " + " %s" + " " + "", + srp_slq->slq_vol->v_path, $1); + $$ = ssp_result; +} +; + +expr: +BOOL { + if ($1 == false) + YYACCEPT; + else + YYABORT; +} +| match OR match { + if (strcmp($1, $3) != 0) + $$ = talloc_asprintf(srp_slq, "{ %s } UNION { %s }", $1, $3); + else + $$ = talloc_asprintf(srp_slq, "%s", $1); +} +| match {$$ = $1; if ($$ == NULL) YYABORT;} +| function {$$ = $1;} +| OBRACE expr CBRACE {$$ = talloc_asprintf(srp_slq, "%s", $2);} +| expr AND expr {$$ = talloc_asprintf(srp_slq, "%s . %s", $1, $3);} +| expr OR expr { + if (strcmp($1, $3) != 0) + $$ = talloc_asprintf(srp_slq, "{ %s } UNION { %s }", $1, $3); + else + $$ = talloc_asprintf(srp_slq, "%s", $1); +} +; + +match: +WORD EQUAL QUOTE WORD QUOTE {$$ = map_expr($1, '=', $4);} +| WORD UNEQUAL QUOTE WORD QUOTE {$$ = map_expr($1, '!', $4);} +| WORD LT QUOTE WORD QUOTE {$$ = map_expr($1, '<', $4);} +| WORD GT QUOTE WORD QUOTE {$$ = map_expr($1, '>', $4);} +| WORD EQUAL QUOTE WORD QUOTE WORD {$$ = map_expr($1, '=', $4);} +| WORD UNEQUAL QUOTE WORD QUOTE WORD {$$ = map_expr($1, '!', $4);} +| WORD LT QUOTE WORD QUOTE WORD {$$ = map_expr($1, '<', $4);} +| WORD GT QUOTE WORD QUOTE WORD {$$ = map_expr($1, '>', $4);} +; + +function: +FUNC_INRANGE OBRACE WORD COMMA date COMMA date CBRACE {$$ = map_daterange($3, $5, $7);} +; + +date: +DATE_ISO OBRACE WORD CBRACE {$$ = isodate2unix($3);} +| WORD {$$ = atoi($1) + SPRAW_TIME_OFFSET;} +; + +%% + +static time_t isodate2unix(const char *s) +{ + struct tm tm; + + if (strptime(s, "%Y-%m-%dT%H:%M:%SZ", &tm) == NULL) + return (time_t)-1; + return mktime(&tm); +} + +const char *map_daterange(const char *dateattr, time_t date1, time_t date2) +{ + EC_INIT; + char *result = NULL; + struct spotlight_rdf_map *p; + struct tm *tmp; + char buf1[64], buf2[64]; + + EC_NULL_LOG( tmp = localtime(&date1) ); + strftime(buf1, sizeof(buf1), "%Y-%m-%dT%H:%M:%SZ", tmp); + EC_NULL_LOG( tmp = localtime(&date2) ); + strftime(buf2, sizeof(buf2), "%Y-%m-%dT%H:%M:%SZ", tmp); + + for (p = spotlight_rdf_map; p->srm_spotlight_attr; p++) { + if (strcmp(dateattr, p->srm_spotlight_attr) == 0) { + /* do something */ + break; + } + } + +EC_CLEANUP: + if (ret != 0) + return NULL; + return result; +} + +const char *map_expr(const char *attr, char op, const char *val) +{ + EC_INIT; + char *result = NULL; + struct spotlight_rdf_map *p; + time_t t; + struct tm *tmp; + char buf1[64]; + bstring q = NULL, search = NULL, replace = NULL; + + for (p = spotlight_rdf_map; p->srm_spotlight_attr; p++) { + if (p->srm_rdf_attr && strcmp(p->srm_spotlight_attr, attr) == 0) { + switch (p->srm_type) { + case srmt_bool: + /* do something */ + break; + case srmt_num: + /* do something */ + break; + case srmt_str: + q = bformat("^%s$", val); + search = bfromcstr("*"); + replace = bfromcstr(".*"); + bfindreplace(q, search, replace, 0); + /* do something */ + break; + case srmt_fts: + /* do something */ + break; + case srmt_date: + t = atoi(val) + SPRAW_TIME_OFFSET; + EC_NULL( tmp = localtime(&t) ); + strftime(buf1, sizeof(buf1), "%Y-%m-%dT%H:%M:%SZ", tmp); + /* do something */ + break; + default: + yyerror("unknown Spotlight attribute type"); + EC_FAIL; + } + break; + } + } + +EC_CLEANUP: + if (q) + bdestroy(q); + if (search) + bdestroy(search); + if (replace) + bdestroy(replace); + return result; +} + +void yyerror(const char *str) +{ +#ifdef MAIN + printf("yyerror: %s\n", str); +#else + LOG(log_error, logtype_sl, "yyerror: %s", str); +#endif +} + +int yywrap() +{ + return 1; +} + +/** + * Map a Spotlight RAW query string to a SPARQL query string + * + * @param[in] slq Spotlight query handle + * @param[out] sparql_result Mapped SPARQL query, string is allocated in + * talloc context of slq + * @return 0 on success, -1 on error + **/ +int map_spotlight_to_sparql_query(slq_t *slq, gchar **sparql_result) +{ + EC_INIT; + YY_BUFFER_STATE s = NULL; + ssp_result = NULL; + + srp_slq = slq; + s = yy_scan_string(slq->slq_qstring); + + EC_ZERO( yyparse() ); + +EC_CLEANUP: + if (s) + yy_delete_buffer(s); + if (ret == 0) + *sparql_result = ssp_result; + else + *sparql_result = NULL; + EC_EXIT; +} + +#ifdef MAIN +int main(int argc, char **argv) +{ + int ret; + YY_BUFFER_STATE s; + + if (argc != 2) { + printf("usage: %s QUERY\n", argv[0]); + return 1; + } + + srp_slq = talloc_zero(NULL, slq_t); + struct vol *vol = talloc_zero(srp_slq, struct vol); + vol->v_path = "/Volumes/test"; + srp_slq->slq_vol = vol; + + s = yy_scan_string(argv[1]); + + ret = yyparse(); + + yy_delete_buffer(s); + + if (ret == 0) + printf("SPARQL: %s\n", ssp_result ? ssp_result : "(empty)"); + + return 0; +} +#endif diff --git a/etc/spotlight/slmod_tracker_0_6_map.c b/etc/spotlight/slmod_tracker_0_6_map.c deleted file mode 100644 index 259fd0c9..00000000 --- a/etc/spotlight/slmod_tracker_0_6_map.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright (c) 2012 Frank Lahm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif /* HAVE_CONFIG_H */ - -#include "slmod_tracker_0_6_map.h" - -struct spotlight_tracker_map spotlight_tracker_map[] = { - /* stm_spotlight_attr, stm_type */ - {"*", stmt_fts}, - {"kMDItemTextContent", stmt_fts}, - {"kMDItemDisplayName", stmt_name}, - {"kMDItemFSName", stmt_name}, - {"_kMDItemGroupId", stmt_type}, - {"kMDItemContentTypeTree", stmt_type}, - {NULL, -1} -}; - -struct MDTypeMap MDTypeMap[] = { - {"1", SERVICE_EMAILS}, - {"2", SERVICE_CONTACTS}, - {"3", -1}, /* Prefpane */ - {"4", -1}, /* Fonts */ - {"5", SERVICE_BOOKMARKS}, - {"6", SERVICE_CONTACTS}, - {"7", SERVICE_VIDEOS}, - {"8", SERVICE_APPLICATIONS}, - {"9", SERVICE_FOLDERS}, - {"10", SERVICE_MUSIC}, - {"11", SERVICE_DOCUMENTS}, /* PDF */ - {"12", -1}, /* Presentation */ - {"13", SERVICE_IMAGES}, - {"public.jpeg", SERVICE_IMAGES}, - {"public.tiff", SERVICE_IMAGES}, - {"com.compuserve.gif", SERVICE_IMAGES}, - {"public.png", SERVICE_IMAGES}, - {"com.microsoft.bmp", SERVICE_IMAGES}, - {"public.content", SERVICE_DOCUMENTS}, - {"public.mp3", SERVICE_VIDEOS}, - {"public.mpeg-4-audio", -1}, - {"com.apple.application", SERVICE_APPLICATIONS}, - {"public.text", SERVICE_TEXT_FILES}, - {"public.plain-text", SERVICE_TEXT_FILES}, - {"public.rtf", SERVICE_TEXT_FILES}, - {"public.html", -1}, - {"public.xml", -1}, - {"public.source-code", SERVICE_DEVELOPMENT_FILES}, - {NULL, -1} -}; diff --git a/etc/spotlight/slmod_tracker_0_6_parser.y b/etc/spotlight/slmod_tracker_0_6_parser.y deleted file mode 100644 index 4a8a1f99..00000000 --- a/etc/spotlight/slmod_tracker_0_6_parser.y +++ /dev/null @@ -1,270 +0,0 @@ -%code top { - #include - - #include - #include - #include - #include - - #include - #include - - #include - #include - #include - #include - - #include "slmod_tracker_0_6_map.h" - - struct yy_buffer_state; - typedef struct yy_buffer_state *YY_BUFFER_STATE; - extern int yylex (void); - extern void yyerror (char const *); - extern void *yyterminate(void); - extern YY_BUFFER_STATE yy_scan_string( const char *str); - extern void yy_delete_buffer ( YY_BUFFER_STATE buffer ); - - /* forward declarations */ - static char *map_expr(const char *attr, char op, const char *val); - static time_t isodate2unix(const char *s); - - /* global vars, eg needed by the lexer */ - slq_t *ts_slq; - - /* local vars */ - static ServiceType ts_type; /* Tracker query object type */ - static gchar *ts_search; /* Tracker query search term */ -} - -%code provides { - #define SPRAW_TIME_OFFSET 978307200 - extern int map_spotlight_to_tracker_0_6_query(slq_t *slq, ServiceType *type, gchar **search); - extern slq_t *ts_slq; -} - -%union { - int ival; - char *sval; - bool bval; - time_t tval; -} - -%expect 5 -%error-verbose - -%type match function expr line -%type date - -%token WORD -%token BOOL -%token FUNC_INRANGE -%token DATE_ISO -%token OBRACE CBRACE EQUAL UNEQUAL GT LT COMMA QUOTE -%left AND -%left OR -%% - -input: -/* empty */ -| input line -; - -line: -expr { - ts_search = $1; - $$ = $1; -} -; - -expr: -BOOL { - if ($1 == false) - YYACCEPT; - else - YYABORT; -} -| match OR match { - if (strcmp($1, $3) != 0) - YYABORT; - else - $$ = $1; -} -| match {$$ = $1;} -| function {$$ = $1;} -| OBRACE expr CBRACE {$$ = $2;} -| expr AND expr { - if ($1 && $3) { - if (strcmp($1, $3) != 0) - YYABORT; - else - $$ = $1; - } else if ($1) - $$ = $1; - else if ($3) - $$ = $3; - else - YYABORT; -} -| expr OR expr {YYABORT;} -; - -match: -WORD EQUAL QUOTE WORD QUOTE {$$ = map_expr($1, '=', $4);} -| WORD UNEQUAL QUOTE WORD QUOTE {YYABORT;} -| WORD LT QUOTE WORD QUOTE {YYABORT;} -| WORD GT QUOTE WORD QUOTE {YYABORT;} -| WORD EQUAL QUOTE WORD QUOTE WORD {$$ = map_expr($1, '=', $4);} -| WORD UNEQUAL QUOTE WORD QUOTE WORD {YYABORT;} -| WORD LT QUOTE WORD QUOTE WORD {YYABORT;} -| WORD GT QUOTE WORD QUOTE WORD {YYABORT;} -; - -function: -FUNC_INRANGE OBRACE WORD COMMA date COMMA date CBRACE {YYABORT;} -; - -date: -DATE_ISO OBRACE WORD CBRACE {$$ = isodate2unix($3);} -| WORD {$$ = atoi($1) + SPRAW_TIME_OFFSET;} -; - -%% - -static time_t isodate2unix(const char *s) -{ - struct tm tm; - - if (strptime(s, "%Y-%m-%dT%H:%M:%SZ", &tm) == NULL) - return (time_t)-1; - return mktime(&tm); -} - -static void map_type_search(const char *val) -{ - for (struct MDTypeMap *p = MDTypeMap; p->mdtm_value; p++) { - if (strcmp(p->mdtm_value, val) == 0) { - if (p->mdtm_type == -1) - ts_type = SERVICE_OTHER_FILES; - else - ts_type = p->mdtm_type; - return; - } - } - ts_type = SERVICE_OTHER_FILES; -} - -static char *map_expr(const char *attr, char op, const char *val) -{ - EC_INIT; - bstring q, search, replace; - char *result = NULL; - - for (struct spotlight_tracker_map *p = spotlight_tracker_map; p->stm_spotlight_attr; p++) { - if (strcmp(p->stm_spotlight_attr, attr) == 0) { - switch (p->stm_type) { - case stmt_name: - case stmt_fts: - q = bfromcstr(val); - search = bfromcstr("*"); - replace = bfromcstr(""); - bfindreplace(q, search, replace, 0); - result = talloc_strdup(ts_slq, bdata(q)); - bdestroy(q); - bdestroy(search); - bdestroy(replace); - break; - - case stmt_type: - map_type_search(val); - return NULL; - - default: - yyerror("unknown Spotlight attribute type"); - EC_FAIL; - } - break; - } - } - - - -EC_CLEANUP: - return result; -} - -void yyerror(const char *str) -{ -#ifdef MAIN - printf("yyerror: %s\n", str); -#else - LOG(log_error, logtype_sl, "yyerror: %s", str); -#endif -} - -int yywrap() -{ - return 1; -} - -/** - * Map a Spotlight RAW query string to a Tracker 0.6 query - * - * @param[in] slq Spotlight query handle - * @param[out] type mapped file type - * @param[out] search mapped search term - * @return 0 on success, -1 on error - **/ -int map_spotlight_to_tracker_0_6_query(slq_t *slq_in, - ServiceType *type, - gchar **search) -{ - EC_INIT; - YY_BUFFER_STATE s = NULL; - - ts_slq = slq_in; - s = yy_scan_string(ts_slq->slq_qstring); - - /* Default object type is file */ - *type = SERVICE_FILES; - *search = NULL; - - EC_ZERO( yyparse() ); - *type = ts_type; - *search = ts_search; - -EC_CLEANUP: - if (s) - yy_delete_buffer(s); - EC_EXIT; -} - -#ifdef MAIN -int main(int argc, char **argv) -{ - int ret; - YY_BUFFER_STATE s; - - if (argc != 2) { - printf("usage: %s QUERY\n", argv[0]); - return 1; - } - - ts_slq = talloc_zero(NULL, slq_t); - struct vol *vol = talloc_zero(ts_slq, struct vol); - vol->v_path = "/Volumes/test"; - ts_slq->slq_vol = vol; - - s = yy_scan_string(argv[1]); - - ret = yyparse(); - - yy_delete_buffer(s); - - if (ret == 0) { - printf("Tracker 0.6 query: service: %s, searchterm: %s\n", - tracker_type_to_service_name(ts_type), ts_search); - } - - return ret; -} -#endif diff --git a/etc/spotlight/spotlight_rawquery_lexer.c b/etc/spotlight/spotlight_rawquery_lexer.c index e798724d..84c99367 100644 --- a/etc/spotlight/spotlight_rawquery_lexer.c +++ b/etc/spotlight/spotlight_rawquery_lexer.c @@ -505,10 +505,10 @@ char *yytext; #include "slmod_sparql_parser.h" #define SLQ_VAR ssp_slq #endif -#ifdef HAVE_TRACKER_0_6 +#ifdef HAVE_TRACKER_RDF #include -#include "slmod_tracker_0_6_parser.h" -#define SLQ_VAR ts_slq +#include "slmod_rdf_parser.h" +#define SLQ_VAR srp_slq #endif #line 514 "spotlight_rawquery_lexer.c" diff --git a/etc/spotlight/spotlight_rawquery_lexer.l b/etc/spotlight/spotlight_rawquery_lexer.l index d5dba769..1e903857 100644 --- a/etc/spotlight/spotlight_rawquery_lexer.l +++ b/etc/spotlight/spotlight_rawquery_lexer.l @@ -13,10 +13,10 @@ #include "slmod_sparql_parser.h" #define SLQ_VAR ssp_slq #endif -#ifdef HAVE_TRACKER_0_6 +#ifdef HAVE_TRACKER_RDF #include -#include "slmod_tracker_0_6_parser.h" -#define SLQ_VAR ts_slq +#include "slmod_rdf_parser.h" +#define SLQ_VAR srp_slq #endif %} diff --git a/include/atalk/spotlight.h b/include/atalk/spotlight.h index 8049a676..7bd16c2d 100644 --- a/include/atalk/spotlight.h +++ b/include/atalk/spotlight.h @@ -104,7 +104,7 @@ typedef struct _slq_t { #ifdef HAVE_TRACKER_SPARQL void *slq_tracker_cursor; /* Tracker SPARQL query result cursor */ #endif -#ifdef HAVE_TRACKER_0_6 +#ifdef HAVE_TRACKER_RDF char *slq_trackerquery; /* query string*/ int slq_service; /* Tracker service */ int slq_offset; /* search offset */ diff --git a/macros/netatalk.m4 b/macros/netatalk.m4 index ce5059fe..94ca82f5 100644 --- a/macros/netatalk.m4 +++ b/macros/netatalk.m4 @@ -51,19 +51,19 @@ AC_DEFUN([AC_NETATALK_SPOTLIGHT], [ dnl Test for Tracker 0.6 on Solaris and derived platforms if test x"$this_os" = x"solaris" -a x"$ac_cv_have_tracker" = x"no" ; then - PKG_CHECK_MODULES([TRACKER], [tracker >= 0.6], [ac_cv_have_tracker_0_6=yes], [ac_cv_have_tracker_0_6=no]) - if test x"$ac_cv_have_tracker_0_6" = x"yes" ; then + PKG_CHECK_MODULES([TRACKER], [tracker >= 0.6], [ac_cv_have_tracker_rdf=yes], [ac_cv_have_tracker_rdf=no]) + if test x"$ac_cv_have_tracker_rdf" = x"yes" ; then AC_DEFINE(HAVE_TRACKER, 1, [Define if Tracker is available]) - AC_DEFINE(HAVE_TRACKER_0_6, 1, [Define if Tracker 0.6 is available]) + AC_DEFINE(HAVE_TRACKER_RDF, 1, [Define if Tracker 0.6 with support for RDF queries is available]) ac_cv_tracker_prefix=`pkg-config --variable=prefix tracker` - AC_DEFINE_UNQUOTED(TRACKER_0_6_PREFIX, ["$ac_cv_tracker_prefix"], [Path to Tracker]) + AC_DEFINE_UNQUOTED(TRACKER_RDF_PREFIX, ["$ac_cv_tracker_prefix"], [Path to Tracker]) fi fi AC_SUBST(TRACKER_CFLAGS) AC_SUBST(TRACKER_LIBS) AM_CONDITIONAL(HAVE_TRACKER_SPARQL, [test x"$ac_cv_have_tracker" = x"yes"]) - AM_CONDITIONAL(HAVE_TRACKER_0_6, [test x"$ac_cv_have_tracker_0_6" = x"yes"]) + AM_CONDITIONAL(HAVE_TRACKER_RDF, [test x"$ac_cv_have_tracker_rdf" = x"yes"]) ]) dnl Whether to disable bundled libevent -- 2.39.2