MXS-2485 Add suport for split query packets (from client side)

This commit is contained in:
Niclas Antti
2019-06-05 11:13:25 +03:00
parent 6a5d36e4bd
commit 7a63a17278
3 changed files with 74 additions and 21 deletions

View File

@ -22,21 +22,36 @@ namespace maxsql
class ComResponse;
// Minimal class to track the lifetime of a query.
// TODO add documentation
class PacketTracker
{
public:
// The State reflects the response status. For the unlikely event that the query is split, but
// no response is expected, the tracker may still be waiting for packets from the client while
// m_state = Done. The function expecting_more_packets() would return true in this case.
// TODO, maybe, rename to ResponseState.
enum class State {FirstPacket, Field, FieldEof, Row,
ComFieldList, ComStatistics, ComStmtFetch,
Done, ErrorPacket, Error};
PacketTracker() = default;
explicit PacketTracker(GWBUF* pQuery); // Track this query
void update(GWBUF* pPacket); // Update as packets are received.
PacketTracker(const PacketTracker&) = delete;
PacketTracker& operator=(const PacketTracker&) = delete;
PacketTracker(PacketTracker&&) = default;
PacketTracker& operator=(PacketTracker&&) = default;
bool update_request(GWBUF* pPacket); // Updates the query (must be a split packet)
void update_response(GWBUF* pPacket); // Update as response packets are received.
bool expecting_request_packets() const;
bool expecting_response_packets() const;
bool expecting_more_packets() const;
State state() const;
bool expecting_more_packets() const;
private:
// State functions.
@ -47,12 +62,12 @@ private:
State com_field_list(const ComResponse& response);
State com_statistics(const ComResponse& response);
State com_stmt_fetch(const ComResponse& response);
State expect_no_more(const ComResponse& response); // states: Done, ErrorPacket, Error
State expect_no_response_packets(const ComResponse& response); // states: Done, ErrorPacket, Error
State m_state = State::Error;
bool m_client_packet_internal = false;
bool m_server_packet_internal = false;
bool m_client_com_packet_internal = false;
bool m_server_com_packet_internal = false;
bool m_expect_more_split_query_packets = false;
int m_command;
int m_total_fields;