Hi all,

at first i want to say a big "Thank you" to all sqlite developers. Using 
sqlite with Python since 4 years i always (when suited) announce sqlite 
in  my examples for great open source software - indeed i see it as one
of the best pieces of software in the world.

The same can be said for the C-API, everything works easy and as
expected. Currently i work on database bound Python containers, the 
base class "lineup" having all the stuff for Python subscription, iteration and
so on. It supports coding of this kind (with lu a "litelineup"):

lu.dump("testdump.db3", "A"); lu.clear()
lu.connect("testdump.db3", "A")
lu.select("LIMIT 3"); print(lu); lu.hangup()

Special convenince has litelineup.update(): Litelineup tracks cell
modifications and writes them back so, being connected not only to
a database, but having the notion of an associated table too.

These convenient methods as litelineup.select(whereclause), 
litelinup.update(), litelineup.insert_keys(keys) and so on are not only for 
programmer's convenience, but also reuse prepared statements -
litelineup has no general statement cache, but some frequently used
prepared statements as (only internal) object attributes.

Thus litelineup.hangup() must finalize them:

PyObject *LiteLineUp_HangUp(litelineup *self) {
    Py_ssize_t i = 0;
//    if (self->COMMIT_stmt) sqlite3_finalize(self->COMMIT_stmt);
    while (L3LSELF->update_stmts[i++]) 
        sqlite3_finalize(L3LSELF->update_stmts[i]);
    PyMem_Resize(L3LSELF->update_stmts, sqlite3_stmt*, 1);
    L3LSELF->update_stmts[0] = NULL;    
    if (self->select_keys) sqlite3_finalize(self->select_keys);  // 
sqlite3_stmt 
refers a connection
    if (self->select_glob) sqlite3_finalize(self->select_glob);
    if (self->insert_keys) sqlite3_finalize(self->insert_keys);
//    if (self->BEGIN_stmt) sqlite3_finalize(self->BEGIN_stmt);
    if (self->conn) { sqlite3_close(self->conn); self->conn=NULL; }
    Py_RETURN_NONE;
}

You see the uncommented rows for COMMIT_stmt and BEGIN_stmt.
Indeed performing these lines crashes the litelineup. Is it true, that
we must not finalize a statement prepared by

sqlite3_prepare_v2(self->conn, "COMMIT ;", -1, &self->COMMIT_stmt, 
NULL);

or BEGIN IMMEDIATE ?

And if so, it is sensy at all to save them for reuse ?

Thanks for reading, Joost






_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to