Hi,
Yes they are.
With "PRAGMA wal_checkpoint" it works as expected.
Yoni.

On Tue, Aug 10, 2010 at 2:50 PM, Dan Kennedy <danielk1...@gmail.com> wrote:

>
> On Aug 10, 2010, at 6:03 PM, Yoni Londner wrote:
>
> > Hi,
> > Yes, it explains allot.
> > But, according to you, the following program should work.
> > I don't use transactions, shared cache or threads.
> > Just run the checkpoint from another connection.
> > And still - WAL file is getting bigger and bigger without limit.
> > If I do the checkpoint with the same connection, everything work
> > perfectly.
>
> Interesting. Perhaps the call to sqlite3_wal_checkpoint()
> is not working because the second connection never really
> connects to the database (because connection usually happens
> as part of the first SQL statement run).
>
> Are things any different if you change the sqlite3_wal_checkpoint()
> to sqlite3_exec(conn, "PRAGMA wal_checkpoint", 0, 0, 0)?
>
> Dan.
>
> > #include "sqlite3.h"
> > #include "stdio.h"
> > #include "stdlib.h"
> > #include "fcntl.h"
> >
> > static void sql_exec(sqlite3 *conn, char *query)
> > {
> >    char *err;
> >    if (sqlite3_exec(conn, query, NULL, 0, &err))
> >    {
> >        printf("sqlite: failed exec %s. err: %s\n", query, err);
> > exit(1);
> >    }
> > }
> >
> > static sqlite3 *sql_open_conn(void)
> > {
> >    sqlite3 *conn;
> >    if (sqlite3_open_v2("test.db", &conn, SQLITE_OPEN_READWRITE, NULL))
> >    {
> > printf("sqlite3_open_v2 failed\n");
> > exit(1);
> >    }
> >    return conn;
> > }
> >
> > static int do_checkpoint()
> > {
> >    sqlite3 *conn;
> >    conn = sql_open_conn();
> >    if (sqlite3_wal_checkpoint(conn, NULL))
> >    {
> > printf("sqlite3_wal_autocheckpoint failed\n");
> > exit(1);
> >    }
> >    sqlite3_close(conn);
> > }
> >
> > int main(int argc, char **argv)
> > {
> >    char *err_msg = NULL;
> >    pthread_t thread;
> >    int fd, i;
> >    sqlite3 *conn;
> >    if (unlink("test.db") || unlink("test.db-wal"))
> >    {
> > printf("failed unlink test.db\n");
> > exit(1);
> >    }
> >    fd = open("test.db", O_CREAT|O_RDWR, 0666);
> >    if (fd<0)
> >    {
> >        printf("could not open test.db\n");
> >        exit(1);
> >    }
> >    close(fd);
> >    conn = sql_open_conn();
> >    sql_exec(conn, "PRAGMA journal_mode=WAL");
> >    sql_exec(conn, "PRAGMA synchronous=normal");
> >    sql_exec(conn, "PRAGMA temp_store=memory");
> >    sql_exec(conn, "PRAGMA wal_autocheckpoint=-1");
> >    sql_exec(conn, "create table tbl1 (one varchar(20), two
> > varchar(20))");
> >    while (1)
> >    {
> >        if (!(i++%1000))
> >    do_checkpoint();
> > sql_exec(conn, "INSERT INTO tbl1 values('aaaaaaaaaaaaaaaaaaa', "
> >    "'bbbbbbbbbbbbbbbbbbb')");
> >    }
> >    sqlite3_close(conn);
> >    return 0;
> > }
> >
> > On Tue, Aug 10, 2010 at 1:52 PM, Dan Kennedy <danielk1...@gmail.com>
> > wrote:
> >
> >>
> >>
> >>> Hi,
> >>> I just wanted to add that I changed the program a little bit to not
> >>> use
> >>> transactions and threads, and I still get the same problem (huge WAL
> >>> file).
> >>> All I do is endless loop of insert, and every X insert, I perform a
> >>> checkpoint on another sqlite connection (but in the same thread).
> >>> It only worked if I do the checkpoint on the same connection.
> >>
> >> You cannot run a checkpoint from within a transaction. If
> >> you are in shared-cache mode, this means you cannot run a
> >> checkpoint while any connection to the same database has
> >> an open transaction.
> >>
> >> Does that explain anything?
> >>
> >> Dan.
> >>
> >> _______________________________________________
> >> 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
>
> _______________________________________________
> 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