/* local vars */
static gchar *ssp_result;
static char sparqlvar;
+ static char *result_limit;
%}
%code provides {
line:
expr {
+ if (ssp_slq->slq_result_limit)
+ result_limit = talloc_asprintf(ssp_slq, "LIMIT %ld", ssp_slq->slq_result_limit);
+ else
+ result_limit = "";
ssp_result = talloc_asprintf(ssp_slq,
- "SELECT DISTINCT ?url WHERE "
- "{ ?obj nie:url ?url FILTER(regex(?url, '^file://%s/')) . %s}",
- ssp_slq->slq_vol->v_path, $1);
+ "SELECT ?url WHERE "
+ "{ %s . ?obj nie:url ?url . FILTER(tracker:uri-is-descendant('file://%s/', ?url)) } %s",
+ $1, ssp_slq->slq_vol->v_path, result_limit);
$$ = ssp_result;
}
;
YYABORT;
}
| match OR match {
+ if (!ssp_slq->slq_allow_expr)
+ YYABORT;
+ if ($1 == NULL || $3 == NULL)
+ YYABORT;
if (strcmp($1, $3) != 0)
$$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
else
| 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);}
+| expr AND expr {
+ if (!ssp_slq->slq_allow_expr)
+ YYABORT;
+ $$ = talloc_asprintf(ssp_slq, "%s . %s", $1, $3);
+}
| expr OR expr {
if (strcmp($1, $3) != 0)
$$ = talloc_asprintf(ssp_slq, "{ %s } UNION { %s }", $1, $3);
return mktime(&tm);
}
-const char *map_daterange(const char *dateattr, time_t date1, time_t date2)
+static const char *map_daterange(const char *dateattr, time_t date1, time_t date2)
{
EC_INIT;
char *result = NULL;
return result;
}
-const char *map_expr(const char *attr, char op, const char *val)
+static const char *map_expr(const char *attr, char op, const char *val)
{
EC_INIT;
char *result = NULL;
bstring q = NULL, search = NULL, replace = NULL;
for (p = spotlight_sparql_map; p->ssm_spotlight_attr; p++) {
- if (p->ssm_sparql_attr && strcmp(p->ssm_spotlight_attr, attr) == 0) {
+ if (p->ssm_enabled && (strcmp(p->ssm_spotlight_attr, attr) == 0)) {
+ if (p->ssm_type != ssmt_type && p->ssm_sparql_attr == NULL) {
+ yyerror("unsupported Spotlight attribute");
+ EC_FAIL;
+ }
switch (p->ssm_type) {
case ssmt_bool:
result = talloc_asprintf(ssp_slq, "?obj %s '%s'", p->ssm_sparql_attr, val);
result = map_type_search(attr, op, val);
break;
default:
- yyerror("unknown Spotlight attribute type");
EC_FAIL;
}
break;
struct vol *vol = talloc_zero(ssp_slq, struct vol);
vol->v_path = "/Volumes/test";
ssp_slq->slq_vol = vol;
+ ssp_slq->slq_allow_expr = true;
sparqlvar = 'a';
s = yy_scan_string(argv[1]);