quickmod/FuseMounter/database.cpp
Daniel O'Neill 1393a796b2 Implement FUSE VFS as a very early implementation. It can, does, and will break your game.
Updated QML and C++ in various places to build and work with new Qt (6.4+)
Minor bugfixes, possibly caused by the Qt version bump, and mostly in JS logic.
Tried (again) to get mod sorting working by dragging them within the list.
Initial support for Profiles. (To switch between FO4 and FOLON, for example.)
Initial "Launch Game" stuff, but it's far from done. Don't use it (yet).
2025-08-20 07:57:00 -07:00

139 lines
3.9 KiB
C++

#include "database.h"
#include <QSqlError>
#include <QSqlQuery>
Database::Database(QObject *parent)
: QObject{parent}
{
m_database = QSqlDatabase::addDatabase("QSQLITE");
}
void Database::setDatabase(QSqlDatabase &db)
{
m_database = db;
}
bool Database::open(const QString &dbpath)
{
m_database.setDatabaseName(dbpath);
m_open = m_database.open();
if( !m_open ) {
fprintf(stderr, "Failed to open the database: %s\n", m_database.lastError().text().toStdString().c_str());
return false;
}
readOverrides();
return m_open;
}
void Database::readOverrides()
{
QStringList overrides;
QSqlQuery q = QSqlQuery("SELECT path FROM proxyOverrides", m_database);
while( q.next() )
{
QString path = q.value(0).toString();
overrides << path;
}
m_overrides = overrides;
}
QList<ModLibrary *> Database::archiveList(int profileId)
{
/**
* @brief Load in *reverse* order preference. Why? I'll tell ya. Go on, ask me. There's a grand reason.
*
* Y'see, users will intuitively order overrides or patches to load AFTER the original.
*
* Because we work on a "first match" policy, that means we MATCH on the LATEST version,
* meaning that the last index containing a file reference will take preference for that
* file over previous ones. Effectively, this "overrides" the older (lower index) version.
*
* Y'dig? Real swell. Stay cool, hep cat.
*/
QString qstr = QString("SELECT modId, filename FROM mods WHERE enabled != 0 AND moddir IS NULL AND modId IN (SELECT modId FROM profile_selections WHERE profileId=%1) ORDER BY idx DESC").arg(profileId);
qDebug() << qstr;
QSqlQuery q = QSqlQuery(qstr, m_database);
//QSqlQuery q = QSqlQuery("SELECT modId, filename FROM mods WHERE enabled != 0 ORDER BY idx DESC", m_database);
QList<ModLibrary *> library;
while( q.next() )
{
ModLibrary *ent = new ModLibrary();
ent->m_id = q.value(0).toInt();
ent->m_filename = q.value(1).toString();
library << ent;
}
QList<ModLibrary *> results;
for( ModLibrary *ent : library )
{
ent->m_entries = modManifest( ent->m_id );
results << ent;
}
return results;
}
QStringList Database::proxyList(int profileId)
{
QStringList results;
QString qstr = QString("SELECT moddir FROM mods WHERE enabled != 0 AND NOT moddir IS NULL AND modId IN (SELECT modId FROM profile_selections WHERE profileId=%1) ORDER BY idx DESC").arg(profileId);
qDebug() << qstr;
QSqlQuery q = QSqlQuery(qstr, m_database);
while( q.next() )
{
results << q.value(0).toString();
}
return results;
}
QList<ModEntry *> Database::modManifest(int id)
{
QList<ModEntry *> results;
QSqlQuery q = QSqlQuery(m_database);
q.prepare("SELECT fileId, source, dest FROM files WHERE modId=?");
q.bindValue(0, id);
if( !q.exec() )
return results;
while( q.next() )
{
ModEntry *ent = new ModEntry();
ent->m_id = q.value(0).toInt();
ent->m_archivePath = q.value(1).toString();
ent->m_installedPath = q.value(2).toString();
results << ent;
}
return results;
}
bool Database::isProxyOverride(const QString &filepath)
{
return m_overrides.contains(filepath);
}
bool Database::registerProxyOverride(const QString &filepath)
{
QSqlQuery q = QSqlQuery(m_database);
q.prepare("INSERT INTO proxyOverrides (path)VALUES(?)");
q.bindValue(0, filepath.toStdString().c_str());
if( !q.exec() )
return false;
m_overrides.append(filepath);
return true;
}
bool Database::unregisterProxyOverride(const QString &filepath)
{
QSqlQuery q = QSqlQuery(m_database);
q.prepare("DELETE FROM proxyOverrides WHERE path LIKE ?");
q.bindValue(0, filepath.toStdString().c_str());
if( !q.exec() )
return false;
m_overrides.removeAll(filepath);
return true;
}