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:
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 :-)