numberator/sqlitebackend.h
2020-08-04 01:04:52 +02:00

102 lines
2.8 KiB
C++

#ifndef SQLITEBACKEND_H
#define SQLITEBACKEND_H
#include <QObject>
#include <QPointF>
#include <QHash>
#include <QtSql>
#include <QFile>
enum TagChange {
CREATED,
CHANGED,
DELETED
};
class Tag
{
public:
Tag(long long int id, QString name, qreal anchor_x, qreal anchor_y, QByteArray metadata);
Tag();
Tag(long long int id, const Tag &other);
long long int id;
QString name;
QPointF anchor;
QVariantMap metadata;
};
class SQLiteSaveFile : public QObject
{
Q_OBJECT
public:
explicit SQLiteSaveFile(QObject *parent = nullptr, QString filename = ":memory:");
bool connect();
bool isOpen() { return m_isOpen; }
QList<Tag> getAllTags();
QByteArray getImage();
bool updateTag(Tag tag);
bool deleteTag(Tag tag);
bool createTag(Tag tag);
bool setMeta(const QString &key, const QVariant &value);
bool setMeta(std::initializer_list<QPair<QString, QVariant>> metas);
QVariant getMeta(const QString &key);
QString errorString() { return lastErrorString; }
enum Error {
NoError = 0,
SQLiteError,
ImageOpenError,
ImageReadError
};
inline const static QString errorNames[] = {
[NoError] = "No Error",
[SQLiteError] = "Database Error",
[ImageOpenError] = "Error Opening Image",
[ImageReadError] = "Error Reading Image"
};
Error error();
void resetError() { lastError = NoError; lastErrorString = QString(); }
public slots:
/** Save this project file under a new name. This changes the backend database this project file object points to, and copies all data.
* Callers can continue to use the same project file object afterwards.
*/
bool saveAs(const QString &filename);
bool reloadImageFromDisk();
bool loadImageFromDisk(const QString &filename);
bool clearNew();
signals:
void tagChange(TagChange change, const Tag &tag);
void fileReload();
void fileIOError(Error e, QString errorName, QString description);
private:
bool initDb(bool setCreationDate=true);
bool runSql(QString query, std::initializer_list<QVariant> bindings={});
bool setMetaLocked(const QString &key, const QVariant &value);
bool setMetaLocked(std::initializer_list<QPair<QString, QVariant>> metas);
QVariant getMetaLocked(const QString &key);
void setError(Error e, QString desc) { lastError = e; lastErrorString = desc; fileIOError(e, errorNames[e], desc); }
bool setDatabaseError(const QSqlQuery &q);
bool setDatabaseError(const QSqlDatabase &db);
Error lastError;
QString lastErrorString;
QSqlDatabase db;
QMutex dbMut;
QString filename;
QByteArray imageData;
bool m_isOpen;
};
#endif // SQLITEBACKEND_H