--- Zbigniew Baniewski <[EMAIL PROTECTED]> wrote:
> > Your trace seems to indicate it has 20 or so open 
> > connections to the same database file in the same process.
> 
> I think, at last I've traced the problem:
> 
> One of the scripts doesn't make use out of database contents at all. But at
> the beginning there was a simple check for database file presence, just to
> let the user know, if there (from any reason) could be dbfile missing:
> 
> if ($dbhandle = sqlite_open("/path/to/database/dbfile.db", 0666, 
> $sqliteerror)) {
>   $result = sqlite_unbuffered_query($dbhandle, 'select something from 
> some_table');
>   sqlite_close($dbhandle);
> } else {
>   die($sqliteerror);
> }
> 
> 
> Yes, the "$result = ..." line can be omitted (it is now, anyway...), because
> a successfull opening a database file is enough to check, whether the file
> is present, or not (although without SELECT it may be any other database
> file, with quite different tables).
> 
> My problem was caused by the fact, that there was a "SELECT" query, but
> $result handle hasn't been processed any further. After commenting out the
> "$result = ..." line there are no more "persistent" open database connections.
> 
> 
> And the question: is it normal behaviour - or is it a bug in PHP-module?
> I've got a feeling, that after "sqlite_close($dbhandle)" there should be
> assumption, that the script will not use database anymore (until ev. next
> "sqlite_open"), so all ev. other handles related to database contents should
> be immediately removed.

You are not checking the return code of the sqlite3 connection close.

sqlite3_close can fail with:

    SQLITE_MISUSE

    SQLITE_BUSY -> "Unable to close due to unfinalised statements"

    SQLITE_ERROR

see http://sqlite.org/capi3ref.html#sqlite3_close

I have no idea if the PHP sqlite3 wrapper propogates these errors, as
the return code of sqlite3_close is not examined (see PHP wrapper below). 
Perhaps PHP somehow calls sqlite3_errcode() - who knows. It's a question 
for the PHP people.

static int sqlite_handle_closer(pdo_dbh_t *dbh TSRMLS_DC) /* {{{ */
{
        pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;

        if (H) {
                pdo_sqlite_error_info *einfo = &H->einfo;

                pdo_sqlite_cleanup_callbacks(H TSRMLS_CC);
                if (H->db) {
                        sqlite3_close(H->db);
                        H->db = NULL;
                }
                if (einfo->errmsg) {
                        pefree(einfo->errmsg, dbh->is_persistent);
                        einfo->errmsg = NULL;
                }
                pefree(H, dbh->is_persistent);
                dbh->driver_data = NULL;
        }
        return 0;
}



       
____________________________________________________________________________________
Be a better Globetrotter. Get better travel answers from someone who knows. 
Yahoo! Answers - Check it out.
http://answers.yahoo.com/dir/?link=list&sid=396545469

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to