Remove operation help.
[anna.git] / include / anna / dbos / Accesor.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_dbos_Accesor_hpp
10 #define anna_dbos_Accesor_hpp
11
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/mt/Mutex.hpp>
14
15 #include <anna/dbms/DatabaseException.hpp>
16
17 #include <anna/dbos/defines.hpp>
18
19 namespace anna {
20
21 namespace dbms {
22 class Database;
23 class Connection;
24 class Statement;
25 }
26
27 namespace dbos {
28
29 class StorageArea;
30
31 /**
32    Interfaz que deben cumplir los objetos encargados de acceder al objeto del medio fisico,
33    que normalmente sera alguna base de datos.
34 */
35 class Accesor : public Mutex {
36 public:
37   typedef short Id; /**< Permite identificar el tipo de accesor. */
38
39   /**
40      Destructor.
41   */
42   virtual ~Accesor();
43
44   /**
45      Devuelve el identificador de este accesor.
46      \return El identificador de este accesor.
47   */
48   Id getId() const throw() { return a_id; }
49
50   /**
51      Devuelve la instancia de la sentencia \em statement asociada a este cargador.
52      \return La instancia de la sentencia \em statement asociada a este cargador. Puede ser NULL.
53   */
54   dbms::Statement* getStatement()
55   throw(RuntimeException) {
56     return (a_statement == NULL && a_database != NULL) ? (a_statement = initialize(*a_database)) : a_statement;
57   }
58
59   /**
60    * Devuelve \em true si el accesor fue inicializado con base de datos o \em false en otro caso.
61    * \return \em true si el accesor fue inicializado con base de datos o \em false en otro caso.
62    */
63   bool hasDataBase() const throw() { return a_database != NULL; }
64
65   /**
66      Devuelve la instancia de la base de datos asociada a este cargador.
67      \return La instancia de la base de datos asociada a este cargador.
68
69      \warning Si el accesor fue inicializado sin base de datos lo resultados no están definidos.
70   */
71   dbms::Database& getDatabase() throw() { return *a_database; }
72
73   /**
74      Devuelve la conexion que esta usando actualmente este cargador.
75      \return la conexion que esta usando actualmente este cargador.
76   */
77   dbms::Connection& getConnection() throw(RuntimeException) {
78     if(a_connection == NULL) {
79       std::string msg(asString());
80       msg += " | No available database connection";
81       throw RuntimeException(msg, ANNA_FILE_LOCATION);
82     }
83
84     return *a_connection;
85   }
86
87   /**
88      Devuelve la representacion en forma de cadena de la clave primaria establecida.
89      @return La representacion en forma de cadena de la clave primaria establecida.
90   */
91   virtual std::string asString() const throw() = 0;
92
93   /**
94      Metodo de debemos re-escribir para devolver el nombre completo del selector de recursos.
95      Para evitar ambigüedades este nombre deberia incluir la lista completa de \em namespaces
96      a la que pertenece la clase.
97      \return Una cadena con el nombre de este selector.
98   */
99   virtual const char* getClassName() const throw() = 0;
100
101 protected:
102   /**
103      Constructor.
104      \param database Base de datos asociada a este cargador y que deberia servir para
105      obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
106      \param id Identificador de este accesor.
107   */
108   Accesor(dbms::Database& database, const Id id) :
109     a_database(&database),
110     a_id(id),
111     a_statement(NULL),
112     a_connection(NULL),
113     a_emodeIsNull(true)
114   {;}
115
116   /**
117      Constructor.
118      \param database Base de datos asociada a este cargador y que deberia servir para
119      obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
120      \param id Identificador de este accesor.
121      \param emode Modo de actuar en caso de no encontrar el dato buscado.
122   */
123   Accesor(dbms::Database& database, const Id id, const Exception::Mode::_v emode) :
124     a_database(&database),
125     a_id(id),
126     a_statement(NULL),
127     a_connection(NULL),
128     a_emodeIsNull(false),
129     a_exceptionMode(emode)
130   {;}
131
132   /**
133      Constructor.
134      \param id Identificador de este accesor.
135   */
136   Accesor(const Id id) :
137     a_database(NULL),
138     a_id(id),
139     a_statement(NULL),
140     a_connection(NULL),
141     a_emodeIsNull(true)
142   {;}
143
144   /**
145      Metodo que deben implementar todos los accesores para definir la sentencia
146      SQL que los definira.
147      Se invocara automaticamente desde el nucleo de anna.dbos la primera vez que
148      se use este accesor, de forma que el programador solo debe preocuparse por
149      definir este metodo.
150      \param database Instancia de la base de datos indicada en el constructor.
151   */
152   virtual dbms::Statement* initialize(dbms::Database& database) throw(RuntimeException) = 0;
153
154 private:
155   dbms::Database* a_database;
156   const Id a_id;
157   dbms::Statement* a_statement;
158   dbms::Connection* a_connection;
159   bool a_emodeIsNull;
160   Exception::Mode::_v a_exceptionMode;
161
162   void setStatement(dbms::Statement* statement) throw() { a_statement = statement; }
163
164   virtual bool load(dbms::Connection*, const StorageArea*) throw(RuntimeException, dbms::DatabaseException);
165
166   friend class StorageArea;
167 };
168
169 }
170 }
171
172 #endif
173
174
175