mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-27 08:24:39 -07:00
[Servatrice] Detect MySQL strict mode on startup and exit early
This commit is contained in:
parent
ada774f5cc
commit
4f16f33444
2 changed files with 33 additions and 0 deletions
|
|
@ -12,6 +12,7 @@
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
#include <QSqlError>
|
#include <QSqlError>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
|
#include <QStringList>
|
||||||
#include <libcockatrice/deck_list/deck_list.h>
|
#include <libcockatrice/deck_list/deck_list.h>
|
||||||
#include <libcockatrice/protocol/pb/game_replay.pb.h>
|
#include <libcockatrice/protocol/pb/game_replay.pb.h>
|
||||||
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
|
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
|
||||||
|
|
@ -98,12 +99,43 @@ bool Servatrice_DatabaseInterface::openDatabase()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isStrictModeEnabled()) {
|
||||||
|
qCCritical(DatabaseInterfaceLog) << poolStr
|
||||||
|
<< "Error opening database: MySQL/MariaDB strict mode is enabled, which "
|
||||||
|
"breaks most servatrice database operations. Please disable strict mode "
|
||||||
|
"by removing STRICT_TRANS_TABLES and STRICT_ALL_TABLES from sql_mode, "
|
||||||
|
"for example by adding 'sql_mode=NO_ENGINE_SUBSTITUTION' under [mysqld] "
|
||||||
|
"in your my.cnf (or my.ini on Windows) and restarting the database "
|
||||||
|
"server.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// reset all prepared statements
|
// reset all prepared statements
|
||||||
qDeleteAll(preparedStatements);
|
qDeleteAll(preparedStatements);
|
||||||
preparedStatements.clear();
|
preparedStatements.clear();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Servatrice_DatabaseInterface::isStrictModeEnabled() const
|
||||||
|
{
|
||||||
|
if (sqlDatabase.driverName() != "QMYSQL") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSqlQuery query(sqlDatabase);
|
||||||
|
if (!query.exec("SELECT @@GLOBAL.sql_mode")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QStringList modes = query.next() ? query.value(0).toString().split(',') : QStringList();
|
||||||
|
for (const QString &mode : modes) {
|
||||||
|
if (mode.trimmed() == "STRICT_TRANS_TABLES" || mode.trimmed() == "STRICT_ALL_TABLES") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool Servatrice_DatabaseInterface::checkSql()
|
bool Servatrice_DatabaseInterface::checkSql()
|
||||||
{
|
{
|
||||||
if (!sqlDatabase.isValid()) {
|
if (!sqlDatabase.isValid()) {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ private:
|
||||||
bool checkUserIsIpBanned(const QString &ipAddress, QString &banReason, int &banSecondsRemaining);
|
bool checkUserIsIpBanned(const QString &ipAddress, QString &banReason, int &banSecondsRemaining);
|
||||||
/** Must be called after checkSql and server is known to be in auth mode. */
|
/** Must be called after checkSql and server is known to be in auth mode. */
|
||||||
bool checkUserIsNameBanned(QString const &userName, QString &banReason, int &banSecondsRemaining);
|
bool checkUserIsNameBanned(QString const &userName, QString &banReason, int &banSecondsRemaining);
|
||||||
|
bool isStrictModeEnabled() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler,
|
AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue