diff options
Diffstat (limited to 'storage/ndb/src/old_files/client/odbc/common/DescArea.cpp')
-rw-r--r-- | storage/ndb/src/old_files/client/odbc/common/DescArea.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/client/odbc/common/DescArea.cpp b/storage/ndb/src/old_files/client/odbc/common/DescArea.cpp new file mode 100644 index 00000000000..bad9f23d3ef --- /dev/null +++ b/storage/ndb/src/old_files/client/odbc/common/DescArea.cpp @@ -0,0 +1,167 @@ +/* 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 <vector> +#include "DescArea.hpp" + +// DescField + +// DescRec + +void +DescRec::setField(int id, const OdbcData& data) +{ + Ctx ctx; + setField(ctx, id, data); + ctx_assert(ctx.ok()); +} + +void +DescRec::getField(int id, OdbcData& data) +{ + Ctx ctx; + getField(ctx, id, data); + ctx_assert(ctx.ok()); +} + +void +DescRec::setField(Ctx& ctx, int id, const OdbcData& data) +{ + Fields::iterator iter; + iter = m_fields.find(id); + if (ctx.logLevel() >= 3) { + char buf[100]; + data.print(buf, sizeof(buf)); + ctx_log3(("set %s rec %d id %d = %s", DescArea::nameUsage(m_area->getUsage()), m_num, id, buf)); + } + if (iter != m_fields.end()) { + DescField& field = (*iter).second; + field.setData(data); + m_area->setBound(false); // XXX could compare data values + return; + } + const DescSpec& spec = m_area->findSpec(id); + if (spec.m_pos != Desc_pos_end) { + DescField field(spec, data); + m_fields.insert(Fields::value_type(id, field)); + m_area->setBound(false); + return; + } + ctx_assert(false); +} + +void +DescRec::getField(Ctx& ctx, int id, OdbcData& data) +{ + Fields::iterator iter; + iter = m_fields.find(id); + if (iter != m_fields.end()) { + DescField& field = (*iter).second; + data.setValue(field.getData()); + return; + } + const DescSpec& spec = m_area->findSpec(id); + if (spec.m_pos != Desc_pos_end) { + data.setValue(); + return; // XXX default value + } + ctx_assert(false); +} + +// DescArea + +DescArea::DescArea(HandleBase* handle, const DescSpec* specList) : + m_handle(handle), + m_specList(specList), + m_alloc(Desc_alloc_undef), + m_usage(Desc_usage_undef), + m_bound(true) // no bind necessary since empty +{ + m_header.m_area = this; + m_header.m_num = -1; + DescRec rec; + rec.m_area = this; + rec.m_num = m_recs.size(); + m_recs.push_back(rec); // add bookmark record + SQLSMALLINT count = 0; + getHeader().setField(SQL_DESC_COUNT, count); + m_bound = true; +} + +DescArea::~DescArea() +{ +} + +const DescSpec& +DescArea::findSpec(int id) +{ + const DescSpec* p; + for (p = m_specList; p->m_pos != Desc_pos_end; p++) { + if (p->m_id == id) + break; + } + return *p; +} + +unsigned +DescArea::getCount() const +{ + ctx_assert(m_recs.size() > 0); + return m_recs.size() - 1; +} + +void +DescArea::setCount(Ctx& ctx, unsigned count) +{ + if (m_recs.size() - 1 == count) + return; + ctx_log3(("set %s count %d to %d", + DescArea::nameUsage(m_usage), + (unsigned)(m_recs.size() - 1), + count)); + m_recs.resize(1 + count); + for (unsigned i = 0; i <= count; i++) { + m_recs[i].m_area = this; + m_recs[i].m_num = i; + } + getHeader().setField(SQL_DESC_COUNT, static_cast<SQLSMALLINT>(count)); +} + +DescRec& +DescArea::pushRecord() +{ + ctx_assert(m_recs.size() > 0); + DescRec rec; + rec.m_area = this; + rec.m_num = m_recs.size(); + m_recs.push_back(rec); + SQLSMALLINT count = m_recs.size() - 1; + getHeader().setField(SQL_DESC_COUNT, count); + return m_recs.back(); +} + +DescRec& +DescArea::getHeader() +{ + return m_header; +} + +DescRec& +DescArea::getRecord(unsigned num) +{ + ctx_assert(num < m_recs.size()); + return m_recs[num]; +} |