[redland-dev] Ruby-wrapper

Dave Beckett dave.beckett at bristol.ac.uk
Tue Apr 6 16:47:24 BST 2004


On Mon, 5 Apr 2004 21:44:26 -0600, dominic sisneros <dom at sisna.com> wrote:

> Just writing to let you know, I am building a wrapper for redland in 
> ruby.
> 
> http://rubyforge.org/projects/ruby-rdf/

Great!

I tried to grab the '.gem' file but the ruby I had here couldn't do
anything with it - no optparse, no gem - so I checked out the CVS.

[I've copied this mail to Dan Brickley who has an interest in this
and made the original attempt at redland with ruby.]

The API seems nicely ruby-ified as far as my minimal ruby knowledge
goes.  I see you are turning the iterators and streams into proper
streaming arrays using 'yield'.

I'm not quite sure what you are doing with the ObjectSpace and
cleanup stuff, but I assume it is the right thing.  (you might try
using valgrind if you are running on linux to check for leaks)

> I did find a problem in the Redland.i file.  The function
> librdf_new_node_from_blank_identifier(librdf_world *world, const char 
> *identifier);
> needs to either accept a nil or a char string.  Right now it gives an 
> error if I give a
> nil value so I cannot do blank nodes without and identifier.  If you 
> could add the following:
> to Redland.i, it works as required.
> 
> %typemap(ruby,in) const char *identifier{
>    if ($input == Qnil){
>      $1 = NULL;
>    }
>    else{
>      $1 = STR2CSTR($input);
>        }
> }
> librdf_node* librdf_new_node_from_blank_identifier(librdf_world *world, 
> const char *identifier);

Yeah, that seems to be needed since ruby does not have a null object,
but has a separate nil term.  This might affect some other classes.

I was looking at the Redland.i in your CVS and it's a little old compared
to what I have now.  Another thing I noticed was that maybe it
would be useful to add some defaults to other parameters.

So instead I'm thinking of something like this change to Redland.i:
----------------------------------------------------------------------
@@ -367,6 +367,11 @@
 #endif
 %}
 
+/* optional input strings - can be NULL, need special conversions */
+%typemap(ruby,in) const char *inStrOrNull {
+  $1 = ($input == Qnil) ? NULL : STR2CSTR($input);
+}
+
 
 typedef struct librdf_world_s librdf_world;
 typedef struct librdf_hash_s librdf_hash;
@@ -419,10 +424,10 @@
 librdf_node* librdf_new_node(librdf_world *world);
 librdf_node* librdf_new_node_from_uri_string(librdf_world *world, const char *string);
 librdf_node* librdf_new_node_from_uri(librdf_world *world, librdf_uri *uri);
-librdf_node* librdf_new_node_from_literal(librdf_world *world, const char *string, const char *xml_language, int is_wf_xml);
-librdf_node* librdf_new_node_from_typed_literal(librdf_world *world, const char *string, const char *xml_language, librdf_uri* datatype_uri);
+librdf_node* librdf_new_node_from_literal(librdf_world *world, const char *string, const char *inStrOrNull=NULL, int is_wf_xml=0);
+librdf_node* librdf_new_node_from_typed_literal(librdf_world *world, const char *string, const char *inStrOrNull=NULL, librdf_uri* datatype_uri=NULL);
 librdf_node* librdf_new_node_from_node(librdf_node *node);
-librdf_node* librdf_new_node_from_blank_identifier(librdf_world *world, const char *identifier);
+librdf_node* librdf_new_node_from_blank_identifier(librdf_world *world, const char *inStrOrNull=NULL);
 void librdf_free_node(librdf_node *r);
 librdf_uri* librdf_node_get_uri(librdf_node* node);
 int librdf_node_get_type(librdf_node* node);
----------------------------------------------------------------------

since it makes sense for optional things like literal languages and
datatype URIs to be defaulted.  The literal language also need the
nil check for ruby.

> Thanks in advance and thanks for the library

Thanks a lot.

Dave



More information about the redland-dev mailing list