--- /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 //
+
+
+#include <anna/core/tracing/Logger.hpp>
+
+#include <anna/dbms/Database.hpp>
+#include <anna/dbms/Connection.hpp>
+#include <anna/dbms/Statement.hpp>
+#include <anna/dbms/ResultCode.hpp>
+
+#include <anna/dbos/Accesor.hpp>
+#include <anna/dbos/StorageArea.hpp>
+
+using namespace std;
+using namespace anna;
+
+/*virtual*/
+dbos::Accesor::~Accesor() {
+ if(a_statement != NULL && a_database != NULL)
+ a_database->releaseStatement(a_statement);
+}
+
+//------------------------------------------------------------------------------------------
+// Transfiere la informacion del medio fisico al 'Loader' concreto.
+//
+// (1) Ojo!! Ejecuta la sentencia SQL y carga el primer registro en el area de intercambio
+// Slo habr�que invocar al 'fetch' para coger los siguientes registros'
+//------------------------------------------------------------------------------------------
+bool dbos::Accesor::load(dbms::Connection* connection, const dbos::StorageArea* ssaa)
+throw(RuntimeException, dbms::DatabaseException) {
+
+ if(connection == NULL) {
+ std::string msg(ssaa->asString());
+ msg += " | ";
+ msg += asString();
+ msg += " | Cannot execute this method with dbms::Connection == NULL";
+ throw RuntimeException(msg, ANNA_FILE_LOCATION);
+ }
+
+ dbms::Statement* statement(getStatement());
+
+ if(statement == NULL) {
+ std::string msg(ssaa->asString());
+ msg += " | ";
+ msg += asString();
+ msg += " | Has no SQL sentence associated";
+ throw RuntimeException(msg, ANNA_FILE_LOCATION);
+ }
+
+ LOGDEBUG(
+ string msg("dbos::Accesor::load | ");
+ msg += ssaa->asString();
+ msg += " | ";
+ msg += asString();
+ Logger::debug(msg, ANNA_FILE_LOCATION);
+ );
+ dbms::ResultCode resultCode = connection->execute(statement); // (1)
+
+ if(resultCode.notFound() == true) {
+ if(a_emodeIsNull == true) {
+ if(ssaa->getErrorCode() != StorageArea::NoExceptionWhenNotFound) {
+ std::string msg(ssaa->asString());
+ msg += " | ";
+ msg += asString();
+ msg += " | Register not found";
+ RuntimeException ex(msg, ANNA_FILE_LOCATION);
+ ex.setErrorCode(ssaa->getErrorCode());
+ throw ex;
+ } else
+ return false;
+ } else {
+ std::string msg(ssaa->asString());
+ msg += " | ";
+ msg += asString();
+ msg += " | Register not found";
+
+ if(a_exceptionMode == Exception::Mode::Ignore) {
+ Logger::debug(msg, ANNA_FILE_LOCATION);
+ return false;
+ }
+
+ if(a_exceptionMode == Exception::Mode::Throw) {
+ RuntimeException ex(msg, ANNA_FILE_LOCATION);
+ ex.setErrorCode(ssaa->getErrorCode());
+ throw ex;
+ } else if(Logger::isActive(Logger::Warning)) {
+ Logger::warning(msg, ANNA_FILE_LOCATION);
+ }
+ }
+ }
+
+ if(resultCode.successful() == false) {
+ string msg(ssaa->getName());
+ msg += " | ";
+ msg += asString();
+ throw dbms::DatabaseException(msg, resultCode, ANNA_FILE_LOCATION);
+ }
+
+ return statement->fetch();
+}