2
0
mirror of https://github.com/boostorg/mysql.git synced 2026-01-31 08:22:14 +00:00

Added prepared statement close

This commit is contained in:
ruben
2019-09-08 12:13:55 +01:00
parent 20f00e4c0e
commit 2bf1adf5eb
6 changed files with 28 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ void serialize(DynamicBuffer& buffer, const StmtExecute& value);
ReadIterator deserialize(ReadIterator from, ReadIterator last, StmtExecuteResponseHeader& output);
std::pair<FieldType, bool> compute_field_type(const BinaryValue&);
void serialize(DynamicBuffer& buffer, const StmtFetch& value);
void serialize(DynamicBuffer& buffer, const StmtClose& value);
// Text serialization
std::ostream& operator<<(std::ostream& os, const Handshake& value);

View File

@@ -253,6 +253,11 @@ struct StmtFetch
int4 rows_to_fetch;
};
struct StmtClose
{
int4 statement_id;
};
}

View File

@@ -78,7 +78,8 @@ public:
template <typename... Params>
BinaryResultset execute_with_cursor(int4 fetch_count, Params&&... params);
// close(Connection)
void close();
// Destructor should try to auto-close
static PreparedStatement prepare(MysqlStream& stream, std::string_view query);

View File

@@ -74,10 +74,11 @@ int main()
stream, "SELECT * from users WHERE age < ? and first_name <> ?");
auto res = stmt.execute_with_cursor(2, 200, string_lenenc{"hola"});
print(res);
/*auto make_older = mysql::PreparedStatement::prepare(stream, "UPDATE users SET age = age + 1");
auto make_older = mysql::PreparedStatement::prepare(stream, "UPDATE users SET age = age + 1");
res = make_older.execute();
print(res);
res = stmt.execute_with_cursor(2, 40, string_lenenc{"hola"});
make_older.close();
res = stmt.execute_with_cursor(8, 70, string_lenenc{"hola"});
cout << "\n\n";
print(res);*/
print(res);
}

View File

@@ -217,6 +217,12 @@ void mysql::serialize(DynamicBuffer& buffer, const StmtFetch& value)
serialize(buffer, value.rows_to_fetch);
}
void mysql::serialize(DynamicBuffer& buffer, const StmtClose& value)
{
serialize(buffer, Command::COM_STMT_CLOSE);
serialize(buffer, value.statement_id);
}
// Text serialization
std::ostream& mysql::operator<<(std::ostream& os, const Handshake& value)
{

View File

@@ -215,7 +215,6 @@ bool mysql::BinaryResultset::retrieve_next()
const mysql::OkPacket& mysql::BinaryResultset::ok_packet() const
{
// TODO: fetch semantics are not aligned with this assertion
assert(state_ == State::exhausted ||
(state_ == State::data_available && cursor_exists()));
return ok_packet_;
@@ -234,7 +233,6 @@ mysql::BinaryResultset mysql::PreparedStatement::do_execute(
{
std::vector<std::uint8_t> read_buffer;
// TODO: other cursor types
DynamicBuffer write_buffer;
serialize(write_buffer, message);
stream_->reset_sequence_number();
@@ -243,4 +241,14 @@ mysql::BinaryResultset mysql::PreparedStatement::do_execute(
return mysql::BinaryResultset {*stream_, statement_id_, fetch_count};
}
void mysql::PreparedStatement::close()
{
assert(statement_id_ != 0);
StmtClose msg { statement_id_ };
DynamicBuffer write_buffer;
serialize(write_buffer, msg);
stream_->reset_sequence_number();
stream_->write(write_buffer.get());
}