quickmod/FuseMounter/database.cpp

144 lines
4.4 KiB
C++

#include "database.h"
#include <QDir>
#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);
QString qstr = QString("SELECT modId, filename FROM mods WHERE 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);
QString qstr = QString("SELECT moddir FROM mods WHERE 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();
ent->m_lparts = ent->m_installedPath.split( QDir::separator(), Qt::SkipEmptyParts );
ent->m_lpath = ent->m_lparts.join( QDir::separator() );
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;
}