From 28320ace18d976acb8d12b8b5e9adead0c5cbf32 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 9 Jan 2017 14:34:06 +0100 Subject: [PATCH] Update item in client --- QtClient/JoplinQtClient/models/basemodel.cpp | 45 +++++++++---- QtClient/JoplinQtClient/models/basemodel.h | 3 + .../JoplinQtClient/models/foldermodel.cpp | 16 ++++- QtClient/JoplinQtClient/synchronizer.cpp | 63 +++++++++---------- 4 files changed, 78 insertions(+), 49 deletions(-) diff --git a/QtClient/JoplinQtClient/models/basemodel.cpp b/QtClient/JoplinQtClient/models/basemodel.cpp index 49045bade1..e4d3f46979 100755 --- a/QtClient/JoplinQtClient/models/basemodel.cpp +++ b/QtClient/JoplinQtClient/models/basemodel.cpp @@ -51,6 +51,8 @@ bool BaseModel::load(const QString &id) { bool BaseModel::save(bool trackChanges) { bool isNew = this->isNew(); + qDebug() << "SAVING" << valuesToString(); + if (!changedFields_.size() && !isNew) return true; QStringList fields = changedFields(); @@ -64,7 +66,7 @@ bool BaseModel::save(bool trackChanges) { // If it's a new entry and the ID is a UUID, we need to create this // ID now. If the ID is an INT, it will be automatically set by // SQLite. - if (isNew && primaryKeyIsUuid()) { + if (isNew && primaryKeyIsUuid() && !valueIsSet(primaryKey())) { values[primaryKey()] = uuid::createUuid(); } @@ -184,6 +186,7 @@ bool BaseModel::trackChanges() const { } bool BaseModel::isNew() const { + qDebug() << "EEEEEEEEEEEEEEEEEEEEEE" << isNew_ << primaryKey() << valueIsSet(primaryKey()) << values_["id"].toString(); if (isNew_ == 0) return false; if (isNew_ == 1) return true; return !valueIsSet(primaryKey()); @@ -259,10 +262,8 @@ void BaseModel::loadSqlQuery(const QSqlQuery &query) { } if (field.type == QMetaType::QString) { - //values_.insert(field.name, Value(query.value(idx).toString())); setValue(field.name, query.value(idx).toString()); } else if (field.type == QMetaType::Int) { - //values_.insert(field.name, Value(query.value(idx).toInt())); setValue(field.name, query.value(idx).toInt()); } else { qCritical() << "Unsupported value type" << field.name; @@ -284,20 +285,21 @@ void BaseModel::loadJsonObject(const QJsonObject &jsonObject) { QVector fields = BaseModel::tableFields(table()); foreach (BaseModel::Field field, fields) { - if (field.type == QMetaType::QString) { - //values_.insert(field.name, Value(jsonObject[field.name].toString())); - setValue(field.name, jsonObject[field.name].toString()); - } else if (field.type == QMetaType::Int) { - //values_.insert(field.name, Value(jsonObject[field.name].toInt())); - setValue(field.name, jsonObject[field.name].toInt()); - } else { - qCritical() << "Unsupported value type" << field.name; - } + setValue(field.name, jsonObject[field.name], field.type); } isNew_ = 1; } +void BaseModel::patchJsonObject(const QJsonObject &jsonObject) { + QVector fields = BaseModel::tableFields(table()); + + foreach (BaseModel::Field field, fields) { + if (!jsonObject.contains(field.name)) continue; + setValue(field.name, jsonObject[field.name], field.type); + } +} + QHash BaseModel::values() const { return values_; } @@ -330,11 +332,30 @@ void BaseModel::setValue(const QString &name, int value) { setValue(name, Value(value)); } +void BaseModel::setValue(const QString &name, const QJsonValue &value, QMetaType::Type type) { + if (type == QMetaType::QString) { + setValue(name, value.toString()); + } else if (type == QMetaType::Int) { + setValue(name, value.toInt()); + } else { + qCritical() << "Unsupported value type" << name << type; + } +} + BaseModel::Value BaseModel::id() const { if (!valueIsSet(primaryKey())) return QVariant(); return value(primaryKey()); } +QString BaseModel::valuesToString() const { + QString s; + for (QHash::const_iterator it = values_.begin(); it != values_.end(); ++it) { + if (s != "") s += "\n"; + s += it.key() + " = " + it.value().toString(); + } + return s; +} + QString BaseModel::tableName(Table t) { if (t == jop::FoldersTable) return "folders"; if (t == jop::NotesTable) return "notes"; diff --git a/QtClient/JoplinQtClient/models/basemodel.h b/QtClient/JoplinQtClient/models/basemodel.h index 2ee62cf97f..f761dc0c8b 100755 --- a/QtClient/JoplinQtClient/models/basemodel.h +++ b/QtClient/JoplinQtClient/models/basemodel.h @@ -60,6 +60,7 @@ public: void loadSqlQuery(const QSqlQuery& query); void loadJsonObject(const QJsonObject& jsonObject); + void patchJsonObject(const QJsonObject& jsonObject); QHash values() const; Value value(const QString& name) const; bool valueIsSet(const QString& name) const; @@ -67,7 +68,9 @@ public: void setValue(const QString& name, const QVariant& value); void setValue(const QString& name, const QString& value); void setValue(const QString& name, int value); + void setValue(const QString& name, const QJsonValue& value, QMetaType::Type type); Value id() const; + QString valuesToString() const; static QString tableName(Table t); diff --git a/QtClient/JoplinQtClient/models/foldermodel.cpp b/QtClient/JoplinQtClient/models/foldermodel.cpp index bb6812d844..10a20240ad 100755 --- a/QtClient/JoplinQtClient/models/foldermodel.cpp +++ b/QtClient/JoplinQtClient/models/foldermodel.cpp @@ -47,9 +47,9 @@ bool FolderModel::setData(const QModelIndex &index, const QVariant &value, int r if (!folder.save()) return false; cache_.clear(); - QVector roles; - roles << Qt::DisplayRole; - emit dataChanged(this->index(0), this->index(rowCount() - 1), roles); +// QVector roles; +// roles << Qt::DisplayRole; +// emit dataChanged(this->index(0), this->index(rowCount() - 1), roles); return true; } @@ -165,6 +165,9 @@ void FolderModel::deleteData(const int index) { emit dataChanged(this->index(0), this->index(rowCount() - 1), roles); } +// TODO: instead of clearing the whole cache every time, the individual items +// could be created/updated/deleted + void FolderModel::dispatcher_folderCreated(const QString &folderId) { qDebug() << "FolderModel Folder created" << folderId; @@ -189,6 +192,13 @@ void FolderModel::dispatcher_folderCreated(const QString &folderId) { void FolderModel::dispatcher_folderUpdated(const QString &folderId) { qDebug() << "FolderModel Folder udpated" << folderId; + + cache_.clear(); + + QVector roles; + roles << Qt::DisplayRole; + emit dataChanged(this->index(0), this->index(rowCount() - 1), roles); + //synchronizerTimer_.start(1000 * 3); } diff --git a/QtClient/JoplinQtClient/synchronizer.cpp b/QtClient/JoplinQtClient/synchronizer.cpp index cbecd162e3..b1cea890ad 100755 --- a/QtClient/JoplinQtClient/synchronizer.cpp +++ b/QtClient/JoplinQtClient/synchronizer.cpp @@ -9,7 +9,7 @@ Synchronizer::Synchronizer(const QString &apiUrl, Database &database) : api_(api qDebug() << api_.baseUrl(); state_ = Idle; uploadsRemaining_ = 0; - downloadsRemaining_ = 0; + //downloadsRemaining_ = 0; connect(&api_, SIGNAL(requestDone(QJsonObject,QString)), this, SLOT(api_requestDone(QJsonObject,QString))); } @@ -52,12 +52,14 @@ void Synchronizer::checkNextState() { case DownloadingChanges: - if (downloadsRemaining_ < 0) qCritical() << "Mismatch on download operations done" << downloadsRemaining_; + switchState(Idle); - if (downloadsRemaining_ <= 0) { - downloadsRemaining_ = 0; - switchState(Idle); - } +// if (downloadsRemaining_ < 0) qCritical() << "Mismatch on download operations done" << downloadsRemaining_; + +// if (downloadsRemaining_ <= 0) { +// downloadsRemaining_ = 0; +// switchState(Idle); +// } break; case Idle: @@ -200,48 +202,41 @@ void Synchronizer::api_requestDone(const QJsonObject& response, const QString& t } else if (category == "download") { if (action == "getSynchronizer") { - downloadsRemaining_ = 0; QJsonArray items = response["items"].toArray(); - foreach (QJsonValue item, items) { - QJsonObject obj = item.toObject(); + QString maxRevId = ""; + foreach (QJsonValue it, items) { + QJsonObject obj = it.toObject(); QString itemId = obj["item_id"].toString(); QString itemType = obj["item_type"].toString(); QString operationType = obj["type"].toString(); QString revId = obj["id"].toString(); + QJsonObject item = obj["item"].toObject(); - QString path = itemType + "s"; + if (itemType == "folder") { + if (operationType == "create") { + Folder folder; + folder.loadJsonObject(item); + folder.save(false); + } - if (operationType == "create") { - api_.get(path + "/" + itemId, QUrlQuery(), QUrlQuery(), "download:createFolder:" + itemId + ":" + revId); + if (operationType == "update") { + Folder folder; + folder.load(itemId); + folder.patchJsonObject(item); + folder.save(false); + } } - if (operationType == "update") { - //QUrlQuery data; + if (revId > maxRevId) maxRevId = revId; + } - api_.patch(path + "/" + itemId, QUrlQuery(), QUrlQuery(), "download:createFolder:" + itemId + ":" + revId); - } - - // TODO: update, delete - - downloadsRemaining_++; + if (maxRevId != "") { + Settings settings; + settings.setValue("lastRevId", maxRevId); } checkNextState(); - } else { - downloadsRemaining_--; - - Settings settings; - - if (action == "createFolder") { - Folder folder; - folder.loadJsonObject(response); - folder.save(false); - - //settings.setValue("lastRevId", arg2); - } - - checkNextState(); } } else { qCritical() << "Invalid category" << category;