сохранение веб сервисов с чатом
This commit is contained in:
+253
@@ -5,6 +5,7 @@
|
||||
#include <QTableWidget>
|
||||
|
||||
#include "qlistwidget.h"
|
||||
#include "webserverchat.h"
|
||||
|
||||
uDataBase::uDataBase(const QString& dbFileName, QObject* parent)
|
||||
: QObject(parent)
|
||||
@@ -76,6 +77,12 @@ bool uDataBase::initializeDatabase()
|
||||
return false;
|
||||
}
|
||||
|
||||
// Создаем таблицу для чатов
|
||||
if (!createChatsTable()) {
|
||||
qWarning() << "Failed to create chats table";
|
||||
// Продолжаем, даже если не удалось создать таблицу чатов
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -925,4 +932,250 @@ QString uDataBase::lastError() const
|
||||
return m_lastError;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Создает таблицу для хранения настроек чатов
|
||||
*/
|
||||
bool uDataBase::createChatsTable()
|
||||
{
|
||||
QSqlQuery query(m_db);
|
||||
QString sql =
|
||||
"CREATE TABLE IF NOT EXISTS chats ("
|
||||
" id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
" name TEXT NOT NULL,"
|
||||
" type TEXT NOT NULL," // "chat" или "notification"
|
||||
" port INTEGER NOT NULL,"
|
||||
" font_list TEXT,"
|
||||
" background_color TEXT,"
|
||||
" block_color TEXT,"
|
||||
" border_color TEXT,"
|
||||
" border_size INTEGER,"
|
||||
" padding INTEGER,"
|
||||
" transparency INTEGER,"
|
||||
" font_family TEXT,"
|
||||
" font_size INTEGER,"
|
||||
" font_color TEXT,"
|
||||
" freez BOOLEAN,"
|
||||
" message_timeout INTEGER,"
|
||||
" max_msg_count INTEGER,"
|
||||
" delete_by_time BOOLEAN,"
|
||||
" created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
|
||||
")";
|
||||
|
||||
if (!query.exec(sql)) {
|
||||
m_lastError = query.lastError().text();
|
||||
qWarning() << "Failed to create chats table:" << m_lastError;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Создаем индекс для быстрого поиска по порту
|
||||
sql = "CREATE INDEX IF NOT EXISTS idx_chats_port ON chats (port)";
|
||||
query.exec(sql);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Сохраняет настройки чата в базу данных
|
||||
*/
|
||||
bool uDataBase::saveChat(const QString &name, const QString &type,
|
||||
HttpServerChat *server, const QString &fontList)
|
||||
{
|
||||
if (!server) {
|
||||
m_lastError = "Server is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_db.isOpen()) {
|
||||
m_lastError = "Database is not open";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Создаем таблицу если не существует
|
||||
if (!tableExists("chats")) {
|
||||
if (!createChatsTable()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QSqlQuery query(m_db);
|
||||
query.prepare(
|
||||
"INSERT OR REPLACE INTO chats ("
|
||||
" name, type, port, font_list, background_color, "
|
||||
" block_color, border_color, border_size, padding, "
|
||||
" transparency, font_family, font_size, font_color, "
|
||||
" freez, message_timeout, max_msg_count, delete_by_time"
|
||||
") VALUES ("
|
||||
" :name, :type, :port, :font_list, :background_color, "
|
||||
" :block_color, :border_color, :border_size, :padding, "
|
||||
" :transparency, :font_family, :font_size, :font_color, "
|
||||
" :freez, :message_timeout, :max_msg_count, :delete_by_time"
|
||||
")"
|
||||
);
|
||||
|
||||
query.bindValue(":name", name);
|
||||
query.bindValue(":type", type);
|
||||
query.bindValue(":port", server->port());
|
||||
query.bindValue(":font_list", fontList);
|
||||
query.bindValue(":background_color", server->getBackgroundColor());
|
||||
query.bindValue(":block_color", server->getBlockColor());
|
||||
query.bindValue(":border_color", server->getBorderColor());
|
||||
query.bindValue(":border_size", server->getBorderSize());
|
||||
query.bindValue(":padding", server->getPadding());
|
||||
query.bindValue(":transparency", server->getTransparency());
|
||||
query.bindValue(":font_family", server->getFontFamily());
|
||||
query.bindValue(":font_size", server->getFontSize());
|
||||
query.bindValue(":font_color", server->getFontColor());
|
||||
query.bindValue(":freez", server->isFreez());
|
||||
query.bindValue(":message_timeout", server->getMessageTimeout());
|
||||
query.bindValue(":max_msg_count", server->getMaxMsgCount());
|
||||
query.bindValue(":delete_by_time", !server->isFreez()); // delete_by_time = !freez
|
||||
|
||||
if (!query.exec()) {
|
||||
m_lastError = query.lastError().text();
|
||||
qWarning() << "Failed to save chat:" << m_lastError;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Загружает все сохраненные чаты из базы данных
|
||||
*/
|
||||
QList<ChatSettings> uDataBase::loadAllChats()
|
||||
{
|
||||
QList<ChatSettings> chats;
|
||||
|
||||
if (!m_db.isOpen()) {
|
||||
m_lastError = "Database is not open";
|
||||
return chats;
|
||||
}
|
||||
|
||||
if (!tableExists("chats")) {
|
||||
// Если таблицы нет, ничего не загружаем
|
||||
return chats;
|
||||
}
|
||||
|
||||
QSqlQuery query(m_db);
|
||||
QString sql = "SELECT * FROM chats ORDER BY created_at";
|
||||
|
||||
if (!query.exec(sql)) {
|
||||
m_lastError = query.lastError().text();
|
||||
qWarning() << "Failed to load chats:" << m_lastError;
|
||||
return chats;
|
||||
}
|
||||
|
||||
while (query.next()) {
|
||||
ChatSettings settings;
|
||||
settings.id = query.value("id").toInt();
|
||||
settings.name = query.value("name").toString();
|
||||
settings.type = query.value("type").toString();
|
||||
settings.port = query.value("port").toInt();
|
||||
settings.fontList = query.value("font_list").toString().split(',', Qt::SkipEmptyParts);
|
||||
settings.backgroundColor = query.value("background_color").toString();
|
||||
settings.blockColor = query.value("block_color").toString();
|
||||
settings.borderColor = query.value("border_color").toString();
|
||||
settings.borderSize = query.value("border_size").toInt();
|
||||
settings.padding = query.value("padding").toInt();
|
||||
settings.transparency = query.value("transparency").toInt();
|
||||
settings.fontFamily = query.value("font_family").toString();
|
||||
settings.fontSize = query.value("font_size").toInt();
|
||||
settings.fontColor = query.value("font_color").toString();
|
||||
settings.freez = query.value("freez").toBool();
|
||||
settings.messageTimeout = query.value("message_timeout").toInt();
|
||||
settings.maxMsgCount = query.value("max_msg_count").toInt();
|
||||
settings.deleteByTime = query.value("delete_by_time").toBool();
|
||||
|
||||
chats.append(settings);
|
||||
}
|
||||
|
||||
return chats;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Удаляет чат из базы данных по порту
|
||||
*/
|
||||
bool uDataBase::deleteChat(int port)
|
||||
{
|
||||
if (!m_db.isOpen()) {
|
||||
m_lastError = "Database is not open";
|
||||
return false;
|
||||
}
|
||||
|
||||
QSqlQuery query(m_db);
|
||||
query.prepare("DELETE FROM chats WHERE port = :port");
|
||||
query.bindValue(":port", port);
|
||||
|
||||
if (!query.exec()) {
|
||||
m_lastError = query.lastError().text();
|
||||
qWarning() << "Failed to delete chat:" << m_lastError;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Обновляет настройки существующего чата
|
||||
*/
|
||||
bool uDataBase::updateChat(const QString &name, HttpServerChat *server,
|
||||
const QString &fontList, int oldPort)
|
||||
{
|
||||
if (!server) {
|
||||
m_lastError = "Server is null";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_db.isOpen()) {
|
||||
m_lastError = "Database is not open";
|
||||
return false;
|
||||
}
|
||||
|
||||
QSqlQuery query(m_db);
|
||||
query.prepare(
|
||||
"UPDATE chats SET "
|
||||
" name = :name, "
|
||||
" port = :port, "
|
||||
" font_list = :font_list, "
|
||||
" background_color = :background_color, "
|
||||
" block_color = :block_color, "
|
||||
" border_color = :border_color, "
|
||||
" border_size = :border_size, "
|
||||
" padding = :padding, "
|
||||
" transparency = :transparency, "
|
||||
" font_family = :font_family, "
|
||||
" font_size = :font_size, "
|
||||
" font_color = :font_color, "
|
||||
" freez = :freez, "
|
||||
" message_timeout = :message_timeout, "
|
||||
" max_msg_count = :max_msg_count, "
|
||||
" delete_by_time = :delete_by_time "
|
||||
"WHERE port = :old_port"
|
||||
);
|
||||
|
||||
query.bindValue(":name", name);
|
||||
query.bindValue(":port", server->port());
|
||||
query.bindValue(":font_list", fontList);
|
||||
query.bindValue(":background_color", server->getBackgroundColor());
|
||||
query.bindValue(":block_color", server->getBlockColor());
|
||||
query.bindValue(":border_color", server->getBorderColor());
|
||||
query.bindValue(":border_size", server->getBorderSize());
|
||||
query.bindValue(":padding", server->getPadding());
|
||||
query.bindValue(":transparency", server->getTransparency());
|
||||
query.bindValue(":font_family", server->getFontFamily());
|
||||
query.bindValue(":font_size", server->getFontSize());
|
||||
query.bindValue(":font_color", server->getFontColor());
|
||||
query.bindValue(":freez", server->isFreez());
|
||||
query.bindValue(":message_timeout", server->getMessageTimeout());
|
||||
query.bindValue(":max_msg_count", server->getMaxMsgCount());
|
||||
query.bindValue(":delete_by_time", !server->isFreez());
|
||||
query.bindValue(":old_port", oldPort);
|
||||
|
||||
if (!query.exec()) {
|
||||
m_lastError = query.lastError().text();
|
||||
qWarning() << "Failed to update chat:" << m_lastError;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user