Voor een project wilde ik de user_version van een database uitlezen, zonder gebruik te maken van de SQLite3 library.
SQLite3 doet zelf niks met deze waarde, en is bedoelt zodat een ontwikkelaar een versie nummer kan geven aan een database. (default waarde is 0)
Je zet deze waarde in SQL met "PRAGMA user_version=x;" waar "x" een integer is.
Je kunt het in SQL lezen met: "PRAGMA user_version;".
In de SQLite3 specificaties is deze waarde gedefinieerd als de integer bij offset 60 (de bytes 60, 61, 62 en 63 = integer) in de database file.
Dus ... even snel een functie gemaakt die hopelijk ook handig is voor anderen.
De return waarde (integer) is:
-1 : bestand bestaat niet
0 : user_version was nooit ingevuld
x : de waarde van user_version
De functie gebruikt de SysUtils functie:
{
Retrieve database user version value without using a library, this is a raw file read!
This value can be set in SQlite using "PRAGMA user_version=x" where x = integer.
}
function GetSQLite3Database_UserVersion(filename:string):integer;
var
FileHandle:THandle;
dbUserVersion:array [1..4] of byte;
const
SQLite3_ByteOffset_UserVersion = 60; // see:
begin
Result := -1;
if FileExists(filename) then
begin
FileHandle:=FileOpen(filename,fmOpenRead);
if FileHandle<>-1 then
begin
FileSeek(FileHandle,SQLite3_ByteOffset_UserVersion,fsFromBeginning);
FileRead(FileHandle,dbUserVersion[1],SizeOf(dbUserVersion));
FileClose(FileHandle);
Result := ( dbUserVersion[1]<<24 ) + ( dbUserVersion[2]<<16 ) + ( dbUserVersion[3]<<8 ) + dbUserVersion[4];
end;
end;
end;