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

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_insert_hpp
  14. #define ODBC_CODEGEN_Code_insert_hpp
  15. #include <common/common.hpp>
  16. #include "Code_base.hpp"
  17. #include "Code_dml.hpp"
  18. #include "Code_dml_row.hpp"
  19. #include "Code_expr_row.hpp"
  20. #include "Code_select.hpp"
  21. #include "Code_query.hpp"
  22. #include "Code_table.hpp"
  23. #include "Code_set_row.hpp"
  24. enum Insert_op {
  25.     Insert_op_undef = 0,
  26.     Insert_op_insert = 1,
  27.     Insert_op_write = 2
  28. };
  29. /**
  30.  * @class Plan_insert
  31.  * @brief Insert in PlanTree
  32.  *
  33.  * Insert.  Becomes directly executable.
  34.  */
  35. class Plan_insert : public Plan_dml {
  36. public:
  37.     Plan_insert(Plan_root* root, Insert_op insertOp);
  38.     virtual ~Plan_insert();
  39.     Plan_base* analyze(Ctx& ctx, Ctl& ctl);
  40.     void describe(Ctx& ctx);
  41.     Exec_base* codegen(Ctx& ctx, Ctl& ctl);
  42.     void print(Ctx& ctx);
  43.     // children
  44.     void setTable(Plan_table* table);
  45.     Plan_dml_row* getDmlRow() const;
  46.     void setDmlRow(Plan_dml_row* dmlRow);
  47.     void setExprRow(Plan_expr_row* exprRow);
  48.     void setSelect(Plan_select* select);
  49.     void setQuery(Plan_query* query);
  50.     void setMysqlRow(Plan_set_row* mysqlRow);
  51. protected:
  52.     Insert_op m_insertOp;
  53.     Plan_table* m_table;
  54.     Plan_dml_row* m_dmlRow;
  55.     Plan_expr_row* m_exprRow;
  56.     Plan_select* m_select;
  57.     Plan_query* m_query;
  58.     Plan_set_row* m_mysqlRow;
  59. };
  60. inline
  61. Plan_insert::Plan_insert(Plan_root* root, Insert_op insertOp) :
  62.     Plan_dml(root),
  63.     m_insertOp(insertOp),
  64.     m_table(0),
  65.     m_dmlRow(0),
  66.     m_exprRow(0),
  67.     m_select(0),
  68.     m_query(0),
  69.     m_mysqlRow(0)
  70. {
  71. }
  72. // children
  73. inline void
  74. Plan_insert::setTable(Plan_table* table)
  75. {
  76.     ctx_assert(table != 0);
  77.     m_table = table;
  78. }
  79. inline void
  80. Plan_insert::setDmlRow(Plan_dml_row* dmlRow)
  81. {
  82.     ctx_assert(dmlRow != 0);
  83.     m_dmlRow = dmlRow;
  84. }
  85. inline Plan_dml_row*
  86. Plan_insert::getDmlRow() const
  87. {
  88.     ctx_assert(m_dmlRow != 0);
  89.     return m_dmlRow;
  90. }
  91. inline void
  92. Plan_insert::setExprRow(Plan_expr_row* exprRow)
  93. {
  94.     ctx_assert(exprRow != 0);
  95.     m_exprRow = exprRow;
  96. }
  97. inline void
  98. Plan_insert::setSelect(Plan_select* select)
  99. {
  100.     ctx_assert(select != 0);
  101.     m_select = select;
  102. }
  103. inline void
  104. Plan_insert::setQuery(Plan_query* query)
  105. {
  106.     ctx_assert(query != 0);
  107.     m_query = query;
  108. }
  109. inline void
  110. Plan_insert::setMysqlRow(Plan_set_row* mysqlRow)
  111. {
  112.     ctx_assert(mysqlRow != 0);
  113.     m_mysqlRow = mysqlRow;
  114. }
  115. /**
  116.  * @class Exec_insert
  117.  * @brief Executable insert
  118.  */
  119. class Exec_insert : public Exec_dml {
  120. public:
  121.     class Code : public Exec_dml::Code {
  122.     public:
  123. Code();
  124. virtual ~Code();
  125.     protected:
  126. friend class Plan_insert;
  127. friend class Exec_insert;
  128. Insert_op m_insertOp;
  129. char* m_tableName;
  130. unsigned m_attrCount;
  131. NdbAttrId* m_attrId;
  132. bool* m_isKey;
  133. unsigned m_tupleId; // position of tuple id
  134. unsigned m_autoIncrement; // position of ai key
  135. SqlType m_idType; // type of tuple id or ai key
  136. unsigned m_defaultCount;
  137. NdbAttrId* m_defaultId;
  138. SqlRow* m_defaultValue;
  139. bool findAttrId(NdbAttrId attrId) const;
  140.     };
  141.     class Data : public Exec_dml::Data {
  142.     public:
  143. Data();
  144. virtual ~Data();
  145.     protected:
  146. friend class Exec_insert;
  147.     };
  148.     Exec_insert(Exec_root* root);
  149.     virtual ~Exec_insert();
  150.     void alloc(Ctx& ctx, Ctl& ctl);
  151.     void execImpl(Ctx& ctx, Ctl& ctl);
  152.     void close(Ctx& ctx);
  153.     void print(Ctx& ctx);
  154.     // children
  155.     const Code& getCode() const;
  156.     Data& getData() const;
  157.     void setQuery(Exec_query* query);
  158. private:
  159.     Exec_query* m_query;
  160. };
  161. inline
  162. Exec_insert::Code::Code() :
  163.     m_insertOp(Insert_op_undef),
  164.     m_tableName(0),
  165.     m_attrCount(0),
  166.     m_attrId(0),
  167.     m_isKey(0),
  168.     m_tupleId(0),
  169.     m_autoIncrement(0),
  170.     m_defaultCount(0),
  171.     m_defaultId(0),
  172.     m_defaultValue(0)
  173. {
  174. }
  175. inline
  176. Exec_insert::Data::Data()
  177. {
  178. }
  179. inline
  180. Exec_insert::Exec_insert(Exec_root* root) :
  181.     Exec_dml(root),
  182.     m_query(0)
  183. {
  184. }
  185. // children
  186. inline const Exec_insert::Code&
  187. Exec_insert::getCode() const
  188. {
  189.     const Code* code = static_cast<const Code*>(m_code);
  190.     return *code;
  191. }
  192. inline Exec_insert::Data&
  193. Exec_insert::getData() const
  194. {
  195.     Data* data = static_cast<Data*>(m_data);
  196.     return *data;
  197. }
  198. inline void
  199. Exec_insert::setQuery(Exec_query* query)
  200. {
  201.     ctx_assert(m_query == 0 && query != 0);
  202.     m_query = query;
  203. }
  204. #endif