Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / source / dbms.mysql / ResultCode.cpp
diff --git a/source/dbms.mysql/ResultCode.cpp b/source/dbms.mysql/ResultCode.cpp
new file mode 100644 (file)
index 0000000..c4e8f2d
--- /dev/null
@@ -0,0 +1,63 @@
+// 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 <mysql/mysql.h>
+#include <mysql/mysqld_error.h>
+#include <mysql/errmsg.h>
+
+#include <anna/config/defines.hpp>
+#include <anna/core/tracing/Logger.hpp>
+
+#include <anna/dbms.mysql/ResultCode.hpp>
+
+using namespace anna;
+using namespace anna::dbms;
+
+mysql::ResultCode::ErrorDecoder mysql::ResultCode::st_errorDecoder;
+
+mysql::ResultCode::ResultCode(st_mysql* _mysql) :
+  dbms::ResultCode(0, NULL, &st_errorDecoder) {
+  int errorCode = mysql_errno(_mysql);
+
+  if(errorCode != 0)
+    dbms::ResultCode::set(errorCode, mysql_error(_mysql));
+}
+
+mysql::ResultCode::ResultCode(st_mysql_stmt* stmt) :
+  dbms::ResultCode(0, NULL, &st_errorDecoder) {
+  int errorCode = mysql_stmt_errno(stmt);
+
+  if(errorCode != 0)
+    dbms::ResultCode::set(errorCode, mysql_stmt_error(stmt));
+}
+
+/*
+ * Códigos de error obtenidos de:
+ * http://dev.mysql.com/doc/refman/4.1/en/error-messages-client.html
+ */
+
+bool mysql::ResultCode::ErrorDecoder::notFound(const int errorCode) const
+throw() {
+  return errorCode == CR_NO_DATA;
+}
+
+bool mysql::ResultCode::ErrorDecoder::successful(const int errorCode) const
+throw() {
+  return errorCode == 0;
+}
+
+bool mysql::ResultCode::ErrorDecoder::locked(const int errorCode) const
+throw() {
+  return false; // No parece que haya un código de error en MySQL para identificar esta situación Â¿?¿?
+}
+
+bool mysql::ResultCode::ErrorDecoder::lostConnection(const int errorCode) const
+throw() {
+  return errorCode == CR_INVALID_CONN_HANDLE || errorCode == CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR || errorCode == CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR  ||
+         errorCode == CR_SHARED_MEMORY_CONNECT_MAP_ERROR || errorCode == CR_SHARED_MEMORY_CONNECT_SET_ERROR;
+}