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

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
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 Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2232
  • Karma: 117
    • 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

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
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.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #18 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..

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite TFDSQLiteFunction - využitie globálnej premennej
« Odpověď #19 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.
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í:
Křestní jméno zpěváka Gotta: