Hello,

I have the following scenario: I need to "clear"/"initialize" a db file
while potential readers are active (polling for data).
The "normal" way to do it is begin a transaction, drop all tables, recreate
tables, commit (vacuum to regain space).

The biggest problem is that dropping a "very large" table (many GB) takes a
lot of time.
I could very well delete the file, but that fails if any reader has it open.

I tried with
delete from sqlite_master where type in ("table","view","index")
(of course after setting writable schema)
This works very fast, but I have a different problem...
I can't recreate tables because it looks like sqlite still knows about them
?? Even if "select * from sqlite_master" returns nothing??

Dropping takes the same long time as originally did...

It WORKS if I do a "vacuum" first, but it won't work inside a transaction...
I had to wrap everything in a transaction to block readers seeing an
"empty" file. Therefore I also can't close/reopen etc...

Test this from shell in a test db:

<Code>
create table test(a);
insert into test values(1);

select * from sqlite_master;

pragma writable_schema=1;
delete from sqlite_master where type="table";
pragma writable_schema=0;

select * from sqlite_master;

create table test(b);

vacuum;
create table test(b);
</Code>

How can I solve this??

Any help appreciated.
Gabriel
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to