--- /dev/null
+// 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 <anna/dbms/Database.hpp>
+#include <anna/dbms/DatabaseException.hpp>
+
+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