From bcae817215af4e85e3555d1a9df827ca1c88cf37 Mon Sep 17 00:00:00 2001 From: Paul Kulchenko Date: Mon, 28 Nov 2022 12:53:20 -0800 Subject: [PATCH] Update SQLite deserialize to allow resizing restored DB (#701) Using either option (FREEONCLOSE or RESIZEABLE) requires using sqlite3_malloc. Ref. #436 --- tool/net/demo/sql-backup.lua | 7 ++++++- tool/net/lsqlite3.c | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tool/net/demo/sql-backup.lua b/tool/net/demo/sql-backup.lua index e8dea9f54..77d6b93b9 100644 --- a/tool/net/demo/sql-backup.lua +++ b/tool/net/demo/sql-backup.lua @@ -7,7 +7,12 @@ backup = sqlite3.open_memory() buffer = LoadAsset("backup.sqlite3") backup:deserialize(buffer) +-- insert more values +for i = 1, 250 do + backup:exec("INSERT INTO test (content) VALUES ('Hello more')") +end + -- See .init.lua for CREATE TABLE setup. for row in backup:nrows("SELECT * FROM test") do Write(row.id.." "..row.content.."
") -end \ No newline at end of file +end diff --git a/tool/net/lsqlite3.c b/tool/net/lsqlite3.c index ff7485c6b..d03092136 100644 --- a/tool/net/lsqlite3.c +++ b/tool/net/lsqlite3.c @@ -1812,8 +1812,9 @@ static int db_deserialize(lua_State *L) { if (buffer == NULL || size == 0) /* ignore empty database content */ return 0; - sqlite3_deserialize(db->db, "main", buffer, size, size, 0); - free(buffer); + const char *sqlbuf = memcpy(sqlite3_malloc(size), buffer, size); + sqlite3_deserialize(db->db, "main", sqlbuf, size, size, + SQLITE_DESERIALIZE_FREEONCLOSE + SQLITE_DESERIALIZE_RESIZEABLE); return 0; }