Autor Téma: SQLite: TFDSQLiteFunction využitie parametra Aggregated  (Přečteno 1409 krát)

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1214
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #15 kdy: 06-04-2018, 19:00:42 »
Excellent
Rated 1 time
Tady je ukazka (samozrejme musis pouzit navrzeny fix pro korektni predani handle kontextu finalizacniho callbacku o kterem jsem psal par prispevku nazpet). Promenna StepCtx pak bude pri finalizaci obsahovat kontext handle krokoveho callbacku (ktery pouzivas jako klic ve svem dictionary):

Kód: Delphi [Vybrat]
  1. uses
  2.   FireDAC.Phys.SQLiteCli;
  3.  
  4. procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs;
  5.   AOutput: TSQLiteOutput; var AUserData: TObject);
  6. var
  7.   DataCtx: Pointer;
  8.   StepCtx: psqlite3_context;
  9. begin
  10.   StepCtx := AOutput.Handle;
  11.   DataCtx := sqlite3_aggregate_context(AOutput.Handle, SizeOf(NativeUInt));
  12.   if Assigned(DataCtx) then
  13.     PNativeUInt(DataCtx)^ := NativeUInt(StepCtx);
  14. end;
  15.  
  16. procedure TForm1.FDSQLiteFunction1Finalize(AFunc: TSQLiteFunctionInstance; var AUserData: TObject);
  17. var
  18.   DataCtx: Pointer;
  19.   StepCtx: psqlite3_context;
  20. begin
  21.   StepCtx := nil;
  22.   DataCtx := sqlite3_aggregate_context(AFunc.Output.Handle, 0);
  23.   if Assigned(DataCtx) then
  24.     StepCtx := psqlite3_context(DataCtx^);
  25. end;
« Poslední změna: 06-04-2018, 19:14:05 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #16 kdy: 06-04-2018, 19:13:35 »
Aha, poslal si navrh riesenia tesne pred touto mojou spravou.
Idem to skusit.
.. Napad je pouzit agregacni kontext pro predani krokoveho kontext handle. V krokovem callbacku alokujes blok o velikosti sqlite3_context a ulozis do nej krokovy kontext handle. V dictionary ulozis ten samy handle a pocitas. No a ve finalizacnim callbacku si vyptas ten blok dat s krokovym kontext handle, najdes v dictionary vysledek a ten predas.
Vo finalizacnom callbacku nemam sancu zistit krokovy kontext handle. Aj ked si ho ulozim do dictionary, pretoze vo finalizacnom callback-u sa vyskytuje len finalizacny handle, pretoze sme ho tam priradili v tomto:
Kód: Delphi [Vybrat]
  1. procedure TSQLiteFunctionInstance.DoFinalize(context: psqlite3_context);
  2. begin
  3.   FOutput.Handle    := context;        // je treba uchovat kontext, jinak nebude mozne vratit hodnotu
  4.   Func.DoFinalize(Self);
  5. end;
« Poslední změna: 06-04-2018, 19:19:38 od Miroslav Baláž »

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1214
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #17 kdy: 06-04-2018, 19:16:43 »
Vo finalizacnom callbacku nemam sancu zistit krokovy kontext handle.

To prave ze nemusis. Funkce sqlite3_aggregate_context ma jako prvni parametr kontext handle. Pokud ji volas v krokovem callbacku, pouzijes krokovy handle, pokud ve finalizacnim, pouzijes finalizacni handle. V obou pripadech vrati ukazatel na blok pameti ktery se alokoval pri prvnim jejim volani v krokovem callbacku.

A to je nejspis jediny zpusob jakym si predavat data mezi tema dvema callbacky pri nutnosti rozlisit instance funkci.
« Poslední změna: 06-04-2018, 19:20:33 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #18 kdy: 06-04-2018, 19:21:13 »
Dik, idem vyskusat tvoj navrh.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #19 kdy: 06-04-2018, 19:46:59 »
Toto funguje bezvadne. Prikladám obrázok kontrolných výsledkov. Díky moc.
Tady je ukazka (samozrejme musis pouzit navrzeny fix pro korektni predani handle kontextu finalizacniho callbacku o kterem jsem psal par prispevku nazpet). Promenna StepCtx pak bude pri finalizaci obsahovat kontext handle krokoveho callbacku (ktery pouzivas jako klic ve svem dictionary):

Kód: Delphi [Vybrat]
  1. uses
  2.   FireDAC.Phys.SQLiteCli;
  3.  
  4. procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs;
  5.   AOutput: TSQLiteOutput; var AUserData: TObject);
  6. var
  7.   DataCtx: Pointer;
  8.   StepCtx: psqlite3_context;
  9. begin
  10.   StepCtx := AOutput.Handle;
  11.   DataCtx := sqlite3_aggregate_context(AOutput.Handle, SizeOf(NativeUInt));
  12.   if Assigned(DataCtx) then
  13.     PNativeUInt(DataCtx)^ := NativeUInt(StepCtx);
  14. end;
  15.  
  16. procedure TForm1.FDSQLiteFunction1Finalize(AFunc: TSQLiteFunctionInstance; var AUserData: TObject);
  17. var
  18.   DataCtx: Pointer;
  19.   StepCtx: psqlite3_context;
  20. begin
  21.   StepCtx := nil;
  22.   DataCtx := sqlite3_aggregate_context(AFunc.Output.Handle, 0);
  23.   if Assigned(DataCtx) then
  24.     StepCtx := psqlite3_context(DataCtx^);
  25. end;

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1214
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #20 kdy: 06-04-2018, 19:49:25 »
Neni zac! ;) Btw. uz jsem o tom predavani agregacniho kontextu i psal:

Zkousel jsem predani agregacniho kontextu (uzivatelska data alokovana SQLite pomoci funkce sqlite3_aggregate_context) a predani probehne spravne, cili ty ruzne kontexty mezi kalkulaci a finalizaci jsou ze strany SQLite umyslem. Jen se na to nemyslelo ve FireDAC (nejspis nikdo netestoval).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #21 kdy: 06-04-2018, 19:51:16 »
Neni zac! ;) Btw. uz jsem o tom predavani agregacniho kontextu i psal:

Zkousel jsem predani agregacniho kontextu (uzivatelska data alokovana SQLite pomoci funkce sqlite3_aggregate_context) a predani probehne spravne, cili ty ruzne kontexty mezi kalkulaci a finalizaci jsou ze strany SQLite umyslem. Jen se na to nemyslelo ve FireDAC (nejspis nikdo netestoval).
Tak to sa teda cudujem, ze nikto nepotreboval a netestoval, lebo FireDAC tu nie je tyzden, ani mesiac..

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1214
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #22 kdy: 06-04-2018, 19:58:44 »
Tak to sa teda cudujem, ze nikto nepotreboval a netestoval, lebo FireDAC tu nie je tyzden, ani mesiac..

Nic noveho ::) Alespon ze ten report predali bez zbytecneho vyptavani Internal Dev tymu. Pamatuju si jak v minulosti nejaky (mozna fiktivni) Japonec skoro ke kazdemu reportu pozadoval prilozit ukazkovy projekt.
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.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: