Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Deel:
Meldingen
Alles wissen

[Opgelost] Lazarus - Lees user_version van SQLite3 database zonder library

1 Berichten
1 Gebruikers
0 Reactions
1,771 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

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; 


   
BeantwoordenCiteren
Deel: