My code is pretty straight forward.. it simply opens the database and tries to 
see if a table exists? m_bdbIsOpen  and m_bInMemory are both false (so the db 
is opened okay).  You'll notice I don't get an error at sqlite3_exec() in the 
open method...

bool CDatabase::doesTableExist (const String& tableName, bool& bError)
{
    bError = false;

    if (! open())
        return false;

    ////////////////////////////////////

    sqlite3_stmt* stmt = nullptr;
    const char* tail = nullptr;

    String szSQL ("pragma table_info('" + tableName + "');");

    // Logger::writeToLog ("sql = " + szSQL);

    int rc = sqlite3_prepare_v2 (m_db, szSQL.getCharPointer(), -1, &stmt, 
&tail);

    if (rc != SQLITE_OK)
        {
        Logger::writeToLog ("CDatabase::doesTableExist() - Error at LINE: " + 
String(__LINE__));

        showError (rc, stmt);

        bError = true;

        return false;
        }

    rc = sqlite3_step (stmt);

    int nrows = sqlite3_data_count (stmt);

    sqlite3_finalize (stmt);

    close();

    return nrows > 0;
}

bool CDatabase::open (int iFlags /* = SQLITE_OPEN_READONLY */)
{
    const ScopedLock sl (m_Lock);

    if ((! m_bDoesExist) && (iFlags & SQLITE_OPEN_READONLY))
        {
        Logger::writeToLog ("The database doesn't exist!");

        return false;
        }

    if (m_bdbIsOpen)
        return true;

    m_iFlags = iFlags;

    int rc;

    if (m_bInMemory)
        {
        String szInMemory (":memory:");

        rc = sqlite3_open_v2 (szInMemory.getCharPointer(), &m_db, iFlags, NULL);

        if (rc != SQLITE_OK)
            {
            showError (rc);

            return false;
            }
        }
    else
        {
        rc = sqlite3_open_v2 (m_szDatabasePath.getCharPointer(), &m_db, iFlags, 
NULL);

        if (rc != SQLITE_OK)
            {
            showError (rc);

            return false;
            }
        }

    m_bdbIsOpen = true;

    ++m_iOpenCount;

    char  *szErr = nullptr;

    rc = sqlite3_exec (m_db, "PRAGMA foreign_keys = ON;", NULL, NULL, &szErr);

    if (rc != SQLITE_OK)
        {
        if (szErr != NULL)
            {
            Logger::writeToLog ("SQL ERROR: " + String (szErr));

            return false;
            }
        }

    return true;
}

The 3rd party are trying to imply it's my code at fault -- but I can't see 
anything I'm doing wrong.

> I consider this a bug but have been told that there's no appropriate way to 
> fix it until SQLite4 comes along.

So you're saying I'm basically screwed :)

Thanks,

        Rail
-------------------------------------------------

On Apr 5, 2016, at 7:10 PM, Simon Slavin <slavins at bigfraud.org> wrote:

> 
> On 6 Apr 2016, at 2:59am, Rail Jon Rogut <sqlite3 at platinumsamples.com> 
> wrote:
> 
>> Oh -- and the database opens fine -- it only fails when I try and call 
>> sqlite3_prepare_v2() to check if a table exists in the database 
> 
> The sqlite3_open() routines don't actually do any file access at all (most of 
> the time).  They just set up some structures in memory.  The file is actually 
> opened by the first SQLite call which needs to read or write them.  So that's 
> when you get the access errors.
> 
> I consider this a bug but have been told that there's no appropriate way to 
> fix it until SQLite4 comes along.
> 
> Simon.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to