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

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. #ifndef ODBC_COMMON_ResultArea_hpp
  14. #define ODBC_COMMON_ResultArea_hpp
  15. #include <common/common.hpp>
  16. #include <codegen/Code_base.hpp>
  17. class SqlRow;
  18. /**
  19.  * @class ResultArea
  20.  * @brief Execution result
  21.  * 
  22.  * ResultArea contains general results from executing SQL
  23.  * statements.  Data rows from queries are fetched via derived
  24.  * class ResultSet.
  25.  */
  26. class ResultArea {
  27. public:
  28.     ResultArea();
  29.     virtual ~ResultArea();
  30.     /**
  31.      * Get number of rows:
  32.      *
  33.      * - for queries: number of rows fetched so far
  34.      * - for DML statements: number of rows affected
  35.      * - for DDL and other statements: 0
  36.      */
  37.     CountType getCount() const;
  38. protected:
  39.     void setCount(CountType count);
  40.     void addCount(unsigned count = 1);
  41. private:
  42.     CountType m_count;
  43. };
  44. inline
  45. ResultArea::ResultArea() :
  46.     m_count(0)
  47. {
  48. }
  49. inline CountType
  50. ResultArea::getCount() const
  51. {
  52.     return m_count;
  53. }
  54. inline void
  55. ResultArea::setCount(CountType count)
  56. {
  57.     m_count = count;
  58. }
  59. inline void
  60. ResultArea::addCount(unsigned count)
  61. {
  62.     m_count += count;
  63. }
  64. /**
  65.  * @class ResultSet
  66.  * @brief Data rows from queries
  67.  *
  68.  * ResultSet is an interface implemented by SQL queries and
  69.  * virtual queries (such as SQLTables).  It has an associated
  70.  * data row accessor SqlRow.
  71.  */
  72. class ResultSet : public ResultArea {
  73. public:
  74.     ResultSet(const SqlRow& dataRow);
  75.     virtual ~ResultSet();
  76.     enum State {
  77. State_init = 1, // before first fetch
  78. State_ok = 2, // last fetch succeeded
  79. State_end = 3 // end of fetch or error
  80.     };
  81.     void initState();
  82.     State getState() const;
  83.     /**
  84.      * Get data accessor.  Can be retrieved once and used after
  85.      * each successful ResultSet::fetch().
  86.      */
  87.     const SqlRow& dataRow() const;
  88.     /**
  89.      * Try to fetch one more row from this result set.
  90.      * - returns true if a row was fetched
  91.      * - returns false on end of fetch
  92.      * - returns false on error and sets error status
  93.      * It is a fatal error to call fetch after end of fetch.
  94.      */
  95.     bool fetch(Ctx& ctx, Exec_base::Ctl& ctl);
  96. protected:
  97.     /**
  98.      * Implementation of ResultSet::fetch() must be provided by
  99.      * each concrete subclass.
  100.      */
  101.     virtual bool fetchImpl(Ctx& ctx, Exec_base::Ctl& ctl) = 0;
  102.     const SqlRow& m_dataRow;
  103.     State m_state;
  104. };
  105. inline
  106. ResultSet::ResultSet(const SqlRow& dataRow) :
  107.     m_dataRow(dataRow),
  108.     m_state(State_end) // explicit initState() is required
  109. {
  110. }
  111. inline const SqlRow&
  112. ResultSet::dataRow() const
  113. {
  114.     return m_dataRow;
  115. }
  116. inline void
  117. ResultSet::initState()
  118. {
  119.     m_state = State_init;
  120.     setCount(0);
  121. }
  122. inline ResultSet::State
  123. ResultSet::getState() const
  124. {
  125.     return m_state;
  126. }
  127. inline bool
  128. ResultSet::fetch(Ctx& ctx, Exec_base::Ctl& ctl)
  129. {
  130.     if (! (m_state == State_init || m_state == State_ok)) {
  131. // should not happen but return error instead of assert
  132. ctx.pushStatus(Error::Gen, "invalid fetch state %d", (int)m_state);
  133. m_state = State_end;
  134. return false;
  135.     }
  136.     if (fetchImpl(ctx, ctl)) {
  137. m_state = State_ok;
  138. addCount();
  139. return true;
  140.     }
  141.     m_state = State_end;
  142.     return false;
  143. }
  144. #endif