Moved creatorTypeID into itemCreators and changed code accordingly; updated sample data

Added Scholar.CreatorTypes with methods getTypes() (multi-dim array with 'id' and 'name') and getTypeName(creatorTypeID)

Fixed bug in Scholar.Creators.purge() causing SQL error when deleting a non-existent creator

Fixed incorrect field order for itemCreators INSERT queries in save()

Changed setCreator() to take empty creator names (causing DELETE in itemCreators but without shifting up creators below it (or down and above, depending on your perspective) like removeCreators())
This commit is contained in:
Dan Stillman 2006-05-20 15:18:36 +00:00
parent a75fb2ddb6
commit deea149235
4 changed files with 112 additions and 80 deletions

View File

@ -183,12 +183,12 @@ Scholar.Item.prototype.setCreator = function(orderIndex, firstName, lastName, cr
this._loadCreators(); this._loadCreators();
} }
if (!creatorTypeID){ if (!firstName){
creatorTypeID = 1; firstName = '';
} }
if (!firstName && !lastName){ if (!lastName){
throw ('Name not provided for creator'); lastName = '';
} }
if (this._creators.has(orderIndex) && if (this._creators.has(orderIndex) &&
@ -198,6 +198,10 @@ Scholar.Item.prototype.setCreator = function(orderIndex, firstName, lastName, cr
return true; return true;
} }
if (!creatorTypeID){
creatorTypeID = 1;
}
var creator = new Array(); var creator = new Array();
creator['firstName'] = firstName; creator['firstName'] = firstName;
creator['lastName'] = lastName; creator['lastName'] = lastName;
@ -222,7 +226,8 @@ Scholar.Item.prototype.removeCreator = function(orderIndex){
} }
this._creators.remove(orderIndex); this._creators.remove(orderIndex);
for (var i=orderIndex,len=this._creators.length; i<=len; i++){ // Go to length+1 so we clear the last one
for (var i=orderIndex, max=this._creators.length+1; i<max; i++){
var next = var next =
this._creators.items[i+1] ? this._creators.items[i+1] : false; this._creators.items[i+1] ? this._creators.items[i+1] : false;
this._creators.set(i, next); this._creators.set(i, next);
@ -444,10 +449,7 @@ Scholar.Item.prototype.save = function(){
var creator = this.getCreator(orderIndex); var creator = this.getCreator(orderIndex);
// If empty, delete at position and shift down any above it // If empty, delete at position
//
// We have to do this immediately so old entries are
// cleared before other ones are shifted down
if (!creator['firstName'] && !creator['lastName']){ if (!creator['firstName'] && !creator['lastName']){
sql2 = 'DELETE FROM itemCreators ' sql2 = 'DELETE FROM itemCreators '
+ ' WHERE itemID=' + this.getID() + ' WHERE itemID=' + this.getID()
@ -459,37 +461,43 @@ Scholar.Item.prototype.save = function(){
// See if this is an existing creator // See if this is an existing creator
var creatorID = Scholar.Creators.getID( var creatorID = Scholar.Creators.getID(
creator['firstName'], creator['firstName'],
creator['lastName'], creator['lastName']
creator['creatorTypeID']
); );
// If not, add it // If not, add it
if (!creatorID){ if (!creatorID){
creatorID = Scholar.Creators.add( creatorID = Scholar.Creators.add(
creator['firstName'], creator['firstName'],
creator['lastName'], creator['lastName']
creator['creatorTypeID']
); );
} }
// If there's a creator at this position, update
// with new creator data
sql2 = 'SELECT COUNT(*) FROM itemCreators' sql2 = 'SELECT COUNT(*) FROM itemCreators'
+ ' WHERE itemID=' + this.getID() + ' WHERE itemID=' + this.getID()
+ ' AND orderIndex=' + orderIndex; + ' AND orderIndex=' + orderIndex;
if (Scholar.DB.valueQuery(sql2)){ if (Scholar.DB.valueQuery(sql2)){
sql += 'UPDATE itemCreators SET creatorID=' sql += 'UPDATE itemCreators SET creatorID='
+ creatorID + ' WHERE itemID=' + this.getID() + creatorID + ', creatorTypeID='
+ creator['creatorTypeID'] + ', '
+ 'WHERE itemID=' + this.getID()
+ ' AND orderIndex=' + orderIndex + ";\n"; + ' AND orderIndex=' + orderIndex + ";\n";
} }
// Otherwise insert
else { else {
sql += 'INSERT INTO itemCreators VALUES (' sql += 'INSERT INTO itemCreators VALUES ('
+ creatorID + ',' + itemID + ',' + orderIndex + itemID + ', ' + creatorID + ', '
+ creator['creatorTypeID'] + ', ' + orderIndex
+ ");\n"; + ");\n";
} }
} }
// Append the SQL to delete obsolete creators // Append the SQL to delete obsolete creators
//
// TODO: fix this so it actually purges the internal memory
sql += Scholar.Creators.purge(true) + "\n"; sql += Scholar.Creators.purge(true) + "\n";
} }
@ -595,29 +603,27 @@ Scholar.Item.prototype.save = function(){
var creator = this.getCreator(orderIndex); var creator = this.getCreator(orderIndex);
// If empty, skip // If empty, skip
if (typeof creator['firstName'] == 'undefined' if (!creator['firstName'] && !creator['lastName']){
&& typeof creator['lastName'] == 'undefined'){
continue; continue;
} }
// See if this is an existing creator // See if this is an existing creator
var creatorID = Scholar.Creators.getID( var creatorID = Scholar.Creators.getID(
creator['firstName'], creator['firstName'],
creator['lastName'], creator['lastName']
creator['creatorTypeID']
); );
// If not, add it // If not, add it
if (!creatorID){ if (!creatorID){
creatorID = Scholar.Creators.add( creatorID = Scholar.Creators.add(
creator['firstName'], creator['firstName'],
creator['lastName'], creator['lastName']
creator['creatorTypeID']
); );
} }
sql += 'INSERT INTO itemCreators VALUES (' sql += 'INSERT INTO itemCreators VALUES ('
+ creatorID + ',' + itemID + ',' + orderIndex + itemID + ',' + creatorID + ','
+ creator['creatorTypeID'] + ', ' + orderIndex
+ ");\n"; + ");\n";
} }
} }
@ -757,7 +763,8 @@ Scholar.Item.prototype._loadCreators = function(){
throw ('ItemID not set for item before attempting to load creators'); throw ('ItemID not set for item before attempting to load creators');
} }
var sql = 'SELECT C.creatorID, C.*, orderIndex FROM itemCreators IC ' var sql = 'SELECT C.creatorID, C.*, creatorTypeID, orderIndex '
+ 'FROM itemCreators IC '
+ 'LEFT JOIN creators C USING (creatorID) ' + 'LEFT JOIN creators C USING (creatorID) '
+ 'WHERE itemID=' + this.getID() + ' ORDER BY orderIndex'; + 'WHERE itemID=' + this.getID() + ' ORDER BY orderIndex';
var creators = Scholar.DB.query(sql); var creators = Scholar.DB.query(sql);
@ -774,6 +781,7 @@ Scholar.Item.prototype._loadCreators = function(){
creator['firstName'] = creators[i]['firstName']; creator['firstName'] = creators[i]['firstName'];
creator['lastName'] = creators[i]['lastName']; creator['lastName'] = creators[i]['lastName'];
creator['creatorTypeID'] = creators[i]['creatorTypeID']; creator['creatorTypeID'] = creators[i]['creatorTypeID'];
// Save creator data into Hash, indexed by orderIndex
this._creators.set(creators[i]['orderIndex'], creator); this._creators.set(creators[i]['orderIndex'], creator);
} }
@ -1159,7 +1167,7 @@ Scholar.Folders = new function(){
Scholar.Creators = new function(){ Scholar.Creators = new function(){
var _creators = new Array; // indexed by first%%%last%%%creatorTypeID hash var _creators = new Array; // indexed by first%%%last hash
var _creatorsByID = new Array; // indexed by creatorID var _creatorsByID = new Array; // indexed by creatorID
this.get = get; this.get = get;
@ -1192,17 +1200,17 @@ Scholar.Creators = new function(){
/* /*
* Returns the creatorID matching given name and type * Returns the creatorID matching given name and type
*/ */
function getID(firstName, lastName, creatorTypeID){ function getID(firstName, lastName){
var hash = firstName + '%%%' + lastName + '%%%' + creatorTypeID; var hash = firstName + '%%%' + lastName;
if (_creators[hash]){ if (_creators[hash]){
return _creators[hash]; return _creators[hash];
} }
var sql = 'SELECT creatorID FROM creators WHERE firstName=? AND ' var sql = 'SELECT creatorID FROM creators '
+ 'lastName=? AND creatorTypeID=?'; + 'WHERE firstName=? AND lastName=?';
var params = [ var params = [
{'string': firstName}, {'string': lastName}, {'int': creatorTypeID} {'string': firstName}, {'string': lastName}
]; ];
var creatorID = Scholar.DB.valueQuery(sql,params); var creatorID = Scholar.DB.valueQuery(sql,params);
@ -1219,11 +1227,11 @@ Scholar.Creators = new function(){
* *
* Returns new creatorID * Returns new creatorID
*/ */
function add(firstName, lastName, creatorTypeID){ function add(firstName, lastName){
Scholar.debug('Adding new creator', 4); Scholar.debug('Adding new creator', 4);
var sql = 'INSERT INTO creators ' var sql = 'INSERT INTO creators '
+ 'VALUES (?,?,?,?)'; + 'VALUES (?,?,?)';
// Use a random integer for the creatorID // Use a random integer for the creatorID
var tries = 10; // # of tries to find a unique id var tries = 10; // # of tries to find a unique id
@ -1242,10 +1250,11 @@ Scholar.Creators = new function(){
while (exists); while (exists);
var params = [ var params = [
{'int': rnd}, {'int': creatorTypeID}, {'int': rnd}, {'string': firstName}, {'string': lastName}
{'string': firstName}, {'string': lastName},
]; ];
return Scholar.DB.query(sql,params);
Scholar.DB.query(sql, params);
return rnd;
} }
@ -1260,7 +1269,7 @@ Scholar.Creators = new function(){
var toDelete = Scholar.DB.columnQuery(sql); var toDelete = Scholar.DB.columnQuery(sql);
if (!toDelete){ if (!toDelete){
return false; return returnSQL ? '' : false;
} }
sql = 'DELETE FROM creators WHERE creatorID NOT IN ' sql = 'DELETE FROM creators WHERE creatorID NOT IN '
@ -1286,8 +1295,7 @@ Scholar.Creators = new function(){
if (!creator){ if (!creator){
return false; return false;
} }
return creator['firstName'] + '%%%' + creator['lastName'] return creator['firstName'] + '%%%' + creator['lastName'];
+ '%%%' + creator['creatorTypeID'];
} }
} }
@ -1438,6 +1446,26 @@ Scholar.ItemFields = new function(){
} }
} }
Scholar.CreatorTypes = new function(){
this.getTypes = getTypes;
this.getTypeName = getTypeName;
function getTypes(){
return Scholar.DB.query('SELECT creatorTypeID AS id, '
+ 'creatorType AS name FROM creatorTypes order BY creatorType');
}
function getTypeName(creatorTypeID){
return Scholar.DB.valueQuery('SELECT creatorType FROM creatorTypes '
+ 'WHERE creatorTypeID=' + creatorTypeID);
}
}
/* /*
var items = Scholar.Items.getAll(); var items = Scholar.Items.getAll();

View File

@ -411,11 +411,6 @@ Scholar.DB = new function(){
// update SCHOLAR_CONFIG['DB_VERSION'] to the target version // update SCHOLAR_CONFIG['DB_VERSION'] to the target version
for (var i=parseInt(fromVersion) + 1; i<=toVersion; i++){ for (var i=parseInt(fromVersion) + 1; i<=toVersion; i++){
// For now, just wipe and recreate
if (i==8){
_initializeSchema();
}
if (i==9){ if (i==9){
Scholar.DB.query("DROP TABLE IF EXISTS objectCreators; " Scholar.DB.query("DROP TABLE IF EXISTS objectCreators; "
+ "DROP TABLE IF EXISTS objectData; DROP TABLE IF EXISTS objectKeywords; " + "DROP TABLE IF EXISTS objectData; DROP TABLE IF EXISTS objectKeywords; "
@ -424,7 +419,12 @@ Scholar.DB = new function(){
_updateDBVersion(i); _updateDBVersion(i);
} }
// For now, just wipe and recreate
if (i==10){ if (i==10){
_initializeSchema();
}
if (i==11){
// do stuff // do stuff
// _updateDBVersion(i); // _updateDBVersion(i);
} }

View File

@ -1,7 +1,7 @@
const SCHOLAR_CONFIG = { const SCHOLAR_CONFIG = {
GUID: 'scholar@chnm', GUID: 'scholar@chnm',
DB_FILE: 'scholar.sqlite', DB_FILE: 'scholar.sqlite',
DB_VERSION: 9, // must match version at top of schema.sql DB_VERSION: 10, // must match version at top of schema.sql
DB_REBUILD: false, // erase DB and recreate from schema DB_REBUILD: false, // erase DB and recreate from schema
DEBUG_LOGGING: true, DEBUG_LOGGING: true,
DEBUG_TO_CONSOLE: true // dump debug messages to console rather than (much slower) Debug Logger DEBUG_TO_CONSOLE: true // dump debug messages to console rather than (much slower) Debug Logger

View File

@ -1,4 +1,4 @@
-- 9 -- 10
DROP TABLE IF EXISTS version; DROP TABLE IF EXISTS version;
CREATE TABLE version ( CREATE TABLE version (
@ -77,11 +77,9 @@
DROP TABLE IF EXISTS creators; DROP TABLE IF EXISTS creators;
CREATE TABLE creators ( CREATE TABLE creators (
creatorID INT, creatorID INT,
creatorTypeID INT DEFAULT 1,
firstName TEXT, firstName TEXT,
lastName TEXT, lastName TEXT,
PRIMARY KEY (creatorID), PRIMARY KEY (creatorID)
FOREIGN KEY (creatorTypeID) REFERENCES creatorTypes(creatorTypeID)
); );
DROP TABLE IF EXISTS creatorTypes; DROP TABLE IF EXISTS creatorTypes;
@ -94,10 +92,12 @@
CREATE TABLE itemCreators ( CREATE TABLE itemCreators (
itemID INT, itemID INT,
creatorID INT, creatorID INT,
creatorTypeID INT DEFAULT 1,
orderIndex INT DEFAULT 0, orderIndex INT DEFAULT 0,
PRIMARY KEY (itemID, creatorID), PRIMARY KEY (itemID, creatorID),
FOREIGN KEY (itemID) REFERENCES items(itemID), FOREIGN KEY (itemID) REFERENCES items(itemID),
FOREIGN KEY (creatorID) REFERENCES creators(creatorID) FOREIGN KEY (creatorID) REFERENCES creators(creatorID)
FOREIGN KEY (creatorTypeID) REFERENCES creatorTypes(creatorTypeID)
); );
DROP TABLE IF EXISTS folders; DROP TABLE IF EXISTS folders;
@ -179,40 +179,44 @@
INSERT INTO "itemData" VALUES(2, 8, 347); INSERT INTO "itemData" VALUES(2, 8, 347);
INSERT INTO "itemData" VALUES(2, 9, '0-205-32145-3'); INSERT INTO "itemData" VALUES(2, 9, '0-205-32145-3');
INSERT INTO "creators" VALUES(1, 1, 'Susan B.', 'Barnes'); INSERT INTO "creatorTypes" VALUES(1, "author");
INSERT INTO "creators" VALUES(2, 1, 'J.S.', 'Bassard'); INSERT INTO "creatorTypes" VALUES(2, "contributor");
INSERT INTO "creators" VALUES(3, 1, 'Mary', 'Chayko'); INSERT INTO "creatorTypes" VALUES(3, "editor");
INSERT INTO "creators" VALUES(4, 1, 'Michael', 'Civin');
INSERT INTO "creators" VALUES(5, 1, 'Paul', 'DiMaggio');
INSERT INTO "creators" VALUES(6, 1, 'Leon', 'Festinger');
INSERT INTO "creators" VALUES(7, 1, 'Stanley', 'Schachter');
INSERT INTO "creators" VALUES(8, 1, 'Kurt', 'Back');
INSERT INTO "creators" VALUES(9, 1, 'Steven G.', 'Jones');
INSERT INTO "creators" VALUES(10, 1, 'J.C.R.', 'Licklider');
INSERT INTO "creators" VALUES(11, 1, 'Robert W.', 'Taylor');
INSERT INTO "creators" VALUES(12, 1, 'Yuliang', 'Lui');
INSERT INTO "creators" VALUES(13, 1, 'Sherry', 'Turkle');
INSERT INTO "creators" VALUES(14, 1, 'J.', 'Vallee');
INSERT INTO "creators" VALUES(15, 1, 'Barry', 'Wellman');
INSERT INTO "itemCreators" VALUES(1, 1, 0); INSERT INTO "creators" VALUES(1, 'Susan B.', 'Barnes');
INSERT INTO "itemCreators" VALUES(2, 1, 0); INSERT INTO "creators" VALUES(2, 'J.S.', 'Bassard');
INSERT INTO "itemCreators" VALUES(3, 2, 0); INSERT INTO "creators" VALUES(3, 'Mary', 'Chayko');
INSERT INTO "itemCreators" VALUES(4, 3, 0); INSERT INTO "creators" VALUES(4, 'Michael', 'Civin');
INSERT INTO "itemCreators" VALUES(5, 4, 0); INSERT INTO "creators" VALUES(5, 'Paul', 'DiMaggio');
INSERT INTO "itemCreators" VALUES(6, 5, 0); INSERT INTO "creators" VALUES(6, 'Leon', 'Festinger');
INSERT INTO "itemCreators" VALUES(7, 6, 0); INSERT INTO "creators" VALUES(7, 'Stanley', 'Schachter');
INSERT INTO "itemCreators" VALUES(8, 9, 0); INSERT INTO "creators" VALUES(8, 'Kurt', 'Back');
INSERT INTO "itemCreators" VALUES(9, 10, 0); INSERT INTO "creators" VALUES(9, 'Steven G.', 'Jones');
INSERT INTO "itemCreators" VALUES(10, 12, 0); INSERT INTO "creators" VALUES(10, 'J.C.R.', 'Licklider');
INSERT INTO "itemCreators" VALUES(11, 13, 0); INSERT INTO "creators" VALUES(11, 'Robert W.', 'Taylor');
INSERT INTO "itemCreators" VALUES(12, 13, 0); INSERT INTO "creators" VALUES(12, 'Yuliang', 'Lui');
INSERT INTO "itemCreators" VALUES(13, 14, 0); INSERT INTO "creators" VALUES(13, 'Sherry', 'Turkle');
INSERT INTO "itemCreators" VALUES(14, 15, 0); INSERT INTO "creators" VALUES(14, 'J.', 'Vallee');
INSERT INTO "itemCreators" VALUES(15, 15, 0); INSERT INTO "creators" VALUES(15, 'Barry', 'Wellman');
INSERT INTO "itemCreators" VALUES(7, 7, 1);
INSERT INTO "itemCreators" VALUES(7, 8, 2); INSERT INTO "itemCreators" VALUES(1, 1, 1, 0);
INSERT INTO "itemCreators" VALUES(9, 11, 1); INSERT INTO "itemCreators" VALUES(2, 1, 1, 0);
INSERT INTO "itemCreators" VALUES(3, 2, 1, 0);
INSERT INTO "itemCreators" VALUES(4, 3, 1, 0);
INSERT INTO "itemCreators" VALUES(5, 4, 1, 0);
INSERT INTO "itemCreators" VALUES(6, 5, 1, 0);
INSERT INTO "itemCreators" VALUES(7, 6, 1, 0);
INSERT INTO "itemCreators" VALUES(8, 9, 1, 0);
INSERT INTO "itemCreators" VALUES(9, 10, 1, 0);
INSERT INTO "itemCreators" VALUES(10, 12, 1, 0);
INSERT INTO "itemCreators" VALUES(11, 13, 1, 0);
INSERT INTO "itemCreators" VALUES(12, 13, 1, 0);
INSERT INTO "itemCreators" VALUES(13, 14, 1, 0);
INSERT INTO "itemCreators" VALUES(14, 15, 1, 0);
INSERT INTO "itemCreators" VALUES(15, 15, 1, 0);
INSERT INTO "itemCreators" VALUES(7, 7, 1, 1);
INSERT INTO "itemCreators" VALUES(7, 8, 1, 2);
INSERT INTO "itemCreators" VALUES(9, 11, 1, 1);
INSERT INTO folders VALUES (1241, 'Test Folder'); INSERT INTO folders VALUES (1241, 'Test Folder');
INSERT INTO folders VALUES (3262, 'Another Test Folder'); INSERT INTO folders VALUES (3262, 'Another Test Folder');