/* * rasqal_expression_evaluate_datatype: * @e: The expression to evaluate. * @eval_context: Evaluation context * * INTERNAL - Evaluate RASQAL_EXPR_DATATYPE (string literal) expression. * * Return value: A #rasqal_literal URI value or NULL on failure. */ static rasqal_literal* rasqal_expression_evaluate_datatype(rasqal_expression *e, rasqal_evaluation_context *eval_context, int *error_p) { rasqal_world* world = eval_context->world; rasqal_literal* l1; int free_literal = 1; rasqal_variable* v = NULL; raptor_uri* dt_uri = NULL; l1 = rasqal_expression_evaluate2(e->arg1, eval_context, error_p); if(*error_p || !l1) goto failed; v = rasqal_literal_as_variable(l1); if(v) { rasqal_free_literal(l1); l1 = v->value; /* don't need v after this */ free_literal = 0; if(!l1) goto failed; } if(rasqal_literal_get_rdf_term_type(l1) != RASQAL_LITERAL_STRING) goto failed; if(l1->language) goto failed; /* The datatype of a plain literal is xsd:string */ dt_uri = l1->datatype; if(!dt_uri && l1->type == RASQAL_LITERAL_STRING) dt_uri = rasqal_xsd_datatype_type_to_uri(l1->world, RASQAL_LITERAL_XSD_STRING); if(!dt_uri) goto failed; dt_uri = raptor_uri_copy(dt_uri); if(free_literal) rasqal_free_literal(l1); /* after this dt_uri is owned by result */ return rasqal_new_uri_literal(world, dt_uri); failed: if(error_p) *error_p = 1; if(free_literal) rasqal_free_literal(l1); return NULL; }
static void rasqal_query_write_sparql_literal(sparql_writer_context *wc, raptor_iostream* iostr, rasqal_literal* l) { if(!l) { raptor_iostream_counted_string_write("null", 4, iostr); return; } switch(l->type) { case RASQAL_LITERAL_URI: rasqal_query_write_sparql_uri(wc, iostr, l->value.uri); break; case RASQAL_LITERAL_BLANK: raptor_iostream_counted_string_write("_:", 2, iostr); raptor_iostream_string_write(l->string, iostr); break; case RASQAL_LITERAL_STRING: raptor_iostream_write_byte('"', iostr); raptor_string_ntriples_write(l->string, l->string_len, '"', iostr); raptor_iostream_write_byte('"', iostr); if(l->language) { raptor_iostream_write_byte('@', iostr); raptor_iostream_string_write(l->language, iostr); } if(l->datatype) { raptor_iostream_counted_string_write("^^", 2, iostr); rasqal_query_write_sparql_uri(wc, iostr, l->datatype); } break; case RASQAL_LITERAL_QNAME: raptor_iostream_counted_string_write("QNAME(", 6, iostr); raptor_iostream_counted_string_write(l->string, l->string_len, iostr); raptor_iostream_write_byte(')', iostr); break; case RASQAL_LITERAL_INTEGER: raptor_iostream_decimal_write(l->value.integer, iostr); break; case RASQAL_LITERAL_BOOLEAN: case RASQAL_LITERAL_DOUBLE: case RASQAL_LITERAL_FLOAT: case RASQAL_LITERAL_DECIMAL: raptor_iostream_counted_string_write(l->string, l->string_len, iostr); break; case RASQAL_LITERAL_VARIABLE: rasqal_query_write_sparql_variable(wc, iostr, l->value.variable); break; case RASQAL_LITERAL_DATETIME: case RASQAL_LITERAL_XSD_STRING: case RASQAL_LITERAL_UDT: case RASQAL_LITERAL_INTEGER_SUBTYPE: if(1) { raptor_uri* dt_uri; raptor_iostream_write_byte('"', iostr); raptor_string_ntriples_write(l->string, l->string_len, '"', iostr); raptor_iostream_counted_string_write("\"^^", 3, iostr); if(l->type == RASQAL_LITERAL_UDT) dt_uri = l->datatype; else dt_uri = rasqal_xsd_datatype_type_to_uri(l->world, l->type); rasqal_query_write_sparql_uri(wc, iostr, dt_uri); } break; case RASQAL_LITERAL_UNKNOWN: case RASQAL_LITERAL_PATTERN: default: RASQAL_FATAL2("Literal type %d cannot be written as a SPARQL literal", l->type); } }