Browse Source

WIP Adapt to new lsup_rdf API.

Stefano Cossu 1 year ago
parent
commit
2d0e2fc664
4 changed files with 43 additions and 54 deletions
  1. 3 3
      include/core.h
  2. 5 5
      include/desc.h
  3. 7 19
      src/core.c
  4. 28 27
      src/desc.c

+ 3 - 3
include/core.h

@@ -6,8 +6,6 @@
 #ifndef _LSR_CORE_H
 #define _LSR_CORE_H
 
-// TODO Include hashmap.c in lsup_rdf and remove this header dep.
-#include "hashmap.h"
 
 #include "lsup_rdf.h"
 
@@ -23,6 +21,8 @@
 #define LSR_TYPE_DESC "DESC_R"
 /// Label for data resource type.
 #define LSR_TYPE_DATA "DATA_R"
+/// Default graph back end.
+#define LSR_DEFAULT_BACKEND LSUP_STORE_MDB
 
 /// Determine if an IRI is an LSR resource.
 #define LSR_IS_RSRC_IRI(term) \
@@ -105,7 +105,7 @@ inline LSUP_Term *LSR_id_to_urn (const uuid_t id, const char *frag)
         sprintf (urn_str, "%s%s", LSR_RSRC_PFX, id_str);
     }
 
-    LSUP_Term *urn = LSUP_iriref_new (urn_str, LSUP_default_env->nsm);
+    LSUP_Term *urn = LSUP_iriref_new (urn_str, LSUP_default_nsm);
     free (urn_str);
 
     return urn;

+ 5 - 5
include/desc.h

