diff options
-rw-r--r-- | src/port.c | 91 | ||||
-rw-r--r-- | src/slv2_internal.h | 3 | ||||
-rw-r--r-- | src/world.c | 6 |
3 files changed, 54 insertions, 46 deletions
@@ -177,6 +177,24 @@ slv2_port_get_value_by_qname(SLV2Plugin p, } +static SLV2Values +slv2_port_get_value_by_node(SLV2Plugin p, + SLV2Port port, + librdf_node* predicate) +{ + assert(librdf_node_is_resource(predicate)); + + librdf_node* port_node = slv2_port_get_node(p, port); + librdf_stream* results = slv2_plugin_find_statements( + p, + port_node, + predicate, + NULL); + + return slv2_values_from_stream_objects(p, results); +} + + SLV2Values slv2_port_get_value(SLV2Plugin p, SLV2Port port, @@ -187,14 +205,10 @@ slv2_port_get_value(SLV2Plugin p, return NULL; } - librdf_node* port_node = slv2_port_get_node(p, port); - librdf_stream* results = slv2_plugin_find_statements( - p, - port_node, - librdf_new_node_from_uri(p->world->world, slv2_value_as_librdf_uri(predicate)), - NULL); - - return slv2_values_from_stream_objects(p, results); + return slv2_port_get_value_by_node( + p, port, + librdf_new_node_from_uri(p->world->world, + slv2_value_as_librdf_uri(predicate))); } @@ -264,45 +278,30 @@ slv2_port_get_range(SLV2Plugin p, SLV2Value* min, SLV2Value* max) { - if (def) - *def = NULL; - if (min) - *min = NULL; - if (max) - *max = NULL; - - char* query = slv2_strjoin( - "SELECT DISTINCT ?def ?min ?max WHERE {\n" - "<", slv2_value_as_uri(p->plugin_uri), "> lv2:port ?port .\n" - "?port lv2:symbol \"", slv2_value_as_string(port->symbol), "\".\n", - "OPTIONAL { ?port lv2:default ?def }\n", - "OPTIONAL { ?port lv2:minimum ?min }\n", - "OPTIONAL { ?port lv2:maximum ?max }\n", - "\n}", NULL); - - SLV2Results results = slv2_plugin_query_sparql(p, query); - - while (!librdf_query_results_finished(results->rdf_results)) { - librdf_node* def_node = librdf_query_results_get_binding_value(results->rdf_results, 0); - librdf_node* min_node = librdf_query_results_get_binding_value(results->rdf_results, 1); - librdf_node* max_node = librdf_query_results_get_binding_value(results->rdf_results, 2); - - if (def && def_node && !*def) - *def = slv2_value_new_librdf_node(p->world, def_node); - if (min && min_node && !*min) - *min = slv2_value_new_librdf_node(p->world, min_node); - if (max && max_node && !*max) - *max = slv2_value_new_librdf_node(p->world, max_node); - - if ((!def || *def) && (!min || *min) && (!max || *max)) - break; - - librdf_query_results_next(results->rdf_results); + if (def) { + SLV2Values defaults = slv2_port_get_value_by_node( + p, port, p->world->lv2_default_node); + *def = defaults + ? slv2_value_duplicate(slv2_values_get_at(defaults, 0)) + : NULL; + slv2_values_free(defaults); + } + if (min) { + SLV2Values minimums = slv2_port_get_value_by_node( + p, port, p->world->lv2_minimum_node); + *min = minimums + ? slv2_value_duplicate(slv2_values_get_at(minimums, 0)) + : NULL; + slv2_values_free(minimums); + } + if (max) { + SLV2Values maximums = slv2_port_get_value_by_node( + p, port, p->world->lv2_maximum_node); + *max = maximums + ? slv2_value_duplicate(slv2_values_get_at(maximums, 0)) + : NULL; + slv2_values_free(maximums); } - - slv2_results_free(results); - - free(query); } diff --git a/src/slv2_internal.h b/src/slv2_internal.h index f2984a3..f25018e 100644 --- a/src/slv2_internal.h +++ b/src/slv2_internal.h @@ -160,6 +160,9 @@ struct _SLV2World { librdf_node* lv2_specification_node; librdf_node* lv2_plugin_node; librdf_node* lv2_binary_node; + librdf_node* lv2_default_node; + librdf_node* lv2_minimum_node; + librdf_node* lv2_maximum_node; librdf_node* lv2_port_node; librdf_node* lv2_portproperty_node; librdf_node* lv2_index_node; diff --git a/src/world.c b/src/world.c index 1909ca5..e4f292c 100644 --- a/src/world.c +++ b/src/world.c @@ -63,6 +63,9 @@ slv2_world_new_internal(SLV2World world) world->lv2_specification_node = NEW_URI(SLV2_NS_LV2 "Specification"); world->lv2_plugin_node = NEW_URI(SLV2_NS_LV2 "Plugin"); world->lv2_binary_node = NEW_URI(SLV2_NS_LV2 "binary"); + world->lv2_default_node = NEW_URI(SLV2_NS_LV2 "default"); + world->lv2_minimum_node = NEW_URI(SLV2_NS_LV2 "minimum"); + world->lv2_maximum_node = NEW_URI(SLV2_NS_LV2 "maximum"); world->lv2_port_node = NEW_URI(SLV2_NS_LV2 "port"); world->lv2_portproperty_node = NEW_URI(SLV2_NS_LV2 "portProperty"); world->lv2_index_node = NEW_URI(SLV2_NS_LV2 "index"); @@ -162,6 +165,9 @@ slv2_world_free(SLV2World world) librdf_free_node(world->lv2_specification_node); librdf_free_node(world->lv2_plugin_node); librdf_free_node(world->lv2_binary_node); + librdf_free_node(world->lv2_default_node); + librdf_free_node(world->lv2_minimum_node); + librdf_free_node(world->lv2_maximum_node); librdf_free_node(world->lv2_port_node); librdf_free_node(world->lv2_portproperty_node); librdf_free_node(world->lv2_index_node); |