Code_root.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_root_hpp
  14. #define ODBC_CODEGEN_Code_root_hpp
  15. #include <list>
  16. #include <common/common.hpp>
  17. #include "Code_base.hpp"
  18. #include "Code_stmt.hpp"
  19. class SqlField;
  20. class ExtField;
  21. /**
  22.  * @class Plan_root
  23.  * @brief Root node above top level statement node
  24.  */
  25. class Plan_root : public Plan_base {
  26. public:
  27.     Plan_root(StmtArea& stmtArea);
  28.     virtual ~Plan_root();
  29.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  30.     void describe(Ctx& ctx);
  31.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  32.     void print(Ctx& ctx);
  33.     // children
  34.     void setStmt(Plan_stmt* stmt);
  35.     // save and free nodes
  36.     void saveNode(Plan_base* node);
  37.     void freeNodeList();
  38. private:
  39.     friend class CodeGen;
  40.     friend class Plan_base;
  41.     friend class Plan_expr_param;
  42.     StmtArea& m_stmtArea;
  43.     Plan_stmt* m_stmt;
  44.     ParamVector m_paramList;
  45.     typedef std::list<Plan_base*> NodeList;
  46.     NodeList m_nodeList;
  47. };
  48. inline
  49. Plan_root::Plan_root(StmtArea& stmtArea) :
  50.     Plan_base(this),
  51.     m_stmtArea(stmtArea),
  52.     m_stmt(0)
  53. {
  54. }
  55. inline void
  56. Plan_root::setStmt(Plan_stmt* stmt)
  57. {
  58.     ctx_assert(stmt != 0);
  59.     m_stmt = stmt;
  60. }
  61. /**
  62.  * @class Exec_root
  63.  * @brief Root node above top level statement node
  64.  */
  65. class Exec_root : public Exec_base {
  66. public:
  67.     class Code : public Exec_base::Code {
  68.     public:
  69. Code();
  70. virtual ~Code();
  71.     };
  72.     class Data : public Exec_base::Data {
  73.     public:
  74. Data();
  75. virtual ~Data();
  76.     };
  77.     Exec_root(StmtArea& stmtArea);
  78.     virtual ~Exec_root();
  79.     StmtArea& stmtArea() const;
  80.     void alloc(Ctx& ctx, Ctl& ctl);
  81.     void bind(Ctx& ctx);
  82.     void execute(Ctx& ctx, Ctl& ctl);
  83.     void fetch(Ctx& ctx, Ctl& ctl);
  84.     void close(Ctx& ctx);
  85.     void print(Ctx& ctx);
  86.     // children
  87.     const Code& getCode() const;
  88.     Data& getData() const;
  89.     void setStmt(Exec_stmt* stmt);
  90.     // save and free nodes
  91.     void saveNode(Exec_base* node);
  92.     void freeNodeList();
  93.     // odbc support
  94.     void sqlGetData(Ctx& ctx, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValue, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_Ind);
  95.     void sqlParamData(Ctx& ctx, SQLPOINTER* value);
  96.     void sqlPutData(Ctx& ctx, SQLPOINTER data, SQLINTEGER strlen_or_Ind);
  97. private:
  98.     friend class Plan_root;
  99.     friend class Exec_base;
  100.     friend class CodeGen;
  101.     StmtArea& m_stmtArea;
  102.     Exec_stmt* m_stmt;
  103.     ParamVector m_paramList;
  104.     unsigned m_paramData; // position of SQLParamData
  105.     typedef std::list<Exec_base*> NodeList;
  106.     NodeList m_nodeList;
  107. };
  108. inline
  109. Exec_root::Code::Code()
  110. {
  111. }
  112. inline
  113. Exec_root::Data::Data()
  114. {
  115. }
  116. inline
  117. Exec_root::Exec_root(StmtArea& stmtArea) :
  118.     Exec_base(this),
  119.     m_stmtArea(stmtArea),
  120.     m_stmt(0),
  121.     m_paramData(0)
  122. {
  123. }
  124. // children
  125. inline const Exec_root::Code&
  126. Exec_root::getCode() const
  127. {
  128.     const Code* code = static_cast<const Code*>(m_code);
  129.     return *code;
  130. }
  131. inline Exec_root::Data&
  132. Exec_root::getData() const
  133. {
  134.     Data* data = static_cast<Data*>(m_data);
  135.     return *data;
  136. }
  137. inline void
  138. Exec_root::setStmt(Exec_stmt* stmt)
  139. {
  140.     ctx_assert(stmt != 0);
  141.     m_stmt = stmt;
  142.     m_stmt->m_topLevel = true;
  143. }
  144. #endif