X-Git-Url: http://git.indexdata.com/?p=mp-sparql-moved-to-github.git;a=blobdiff_plain;f=src%2Fsparql.c;h=50f41f60eae17b08328f031098a073d44a7ee475;hp=fbd8c9143ac27c52ea6aa27f7cedcf1bd42b2be3;hb=a74de0cefd7999972739abb1e8a10b00d746b8ee;hpb=fea72715438bf7e340fb08a22fbb97df31dd2ec8 diff --git a/src/sparql.c b/src/sparql.c index fbd8c91..50f41f6 100644 --- a/src/sparql.c +++ b/src/sparql.c @@ -58,6 +58,13 @@ int yaz_sparql_from_rpn_wrbuf(yaz_sparql_t s, WRBUF addinfo, WRBUF w, return yaz_sparql_from_rpn_stream(s, addinfo, wrbuf_vp_puts, w, q); } +int yaz_sparql_from_uri_wrbuf(yaz_sparql_t s, WRBUF addinfo, WRBUF w, + const char *uri, const char *schema) +{ + return yaz_sparql_from_uri_stream(s, addinfo, wrbuf_vp_puts, w, uri, + schema); +} + static Odr_int lookup_attr_numeric(Z_AttributeList *attributes, int type) { int j; @@ -97,60 +104,11 @@ static const char *lookup_attr_string(Z_AttributeList *attributes, int type) return 0; } -static int apt(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars, - Z_AttributesPlusTerm *q, int indent, int *var_no) +static int z_term(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars, + struct sparql_entry *e, const char *use_var, + Z_Term *term, int indent, int *var_no) { - Z_Term *term = q->term; - Odr_int v = lookup_attr_numeric(q->attributes, 1); - struct sparql_entry *e = 0; const char *cp; - const char *use_var = 0; - int i; - - wrbuf_puts(res, " "); - for (i = 0; i < indent; i++) - wrbuf_puts(res, " "); - if (v) - { - for (e = s->conf; e; e = e->next) - { - if (!strncmp(e->pattern, "index.", 6)) - { - char *end = 0; - Odr_int w = odr_strtol(e->pattern + 6, &end, 10); - - if (end && *end == '\0' && v == w) - break; - } - } - if (!e) - { - wrbuf_printf(addinfo, ODR_INT_PRINTF, v); - return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; - } - } - else - { - const char *index_name = lookup_attr_string(q->attributes, 1); - if (!index_name) - index_name = "any"; - for (e = s->conf; e; e = e->next) - { - if (!strncmp(e->pattern, "index.", 6)) - { - if (!strcmp(e->pattern + 6, index_name)) - break; - } - } - if (!e) - { - wrbuf_puts(addinfo, index_name); - return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; - } - } - assert(e); - wrbuf_rewind(addinfo); - for (cp = e->value; *cp; cp++) { if (strchr(" \t\r\n\f", *cp) && !use_var) @@ -183,6 +141,23 @@ static int apt(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars, } wrbuf_puts(addinfo, "\""); break; + case 'u': + wrbuf_puts(addinfo, "<"); + switch (term->which) + { + case Z_Term_general: + wrbuf_json_write(addinfo, + term->u.general->buf, term->u.general->len); + break; + case Z_Term_numeric: + wrbuf_printf(addinfo, ODR_INT_PRINTF, *term->u.numeric); + break; + case Z_Term_characterString: + wrbuf_json_puts(addinfo, term->u.characterString); + break; + } + wrbuf_puts(addinfo, ">"); + break; case 'd': switch (term->which) { @@ -210,6 +185,62 @@ static int apt(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars, wrbuf_putc(addinfo, *cp); } wrbuf_puts(res, wrbuf_cstr(addinfo)); + return 0; +} + +static int apt(yaz_sparql_t s, WRBUF addinfo, WRBUF res, WRBUF vars, + Z_AttributesPlusTerm *q, int indent, int *var_no) +{ + Odr_int v = lookup_attr_numeric(q->attributes, 1); + struct sparql_entry *e = 0; + const char *use_var = 0; + int i; + + wrbuf_puts(res, " "); + for (i = 0; i < indent; i++) + wrbuf_puts(res, " "); + if (v) + { + for (e = s->conf; e; e = e->next) + { + if (!strncmp(e->pattern, "index.", 6)) + { + char *end = 0; + Odr_int w = odr_strtol(e->pattern + 6, &end, 10); + + if (end && *end == '\0' && v == w) + break; + } + } + if (!e) + { + wrbuf_printf(addinfo, ODR_INT_PRINTF, v); + return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; + } + } + else + { + const char *index_name = lookup_attr_string(q->attributes, 1); + if (!index_name) + index_name = "any"; + for (e = s->conf; e; e = e->next) + { + if (!strncmp(e->pattern, "index.", 6)) + { + if (!strcmp(e->pattern + 6, index_name)) + break; + } + } + if (!e) + { + wrbuf_puts(addinfo, index_name); + return YAZ_BIB1_UNSUPP_USE_ATTRIBUTE; + } + } + assert(e); + wrbuf_rewind(addinfo); + + z_term(s, addinfo, res, vars, e, use_var, q->term, indent, var_no); (*var_no)++; return 0; } @@ -269,17 +300,15 @@ static int rpn_structure(yaz_sparql_t s, WRBUF addinfo, return 0; } -int yaz_sparql_from_rpn_stream(yaz_sparql_t s, - WRBUF addinfo, - void (*pr)(const char *buf, - void *client_data), - void *client_data, - Z_RPNQuery *q) +static int emit_prefixes(yaz_sparql_t s, + WRBUF addinfo, + void (*pr)(const char *buf, + void *client_data), + void *client_data) { struct sparql_entry *e; yaz_tok_cfg_t cfg = yaz_tok_cfg_create(); - int r = 0, errors = 0; - + int errors = 0; for (e = s->conf; e; e = e->next) { if (!strcmp(e->pattern, "prefix")) @@ -326,21 +355,96 @@ int yaz_sparql_from_rpn_stream(yaz_sparql_t s, { ; } + else if (!strcmp(e->pattern, "modifier")) + { + ; + } + else if (!strncmp(e->pattern, "uri", 3)) + { + ; + } else { errors++; } } - pr("\n", client_data); + yaz_tok_cfg_destroy(cfg); + return errors; +} + +int yaz_sparql_lookup_schema(yaz_sparql_t s, const char *schema) +{ + struct sparql_entry *e; + + for (e = s->conf; e; e = e->next) + { + if (!strncmp(e->pattern, "uri.", 4)) + { + if (!schema || !strcmp(e->pattern + 4, schema)) + break; + } + } + return e ? 1 : 0; +} + +int yaz_sparql_from_uri_stream(yaz_sparql_t s, + WRBUF addinfo, + void (*pr)(const char *buf, void *client_data), + void *client_data, + const char *uri, const char *schema) +{ + int r = 0, errors = emit_prefixes(s, addinfo, pr, client_data); + struct sparql_entry *e; + + for (e = s->conf; e; e = e->next) + { + if (!strncmp(e->pattern, "uri.", 4)) + { + if (!schema || !strcmp(e->pattern + 4, schema)) + break; + } + } + if (!e) + errors++; + if (!errors) + { + WRBUF res = wrbuf_alloc(); + WRBUF vars = wrbuf_alloc(); + int var_no = 0; + Z_Term term; + + term.which = Z_Term_characterString; + term.u.characterString = (char *) uri; + r = z_term(s, addinfo, res, vars, e, 0, &term, 0, &var_no); + if (!r) + { + pr(wrbuf_cstr(res), client_data); + pr("\n", client_data); + } + wrbuf_destroy(res); + wrbuf_destroy(vars); + } + return errors ? -1 : r; +} + +int yaz_sparql_from_rpn_stream(yaz_sparql_t s, + WRBUF addinfo, + void (*pr)(const char *buf, + void *client_data), + void *client_data, + Z_RPNQuery *q) +{ + int r = 0, errors = emit_prefixes(s, addinfo, pr, client_data); + struct sparql_entry *e; + for (e = s->conf; e; e = e->next) { if (!strcmp(e->pattern, "form")) { - pr(" ", client_data); pr(e->value, client_data); + pr("\n", client_data); } } - pr("\n", client_data); pr("WHERE {\n", client_data); for (e = s->conf; e; e = e->next) { @@ -397,8 +501,15 @@ int yaz_sparql_from_rpn_stream(yaz_sparql_t s, wrbuf_destroy(vars); } pr("\n}\n", client_data); - yaz_tok_cfg_destroy(cfg); + for (e = s->conf; e; e = e->next) + { + if (!strcmp(e->pattern, "modifier")) + { + pr(e->value, client_data); + pr("\n", client_data); + } + } return errors ? -1 : r; }