|
@@ -1,7 +1,7 @@
|
|
|
#include "desc.h"
|
|
|
|
|
|
LSUP_rc
|
|
|
-LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
+LSR_desc_new_multi (LSUP_Graph *const *data, LSR_Desc **rsrc_p)
|
|
|
{
|
|
|
LSUP_rc rc = LSUP_OK;
|
|
|
|
|
@@ -27,7 +27,7 @@ LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
|
|
|
|
|
|
size_t ct = 0;
|
|
|
- while (data[ct++]);
|
|
|
+ while (data[ct]) ct++;
|
|
|
rsrc->user_data = calloc (sizeof (*rsrc->user_data), ct + 1);
|
|
|
if (UNLIKELY (! rsrc->user_data)) return LSUP_MEM_ERR;
|
|
|
|
|
@@ -35,9 +35,9 @@ LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < ct; i++) {
|
|
|
- LSUP_Term *gr_uri = LSUP_graph_uri (rsrc->user_data[i]);
|
|
|
+ LSUP_Term *gr_uri = LSUP_term_copy (LSUP_graph_uri (data[i]));
|
|
|
|
|
|
- LSUP_Term *rel_uri = LSUP_iriref_relative (gr_uri, rsrc_uri);
|
|
|
+ LSUP_Term *rel_uri = LSUP_iriref_relative (rsrc_uri, gr_uri);
|
|
|
if (strstr (rel_uri->data, "#__") == rel_uri->data) {
|
|
|
log_error ("Fragment URI cannot start with double underscore.");
|
|
|
rc = LSUP_VALUE_ERR;
|
|
@@ -53,15 +53,15 @@ LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
|
|
|
while (LSUP_graph_iter_next (lu_it, src_spo) == LSUP_OK) {
|
|
|
dest_s = LSUP_IS_IRI (src_spo->s) ?
|
|
|
- LSUP_iriref_relative (src_spo->s, rsrc_uri) : src_spo->s;
|
|
|
- dest_p = src_spo->p;
|
|
|
+ LSUP_iriref_relative (rsrc_uri, src_spo->s) : src_spo->s;
|
|
|
+ dest_p = LSUP_term_copy (src_spo->p);
|
|
|
dest_o = LSUP_IS_IRI (src_spo->s) ?
|
|
|
- LSUP_iriref_relative (src_spo->s, rsrc_uri) : src_spo->s;
|
|
|
+ LSUP_iriref_relative (rsrc_uri, src_spo->s) : src_spo->s;
|
|
|
LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
|
|
|
|
|
|
|
|
|
LSR_TermMap *tmp;
|
|
|
- LSUP_Key pk = LSUP_term_hash (src_spo->p);
|
|
|
+ LSUP_Key pk = LSUP_term_hash (dest_spo->p);
|
|
|
HASH_FIND (hh, LSR_managed_preds, &pk, sizeof (pk), tmp);
|
|
|
|
|
|
if (tmp) {
|
|
@@ -76,19 +76,26 @@ LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
* If the subject or object is a resource, check if it exists; if
|
|
|
* it does, add triple to user_data; if not, return an error.
|
|
|
*/
|
|
|
- char *id_tmp;
|
|
|
+ uuid_t id_tmp;
|
|
|
+ LSUP_rc tmp_rc;
|
|
|
if (LSR_IS_RSRC_IRI (dest_s)) {
|
|
|
- id_tmp = dest_s->data + strlen (LSR_RSRC_PFX);
|
|
|
- if (LSR_desc_get (id_tmp, NULL) != LSUP_OK) {
|
|
|
- log_error ("Referenced subject does not exist: %s", id_tmp);
|
|
|
+ uuid_parse (dest_s->data + strlen (LSR_RSRC_PFX), id_tmp);
|
|
|
+ tmp_rc = LSR_desc_get (id_tmp, NULL);
|
|
|
+ if (tmp_rc != LSUP_OK) {
|
|
|
+ log_error (
|
|
|
+ "Referenced subject does not exist: %s",
|
|
|
+ dest_s->data + strlen (LSR_RSRC_PFX));
|
|
|
rc = LSUP_VALUE_ERR;
|
|
|
goto finally;
|
|
|
}
|
|
|
}
|
|
|
if (LSR_IS_RSRC_IRI (dest_o)) {
|
|
|
- id_tmp = dest_o->data + strlen (LSR_RSRC_PFX);
|
|
|
- if (LSR_desc_get (id_tmp, NULL) != LSUP_OK) {
|
|
|
- log_error ("Referenced object does not exist: %s", id_tmp);
|
|
|
+ uuid_parse (dest_o->data + strlen (LSR_RSRC_PFX), id_tmp);
|
|
|
+ tmp_rc = LSR_desc_get (id_tmp, NULL);
|
|
|
+ if (tmp_rc != LSUP_OK) {
|
|
|
+ log_error (
|
|
|
+ "Referenced object does not exist: %s",
|
|
|
+ dest_o->data + strlen (LSR_RSRC_PFX));
|
|
|
rc = LSUP_VALUE_ERR;
|
|
|
goto finally;
|
|
|
}
|
|
@@ -97,8 +104,8 @@ LSR_desc_new_multi (const LSUP_Graph *data[], LSR_Desc **rsrc_p)
|
|
|
|
|
|
if (
|
|
|
LSUP_term_equals (
|
|
|
- gr_uri, LSUP_iriref_absolute (src_spo->p, gr_uri))
|
|
|
- && LSUP_term_equals (rdf_t, src_spo->p)
|
|
|
+ gr_uri, LSUP_iriref_absolute (rsrc_uri, dest_spo->p))
|
|
|
+ && LSUP_term_equals (rdf_t, dest_spo->p)
|
|
|
) {
|
|
|
|
|
|
|
|
@@ -125,7 +132,6 @@ loop_end:
|
|
|
LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
|
|
|
LSUP_graph_add_iter (admin_add_it, dest_spo);
|
|
|
LSUP_term_free (dest_o);
|
|
|
-
|
|
|
LSUP_term_free (dest_p);
|
|
|
|
|
|
|
|
@@ -134,7 +140,6 @@ loop_end:
|
|
|
LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
|
|
|
LSUP_graph_add_iter (admin_add_it, dest_spo);
|
|
|
LSUP_term_free (dest_p);
|
|
|
- LSUP_term_free (dest_o);
|
|
|
|
|
|
LSUP_graph_iter_free (lu_it);
|
|
|
LSUP_graph_add_done (add_it);
|
|
@@ -159,12 +164,12 @@ loop_end:
|
|
|
|
|
|
dest_o = LSUP_iriref_new ("lsup:Resource", LSUP_DEF_NSM);
|
|
|
LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
|
|
|
- LSUP_graph_add_iter (add_it, admin_spo);
|
|
|
+ LSUP_graph_add_iter (admin_add_it, admin_spo);
|
|
|
LSUP_term_free (dest_o);
|
|
|
|
|
|
dest_o = LSUP_iriref_new ("lsup:DescriptiveResource", LSUP_DEF_NSM);
|
|
|
LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
|
|
|
- LSUP_graph_add_iter (add_it, admin_spo);
|
|
|
+ LSUP_graph_add_iter (admin_add_it, admin_spo);
|
|
|
LSUP_term_free (dest_o);
|
|
|
|
|
|
|
|
@@ -185,9 +190,11 @@ loop_end:
|
|
|
LSUP_graph_add_iter (admin_add_it, admin_spo);
|
|
|
LSUP_term_free (dest_p);
|
|
|
LSUP_term_free (dest_o);
|
|
|
+ LSUP_graph_add_done (admin_add_it);
|
|
|
|
|
|
|
|
|
admin_add_it = LSUP_graph_add_init (rsrc->main_data);
|
|
|
+ LSUP_term_free (dest_s);
|
|
|
dest_s = gr_uri;
|
|
|
dest_p = rdf_t;
|
|
|
|
|
@@ -206,9 +213,7 @@ loop_end:
|
|
|
dest_o = rsrc_uri;
|
|
|
LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
|
|
|
LSUP_graph_add_iter (admin_add_it, dest_spo);
|
|
|
-
|
|
|
LSUP_term_free (dest_p);
|
|
|
- LSUP_term_free (dest_o);
|
|
|
|
|
|
LSUP_graph_add_done (admin_add_it);
|
|
|
admin_add_it = NULL;
|
|
@@ -238,6 +243,55 @@ fail:
|
|
|
}
|
|
|
|
|
|
|
|
|
+LSUP_rc
|
|
|
+LSR_desc_get (const uuid_t id, LSR_Desc **rsrc)
|
|
|
+{
|
|
|
+ LSUP_rc rc = LSUP_OK;
|
|
|
+
|
|
|
+ LSUP_Term *default_gr_uri = LSUP_term_new_from_buffer (
|
|
|
+ LSUP_default_env->default_ctx);
|
|
|
+ LSUP_Graph *main_gr = LSUP_graph_new (default_gr_uri, LSUP_STORE_MDB);
|
|
|
+
|
|
|
+ LSUP_Term
|
|
|
+ *s = LSR_id_to_urn (id, NULL),
|
|
|
+ *p = LSUP_iriref_new ("rdf:type", LSUP_DEF_NSM),
|
|
|
+ *o = LSUP_iriref_new ("lsup:Resource", LSUP_DEF_NSM);
|
|
|
+
|
|
|
+ LSUP_Triple *spo = LSUP_triple_new (s, p, o);
|
|
|
+
|
|
|
+ if (!LSUP_graph_contains (main_gr, spo)) rc = LSUP_NORESULT;
|
|
|
+ LSUP_term_free (p);
|
|
|
+ LSUP_term_free (o);
|
|
|
+
|
|
|
+ if (rsrc && rc == LSUP_OK) {
|
|
|
+ p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_DEF_NSM);
|
|
|
+ size_t ct = 0, i = 0;
|
|
|
+
|
|
|
+
|
|
|
+ LSUP_GraphIterator *it = LSUP_graph_lookup (main_gr, NULL, p, s, &ct);
|
|
|
+ LSUP_Graph **data = calloc (sizeof (*data), ct + 1);
|
|
|
+ while (LSUP_graph_iter_next (it, spo)) {
|
|
|
+ data[i] = LSUP_graph_new (spo->s, LSUP_STORE_MDB);
|
|
|
+ if (! data[i++]) break;
|
|
|
+ }
|
|
|
+ LSUP_graph_iter_free (it);
|
|
|
+
|
|
|
+ rc = LSR_desc_new_multi (data, rsrc);
|
|
|
+
|
|
|
+ i = 0;
|
|
|
+ while (i < ct) LSUP_graph_free (data[i++]);
|
|
|
+ free (data);
|
|
|
+
|
|
|
+ LSUP_term_free (s);
|
|
|
+ LSUP_term_free (p);
|
|
|
+ }
|
|
|
+
|
|
|
+ LSUP_graph_free (main_gr);
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void LSR_desc_free (LSR_Desc *rsrc)
|
|
|
{
|
|
|
size_t i = 0;
|