/* * rasqal_query_results_write_sparql_xml: * @iostr: #raptor_iostream to write the query results to * @results: #rasqal_query_results query results input * @base_uri: #raptor_uri base URI of the output format * * Write the fourth version of the SPARQL XML query results format to an * iostream in a format - INTERNAL. * * If the writing succeeds, the query results will be exhausted. * * Return value: non-0 on failure **/ static int rasqal_query_results_write_sparql_xml(rasqal_query_results_formatter* formatter, raptor_iostream *iostr, rasqal_query_results* results, raptor_uri *base_uri) { int rc=1; rasqal_world* world = rasqal_query_results_get_world(results); raptor_xml_writer* xml_writer=NULL; raptor_namespace *res_ns=NULL; raptor_namespace_stack *nstack=NULL; raptor_xml_element *sparql_element=NULL; raptor_xml_element *results_element=NULL; raptor_xml_element *result_element=NULL; raptor_xml_element *element1=NULL; raptor_xml_element *binding_element=NULL; raptor_xml_element *variable_element=NULL; raptor_qname **attrs=NULL; int i; if(!rasqal_query_results_is_bindings(results) && !rasqal_query_results_is_boolean(results)) { rasqal_log_error_simple(world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Can only write XML format v3 for variable binding and boolean results"); return 1; } nstack = raptor_new_namespaces(world->raptor_world_ptr, 1); if(!nstack) return 1; xml_writer = raptor_new_xml_writer(world->raptor_world_ptr, nstack, iostr); if(!xml_writer) goto tidy; res_ns=raptor_new_namespace(nstack, NULL, (const unsigned char*)"http://www.w3.org/2005/sparql-results#", 0); if(!res_ns) goto tidy; sparql_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"sparql", NULL, base_uri); if(!sparql_element) goto tidy; raptor_xml_writer_start_element(xml_writer, sparql_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); /* <head> */ element1=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"head", NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 2); raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); if(rasqal_query_results_is_bindings(results)) { for(i=0; 1; i++) { const unsigned char *name; name=rasqal_query_results_get_binding_name(results, i); if(!name) break; /* <variable name="x"/> */ variable_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"variable", NULL, base_uri); if(!variable_element) goto tidy; attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, (const unsigned char*)"name", (const unsigned char*)name); /* attribute value */ if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(variable_element, attrs, 1); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 4); raptor_xml_writer_empty_element(xml_writer, variable_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); raptor_free_xml_element(variable_element); variable_element=NULL; } } /* FIXME - could add <link> inside <head> */ /* </head> */ raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 2); raptor_xml_writer_end_element(xml_writer, element1); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); raptor_free_xml_element(element1); element1=NULL; /* Boolean Results */ if(rasqal_query_results_is_boolean(results)) { result_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"boolean", NULL, base_uri); if(!result_element) goto tidy; raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 2); raptor_xml_writer_start_element(xml_writer, result_element); if(rasqal_query_results_get_boolean(results)) raptor_xml_writer_raw(xml_writer, RASQAL_XSD_BOOLEAN_TRUE); else raptor_xml_writer_raw(xml_writer, RASQAL_XSD_BOOLEAN_FALSE); raptor_xml_writer_end_element(xml_writer, result_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); goto results3done; } /* Variable Binding Results */ /* <results> */ results_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"results", NULL, base_uri); if(!results_element) goto tidy; raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 2); raptor_xml_writer_start_element(xml_writer, results_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); /* declare result element for later multiple use */ result_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"result", NULL, base_uri); if(!result_element) goto tidy; while(!rasqal_query_results_finished(results)) { /* <result> */ raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 4); raptor_xml_writer_start_element(xml_writer, result_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); for(i=0; i<rasqal_query_results_get_bindings_count(results); i++) { const unsigned char *name=rasqal_query_results_get_binding_name(results, i); rasqal_literal *l=rasqal_query_results_get_binding_value(results, i); /* <binding> */ binding_element=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"binding", NULL, base_uri); if(!binding_element) goto tidy; attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, (const unsigned char*)"name", name); if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(binding_element, attrs, 1); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 6); raptor_xml_writer_start_element(xml_writer, binding_element); if(!l) { element1=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"unbound", NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_empty_element(xml_writer, element1); } else switch(l->type) { case RASQAL_LITERAL_URI: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"uri", NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_cdata(xml_writer, (const unsigned char*)raptor_uri_as_string(l->value.uri)); raptor_xml_writer_end_element(xml_writer, element1); break; case RASQAL_LITERAL_BLANK: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"bnode", NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_cdata(xml_writer, (const unsigned char*)l->string); raptor_xml_writer_end_element(xml_writer, element1); break; case RASQAL_LITERAL_STRING: case RASQAL_LITERAL_UDT: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, (const unsigned char*)"literal", NULL, base_uri); if(!element1) goto tidy; if(l->language || l->datatype) { attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; if(l->language) attrs[0]=raptor_new_qname(nstack, (const unsigned char*)"xml:lang", (const unsigned char*)l->language); else attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, (const unsigned char*)"datatype", (const unsigned char*)raptor_uri_as_string(l->datatype)); if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(element1, attrs, 1); } raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_cdata_counted(xml_writer, (const unsigned char*)l->string, l->string_len); raptor_xml_writer_end_element(xml_writer, element1); break; case RASQAL_LITERAL_PATTERN: case RASQAL_LITERAL_QNAME: case RASQAL_LITERAL_INTEGER: case RASQAL_LITERAL_XSD_STRING: case RASQAL_LITERAL_BOOLEAN: case RASQAL_LITERAL_DOUBLE: case RASQAL_LITERAL_FLOAT: case RASQAL_LITERAL_VARIABLE: case RASQAL_LITERAL_DECIMAL: case RASQAL_LITERAL_DATETIME: case RASQAL_LITERAL_INTEGER_SUBTYPE: case RASQAL_LITERAL_UNKNOWN: default: rasqal_log_error_simple(world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Cannot turn literal type %d into XML", l->type); goto tidy; } if(element1) { raptor_free_xml_element(element1); element1=NULL; } /* </binding> */ raptor_xml_writer_end_element(xml_writer, binding_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); raptor_free_xml_element(binding_element); binding_element=NULL; } raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 4); raptor_xml_writer_end_element(xml_writer, result_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); rasqal_query_results_next(results); } raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)" ", 2); raptor_xml_writer_end_element(xml_writer, results_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); results3done: rc=0; raptor_xml_writer_end_element(xml_writer, sparql_element); raptor_xml_writer_raw_counted(xml_writer, (const unsigned char*)"\n", 1); tidy: if(element1) raptor_free_xml_element(element1); if(variable_element) raptor_free_xml_element(variable_element); if(binding_element) raptor_free_xml_element(binding_element); if(result_element) raptor_free_xml_element(result_element); if(results_element) raptor_free_xml_element(results_element); if(sparql_element) raptor_free_xml_element(sparql_element); if(res_ns) raptor_free_namespace(res_ns); if(xml_writer) raptor_free_xml_writer(xml_writer); if(nstack) raptor_free_namespaces(nstack); return rc; }
/* * rasqal_query_results_write_sparql_xml: * @iostr: #raptor_iostream to write the query results to * @results: #rasqal_query_results query results input * @base_uri: #raptor_uri base URI of the output format * * Write the fourth version of the SPARQL XML query results format to an * iostream in a format - INTERNAL. * * If the writing succeeds, the query results will be exhausted. * * Return value: non-0 on failure **/ static int rasqal_query_results_write_sparql_xml(rasqal_query_results_formatter* formatter, raptor_iostream *iostr, rasqal_query_results* results, raptor_uri *base_uri) { int rc=1; rasqal_world* world = rasqal_query_results_get_world(results); raptor_xml_writer* xml_writer=NULL; raptor_namespace *res_ns=NULL; raptor_namespace_stack *nstack=NULL; raptor_xml_element *sparql_element=NULL; raptor_xml_element *results_element=NULL; raptor_xml_element *result_element=NULL; raptor_xml_element *element1=NULL; raptor_xml_element *binding_element=NULL; raptor_xml_element *variable_element=NULL; raptor_qname **attrs=NULL; int i; rasqal_query_results_type type; type = rasqal_query_results_get_type(results); if(type != RASQAL_QUERY_RESULTS_BINDINGS && type != RASQAL_QUERY_RESULTS_BOOLEAN) { rasqal_log_error_simple(world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Cannot write XML format v3 for %s query result format", rasqal_query_results_type_label(type)); return 1; } nstack = raptor_new_namespaces(world->raptor_world_ptr, 1); if(!nstack) return 1; xml_writer = raptor_new_xml_writer(world->raptor_world_ptr, nstack, iostr); if(!xml_writer) goto tidy; res_ns=raptor_new_namespace(nstack, NULL, RASQAL_GOOD_CAST(const unsigned char*, "http://www.w3.org/2005/sparql-results#"), 0); if(!res_ns) goto tidy; sparql_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "sparql"), NULL, base_uri); if(!sparql_element) goto tidy; raptor_xml_writer_start_element(xml_writer, sparql_element); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); /* <head> */ element1=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "head"), NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 2); raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); if(rasqal_query_results_is_bindings(results)) { for(i=0; 1; i++) { const unsigned char *name; name=rasqal_query_results_get_binding_name(results, i); if(!name) break; /* <variable name="x"/> */ variable_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*,"variable"), NULL, base_uri); if(!variable_element) goto tidy; attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, RASQAL_GOOD_CAST(const unsigned char*,"name"), RASQAL_GOOD_CAST(const unsigned char*, name)); /* attribute value */ if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(variable_element, attrs, 1); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 4); raptor_xml_writer_empty_element(xml_writer, variable_element); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); raptor_free_xml_element(variable_element); variable_element=NULL; } } /* FIXME - could add <link> inside <head> */ /* </head> */ raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 2); raptor_xml_writer_end_element(xml_writer, element1); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); raptor_free_xml_element(element1); element1=NULL; /* Boolean Results */ if(rasqal_query_results_is_boolean(results)) { result_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "boolean"), NULL, base_uri); if(!result_element) goto tidy; raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 2); raptor_xml_writer_start_element(xml_writer, result_element); if(rasqal_query_results_get_boolean(results)) raptor_xml_writer_raw(xml_writer, RASQAL_XSD_BOOLEAN_TRUE); else raptor_xml_writer_raw(xml_writer, RASQAL_XSD_BOOLEAN_FALSE); raptor_xml_writer_end_element(xml_writer, result_element); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); goto results3done; } /* Variable Binding Results */ /* <results> */ results_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "results"), NULL, base_uri); if(!results_element) goto tidy; raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 2); raptor_xml_writer_start_element(xml_writer, results_element); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); /* declare result element for later multiple use */ result_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "result"), NULL, base_uri); if(!result_element) goto tidy; while(!rasqal_query_results_finished(results)) { /* <result> */ raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 4); raptor_xml_writer_start_element(xml_writer, result_element); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, "\n"), 1); for(i=0; i<rasqal_query_results_get_bindings_count(results); i++) { const unsigned char *name=rasqal_query_results_get_binding_name(results, i); rasqal_literal *l=rasqal_query_results_get_binding_value(results, i); /* <binding> */ binding_element=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "binding"), NULL, base_uri); if(!binding_element) goto tidy; attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, RASQAL_GOOD_CAST(const unsigned char*, "name"), name); if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(binding_element, attrs, 1); raptor_xml_writer_raw_counted(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, " "), 6); raptor_xml_writer_start_element(xml_writer, binding_element); if(!l) { element1=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "unbound"), NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_empty_element(xml_writer, element1); } else switch(l->type) { case RASQAL_LITERAL_URI: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "uri"), NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_cdata(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, raptor_uri_as_string(l->value.uri))); raptor_xml_writer_end_element(xml_writer, element1); break; case RASQAL_LITERAL_BLANK: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "bnode"), NULL, base_uri); if(!element1) goto tidy; raptor_xml_writer_start_element(xml_writer, element1); raptor_xml_writer_cdata(xml_writer, RASQAL_GOOD_CAST(const unsigned char*, l->string)); raptor_xml_writer_end_element(xml_writer, element1); break; case RASQAL_LITERAL_STRING: case RASQAL_LITERAL_UDT: element1=raptor_new_xml_element_from_namespace_local_name(res_ns, RASQAL_GOOD_CAST(const unsigned char*, "literal"), NULL, base_uri); if(!element1) goto tidy; if(l->language || l->datatype) { attrs=(raptor_qname **)raptor_alloc_memory(sizeof(raptor_qname*)); if(!attrs) goto tidy; if(l->language) attrs[0]=raptor_new_qname(nstack, RASQAL_GOOD_CAST(const unsigned char*, "xml:lang"), RASQAL_GOOD_CAST(const unsigned char*, l->language)); else attrs[0] = raptor_new_qname_from_namespace_local_name(world->raptor_world_ptr, res_ns, RASQAL_GOOD_CAST(const unsigned char*, "datatype"), RASQAL_GOOD_CAST(const unsigned char*, raptor_uri_as_string(l->datatype))); if(!attrs[0]) { raptor_free_memory((void*)attrs); goto tidy; } raptor_xml_element_set_attributes(element1, attrs, 1); }