X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdbms.oracle%2FDatabase.hpp;fp=include%2Fanna%2Fdbms.oracle%2FDatabase.hpp;h=39d9d5f3dcff6629cf79faadac960739f62f026d;hb=78be86969d2f26a9084b0c4af6ce43d5fa4ed3fd;hp=0000000000000000000000000000000000000000;hpb=a3b95648bd76140ef55e0b5941d423eee6c3856f;p=anna.git diff --git a/include/anna/dbms.oracle/Database.hpp b/include/anna/dbms.oracle/Database.hpp new file mode 100644 index 0000000..39d9d5f --- /dev/null +++ b/include/anna/dbms.oracle/Database.hpp @@ -0,0 +1,128 @@ +// 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_oracle_Database_hpp +#define anna_dbms_oracle_Database_hpp + +#include +#include + +struct OCIEnv; +struct OCIError; + +namespace anna { + +namespace dbms { + +namespace oracle { + +/** + Clase que modela la interaccion entre la RDMS Oracle (tm) y nuestra aplicacion. + + \warning La definicion conexiones y clusters debe hacerse antes de invocar al metodo Application::start, + o bien, en el metodo Application::initialize. +*/ +class Database : public dbms::Database { +public: + /** + Contructor. + \param dbmsName Nombre de la base de datos. + */ + Database(const char* dbmsName); + + /** + Contructor. + \param componentName Nombre logico de la base de datos por que el podemos buscar este compoenente. + \param dbmsName Nombre de la base de datos. + */ + Database(const char* componentName, const char* dbmsName); + + /** + Destructor. + */ + virtual ~Database(); + + /** + Devuelve el manejador de error asociado a esta base de datos. + \return El manejador de error asociado a esta base de datos. + */ + OCIError* getErrorHandler() throw() { return a_error; } + + /** + Operador de conversion. + \return El puntero al entorno asociado a esta base de datos. + */ + operator OCIEnv*() throw() { return a_env; } + + /** + Devuelve la cadena por la que podemos buscar el componente. + \return La cadena por la que podemos buscar el componente. + \see Application::find + */ + static const char* getClassName() { return "anna::dbms::oracle::Database"; } + + /** + * Devuelve el caracter usado como punto decimal, obtenido a partir de la configuraciĆ³n establecida + * por la variables de entorno, LANG, LC_NUMERIC, etc, etc. + * + * \return El caracter usado como punto decimal. + * + * \warning Metodo exclusivamente de uso interno. + */ + static char getDecimalPoint() throw() { return st_decimalPoint; } + +private: + OCIEnv* a_env; + OCIError* a_error; + + static char st_decimalPoint; + + void do_initialize() throw(RuntimeException); + + dbms::Connection* allocateConnection(const std::string& name, const char* user, const char* password) + throw(RuntimeException); + + dbms::Statement* allocateStatement(const char* name, const std::string& expression, const bool isCritical) + throw(RuntimeException); + + dbms::InputBind* allocateInputBind(const char* name, Data&) + throw(RuntimeException); + void deallocate(dbms::InputBind* inputBind) throw(); + + dbms::OutputBind* allocateOutputBind(const char* name, Data&) + throw(RuntimeException); + void deallocate(dbms::OutputBind* outputBind) throw(); + + static void initializeDecimalPoint() throw(RuntimeException); +}; + +#ifdef ANNA_RDBMS_TRACE +#define anna_dbms_oracle_check(a,error) \ + { \ + Logger::write (Logger::Debug, (#a), __FILE__, __LINE__); \ + const sword status = (a); \ + if (status != OCI_SUCCESS) { \ + anna::dbms::oracle::ResultCode resultCode (status, (error)); \ + throw DatabaseException (resultCode, __FILE__, __LINE__); \ + } \ + } +#else +#define anna_dbms_oracle_check(a,error) \ + { \ + const sword status = (a); \ + if (status != OCI_SUCCESS) { \ + anna::dbms::oracle::ResultCode resultCode (status, (error)); \ + throw DatabaseException (resultCode, __FILE__, __LINE__); \ + } \ + } +#endif +} +} +} + +#endif