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

Online miroB

  • Hrdina
  • ****
  • Příspěvků: 382
  • Karma: 14
    • 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 »

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1470
  • Karma: 60
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite: TFDSQLiteFunction - rozne instancie tej istej funkcie
« Odpověď #1 kdy: 17-01-2019, 01:45:47 »
SQLite nema informace o handle SQL prikazu jenz ji vola, stejne tak jako nevi kolik volani vypocetniho callbacku bude dale nasledovat. A tudiz neni mozne spravovat zivotnost objektu pro konkretni instanci SQL prikazu z udalosti vypocetniho callbacku.

Dodavam pro ostatni ctenare, vyreseno privatne pres Skype...
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):