@@ -20,7 +20,7 @@
 /** @brief DESC-R structure.
  *
  * A Descriptive Resource (DESC-R) is made up of several RDF named graphs.
- * Each graph has a function defined by the framework and can be managed by
+ * Each graph has a function defined by the framework and may be managed by
  * the framework or by the user.
  *
  * the URI of each graph is derived from the ID of the resource. This is just
@@ -29,10 +29,10 @@
  * they are portable and, in a Linked Data server, can be easily replaced with
  * absolute URLs based on the server root.
  *
- * The `user_data` handle is a {NULL}-terminated array of user-defined graphs.
- * Each graph URI is considered relative to the resource URN and may or may not
- * be consistent across resources, depending on how repository managers
- * organize their knowledge.
+ * The `user_data` handle is a `{NULL}`-terminated array of user-defined
+ * graphs.  Each graph URI is considered relative to the resource URN and may
+ * or may not be consistent across resources, depending on how repository
+ * managers organize their knowledge.
  *
  * The `admin_data` graph contains exclusively triples managed by the
  * repository.  They may have special functionality attached and may be created

+ 7 - 19
src/core.c

@@ -82,32 +82,31 @@ LSUP_rc LSR_init (void)
     if (rc < 0) return rc;
 
     // Load additional LSUP_repo namespaces into store and memory.
-    LSUP_NSMap *nsm = LSUP_default_env->nsm;
+    LSUP_NSMap *nsm = LSUP_default_nsm;
 
     for (int i = 0; nsm_str[i][0] != NULL; i++)
         LSUP_nsmap_add (nsm, nsm_str[i][0], nsm_str[i][1]);
 
     // Store the additional NS if this is the first time.
-    LSUP_mdbstore_nsm_store (LSUP_default_env->mdb_store, nsm);
+    //LSUP_nsmap_add (LSUP_default_mdb_store, nsm);
 
     // Cache managed predicates.
     LSR_managed_preds = hashmap_new (
-            sizeof (LSUP_Term), 0, HASH_SEED, 0,
+            sizeof (LSUP_Term), 0, LSUP_HASH_SEED, 0,
             tmap_hash_fn, tmap_cmp_fn, tmap_free_fn, NULL);
     for (int i = 0; mgd_pred_str[i] != NULL; i++) {
-        LSUP_Term *uri = LSUP_iriref_new (
-                mgd_pred_str[i], LSUP_default_env->nsm);
+        LSUP_Term *uri = LSUP_iriref_new (mgd_pred_str[i], LSUP_default_nsm);
 
         hashmap_set (LSR_managed_preds, uri);
     }
 
     // Cache managed types.
     LSR_managed_types = hashmap_new (
-            sizeof (LSUP_Term), 0, HASH_SEED, 0,
+            sizeof (LSUP_Term), 0, LSUP_HASH_SEED, 0,
             tmap_hash_fn, tmap_cmp_fn, tmap_free_fn, NULL);
     for (int i = 0; mgd_type_str[i] != NULL; i++) {
         LSUP_Term *uri = LSUP_iriref_new (
-                mgd_type_str[i], LSUP_default_env->nsm);
+                mgd_type_str[i], LSUP_default_nsm);
 
         hashmap_set (LSR_managed_types, uri);
     }
@@ -125,20 +124,9 @@ void LSR_done (void)
 
     log_info ("Tearing down LSUP repo environment.");
 
-    LSR_TermMap *entry, *tmp;
-    HASH_ITER (hh, LSR_managed_preds, entry, tmp) {
-        HASH_DEL (LSR_managed_preds, entry);
-        LSUP_term_free (entry->term);
-        free (entry);
-    }
-    HASH_ITER (hh, LSR_managed_types, entry, tmp) {
-        HASH_DEL (LSR_managed_types, entry);
-        LSUP_term_free (entry->term);
-        free (entry);
-    }
-
     hashmap_free (LSR_managed_preds);
     hashmap_free (LSR_managed_types);
+
     LSUP_done();
     LSR_is_init = false;
 }

+ 28 - 27
src/desc.c

@@ -11,8 +11,8 @@ LSR_desc_new_multi (LSUP_Graph *const *data, LSR_Desc **rsrc_p)
     uuid_generate_random (rsrc->id);
 
     // Default context graph.
-    rsrc->main_data = LSUP_graph_new (LSUP_term_new_from_buffer (
-            LSUP_default_env->default_ctx), LSUP_STORE_MEM);
+    rsrc->main_data = LSUP_graph_new (
+            LSUP_default_ctx, LSUP_STORE_HTABLE, NULL, NULL, 0);
 
     LSUP_GraphIterator *lu_it, *add_it, *admin_add_it = NULL;
 
@@ -23,7 +23,7 @@ LSR_desc_new_multi (LSUP_Graph *const *data, LSR_Desc **rsrc_p)
         *dest_spo = &dest_spo_s;
 
     LSUP_Term *rsrc_uri = LSR_id_to_urn (rsrc->id, NULL);
-    LSUP_Term *rdf_t = LSUP_iriref_new ("rdf:type", LSUP_DEF_NSM);
+    LSUP_Term *rdf_t = LSUP_iriref_new ("rdf:type", LSUP_default_nsm);
 
     // Count graphs inserted and allocate space.
     size_t ct = 0;
@@ -45,13 +45,14 @@ LSR_desc_new_multi (LSUP_Graph *const *data, LSR_Desc **rsrc_p)
         LSUP_term_free (rel_uri);
         if (rc < 0) goto finally;
 
-        rsrc->user_data[i] = LSUP_graph_new (gr_uri, LSUP_STORE_MEM);
+        rsrc->user_data[i] = LSUP_graph_new (
+                gr_uri, LSUP_STORE_HTABLE, NULL, NULL, 0);
 
         add_it = LSUP_graph_add_init (rsrc->user_data[i]);
         lu_it = LSUP_graph_lookup (rsrc->user_data[i], NULL, NULL, NULL, NULL);
 
         // Loop over graph triples.
-        while (LSUP_graph_iter_next (lu_it, src_spo) == LSUP_OK) {
+        while (LSUP_graph_iter_next (lu_it, &src_spo) == LSUP_OK) {
             dest_s = LSUP_IS_IRI (src_spo->s) ?
                     LSUP_iriref_relative (rsrc_uri, src_spo->s) : src_spo->s;
             dest_p = LSUP_term_copy (src_spo->p);
@@ -120,21 +121,21 @@ loop_end:
         // Add user graph metadata to default graph.
         admin_add_it = LSUP_graph_add_init (rsrc->main_data);
         dest_s = gr_uri;
-        dest_p = LSUP_iriref_new ("rdf:type", LSUP_DEF_NSM);
+        dest_p = LSUP_iriref_new ("rdf:type", LSUP_default_nsm);
 
-        dest_o = LSUP_iriref_new ("lsup:Metadata", LSUP_DEF_NSM);
+        dest_o = LSUP_iriref_new ("lsup:Metadata", LSUP_default_nsm);
         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);
 
-        dest_o = LSUP_iriref_new ("lsup:UserMetadata", LSUP_DEF_NSM);
+        dest_o = LSUP_iriref_new ("lsup:UserMetadata", LSUP_default_nsm);
         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);
 
         // Relationship between data graph and resource.
-        dest_p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_DEF_NSM);
+        dest_p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_default_nsm);
         dest_o = rsrc_uri;
         LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
         LSUP_graph_add_iter (admin_add_it, dest_spo);
@@ -151,7 +152,8 @@ loop_end:
     /* BEGIN adding managed (admin) data. */
 
     LSUP_Term *gr_uri = LSR_id_to_urn (rsrc->id, "__admin");
-    rsrc->admin_data = LSUP_graph_new (gr_uri, LSUP_STORE_MEM);
+    rsrc->admin_data = LSUP_graph_new (
+            gr_uri, LSUP_STORE_HTABLE, NULL, NULL, 0);
 
     admin_add_it = LSUP_graph_add_init (rsrc->admin_data);
     dest_s = LSUP_iriref_new("", NULL); // Relative to resource URI.
@@ -161,12 +163,12 @@ loop_end:
     // RDF types.
     dest_p = rdf_t;
 
-    dest_o = LSUP_iriref_new ("lsup:Resource", LSUP_DEF_NSM);
+    dest_o = LSUP_iriref_new ("lsup:Resource", LSUP_default_nsm);
     LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
     LSUP_graph_add_iter (admin_add_it, admin_spo);
     LSUP_term_free (dest_o);
 
-    dest_o = LSUP_iriref_new ("lsup:DescriptiveResource", LSUP_DEF_NSM);
+    dest_o = LSUP_iriref_new ("lsup:DescriptiveResource", LSUP_default_nsm);
     LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
     LSUP_graph_add_iter (admin_add_it, admin_spo);
     LSUP_term_free (dest_o);
@@ -177,14 +179,14 @@ loop_end:
     char buf [sizeof ("0000-00-00T00:00:00Z")];
     strftime (buf, sizeof (buf), "%FT%TZ", gmtime (&now));
 
-    dest_p = LSUP_iriref_new ("lsup:created", LSUP_DEF_NSM);
+    dest_p = LSUP_iriref_new ("lsup:created", LSUP_default_nsm);
     dest_o = LSUP_literal_new (
-            buf, LSUP_iriref_new ("xsd:dateTime", LSUP_DEF_NSM));
+            buf, LSUP_iriref_new ("xsd:dateTime", LSUP_default_nsm));
     LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
     LSUP_graph_add_iter (admin_add_it, admin_spo);
     LSUP_term_free (dest_p);
 
-    dest_p = LSUP_iriref_new ("lsup:lastModified", LSUP_DEF_NSM);
+    dest_p = LSUP_iriref_new ("lsup:lastModified", LSUP_default_nsm);
     LSUP_triple_init (admin_spo, dest_s, dest_p, dest_o);
     LSUP_graph_add_iter (admin_add_it, admin_spo);
     LSUP_term_free (dest_p);
@@ -200,18 +202,18 @@ loop_end:
     dest_s = gr_uri;
     dest_p = rdf_t;
 
-    dest_o = LSUP_iriref_new ("lsup:Metadata", LSUP_DEF_NSM);
+    dest_o = LSUP_iriref_new ("lsup:Metadata", LSUP_default_nsm);
     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);
 
-    dest_o = LSUP_iriref_new ("lsup:AdminMetadata", LSUP_DEF_NSM);
+    dest_o = LSUP_iriref_new ("lsup:AdminMetadata", LSUP_default_nsm);
     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);
 
     // Relationship between data graph and resource.
-    dest_p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_DEF_NSM);
+    dest_p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_default_nsm);
     dest_o = rsrc_uri;
     LSUP_triple_init (dest_spo, dest_s, dest_p, dest_o);
     LSUP_graph_add_iter (admin_add_it, dest_spo);
@@ -297,14 +299,13 @@ LSR_desc_get (const uuid_t id, LSR_Desc **rsrc_p)
 {
     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_Graph *main_gr = LSUP_graph_new (
+            LSUP_default_ctx, LSR_DEFAULT_BACKEND, NULL, NULL, 0);
 
     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);
+        *p = LSUP_iriref_new ("rdf:type", LSUP_default_nsm),
+        *o = LSUP_iriref_new ("lsup:Resource", LSUP_default_nsm);
 
     LSUP_Triple *spo = LSUP_triple_new (s, p, o);
     LSUP_triple_free (spo);
@@ -315,7 +316,7 @@ LSR_desc_get (const uuid_t id, LSR_Desc **rsrc_p)
     }
 
     LSUP_term_free (o);
-    o = LSUP_iriref_new ("lsup:DescriptiveResource", LSUP_DEF_NSM);
+    o = LSUP_iriref_new ("lsup:DescriptiveResource", LSUP_default_nsm);
     spo = LSUP_triple_new (s, p, o);
     if (!LSUP_graph_contains (main_gr, spo)) {
         log_error ("%s is not a descriptive resource.", o->data);
@@ -324,14 +325,14 @@ LSR_desc_get (const uuid_t id, LSR_Desc **rsrc_p)
     }
 
     LSUP_term_free (p);
-    p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_DEF_NSM);
+    p = LSUP_iriref_new ("foaf:primaryTopic", LSUP_default_nsm);
     size_t ct = 0, i = 0;
 
     // Find all graphs making up the resource.
     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);
+    while (LSUP_graph_iter_next (it, &spo)) {
+        data[i] = LSUP_graph_new (spo->s, LSR_DEFAULT_BACKEND, NULL, NULL, 0);
         if (! data[i++]) break; // Last slot remains NULL (sentinel).
     }
     LSUP_graph_iter_free (it);