summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp')
-rw-r--r--storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp b/storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp
new file mode 100644
index 00000000000..27379cdc3f8
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/handles/HandleBase.cpp
@@ -0,0 +1,162 @@
+/* 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 "HandleBase.hpp"
+
+HandleBase::~HandleBase()
+{
+ delete m_ctx;
+ m_ctx = 0;
+}
+
+void
+HandleBase::saveCtx(Ctx& ctx)
+{
+ delete m_ctx;
+ m_ctx = &ctx;
+}
+
+// get diagnostics
+
+void
+HandleBase::sqlGetDiagField(Ctx& ctx, SQLSMALLINT recNumber, SQLSMALLINT diagIdentifier, SQLPOINTER diagInfo, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength)
+{
+ const DiagSpec& spec = DiagSpec::find(diagIdentifier);
+ if (spec.m_pos == Diag_pos_end) {
+ ctx.setCode(SQL_ERROR);
+ return;
+ }
+ const bool header = (spec.m_pos == Diag_pos_header);
+ const bool status = (spec.m_pos == Diag_pos_status);
+ ctx_assert(header || status);
+ if (! (spec.m_handles & odbcHandle())) {
+ ctx.setCode(SQL_ERROR);
+ return;
+ }
+ if (header) {
+ recNumber = 0; // ignored for header fields, so fix it
+ if (m_ctx == 0) {
+ if (diagIdentifier == SQL_DIAG_NUMBER) {
+ SQLINTEGER n = 0;
+ OdbcData data(n);
+ data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
+ return;
+ }
+ if (diagIdentifier == SQL_DIAG_RETURNCODE) {
+ SQLSMALLINT n = 0;
+ OdbcData data(n);
+ data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
+ return;
+ }
+ return;
+ }
+ }
+ if (status) {
+ if (recNumber <= 0) {
+ ctx.setCode(SQL_ERROR);
+ return;
+ }
+ if (m_ctx == 0) {
+ if ((unsigned)recNumber > 0) {
+ ctx.setCode(SQL_NO_DATA);
+ return;
+ }
+ return;
+ }
+ if ((unsigned)recNumber > m_ctx->diagArea().numStatus()) {
+ ctx.setCode(SQL_NO_DATA);
+ return;
+ }
+ }
+ OdbcData data;
+ ctx_assert(m_ctx != 0);
+ m_ctx->diagArea().getRecord(ctx, recNumber, diagIdentifier, data);
+ if (data.type() != OdbcData::Undef)
+ data.copyout(ctx, diagInfo, bufferLength, 0, stringLength);
+}
+
+void
+HandleBase::sqlGetDiagRec(Ctx& ctx, SQLSMALLINT recNumber, SQLCHAR* sqlstate, SQLINTEGER* nativeError, SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLength)
+{
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_SQLSTATE, static_cast<SQLPOINTER>(sqlstate), 5 + 1, 0);
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_NATIVE, static_cast<SQLPOINTER>(nativeError), -1, 0);
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_MESSAGE_TEXT, static_cast<SQLPOINTER>(messageText), bufferLength, textLength);
+}
+
+void
+HandleBase::sqlError(Ctx& ctx, SQLCHAR* sqlstate, SQLINTEGER* nativeError, SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLength)
+{
+ if (m_ctx == 0) {
+ ctx.setCode(SQL_NO_DATA);
+ return;
+ }
+ const SQLSMALLINT recNumber = m_ctx->diagArea().nextRecNumber();
+ if (recNumber == 0) {
+ ctx.setCode(SQL_NO_DATA);
+ return;
+ }
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_SQLSTATE, static_cast<SQLPOINTER>(sqlstate), 5 + 1, 0);
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_NATIVE, static_cast<SQLPOINTER>(nativeError), -1, 0);
+ sqlGetDiagField(ctx, recNumber, SQL_DIAG_MESSAGE_TEXT, static_cast<SQLPOINTER>(messageText), bufferLength, textLength);
+}
+
+// common code for attributes
+
+void
+HandleBase::baseSetHandleAttr(Ctx& ctx, AttrArea& attrArea, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER stringLength)
+{
+ const AttrSpec& spec = attrArea.findSpec(attribute);
+ if (spec.m_mode == Attr_mode_undef) { // not found
+ ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", (int)attribute);
+ return;
+ }
+ if (spec.m_mode == Attr_mode_readonly) { // read only
+ ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "read-only attribute id %d", (int)attribute);
+ return;
+ }
+ OdbcData data;
+ data.copyin(ctx, spec.m_type, value, stringLength);
+ if (! ctx.ok())
+ return;
+ attrArea.setAttr(ctx, attribute, data);
+}
+
+void
+HandleBase::baseGetHandleAttr(Ctx& ctx, AttrArea& attrArea, SQLINTEGER attribute, SQLPOINTER value, SQLINTEGER bufferLength, SQLINTEGER* stringLength)
+{
+ const AttrSpec& spec = attrArea.findSpec(attribute);
+ if (spec.m_mode == Attr_mode_undef) { // not found
+ ctx.pushStatus(Sqlstate::_HY092, Error::Gen, "undefined attribute id %d", (int)attribute);
+ return;
+ }
+ OdbcData data;
+ attrArea.getAttr(ctx, attribute, data);
+ if (! ctx.ok())
+ return;
+ data.copyout(ctx, value, bufferLength, stringLength);
+}
+
+void
+HandleBase::baseSetHandleOption(Ctx& ctx, AttrArea& attrArea, SQLUSMALLINT option, SQLUINTEGER value)
+{
+ baseSetHandleAttr(ctx, attrArea, static_cast<SQLINTEGER>(option), reinterpret_cast<SQLPOINTER>(value), 0);
+}
+
+void
+HandleBase::baseGetHandleOption(Ctx& ctx, AttrArea& attrArea, SQLUSMALLINT option, SQLPOINTER value)
+{
+ baseGetHandleAttr(ctx, attrArea, static_cast<SQLINTEGER>(option), value, SQL_NTS, 0);
+}