1 // ANNA - Anna is Not Nothingness Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // http://redmine.teslayout.com/projects/anna-suite
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of the copyright holder nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #include <anna/core/tracing/Logger.hpp>
39 #include <anna/dbms/Database.hpp>
40 #include <anna/dbms/Connection.hpp>
41 #include <anna/dbms/Statement.hpp>
42 #include <anna/dbms/ResultCode.hpp>
44 #include <anna/dbos/Accesor.hpp>
45 #include <anna/dbos/StorageArea.hpp>
51 dbos::Accesor::~Accesor() {
52 if(a_statement != NULL && a_database != NULL)
53 a_database->releaseStatement(a_statement);
56 //------------------------------------------------------------------------------------------
57 // Transfiere la informacion del medio fisico al 'Loader' concreto.
59 // (1) Ojo!! Ejecuta la sentencia SQL y carga el primer registro en el area de intercambio
60 // Slo habr�que invocar al 'fetch' para coger los siguientes registros'
61 //------------------------------------------------------------------------------------------
62 bool dbos::Accesor::load(dbms::Connection* connection, const dbos::StorageArea* ssaa)
63 throw(RuntimeException, dbms::DatabaseException) {
66 if(connection == NULL) {
67 std::string msg(ssaa->asString());
70 msg += " | Cannot execute this method with dbms::Connection == NULL";
71 throw RuntimeException(msg, ANNA_FILE_LOCATION);
74 dbms::Statement* statement(getStatement());
76 if(statement == NULL) {
77 std::string msg(ssaa->asString());
80 msg += " | Has no SQL sentence associated";
81 throw RuntimeException(msg, ANNA_FILE_LOCATION);
85 string msg("dbos::Accesor::load | ");
86 msg += ssaa->asString();
89 Logger::debug(msg, ANNA_FILE_LOCATION);
91 dbms::ResultCode resultCode = connection->execute(statement); // (1)
93 if(resultCode.notFound() == true) {
94 if(a_emodeIsNull == true) {
95 if(ssaa->getErrorCode() != StorageArea::NoExceptionWhenNotFound) {
96 std::string msg(ssaa->asString());
99 msg += " | Register not found";
100 RuntimeException ex(msg, ANNA_FILE_LOCATION);
101 ex.setErrorCode(ssaa->getErrorCode());
106 std::string msg(ssaa->asString());
109 msg += " | Register not found";
111 if(a_exceptionMode == Exception::Mode::Ignore) {
112 Logger::debug(msg, ANNA_FILE_LOCATION);
116 if(a_exceptionMode == Exception::Mode::Throw) {
117 RuntimeException ex(msg, ANNA_FILE_LOCATION);
118 ex.setErrorCode(ssaa->getErrorCode());
120 } else if(Logger::isActive(Logger::Warning)) {
121 Logger::warning(msg, ANNA_FILE_LOCATION);
126 if(resultCode.successful() == false) {
127 string msg(ssaa->getName());
130 throw dbms::DatabaseException(msg, resultCode, ANNA_FILE_LOCATION);
133 return statement->fetch();