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

99604

  • Host
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 99604 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
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áž »

99606

  • Host
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 99606 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
Re:SQLite: TFDSQLiteFunction využitie parametra Aggregated
« Odpověď #18 kdy: 06-04-2018, 19:21:13 »
Dik, idem vyskusat tvoj navrh.

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
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;

99610

  • Host
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:

[quote  link=topic=16094.msg99528#msg99528 date=1522256843]
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).
[/quote]

Offline miroB

  • Guru
  • *****
  • Příspěvků: 653
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S, D12.2
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..

99612

  • Host
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.