]> arthur.barton.de Git - netatalk.git/commitdiff
Map Spotlight searchstring to regex format and allow dots in it
authorFrank Lahm <franklahm@googlemail.com>
Thu, 1 Nov 2012 20:20:14 +0000 (21:20 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Thu, 1 Nov 2012 20:20:14 +0000 (21:20 +0100)
etc/afpd/spotlight_rawquery_lexer.c
etc/afpd/spotlight_rawquery_lexer.l
etc/afpd/spotlight_rawquery_parser.c
etc/afpd/spotlight_rawquery_parser.y

index d2264ed321084f6ff07b074850cbe9da773c000c..c3f60f3890a473d56d853000689929ab941d42ff 100644 (file)
@@ -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,
index 6ee3de527bfdb42e0cdf72f246a5a0eb68973e7a..5b013c8e27d50dacc76d10296fd057a685683e35 100644 (file)
@@ -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;
index 328b6ff7dfc5b92022b74f3901cd3d64baff3b39..5679a0c38b620b7598f24e07685162eaecedd677 100644 (file)
@@ -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;
 }
 
index 3806987ff9cb6356370695161f50af8f5a3f4c1d..e4f4ed0ab5c887df1b802e3937ae11328f898d57 100644 (file)
@@ -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;
 }