From: Frank Lahm Date: Thu, 1 Nov 2012 20:20:14 +0000 (+0100) Subject: Map Spotlight searchstring to regex format and allow dots in it X-Git-Url: https://arthur.barton.de/gitweb/?p=netatalk.git;a=commitdiff_plain;h=fbe3bc3970f74e138d27991eda6afb8a324bf5f2 Map Spotlight searchstring to regex format and allow dots in it --- diff --git a/etc/afpd/spotlight_rawquery_lexer.c b/etc/afpd/spotlight_rawquery_lexer.c index d2264ed3..c3f60f38 100644 --- a/etc/afpd/spotlight_rawquery_lexer.c +++ b/etc/afpd/spotlight_rawquery_lexer.c @@ -413,7 +413,7 @@ static yyconst flex_int32_t yy_ec[256] = static yyconst flex_int32_t yy_meta[34] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 } ; @@ -441,7 +441,7 @@ static yyconst flex_int16_t yy_def[53] = static yyconst flex_int16_t yy_nxt[98] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 4, 14, 15, 16, 17, 12, 12, 18, 12, 12, + 12, 14, 15, 16, 17, 12, 12, 18, 12, 12, 19, 12, 12, 12, 12, 12, 12, 12, 12, 20, 12, 12, 21, 28, 25, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 29, 39, 38, 37, diff --git a/etc/afpd/spotlight_rawquery_lexer.l b/etc/afpd/spotlight_rawquery_lexer.l index 6ee3de52..5b013c8e 100644 --- a/etc/afpd/spotlight_rawquery_lexer.l +++ b/etc/afpd/spotlight_rawquery_lexer.l @@ -14,7 +14,7 @@ cwd /* ignore case specifier */ cd /* ignore */ false {yylval.bval = false; return BOOL;} true {yylval.bval = true; return BOOL;} -[a-zA-Z0-9\*\:\-]+ {yylval.sval = talloc_strdup(ssp_slq, yytext); return WORD;} +[a-zA-Z0-9\*\:\-\.]+ {yylval.sval = talloc_strdup(ssp_slq, yytext); return WORD;} \" return QUOTE; \( return OBRACE; \) return CBRACE; diff --git a/etc/afpd/spotlight_rawquery_parser.c b/etc/afpd/spotlight_rawquery_parser.c index 328b6ff7..5679a0c3 100644 --- a/etc/afpd/spotlight_rawquery_parser.c +++ b/etc/afpd/spotlight_rawquery_parser.c @@ -1866,6 +1866,7 @@ const char *map_expr(const char *attr, char op, const char *val) time_t t; struct tm *tmp; char buf1[64]; + bstring q = NULL, search = NULL, replace = NULL; for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) { if (strcmp(p->ssm_spotlight_attr, attr) == 0) { @@ -1884,11 +1885,15 @@ const char *map_expr(const char *attr, char op, const char *val) sparqlvar++; break; case ssmt_str: + q = bformat("^%s$", val); + search = bfromcstr("*"); + replace = bfromcstr(".*"); + bfindreplace(q, search, replace, 0); result = talloc_asprintf(ssp_slq, "?obj %s ?%c FILTER(regex(?%c, '%s'))", p->ssm_sparql_attr, sparqlvar, sparqlvar, - val); + bdata(q)); sparqlvar++; break; case ssmt_fts: @@ -1915,6 +1920,12 @@ const 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; } diff --git a/etc/afpd/spotlight_rawquery_parser.y b/etc/afpd/spotlight_rawquery_parser.y index 3806987f..e4f4ed0a 100644 --- a/etc/afpd/spotlight_rawquery_parser.y +++ b/etc/afpd/spotlight_rawquery_parser.y @@ -173,6 +173,7 @@ const char *map_expr(const char *attr, char op, const char *val) time_t t; struct tm *tmp; char buf1[64]; + bstring q = NULL, search = NULL, replace = NULL; for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) { if (strcmp(p->ssm_spotlight_attr, attr) == 0) { @@ -191,11 +192,15 @@ const char *map_expr(const char *attr, char op, const char *val) sparqlvar++; break; case ssmt_str: + q = bformat("^%s$", val); + search = bfromcstr("*"); + replace = bfromcstr(".*"); + bfindreplace(q, search, replace, 0); result = talloc_asprintf(ssp_slq, "?obj %s ?%c FILTER(regex(?%c, '%s'))", p->ssm_sparql_attr, sparqlvar, sparqlvar, - val); + bdata(q)); sparqlvar++; break; case ssmt_fts: @@ -222,6 +227,12 @@ const 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; }