StmtArea.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "DiagArea.hpp"
  14. #include "StmtArea.hpp"
  15. #include <codegen/CodeGen.hpp>
  16. StmtArea::StmtArea(ConnArea& connArea) :
  17.     m_connArea(connArea),
  18.     m_state(Free),
  19.     m_useSchemaCon(false),
  20.     m_useConnection(false),
  21.     m_planTree(0),
  22.     m_execTree(0),
  23.     m_unbound(0),
  24.     m_rowCount(0),
  25.     m_tuplesFetched(0)
  26. {
  27.     for (unsigned i = 0; i <= 4; i++)
  28. m_descArea[i] = 0;
  29. }
  30. StmtArea::~StmtArea()
  31. {
  32. }
  33. void
  34. StmtArea::free(Ctx &ctx)
  35. {
  36.     CodeGen codegen(*this);
  37.     codegen.close(ctx);
  38.     codegen.free(ctx);
  39.     m_sqlText.assign("");
  40.     m_nativeText.assign("");
  41.     useSchemaCon(ctx, false);
  42.     useConnection(ctx, false);
  43.     m_stmtInfo.free(ctx);
  44.     m_planTree = 0;
  45.     m_execTree = 0;
  46.     m_rowCount = 0;
  47.     m_tuplesFetched = 0;
  48.     m_unbound = 0;
  49.     m_state = Free;
  50. }
  51. void
  52. StmtArea::setRowCount(Ctx& ctx, CountType rowCount)
  53. {
  54.     m_rowCount = rowCount;
  55.     // location
  56.     DescArea& ird = descArea(Desc_usage_IRD);
  57.     OdbcData data;
  58.     ird.getHeader().getField(ctx, SQL_DESC_ROWS_PROCESSED_PTR, data);
  59.     if (data.type() != OdbcData::Undef) {
  60. SQLUINTEGER* countPtr = data.uintegerPtr();
  61. if (countPtr != 0) {
  62.     *countPtr = static_cast<SQLUINTEGER>(m_rowCount);
  63. }
  64.     }
  65.     // diagnostic
  66.     SQLINTEGER count = static_cast<SQLINTEGER>(m_rowCount);
  67.     ctx.diagArea().setHeader(SQL_DIAG_ROW_COUNT, count);
  68. }
  69. void
  70. StmtArea::setFunction(Ctx& ctx, const char* function, SQLINTEGER functionCode)
  71. {
  72.     m_stmtInfo.m_function = function;
  73.     m_stmtInfo.m_functionCode = functionCode;
  74. }
  75. void
  76. StmtArea::setFunction(Ctx& ctx)
  77. {
  78.     OdbcData function(m_stmtInfo.m_function);
  79.     ctx.diagArea().setHeader(SQL_DIAG_DYNAMIC_FUNCTION, function);
  80.     OdbcData functionCode(m_stmtInfo.m_functionCode);
  81.     ctx.diagArea().setHeader(SQL_DIAG_DYNAMIC_FUNCTION_CODE, functionCode);
  82. }
  83. bool
  84. StmtArea::useSchemaCon(Ctx& ctx, bool use)
  85. {
  86.     if (m_useSchemaCon != use)
  87. if (! m_connArea.useSchemaCon(ctx, use))
  88.     return false;
  89.     m_useSchemaCon = use;
  90.     return true;
  91. }
  92. bool
  93. StmtArea::useConnection(Ctx& ctx, bool use)
  94. {
  95.     if (m_useConnection != use)
  96. if (! m_connArea.useConnection(ctx, use))
  97.     return false;
  98.     m_useConnection = use;
  99.     return true;
  100. }