static librdf_query_results_formatter* librdf_query_rasqal_new_results_formatter(librdf_query_results* query_results, const char *name, const char *mime_type, librdf_uri* format_uri) { rasqal_world* rasqal_world_ptr; rasqal_query_results_formatter* formatter; librdf_query_results_formatter* qrf; rasqal_world_ptr = query_results->query->world->rasqal_world_ptr; formatter = rasqal_new_query_results_formatter(rasqal_world_ptr, name, mime_type, (raptor_uri*)format_uri); if(!formatter) return NULL; qrf = LIBRDF_MALLOC(librdf_query_results_formatter*, sizeof(*qrf)); if(!qrf) { rasqal_free_query_results_formatter(formatter); return NULL; } qrf->query_results = query_results; qrf->formatter = formatter; return qrf; }
/** * rasqal_query_results_read: * @iostr: #raptor_iostream to read the query from * @results: #rasqal_query_results query results format * @name: format name (or NULL) * @mime_type: format mime type (or NULL) * @format_uri: #raptor_uri describing the format to read (or NULL for default) * @base_uri: #raptor_uri base URI of the input format * * Read the query results from an iostream in a format. * * This uses the #rasqal_query_results_formatter class * and the rasqal_query_results_formatter_read() method * to perform the formatting. * * See rasqal_world_get_query_results_format_description() for * obtaining the supported format URIs at run time. * * Return value: non-0 on failure **/ int rasqal_query_results_read(raptor_iostream *iostr, rasqal_query_results* results, const char *name, const char *mime_type, raptor_uri *format_uri, raptor_uri *base_uri) { rasqal_query_results_formatter *formatter; int status; RASQAL_ASSERT_OBJECT_POINTER_RETURN_VALUE(iostr, raptor_iostream, 1); RASQAL_ASSERT_OBJECT_POINTER_RETURN_VALUE(results, rasqal_query_results, 1); if(results->failed) return 1; formatter = rasqal_new_query_results_formatter(results->world, name, mime_type, format_uri); if(!formatter) return 1; status = rasqal_query_results_formatter_read(results->world, iostr, formatter, results, base_uri); rasqal_free_query_results_formatter(formatter); return status; }
static int print_formatted_query_results(rasqal_world* world, rasqal_query_results* results, raptor_world* raptor_world_ptr, FILE* output, const char* result_format, raptor_uri* base_uri, int quiet) { raptor_iostream *iostr; rasqal_query_results_formatter* results_formatter; int rc = 0; results_formatter = rasqal_new_query_results_formatter(world, result_format, NULL, NULL); if(!results_formatter) { fprintf(stderr, "%s: Invalid bindings result format `%s'\n", program, result_format); rc = 1; goto tidy; } iostr = raptor_new_iostream_to_file_handle(raptor_world_ptr, output); if(!iostr) { rasqal_free_query_results_formatter(results_formatter); rc = 1; goto tidy; } rc = rasqal_query_results_formatter_write(iostr, results_formatter, results, base_uri); raptor_free_iostream(iostr); rasqal_free_query_results_formatter(results_formatter); tidy: if(rc) fprintf(stderr, "%s: Formatting query results failed\n", program); return rc; }
static rasqal_query_results* check_query_read_results(rasqal_world* world, raptor_world* raptor_world_ptr, rasqal_query_results_type results_type, raptor_iostream* result_iostr, const char* result_filename, const char* result_format_name) { rasqal_variables_table* vars_table = NULL; const char* format_name = NULL; rasqal_query_results_formatter* qrf = NULL; unsigned char *query_results_base_uri_string = NULL; raptor_uri* query_results_base_uri = NULL; rasqal_query_results* results = NULL; query_results_base_uri_string = raptor_uri_filename_to_uri_string(result_filename); query_results_base_uri = raptor_new_uri(raptor_world_ptr, query_results_base_uri_string); vars_table = rasqal_new_variables_table(world); results = rasqal_new_query_results(world, NULL, results_type, vars_table); rasqal_free_variables_table(vars_table); vars_table = NULL; if(!results) { fprintf(stderr, "%s: Failed to create query results\n", program); goto tidy_fail; } if(result_format_name) { /* FIXME validate result format name is legal query * results formatter name */ format_name = result_format_name; } if(!format_name) format_name = rasqal_world_guess_query_results_format_name(world, NULL /* uri */, NULL /* mime_type */, NULL /*buffer */, 0, (const unsigned char*)result_filename); qrf = rasqal_new_query_results_formatter(world, format_name, NULL /* mime type */, NULL /* uri */); if(!qrf) goto tidy_fail; if(rasqal_query_results_formatter_read(world, result_iostr, qrf, results, query_results_base_uri)) { fprintf(stderr, "%s: Failed to read query results from %s with format %s", program, result_filename, format_name); goto tidy_fail; } rasqal_free_query_results_formatter(qrf); qrf = NULL; return results; tidy_fail: if(vars_table) rasqal_free_variables_table(vars_table); if(results) rasqal_free_query_results(results); if(query_results_base_uri) raptor_free_uri(query_results_base_uri); return NULL; }
/** * rasqal_service_execute: * @svc: rasqal service * * Execute a rasqal sparql protocol service * * Return value: query results or NULL on failure */ rasqal_query_results* rasqal_service_execute(rasqal_service* svc) { rasqal_query_results* results = NULL; unsigned char* result_string = NULL; size_t result_length; raptor_iostream* read_iostr = NULL; raptor_uri* read_base_uri = NULL; rasqal_variables_table* vars_table = NULL; rasqal_query_results_formatter* read_formatter = NULL; raptor_uri* retrieval_uri = NULL; raptor_stringbuffer* uri_sb = NULL; size_t len; unsigned char* str; raptor_world* raptor_world_ptr = rasqal_world_get_raptor(svc->world); if(!svc->www) { svc->www = raptor_new_www(raptor_world_ptr); if(!svc->www) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create WWW"); goto error; } } svc->started = 0; svc->final_uri = NULL; svc->sb = raptor_new_stringbuffer(); svc->content_type = NULL; if(svc->format) raptor_www_set_http_accept(svc->www, svc->format); else raptor_www_set_http_accept(svc->www, DEFAULT_FORMAT); raptor_www_set_write_bytes_handler(svc->www, rasqal_service_write_bytes, svc); raptor_www_set_content_type_handler(svc->www, rasqal_service_content_type_handler, svc); /* Construct a URI to retrieve following SPARQL protocol HTTP * binding from concatenation of * * 1. service_uri * 2. '?' * 3. "query=" query_string * 4. "&default-graph-uri=" background graph URI if any * 5. "&named-graph-uri=" named graph URI for all named graphs * with URI-escaping of the values */ uri_sb = raptor_new_stringbuffer(); if(!uri_sb) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create stringbuffer"); goto error; } str = raptor_uri_as_counted_string(svc->service_uri, &len); raptor_stringbuffer_append_counted_string(uri_sb, str, len, 1); raptor_stringbuffer_append_counted_string(uri_sb, (const unsigned char*)"?", 1, 1); if(svc->query_string) { raptor_stringbuffer_append_counted_string(uri_sb, (const unsigned char*)"query=", 6, 1); raptor_stringbuffer_append_uri_escaped_counted_string(uri_sb, svc->query_string, svc->query_string_len, 1); } if(svc->data_graphs) { rasqal_data_graph* dg; int i; int bg_graph_count; for(i = 0, bg_graph_count = 0; (dg = (rasqal_data_graph*)raptor_sequence_get_at(svc->data_graphs, i)); i++) { unsigned char* graph_str; size_t graph_len; raptor_uri* graph_uri; if(dg->flags & RASQAL_DATA_GRAPH_BACKGROUND) { if(bg_graph_count++) { if(bg_graph_count == 2) { /* Warn once, only when the second BG is seen */ rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_WARN, NULL, "Attempted to add use background graphs"); } /* always skip after first BG */ continue; } raptor_stringbuffer_append_counted_string(uri_sb, (const unsigned char*)"&default-graph-uri=", 19, 1); graph_uri = dg->uri; } else { raptor_stringbuffer_append_counted_string(uri_sb, (const unsigned char*)"&named-graph-uri=", 17, 1); graph_uri = dg->name_uri; } graph_str = raptor_uri_as_counted_string(graph_uri, &graph_len); raptor_stringbuffer_append_uri_escaped_counted_string(uri_sb, (const char*)graph_str, graph_len, 1); } } str = raptor_stringbuffer_as_string(uri_sb); retrieval_uri = raptor_new_uri(raptor_world_ptr, str); if(!retrieval_uri) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create retrieval URI %s", raptor_uri_as_string(retrieval_uri)); goto error; } raptor_free_stringbuffer(uri_sb); uri_sb = NULL; if(raptor_www_fetch(svc->www, retrieval_uri)) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to fetch retrieval URI %s", raptor_uri_as_string(retrieval_uri)); goto error; } vars_table = rasqal_new_variables_table(svc->world); if(!vars_table) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create variables table"); goto error; } results = rasqal_new_query_results(svc->world, NULL, RASQAL_QUERY_RESULTS_BINDINGS, vars_table); /* (results takes a reference/copy to vars_table) */ rasqal_free_variables_table(vars_table); vars_table = NULL; if(!results) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create query results"); goto error; } result_length = raptor_stringbuffer_length(svc->sb); result_string = raptor_stringbuffer_as_string(svc->sb); read_iostr = raptor_new_iostream_from_string(raptor_world_ptr, result_string, result_length); if(!read_iostr) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create iostream from string"); rasqal_free_query_results(results); results = NULL; goto error; } read_base_uri = svc->final_uri ? svc->final_uri : svc->service_uri; read_formatter = rasqal_new_query_results_formatter(svc->world, /* format name */ NULL, svc->content_type, /* format URI */ NULL); if(!read_formatter) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to create query formatter for type %s", svc->content_type); rasqal_free_query_results(results); results = NULL; goto error; } if(rasqal_query_results_formatter_read(svc->world, read_iostr, read_formatter, results, read_base_uri)) { rasqal_log_error_simple(svc->world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Failed to read from query formatter"); rasqal_free_query_results(results); results = NULL; goto error; } error: if(retrieval_uri) raptor_free_uri(retrieval_uri); if(uri_sb) raptor_free_stringbuffer(uri_sb); if(read_formatter) rasqal_free_query_results_formatter(read_formatter); if(read_iostr) raptor_free_iostream(read_iostr); if(vars_table) rasqal_free_variables_table(vars_table); if(svc->final_uri) { raptor_free_uri(svc->final_uri); svc->final_uri = NULL; } if(svc->content_type) { RASQAL_FREE(cstring, svc->content_type); svc->content_type = NULL; } if(svc->sb) { raptor_free_stringbuffer(svc->sb); svc->sb = NULL; } return results; }
rasqal_query_results* rasqal_cmdline_read_results(rasqal_world* world, raptor_world* raptor_world_ptr, rasqal_query_results_type results_type, raptor_iostream* result_iostr, const char* result_filename, const char* result_format_name) { rasqal_query_results_formatter* qrf = NULL; unsigned char *query_results_base_uri_string = NULL; raptor_uri* query_results_base_uri = NULL; rasqal_query_results* results = NULL; int rc; query_results_base_uri_string = raptor_uri_filename_to_uri_string(result_filename); query_results_base_uri = raptor_new_uri(raptor_world_ptr, query_results_base_uri_string); raptor_free_memory(query_results_base_uri_string); results = rasqal_new_query_results2(world, NULL, results_type); if(!results) goto tidy_fail; if(result_format_name) { /* check name */ if(!rasqal_query_results_formats_check2(world, result_format_name, NULL /* uri */, NULL /* mime type */, RASQAL_QUERY_RESULTS_FORMAT_FLAG_READER)) return NULL; } else { /* or use default */ result_format_name = rasqal_world_guess_query_results_format_name(world, NULL /* uri */, NULL /* mime_type */, NULL /* buffer */, 0, (const unsigned char*)result_filename); } qrf = rasqal_new_query_results_formatter(world, result_format_name, NULL /* mime type */, NULL /* uri */); if(!qrf) goto tidy_fail; rc = rasqal_query_results_formatter_read(world, result_iostr, qrf, results, query_results_base_uri); rasqal_free_query_results_formatter(qrf); qrf = NULL; raptor_free_uri(query_results_base_uri); query_results_base_uri = NULL; if(rc) goto tidy_fail; return results; tidy_fail: if(results) rasqal_free_query_results(results); if(query_results_base_uri) raptor_free_uri(query_results_base_uri); return NULL; }
static void librdf_query_rasqal_free_results_formatter(librdf_query_results_formatter* qrf) { rasqal_free_query_results_formatter(qrf->formatter); LIBRDF_FREE(librdf_query_results, qrf); }