From 36c22be51af07fc96a9168684949b82b8f6e325c Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Sun, 10 Feb 2013 08:56:33 +0000
Subject: Add lilv_world_ask() for easily checking if a statement exists. Add
 lilv_world_get() and lilv_port_get() for easily getting one value.

git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@5053 a436a847-0d15-0410-975c-d299462d15a1
---
 src/node.c  |  4 ++++
 src/port.c  | 15 +++++++++++++++
 src/world.c | 16 ++++++++++++++++
 3 files changed, 35 insertions(+)

(limited to 'src')

diff --git a/src/node.c b/src/node.c
index 495bb49..7b22873 100644
--- a/src/node.c
+++ b/src/node.c
@@ -92,6 +92,10 @@ lilv_node_new(LilvWorld* world, LilvNodeType type, const char* str)
 LilvNode*
 lilv_node_new_from_node(LilvWorld* world, const SordNode* node)
 {
+	if (!node) {
+		return NULL;
+	}
+
 	LilvNode*    result       = NULL;
 	SordNode*    datatype_uri = NULL;
 	LilvNodeType type         = LILV_VALUE_STRING;
diff --git a/src/port.c b/src/port.c
index 00896df..48d87dd 100644
--- a/src/port.c
+++ b/src/port.c
@@ -126,6 +126,21 @@ lilv_port_get_value(const LilvPlugin* p,
 		lilv_node_as_node(predicate));
 }
 
+LILV_API
+LilvNode*
+lilv_port_get(const LilvPlugin* p,
+              const LilvPort*   port,
+              const LilvNode*   predicate)
+{
+	LilvNodes* values = lilv_port_get_value(p, port, predicate);
+
+	LilvNode* value = lilv_node_duplicate(
+		values ? lilv_nodes_get_first(values) : NULL);
+
+	lilv_nodes_free(values);
+	return value;
+}
+
 LILV_API
 uint32_t
 lilv_port_get_index(const LilvPlugin* p,
diff --git a/src/world.c b/src/world.c
index a3f59ed..147690b 100644
--- a/src/world.c
+++ b/src/world.c
@@ -201,6 +201,22 @@ lilv_world_find_nodes(LilvWorld*      world,
 		object ? object->node : NULL);
 }
 
+LILV_API
+LilvNode*
+lilv_world_get(LilvWorld*      world,
+               const LilvNode* subject,
+               const LilvNode* predicate,
+               const LilvNode* object)
+{
+	return lilv_node_new_from_node(
+		world,
+		sord_get(world->model,
+		         subject ? subject->node : NULL,
+		         predicate ? predicate->node : NULL,
+		         object ? object->node : NULL,
+		         NULL));
+}
+
 SordIter*
 lilv_world_query_internal(LilvWorld*      world,
                           const SordNode* subject,
-- 
cgit v1.2.1