1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Update item in client

This commit is contained in:
Laurent Cozic 2017-01-09 14:34:06 +01:00
parent 6a66c07a28
commit 28320ace18
4 changed files with 78 additions and 49 deletions

View File

@ -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<BaseModel::Field> 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<BaseModel::Field> fields = BaseModel::tableFields(table());
foreach (BaseModel::Field field, fields) {
if (!jsonObject.contains(field.name)) continue;
setValue(field.name, jsonObject[field.name], field.type);
}
}
QHash<QString, BaseModel::Value> 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<QString, Value>::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";

View File

@ -60,6 +60,7 @@ public:
void loadSqlQuery(const QSqlQuery& query);
void loadJsonObject(const QJsonObject& jsonObject);
void patchJsonObject(const QJsonObject& jsonObject);
QHash<QString, Value> 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);

View File

@ -47,9 +47,9 @@ bool FolderModel::setData(const QModelIndex &index, const QVariant &value, int r
if (!folder.save()) return false;
cache_.clear();
QVector<int> roles;
roles << Qt::DisplayRole;
emit dataChanged(this->index(0), this->index(rowCount() - 1), roles);
// QVector<int> 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<int> roles;
roles << Qt::DisplayRole;
emit dataChanged(this->index(0), this->index(rowCount() - 1), roles);
//synchronizerTimer_.start(1000 * 3);
}

View File

@ -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;