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 | |