SQLite Forum

Lua db:close deletes WAL file
Login
I have a question concerning SQLite & Lua. Basically i'm trying to use SQLite in WAL mode in my Android app. However if i perform a particular set of operations with database from my Lua script, it deletes `-wal` file. It leads to the problem: some of my transactions could be lost if the device loses power, and i don't have opportunity to close DB connection properly. The flow is attached in picture below. 
[![The process flow][1]][1]

Database opened this way (c++):
`int32 rcOpen = sqlite3_open(filename.c_str(), &handle);`

Also, after connection opened, i use this `pragma`'s
```
PRAGMA journal_mode=WAL;
PRAGMA synchronous=FULL;
```
More details:

 - I do manually commit transactions by `BEGIN TRANSACTION;` + `END TRANSACTION;`. I check if transactions have been commited via registered `sqlite_wal_hook`, which shows that number of pages in WAL file increases after INSERT. However i am not sure what happens to transactions that are transferred from WAL file to main DB file during checkpoint.
 - After Lua DB connection closed, there is STILL one c++ connection that is opened, so there is no reason to delete WAL file.
 - If i do db:close straight after sqlite3.open, without extra action between them - WAL file is not deleted
 - Also tried `PRAGMA synchronous=EXTRA + PRAGMA locking_mode=EXCLUSIVE` - didn't make any difference
 - Also tried using file controle mode `SQLITE_FCNTL_PERSIST_WAL` - didn't make any difference either
```
int enabled = 1;
int rcControl = sqlite3_file_control(handle, "main", SQLITE_FCNTL_PERSIST_WAL, &enabled);
```

Stack: android 7 (fs ext4) - JNI (NDK 21.4.7075529) - c++ 11 - sqlite 3.27.2 - lua 5.3.4 - lsqlite3complete 0.9.5

The lua script i use for reproducing the problem:

```
function prequire(name)
    local status, lib = pcall(require, name)
    if(status) then return lib end
    --Library failed to load
    return nil
end

print("start lua")

local sqlite3 = prequire("lsqlite3complete")
if sqlite3 == nil then
    print('No lsqlite3')
    return
end

local db = sqlite3.open('/data/data/ru.chromesearcher.sqlitewal/files/database.sqlite3')
if db == nil then
    print("db open failed")
    return
end


print("query start")

local stmt = db:prepare('SELECT * FROM paymentevents where pe_amount=?')
local amount = 3000
stmt:bind_values(amount)
stmt:finalize()

db:close()
```


  [1]: https://i.stack.imgur.com/8rFsj.jpg