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) {
|
||||
let json = {};
|
||||
for (let key in settings) {
|
||||
json[key] = {
|
||||
value: settings[key]
|
||||
};
|
||||
}
|
||||
libraryVersion = yield this.apiClient.uploadSettings(
|
||||
this.library.libraryType,
|
||||
this.libraryTypeID,
|
||||
libraryVersion,
|
||||
json
|
||||
);
|
||||
yield Zotero.SyncedSettings.markAsSynced(
|
||||
this.libraryID,
|
||||
Zotero.Sync.Data.Engine.prototype._uploadSettings = async function (settings, libraryVersion) {
|
||||
const SETTINGS_BATCH_SIZE = 250;
|
||||
await Zotero.Utilities.Internal.forEachChunkAsync(
|
||||
Object.keys(settings),
|
||||
libraryVersion
|
||||
);
|
||||
if (this.library.libraryVersion == this.library.storageVersion) {
|
||||
this.library.storageVersion = libraryVersion;
|
||||
}
|
||||
this.library.libraryVersion = libraryVersion;
|
||||
yield this.library.saveTx({
|
||||
skipNotifier: true
|
||||
});
|
||||
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)
|
||||
);
|
||||
Zotero.debug("Done uploading settings in " + this.library.name);
|
||||
return 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* () {
|
||||
({ engine, client, caller } = yield setup());
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue