int main(int argc, char *argv[]) { char *password = fsp_argv_password(&argc, argv); static char *optstring = "hevf:PO:Ib:rs:d"; char *format = getenv("FORMAT"); char *kb_name = NULL, *query = NULL; int programatic = 0, help = 0; int c, opt_index = 0; int verbosity = 0; int opt_level = 3; int insert_mode = 0; int restricted = 0; int soft_limit = 0; int explain = 0; int default_graph = 0; char *base_uri = "local:"; raptor_world *rw = NULL; static struct option long_options[] = { { "help", 0, 0, 'h' }, { "version", 0, 0, 'V' }, { "verbose", 0, 0, 'v' }, { "explain", 0, 0, 'e' }, { "format", 1, 0, 'f' }, { "programatic", 0, 0, 'P' }, { "opt-level", 1, 0, 'O' }, { "insert", 0, 0, 'I' }, { "restricted", 0, 0, 'r' }, { "soft-limit", 1, 0, 's' }, { "default-graph", 0, 0, 'd' }, { "base", 1, 0, 'b' }, { 0, 0, 0, 0 } }; int help_return = 1; while ((c = getopt_long (argc, argv, optstring, long_options, &opt_index)) != -1) { if (c == 'f') { format = optarg; } else if (c == 'P') { programatic = TRUE; } else if (c == 'v') { verbosity++; } else if (c == 'O') { opt_level = atoi(optarg); } else if (c == 'I') { insert_mode = 1; } else if (c == 'r') { restricted = 1; } else if (c == 's') { soft_limit = atoi(optarg); } else if (c == 'd') { default_graph = 1; } else if (c == 'b') { base_uri = optarg; } else if (c == 'h') { help = 1; help_return = 0; } else if (c == 'e') { explain = 1; } else if (c == 'V') { printf("%s, built for 4store %s\n", argv[0], GIT_REV); exit(0); } else { help = 1; } } for (int k = optind; k < argc; ++k) { if (!kb_name) { kb_name = argv[k]; } else if (!query && !programatic) { query = argv[k]; } else { help = 1; } } if (help || !kb_name) { char *langs = ""; if (fs_query_have_laqrs()) { langs = "/LAQRS"; } fprintf(stdout, "%s revision %s\n", basename(argv[0]), GIT_REV); fprintf(stdout, "Usage: %s <kbname> [-f format] [-O opt-level] [-I] [-b uri] [query]\n", argv[0]); fprintf(stdout, " or: %s <kbname> -P\n", basename(argv[0])); fprintf(stdout, " query is a SPARQL%s query, remember to use" " shell quoting if necessary\n", langs); fprintf(stdout, " -f Output format one of, sparql, text, json, or testcase\n"); fprintf(stdout, " -O, --opt-level Set optimisation level, range 0-3\n"); fprintf(stdout, " -I, --insert Interpret CONSTRUCT statements as inserts\n"); fprintf(stdout, " -r, --restricted Enable query complexity restriction\n"); fprintf(stdout, " -s, --soft-limit Override default soft limit on search breadth\n"); fprintf(stdout, " -d, --default-graph Enable SPARQL default graph support\n"); fprintf(stdout, " -b, --base Set base URI for query\n"); fprintf(stdout, " -e, --explain Show explain results for execution plan\n"); exit(help_return); } if (programatic || query) { /* don't syslog interactive errors */ fsp_syslog_enable(); } double then = ftime(); /* if query does UPDATE or DELETE operations this needs a re-think */ fsp_link *link = fsp_open_link(kb_name, password, FS_OPEN_HINT_RO); double now = ftime(); show_timing = (getenv("SHOW_TIMING") != NULL) | (verbosity > 1); if (show_timing) { printf("Link open time: %f\n", now-then); } if (!link) { fs_error(LOG_ERR, "couldn't connect to “%s”", kb_name); return 2; } const int segments = fsp_link_segments(link); fs_query_timing timing[segments]; memset(timing, 0, sizeof(fs_query_timing) * segments); if (show_timing) { for (int seg = 0; seg < segments; seg++) { fsp_get_query_times(link, seg, timing+seg); } } if (fsp_no_op(link, 0)) { fs_error(LOG_ERR, "NO-OP failed for “%s”", kb_name); return 2; } rw = raptor_new_world(); fs_hash_init(fsp_hash_type(link)); raptor_uri *bu = raptor_new_uri(rw, (unsigned char *)base_uri); unsigned int flags = FS_QUERY_CONSOLE_OUTPUT; /* signal that we're using the */ /* console, allows better explain functionality */ flags |= insert_mode ? FS_RESULT_FLAG_CONSTRUCT_AS_INSERT : 0; flags |= restricted ? FS_QUERY_RESTRICTED : 0; flags |= default_graph ? FS_QUERY_DEFAULT_GRAPH : 0; if (programatic) { programatic_io(link, bu, "sparql", format, timing, verbosity, opt_level, FS_RESULT_FLAG_HEADERS | flags, soft_limit, rw); } else if (!query) { if (!format) format = "text"; interactive(link, bu, format, verbosity, opt_level, insert_mode ? FS_RESULT_FLAG_CONSTRUCT_AS_INSERT : flags, soft_limit, rw); } int ret = 0; fs_query_state *qs = fs_query_init(link, NULL, NULL); qs->verbosity = verbosity; fs_query *qr = fs_query_execute(qs, link, bu, query, flags, opt_level, soft_limit, explain); if (fs_query_errors(qr)) { ret = 1; } fs_query_results_output(qr, format, 0, stdout); fs_query_free(qr); if (show_timing) { printf("seg bind\t(secs)\t\tprice\t(secs)\t\tresolve\t(secs)\t\twait (secs)\n"); long long *tics = fsp_profile_write(link); for (int seg = 0; seg < segments; seg++) { fs_query_timing newtimes; fsp_get_query_times(link, seg, &newtimes); printf("%2d: %4d\t%f\t%4d\t%f\t%4d\t%f\t%f\n", seg, newtimes.bind_count - timing[seg].bind_count, newtimes.bind - timing[seg].bind, newtimes.price_count - timing[seg].price_count, newtimes.price - timing[seg].price, newtimes.resolve_count - timing[seg].resolve_count, newtimes.resolve - timing[seg].resolve, tics[seg] * 0.001); } } raptor_free_uri(bu); raptor_free_world(rw); fs_query_cache_flush(qs, verbosity); fs_query_fini(qs); fsp_close_link(link); return ret; }
int main(int argc, char *argv[]) { char *password = fsp_argv_password(&argc, argv); int flags = 0, many = 0, all = 0; int seg = 0; /* deliberately using signed type */ fs_rid_vector *mrids= NULL, *srids= NULL, *prids= NULL, *orids= NULL; fs_rid_vector **result = NULL; if (argc < 7) { fprintf(stderr, "%s revision %s\n", argv[0], FS_FRONTEND_VER); fprintf(stderr, "Usage: %s <kbname> { many | all | seg# } <flags>\n", argv[0]); fprintf(stderr, " mrid-file srid-file prid-file orid-file [offset limit]\n"); fprintf(stderr, "For flags use FS_BIND_... symbols or a numeric value\n"); fprintf(stderr, "RID files are one RID per line\n"); exit(1); } char *kbname = argv[1]; if (!strcasecmp(argv[2], "many")) { many = 1; } else if (!strcasecmp(argv[2], "all")) { all = 1; } else { seg = atoi(argv[2]); } int param = 3; flags = strtol(argv[param], NULL, 0); if (flags == 0) { /* symbolic flags, hopefully */ while (param < argc) { const int len = sizeof(flag_name) / sizeof(char *); int k; for (k = 0; k < len; ++k) { if (!strcmp(flag_name[k], argv[param])) { flags |= flag_value[k]; break; } } if (k == len) break; param ++; } } else { param ++; /* done with the numeric flags then */ } if (argc < param + 4) { fprintf(stderr, "Wrong number of arguments\n"); exit(1); } mrids = rid_file(argv[param++]); srids = rid_file(argv[param++]); prids = rid_file(argv[param++]); orids = rid_file(argv[param++]); int limit, offset; if (argc == param ) { /* defaults */ limit = -1; offset = -1; } else if (argc > param + 2) { fprintf(stderr, "Wrong number of arguments\n"); exit(1); } else if (argc < param + 2) { fprintf(stderr, "Wrong number of arguments\n"); exit(1); } else { offset = atoi(argv[param]); limit = atoi(argv[param + 1]); } fsp_link *link = fsp_open_link(kbname, password, FS_OPEN_HINT_RO); if (!link) { fs_error (LOG_ERR, "couldn't connect to “%s”", argv[1]); exit(2); } segments = fsp_link_segments(link); if (seg < 0 || seg > segments) { fs_error (LOG_ERR, "Segment %d out of range (0-%u)", seg, segments); exit(1); } double then = fs_time(); int ans = 0; if (all) { ans = fsp_bind_limit_all(link, flags, mrids, srids, prids, orids, &result, offset, limit); } else if (many) { ans = fsp_bind_limit_many(link, flags, mrids, srids, prids, orids, &result, offset, limit); } else { ans = fsp_bind_limit(link, seg, flags, mrids, srids, prids, orids, &result, offset, limit); } double time_binding = fs_time() - then; if (ans != 0) exit(1); /* print results */ int cols = 0; for (int k = 0; k < 4; ++k) { if (flags & (1 << k)) cols++; } if (!result) { printf("NO MATCH found.\n"); } else if (cols == 0) { printf("MATCH found.\n"); } else if (result[0]) { int length = result[0]->length; if (flags & FS_BIND_MODEL) printf("-----Model------ "); if (flags & FS_BIND_SUBJECT) printf("----Subject----- "); if (flags & FS_BIND_PREDICATE) printf("----Predicate--- "); if (flags & FS_BIND_OBJECT) printf("-----Object-----"); putchar('\n'); for (int k = 0; k < length; ++k) { for (int c = 0; c < cols; ++c) { printf("%016llX ", result[c]->data[k]); } putchar('\n'); } } fprintf(stderr, "bind took %f seconds on client\n", time_binding); fs_query_timing times; if (all || many) { fprintf(stderr, "binding on all or many segments, times in seconds...\n"); for (int s = 0; s < segments; ++s) { fsp_get_query_times(link, s, ×); if (times.bind > 0.0f) { fprintf(stderr, "%d: %f\n", s, times.bind); } } fputc('\n', stderr); } else { fsp_get_query_times(link, seg, ×); fprintf(stderr, "binding segment %d took %f seconds\n", seg, times.bind); } fsp_close_link(link); }
static void programatic_io(fsp_link *link, raptor_uri *bu, const char *query_lang, const char *result_format, fs_query_timing *timing, int verbosity, int opt_level, unsigned int result_flags, int soft_limit, raptor_world *rw) { char query[MAX_Q_SIZE]; char *pos; char *newl; const int segments = fsp_link_segments(link); fs_query_state *qs = fs_query_init(link, NULL, NULL); qs->verbosity = verbosity; do { pos = query; *query = '\0'; /* assemble query string */ do { newl = fgets(pos, query + MAX_Q_SIZE - pos - 1, stdin); if (newl) { pos += strlen(newl); } } while (newl && strcmp(newl, "#EOQ\n") && strcmp(newl, "#END\n")); /* process query string */ if (*query && strcmp(query, "#EOQ\n") && strcmp(query, "#END\n")) { if (show_timing) { printf("Q: %s\n", query); } fs_query *tq = fs_query_execute(qs, link, bu, query, result_flags, opt_level, soft_limit, 0); fs_query_results_output(tq, result_format, 0, stdout); if (show_timing) { printf("# time: %f s\n", fs_time() - fs_query_start_time(tq)); printf("seg bind\t(secs)\t\tprice\t(secs)\t\tresolve\t(secs)\t\twait (secs)\n"); long long *tics = fsp_profile_write(link); fs_query_timing total_time = {0, 0, 0, 0, 0, 0}; for (int seg = 0; seg < segments; seg++) { fs_query_timing newtimes; fsp_get_query_times(link, seg, &newtimes); printf("%2d: %4d\t%f\t%4d\t%f\t%4d\t%f\t%f\n", seg, newtimes.bind_count - timing[seg].bind_count, newtimes.bind - timing[seg].bind, newtimes.price_count - timing[seg].price_count, newtimes.price - timing[seg].price, newtimes.resolve_count - timing[seg].resolve_count, newtimes.resolve - timing[seg].resolve, tics[seg] * 0.001); total_time.bind_count += newtimes.bind_count - timing[seg].bind_count; total_time.bind += newtimes.bind- timing[seg].bind; total_time.price_count += newtimes.price_count - timing[seg].price_count; total_time.price += newtimes.price - timing[seg].price; total_time.resolve_count += newtimes.resolve_count - timing[seg].resolve_count; total_time.resolve += newtimes.resolve - timing[seg].resolve; } printf("TT: %4d\t%f\t%4d\t%f\t%4d\t%f\n", total_time.bind_count, total_time.bind, total_time.price_count, total_time.price, total_time.resolve_count, total_time.resolve); } fs_query_free(tq); if (result_format && !strcmp(result_format, "sparql")) { printf("<!-- EOR -->\n"); } else { printf("#EOR\n"); } fflush(stdout); } } while (newl && strcmp(newl, "#END\n")); raptor_free_uri(bu); fsp_close_link(link); raptor_free_world(rw); fs_query_cache_flush(qs, verbosity); fs_query_fini(qs); exit(0); }