X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=etc%2Fafpd%2Fspotlight_rawquery_parser.y;h=7f8bf6b9e1da90b3bf4d0085cafd76abbfd144ff;hb=0514aeef6f0102e4f7d274f0c0046003eca5c6c1;hp=daf5bc2ff7381fcb24792a5f73c3f61b8a23d924;hpb=4612605356d48e60d5017a8dabb4b97eff16a229;p=netatalk.git diff --git a/etc/afpd/spotlight_rawquery_parser.y b/etc/afpd/spotlight_rawquery_parser.y index daf5bc2f..7f8bf6b9 100644 --- a/etc/afpd/spotlight_rawquery_parser.y +++ b/etc/afpd/spotlight_rawquery_parser.y @@ -82,7 +82,7 @@ BOOL { else $$ = talloc_asprintf(ssp_slq, "%s", $1); } -| match {$$ = $1;} +| match {$$ = $1; if ($$ == NULL) YYABORT;} | function {$$ = $1;} | OBRACE expr CBRACE {$$ = talloc_asprintf(ssp_slq, "%s", $2);} | expr AND expr {$$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);} @@ -128,18 +128,37 @@ const char *map_daterange(const char *dateattr, const char *date1, const char *d const char *map_expr(const char *attr, char op, const char *val) { + EC_INIT; char *result = NULL; struct spotlight_sparql_map *p; for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) { -#if 0 if (strcmp(p->ssm_spotlight_attr, attr) == 0) { - result = talloc_asprintf(ssp_slq, p->ssm_sparql_query_fmtstr, val); + switch (p->ssm_type) { + case ssmt_bool: + result = talloc_asprintf(ssp_slq, "?x %s '%s'", p->ssm_sparql_attr, val); + break; + case ssmt_num: + result = talloc_asprintf(ssp_slq, "?x %s ?y FILTER(?y %c '%s')", p->ssm_sparql_attr, op, val); + break; + case ssmt_str: + result = talloc_asprintf(ssp_slq, "?x %s ?y FILTER(regex(?y, '%s'))", p->ssm_sparql_attr, val); + break; + case ssmt_fts: + result = talloc_asprintf(ssp_slq, "?x %s '%s'", p->ssm_sparql_attr, val); + break; + case ssmt_date: + yyerror("enexpected ssmt_date"); + EC_FAIL; + default: + yyerror("unknown Spotlight attribute type"); + EC_FAIL; + } break; } -#endif } +EC_CLEANUP: return result; } @@ -169,6 +188,7 @@ int map_spotlight_to_sparql_query(slq_t *slq, gchar **sparql_result) { EC_INIT; YY_BUFFER_STATE s = NULL; + ssp_result = NULL; ssp_slq = slq; s = yy_scan_string(slq->slq_qstring); @@ -179,9 +199,9 @@ EC_CLEANUP: if (s) yy_delete_buffer(s); if (ret == 0) - *sparql_result = NULL; - else *sparql_result = ssp_result; + else + *sparql_result = NULL; EC_EXIT; }