You are not logged in.
Pages: 1
Hello,
I use these procedures in order to load/save an in memory SQLite3 database from/to an encrypted file with ECC.
Maybe it could be useful for someone...
uses SynSQLite3...
procedure SQLite3_SaveToStream(pcDB : TSQLite3DB; pcStream : TStream);
var
vSize : Int64;
vMemory : Pointer;
begin
// Database must be opened before calling
vMemory := nil;
try //-> finally
vMemory := sqlite3.serialize(pcDB, 'main', @vSize, 0);
if not Assigned(vMemory) then
begin
raise Exception.Create('memory allocation error');
end;
pcStream.WriteBuffer(vMemory^, vSize);
finally
if Assigned(vMemory) then
begin
sqlite3.free_(vMemory);
end;
end;
end;
procedure SQLite3_LoadFromStream(pcDB : TSQLite3DB; pcStream : TStream);
const
SQLITE_DESERIALIZE_FREEONCLOSE = 1; // Call sqlite3_free() on close
SQLITE_DESERIALIZE_RESIZEABLE = 2; // Resize using sqlite3_realloc64()
SQLITE_DESERIALIZE_READONLY = 4; // Database is read-only
var
vSize : Int64;
vMemory : Pointer;
vMemoryFree : Boolean;
vFile : TFileStream;
begin
// Database must be opened before calling
vMemory := nil;
vMemoryFree := False;
try //-> finally
vSize := pcStream.Size;
if (vSize <= 0) then
begin
raise Exception.Create('incorrect stream size');
end;
vMemory := sqlite3.malloc(vSize);
if (vMemory = nil) then
begin
raise Exception.Create('memory allocation error');
end;
vMemoryFree := True;
pcStream.ReadBuffer(vMemory^, vSize);
vMemoryFree := False;
if Integer
(
sqlite3.deserialize
(
pcDB,
'main',
vMemory,
vSize,
vSize,
(SQLITE_DESERIALIZE_FREEONCLOSE or SQLITE_DESERIALIZE_RESIZEABLE),
)
)
<>
0
then
begin
raise Exception.Create('deserialize error');
end;
finally
if (vMemoryFree = True) then
begin
if Assigned(vMemory) then
begin
sqlite3.free_(vMemory);
end;
end;
end;
end;
Offline
Pages: 1