#include "DatabaseManager.h" bool DatabaseManager::init() { QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir().mkpath(path); db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(path + "/browser.db"); if (!db.open()) { qDebug() << "Error: connection with database failed" << db.lastError(); return false; } return createTables(); } bool DatabaseManager::createTables() { QSqlQuery query; // History if (!query.exec("CREATE TABLE IF NOT EXISTS history (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "url TEXT, " "title TEXT, " "last_visit DATETIME)")) { qDebug() << "Error creating history table:" << query.lastError(); return false; } // Bookmarks if (!query.exec("CREATE TABLE IF NOT EXISTS bookmarks (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "url TEXT UNIQUE, " "title TEXT, " "created_at DATETIME)")) { qDebug() << "Error creating bookmarks table:" << query.lastError(); return false; } // Vault Meta if (!query.exec("CREATE TABLE IF NOT EXISTS vault_meta (" "key TEXT PRIMARY KEY, " "value BLOB NOT NULL)")) { qDebug() << "Error creating vault_meta table:" << query.lastError(); return false; } // Passwords if (!query.exec("CREATE TABLE IF NOT EXISTS passwords (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "origin TEXT NOT NULL, " "username TEXT NOT NULL, " "password_ciphertext BLOB NOT NULL, " "password_nonce BLOB NOT NULL, " "created_at DATETIME NOT NULL, " "updated_at DATETIME NOT NULL)")) { qDebug() << "Error creating passwords table:" << query.lastError(); return false; } // Domain settings (extensible key-value per domain) if (!query.exec("CREATE TABLE IF NOT EXISTS domain_settings (" "domain TEXT NOT NULL, " "key TEXT NOT NULL, " "value TEXT, " "PRIMARY KEY (domain, key))")) { qDebug() << "Error creating domain_settings table:" << query.lastError(); return false; } return true; } void DatabaseManager::addHistoryEntry(const QString &url, const QString &title) { if (url.isEmpty() || url == "about:blank") { return; } QSqlQuery query; query.prepare("INSERT INTO history (url, title, last_visit) VALUES (?, ?, ?)"); query.addBindValue(url); query.addBindValue(title); query.addBindValue(QDateTime::currentDateTime()); query.exec(); } void DatabaseManager::addBookmark(const QString &url, const QString &title) { QSqlQuery query; query.prepare( "INSERT OR REPLACE INTO bookmarks (url, title, created_at) " "VALUES (?, ?, ?)"); query.addBindValue(url); query.addBindValue(title); query.addBindValue(QDateTime::currentDateTime()); query.exec(); } bool DatabaseManager::isBookmarked(const QString &url) { QSqlQuery query; query.prepare("SELECT 1 FROM bookmarks WHERE url = ?"); query.addBindValue(url); query.exec(); return query.next(); } void DatabaseManager::removeBookmark(const QString &url) { QSqlQuery query; query.prepare("DELETE FROM bookmarks WHERE url = ?"); query.addBindValue(url); query.exec(); } QSqlQuery DatabaseManager::executeQuery(const QString &queryStr) { QSqlQuery query; query.exec(queryStr); return query; } bool DatabaseManager::setVaultMeta(const QString &key, const QByteArray &value) { QSqlQuery query; query.prepare("INSERT OR REPLACE INTO vault_meta (key, value) VALUES (?, ?)"); query.addBindValue(key); query.addBindValue(value); return query.exec(); } QByteArray DatabaseManager::getVaultMeta(const QString &key) { QSqlQuery query; query.prepare("SELECT value FROM vault_meta WHERE key = ?"); query.addBindValue(key); if (query.exec() && query.next()) { return query.value(0).toByteArray(); } return QByteArray(); } void DatabaseManager::setDomainSetting(const QString &domain, const QString &key, const QString &value) { if (domain.isEmpty()) { return; } QSqlQuery query; query.prepare( "INSERT OR REPLACE INTO domain_settings (domain, key, value) " "VALUES (?, ?, ?)"); query.addBindValue(domain); query.addBindValue(key); query.addBindValue(value); query.exec(); qDebug() << "Domain setting saved:" << domain << key << value; } QString DatabaseManager::getDomainSetting(const QString &domain, const QString &key, const QString &defaultValue) { if (domain.isEmpty()) { return defaultValue; } QSqlQuery query; query.prepare("SELECT value FROM domain_settings WHERE domain = ? AND key = ?"); query.addBindValue(domain); query.addBindValue(key); if (query.exec() && query.next()) { return query.value(0).toString(); } return defaultValue; }