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