Code_query.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_CODEGEN_Code_query_hpp
  14. #define ODBC_CODEGEN_Code_query_hpp
  15. #include <common/common.hpp>
  16. #include <common/DataRow.hpp>
  17. #include <common/ResultArea.hpp>
  18. #include "Code_stmt.hpp"
  19. class Plan_expr_row;
  20. class Plan_table;
  21. class Exec_expr_row;
  22. /**
  23.  * @class Plan_query
  24.  * @brief Base class for queries in PlanTree
  25.  */
  26. class Plan_query : public Plan_stmt {
  27. public:
  28.     Plan_query(Plan_root* root);
  29.     virtual ~Plan_query() = 0;
  30.     void describe(Ctx& ctx);
  31.     virtual Plan_expr_row* getRow();
  32. };
  33. inline
  34. Plan_query::Plan_query(Plan_root* root) :
  35.     Plan_stmt(root)
  36. {
  37. }
  38. /**
  39.  * @class Exec_query
  40.  * @brief Base class for executable queries.
  41.  *
  42.  * Executable queriable statement.
  43.  */
  44. class Exec_query : public Exec_stmt {
  45. public:
  46.     class Code : public Exec_stmt::Code {
  47.     public:
  48. Code(const SqlSpecs& sqlSpecs);
  49. virtual ~Code() = 0;
  50. const SqlSpecs& sqlSpecs() const;
  51.     protected:
  52. friend class Exec_query;
  53. const SqlSpecs& m_sqlSpecs; // subclass must contain
  54.     };
  55.     class Data : public Exec_stmt::Data, public ResultSet {
  56.     public:
  57. Data(Exec_query* node, const SqlRow& sqlRow);
  58. virtual ~Data() = 0;
  59. const SqlRow& sqlRow() const;
  60. ExtRow* extRow() const;
  61. bool fetchImpl(Ctx& ctx, Ctl& ctl);
  62.     protected:
  63. friend class Exec_query;
  64. Exec_query* const m_node;
  65. ExtRow* m_extRow; // output bindings
  66. int* m_extPos; // positions for SQLGetData
  67.     };
  68.     Exec_query(Exec_root* root);
  69.     virtual ~Exec_query() = 0;
  70.     void bind(Ctx& ctx);
  71.     void execute(Ctx& ctx, Ctl& ctl);
  72.     bool fetch(Ctx& ctx, Ctl& ctl);
  73.     // children
  74.     const Code& getCode() const;
  75.     Data& getData() const;
  76.     virtual const Exec_query* getRawQuery() const;
  77.     // odbc support
  78.     void sqlGetData(Ctx& ctx, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValue, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_Ind);
  79. protected:
  80.     friend class Data;
  81.     virtual void execImpl(Ctx& ctx, Ctl& ctl) = 0;
  82.     virtual bool fetchImpl(Ctx& ctx, Ctl& ctl) = 0;
  83. };
  84. inline
  85. Exec_query::Code::Code(const SqlSpecs& sqlSpecs) :
  86.     m_sqlSpecs(sqlSpecs)
  87. {
  88. }
  89. inline const SqlSpecs&
  90. Exec_query::Code::sqlSpecs() const
  91. {
  92.     return m_sqlSpecs;
  93. }
  94. inline
  95. Exec_query::Data::Data(Exec_query* node, const SqlRow& sqlRow) :
  96.     ResultSet(sqlRow),
  97.     m_node(node),
  98.     m_extRow(0),
  99.     m_extPos(0)
  100. {
  101. }
  102. inline const SqlRow&
  103. Exec_query::Data::sqlRow() const
  104. {
  105.     return static_cast<const SqlRow&>(m_dataRow);
  106. }
  107. inline ExtRow*
  108. Exec_query::Data::extRow() const
  109. {
  110.     return m_extRow;
  111. }
  112. inline bool
  113. Exec_query::Data::fetchImpl(Ctx& ctx, Ctl& ctl)
  114. {
  115.     return m_node->fetchImpl(ctx, ctl);
  116. }
  117. inline
  118. Exec_query::Exec_query(Exec_root* root) :
  119.     Exec_stmt(root)
  120. {
  121. }
  122. // children
  123. inline const Exec_query::Code&
  124. Exec_query::getCode() const
  125. {
  126.     const Code* code = static_cast<const Code*>(m_code);
  127.     return *code;
  128. }
  129. inline Exec_query::Data&
  130. Exec_query::getData() const
  131. {
  132.     Data* data = static_cast<Data*>(m_data);
  133.     return *data;
  134. }
  135. #endif