rasqal_literal* redland_node_to_rasqal_literal(librdf_world* world, librdf_node *node) { rasqal_literal* l; if(librdf_node_is_resource(node)) { raptor_uri* uri=(raptor_uri*)librdf_new_uri_from_uri(librdf_node_get_uri(node)); l=rasqal_new_uri_literal(world->rasqal_world_ptr, uri); /* transfer uri ownership to literal */ } else if(librdf_node_is_literal(node)) { unsigned char *string; librdf_uri *uri; unsigned char *new_string; char *new_language=NULL; raptor_uri *new_datatype=NULL; size_t len; string=librdf_node_get_literal_value_as_counted_string(node, &len); new_string=(unsigned char*)rasqal_alloc_memory(len+1); if(!new_string) return NULL; strcpy((char*)new_string, (const char*)string); string=(unsigned char*)librdf_node_get_literal_value_language(node); if(string) { new_language=(char*)rasqal_alloc_memory(strlen((const char*)string)+1); if(!new_language) { rasqal_free_memory((void*)new_string); return NULL; } strcpy((char*)new_language, (const char*)string); } uri=librdf_node_get_literal_value_datatype_uri(node); if(uri) new_datatype=(raptor_uri*)librdf_new_uri_from_uri(uri); /* transfer new_string,new_language,new_datatype ownership to literal */ l = rasqal_new_string_literal(world->rasqal_world_ptr, (const unsigned char*)new_string, new_language, new_datatype, NULL); } else { unsigned char *blank=librdf_node_get_blank_identifier(node); unsigned char *new_blank; if(!blank) return NULL; new_blank=(unsigned char*)rasqal_alloc_memory(strlen((const char*)blank)+1); if(!new_blank) return NULL; strcpy((char*)new_blank, (const char*)blank); /* transfer new_blank ownership to literal */ l = rasqal_new_simple_literal(world->rasqal_world_ptr, RASQAL_LITERAL_BLANK, (const unsigned char*)new_blank); } return l; }
int main(int argc, char *argv[]) { const char *program = rasqal_basename(argv[0]); #define TEST_ITEMS_COUNT 9 int i; for(i = 0; i < 4; i++) { rasqal_rowsource *rowsource; size_t count; /* for _from_file */ FILE *handle = NULL; /* for _from_string */ void *string; size_t string_len; switch(i) { case 0: #ifdef RASQAL_DEBUG fprintf(stderr, "%s: Creating rowsource from a filename '%s'\n", program, OUT_FILENAME); #endif rowsource = rasqal_new_rowsource_from_filename((const char*)IN_FILENAME); if(!rowsource) { fprintf(stderr, "%s: Failed to create rowsource to filename '%s'\n", program, OUT_FILENAME); exit(1); } break; case 1: #ifdef RASQAL_DEBUG fprintf(stderr, "%s: Creating rowsource from file handle\n", program); #endif handle = fopen((const char*)OUT_FILENAME, "wb"); rowsource = rasqal_new_rowsource_from_file_handle(handle); if(!rowsource) { fprintf(stderr, "%s: Failed to create rowsource from a file handle\n", program); exit(1); } break; case 2: #ifdef RASQAL_DEBUG fprintf(stderr, "%s: Creating rowsource from a string\n", program); #endif rowsource = rasqal_new_rowsource_from_string(&string, &string_len, NULL); if(!rowsource) { fprintf(stderr, "%s: Failed to create rowsource from a string\n", program); exit(1); } break; case 3: #ifdef RASQAL_DEBUG fprintf(stderr, "%s: Creating rowsource from a sink\n", program); #endif rowsource = rasqal_new_rowsource_from_sink(); if(!rowsource) { fprintf(stderr, "%s: Failed to create rowsource from a sink\n", program); exit(1); } break; default: fprintf(stderr, "%s: Unknown test case %d init\n", program, i); exit(1); } count = rasqal_rowsource_get_rows_count(rowsource); if(count != OUT_BYTES_COUNT) { fprintf(stderr, "%s: I/O stream wrote %d bytes, expected %d\n", program, (int)count, (int)OUT_BYTES_COUNT); return 1; } #ifdef RASQAL_DEBUG fprintf(stderr, "%s: Freeing rowsource\n", program); #endif rasqal_free_rowsource(rowsource); switch(i) { case 0: remove(OUT_FILENAME); break; case 1: fclose(handle); remove(OUT_FILENAME); break; case 2: if(!string) { fprintf(stderr, "%s: I/O stream failed to create a string\n", program); return 1; } if(string_len != count) { fprintf(stderr, "%s: I/O stream created a string length %d, expected %d\n", program, (int)string_len, (int)count); return 1; } rasqal_free_memory(string); break; case 3: break; default: fprintf(stderr, "%s: Unknown test case %d tidy\n", program, i); exit(1); } } /* keep gcc -Wall happy */ return(0); }
int main(int argc, char *argv[]) { rasqal_world *world; raptor_world* raptor_world_ptr = NULL; int rc = 0; int usage = 0; int help = 0; const char* query_language = DEFAULT_QUERY_LANGUAGE; const char* query_filename = NULL; const char* data_format_name = NULL; const char* result_filename = NULL; const char* result_format_name = NULL; unsigned char* query_string = NULL; size_t query_len = 0; unsigned char *query_base_uri_string = NULL; int free_query_base_uri_string = 0; raptor_uri* query_base_uri = NULL; rasqal_query* rq = NULL; rasqal_query_results* results = NULL; rasqal_query_results* expected_results = NULL; raptor_sequence* data_graphs = NULL; raptor_iostream* result_iostr = NULL; rasqal_dataset* ds = NULL; rasqal_query_results_type results_type; /* Set globals */ if(1) { char *p; program = argv[0]; if((p = strrchr(program, '/'))) program = p + 1; else if((p = strrchr(program, '\\'))) program = p + 1; argv[0] = program; } world = rasqal_new_world(); if(!world || rasqal_world_open(world)) { fprintf(stderr, "%s: rasqal_world init failed\n", program); return(1); } raptor_world_ptr = rasqal_world_get_raptor(world); rasqal_world_set_log_handler(world, world, check_query_log_handler); /* Option parsing */ while (!usage && !help) { int c; #ifdef HAVE_GETOPT_LONG int option_index = 0; c = getopt_long (argc, argv, GETOPT_STRING, long_options, &option_index); #else c = getopt (argc, argv, GETOPT_STRING); #endif if (c == -1) break; switch (c) { case 0: case '?': /* getopt() - unknown option */ usage = 1; break; case 'd': verbose++; break; case 'F': if(optarg) { data_format_name = optarg; } break; case 'h': help = 1; break; case 'l': if(optarg) { query_language = optarg; } break; case 'q': if(optarg) { query_filename = optarg; } break; case 'Q': if(optarg) { query_base_uri_string = (unsigned char*)optarg; } break; case 'r': if(optarg) { result_filename = optarg; } break; case 'R': if(optarg) { result_format_name = optarg; } break; case 'v': fputs(rasqal_version_string, stdout); fputc('\n', stdout); rasqal_free_world(world); exit(0); case 'g': case 'n': if(optarg) { rasqal_data_graph *dg = NULL; rasqal_data_graph_flags type; type = (c == 'n') ? RASQAL_DATA_GRAPH_NAMED : RASQAL_DATA_GRAPH_BACKGROUND; dg = rasqal_cmdline_read_data_graph(world, type, (const char*)optarg, data_format_name); if(!dg) { fprintf(stderr, "%s: Failed to create data graph for `%s'\n", program, optarg); return(1); } if(!data_graphs) { data_graphs = raptor_new_sequence((raptor_data_free_handler)rasqal_free_data_graph, NULL); if(!data_graphs) { fprintf(stderr, "%s: Failed to create data graphs sequence\n", program); return(1); } } raptor_sequence_push(data_graphs, dg); } break; } } /* end while option */ if(!help && !usage) { if(optind != argc) { fprintf(stderr, "%s: Extra arguments.\n", program); usage = 1; } else if(!result_filename) { usage = 2; /* Title and usage */ } else if(!query_filename) { usage = 2; /* Title and usage */ } } if(usage) { if(usage > 1) { fprintf(stderr, title_format_string, rasqal_version_string); fputs("Rasqal home page: ", stderr); fputs(rasqal_home_url_string, stderr); fputc('\n', stderr); fputs(rasqal_copyright_string, stderr); fputs("\nLicense: ", stderr); fputs(rasqal_license_string, stderr); fputs("\n\n", stderr); } fprintf(stderr, "Try `%s " HELP_ARG(h, help) "' for more information.\n", program); rasqal_free_world(world); exit(1); } if(help) { int i; printf(title_format_string, rasqal_version_string); puts("Run an RDF query and check it against a known result."); printf("Usage: %s [OPTIONS] -g DATA -q QUERY-FILE -r RESULT-FILE\n\n", program); fputs(rasqal_copyright_string, stdout); fputs("\nLicense: ", stdout); puts(rasqal_license_string); fputs("Rasqal home page: ", stdout); puts(rasqal_home_url_string); puts("\nNormal operation is to execute the query in the QUERY-FILE and\ncompare to the query results in RESULT-FILE."); puts("\nMain options:"); puts(HELP_TEXT("g URI", "default-graph URI", "Use URI as the default graph in the dataset")); puts(HELP_TEXT("l", "language LANGUAGE ", "Set query language name to one of:")); for(i = 0; 1; i++) { const raptor_syntax_description* desc; desc = rasqal_world_get_query_language_description(world, i); if(!desc) break; printf(" %-15s %s", desc->names[0], desc->label); if(!i) puts(" (default)"); else putchar('\n'); } puts(HELP_TEXT("n URI", "named-graph URI ", "Add named graph URI to dataset")); puts(HELP_TEXT("q FILE", "query QUERY-FILE", "Execute query in file QUERY-FILE")); puts(HELP_TEXT("r FILE", "result FILE ", "Compare to result in file RESULTS-FILE")); puts("\nAdditional options:"); puts(HELP_TEXT("d", "debug ", "Increase debug message level")); puts(HELP_TEXT("F", "data-format NAME ", "Set the data source format NAME (default: " DEFAULT_DATA_FORMAT_NAME_GRAPH ")")); puts(HELP_TEXT("h", "help ", "Print this help, then exit")); puts(HELP_TEXT("Q URI", "query-base-uri URI", "Set the base URI for the query")); puts(HELP_TEXT("R", "result-format NAME ", "Set the result format NAME (default: " DEFAULT_RESULT_FORMAT_NAME ")")); puts(" For variable bindings and boolean results:"); for(i = 0; 1; i++) { const raptor_syntax_description* desc; desc = rasqal_world_get_query_results_format_description(world, i); if(!desc) break; if(desc->flags & RASQAL_QUERY_RESULTS_FORMAT_FLAG_READER) { printf(" %-10s %s", desc->names[0], desc->label); if(!strcmp(desc->names[0], DEFAULT_RESULT_FORMAT_NAME)) puts(" (default)"); else putchar('\n'); } } puts(" For RDF graph results:"); for(i = 0; 1; i++) { const raptor_syntax_description *desc; desc = raptor_world_get_parser_description(raptor_world_ptr, i); if(!desc) break; printf(" %-15s%s", desc->names[0], desc->label); if(!strcmp(desc->names[0], DEFAULT_DATA_FORMAT_NAME_GRAPH)) puts(" (default)"); else putchar('\n'); } puts(HELP_TEXT("v", "version ", "Print the Rasqal version")); puts("\nReport bugs to http://bugs.librdf.org/"); rasqal_free_world(world); exit(0); } /* Compute query base URI from filename or passed in -Q QUERY-BASE-URI */ if(!query_base_uri_string) { query_base_uri_string = raptor_uri_filename_to_uri_string(query_filename); free_query_base_uri_string = 1; } query_base_uri = raptor_new_uri(raptor_world_ptr, query_base_uri_string); if(!query_base_uri) { fprintf(stderr, "%s: Failed to create URI for %s\n", program, query_base_uri_string); return(1); } /* Read query from file into a string */ query_string = rasqal_cmdline_read_file_string(world, query_filename, "query file", &query_len); if(!query_string) { rc = 1; goto tidy_setup; } /* Report information */ if(verbose) { fprintf(stderr, "%s: Reading query in language %s from file %s URI %s:\n", program, query_language, query_filename, raptor_uri_as_string(query_base_uri)); if(verbose > 1) fprintf(stderr, "%s\n", (const char*)query_string); fprintf(stderr, "%s: Reading results from file '%s'\n", program, result_filename); } /* Parse and prepare query */ rq = check_query_init_query(world, query_language, query_string, query_base_uri, data_graphs); rasqal_free_memory(query_string); if(!rq) { fprintf(stderr, "%s: Parsing query in %s failed\n", program, query_filename); goto tidy_query; } /* Query prepared OK - we now know the query details such as result type */ /* Read expected results */ if(1) { results_type = rasqal_query_get_result_type(rq); fprintf(stderr, "%s: Expecting result type %d\n", program, results_type); /* Read result file */ result_iostr = raptor_new_iostream_from_filename(raptor_world_ptr, result_filename); if(!result_iostr) { fprintf(stderr, "%s: result file '%s' open failed - %s\n", program, result_filename, strerror(errno)); rc = 1; goto tidy_setup; } switch(results_type) { case RASQAL_QUERY_RESULTS_BINDINGS: case RASQAL_QUERY_RESULTS_BOOLEAN: /* read results via rasqal query results format */ expected_results = rasqal_cmdline_read_results(world, raptor_world_ptr, results_type, result_iostr, result_filename, result_format_name); raptor_free_iostream(result_iostr); result_iostr = NULL; if(!expected_results) { fprintf(stderr, "%s: Failed to create query results\n", program); rc = 1; goto tidy_setup; } break; case RASQAL_QUERY_RESULTS_GRAPH: /* read results via raptor parser */ if(1) { const char* format_name = NULL; if(result_format_name) { if(!raptor_world_is_parser_name(raptor_world_ptr, result_format_name)) { fprintf(stderr, "%s: invalid parser name `%s' for `" HELP_ARG(R, result-format) "'\n\n", program, result_format_name); } else format_name = result_format_name; } if(!format_name) format_name = DEFAULT_RESULT_FORMAT_NAME; ds = rasqal_new_dataset(world); if(!ds) { fprintf(stderr, "%s: Failed to create dataset", program); rc = 1; goto tidy_setup; } if(rasqal_dataset_load_graph_iostream(ds, format_name, result_iostr, NULL)) { fprintf(stderr, "%s: Failed to load graph into dataset", program); rc = 1; goto tidy_setup; } raptor_free_iostream(result_iostr); result_iostr = NULL; /* FIXME * * The code at this point should do something with triples * in the dataset; save them for later to compare them to * the expected triples. that requires a triples compare * OR a true RDF graph compare. * * Deleting the dataset here frees the triples just loaded. */ rasqal_free_dataset(ds); ds = NULL; } break; case RASQAL_QUERY_RESULTS_SYNTAX: case RASQAL_QUERY_RESULTS_UNKNOWN: /* failure */ fprintf(stderr, "%s: Reading %s query results format is not supported", program, rasqal_query_results_type_label(results_type)); rc = 1; goto tidy_setup; } } /* save results for query execution so we can print and rewind */ rasqal_query_set_store_results(rq, 1); results = rasqal_query_execute(rq); if(results) { switch(results_type) { case RASQAL_QUERY_RESULTS_BINDINGS: fprintf(stderr, "%s: Expected bindings results:\n", program); rasqal_cmdline_print_bindings_results_simple(program, expected_results, stderr, 1, 0); fprintf(stderr, "%s: Actual bindings results:\n", program); rasqal_cmdline_print_bindings_results_simple(program, results, stderr, 1, 0); rasqal_query_results_rewind(expected_results); rasqal_query_results_rewind(results); /* FIXME: should NOT do this if results are expected to be ordered */ rasqal_query_results_sort(expected_results); rasqal_query_results_sort(results); if(1) { rasqal_results_compare* rrc; rrc = rasqal_new_results_compare(world, expected_results, "expected", results, "actual"); rasqal_results_compare_set_log_handler(rrc, world, check_query_log_handler); rc = !rasqal_results_compare_compare(rrc); rasqal_free_results_compare(rrc); rrc = NULL; } break; case RASQAL_QUERY_RESULTS_BOOLEAN: if(1) { int expected_boolean = rasqal_query_results_get_boolean(expected_results); int actual_boolean = rasqal_query_results_get_boolean(results); RASQAL_DEBUG2("Expected boolean result: %d\n", expected_boolean); RASQAL_DEBUG2("Actual boolean result: %d\n", actual_boolean); rc = (expected_boolean != actual_boolean); } break; case RASQAL_QUERY_RESULTS_GRAPH: case RASQAL_QUERY_RESULTS_SYNTAX: case RASQAL_QUERY_RESULTS_UNKNOWN: /* failure */ fprintf(stderr, "%s: Query result format %d cannot be tested.", program, results_type); rc = 1; goto tidy_setup; } } else rc = 1; if(verbose) { fprintf(stdout, "%s: Result: %s\n", program, rc ? "FAILURE" : "success"); } if(results) { rasqal_free_query_results(results); results = NULL; } tidy_query: if(rq) rasqal_free_query(rq); tidy_setup: if(expected_results) rasqal_free_query_results(expected_results); if(results) rasqal_free_query_results(results); if(result_iostr) raptor_free_iostream(result_iostr); if(ds) rasqal_free_dataset(ds); if(free_query_base_uri_string) raptor_free_memory(query_base_uri_string); if(query_base_uri) raptor_free_uri(query_base_uri); if(data_graphs) raptor_free_sequence(data_graphs); rasqal_free_world(world); return (rc); }