Add per-library lastsync times and synced flags for sync delete logs
This commit is contained in:
parent
6199742986
commit
58c062dd06
3 changed files with 46 additions and 30 deletions
|
@ -43,10 +43,7 @@ Zotero.Libraries = new function () {
|
|||
var rows = yield Zotero.DB.queryAsync(sql);
|
||||
for (let i=0; i<rows.length; i++) {
|
||||
let row = rows[i];
|
||||
_libraryData[row.libraryID] = {
|
||||
type: row.libraryType,
|
||||
version: row.version
|
||||
};
|
||||
_libraryData[row.libraryID] = parseDBRow(row);
|
||||
if (row.libraryType == 'user') {
|
||||
_userLibraryID = row.libraryID;
|
||||
}
|
||||
|
@ -54,14 +51,6 @@ Zotero.Libraries = new function () {
|
|||
_libraryDataLoaded = true;
|
||||
});
|
||||
|
||||
function _getLibraryDataFromDB (libraryID) {
|
||||
var sql = "SELECT * FROM libraries WHERE libraryID=?";
|
||||
return Zotero.DB.queryAsync(sql, [libraryID])
|
||||
.then(function(rows) {
|
||||
return rows[0];
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
this.exists = function (libraryID) {
|
||||
return _libraryData[libraryID] !== undefined;
|
||||
|
@ -79,14 +68,12 @@ Zotero.Libraries = new function () {
|
|||
|
||||
var sql = "INSERT INTO libraries (libraryID, libraryType) VALUES (?, ?)";
|
||||
yield Zotero.DB.queryAsync(sql, [libraryID, type]);
|
||||
// Re-fetch from DB to get auto-filled defaults
|
||||
var newData = yield _getLibraryDataFromDB(libraryID);
|
||||
_libraryData[newData.libraryID] = {
|
||||
type: newData.libraryType,
|
||||
version: newData.version
|
||||
};
|
||||
|
||||
return newData;
|
||||
// Re-fetch from DB to get auto-filled defaults
|
||||
var sql = "SELECT * FROM libraries WHERE libraryID=?";
|
||||
var row = Zotero.DB.rowQueryAsync(sql, [libraryID]);
|
||||
_libraryData[row.libraryID] = parseDBRow(row);
|
||||
return row;
|
||||
});
|
||||
|
||||
this.dbLibraryID = function (libraryID) {
|
||||
|
@ -120,6 +107,7 @@ Zotero.Libraries = new function () {
|
|||
return _libraryData[libraryID].type;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param {Integer} libraryID
|
||||
* @return {Integer}
|
||||
|
@ -145,6 +133,23 @@ Zotero.Libraries = new function () {
|
|||
});
|
||||
|
||||
|
||||
this.getLastSyncTime = function (libraryID) {
|
||||
return _libraryData[libraryID].lastSyncTime;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Integer} libraryID
|
||||
* @param {Date} lastSyncTime
|
||||
*/
|
||||
this.setLastSyncTime = function (libraryID, lastSyncTime) {
|
||||
var lastSyncTime = Math.round(lastSyncTime.getTime() / 1000);
|
||||
return Zotero.DB.valueQueryAsync(
|
||||
"UPDATE libraries SET lastsync=? WHERE libraryID=?", [lastSyncTime, libraryID]
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
this.isEditable = function (libraryID) {
|
||||
var type = this.getType(libraryID);
|
||||
switch (type) {
|
||||
|
@ -185,4 +190,13 @@ Zotero.Libraries = new function () {
|
|||
|
||||
return this.getType(libraryID) == 'group';
|
||||
}
|
||||
|
||||
|
||||
function parseDBRow(row) {
|
||||
return {
|
||||
type: row.libraryType,
|
||||
version: row.version,
|
||||
lastSyncTime: row.lastsync != 0 ? new Date(row.lastsync * 1000) : false
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1409,7 +1409,7 @@ Zotero.Schema = new function(){
|
|||
});
|
||||
yield _updateDBVersion('compatibility', _maxCompatibility);
|
||||
|
||||
yield Zotero.DB.queryAsync("INSERT INTO libraries VALUES (0, 'user', 0)");
|
||||
yield Zotero.DB.queryAsync("INSERT INTO libraries (libraryID, libraryType) VALUES (0, 'user')");
|
||||
|
||||
if (!Zotero.Schema.skipDefaultData) {
|
||||
// Quick Start Guide web page item
|
||||
|
@ -1770,6 +1770,7 @@ Zotero.Schema = new function(){
|
|||
|
||||
yield Zotero.DB.queryAsync("INSERT INTO libraries VALUES (0, 'user')");
|
||||
yield Zotero.DB.queryAsync("ALTER TABLE libraries ADD COLUMN version INT NOT NULL DEFAULT 0");
|
||||
yield Zotero.DB.queryAsync("ALTER TABLE libraries ADD COLUMN lastsync INT NOT NULL DEFAULT 0");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE syncCache (\n libraryID INT NOT NULL,\n key TEXT NOT NULL,\n syncObjectTypeID INT NOT NULL,\n version INT NOT NULL,\n data TEXT,\n PRIMARY KEY (libraryID, key, syncObjectTypeID),\n FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE,\n FOREIGN KEY (syncObjectTypeID) REFERENCES syncObjectTypes(syncObjectTypeID)\n)");
|
||||
|
||||
yield Zotero.DB.queryAsync("DROP TRIGGER IF EXISTS fki_annotations_itemID_itemAttachments_itemID");
|
||||
|
@ -2029,16 +2030,16 @@ Zotero.Schema = new function(){
|
|||
|
||||
yield Zotero.DB.queryAsync("UPDATE syncDeleteLog SET libraryID=0 WHERE libraryID=(SELECT value FROM settings WHERE setting='account' AND key='libraryID')");
|
||||
yield Zotero.DB.queryAsync("ALTER TABLE syncDeleteLog RENAME TO syncDeleteLogOld");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE syncDeleteLog (\n syncObjectTypeID INT NOT NULL,\n libraryID INT NOT NULL,\n key TEXT NOT NULL,\n timestamp INT NOT NULL,\n UNIQUE (syncObjectTypeID, libraryID, key),\n FOREIGN KEY (syncObjectTypeID) REFERENCES syncObjectTypes(syncObjectTypeID),\n FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE\n)");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE syncDeleteLog (\n syncObjectTypeID INT NOT NULL,\n libraryID INT NOT NULL,\n key TEXT NOT NULL,\n synced INT NOT NULL DEFAULT 0,\n UNIQUE (syncObjectTypeID, libraryID, key),\n FOREIGN KEY (syncObjectTypeID) REFERENCES syncObjectTypes(syncObjectTypeID),\n FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE\n)");
|
||||
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO syncDeleteLog SELECT * FROM syncDeleteLogOld");
|
||||
yield Zotero.DB.queryAsync("DROP INDEX IF EXISTS syncDeleteLog_timestamp");
|
||||
yield Zotero.DB.queryAsync("CREATE INDEX syncDeleteLog_timestamp ON syncDeleteLog(timestamp)");
|
||||
yield Zotero.DB.queryAsync("CREATE INDEX syncDeleteLog_synced ON syncDeleteLog(synced)");
|
||||
|
||||
yield Zotero.DB.queryAsync("ALTER TABLE storageDeleteLog RENAME TO storageDeleteLogOld");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE storageDeleteLog (\n libraryID INT NOT NULL,\n key TEXT NOT NULL,\n timestamp INT NOT NULL,\n PRIMARY KEY (libraryID, key),\n FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE\n)");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE storageDeleteLog (\n libraryID INT NOT NULL,\n key TEXT NOT NULL,\n synced INT NOT NULL DEFAULT 0,\n PRIMARY KEY (libraryID, key),\n FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE\n)");
|
||||
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO storageDeleteLog SELECT * FROM storageDeleteLogOld");
|
||||
yield Zotero.DB.queryAsync("DROP INDEX IF EXISTS storageDeleteLog_timestamp");
|
||||
yield Zotero.DB.queryAsync("CREATE INDEX storageDeleteLog_timestamp ON storageDeleteLog(timestamp)");
|
||||
yield Zotero.DB.queryAsync("CREATE INDEX storageDeleteLog_synced ON storageDeleteLog(synced)");
|
||||
|
||||
yield Zotero.DB.queryAsync("ALTER TABLE annotations RENAME TO annotationsOld");
|
||||
yield Zotero.DB.queryAsync("CREATE TABLE annotations (\n annotationID INTEGER PRIMARY KEY,\n itemID INT NOT NULL,\n parent TEXT,\n textNode INT,\n offset INT,\n x INT,\n y INT,\n cols INT,\n rows INT,\n text TEXT,\n collapsed BOOL,\n dateModified DATE,\n FOREIGN KEY (itemID) REFERENCES itemAttachments(itemID) ON DELETE CASCADE\n)");
|
||||
|
|
|
@ -49,7 +49,7 @@ CREATE TABLE syncedSettings (
|
|||
FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- 'items' view and triggers created in triggers.sql
|
||||
-- Primary data applicable to all items
|
||||
CREATE TABLE items (
|
||||
itemID INTEGER PRIMARY KEY,
|
||||
itemTypeID INT NOT NULL,
|
||||
|
@ -229,7 +229,8 @@ CREATE INDEX relations_object ON relations(object);
|
|||
CREATE TABLE libraries (
|
||||
libraryID INTEGER PRIMARY KEY,
|
||||
libraryType TEXT NOT NULL,
|
||||
version INT NOT NULL DEFAULT 0
|
||||
version INT NOT NULL DEFAULT 0,
|
||||
lastsync INT NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE users (
|
||||
|
@ -298,21 +299,21 @@ CREATE TABLE syncDeleteLog (
|
|||
syncObjectTypeID INT NOT NULL,
|
||||
libraryID INT NOT NULL,
|
||||
key TEXT NOT NULL,
|
||||
timestamp INT NOT NULL,
|
||||
synced INT NOT NULL DEFAULT 0,
|
||||
UNIQUE (syncObjectTypeID, libraryID, key),
|
||||
FOREIGN KEY (syncObjectTypeID) REFERENCES syncObjectTypes(syncObjectTypeID),
|
||||
FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE
|
||||
);
|
||||
CREATE INDEX syncDeleteLog_timestamp ON syncDeleteLog(timestamp);
|
||||
CREATE INDEX syncDeleteLog_synced ON syncDeleteLog(synced);
|
||||
|
||||
CREATE TABLE storageDeleteLog (
|
||||
libraryID INT NOT NULL,
|
||||
key TEXT NOT NULL,
|
||||
timestamp INT NOT NULL,
|
||||
synced INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (libraryID, key),
|
||||
FOREIGN KEY (libraryID) REFERENCES libraries(libraryID) ON DELETE CASCADE
|
||||
);
|
||||
CREATE INDEX storageDeleteLog_timestamp ON storageDeleteLog(timestamp);
|
||||
CREATE INDEX storageDeleteLog_synced ON storageDeleteLog(synced);
|
||||
|
||||
CREATE TABLE annotations (
|
||||
annotationID INTEGER PRIMARY KEY,
|
||||
|
|
Loading…
Add table
Reference in a new issue