Add DatabaseManager singleton with SQLite initialization and basic tables (Account, Folder, MailCopy, Attachment)
This commit is contained in:
+3
-2
@@ -15,7 +15,7 @@ find_package(Qt6 COMPONENTS Core Gui Widgets Network Sql WebEngineWidgets REQUIR
|
|||||||
# Include directories
|
# Include directories
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/src)
|
include_directories(${PROJECT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
# Source files - we will add them later
|
# Source files
|
||||||
set(SRC_FILES
|
set(SRC_FILES
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/core/translator.cpp
|
src/core/translator.cpp
|
||||||
@@ -24,6 +24,7 @@ set(SRC_FILES
|
|||||||
src/core/models/folder.cpp
|
src/core/models/folder.cpp
|
||||||
src/services/synchronizer.cpp
|
src/services/synchronizer.cpp
|
||||||
src/services/imap/imapsynchronizer.cpp
|
src/services/imap/imapsynchronizer.cpp
|
||||||
|
src/db/databasemanager.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Executable
|
# Executable
|
||||||
@@ -37,4 +38,4 @@ target_link_libraries(wino-mail-qt PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::
|
|||||||
# target_include_directories(wino-mail-qt PRIVATE ${LIBETPAN_INCLUDE_DIRS} ${GMIME_INCLUDE_DIRS})
|
# target_include_directories(wino-mail-qt PRIVATE ${LIBETPAN_INCLUDE_DIRS} ${GMIME_INCLUDE_DIRS})
|
||||||
|
|
||||||
# Install (optional)
|
# Install (optional)
|
||||||
install(TARGETS wino-mail-qt DESTINATION bin)
|
install(TARGETS wino-mail-qt DESTINATION bin)
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
#include "databasemanager.h"
|
||||||
|
#include <QSqlQuery>
|
||||||
|
#include <QSqlError>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
DatabaseManager& DatabaseManager::instance()
|
||||||
|
{
|
||||||
|
static DatabaseManager instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseManager::DatabaseManager() = default;
|
||||||
|
|
||||||
|
DatabaseManager::~DatabaseManager()
|
||||||
|
{
|
||||||
|
if (m_db.isOpen()) {
|
||||||
|
m_db.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DatabaseManager::initialize(const QString& databasePath)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&m_mutex);
|
||||||
|
if (m_initialized) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString dbPath = databasePath;
|
||||||
|
if (dbPath.isEmpty()) {
|
||||||
|
// Use application data location
|
||||||
|
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation));
|
||||||
|
if (!dir.exists()) {
|
||||||
|
dir.mkpath(".");
|
||||||
|
}
|
||||||
|
dbPath = dir.filePath("wino-mail.sqlite");
|
||||||
|
}
|
||||||
|
|
||||||
|
m_db = QSqlDatabase::addDatabase("QSQLITE", "wino_mail_connection");
|
||||||
|
m_db.setDatabaseName(dbPath);
|
||||||
|
|
||||||
|
if (!m_db.open()) {
|
||||||
|
qWarning() << "Failed to open database:" << m_db.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create tables if they don't exist
|
||||||
|
QSqlQuery query(m_db);
|
||||||
|
// We'll create a minimal set of tables for now; can be expanded later.
|
||||||
|
// Based on Wino Mail schema: Account, Folder, MailCopy (mail items), etc.
|
||||||
|
|
||||||
|
// Account table
|
||||||
|
if (!query.exec(
|
||||||
|
"CREATE TABLE IF NOT EXISTS Account ("
|
||||||
|
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
"email TEXT NOT NULL, "
|
||||||
|
"displayName TEXT, "
|
||||||
|
"type INTEGER NOT NULL, " // 0=Outlook,1=Gmail,2=IMAP
|
||||||
|
"accessToken TEXT, "
|
||||||
|
"refreshToken TEXT, "
|
||||||
|
"tokenExpires DATETIME"
|
||||||
|
");")) {
|
||||||
|
qWarning() << "Failed to create Account table:" << query.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Folder table
|
||||||
|
if (!query.exec(
|
||||||
|
"CREATE TABLE IF NOT EXISTS Folder ("
|
||||||
|
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
"accountId INTEGER NOT NULL, "
|
||||||
|
"name TEXT NOT NULL, "
|
||||||
|
"parentFolderId TEXT, "
|
||||||
|
"isInbox BOOLEAN DEFAULT 0, "
|
||||||
|
"isSent BOOLEAN DEFAULT 0, "
|
||||||
|
"isDrafts BOOLEAN DEFAULT 0, "
|
||||||
|
"isTrash BOOLEAN DEFAULT 0, "
|
||||||
|
"unreadCount INTEGER DEFAULT 0, "
|
||||||
|
"lastSynced DATETIME, "
|
||||||
|
"FOREIGN KEY(accountId) REFERENCES Account(id)"
|
||||||
|
");")) {
|
||||||
|
qWarning() << "Failed to create Folder table:" << query.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MailCopy table (simplified)
|
||||||
|
if (!query.exec(
|
||||||
|
"CREATE TABLE IF NOT EXISTS MailCopy ("
|
||||||
|
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
"folderId INTEGER NOT NULL, "
|
||||||
|
"messageId TEXT UNIQUE, "
|
||||||
|
"subject TEXT, "
|
||||||
|
"sender TEXT, "
|
||||||
|
"recipient TEXT, "
|
||||||
|
"date DATETIME, "
|
||||||
|
"read BOOLEAN DEFAULT 0, "
|
||||||
|
"flagged BOOLEAN DEFAULT 0, "
|
||||||
|
"hasAttachment BOOLEAN DEFAULT 0, "
|
||||||
|
"size INTEGER, "
|
||||||
|
"fileId TEXT, " // references the .eml file in storage
|
||||||
|
"FOREIGN KEY(folderId) REFERENCES Folder(id)"
|
||||||
|
");")) {
|
||||||
|
qWarning() << "Failed to create MailCopy table:" << query.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attachments table (optional)
|
||||||
|
if (!query.exec(
|
||||||
|
"CREATE TABLE IF NOT EXISTS Attachment ("
|
||||||
|
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
"mailCopyId INTEGER NOT NULL, "
|
||||||
|
"filename TEXT, "
|
||||||
|
"mimeType TEXT, "
|
||||||
|
"size INTEGER, "
|
||||||
|
"contentId TEXT, "
|
||||||
|
"FOREIGN KEY(mailCopyId) REFERENCES MailCopy(id)"
|
||||||
|
");")) {
|
||||||
|
qWarning() << "Failed to create Attachment table:" << query.lastError().text();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_initialized = true;
|
||||||
|
qDebug() << "Database initialized at:" << dbPath;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QSqlDatabase& DatabaseManager::database()
|
||||||
|
{
|
||||||
|
return m_db;
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QSqlDatabase>
|
||||||
|
#include <QString>
|
||||||
|
#include <QMutex>
|
||||||
|
|
||||||
|
class DatabaseManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static DatabaseManager& instance();
|
||||||
|
~DatabaseManager();
|
||||||
|
|
||||||
|
bool initialize(const QString& databasePath = QStringLiteral("wino-mail.sqlite"));
|
||||||
|
QSqlDatabase& database();
|
||||||
|
|
||||||
|
private:
|
||||||
|
DatabaseManager();
|
||||||
|
Q_DISABLE_COPY(DatabaseManager)
|
||||||
|
|
||||||
|
QSqlDatabase m_db;
|
||||||
|
QMutex m_mutex;
|
||||||
|
bool m_initialized{false};
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user