Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #20 from nemomobile/api-increase-granularity
Increase vault API granularity
  • Loading branch information
Denis Zalevskiy committed Oct 23, 2015
2 parents 95aef76 + 1d44135 commit debcfff
Show file tree
Hide file tree
Showing 9 changed files with 490 additions and 196 deletions.
13 changes: 11 additions & 2 deletions include/vault/vault.hpp
Expand Up @@ -28,7 +28,7 @@ class Snapshot
{
public:
explicit Snapshot(const Gittin::Tag &commit);

explicit Snapshot(Gittin::Repo *repo, const QString &name);
inline Gittin::Tag tag() const { return m_tag; }

QString name() const;
Expand Down Expand Up @@ -73,6 +73,7 @@ class Vault
bool clear(const QVariantMap &options);

QList<Snapshot> snapshots() const;
QList<QString> units(QString const & snapshotName) const;
Snapshot snapshot(const QByteArray &tag) const;
QString notes(const QString &snapshotName);

Expand All @@ -93,11 +94,19 @@ class Vault

Lock lock() const;

void resetLastSnapshot();

std::tuple<QString, bool, QString> backupUnit(const QString &, const QString &);
QString tagSnapshot(const QString &message);

std::tuple<QString, bool, QString> restoreUnit
(const QString &, const QString &, const QString &);

private:
bool setState(const QString &state);
bool backupUnit(const QString &home, const QString &unit, const ProgressCallback &callback);
bool restoreUnit(const QString &home, const QString &unit, const ProgressCallback &callback);
void tagSnapshot(const QString &msg);
void checkout(const QString &);
void resetMaster();

void setup(const QVariantMap *config);
Expand Down
1 change: 1 addition & 0 deletions qml/Vault/plugin.cpp
Expand Up @@ -17,6 +17,7 @@ class VaultPlugin : public QQmlExtensionPlugin
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("NemoMobile.Vault"));
qmlRegisterType<Vault>(uri, 1, 0, "Vault");
qmlRegisterType<Vault>(uri, 1, 1, "Vault");
}

void initializeEngine(QQmlEngine *engine, const char *uri)
Expand Down
107 changes: 102 additions & 5 deletions qml/Vault/vault.cpp
Expand Up @@ -18,6 +18,9 @@ static const int _vault_operation_ __attribute__((unused))
Q_DECLARE_METATYPE(Vault::ImportExportAction)
static const int _vault_importexportaction_ __attribute__((unused))
= qRegisterMetaType<Vault::ImportExportAction>();
Q_DECLARE_METATYPE(Vault::DataType)
static const int _vault_datatype__ __attribute__((unused))
= qRegisterMetaType<Vault::DataType>();

class Worker : public QObject
{
Expand Down Expand Up @@ -61,6 +64,36 @@ class Worker : public QObject
emit done(Vault::Restore, QVariantMap());
}

Q_INVOKABLE void reset()
{
debug::debug("Reset storage master to the last snapshot");
m_vault->resetLastSnapshot();
emit done(Vault::Maintenance, {{"operation", "reset"}});
}

Q_INVOKABLE void backupUnit(const QString &home, const QString &unit)
{
debug::debug(home, "- backup unit", unit);
auto res = m_vault->backupUnit(home, unit);
emit progress(Vault::Backup, {{"unit", unit}, {"status", std::get<2>(res)}});
}

Q_INVOKABLE void restoreUnit(const QString &snapshot
, const QString &home
, const QString &unit)
{
debug::debug(home, "- restore unit", unit, "snapshot", snapshot);
auto res = m_vault->restoreUnit(snapshot, home, unit);
emit progress(Vault::Restore, {{"unit", unit}, {"status", std::get<2>(res)}});
}

Q_INVOKABLE void tagSnapshot(const QString &message)
{
debug::debug("Tag snapshot, message:", message);
auto tag = m_vault->tagSnapshot(message);
emit done(Vault::Backup, {{"tag", tag}});
}

Q_INVOKABLE void backup(const QString &home, const QStringList &units, const QString &message)
{
debug::debug("Backup: home", home);
Expand Down Expand Up @@ -158,10 +191,44 @@ class Worker : public QObject
emit done(Vault::RemoveSnapshot, QVariantMap());
}

QVariantMap units()
{
QVariantMap res;
for (auto &u: m_vault->config().units())
res.insert(u.name(), u.data());

return res;
}

