summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-01-12 01:20:18 +0000
committerDavid Robillard <d@drobilla.net>2014-01-12 01:20:18 +0000
commitb6d42f8679198904b8210251d9529e6e52ff27a1 (patch)
tree9426f96ebfc16889d19a80d317e6c5a930e02e1f
parent7b6f3566ea79e1f876c873103e26485eb9d51b0a (diff)
downloadlilv-b6d42f8679198904b8210251d9529e6e52ff27a1.tar.gz
lilv-b6d42f8679198904b8210251d9529e6e52ff27a1.tar.bz2
lilv-b6d42f8679198904b8210251d9529e6e52ff27a1.zip
Don't load files multiple times if they are listed as rdfs:seeAlso for several plugins.
git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@5308 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--NEWS7
-rw-r--r--src/lilv_internal.h5
-rw-r--r--src/plugin.c12
-rw-r--r--src/world.c82
-rw-r--r--wscript2
5 files changed, 64 insertions, 44 deletions
diff --git a/NEWS b/NEWS
index 9ed4ba2..3264213 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,10 @@
+lilv (0.18.1) unstable;
+
+ * Don't load files multiple times if they are listed as rdfs:seeAlso for
+ several plugins
+
+ -- David Robillard <d@drobilla.net> Sat, 11 Jan 2014 20:11:32 -0500
+
lilv (0.18.0) stable;
* Allow lilv_state_restore() to be used without passing an instance,
diff --git a/src/lilv_internal.h b/src/lilv_internal.h
index 567fcea..f8fcec6 100644
--- a/src/lilv_internal.h
+++ b/src/lilv_internal.h
@@ -275,7 +275,10 @@ LilvPluginClasses* lilv_plugin_classes_new(void);
LilvUIs* lilv_uis_new(void);
const uint8_t* lilv_world_blank_node_prefix(LilvWorld* world);
-void lilv_world_load_file(LilvWorld* world, const char* file_uri);
+
+SerdStatus lilv_world_load_file(LilvWorld* world,
+ SerdReader* reader,
+ const LilvNode* uri);
LilvUI* lilv_ui_new(LilvWorld* world,
LilvNode* uri,
diff --git a/src/plugin.c b/src/plugin.c
index b0a726e..cc1bdba 100644
--- a/src/plugin.c
+++ b/src/plugin.c
@@ -166,14 +166,10 @@ lilv_plugin_load(LilvPlugin* p)
// Parse all the plugin's data files into RDF model
LILV_FOREACH(nodes, i, p->data_uris) {
- const LilvNode* data_uri_val = lilv_nodes_get(p->data_uris, i);
- const SordNode* data_uri_node = data_uri_val->node;
- const char* data_uri_str = lilv_node_as_uri(data_uri_val);
-
- serd_env_set_base_uri(env, sord_node_to_serd_node(data_uri_node));
- serd_reader_add_blank_prefix(reader,
- lilv_world_blank_node_prefix(p->world));
- serd_reader_read_file(reader, (const uint8_t*)data_uri_str);
+ const LilvNode* data_uri = lilv_nodes_get(p->data_uris, i);
+
+ serd_env_set_base_uri(env, sord_node_to_serd_node(data_uri->node));
+ lilv_world_load_file(p->world, reader, data_uri);
}
#ifdef LILV_DYN_MANIFEST
diff --git a/src/world.c b/src/world.c
index 5e1142a..e89a23f 100644
--- a/src/world.c
+++ b/src/world.c
@@ -533,18 +533,18 @@ lilv_world_load_bundle(LilvWorld* world, LilvNode* bundle_uri)
return;
}
- SordNode* bundle_node = bundle_uri->node;
-
- SerdNode manifest_uri = lilv_new_uri_relative_to_base(
+ SordNode* bundle_node = bundle_uri->node;
+ SerdNode manifest_uri = lilv_new_uri_relative_to_base(
(const uint8_t*)"manifest.ttl",
(const uint8_t*)sord_node_get_string(bundle_node));
- SerdEnv* env = serd_env_new(&manifest_uri);
- SerdReader* reader = sord_new_reader(world->model, env, SERD_TURTLE,
- bundle_node);
- serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world));
+ LilvNode* manifest = lilv_new_uri(world, (const char*)manifest_uri.buf);
+ SerdEnv* env = serd_env_new(&manifest_uri);
+ SerdReader* reader = sord_new_reader(
+ world->model, env, SERD_TURTLE, bundle_node);
- SerdStatus st = serd_reader_read_file(reader, manifest_uri.buf);
+ SerdStatus st = lilv_world_load_file(world, reader, manifest);
+ lilv_node_free(manifest);
serd_reader_free(reader);
serd_env_free(env);
if (st) {
@@ -752,6 +752,28 @@ lilv_world_load_all(LilvWorld* world)
lilv_world_load_plugin_classes(world);
}
+SerdStatus
+lilv_world_load_file(LilvWorld* world, SerdReader* reader, const LilvNode* uri)
+{
+ ZixTreeIter* iter;
+ if (!zix_tree_find((ZixTree*)world->loaded_files, uri, &iter)) {
+ return SERD_FAILURE; // File has already been loaded
+ }
+
+ serd_reader_add_blank_prefix(reader, lilv_world_blank_node_prefix(world));
+ const uint8_t* uri_str = sord_node_get_string(uri->node);
+ SerdStatus st = serd_reader_read_file(reader, uri_str);
+ if (st) {
+ LILV_ERRORF("Error loading file `%s'\n", lilv_node_as_string(uri));
+ return st;
+ }
+
+ zix_tree_insert((ZixTree*)world->loaded_files,
+ lilv_node_duplicate(uri),
+ NULL);
+ return SERD_SUCCESS;
+}
+
LILV_API
int
lilv_world_load_resource(LilvWorld* world,
@@ -769,33 +791,25 @@ lilv_world_load_resource(LilvWorld* world,
world->uris.rdfs_seeAlso,
NULL, NULL);
FOREACH_MATCH(files) {
- const SordNode* file = sord_iter_get_node(files, SORD_OBJECT);
- const uint8_t* str = sord_node_get_string(file);
- LilvNode* file_node = lilv_node_new_from_node(world, file);
- ZixTreeIter* iter;
- if (zix_tree_find((ZixTree*)world->loaded_files, file_node, &iter)) {
- if (sord_node_get_type(file) == SORD_URI) {
- const SerdNode* base = sord_node_to_serd_node(file);
- SerdEnv* env = serd_env_new(base);
- SerdReader* reader = sord_new_reader(
- world->model, env, SERD_TURTLE, (SordNode*)file);
- serd_reader_add_blank_prefix(
- reader, lilv_world_blank_node_prefix(world));
- if (!serd_reader_read_file(reader, str)) {
- ++n_read;
- zix_tree_insert(
- (ZixTree*)world->loaded_files, file_node, NULL);
- file_node = NULL; // prevent deletion...
- } else {
- LILV_ERRORF("Error loading resource `%s'\n", str);
- }
- serd_reader_free(reader);
- serd_env_free(env);
- } else {
- LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", str);
- }
+ const SordNode* file = sord_iter_get_node(files, SORD_OBJECT);
+ const uint8_t* str = sord_node_get_string(file);
+ if (sord_node_get_type(file) != SORD_URI) {
+ LILV_ERRORF("rdfs:seeAlso node `%s' is not a URI\n", str);
+ continue;
}
- lilv_node_free(file_node); // ...here
+
+ LilvNode* file_node = lilv_node_new_from_node(world, file);
+ SerdEnv* env = serd_env_new(sord_node_to_serd_node(file));
+ SerdReader* reader = sord_new_reader(
+ world->model, env, SERD_TURTLE, (SordNode*)file);
+
+ if (!lilv_world_load_file(world, reader, file_node)) {
+ ++n_read;
+ }
+
+ lilv_node_free(file_node);
+ serd_reader_free(reader);
+ serd_env_free(env);
}
sord_iter_free(files);
diff --git a/wscript b/wscript
index 78e0b33..79017f0 100644
--- a/wscript
+++ b/wscript
@@ -12,7 +12,7 @@ import waflib.Logs as Logs
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
-LILV_VERSION = '0.18.0'
+LILV_VERSION = '0.18.1'
LILV_MAJOR_VERSION = '0'
# Mandatory waf variables