]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/spotlight_rawquery_parser.c
Map Spotlight searchstring to regex format and allow dots in it
[netatalk.git] / etc / afpd / spotlight_rawquery_parser.c
index e85ada4c88391d8d24edc1686da644ba7c262216..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) {
@@ -1874,20 +1875,25 @@ const char *map_expr(const char *attr, char op, const char *val)
                 result = talloc_asprintf(ssp_slq, "?obj %s '%s'", p->ssm_sparql_attr, val);
                 break;
             case ssmt_num:
-                result = talloc_asprintf(ssp_slq, "?obj %s ?%c FILTER(?%c %c '%s')",
+                result = talloc_asprintf(ssp_slq, "?obj %s ?%c FILTER(?%c %c%c '%s')",
                                          p->ssm_sparql_attr,
                                          sparqlvar,
                                          sparqlvar,
                                          op,
+                                         op == '!' ? '=' : ' ', /* append '=' to '!' */
                                          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:
@@ -1914,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;
 }