Andy Chambers | 10 Sep 23:32

foreign strings

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
(Continue reading)

Stephen Compall | 11 Sep 00:00

Re: foreign strings

"Andy Chambers" <achambers.home <at> googlemail.com> writes:
>   (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?

Yes.

> 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.

The semantics described in
http://common-lisp.net/project/cffi/manual/html_node/Tutorial_002dMemory.html
are still accurate.

So the answer is "just what does `once the C library is finished with
it' mean anyway?"

(Continue reading)

Stelian Ionescu | 11 Sep 00:20

Re: foreign strings

On Wed, 2008-09-10 at 22:35 +0100, Andy Chambers wrote:
> 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...

from the sqlite documentation:
The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
string after SQLite has finished with it. If the fifth argument is the
special value SQLITE_STATIC, then SQLite assumes that the information is
in static, unmanaged space and does not need to be freed. If the fifth
argument has the value SQLITE_TRANSIENT, then SQLite makes its own
private copy of the data immediately, before the sqlite3_bind_*()
routine returns.

You're passing 0 as fifth parameter, which is SQLITE_STATIC, but that's
only for static data, while CFFI C-strings are dynamically allocated.
Use SQLITE_TRANSIENT instead.

--

-- 
Stelian Ionescu a.k.a. fe[nl]ix
Quidquid latine dictum sit, altum videtur.

_______________________________________________
(Continue reading)

Attila Lendvai | 11 Sep 09:39
Gravatar

Re: foreign strings

> I'm still plugging away on sqlite

fyi, here's a working sqlite backend for cl-rdbms:
http://common-lisp.net/cgi-bin/darcsweb/darcsweb.cgi?r=cl-rdbms-cl-rdbms;a=tree;f=/sqlite

the cffi bindings were generated using verrazano.

--

-- 
 attila

Gmane