Richard,
> Can you please provide more details on how having a dynamic string for
> the pointer type would be helpful? What is it that you are trying to
> do that string constant will not work? Please be as specific as
> possible, so that I might better understand your problem.
I maintain a C++ wrapper library for SQLite especially for developers of
wxWidgets based applications. This wrapper library offers access to almost all
SQLite features (that make sense for an end-user application) through the use
of C++ classes. That is, the wrapper classes encapsulate all calls to the
SQlite C API.
With the release of SQLite 3.20.0 the new pointer-passing interface was
introduced, and I found it quite useful to support extensions like carray.
Therefore, I implemented a pointer bind method for the prepared SQL statement
classs. This method makes internally a call to function sqlite3_bind_pointer.
The signature and implementation of the method looks like this:
void wxSQLite3Statement::Bind(int paramIndex, void* pointer, const wxString&
pointerType, void(*DeletePointer)(void*))
{
CheckStmt();
const char* localPointerType = m_stmt->MakePointerTypeCopy(pointerType);
int rc = sqlite3_bind_pointer(m_stmt->m_stmt, paramIndex, pointer,
localPointerType, DeletePointer);
}
The member variable m_stmt is a reference counted reference object to a
prepared SQL statement (sqlite3_stmt). This makes it possible to pass around
the SQL statement object and to clean up the SQLite data structures when the
last reference to the statement is deleted. This reference object now includes
a dynamic array holding pointer type string duplicates until the reference
object itself goes out of scope.
However, in my first implementation I converted the pointer type string
parameter (wxString object) to a local char* variable. Since this local
variable was destroyed after leaving the method, the select on the carray table
failed, since the pointer type string was void.
Now, I create a copy of the pointer type string in a data structure that is
kept alive until the SQL statement object is deleted. The carray extension now
works flawlessly in the context of my wrapper.
For a C++ wrapper you could argue that using the SQLite API directly is
feasible. However, for SQLite wrappers for other languages like Python or Lua,
this might not work out.
Regards,
Ulrich
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users