Added options to set timeout values on database object

This commit is contained in:
FredyH 2023-09-04 03:22:34 +02:00
parent 9170d617db
commit f659497804
No known key found for this signature in database
3 changed files with 78 additions and 2 deletions

View File

@ -148,6 +148,36 @@ MYSQLOO_LUA_FUNCTION(setSSLSettings) {
return 0;
}
MYSQLOO_LUA_FUNCTION(setReadTimeout) {
auto database = LuaObject::getLuaObject<LuaDatabase>(LUA);
unsigned int timeout = (int) LUA->GetNumber(2);
if (timeout == 0) {
LUA->ThrowError("Timeout must be at least 1");
}
database->m_database->setReadTimeout(timeout);
return 0;
}
MYSQLOO_LUA_FUNCTION(setWriteTimeout) {
auto database = LuaObject::getLuaObject<LuaDatabase>(LUA);
unsigned int timeout = (int) LUA->GetNumber(2);
if (timeout == 0) {
LUA->ThrowError("Timeout must be at least 1");
}
database->m_database->setWriteTimeout(timeout);
return 0;
}
MYSQLOO_LUA_FUNCTION(setConnectTimeout) {
auto database = LuaObject::getLuaObject<LuaDatabase>(LUA);
unsigned int timeout = (int) LUA->GetNumber(2);
if (timeout == 0) {
LUA->ThrowError("Timeout must be at least 1");
}
database->m_database->setConnectTimeout(timeout);
return 0;
}
MYSQLOO_LUA_FUNCTION(disconnect) {
auto database = LuaObject::getLuaObject<LuaDatabase>(LUA);
bool wait = false;
@ -252,6 +282,15 @@ void LuaDatabase::createMetaTable(ILuaBase *LUA) {
LUA->PushCFunction(setSSLSettings);
LUA->SetField(-2, "setSSLSettings");
LUA->PushCFunction(setReadTimeout);
LUA->SetField(-2, "setReadTimeout");
LUA->PushCFunction(setWriteTimeout);
LUA->SetField(-2, "setWriteTimeout");
LUA->PushCFunction(setConnectTimeout);
LUA->SetField(-2, "setConnectTimeout");
LUA->PushCFunction(disconnect);
LUA->SetField(-2, "disconnect");

View File

@ -1,7 +1,6 @@
#include "Database.h"
#include "MySQLOOException.h"
#include <string>
#include <cstring>
#include <iostream>
#include <utility>
#include "mysqld_error.h"
@ -374,6 +373,7 @@ void Database::connectRun() {
m_status = DATABASE_CONNECTION_FAILED;
return;
}
this->applyTimeoutSettings();
this->customSSLSettings.applySSLSettings(this->m_sql);
const char *socketStr = (this->socket.length() == 0) ? nullptr : this->socket.c_str();
unsigned long clientFlag = (this->useMultiStatements) ? CLIENT_MULTI_STATEMENTS : 0;
@ -406,6 +406,8 @@ void Database::connectRun() {
}
}
#pragma clang diagnostic push
#pragma ide diagnostic ignored "misc-no-recursion"
void Database::runQuery(const std::shared_ptr<IQuery>& query, const std::shared_ptr<IQueryData>& data, bool retry) {
try {
query->executeStatement(*this, this->m_sql, data);
@ -427,6 +429,7 @@ void Database::runQuery(const std::shared_ptr<IQuery>& query, const std::shared_
}
}
}
#pragma clang diagnostic pop
/* The run method of the thread of the database instance.
*/
@ -469,11 +472,34 @@ void Database::run() {
bool Database::attemptReconnect() {
bool success;
my_bool reconnect = '1';
mysql_optionsv(this->m_sql, MYSQL_OPT_RECONNECT, &reconnect);
success = mariadb_reconnect(this->m_sql) == 0;
reconnect = '0';
mysql_optionsv(this->m_sql, MYSQL_OPT_RECONNECT, &reconnect);
return success;
}
void Database::setConnectTimeout(unsigned int timeout) {
this->connectTimeout = timeout;
}
void Database::setReadTimeout(unsigned int timeout) {
this->readTimeout = timeout;
}
void Database::setWriteTimeout(unsigned int timeout) {
this->writeTimeout = timeout;
}
void Database::applyTimeoutSettings() {
if (this->connectTimeout > 0) {
mysql_optionsv(this->m_sql, MYSQL_OPT_CONNECT_TIMEOUT, &this->connectTimeout);
}
if (this->readTimeout > 0) {
mysql_optionsv(this->m_sql, MYSQL_OPT_READ_TIMEOUT, &this->readTimeout);
}
if (this->writeTimeout > 0) {
mysql_optionsv(this->m_sql, MYSQL_OPT_WRITE_TIMEOUT, &this->writeTimeout);
}
}
StatementHandle::StatementHandle(MYSQL_STMT *stmt, bool valid) : stmt(stmt), valid(valid) {}

View File

@ -95,6 +95,12 @@ public:
void disconnect(bool wait);
void setConnectTimeout(unsigned int timeout);
void setReadTimeout(unsigned int timeout);
void setWriteTimeout(unsigned int timeout);
void setSSLSettings(const SSLSettings &settings);
bool isConnectionDone() { return m_connectionDone; }
@ -132,6 +138,8 @@ private:
void waitForQuery(const std::shared_ptr<IQuery> &query, const std::shared_ptr<IQueryData> &data);
void applyTimeoutSettings();
BlockingQueue<std::pair<std::shared_ptr<IQuery>, std::shared_ptr<IQueryData>>> finishedQueries{};
BlockingQueue<std::pair<std::shared_ptr<IQuery>, std::shared_ptr<IQueryData>>> queryQueue{};
std::unordered_set<std::shared_ptr<StatementHandle>> cachedStatements{};
@ -165,6 +173,9 @@ private:
std::string socket;
unsigned int port;
SSLSettings customSSLSettings{};
unsigned int readTimeout = 0;
unsigned int writeTimeout = 0;
unsigned int connectTimeout = 0;
std::atomic<DatabaseStatus> m_status{DATABASE_NOT_CONNECTED};
};