X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdbms%2FStatementTranslator.hpp;fp=include%2Fanna%2Fdbms%2FStatementTranslator.hpp;h=8610aaa27d1a33d13cfe128125834cc624b10104;hb=78be86969d2f26a9084b0c4af6ce43d5fa4ed3fd;hp=0000000000000000000000000000000000000000;hpb=a3b95648bd76140ef55e0b5941d423eee6c3856f;p=anna.git diff --git a/include/anna/dbms/StatementTranslator.hpp b/include/anna/dbms/StatementTranslator.hpp new file mode 100644 index 0000000..8610aaa --- /dev/null +++ b/include/anna/dbms/StatementTranslator.hpp @@ -0,0 +1,86 @@ +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // + + +#ifndef anna_dbms_StatementTranslator_hpp +#define anna_dbms_StatementTranslator_hpp + +#include + +namespace anna { + +namespace dbms { + +class Database; + +/** + * Clase que ajustar de forma transparente las diferencias de tratamiento que tiene las + * sentencias SQL en los distintos motores de base de datos. De esta forma una aplicación + * originariamente escrita para un determinado RDBMS no tendrá que hacer ningún cambio + * en las sentencias SQL al cambiar a otro RDBMS. + * + * Por ejemplo para indicar los parámetros de entrada en Oracle se indica con un + * literal precedido de ':' o '&'. Con lo que la sentencia podría quedar como: + * \code + * insert into foo (field1, field2) values (:f1, :f2) + * \endcode + * + * En PosgreSQL (tambien sorpotado en Oracle) quedaría algo así: + * \code + * insert into foo (field1, field2) values (&f1, &f2) + * \endcode + * + * Mientras que en MySQL la expresión debería ser como: + * \code + * insert into foo (field1, field2) values (?, ?); + * \endcode + * + * \see anna::dbms::Database::setStatementTranslator + */ +class StatementTranslator { + /** + * Devuelve el nombre lógico de este traductor. + * \return el nombre lógico de este traductor. + */ + const char* getName() const throw() { return a_name; } + +protected: + /** + * Constructor. + * \param name Nombre lógico del traductor. + */ + explicit StatementTranslator(const char* name) : a_name(name) {;} + + /** + * Se invoca automáticamente desde anna::dbms::Database::createStatement si la + * instancia de la base de datos tiene asociada alguna instancia heredada de esta clase. + * + * Éste metodo sólo se invoca una vez para cada una de las sentencias definidas sobre + * la base de datos, por lo que la traducción de sentencias SQL tiene un consumo despreciable + * con respecto al tiempo total del proceso. + * + * \param statement Sentencia SQL original. + * \return La sentencia SQL correspondiente con la original, pero tratada para que + * pueda ser interpretada correctamente por el motor de base de datos sobre el que + * se va a ejecutar. + */ + virtual const char* apply(const char* statement) throw(RuntimeException) = 0; + +private: + const char* a_name; + + StatementTranslator(const StatementTranslator&); + + friend class Database; +}; + +} +} + +#endif + +