Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbms.oracle / Database.hpp
diff --git a/include/anna/dbms.oracle/Database.hpp b/include/anna/dbms.oracle/Database.hpp
new file mode 100644 (file)
index 0000000..39d9d5f
--- /dev/null
@@ -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 <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