[cffi-devel] foreign strings

Andy Chambers achambers.home at googlemail.com
Wed Sep 10 21:35:19 UTC 2008


Hi,

I'm still plugging away on sqlite

I've got a problem creating a binding for the following function

int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));

I tried the following....

(defcfun ("sqlite3_bind_text" %sqlite-bind-text) :int
  (stmt :pointer)
  (index :int)
  (value :string)
  (len :int)
  ;; not really an int but cffi takes care of this for us
  (destructor :int))

Everything is pretty straightforward apart from the last two
parameters.  Length is supposed to be the length of the value being
passed in (or -1 if the value is null terminated).
The destructor is supposed to be a function that frees the memory
required by `value' after sqlite is finished with it.  For destructor,
you can use the special value 0 if the memory
is in "unmanaged" space.  So I have a few questions...

1. If you specify the type as :string, does cffi pass it through as a
null terminated string?
2. Does cffi take care of freeing a string once the C library is
finished with it or should I define a callback to use for the
destructor.
3. With my current code, I'm not getting any memory errors but I am
getting weird values in the database.

For example....

With this binding, I don't get any memory errors but I do get nonsense
values going into the database.  Here's an example....

sqlite> select * from clinical_data;
ˆ|Ñø·Ñø·IBUTE|ˆ|˜Â'ø|ˆ|˜Â'ø|Ñø·Ñø·IBUTE||

The values I'm passing in to get this are...

001, StudyEventOID, 1, FormOID, 1, PARTIAL, ALL ATTRIBUTE, ID.PD, 1959-12

Any ideas what's going on here?

Cheers,
Andy



More information about the cffi-devel mailing list