2012-06-04 4 views
5

Come posso memorizzare, ad esempio, il corpo di un metodo in un database e successivamente eseguirlo? (Sto usando Delphi XE2, forse RTTI sarebbe d'aiuto.)Come posso eseguire il codice memorizzato in un database?

+4

Inserire il codice in una DLL. –

+1

@DavidHeffernan E memorizzare la DLL nel database? ;) – GolezTrol

+6

Hai considerato l'utilizzo di un motore di scripting per questa attività? – Linas

risposta

6

RTTI non è un interprete di lingua completa. Delphi è un linguaggio compilato. Lo scrivi, lo compila e distribuisci solo i tuoi binari. A meno che tu non sia Embarcadero, non hai i diritti per distribuire DCC32 (il compilatore della riga di comando).

Tuttavia, lo JVCL include un sottoinsieme di linguaggio delphi racchiuso in un componente molto facile da usare, chiamato "JvInterpreter". Potresti scrivere del codice (come pascal) e metterlo in un database. Potresti quindi "eseguire quel codice" (interpretato, non compilato) che estrai dal database. In genere, queste dovrebbero essere procedure che chiamano metodi nel codice. Dovrai scrivere alcuni "wrapper" che espongono le API compilate che desideri esporre all'interprete (fornire accesso a dati in tempo reale, oggetti di connessione al database o oggetti table/query). Stai pensando che questo suoni perfetto, vero? Bene, è una trappola.

Attenzione a qualcosa chiamato "the configuration complexity clock". Hai appena raggiunto le 9, ed è qui che inizia un sacco di dolore e sofferenza. Proprio come quando hai un problema, e lo risolvi con espressioni regolari, e "ora hai due problemi", aggiungere script e DSL alla tua app ha un modo di risolvere un problema e crearne altri.

Mentre penso che l'idea "DLL archiviata in un campo di blob del database" sia malvagia e assurda, penso che l'aggiunta sfrenata di script e linguaggi specifici del dominio alle applicazioni richieda anche molto dolore. Chiediti prima se qualche altra soluzione più semplice potrebbe funzionare. Quindi applica il principio YAGNI (non ne hai bisogno) e KISS (keep-it-simple-smartguy).

Pensa due volte prima di implementare qualcosa come quello che stai chiedendo di fare nella tua domanda.

+0

si prega di citare correttamente: KISS = mantenerlo semplice stupido ;-) – dummzeuch

+1

Sono abbastanza sicuro che Warren conosca il significato esatto. Sembra meno scortese in questo modo. –

+0

Leonardo sta prendendo piede. –

2

La tua migliore opzione, IMHO, utilizza un motore di scripting e memorizza gli script nel database.

In alternativa è possibile inserire il codice in una DLL e inserire tale DLL nel database. C'è un codice per caricare una DLL da una risorsa in ram e elaborarla in modo che possa essere utilizzata come se fosse stata caricata usando LoadLibrary, ad es. in dzlib. Non so davvero se funziona con qualsiasi DLL e in quali versioni di Windows, ma con quelle che ho provato.