mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-05 01:23:24 -08:00
Some checks are pending
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
Build Desktop / Configure (push) Waiting to run
Build Desktop / Debian 13 (push) Blocked by required conditions
Build Desktop / Debian 12 (push) Blocked by required conditions
Build Desktop / Fedora 44 (push) Blocked by required conditions
Build Desktop / Fedora 43 (push) Blocked by required conditions
Build Desktop / Servatrice_Debian 12 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 (push) Blocked by required conditions
Build Desktop / Ubuntu 24.04 (push) Blocked by required conditions
Build Desktop / Arch (push) Blocked by required conditions
Build Desktop / macOS 13 Intel (push) Blocked by required conditions
Build Desktop / macOS 14 (push) Blocked by required conditions
Build Desktop / macOS 15 (push) Blocked by required conditions
Build Desktop / macOS 26 Debug (push) Blocked by required conditions
Build Desktop / Windows 10 (push) Blocked by required conditions
Build Docker / Servatrice (arm) (push) Waiting to run
Build Docker / Servatrice (x86) (push) Waiting to run
Build Docker / Publish multi-platform Servatrice image (push) Blocked by required conditions
The parsers keep dropping printings for disabled sets so that disabling a set hides them everywhere, not just in deck editor search. The cached parse output therefore depends on enablement, which the source hash did not cover: the first parse froze whatever enablement state existed at that moment and later toggles hit the stale cache. - Fold a parser schema version and the sorted enabled set names into the binary cache source hash so toggling a set or enabling newly discovered sets (including custom ones) forces a re-parse on the next load. - Harden the legacy set migration to only write keys that exist so missing legacy values can no longer clobber cardDatabase.ini and silently disable sets on upgrade. - Make CardDatabase::reloadCardDatabasesAndNotify() bypass the binary cache so an explicit reload always re-reads the files on disk, even when their size/mtime hash still matches. - Cover cache invalidation end to end: sandboxed loads assert that disabling a set, adding a custom database and enabling a fresh set each rewrite the cache, that a no-op load keeps it, and that an explicit reload picks up edits the source hash cannot see. Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
/**
|
|
* @file card_database_settings.h
|
|
* @ingroup CardDatabase
|
|
* @ingroup CardSettings
|
|
*/
|
|
//! \todo Document this file.
|
|
|
|
#ifndef CARDDATABASESETTINGS_H
|
|
#define CARDDATABASESETTINGS_H
|
|
|
|
#include "settings_manager.h"
|
|
|
|
#include <QHash>
|
|
#include <QMutex>
|
|
#include <QString>
|
|
#include <QVector>
|
|
#include <libcockatrice/interfaces/interface_card_set_priority_controller.h>
|
|
#include <qtmetamacros.h>
|
|
|
|
class QObject;
|
|
|
|
class CardDatabaseSettings : public SettingsManager, public ICardSetPriorityController
|
|
{
|
|
Q_OBJECT
|
|
friend class SettingsCache;
|
|
|
|
public:
|
|
void setSortKey(QString shortName, unsigned int sortKey) override;
|
|
void setEnabled(QString shortName, bool enabled) override;
|
|
void setIsKnown(QString shortName, bool isknown) override;
|
|
|
|
unsigned int getSortKey(QString shortName) const override;
|
|
bool isEnabled(QString shortName) const override;
|
|
bool isKnown(QString shortName) const override;
|
|
|
|
SetOptions getSetOptions(QString shortName) const override;
|
|
|
|
QStringList getEnabledSetNames() const override;
|
|
|
|
void saveSets(const QVector<SetSaveData> &data) override;
|
|
|
|
private:
|
|
explicit CardDatabaseSettings(const QString &settingPath, QObject *parent = nullptr);
|
|
|
|
// In-memory cache of set priority options. QSettings re-opens and re-parses
|
|
// the whole .ini on every access, which is catastrophic when CardSet
|
|
// construction calls getSortKey/isEnabled/isKnown once per set during the
|
|
// database load (thousands of file parses). The cache is populated from a
|
|
// single QSettings session and kept consistent with the writes below.
|
|
mutable QMutex setOptionsMutex;
|
|
mutable QHash<QString, SetOptions> setOptionsCache;
|
|
mutable bool setOptionsLoaded = false;
|
|
|
|
void ensureSetOptionsLoaded() const;
|
|
};
|
|
|
|
#endif // CARDDATABASESETTINGS_H
|