diff --git a/dbdimp.c b/dbdimp.c index 8dcab51..5b437b2 100644 --- a/dbdimp.c +++ b/dbdimp.c @@ -144,12 +144,17 @@ int sqlite_db_disconnect (SV *dbh, imp_dbh_t *imp_dbh) { dTHR; + sqlite3_stmt *pStmt; DBIc_ACTIVE_off(imp_dbh); if (DBIc_is(imp_dbh, DBIcf_AutoCommit) == FALSE) { sqlite_db_rollback(dbh, imp_dbh); } + while ( (pStmt = sqlite3_next_stmt(imp_dbh->db, 0))!=0 ) { + sqlite3_finalize(pStmt); + } + if (sqlite3_close(imp_dbh->db) == SQLITE_BUSY) { /* active statements! */ warn("closing dbh with active statement handles"); @@ -606,9 +611,13 @@ sqlite_st_finish3 (SV *sth, imp_sth_t *imp_sth, int is_destroy) void sqlite_st_destroy (SV *sth, imp_sth_t *imp_sth) { + D_imp_dbh_from_sth; /* warn("destroy statement: %s\n", imp_sth->statement); */ DBIc_ACTIVE_off(imp_sth); - sqlite3_finalize(imp_sth->stmt); + if (DBIc_ACTIVE(imp_dbh)) { + /* finalize sth when active connection */ + sqlite3_finalize(imp_sth->stmt); + } Safefree(imp_sth->statement); SvREFCNT_dec((SV*)imp_sth->params); SvREFCNT_dec((SV*)imp_sth->col_types);