Autor Téma: FireBird 3 embedded na Androidu  (Přečteno 60 krát)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
FireBird 3 embedded na Androidu
« kdy: 11-09-2019, 14:12:28 »
Ahoj,

nezkoušeli jste někdo Firebird 3 embedded na Androidu? Něco dělám evidentně špatně, ne a ne fungovat (píše, že se nemůže připojit k localhost, tj. nějak nechápe, že má být embedded, i když cesta k souboru je jen "Pokus.fdb" a server žádný)... K Firebird serveru na počítači se připojím, ale ta embedded verze mi fungovat nechce...

Díky za případné nasměrování...

K.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:FireBird 3 embedded na Androidu
« Odpověď #1 kdy: Dnes v 12:38:13 »
Tak kdyby to někdy někdo (třeba já...) hledal:

- deployment: soubory z FB, FB\intl, FB\lib, FB\plugins a FB\UDF se musí dát do assets\internal\fb\, assets\internal\fb\intl\, assets\internal\fb\lib, assets\internal\fb\plugins a assets\internal\fb\UDF\ (některé z nich možná nejsou potřeba). Soubor libfbclient.so.3.0.4 přitom dávám do cíle pod jménem libfbclient.so.

- kopie klienta jinam: soubory v assets jsou prý ve skutečnosti v nějakém jednom komprimovaném souboru, odkud sice jdou otevřít pro čtení, ale nejdou otevřít pro načtení .so. Takže za běhu aplikace vše zkopíruji ze složky IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(tPath.GetDocumentsPath)+'fb')+'intl' do složky IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(tPath.GetHomePath)+'fbx')+'intl' apod., takže vzniknou "normální" soubory. Pro tu embedded verzi je zásadní plugins\libEngine12.so, ale i ty ostatní asi jsou občas potřeba. Zásadní je dodržet strukturu složek, bohužel nestačí to vše dát do jedné složky. Nemám moc jasno v tom, zda je správnější zapisovat do GetHomePath nebo GetDocumentsPath, na Androidu mi to ale ukazuje do stejného místa.

- lock directory: aby se předešlo chybě "Project Test45.apk raised exception class EIBInterBaseError with message 'Can not access lock files directory /data/local/tmp/firebird/'.", je potřeba něco jako:
Kód: [Vybrat]
function SetEnvironmentVariable(Name:string; Value:string): boolean;
 begin
 result:=false;
 if Value='' then begin
  if unsetenv(MarshaledAstring(UTF8String(Name)))=0 then result:=true;
 end else begin
  if setenv(MarshaledAstring(UTF8String(Name)), MarshaledAstring(UTF8String(Value)), 1)=0 then result:=true;
 end;
end;

...
 TmpDir:=tPath.Combine(tPath.GetTempPath, 'firebird_' + GetEnvironmentVariable('USER'));
 if GetEnvironmentVariable('FIREBIRD_TMP')='' then begin
  ForceDirectories(TmpDir);
  SetEnvironmentVariable('FIREBIRD_TMP', TmpDir);
 end;
 if GetEnvironmentVariable('FIREBIRD_LOCK')='' then begin
  ForceDirectories(TmpDir);
  SetEnvironmentVariable('FIREBIRD_LOCK', TmpDir);
 end;

- klientská knihovna se pak načítá z  IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(tPath.GetHomePath)+'fbx')+'lib')+'libfbclient.so';

S takto připraveným klientem se dá připojit k Firebird serveru a dá se i pracovat v embedded režimu.

Náměty na vylepšení uvítám :-)