/** * librdf_storage_find_statements - search the storage for matching statements * @storage: &librdf_storage object * @statement: &librdf_statement partial statement to find * * Searches the storage for a (partial) statement as described in * librdf_statement_match() and returns a &librdf_stream of * matching &librdf_statement objects. * * Return value: &librdf_stream of matching statements (may be empty) or NULL on failure **/ librdf_stream* librdf_storage_find_statements(librdf_storage* storage, librdf_statement* statement) { librdf_node *subject, *predicate, *object; librdf_iterator *iterator; LIBRDF_ASSERT_OBJECT_POINTER_RETURN_VALUE(storage, librdf_storage, NULL); LIBRDF_ASSERT_OBJECT_POINTER_RETURN_VALUE(statement, librdf_statement, NULL); subject=librdf_statement_get_subject(statement); predicate=librdf_statement_get_predicate(statement); object=librdf_statement_get_object(statement); /* try to pick the most efficient storage back end */ /* only subject/source field blank -> use find_sources */ if(!subject && predicate && object && storage->factory->find_sources) { iterator=storage->factory->find_sources(storage, predicate, object); if(iterator) return librdf_new_stream_from_node_iterator(iterator, statement, LIBRDF_STATEMENT_SUBJECT); return NULL; } /* only predicate/arc field blank -> use find_arcs */ if(subject && !predicate && object && storage->factory->find_arcs) { iterator=storage->factory->find_arcs(storage, subject, object); if(iterator) return librdf_new_stream_from_node_iterator(iterator, statement, LIBRDF_STATEMENT_PREDICATE); return NULL; } /* only object/target field blank -> use find_targets */ if(subject && predicate && !object && storage->factory->find_targets) { iterator=storage->factory->find_targets(storage, subject, predicate); if(iterator) return librdf_new_stream_from_node_iterator(iterator, statement, LIBRDF_STATEMENT_OBJECT); return NULL; } return storage->factory->find_statements(storage, statement); }
int main(int argc, char *argv[]) { librdf_statement *statement; librdf_stream* stream; const char *program=librdf_basename((const char*)argv[0]); librdf_world *world; librdf_uri* prefix_uri; librdf_node* nodes[STREAM_NODES_COUNT]; int i; librdf_iterator* iterator; int count; world=librdf_new_world(); librdf_world_open(world); prefix_uri=librdf_new_uri(world, (const unsigned char*)NODE_URI_PREFIX); if(!prefix_uri) { fprintf(stderr, "%s: Failed to create prefix URI\n", program); return(1); } for(i=0; i < STREAM_NODES_COUNT; i++) { unsigned char buf[2]; buf[0]='a'+i; buf[1]='\0'; nodes[i]=librdf_new_node_from_uri_local_name(world, prefix_uri, buf); if(!nodes[i]) { fprintf(stderr, "%s: Failed to create node %i (%s)\n", program, i, buf); return(1); } } fprintf(stdout, "%s: Creating static node iterator\n", program); iterator = librdf_node_new_static_node_iterator(world, nodes, STREAM_NODES_COUNT); if(!iterator) { fprintf(stderr, "%s: Failed to create static node iterator\n", program); return(1); } statement=librdf_new_statement_from_nodes(world, librdf_new_node_from_uri_string(world, (const unsigned char*)"http://example.org/resource"), librdf_new_node_from_uri_string(world, (const unsigned char*)"http://example.org/property"), NULL); if(!statement) { fprintf(stderr, "%s: Failed to create statement\n", program); return(1); } fprintf(stdout, "%s: Creating stream from node iterator\n", program); stream=librdf_new_stream_from_node_iterator(iterator, statement, LIBRDF_STATEMENT_OBJECT); if(!stream) { fprintf(stderr, "%s: Failed to createstatic node stream\n", program); return(1); } /* This is to check that the stream_from_node_iterator code * *really* takes a copy of what it needs from statement */ fprintf(stdout, "%s: Freeing statement\n", program); librdf_free_statement(statement); fprintf(stdout, "%s: Listing static node stream\n", program); count=0; while(!librdf_stream_end(stream)) { librdf_statement* s_statement=librdf_stream_get_object(stream); if(!s_statement) { fprintf(stderr, "%s: librdf_stream_current returned NULL when not end of stream\n", program); return(1); } fprintf(stdout, "%s: statement %d is: ", program, count); librdf_statement_print(s_statement, stdout); fputc('\n', stdout); librdf_stream_next(stream); count++; } if(count != STREAM_NODES_COUNT) { fprintf(stderr, "%s: Stream returned %d statements, expected %d\n", program, count, STREAM_NODES_COUNT); return(1); } fprintf(stdout, "%s: stream from node iterator worked ok\n", program); fprintf(stdout, "%s: Freeing stream\n", program); librdf_free_stream(stream); fprintf(stdout, "%s: Freeing nodes\n", program); for (i=0; i<STREAM_NODES_COUNT; i++) { librdf_free_node(nodes[i]); } librdf_free_uri(prefix_uri); librdf_free_world(world); /* keep gcc -Wall happy */ return(0); }