static int insert_rasqal_triple(struct update_context *uc, rasqal_triple *triple, int row) { fs_rid quad_buf[1][4]; fs_resource res; if (triple->origin) { fs_resource_from_rasqal_literal(uc, triple->origin, &res, row); quad_buf[0][0] = fs_hash_rasqal_literal(uc, triple->origin, row); } else if (uc->op->graph_uri) { res.lex = (char *)raptor_uri_as_string(uc->op->graph_uri); res.attr = FS_RID_NULL; quad_buf[0][0] = fs_hash_uri((char *)raptor_uri_as_string(uc->op->graph_uri)); } else { quad_buf[0][0] = fs_c.default_graph; res.lex = FS_DEFAULT_GRAPH; res.attr = FS_RID_NULL; } if (quad_buf[0][0] == fs_c.system_config) fsp_reload_acl_system(uc->link); if (!FS_IS_URI(quad_buf[0][0])) { return 1; } quad_buf[0][1] = fs_hash_rasqal_literal(uc, triple->subject, row); if (FS_IS_LITERAL(quad_buf[0][1])) { return 1; } quad_buf[0][2] = fs_hash_rasqal_literal(uc, triple->predicate, row); if (!FS_IS_URI(quad_buf[0][2])) { return 1; } quad_buf[0][3] = fs_hash_rasqal_literal(uc, triple->object, row); res.rid = quad_buf[0][0]; if (res.lex) fsp_res_import(uc->link, FS_RID_SEGMENT(quad_buf[0][0], uc->segments), 1, &res); res.rid = quad_buf[0][1]; fs_resource_from_rasqal_literal(uc, triple->subject, &res, 0); if (res.lex) fsp_res_import(uc->link, FS_RID_SEGMENT(quad_buf[0][1], uc->segments), 1, &res); res.rid = quad_buf[0][2]; fs_resource_from_rasqal_literal(uc, triple->predicate, &res, 0); if (res.lex) fsp_res_import(uc->link, FS_RID_SEGMENT(quad_buf[0][2], uc->segments), 1, &res); res.rid = quad_buf[0][3]; fs_resource_from_rasqal_literal(uc, triple->object, &res, 0); if (res.lex) fsp_res_import(uc->link, FS_RID_SEGMENT(quad_buf[0][3], uc->segments), 1, &res); fsp_quad_import(uc->link, FS_RID_SEGMENT(quad_buf[0][1], uc->segments), FS_BIND_BY_SUBJECT, 1, quad_buf); //printf("I %016llx %016llx %016llx %016llx\n", quad_buf[0][0], quad_buf[0][1], quad_buf[0][2], quad_buf[0][3]); return 0; }
int fs_import_stream_finish(fsp_link *link, int *count, int *errors) { raptor_parse_chunk(parse_data.parser, NULL, 0, 1); /* finish */ raptor_free_parser(parse_data.parser); raptor_free_uri(parse_data.muri); g_free(parse_data.model); const int segments = fsp_link_segments(link); *count += process_quads(&parse_data); close(parse_data.quad_fd); unlink(parse_data.quad_fn); free(parse_data.quad_fn); parse_data.quad_fd = 0xdeadbeef; parse_data.quad_fn = NULL; /* make sure buffers are flushed */ for (int seg = 0; seg < segments; seg++) { if (res_pos[seg] > 0 && fsp_res_import(link, seg, res_pos[seg], res_buffer[seg])) { fs_error(LOG_ERR, "resource import failed"); return 1; } } if (fsp_res_import_commit_all(link)) { fs_error(LOG_ERR, "resource commit failed"); return 2; } for (int seg = 0; seg < segments; seg++) { for (int i=0; i<res_pos[seg]; i++) { if (res_buffer[seg][i].lex != lex_tmp[seg][i]) { free(res_buffer[seg][i].lex); } } res_pos[seg] = 0; } if (fsp_quad_import_commit_all(link, FS_BIND_BY_SUBJECT)) { fs_error(LOG_ERR, "quad commit failed"); return 3; } for (int i=0; i<segments; i++) { for (int j=0; j<RES_BUF_SIZE; j++) { free(lex_tmp[i][j]); lex_tmp[i][j] = NULL; } } *errors = parse_data.count_err; return 0; }
int fs_import_commit(fsp_link *link, int verbosity, int dryrun, int has_o_index, FILE *msg, int *count) { const int segments = fsp_link_segments(link); *count += process_quads(&parse_data); close(parse_data.quad_fd); unlink(parse_data.quad_fn); free(parse_data.quad_fn); parse_data.quad_fd = 0xdeadbeef; parse_data.quad_fn = NULL; /* make sure buffers are flushed */ for (int seg = 0; seg < segments; seg++) { if (!(dryrun & FS_DRYRUN_RESOURCES) && res_pos[seg] > 0 && fsp_res_import(link, seg, res_pos[seg], res_buffer[seg])) { fs_error(LOG_ERR, "resource import failed"); return 1; } } if (!(dryrun & FS_DRYRUN_RESOURCES) && fsp_res_import_commit_all(link)) { fs_error(LOG_ERR, "resource commit failed"); return 2; } for (int seg = 0; seg < segments; seg++) { for (int i=0; i<res_pos[seg]; i++) { if (res_buffer[seg][i].lex != lex_tmp[seg][i]) { free(res_buffer[seg][i].lex); } } res_pos[seg] = 0; } if (!(dryrun & FS_DRYRUN_QUADS) && fsp_quad_import_commit_all(link, FS_BIND_BY_SUBJECT)) { fs_error(LOG_ERR, "quad commit failed"); return 3; } for (int i=0; i<segments; i++) { for (int j=0; j<RES_BUF_SIZE; j++) { free(lex_tmp[i][j]); lex_tmp[i][j] = NULL; } } inited = 0; return 0; }
static void flush_resources(xmlctxt *ctxt) { for (int s = 0; s < ctxt->segments; ++s) { if (res_count[s] > 0) { fsp_res_import(ctxt->link, s, res_count[s], resources[s]); for (int k = 0; k < res_count[s]; ++k) { g_free(resources[s][k].lex); } res_count[s] = 0; } if (fsp_res_import_commit(ctxt->link, s)) { fs_error(LOG_ERR, "error during commit of resources"); } } }
static void insert_resource(xmlctxt *ctxt, fs_rid rid, fs_rid attr, char* lex) { /* TODO a cache might speed things up */ int segment = FS_RID_SEGMENT(rid, ctxt->segments); resources[segment][res_count[segment]].rid = rid; resources[segment][res_count[segment]].attr = attr; resources[segment][res_count[segment]].lex = g_strdup(lex); if (++res_count[segment] == RES_BUF_SIZE) { fsp_res_import(ctxt->link, segment, RES_BUF_SIZE, resources[segment]); for (int k = 0; k < RES_BUF_SIZE; ++k) { g_free(resources[segment][k].lex); } res_count[segment] = 0; } }
void fs_resource_from_rasqal_literal(struct update_context *uctxt, rasqal_literal *l, fs_resource *res, int row) { if (!l) { res->lex = "(null)"; res->attr = FS_RID_NULL; return; } rasqal_literal_type type = l->type; if (type == RASQAL_LITERAL_VARIABLE) { /* right now you can't introduce new literals in INSERT, so it doesn't * matter */ res->lex = NULL; res->attr = FS_RID_GONE; } else if (type == RASQAL_LITERAL_URI) { res->lex = (char *)raptor_uri_as_string(l->value.uri); res->attr = FS_RID_NULL; } else { res->lex = (char *)l->string; res->attr = 0; fs_resource ares; ares.lex = NULL; if (l->datatype) { res->attr = fs_hash_uri((char *)raptor_uri_as_string(l->datatype)); ares.rid = res->attr; ares.lex = (char *)raptor_uri_as_string(l->datatype); ares.attr = FS_RID_NULL; } else if (l->language) { res->attr = fs_hash_literal(l->language, 0); ares.rid = res->attr; ares.lex = (char *)l->language; ares.attr = 0; } /* insert attribute resource if there is one */ if (ares.lex) { fsp_res_import(uctxt->link, FS_RID_SEGMENT(ares.rid, uctxt->segments), 1, &ares); } } }
static int buffer_res(fsp_link *link, const int segments, fs_rid r, char *lex, fs_rid attr, int dryrun) { int seg = FS_RID_SEGMENT(r, segments); if (FS_IS_BNODE(r)) { return 1; } if (nodecache[r & CACHE_MASK] == r) { return 1; } if (!lex) { return 1; } nodecache[r & CACHE_MASK] = r; res_buffer[seg][res_pos[seg]].rid = r; res_buffer[seg][res_pos[seg]].attr = attr; if (strlen(lex) < RES_BUF_SIZE) { strcpy(lex_tmp[seg][res_pos[seg]], lex); res_buffer[seg][res_pos[seg]].lex = lex_tmp[seg][res_pos[seg]]; } else { res_buffer[seg][res_pos[seg]].lex = g_strdup(lex); } if (++res_pos[seg] == RES_BUF_SIZE) { if (!(dryrun & FS_DRYRUN_RESOURCES) && fsp_res_import(link, seg, res_pos[seg], res_buffer[seg])) { fs_error(LOG_ERR, "resource import failed"); return 1; } for (int i=0; i<res_pos[seg]; i++) { if (res_buffer[seg][i].lex != lex_tmp[seg][i]) { free(res_buffer[seg][i].lex); res_buffer[seg][i].lex = NULL; } } res_pos[seg] = 0; } return 0; }
int fs_copy(struct update_context *uc, char *from, char *to) { fs_rid_vector *mvec = fs_rid_vector_new(0); fs_rid_vector *empty = fs_rid_vector_new(0); fs_rid fromrid, torid; if (from) { fromrid = fs_hash_uri(from); } else { from = FS_DEFAULT_GRAPH; fromrid = fs_c.default_graph; } if (to) { torid = fs_hash_uri(to); } else { to = FS_DEFAULT_GRAPH; torid = fs_c.default_graph; } if (fromrid == torid) { /*don't need to do anything */ fs_rid_vector_free(mvec); fs_rid_vector_free(empty); add_message(uc, g_strdup_printf("Copied <%s> to <%s>", from, to), 1); add_message(uc, "0 triples added, 0 removed", 0); return 0; } fs_rid_vector_append(mvec, fromrid); /* search for all the triples in from */ fs_rid_vector **results; fs_rid_vector *slot[4] = { mvec, empty, empty, empty }; /* see if there's any data in <from> */ fs_bind_cache_wrapper(uc->qs, NULL, 1, FS_BIND_BY_SUBJECT | FS_BIND_SUBJECT, slot, &results, -1, 1); if (!results || results[0]->length == 0) { if (results) { fs_rid_vector_free(results[0]); free(results); } fs_rid_vector_free(mvec); fs_rid_vector_free(empty); add_message(uc, g_strdup_printf("<%s> is empty, not copying", from), 1); return 1; } fs_rid_vector_free(results[0]); free(results); /* get the contents of <from> */ fs_bind_cache_wrapper(uc->qs, NULL, 1, FS_BIND_BY_SUBJECT | FS_BIND_SUBJECT | FS_BIND_PREDICATE | FS_BIND_OBJECT, slot, &results, -1, -1); /* map old bnodes to new ones */ map_bnodes(uc, results[0]); map_bnodes(uc, results[1]); map_bnodes(uc, results[2]); /* delete <to> */ mvec->data[0] = torid; if (fsp_delete_model_all(uc->link, mvec)) { fs_rid_vector_free(mvec); fs_rid_vector_free(empty); add_message(uc, g_strdup_printf("Error while trying to delete %s", to), 1); return 1; } fs_rid_vector_free(mvec); fs_rid_vector_free(empty); /* insert <to> */ fs_resource tores; tores.lex = to; tores.attr= FS_RID_NULL; tores.rid = torid; fsp_res_import(uc->link, FS_RID_SEGMENT(torid, uc->segments), 1, &tores); insert_triples(uc, torid, results[0], results[1], results[2]); add_message(uc, g_strdup_printf("Copied <%s> to <%s>", from, to), 1); add_message(uc, g_strdup_printf("%d triples added, ?? removed", results[0]->length), 1); for (int i=0; i<3; i++) { fs_rid_vector_free(results[i]); } free(results); return 0; }
int fs_add(struct update_context *uc, char *from, char *to) { fs_rid_vector *mvec = fs_rid_vector_new(0); fs_rid_vector *empty = fs_rid_vector_new(0); fs_rid fromrid, torid; if (from) { fromrid = fs_hash_uri(from); } else { from = FS_DEFAULT_GRAPH; fromrid = fs_c.default_graph; } if (to) { torid = fs_hash_uri(to); } else { to = FS_DEFAULT_GRAPH; torid = fs_c.default_graph; } if (fromrid == torid) { /*don't need to do anything */ add_message(uc, g_strdup_printf("Added <%s> to <%s>", from, to), 1); add_message(uc, "0 triples added, 0 removed", 0); return 0; } fs_rid_vector_append(mvec, fromrid); int errors = 0; /* search for all the triples in from */ fs_rid_vector **results; fs_rid_vector *slot[4] = { mvec, empty, empty, empty }; fs_bind_cache_wrapper(uc->qs, NULL, 1, FS_BIND_BY_SUBJECT | FS_BIND_SUBJECT | FS_BIND_PREDICATE | FS_BIND_OBJECT, slot, &results, -1, -1); fs_rid_vector_free(mvec); fs_rid_vector_free(empty); if (!results || results[0]->length == 0) { /* there's nothing to add */ if (results) { for (int i=0; i<3; i++) { fs_rid_vector_free(results[i]); } free(results); } add_message(uc, g_strdup_printf("Added <%s> to <%s>", from, to), 1); add_message(uc, "0 triples added, 0 removed", 0); return 0; } map_bnodes(uc, results[0]); map_bnodes(uc, results[1]); map_bnodes(uc, results[2]); fs_resource tores; tores.lex = to; tores.attr= FS_RID_NULL; tores.rid = torid; fsp_res_import(uc->link, FS_RID_SEGMENT(torid, uc->segments), 1, &tores); insert_triples(uc, torid, results[0], results[1], results[2]); add_message(uc, g_strdup_printf("Added <%s> to <%s>", from, to), 1); add_message(uc, g_strdup_printf("%d triples added, 0 removed", results[0]->length), 1); for (int i=0; i<3; i++) { fs_rid_vector_free(results[i]); } free(results); return errors; }