Optimized savepoint detection

Added get_pg_parameter_status
pull/4929/head
Rahim Kanji 12 months ago
parent c6fd3cef9c
commit d90bf4ac73

@ -363,7 +363,7 @@ public:
bool set_single_row_mode(); bool set_single_row_mode();
void update_bytes_recv(uint64_t bytes_recv); void update_bytes_recv(uint64_t bytes_recv);
void update_bytes_sent(uint64_t bytes_sent); void update_bytes_sent(uint64_t bytes_sent);
void ProcessQueryAndSetStatusFlags(char* query_digest_text); void ProcessQueryAndSetStatusFlags(char* query_digest_text, int savepoint_count);
inline const PGconn* get_pg_connection() const { return pgsql_conn; } inline const PGconn* get_pg_connection() const { return pgsql_conn; }
inline int get_pg_server_version() { return PQserverVersion(pgsql_conn); } inline int get_pg_server_version() { return PQserverVersion(pgsql_conn); }
@ -388,6 +388,7 @@ public:
inline int get_pg_is_threadsafe() { return PQisthreadsafe(); } inline int get_pg_is_threadsafe() { return PQisthreadsafe(); }
inline const char* get_pg_error_message() { return PQerrorMessage(pgsql_conn); } inline const char* get_pg_error_message() { return PQerrorMessage(pgsql_conn); }
inline SSL* get_pg_ssl_object() { return (SSL*)PQsslStruct(pgsql_conn, "OpenSSL"); } inline SSL* get_pg_ssl_object() { return (SSL*)PQsslStruct(pgsql_conn, "OpenSSL"); }
inline const char* get_pg_parameter_status(const char* param) { return PQparameterStatus(pgsql_conn, param); }
const char* get_pg_server_version_str(char* buff, int buff_size); const char* get_pg_server_version_str(char* buff, int buff_size);
const char* get_pg_connection_status_str(); const char* get_pg_connection_status_str();
const char* get_pg_transaction_status_str(); const char* get_pg_transaction_status_str();

@ -812,7 +812,7 @@ void PgSQL_Connection::connect_start() {
const std::string& conninfo_str = conninfo.str(); const std::string& conninfo_str = conninfo.str();
pgsql_conn = PQconnectStart(conninfo_str.c_str()); pgsql_conn = PQconnectStart(conninfo_str.c_str());
//PQsetErrorVerbosity(pgsql_conn, PQERRORS_VERBOSE); //PQsetErrorVerbosity(pgsql_conn, PQERRORS_SQLSTATE);
//PQsetErrorContextVisibility(pgsql_conn, PQSHOW_CONTEXT_ERRORS); //PQsetErrorContextVisibility(pgsql_conn, PQSHOW_CONTEXT_ERRORS);
if (pgsql_conn == NULL || PQstatus(pgsql_conn) == CONNECTION_BAD) { if (pgsql_conn == NULL || PQstatus(pgsql_conn) == CONNECTION_BAD) {
@ -1042,15 +1042,12 @@ int PgSQL_Connection::async_connect(short event) {
async_state_machine = ASYNC_IDLE; async_state_machine = ASYNC_IDLE;
myds->wait_until = 0; myds->wait_until = 0;
return 0; return 0;
break;
case ASYNC_CONNECT_FAILED: case ASYNC_CONNECT_FAILED:
return -1; return -1;
break;
case ASYNC_CONNECT_TIMEOUT: case ASYNC_CONNECT_TIMEOUT:
return -2; return -2;
break;
default: default:
return 1; break;
} }
return 1; return 1;
} }
@ -1416,8 +1413,8 @@ bool PgSQL_Connection::IsServerOffline() {
} }
bool PgSQL_Connection::is_connection_in_reusable_state() const { bool PgSQL_Connection::is_connection_in_reusable_state() const {
const PGTransactionStatusType txn_status = PQtransactionStatus(pgsql_conn); PGTransactionStatusType txn_status = PQtransactionStatus(pgsql_conn);
const bool conn_usable = !(txn_status == PQTRANS_UNKNOWN || txn_status == PQTRANS_ACTIVE); bool conn_usable = !(txn_status == PQTRANS_UNKNOWN || txn_status == PQTRANS_ACTIVE);
assert(!(conn_usable == false && is_error_present() == false)); assert(!(conn_usable == false && is_error_present() == false));
return conn_usable; return conn_usable;
} }
@ -1678,7 +1675,7 @@ void PgSQL_Connection::unhandled_notice_cb(void* arg, const PGresult* result) {
#endif #endif
} }
void PgSQL_Connection::ProcessQueryAndSetStatusFlags(char* query_digest_text) { void PgSQL_Connection::ProcessQueryAndSetStatusFlags(char* query_digest_text, int savepoint_count) {
if (query_digest_text == NULL) return; if (query_digest_text == NULL) return;
// unknown what to do with multiplex // unknown what to do with multiplex
int mul = -1; int mul = -1;
@ -1721,8 +1718,7 @@ void PgSQL_Connection::ProcessQueryAndSetStatusFlags(char* query_digest_text) {
default: default:
break; break;
} }
} } else {
else {
if (mul != 2 && index(query_digest_text, '.')) { // mul = 2 has a special meaning : do not disable multiplex for variables in THIS QUERY ONLY if (mul != 2 && index(query_digest_text, '.')) { // mul = 2 has a special meaning : do not disable multiplex for variables in THIS QUERY ONLY
if (!IsKeepMultiplexEnabledVariables(query_digest_text)) { if (!IsKeepMultiplexEnabledVariables(query_digest_text)) {
set_status(true, STATUS_MYSQL_CONNECTION_USER_VARIABLE); set_status(true, STATUS_MYSQL_CONNECTION_USER_VARIABLE);
@ -1767,18 +1763,26 @@ void PgSQL_Connection::ProcessQueryAndSetStatusFlags(char* query_digest_text) {
} }
}*/ }*/
if (get_status(STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT) == false) { if (get_status(STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT) == false) {
if (savepoint_count > 0) {
if (IsKnownActiveTransaction()) { set_status(true, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT);
if (!strncasecmp(query_digest_text, "SAVEPOINT ", strlen("SAVEPOINT "))) { } else if (savepoint_count == -1) {
set_status(true, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT); if (IsKnownActiveTransaction()) {
if (!strncasecmp(query_digest_text, "SAVEPOINT ", strlen("SAVEPOINT "))) {
set_status(true, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT);
}
} }
} }
} else { } else {
if ((IsKnownActiveTransaction() == false) || if (savepoint_count == 0) {
(strcasecmp(query_digest_text, "COMMIT") == 0) ||
(strcasecmp(query_digest_text, "ROLLBACK") == 0)) {
set_status(false, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT); set_status(false, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT);
} } else if (savepoint_count == -1) {
if ((IsKnownActiveTransaction() == false) ||
(strncasecmp(query_digest_text, "COMMIT", strlen("COMMIT")) == 0) ||
(strncasecmp(query_digest_text, "ROLLBACK", strlen("ROLLBACK")) == 0) ||
(strncasecmp(query_digest_text, "ABORT", strlen("ABORT")) == 0)) {
set_status(false, STATUS_MYSQL_CONNECTION_HAS_SAVEPOINT);
}
}
} }
} }

Loading…
Cancel
Save