summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/client/odbc/common/Ctx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/client/odbc/common/Ctx.cpp')
-rw-r--r--storage/ndb/src/old_files/client/odbc/common/Ctx.cpp355
1 files changed, 355 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/client/odbc/common/Ctx.cpp b/storage/ndb/src/old_files/client/odbc/common/Ctx.cpp
new file mode 100644
index 00000000000..d6faa5cba77
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/common/Ctx.cpp
@@ -0,0 +1,355 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include <NdbApi.hpp>
+#include <common/common.hpp>
+#include "DiagArea.hpp"
+
+// ctor
+
+Ctx::Ctx() :
+ m_diagArea(0) // create on demand
+{
+ const char* p;
+ if ((p = getenv("NDB_ODBC_TRACE")) != 0)
+ m_logLevel = atoi(p);
+ if ((p = getenv("NDB_ODBC_TRACE_FILE")) != 0 && *p != 0)
+ strcpy(m_szTraceFile, p);
+}
+
+Ctx::~Ctx()
+{
+ delete m_diagArea;
+ m_diagArea = 0;
+}
+
+// handle exceptions
+
+CtxAssert::CtxAssert(const char* file, int line) :
+ m_file(file),
+ m_line(line)
+{
+ const char* p;
+ if ((p = getenv("NDB_ODBC_DEBUG")) != 0 && atoi(p) != 0) {
+ char buf[200];
+ snprintf(buf, sizeof(buf), "%s, line %d: assert failed\n", m_file, m_line);
+ if ((p = getenv("NDB_ODBC_TRACE_FILE")) != 0 && *p != 0) {
+ FILE* pFile = fopen(p, "a");
+ fprintf(pFile, buf);
+ fflush(pFile);
+ fclose(pFile);
+ } else {
+ fprintf(stderr, buf);
+ fflush(stderr);
+ }
+ abort();
+ exit(1);
+ }
+}
+
+void
+Ctx::handleEx(CtxAssert& ctxAssert)
+{
+ pushStatus(Sqlstate::_IM001, Error::Gen, "exception at %s line %d", ctxAssert.m_file, ctxAssert.m_line);
+}
+
+// logging methods
+
+int Ctx::m_logLevel = 0;
+char Ctx::m_szTraceFile[MAX_PATH];
+
+void
+Ctx::log(const char* fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ if (m_szTraceFile[0]) {
+ FILE* pFile = fopen(m_szTraceFile, "a");
+ fprintf(pFile, "[NdbOdbc] ");
+ vfprintf(pFile, fmt, ap);
+ fprintf(pFile, "\n");
+ fflush(pFile);
+ fclose(pFile);
+ } else {
+ printf("[NdbOdbc] ");
+ vprintf(fmt, ap);
+ printf("\n");
+ fflush(stdout);
+ }
+ va_end(ap);
+}
+
+void
+Ctx::logSqlEnter(const char* sqlFunction)
+{
+ Ctx& ctx = *this;
+ snprintf(m_sqlFunction, sizeof(m_sqlFunction), "%s", sqlFunction);
+ ctx_log3(("%s", m_sqlFunction));
+}
+
+void
+Ctx::logSqlExit()
+{
+ Ctx& ctx = *this;
+ if (m_diagArea == 0) {
+ ctx_log3(("%s ret=%d", m_sqlFunction, getCode()));
+ return;
+ }
+ int logLevel = diagArea().numStatus() != 0 ? 2 : 3;
+ ctx_logN(logLevel, ("%s ret=%d diag=%d", m_sqlFunction, diagArea().getCode(), diagArea().numStatus()));
+ for (unsigned i = 1; i <= diagArea().numStatus(); i++) {
+ OdbcData state;
+ OdbcData message;
+ diagArea().getRecord(ctx, i, SQL_DIAG_SQLSTATE, state);
+ diagArea().getRecord(ctx, i, SQL_DIAG_MESSAGE_TEXT, message);
+ ctx_logN(logLevel, ("diag %u: %s - %s", i, state.sqlstate().state(), message.sqlchar()));
+ }
+}
+
+void
+Ctx::print(const char* fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ if (m_szTraceFile[0]) {
+ FILE* pFile = fopen(m_szTraceFile, "a");
+ vfprintf(pFile, fmt, ap);
+ unsigned n = strlen(fmt);
+ if (n > 0 && fmt[n-1] == '\n')
+ fflush(pFile);
+ fclose(pFile);
+ } else {
+ vprintf(fmt, ap);
+ unsigned n = strlen(fmt);
+ if (n > 0 && fmt[n-1] == '\n')
+ fflush(stdout);
+ }
+ va_end(ap);
+}
+
+void
+Ctx::print(int level, const char* fmt, ...)
+{
+ if (level > m_logLevel)
+ return;
+ va_list ap;
+ va_start(ap, fmt);
+ if (m_szTraceFile[0]) {
+ FILE* pFile = fopen(m_szTraceFile, "a");
+ vfprintf(pFile, fmt, ap);
+ unsigned n = strlen(fmt);
+ if (n > 0 && fmt[n-1] == '\n')
+ fflush(pFile);
+ fclose(pFile);
+ } else {
+ vprintf(fmt, ap);
+ unsigned n = strlen(fmt);
+ if (n > 0 && fmt[n-1] == '\n')
+ fflush(stdout);
+ }
+ va_end(ap);
+}
+
+// diagnostics
+
+static const unsigned MessageSize = 512;
+
+DiagArea&
+Ctx::diagArea() const
+{
+ ctx_assert(m_diagArea != 0);
+ return *m_diagArea;
+}
+
+DiagArea&
+Ctx::diagArea()
+{
+ if (m_diagArea == 0)
+ m_diagArea = new DiagArea;
+ return *m_diagArea;
+}
+
+SQLRETURN
+Ctx::getCode() const
+{
+ if (m_diagArea == 0)
+ return SQL_SUCCESS;
+ return diagArea().getCode();
+}
+
+void
+Ctx::setCode(SQLRETURN ret)
+{
+ diagArea().setCode(ret);
+}
+
+void
+Ctx::pushStatus(const Sqlstate& state, SQLINTEGER code, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(message, sizeof(message), fmt, ap);
+ va_end(ap);
+ Error error(state);
+ error.m_status = NdbError::PermanentError;
+ error.m_classification = NdbError::ApplicationError;
+ error.m_code = code;
+ error.m_message = message;
+ error.m_sqlFunction = m_sqlFunction;
+ diagArea().pushStatus(error);
+}
+
+void
+Ctx::pushStatus(SQLINTEGER code, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(message, sizeof(message), fmt, ap);
+ va_end(ap);
+ Error error(Sqlstate::_IM000);
+ error.m_status = NdbError::PermanentError;
+ error.m_classification = NdbError::ApplicationError;
+ error.m_code = code;
+ error.m_message = message;
+ error.m_sqlFunction = m_sqlFunction;
+ diagArea().pushStatus(error);
+}
+
+void
+Ctx::pushStatus(const NdbError& ndbError, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ snprintf(message, sizeof(message), "%s", ndbError.message);
+ snprintf(message + strlen(message), sizeof(message) - strlen(message), "%s", " - at ");
+ vsnprintf(message + strlen(message), sizeof(message) - strlen(message), fmt, ap);
+ va_end(ap);
+ Error error(Sqlstate::_IM000);
+ error.m_status = ndbError.status;
+ error.m_classification = ndbError.classification;
+ error.m_code = ndbError.code;
+ error.m_message = message;
+ error.m_sqlFunction = m_sqlFunction;
+ diagArea().pushStatus(error);
+}
+
+void
+Ctx::pushStatus(const Ndb* ndb, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(message, sizeof(message), fmt, ap);
+ va_end(ap);
+ bool found = false;
+ if (ndb != 0) {
+ const NdbError& ndbError = ndb->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (! found) {
+ pushStatus(Error::Gen, "unknown NDB error");
+ }
+}
+
+void
+Ctx::pushStatus(const Ndb* ndb, const NdbConnection* tcon, const NdbOperation* op, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(message, sizeof(message), fmt, ap);
+ va_end(ap);
+ bool found = false;
+ if (op != 0) {
+ const NdbError& ndbError = op->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (tcon != 0) {
+ const NdbError& ndbError = tcon->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (ndb != 0) {
+ const NdbError& ndbError = ndb->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (! found) {
+ pushStatus(Error::Gen, "unknown NDB error");
+ }
+}
+
+void
+Ctx::pushStatus(const Ndb* ndb, const NdbSchemaCon* scon, const NdbSchemaOp* op, const char* fmt, ...)
+{
+ char message[MessageSize];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(message, sizeof(message), fmt, ap);
+ va_end(ap);
+ bool found = false;
+ if (op != 0) {
+ const NdbError& ndbError = op->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (scon != 0) {
+ const NdbError& ndbError = scon->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (ndb != 0) {
+ const NdbError& ndbError = ndb->getNdbError();
+ if (ndbError.code != 0) {
+ pushStatus(ndbError, "%s", message);
+ found = true;
+ }
+ }
+ if (! found) {
+ pushStatus(Error::Gen, "unknown NDB error");
+ }
+}
+
+// check for error
+
+bool
+Ctx::ok()
+{
+ if (m_diagArea == 0)
+ return true;
+ if (diagArea().getCode() == SQL_SUCCESS)
+ return true;
+ if (diagArea().getCode() == SQL_SUCCESS_WITH_INFO)
+ return true;
+ return false;
+}