parent
cd3304e16c
commit
f5eb99ad4c
2 changed files with 93 additions and 25 deletions
|
@ -1102,35 +1102,42 @@ Zotero.Sync.Data.Engine.prototype._startUpload = Zotero.Promise.coroutine(functi
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Zotero.Sync.Data.Engine.prototype._uploadSettings = Zotero.Promise.coroutine(function* (settings, libraryVersion) {
|
Zotero.Sync.Data.Engine.prototype._uploadSettings = async function (settings, libraryVersion) {
|
||||||
let json = {};
|
const SETTINGS_BATCH_SIZE = 250;
|
||||||
for (let key in settings) {
|
await Zotero.Utilities.Internal.forEachChunkAsync(
|
||||||
json[key] = {
|
|
||||||
value: settings[key]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
libraryVersion = yield this.apiClient.uploadSettings(
|
|
||||||
this.library.libraryType,
|
|
||||||
this.libraryTypeID,
|
|
||||||
libraryVersion,
|
|
||||||
json
|
|
||||||
);
|
|
||||||
yield Zotero.SyncedSettings.markAsSynced(
|
|
||||||
this.libraryID,
|
|
||||||
Object.keys(settings),
|
Object.keys(settings),
|
||||||
libraryVersion
|
SETTINGS_BATCH_SIZE,
|
||||||
|
async function (keys) {
|
||||||
|
let json = {};
|
||||||
|
for (let key of keys) {
|
||||||
|
json[key] = {
|
||||||
|
value: settings[key]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
libraryVersion = await this.apiClient.uploadSettings(
|
||||||
|
this.library.libraryType,
|
||||||
|
this.libraryTypeID,
|
||||||
|
libraryVersion,
|
||||||
|
json
|
||||||
|
);
|
||||||
|
await Zotero.SyncedSettings.markAsSynced(
|
||||||
|
this.libraryID,
|
||||||
|
keys,
|
||||||
|
libraryVersion
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.library.libraryVersion == this.library.storageVersion) {
|
||||||
|
this.library.storageVersion = libraryVersion;
|
||||||
|
}
|
||||||
|
this.library.libraryVersion = libraryVersion;
|
||||||
|
await this.library.saveTx({
|
||||||
|
skipNotifier: true
|
||||||
|
});
|
||||||
|
}.bind(this)
|
||||||
);
|
);
|
||||||
if (this.library.libraryVersion == this.library.storageVersion) {
|
|
||||||
this.library.storageVersion = libraryVersion;
|
|
||||||
}
|
|
||||||
this.library.libraryVersion = libraryVersion;
|
|
||||||
yield this.library.saveTx({
|
|
||||||
skipNotifier: true
|
|
||||||
});
|
|
||||||
|
|
||||||
Zotero.debug("Done uploading settings in " + this.library.name);
|
Zotero.debug("Done uploading settings in " + this.library.name);
|
||||||
return libraryVersion;
|
return libraryVersion;
|
||||||
});
|
};
|
||||||
|
|
||||||
|
|
||||||
Zotero.Sync.Data.Engine.prototype._uploadObjects = Zotero.Promise.coroutine(function* (objectType, ids, libraryVersion) {
|
Zotero.Sync.Data.Engine.prototype._uploadObjects = Zotero.Promise.coroutine(function* (objectType, ids, libraryVersion) {
|
||||||
|
|
|
@ -959,6 +959,67 @@ describe("Zotero.Sync.Data.Engine", function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("should upload settings in batches", async function () {
|
||||||
|
({ engine, client, caller } = await setup());
|
||||||
|
|
||||||
|
var batchSize = 250;
|
||||||
|
|
||||||
|
var library = Zotero.Libraries.userLibrary;
|
||||||
|
var libraryID = library.id;
|
||||||
|
var lastLibraryVersion = 5;
|
||||||
|
library.libraryVersion = library.storageVersion = lastLibraryVersion;
|
||||||
|
await library.saveTx();
|
||||||
|
|
||||||
|
for (let i = 0; i < (batchSize * 2 + 5); i++) {
|
||||||
|
let key = Zotero.DataObjectUtilities.generateKey();
|
||||||
|
let page = Zotero.Utilities.rand(1, 20);
|
||||||
|
await Zotero.SyncedSettings.set(libraryID, `lastPageIndex_u_${key}`, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = new Set();
|
||||||
|
|
||||||
|
var numRequests = 0;
|
||||||
|
server.respond(function (req) {
|
||||||
|
if (req.method == "POST") {
|
||||||
|
numRequests++;
|
||||||
|
assert.equal(
|
||||||
|
req.requestHeaders["If-Unmodified-Since-Version"], lastLibraryVersion
|
||||||
|
);
|
||||||
|
|
||||||
|
if (req.url == baseURL + "users/1/settings") {
|
||||||
|
let json = JSON.parse(req.requestBody);
|
||||||
|
|
||||||
|
Zotero.debug(json);
|
||||||
|
if (numRequests == 1 || numRequests == 2) {
|
||||||
|
assert.lengthOf(Object.keys(json), batchSize);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assert.lengthOf(Object.keys(json), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let key of Object.keys(json)) {
|
||||||
|
keys.add(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
req.respond(
|
||||||
|
204,
|
||||||
|
{
|
||||||
|
"Last-Modified-Version": ++lastLibraryVersion
|
||||||
|
},
|
||||||
|
""
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await engine.start();
|
||||||
|
|
||||||
|
assert.equal(numRequests, 3);
|
||||||
|
assert.equal(keys.size, batchSize * 2 + 5);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
it("shouldn't update library storage version after settings upload if storage version was already behind", function* () {
|
it("shouldn't update library storage version after settings upload if storage version was already behind", function* () {
|
||||||
({ engine, client, caller } = yield setup());
|
({ engine, client, caller } = yield setup());
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue