Autor Téma: SQLite: TFDSQLiteFunction - rozne instancie tej istej funkcie  (Přečteno 685 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 516
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Ide o tému: Uchovávanie hodnôt pri volaní UDF SQLite.
Riešili sme to s Delfínom tu :
https://forum.delphi.cz/index.php/topic,16066.msg99213.html#msg99213
A skoro dotiahli do ideálneho konca.. Ale je tu stále jeden problém.
Pre opakované spustenie query, bez prerušenia/zhodenia programu, nie som schopný zabezpečiť, aby sa resetovala premenná AUserData.
Otázne je, kde môžem spraviť toto:
Kód: Delphi [Vybrat]
  1. AUserData :=nil;
Hlavne kde dá AUserData vynulovať po dobehnutí SQL príkazu.
OnFinalize samozrejme nefunguje pre bežnú funkciu. Funguje len pre agregačné f. Preto nepripadá do úvahy.
Pri vynulovaní AUserData by sa dal zrušiť aj pomocný TDictionary: TDictFn.
Podotýkam, že query môže v jednom SQL obsahovať aj viac volaní danej funkcie.
Preto je využitý dictionary. AUserData je využité ako smerník na neho.
AOutput.Handle rozlišuje jednotlivé inštancie funkcie pre jeden SQL príkaz.
Príklad viacero inštancií jednej funkcie v SQL:
Kód: MySQL [Vybrat]
  1. SELECT myFn( 5, 2 ), myFn( 6, 4 ) FROM myTable
Tu je princíp ako to zatiaľ funguje. Inak super!
Len potrebujem, aby som pre každé nové spustenie query získal AUserData==nil;
Kód: Delphi [Vybrat]
  1. procedure Tdm.myFuncCalculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);
  2. begin
  3.   if AUserData = nil then
  4.     begin
  5.     AUserData := TDictFn.Create; // Len raz, aj pre opakované použitie v jednom SQL
  6.     myObject := TMyObject.Create;
  7.     TDictFn( AUserData ).Add( AOutput.Handle, myObject );
  8.     {doSomething..}
  9.     end
  10.   else
  11.     begin
  12.     if TDictFn( AUserData ).TryGetValue( AOutput.Handle, myObject ) then
  13.       begin
  14.       {doSomething..}
  15.       end
  16.     else
  17.       begin
  18.       myObject := TMyObject.Create;
  19.       TDictFn( AUserData ).Add( AOutput.Handle, myObject );
  20.       {doSomething..}
  21.       end;
  22.    end;
  23. end;
« Poslední změna: 10-01-2019, 22:35:29 od miroB »