DatabaseManager.cpp raw
  1#include "DatabaseManager.h"
  2
  3bool DatabaseManager::init() {
  4	QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
  5	QDir().mkpath(path);
  6
  7	db = QSqlDatabase::addDatabase("QSQLITE");
  8	db.setDatabaseName(path + "/browser.db");
  9
 10	if (!db.open()) {
 11		qDebug() << "Error: connection with database failed" << db.lastError();
 12		return false;
 13	}
 14
 15	return createTables();
 16}
 17
 18bool DatabaseManager::createTables() {
 19	QSqlQuery query;
 20
 21	// History
 22	if (!query.exec("CREATE TABLE IF NOT EXISTS history ("
 23									"id INTEGER PRIMARY KEY AUTOINCREMENT, "
 24									"url TEXT, "
 25									"title TEXT, "
 26									"last_visit DATETIME)")) {
 27		qDebug() << "Error creating history table:" << query.lastError();
 28		return false;
 29	}
 30
 31	// Bookmarks
 32	if (!query.exec("CREATE TABLE IF NOT EXISTS bookmarks ("
 33									"id INTEGER PRIMARY KEY AUTOINCREMENT, "
 34									"url TEXT UNIQUE, "
 35									"title TEXT, "
 36									"created_at DATETIME)")) {
 37		qDebug() << "Error creating bookmarks table:" << query.lastError();
 38		return false;
 39	}
 40
 41	// Vault Meta
 42	if (!query.exec("CREATE TABLE IF NOT EXISTS vault_meta ("
 43									"key TEXT PRIMARY KEY, "
 44									"value BLOB NOT NULL)")) {
 45		qDebug() << "Error creating vault_meta table:" << query.lastError();
 46		return false;
 47	}
 48
 49	// Passwords
 50	if (!query.exec("CREATE TABLE IF NOT EXISTS passwords ("
 51									"id INTEGER PRIMARY KEY AUTOINCREMENT, "
 52									"origin TEXT NOT NULL, "
 53									"username TEXT NOT NULL, "
 54									"password_ciphertext BLOB NOT NULL, "
 55									"password_nonce BLOB NOT NULL, "
 56									"created_at DATETIME NOT NULL, "
 57									"updated_at DATETIME NOT NULL)")) {
 58		qDebug() << "Error creating passwords table:" << query.lastError();
 59		return false;
 60	}
 61
 62	// Domain settings (extensible key-value per domain)
 63	if (!query.exec("CREATE TABLE IF NOT EXISTS domain_settings ("
 64									"domain TEXT NOT NULL, "
 65									"key TEXT NOT NULL, "
 66									"value TEXT, "
 67									"PRIMARY KEY (domain, key))")) {
 68		qDebug() << "Error creating domain_settings table:" << query.lastError();
 69		return false;
 70	}
 71
 72	return true;
 73}
 74
 75void DatabaseManager::addHistoryEntry(const QString &url, const QString &title) {
 76	if (url.isEmpty() || url == "about:blank") {
 77		return;
 78	}
 79
 80	QSqlQuery query;
 81	query.prepare("INSERT INTO history (url, title, last_visit) VALUES (?, ?, ?)");
 82	query.addBindValue(url);
 83	query.addBindValue(title);
 84	query.addBindValue(QDateTime::currentDateTime());
 85	query.exec();
 86}
 87
 88void DatabaseManager::addBookmark(const QString &url, const QString &title) {
 89	QSqlQuery query;
 90	query.prepare(
 91		"INSERT OR REPLACE INTO bookmarks (url, title, created_at) "
 92		"VALUES (?, ?, ?)");
 93	query.addBindValue(url);
 94	query.addBindValue(title);
 95	query.addBindValue(QDateTime::currentDateTime());
 96	query.exec();
 97}
 98
 99bool DatabaseManager::isBookmarked(const QString &url) {
100	QSqlQuery query;
101	query.prepare("SELECT 1 FROM bookmarks WHERE url = ?");
102	query.addBindValue(url);
103	query.exec();
104	return query.next();
105}
106
107void DatabaseManager::removeBookmark(const QString &url) {
108	QSqlQuery query;
109	query.prepare("DELETE FROM bookmarks WHERE url = ?");
110	query.addBindValue(url);
111	query.exec();
112}
113
114QSqlQuery DatabaseManager::executeQuery(const QString &queryStr) {
115	QSqlQuery query;
116	query.exec(queryStr);
117	return query;
118}
119
120bool DatabaseManager::setVaultMeta(const QString &key, const QByteArray &value) {
121	QSqlQuery query;
122	query.prepare("INSERT OR REPLACE INTO vault_meta (key, value) VALUES (?, ?)");
123	query.addBindValue(key);
124	query.addBindValue(value);
125	return query.exec();
126}
127
128QByteArray DatabaseManager::getVaultMeta(const QString &key) {
129	QSqlQuery query;
130	query.prepare("SELECT value FROM vault_meta WHERE key = ?");
131	query.addBindValue(key);
132	if (query.exec() && query.next()) {
133		return query.value(0).toByteArray();
134	}
135	return QByteArray();
136}
137
138void DatabaseManager::setDomainSetting(const QString &domain, const QString &key, const QString &value) {
139	if (domain.isEmpty()) {
140		return;
141	}
142	QSqlQuery query;
143	query.prepare(
144		"INSERT OR REPLACE INTO domain_settings (domain, key, value) "
145		"VALUES (?, ?, ?)");
146	query.addBindValue(domain);
147	query.addBindValue(key);
148	query.addBindValue(value);
149	query.exec();
150	qDebug() << "Domain setting saved:" << domain << key << value;
151}
152
153QString DatabaseManager::getDomainSetting(const QString &domain, const QString &key, const QString &defaultValue) {
154	if (domain.isEmpty()) {
155		return defaultValue;
156	}
157	QSqlQuery query;
158	query.prepare("SELECT value FROM domain_settings WHERE domain = ? AND key = ?");
159	query.addBindValue(domain);
160	query.addBindValue(key);
161	if (query.exec() && query.next()) {
162		return query.value(0).toString();
163	}
164	return defaultValue;
165}