Autor Téma: SQLite TFDSQLiteFunction - využitie globálnej premennej  (Přečteno 7252 krát)

99213

  • Host
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #15 kdy: 12-03-2018, 11:51:49 »
Hm, nejspis jsem se tady spletl a Delphi implementaci krivdim. sqlite3_user_data sice vyzaduje sqlite3_context, ale vracet bude pointer ktery byl predany sqlite3_create_function, takze to vypada na neschopnost SQLite definovat per kontext aplikacni data.
« Poslední změna: 12-03-2018, 11:53:47 od 99213 »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #16 kdy: 12-03-2018, 13:49:00 »
B. Ak by niekto vedel, kde je zdokumentované všetko okolo praktického využitia SQLite/FireDAC funkcií, veľmi by ma to potešilo. Docwiki mám prelezenú 100x, ale tieto veci tam nevidím.
Takovehle zalezistosti se vzdycky hledaly ve zdrojovkach

Offline miroB

  • Guru
  • *****
  • Příspěvků: 652
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #17 kdy: 12-03-2018, 15:28:18 »
B. Ak by niekto vedel, kde je zdokumentované všetko okolo praktického využitia SQLite/FireDAC funkcií, veľmi by ma to potešilo. Docwiki mám prelezenú 100x, ale tieto veci tam nevidím.
Takovehle zalezistosti se vzdycky hledaly ve zdrojovkach
Áno, o to som sa tiež pokúšal, ale moc mi to nešlo. Rozhodne by sa zišli nejaké príklady.
AUserData som napríklad skúšal ako prvé, ale výsledok ma nepotešil. Ako vyššie píše Delfin, ten parameter sa moc nedá využiť.
Naopak skvelé riešenie je s využitím AOutput.Handle. Ale na to by som sám neprišiel.

99216

  • Host
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #18 kdy: 12-03-2018, 20:43:56 »
B. Ak by niekto vedel, kde je zdokumentované všetko okolo praktického využitia SQLite/FireDAC funkcií, veľmi by ma to potešilo. Docwiki mám prelezenú 100x, ale tieto veci tam nevidím.
Takovehle zalezistosti se vzdycky hledaly ve zdrojovkach

To ano, ale tady bys musel hledat az ve zdrojacich SQLite. I jejich dokumentace, byt je celkem dost detailne napsana, je na tuto informaci skoupa. Snad mozna zminka v tematu Setting The Result Of An SQL Function:

These functions work very much like the parameter binding family of functions used to bind values to host parameters in prepared statements. Refer to the SQL parameter documentation for additional information.

Ktera toho nerekne moc. Je ovsem logicke ze sqlite3_context musi byt pro kazde volani v ramci prikazu unikatni prave kvuli vraceni hodnot. Jinak by nebylo mozne volat stejnou funkci v ramci dotazu vice nez jednou. Je treba dodat, ze pro interni funkce pouziva SQLite stejny mechanismus jako pro UDF. No, a bez toho kontextoveho rozliseni by nebylo mozne volat ani interni funkce vice nez jednou.
« Poslední změna: 12-03-2018, 20:49:30 od 99216 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 652
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #19 kdy: 12-03-2018, 23:22:59 »
Kód: Delphi [Vybrat]
  1. ...
  2. procedure TForm1.FDSQLiteFunction1Finalize(AFunc: TSQLiteFunctionInstance; var AUserData: TObject);
  3. begin
  4.   FreeAndNil(AUserData);
  5. end;
Zdá sa, že FDSQLiteFunction1 svoju udalosť OnFinalize, ráči navštíviť iba v prípade, že je označená ako aggregate.
Alebo robím niekde chybu?
Použil som prakticky identický kód s tvojim príspevkom, ale finalize sa nevykonáva..

99218

  • Host
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #20 kdy: 13-03-2018, 06:50:19 »
Zdá sa, že FDSQLiteFunction1 svoju udalosť OnFinalize, ráči navštíviť iba v prípade, že je označená ako aggregate.
Alebo robím niekde chybu?
Použil som prakticky identický kód s tvojim príspevkom, ale finalize sa nevykonáva..

To je spravne chovani a spatny priklad z me strany. Ty AUserData objekty by se neuvolnily se skalarni funkci. Viz. Create Or Redefine SQL Functions:
Citace
The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are pointers to C-language functions that implement the SQL function or aggregate. A scalar SQL function requires an implementation of the xFunc callback only; NULL pointers must be passed as the xStep and xFinal parameters. An aggregate SQL function requires an implementation of xStep and xFinal and NULL pointer must be passed for xFunc. To delete an existing SQL function or aggregate, pass NULL pointers for all three function callbacks.

A protoze je udalost OnFinalize ve FireDAC povesena na xFinal callback, bude se spoustet jen pro agregatni funkce. On nejspis SQLite nenabizi jinou moznost. Ten mechanismus funguje tak, ze vytvoris UDF s definovanymi callbacky. A SQLite pak uz jen kompiluje SQL prikazy a pri prochazeni kurzorem vola ty callbacky. V pripade skalarnich funkci je k dispozici tedy jen xFunc callback, tj. ve FireDAC udalost OnCalculate.

Pro konstantni hodnoty parametru by bylo mozne definovat pomerne nestabilni cache objekty pomoci Function Auxiliary Data, to ale neni Tvuj pripad.

Omlouvam se za spatny priklad.