Q_INVOKABLE void requestData(Vault::DataType dataType
, QVariantMap const &context)
{
try {
if (dataType == Vault::SnapshotUnits) {
auto snapshotName = str(context["snapshot"]);
auto reply = context;
auto unitNames = m_vault->units(snapshotName).toSet();
auto allUnits = units();
for (auto it = allUnits.begin(); it != allUnits.end(); ++it) {
auto info = it.value().toMap();
info["snapshot"] = unitNames.contains(it.key()) ? snapshotName : "";
it.value() = info;
}
reply["units"] = allUnits;
emit data(dataType, reply);
}
} catch (error::Error const &e) {
emit error(Vault::Data, e.m);
} catch (...) {
emit error(Vault::Data, map({{"Exception", "unknown"}}));
}
}

signals:
void progress(Vault::Operation op, const QVariantMap &map);
void error(Vault::Operation op, const QVariantMap &error);
void done(Vault::Operation op, const QVariantMap &);
void data(Vault::DataType id, const QVariantMap &data);

public:
vault::Vault *m_vault;
Expand Down Expand Up @@ -223,6 +290,7 @@ void Vault::initWorker(bool reload)
connect(m_worker, &Worker::progress, this, &Vault::progress);
connect(m_worker, &Worker::error, this, &Vault::error);
connect(m_worker, &Worker::done, this, &Vault::done);
connect(m_worker, &Worker::data, this, &Vault::data);
}
try {
m_worker->init(m_root);
Expand Down Expand Up @@ -271,11 +339,7 @@ QStringList Vault::snapshots() const

QVariantMap Vault::units() const
{
QVariantMap units;
for (auto &u: m_worker->m_vault->config().units()) {
units.insert(u.name(), u.data());
}
return units;
return m_worker->units();
}

void Vault::resetHead()
Expand Down Expand Up @@ -322,4 +386,37 @@ void Vault::startGc()
debug::error("Can't start vault-gc.service");
}

void Vault::requestData(DataType dataType, QVariantMap const &context)
{
QMetaObject::invokeMethod(m_worker, "requestData"
, Q_ARG(Vault::DataType, dataType)
, Q_ARG(QVariantMap, context));
}

/// reset storage to the master head, cleanup tree
void Vault::reset()
{
QMetaObject::invokeMethod(m_worker, "reset");
}

Q_INVOKABLE void Vault::backupUnit(const QString &unit)
{
QMetaObject::invokeMethod(m_worker, "backupUnit"
, Q_ARG(QString, m_home)
, Q_ARG(QString, unit));
}

Q_INVOKABLE void Vault::tagSnapshot(const QString &message)
{
QMetaObject::invokeMethod(m_worker, "tagSnapshot", Q_ARG(QString, message));
}

Q_INVOKABLE void Vault::restoreUnit(const QString &snapshot, const QString &unit)
{
QMetaObject::invokeMethod(m_worker, "restoreUnit"
, Q_ARG(QString, snapshot)
, Q_ARG(QString, m_home)
, Q_ARG(QString, unit));
}

#include "vault.moc"
18 changes: 17 additions & 1 deletion qml/Vault/vault.hpp
Expand Up @@ -27,10 +27,17 @@ class Vault : public QObject
Restore,
RemoveSnapshot,
ExportImportPrepare,
ExportImportExecute
ExportImportExecute,
Data,
Maintenance
}
Q_ENUMS(Operation);

enum DataType {
SnapshotUnits
}
Q_ENUMS(DataType);

explicit Vault(QObject *parent = nullptr);
~Vault();

Expand All @@ -53,6 +60,13 @@ class Vault : public QObject

Q_INVOKABLE void registerUnit(const QJSValue &unit, bool global);
Q_INVOKABLE void startGc();
Q_INVOKABLE void requestData(DataType, QVariantMap const &);

Q_INVOKABLE void reset();
Q_INVOKABLE void backupUnit(const QString &unit);
Q_INVOKABLE void tagSnapshot(const QString &message);

Q_INVOKABLE void restoreUnit(const QString &, const QString &);

signals:
void rootChanged();
Expand All @@ -62,6 +76,8 @@ class Vault : public QObject
void progress(Operation operation, const QVariantMap &data);
void error(Operation operation, const QVariantMap &error);

void data(DataType id, const QVariantMap &context);

private:
void initWorker(bool reload);

Expand Down

0 comments on commit debcfff

Please sign in to comment.