Fix a serious but hopefully rare upgrade bug since Sync Preview 1 that could cause a handful of creators to be turned into either empty strings or other creators (the latter being much less likely)

For libraries that have already been upgraded, this renames orphaned item creators to "[Missing Name]"
This commit is contained in:
Dan Stillman 2009-07-04 09:00:44 +00:00
parent 691e34d7d4
commit 31bf663b03
2 changed files with 24 additions and 36 deletions

View file

@ -1631,61 +1631,35 @@ Zotero.Schema = new function(){
// Creator data
Zotero.DB.query("CREATE TABLE creatorData (\n creatorDataID INTEGER PRIMARY KEY,\n firstName TEXT,\n lastName TEXT,\n shortName TEXT,\n fieldMode INT,\n birthYear INT\n)");
Zotero.DB.query("INSERT INTO creatorData SELECT NULL, firstName, lastName, NULL, fieldMode, NULL FROM creators WHERE creatorID IN (SELECT creatorID FROM itemCreators)");
var creatorsOld = Zotero.DB.query("SELECT * FROM creators");
Zotero.DB.query("INSERT INTO creatorData SELECT DISTINCT NULL, firstName, lastName, NULL, fieldMode, NULL FROM creators WHERE creatorID IN (SELECT creatorID FROM itemCreators)");
Zotero.DB.query("CREATE TEMPORARY TABLE itemCreatorsTemp AS SELECT * FROM itemCreators NATURAL JOIN creators");
Zotero.DB.query("DROP TABLE creators");
Zotero.DB.query("CREATE TABLE creators (\n creatorID INTEGER PRIMARY KEY,\n creatorDataID INT,\n dateModified DEFAULT CURRENT_TIMESTAMP NOT NULL,\n key TEXT NOT NULL,\n FOREIGN KEY (creatorDataID) REFERENCES creatorData(creatorDataID)\n);");
var data = Zotero.DB.query("SELECT * FROM creatorData");
if (data) {
var oldCreatorIDHash = {};
for (var j=0, len=creatorsOld.length; j<len; j++) {
oldCreatorIDHash[
ZU.md5(
creatorsOld[j].firstName + '_' +
creatorsOld[j].lastName + '_' +
creatorsOld[j].fieldMode
)
] = creatorsOld[j].creatorID;
}
Zotero.DB.query("CREATE INDEX itemCreatorsTemp_names ON itemCreatorsTemp(lastName, firstName)");
Zotero.DB.query("DELETE FROM itemCreators");
var updatedIDs = {};
// For each distinct data row, create a new creator
var insertStatement = Zotero.DB.getStatement("INSERT INTO creators (creatorID, creatorDataID, key) VALUES (?, ?, ?)");
var updateStatement = Zotero.DB.getStatement("UPDATE itemCreators SET creatorID=? WHERE creatorID=?");
for (var j=0, len=data.length; j<len; j++) {
insertStatement.bindInt32Parameter(0, data[j].creatorDataID);
insertStatement.bindInt32Parameter(1, data[j].creatorDataID);
var key = Zotero.ID.getKey();
insertStatement.bindStringParameter(2, key);
var oldCreatorID = oldCreatorIDHash[
ZU.md5(
data[j].firstName + '_' +
data[j].lastName + '_' +
data[j].fieldMode
)
];
if (updatedIDs[oldCreatorID]) {
continue;
}
updatedIDs[oldCreatorID] = true;
updateStatement.bindInt32Parameter(0, data[j].creatorDataID);
updateStatement.bindInt32Parameter(1, oldCreatorID);
try {
insertStatement.execute();
updateStatement.execute();
}
catch (e) {
throw (Zotero.DB.getLastErrorString());
}
}
insertStatement.reset();
updateStatement.reset();
}
Zotero.DB.query("INSERT INTO itemCreators SELECT itemID, C.creatorID, creatorTypeID, orderIndex FROM itemCreatorsTemp ICT JOIN creatorData CD ON (ICT.firstName=CD.firstName AND ICT.lastName=CD.lastName AND ICT.fieldMode=CD.fieldMode) JOIN creators C ON (CD.creatorDataID=C.creatorDataID)");
}
Zotero.DB.query("DROP TABLE itemCreatorsTemp");
Zotero.DB.query("CREATE INDEX creators_creatorDataID ON creators(creatorDataID)");
// Items
@ -2374,6 +2348,20 @@ Zotero.Schema = new function(){
Zotero.DB.query("INSERT INTO version VALUES ('syncdeletelog', CURRENT_TIMESTAMP)");
}
}
if (i==59) {
var namestr = '[Missing Name]';
var id = Zotero.DB.valueQuery("SELECT creatorDataID FROM creatorData WHERE firstName='' AND lastName=? AND fieldMode=1", namestr);
if (!id) {
id = Zotero.DB.query("INSERT INTO creatorData (firstName, lastName, fieldMode) VALUES ('', ?, 1)", namestr);
}
var creatorID = Zotero.DB.valueQuery("SELECT creatorID FROM creators WHERE creatorDataID=?", id);
if (!creatorID) {
var key = Zotero.ID.getKey();
creatorID = Zotero.DB.query("INSERT INTO creators (creatorDataID, key) VALUES (?, ?)", [id, key]);
}
Zotero.DB.query("UPDATE itemCreators SET creatorID=? WHERE creatorID NOT IN (SELECT creatorID FROM creators)", creatorID);
}
}
_updateDBVersion('userdata', toVersion);

View file

@ -1,4 +1,4 @@
-- 58
-- 59
-- This file creates tables containing user-specific data for new users --
-- any changes made here must be mirrored in transition steps in schema.js::_migrateSchema()