144 lines
4.4 KiB
C++
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;
|
|
}
|