Thank you! that did the trick. Its interesting that even though you
can commit a transaction, the cache sync doesn't happen until you
finalize or reset all you statements. I wish this was documented
somewhere better!

Thanks,

Yuriy

On Jun 25, 2013, at 2:19 PM, Richard Hipp <d...@sqlite.org> wrote:

> On Tue, Jun 25, 2013 at 2:06 PM, Yuriy Stelmakh <yuriy...@gmail.com> wrote:
>
>>  Hi all, please help: very strange issue that should not be happening:
>>
>>
>>
>> 1.       Have two connections to same database: _db1 and _db2.
>>
>> 2.       Create table in _db1
>>
>> 3.       Run count * from _db2 -> returns 0
>>
>> 4.       Insert 1 row using _db1 –OK
>>
>> 5.       Run select * from _db2 -> 0 rows return
>>
>>
>>
>> Weird thing is that if I remove step 3, then step 5 returns a row.
>>
>> I’m guessing there must be a bug in SQLite with cache sync, or I’m missing
>> something obvious.
>
> Without looking at your code, I'm guessing that you are not finalizing the
> statement in step 3.  It is therefore holding the transaction open,
> preventing it from being committed, and thus preventing step 5 from seeing
> the change.
>
> The fact that changes are not visible to outside connections until the
> change is committed is an important and very powerful feature of the SQL
> language, and of SQLite, not a bug.
>
> Looking at your code now - yes, my suspicion seems to be confirmed.  I've
> marked the spot below where I think you need the sqlite3_finalize().
>
>
>
>>
>>
>>
>> Please help:
>>
>>         sqlite3* _db1;
>>
>>        sqlite3* _db2;
>>
>>        sqlite3_open("test.sqlite", &_db1);
>>
>>        sqlite3_open("test.sqlite", &_db2);
>>
>>
>>
>>        //create table
>>
>>        char* errorMessage;
>>
>>        sqlite3_exec(_db1, "CREATE TABLE test (column1 INTEGER)", NULL,
>> NULL,
>> &errorMessage);
>>
>>
>>
>>        //get count of items from db2 -> should return 0
>>
>>        string countStatement = "SELECT COUNT(*) FROM test";
>>
>>
>>
>>        sqlite3_stmt* stmt;
>>
>>        //prepare statement
>>
>>        if(sqlite3_prepare_v2(_db2, countStatement.c_str(), -1, &stmt,
>> NULL)
>> != SQLITE_OK){
>>
>>            GHAssertTrue(false, @"Should have created prepared statement:
>> %s", sqlite3_errmsg(_db1));
>>
>>        }
>>
>>
>>
>>        int rc = sqlite3_step(stmt);
>>
>>        if(rc == SQLITE_ROW){
>>
>>            //get the count
>>
>>            if(sqlite3_column_count(stmt) > 0){
>>
>>                int count = sqlite3_column_int(stmt, 0);
>>
>>                GHAssertTrue(count == 0, @"Count should be zero");
>>
>>            }else{
>>
>>                GHAssertTrue(false, @"Should have returned a row");
>>
>>            }
>>
>>        }else{
>>
>>            GHAssertTrue(false, @"Should have returned a row");
>>
>>        }
>
>
> Insert "sqlite3_finalize(stmt);" here.
>
>
>
>>
>>
>>        //insert one row into table using db1
>>
>>        sqlite3_exec(_db1, "INSERT into test(column1) values (4)", NULL,
>> NULL, &errorMessage);
>>
>>
>>
>>        //read row using db2
>>
>>        //get count of items from db2 -> should return 0
>>
>>        string selectStatement = "SELECT * FROM test";
>>
>>
>>
>>        //prepare statement
>>
>>        if(sqlite3_prepare_v2(_db2, selectStatement.c_str(), -1, &stmt,
>> NULL)
>> != SQLITE_OK){
>>
>>            GHAssertTrue(false, @"Should have created prepared statement:
>> %s", sqlite3_errmsg(_db1));
>>
>>        }
>>
>>
>>
>>        rc = sqlite3_step(stmt);
>>
>>        if(rc == SQLITE_ROW){
>>
>>            //get the count
>>
>>            if(sqlite3_column_count(stmt) > 0){
>>
>>                //good
>>
>>            }else{
>>
>>                //bad
>>
>>                GHAssertTrue(false, @"Should have returned a row");
>>
>>            }
>>
>>        }else{
>>
>>           //bad
>>
>>            GHAssertTrue(false, @"Should have returned a row");
>>
>>        }
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to