| 1 | #include "duckdb/main/prepared_statement.hpp" |
| 2 | #include "duckdb/common/exception.hpp" |
| 3 | #include "duckdb/main/client_context.hpp" |
| 4 | #include "duckdb/main/prepared_statement_data.hpp" |
| 5 | |
| 6 | using namespace duckdb; |
| 7 | using namespace std; |
| 8 | |
| 9 | PreparedStatement::PreparedStatement(ClientContext *context, string name, string query, PreparedStatementData &data, |
| 10 | idx_t n_param) |
| 11 | : context(context), name(name), query(query), success(true), is_invalidated(false), n_param(n_param) { |
| 12 | this->type = data.statement_type; |
| 13 | this->types = data.sql_types; |
| 14 | this->names = data.names; |
| 15 | } |
| 16 | |
| 17 | PreparedStatement::PreparedStatement(string error) |
| 18 | : context(nullptr), success(false), error(error), is_invalidated(false) { |
| 19 | } |
| 20 | |
| 21 | PreparedStatement::~PreparedStatement() { |
| 22 | if (!is_invalidated && success) { |
| 23 | assert(context); |
| 24 | context->RemovePreparedStatement(this); |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | unique_ptr<QueryResult> PreparedStatement::Execute(vector<Value> &values, bool allow_stream_result) { |
| 29 | if (!success) { |
| 30 | return make_unique<MaterializedQueryResult>("Attempting to execute an unsuccessfully prepared statement!" ); |
| 31 | } |
| 32 | if (is_invalidated) { |
| 33 | return make_unique<MaterializedQueryResult>( |
| 34 | "Cannot execute prepared statement: underlying database or connection has been destroyed" ); |
| 35 | } |
| 36 | assert(context); |
| 37 | return context->Execute(name, values, allow_stream_result, query); |
| 38 | } |
| 39 | |