Renamed 'objects' to 'items' in DB and code -- all remaining uses refer to actual JS objects (with the exception of sidebar.js, in which only the calls to data access methods were changed)

This commit is contained in:
Dan Stillman 2006-05-18 11:25:10 +00:00
parent 2ed6651b52
commit c8b0d3daed
5 changed files with 285 additions and 284 deletions

View file

@ -1,56 +1,56 @@
/*
* Constructor for Object object
* Constructor for Item object
*
* Generally should be called through Scholar.Objects rather than directly
* Generally should be called through Scholar.Items rather than directly
*/
Scholar.Object = function(){
Scholar.Item = function(){
this._init();
// Accept objectTypeID, folderID and orderIndex in constructor
// Accept itemTypeID, folderID and orderIndex in constructor
if (arguments.length){
this.setType(arguments[0]);
this.setPosition(arguments[1],arguments[2]);
}
}
Scholar.Object.prototype._init = function(){
Scholar.Item.prototype._init = function(){
//
// Public members for access by public methods -- do not access directly
//
this._data = new Array();
this._creators = new Scholar.Hash();
this._objectData = new Array();
this._itemData = new Array();
this._creatorsLoaded = false;
this._objectDataLoaded = false;
this._itemDataLoaded = false;
this._changed = new Scholar.Hash();
this._changedCreators = new Scholar.Hash();
this._changedObjectData = new Scholar.Hash();
this._changedItemData = new Scholar.Hash();
}
//////////////////////////////////////////////////////////////////////////////
//
// Public Scholar.Object methods
// Public Scholar.Item methods
//
//////////////////////////////////////////////////////////////////////////////
/*
* Check if the specified field is a primary field from the objects table
* Check if the specified field is a primary field from the items table
*/
Scholar.Object.prototype.isPrimaryField = function(field){
if (!Scholar.Object.primaryFields){
Scholar.Object.primaryFields = Scholar.DB.getColumnHash('objects');
Scholar.Object.primaryFields['firstCreator'] = true;
Scholar.Object.primaryFields['parentFolderID'] = true;
Scholar.Object.primaryFields['orderIndex'] = true;
Scholar.Item.prototype.isPrimaryField = function(field){
if (!Scholar.Item.primaryFields){
Scholar.Item.primaryFields = Scholar.DB.getColumnHash('items');
Scholar.Item.primaryFields['firstCreator'] = true;
Scholar.Item.primaryFields['parentFolderID'] = true;
Scholar.Item.primaryFields['orderIndex'] = true;
}
return !!Scholar.Object.primaryFields[field];
return !!Scholar.Item.primaryFields[field];
}
Scholar.Object.editableFields = {
Scholar.Item.editableFields = {
title: true,
source: true,
rights: true
@ -59,31 +59,31 @@ Scholar.Object.editableFields = {
/*
* Check if the specified primary field can be changed with setField()
*/
Scholar.Object.prototype.isEditableField = function(field){
return !!Scholar.Object.editableFields[field];
Scholar.Item.prototype.isEditableField = function(field){
return !!Scholar.Item.editableFields[field];
}
/*
* Build object from database
*/
Scholar.Object.prototype.loadFromID = function(id){
var sql = 'SELECT O.*, lastName AS firstCreator, TS.parentFolderID, '
Scholar.Item.prototype.loadFromID = function(id){
var sql = 'SELECT I.*, lastName AS firstCreator, TS.parentFolderID, '
+ 'TS.orderIndex '
+ 'FROM objects O '
+ 'LEFT JOIN treeStructure TS ON (O.objectID=TS.id AND isFolder=0) '
+ 'LEFT JOIN objectCreators OC ON (O.objectID=OC.objectID) '
+ 'LEFT JOIN creators C ON (OC.creatorID=C.creatorID) '
+ 'WHERE objectID=' + id + ' AND OC.orderIndex=0';
+ 'FROM items I '
+ 'LEFT JOIN treeStructure TS ON (I.itemID=TS.id AND isFolder=0) '
+ 'LEFT JOIN itemCreators IC ON (I.itemID=IC.itemID) '
+ 'LEFT JOIN creators C ON (IC.creatorID=C.creatorID) '
+ 'WHERE itemID=' + id + ' AND IC.orderIndex=0';
var row = Scholar.DB.rowQuery(sql);
this.loadFromRow(row);
}
/*
* Populate basic object data from a database row
* Populate basic item data from a database row
*/
Scholar.Object.prototype.loadFromRow = function(row){
Scholar.Item.prototype.loadFromRow = function(row){
this._init();
for (col in row){
if (this.isPrimaryField(col) || col=='firstCreator'){
@ -97,41 +97,41 @@ Scholar.Object.prototype.loadFromRow = function(row){
/*
* Check if any data fields have changed since last save
*/
Scholar.Object.prototype.hasChanged = function(){
Scholar.Item.prototype.hasChanged = function(){
return (this._changed.length || this._changedCreators.length ||
this._changedObjectData.length);
this._changedItemData.length);
}
Scholar.Object.prototype.getID = function(){
return this._data['objectID'] ? this._data['objectID'] : false;
Scholar.Item.prototype.getID = function(){
return this._data['itemID'] ? this._data['itemID'] : false;
}
Scholar.Object.prototype.getType = function(){
return this._data['objectTypeID'] ? this._data['objectTypeID'] : false;
Scholar.Item.prototype.getType = function(){
return this._data['itemTypeID'] ? this._data['itemTypeID'] : false;
}
Scholar.Object.prototype.getParent = function(){
Scholar.Item.prototype.getParent = function(){
return this._data['parentFolderID'] ? this._data['parentFolderID'] : false;
}
/*
* Set or change the object's type
* Set or change the item's type
*/
Scholar.Object.prototype.setType = function(objectTypeID){
if (objectTypeID==this.getType()){
Scholar.Item.prototype.setType = function(itemTypeID){
if (itemTypeID==this.getType()){
return true;
}
// If existing type, clear fields from old type that aren't in new one
if (this.getType()){
var sql = 'SELECT fieldID FROM objectTypeFields '
+ 'WHERE objectTypeID=' + this.getType() + ' AND fieldID NOT IN '
+ '(SELECT fieldID FROM objectTypeFields WHERE objectTypeID='
+ objectTypeID + ')';
var sql = 'SELECT fieldID FROM itemTypeFields '
+ 'WHERE itemTypeID=' + this.getType() + ' AND fieldID NOT IN '
+ '(SELECT fieldID FROM itemTypeFields WHERE itemTypeID='
+ itemTypeID + ')';
var obsoleteFields = Scholar.DB.columnQuery(sql);
if (obsoleteFields){
@ -141,16 +141,16 @@ Scholar.Object.prototype.setType = function(objectTypeID){
}
}
this._data['objectTypeID'] = objectTypeID;
this._changed.set('objectTypeID');
this._data['itemTypeID'] = itemTypeID;
this._changed.set('itemTypeID');
return true;
}
/*
* Returns the number of creators for this object
* Returns the number of creators for this item
*/
Scholar.Object.prototype.numCreators = function(){
Scholar.Item.prototype.numCreators = function(){
if (this.getID() && !this._creatorsLoaded){
this._loadCreators();
}
@ -160,7 +160,7 @@ Scholar.Object.prototype.numCreators = function(){
/*
* Returns an array of the creator data at the given position, or false if none
*/
Scholar.Object.prototype.getCreator = function(pos){
Scholar.Item.prototype.getCreator = function(pos){
if (this.getID() && !this._creatorsLoaded){
this._loadCreators();
}
@ -175,7 +175,7 @@ Scholar.Object.prototype.getCreator = function(pos){
/*
* Set or update the creator at the specified position
*/
Scholar.Object.prototype.setCreator = function(orderIndex, firstName, lastName, creatorTypeID){
Scholar.Item.prototype.setCreator = function(orderIndex, firstName, lastName, creatorTypeID){
if (this.getID() && !this._creatorsLoaded){
this._loadCreators();
}
@ -209,7 +209,7 @@ Scholar.Object.prototype.setCreator = function(orderIndex, firstName, lastName,
/*
* Remove a creator and shift others down
*/
Scholar.Object.prototype.removeCreator = function(orderIndex){
Scholar.Item.prototype.removeCreator = function(orderIndex){
if (this.getID() && !this._creatorsLoaded){
this._loadCreators();
}
@ -230,33 +230,33 @@ Scholar.Object.prototype.removeCreator = function(orderIndex){
/*
* Retrieves (and loads from DB, if necessary) an objectData field value
* Retrieves (and loads from DB, if necessary) an itemData field value
*
* Field can be passed as fieldID or fieldName
*/
Scholar.Object.prototype.getField = function(field){
//Scholar.debug('Requesting field ' + field + ' for object ' + this.getID(), 4);
Scholar.Item.prototype.getField = function(field){
//Scholar.debug('Requesting field ' + field + ' for item ' + this.getID(), 4);
if (this.isPrimaryField(field)){
return this._data[field] ? this._data[field] : '';
}
else {
if (this.getID() && !this._objectDataLoaded){
this._loadObjectData();
if (this.getID() && !this._itemDataLoaded){
this._loadItemData();
}
var fieldID = Scholar.ObjectFields.getID(field);
var fieldID = Scholar.ItemFields.getID(field);
return this._objectData[fieldID] ? this._objectData[fieldID] : '';
return this._itemData[fieldID] ? this._itemData[fieldID] : '';
}
}
/*
* Set a field value, loading existing objectData first if necessary
* Set a field value, loading existing itemData first if necessary
*
* Field can be passed as fieldID or fieldName
*/
Scholar.Object.prototype.setField = function(field, value, loadIn){
Scholar.Item.prototype.setField = function(field, value, loadIn){
// Primary field
if (this.isPrimaryField(field)){
if (!this.isEditableField(field)){
@ -274,32 +274,32 @@ Scholar.Object.prototype.setField = function(field, value, loadIn){
// Type-specific field
else {
if (!this.getType()){
throw ('Object type must be set before setting field data.');
throw ('Item type must be set before setting field data.');
}
// If existing object, load field data first unless we're already in
// If existing item, load field data first unless we're already in
// the middle of a load
if (this.getID() && !loadIn && !this._objectDataLoaded){
this._loadObjectData();
if (this.getID() && !loadIn && !this._itemDataLoaded){
this._loadItemData();
}
var fieldID = Scholar.ObjectFields.getID(field);
var fieldID = Scholar.ItemFields.getID(field);
if (!fieldID){
throw (field + ' is not a valid objectData field.');
throw (field + ' is not a valid itemData field.');
}
if (!Scholar.ObjectFields.isValidForType(fieldID, this.getType())){
if (!Scholar.ItemFields.isValidForType(fieldID, this.getType())){
throw (field + ' is not a valid field for this type.');
}
// If existing value, make sure it's actually changing
if (this._objectData[fieldID] && this._objectData[fieldID]==value){
if (this._itemData[fieldID] && this._itemData[fieldID]==value){
return false;
}
this._objectData[fieldID] = value;
this._itemData[fieldID] = value;
if (!loadIn){
this._changedObjectData.set(fieldID);
this._changedItemData.set(fieldID);
}
return true;
}
@ -307,15 +307,15 @@ Scholar.Object.prototype.setField = function(field, value, loadIn){
/*
* Move object to new position and shift surrounding objects
* Move item to new position and shift surrounding items
*
* N.B. Unless isNew is set, this function updates the DB immediately and
* reloads all cached objects -- a save() is not required
* reloads all cached items -- a save() is not required
*
* If isNew is true, a transaction is not started or committed, so it
* should only be run from an existing transaction within save()
*/
Scholar.Object.prototype.setPosition = function(newFolder, newPos, isNew){
Scholar.Item.prototype.setPosition = function(newFolder, newPos, isNew){
var oldFolder = this.getField('parentFolderID');
var oldPos = this.getField('orderIndex');
@ -347,7 +347,7 @@ Scholar.Object.prototype.setPosition = function(newFolder, newPos, isNew){
Scholar.DB.query(sql);
}
// If a new object, insert
// If a new item, insert
if (isNew){
sql = 'INSERT INTO treeStructure SET id=' + this.getID() + ', ' +
'isFolder=0, orderIndex=' + newPos + ', ' +
@ -370,7 +370,7 @@ Scholar.Object.prototype.setPosition = function(newFolder, newPos, isNew){
this._data['orderIndex'] = newPos;
if (!isNew){
Scholar.Objects.reloadAll();
Scholar.Items.reloadAll();
}
return true;
}
@ -379,19 +379,19 @@ Scholar.Object.prototype.setPosition = function(newFolder, newPos, isNew){
/*
* Save changes back to database
*/
Scholar.Object.prototype.save = function(){
Scholar.Item.prototype.save = function(){
if (!this.hasChanged()){
Scholar.debug('Object ' + this.getID() + ' has not changed', 4);
Scholar.debug('Item ' + this.getID() + ' has not changed', 4);
return !!this.getID();
}
//
// Existing object, update
// Existing item, update
//
if (this.getID()){
Scholar.debug('Updating database with new object data', 4);
Scholar.debug('Updating database with new item data', 4);
var objectID = this.getID();
var itemID = this.getID();
try {
Scholar.DB.beginTransaction();
@ -399,11 +399,11 @@ Scholar.Object.prototype.save = function(){
//
// Primary fields
//
var sql = "UPDATE objects SET ";
var sql = "UPDATE items SET ";
var sql2;
if (this._changed.has('objectTypeID')){
sql += "objectTypeID='" + this.getField('objectTypeID') + "', ";
if (this._changed.has('itemTypeID')){
sql += "itemTypeID='" + this.getField('itemTypeID') + "', ";
}
if (this._changed.has('title')){
sql += "title='" + this.getField('title') + "', ";
@ -417,7 +417,7 @@ Scholar.Object.prototype.save = function(){
// Always update modified time
sql += "dateModified=CURRENT_TIMESTAMP ";
sql += "WHERE objectID=" + this.getID() + ";\n";
sql += "WHERE itemID=" + this.getID() + ";\n";
//
@ -434,8 +434,8 @@ Scholar.Object.prototype.save = function(){
// We have to do this immediately so old entries are
// cleared before other ones are shifted down
if (!creator['firstName'] && !creator['lastName']){
sql2 = 'DELETE FROM objectCreators '
+ ' WHERE objectID=' + this.getID()
sql2 = 'DELETE FROM itemCreators '
+ ' WHERE itemID=' + this.getID()
+ ' AND orderIndex=' + orderIndex;
Scholar.DB.query(sql2);
continue;
@ -458,18 +458,18 @@ Scholar.Object.prototype.save = function(){
}
sql2 = 'SELECT COUNT(*) FROM objectCreators'
+ ' WHERE objectID=' + this.getID()
sql2 = 'SELECT COUNT(*) FROM itemCreators'
+ ' WHERE itemID=' + this.getID()
+ ' AND orderIndex=' + orderIndex;
if (Scholar.DB.valueQuery(sql2)){
sql += 'UPDATE objectCreators SET creatorID='
+ creatorID + ' WHERE objectID=' + this.getID()
sql += 'UPDATE itemCreators SET creatorID='
+ creatorID + ' WHERE itemID=' + this.getID()
+ ' AND orderIndex=' + orderIndex + ";\n";
}
else {
sql += 'INSERT INTO objectCreators VALUES ('
+ creatorID + ',' + objectID + ',' + orderIndex
sql += 'INSERT INTO itemCreators VALUES ('
+ creatorID + ',' + itemID + ',' + orderIndex
+ ");\n";
}
}
@ -480,34 +480,34 @@ Scholar.Object.prototype.save = function(){
//
// ObjectData
// ItemData
//
if (this._changedObjectData.length){
if (this._changedItemData.length){
var del = new Array();
for (fieldID in this._changedObjectData.items){
for (fieldID in this._changedItemData.items){
if (this.getField(fieldID)){
// Oh, for an INSERT...ON DUPLICATE KEY UPDATE
sql2 = 'SELECT COUNT(*) FROM objectData '
+ 'WHERE objectID=' + this.getID()
sql2 = 'SELECT COUNT(*) FROM itemData '
+ 'WHERE itemID=' + this.getID()
+ ' AND fieldID=' + fieldID;
if (Scholar.DB.valueQuery(sql2)){
sql += "UPDATE objectData SET value=";
sql += "UPDATE itemData SET value=";
// Take advantage of SQLite's manifest typing
if (Scholar.ObjectFields.isInteger(fieldID)){
if (Scholar.ItemFields.isInteger(fieldID)){
sql += this.getField(fieldID);
}
else {
sql += "'" + this.getField(fieldID) + "'";
}
sql += " WHERE objectID=" + this.getID()
sql += " WHERE itemID=" + this.getID()
+ ' AND fieldID=' + fieldID + ";\n";
}
else {
sql += 'INSERT INTO objectData VALUES ('
sql += 'INSERT INTO itemData VALUES ('
+ this.getID() + ',' + fieldID + ',';
if (Scholar.ObjectFields.isInteger(fieldID)){
if (Scholar.ItemFields.isInteger(fieldID)){
sql += this.getField(fieldID);
}
else {
@ -524,8 +524,8 @@ Scholar.Object.prototype.save = function(){
// Delete blank fields
if (del.length){
sql += 'DELETE from objectData '
+ 'WHERE objectID=' + this.getID() + ' '
sql += 'DELETE from itemData '
+ 'WHERE itemID=' + this.getID() + ' '
+ 'AND fieldID IN (' + del.join() + ");\n";
}
}
@ -541,10 +541,10 @@ Scholar.Object.prototype.save = function(){
}
//
// New object, insert and return id
// New item, insert and return id
//
else {
Scholar.debug('Saving data for new object to database');
Scholar.debug('Saving data for new item to database');
var isNew = true;
var sqlColumns = new Array();
@ -553,8 +553,8 @@ Scholar.Object.prototype.save = function(){
//
// Primary fields
//
sqlColumns.push('objectTypeID');
sqlValues.push({'int':this.getField('objectTypeID')});
sqlColumns.push('itemTypeID');
sqlValues.push({'int':this.getField('itemTypeID')});
if (this._changed.has('title')){
sqlColumns.push('title');
@ -601,17 +601,17 @@ Scholar.Object.prototype.save = function(){
);
}
sql += 'INSERT INTO objectCreators VALUES ('
+ creatorID + ',' + objectID + ',' + orderIndex
sql += 'INSERT INTO itemCreators VALUES ('
+ creatorID + ',' + itemID + ',' + orderIndex
+ ");\n";
}
}
//
// objectData fields
// itemData fields
//
var sql = "INSERT INTO objects (" + sqlColumns.join() + ')'
var sql = "INSERT INTO items (" + sqlColumns.join() + ')'
+ ' VALUES (';
// Insert placeholders for bind parameters
for (var i=0; i<sqlValues.length; i++){
@ -619,14 +619,14 @@ Scholar.Object.prototype.save = function(){
}
sql = sql.substring(0,sql.length-1) + ");\n";
var objectID = Scholar.DB.query(sql,sqlValues);
var itemID = Scholar.DB.query(sql,sqlValues);
if (this._changedObjectData.length){
if (this._changedItemData.length){
sql = '';
for (fieldID in this._changedObjectData.items){
sql += 'INSERT INTO objectData VALUES (' +
objectID + ',' + fieldID + ',';
if (Scholar.ObjectFields.isInteger(fieldID)){
for (fieldID in this._changedItemData.items){
sql += 'INSERT INTO itemData VALUES (' +
itemID + ',' + fieldID + ',';
if (Scholar.ItemFields.isInteger(fieldID)){
sql += this.getField(fieldID);
}
else {
@ -641,7 +641,7 @@ Scholar.Object.prototype.save = function(){
Scholar.DB.query(sql);
// Set the position of the new object
// Set the position of the new item
var newFolder = this._changed.has('parentFolderID')
? this.getField('parentFolderID') : 0;
@ -651,7 +651,7 @@ Scholar.Object.prototype.save = function(){
this.setPosition(newFolder, newPos, true);
// TODO: reload Folder or set the empty flag to false manually
// in case this was the first object in a folder
// in case this was the first item in a folder
Scholar.DB.commitTransaction();
}
@ -661,39 +661,39 @@ Scholar.Object.prototype.save = function(){
}
}
Scholar.Objects.reload(this.getID());
Scholar.Items.reload(this.getID());
return isNew ? this.getID() : true;
}
Scholar.Object.prototype.toString = function(){
Scholar.Item.prototype.toString = function(){
return this.getTitle();
}
Scholar.Object.prototype.isFolder = function(){
Scholar.Item.prototype.isFolder = function(){
return false;
}
//////////////////////////////////////////////////////////////////////////////
//
// Private Scholar.Object methods
// Private Scholar.Item methods
//
//////////////////////////////////////////////////////////////////////////////
/*
* Load in the creators from the database
*/
Scholar.Object.prototype._loadCreators = function(){
Scholar.Item.prototype._loadCreators = function(){
if (!this.getID()){
throw ('ObjectID not set for object before attempting to load creators');
throw ('ItemID not set for item before attempting to load creators');
}
var sql = 'SELECT C.creatorID, C.*, orderIndex FROM objectCreators OC '
var sql = 'SELECT C.creatorID, C.*, orderIndex FROM itemCreators IC '
+ 'LEFT JOIN creators C USING (creatorID) '
+ 'WHERE objectID=' + this.getID() + ' ORDER BY orderIndex';
+ 'WHERE itemID=' + this.getID() + ' ORDER BY orderIndex';
var creators = Scholar.DB.query(sql);
this._creatorsLoaded = true;
@ -718,19 +718,19 @@ Scholar.Object.prototype._loadCreators = function(){
/*
* Load in the field data from the database
*/
Scholar.Object.prototype._loadObjectData = function(){
Scholar.Item.prototype._loadItemData = function(){
if (!this.getID()){
throw ('ObjectID not set for object before attempting to load data');
throw ('ItemID not set for object before attempting to load data');
}
var sql = 'SELECT OD.fieldID, value FROM objectData OD JOIN '
+ 'objectTypeFields OTF ON (OTF.objectTypeID=(SELECT objectTypeID FROM '
+ 'objects WHERE objectID=?1) AND OTF.fieldID=OD.fieldID) '
+ 'WHERE objectID=?1 ORDER BY orderIndex';
var sql = 'SELECT ID.fieldID, value FROM itemData ID JOIN '
+ 'itemTypeFields ITF ON (ITF.itemTypeID=(SELECT itemTypeID FROM '
+ 'items WHERE itemID=?1) AND ITF.fieldID=ID.fieldID) '
+ 'WHERE itemID=?1 ORDER BY orderIndex';
var result = Scholar.DB.query(sql,[{'int':this._data['objectID']}]);
var result = Scholar.DB.query(sql,[{'int':this._data['itemID']}]);
this._objectDataLoaded = true;
this._itemDataLoaded = true;
if (result){
for (var i=0,len=result.length; i<len; i++){
@ -748,11 +748,11 @@ Scholar.Object.prototype._loadObjectData = function(){
/*
* Primary interface for accessing Scholar objects
* Primary interface for accessing Scholar items
*/
Scholar.Objects = new function(){
Scholar.Items = new function(){
// Private members
var _objects = new Array();
var _items = new Array();
// Privileged methods
this.get = get;
@ -762,12 +762,12 @@ Scholar.Objects = new function(){
this.reloadAll = reloadAll;
/*
* Retrieves (and loads, if necessary) an arbitrary number of objects
* Retrieves (and loads, if necessary) an arbitrary number of items
*
* Can be passed ids as individual parameters or as an array of ids, or both
*
* If only one argument and it's an id, return object directly;
* otherwise, return array indexed by objectID
* otherwise, return array indexed by itemID
*/
function get(){
var toLoad = new Array();
@ -781,12 +781,12 @@ Scholar.Objects = new function(){
for (var i=0; i<ids.length; i++){
// Check if already loaded
if (!_objects[ids[i]]){
if (!_items[ids[i]]){
toLoad.push(ids[i]);
}
}
// New objects to load
// New items to load
if (toLoad.length){
_load(toLoad);
}
@ -794,12 +794,12 @@ Scholar.Objects = new function(){
// If single id, return the object directly
if (arguments[0] && typeof arguments[0]!='Object'
&& typeof arguments[1]=='undefined'){
return _objects[arguments[0]];
return _items[arguments[0]];
}
// Otherwise, build return array
for (i=0; i<ids.length; i++){
loaded[ids[i]] = _objects[ids[i]];
loaded[ids[i]] = _items[ids[i]];
}
return loaded;
@ -807,11 +807,11 @@ Scholar.Objects = new function(){
/*
* Returns all objects in the database
* Returns all items in the database
*/
function getAll(){
var sql = 'SELECT O.objectID FROM objects O '
+ 'LEFT JOIN treeStructure TS ON (O.objectID=TS.id AND isFolder=0) '
var sql = 'SELECT I.itemID FROM items I '
+ 'LEFT JOIN treeStructure TS ON (I.itemID=TS.id AND isFolder=0) '
+ 'ORDER BY orderIndex';
var ids = Scholar.DB.columnQuery(sql);
@ -820,8 +820,8 @@ Scholar.Objects = new function(){
/*
* Returns an array of all folders and objects that are children of a folder
* as Scholar.Folder and Scholar.Object instances
* Returns an array of all folders and items that are children of a folder
* as Scholar.Folder and Scholar.Item instances
*
* Takes parent folderID as optional parameter; by default, returns root items
*
@ -859,9 +859,9 @@ Scholar.Objects = new function(){
}
}
else {
var obj = Scholar.Objects.get(tree[i]['id']);
var obj = Scholar.Items.get(tree[i]['id']);
if (!obj){
throw ('Object ' + tree[i]['id'] + ' not found');
throw ('Item ' + tree[i]['id'] + ' not found');
}
}
@ -873,7 +873,7 @@ Scholar.Objects = new function(){
/*
* Reloads data for specified objects into internal array
* Reloads data for specified items into internal array
*
* Can be passed ids as individual parameters or as an array of ids, or both
*/
@ -891,22 +891,22 @@ Scholar.Objects = new function(){
/*
* Reloads all currently cached objects
* Reloads all currently cached items
*/
function reloadAll(){
var ids = new Array();
for (objectID in _objects){
ids.push(objectID);
for (itemID in _items){
ids.push(itemID);
}
_load(ids);
return true;
}
function add(data, objectTypeID, folderID, orderIndex){
function add(data, itemTypeID, folderID, orderIndex){
var insert = new Array();
var obj = new Scholar.Object(objectTypeID, folderID, orderIndex);
var obj = new Scholar.Item(itemTypeID, folderID, orderIndex);
for (field in data){
obj.setField(data[field]);
@ -923,27 +923,27 @@ Scholar.Objects = new function(){
return false;
}
// Should be the same as query in Scholar.Object.loadFromID, just
// without objectID clause
var sql = 'SELECT O.*, lastName AS firstCreator, TS.parentFolderID, '
// Should be the same as query in Scholar.Item.loadFromID, just
// without itemID clause
var sql = 'SELECT I.*, lastName AS firstCreator, TS.parentFolderID, '
+ 'TS.orderIndex '
+ 'FROM objects O '
+ 'LEFT JOIN treeStructure TS ON (O.objectID=TS.id AND isFolder=0) '
+ 'LEFT JOIN objectCreators OC ON (O.objectID=OC.objectID) '
+ 'LEFT JOIN creators C ON (OC.creatorID=C.creatorID) '
+ 'WHERE OC.orderIndex=0';
+ 'FROM items I '
+ 'LEFT JOIN treeStructure TS ON (I.itemID=TS.id AND isFolder=0) '
+ 'LEFT JOIN itemCreators IC ON (I.itemID=IC.itemID) '
+ 'LEFT JOIN creators C ON (IC.creatorID=C.creatorID) '
+ 'WHERE IC.orderIndex=0';
if (arguments[0]!='all'){
sql += ' AND O.objectID IN (' + Scholar.join(arguments,',') + ')';
sql += ' AND I.itemID IN (' + Scholar.join(arguments,',') + ')';
}
var result = Scholar.DB.query(sql);
if (result){
for (var i=0,len=result.length; i<len; i++){
var obj = new Scholar.Object();
var obj = new Scholar.Item();
obj.loadFromRow(result[i]);
_objects[result[i]['objectID']] = obj;
_items[result[i]['itemID']] = obj;
}
}
return true;
@ -1154,7 +1154,7 @@ Scholar.Creators = new function(){
*/
function purge(returnSQL){
var sql = 'SELECT creatorID FROM creators WHERE creatorID NOT IN '
+ '(SELECT creatorID FROM objectCreators);';
+ '(SELECT creatorID FROM itemCreators);';
var toDelete = Scholar.DB.columnQuery(sql);
if (!toDelete){
@ -1162,7 +1162,7 @@ Scholar.Creators = new function(){
}
sql = 'DELETE FROM creators WHERE creatorID NOT IN '
+ '(SELECT creatorID FROM objectCreators);';
+ '(SELECT creatorID FROM itemCreators);';
if (!returnSQL){
var result = Scholar.DB.query(sql);
@ -1194,18 +1194,18 @@ Scholar.Creators = new function(){
Scholar.ObjectFields = new function(){
Scholar.ItemFields = new function(){
// Private members
var _fields = new Array();
var _fieldFormats = new Array();
var _objectTypeFields = new Array();
var _itemTypeFields = new Array();
// Privileged methods
this.getName = getName;
this.getID = getID;
this.isValidForType = isValidForType;
this.isInteger = isInteger;
this.getObjectTypeFields = getObjectTypeFields;
this.getItemTypeFields = getItemTypeFields;
/*
* Return the fieldName for a passed fieldID or fieldName
@ -1229,11 +1229,11 @@ Scholar.ObjectFields = new function(){
}
function isValidForType(fieldID, objectTypeID){
function isValidForType(fieldID, itemTypeID){
if (!_fields.length){
_loadFields();
}
return !!_fields[fieldID]['objectTypes'][objectTypeID];
return !!_fields[fieldID]['itemTypes'][itemTypeID];
}
@ -1247,38 +1247,38 @@ Scholar.ObjectFields = new function(){
/*
* Returns an array of fieldIDs for a given object type
* Returns an array of fieldIDs for a given item type
*/
function getObjectTypeFields(objectTypeID){
if (_objectTypeFields[objectTypeID]){
return _objectTypeFields[objectTypeID];
function getItemTypeFields(itemTypeID){
if (_itemTypeFields[itemTypeID]){
return _itemTypeFields[itemTypeID];
}
var sql = 'SELECT fieldID FROM objectTypeFields '
+ 'WHERE objectTypeID=' + objectTypeID + ' ORDER BY orderIndex';
var sql = 'SELECT fieldID FROM itemTypeFields '
+ 'WHERE itemTypeID=' + itemTypeID + ' ORDER BY orderIndex';
_objectTypeFields[objectTypeID] = Scholar.DB.columnQuery(sql);
return _objectTypeFields[objectTypeID];
_itemTypeFields[itemTypeID] = Scholar.DB.columnQuery(sql);
return _itemTypeFields[itemTypeID];
}
/*
* Returns hash array of objectTypeIDs for which a given field is valid
* Returns hash array of itemTypeIDs for which a given field is valid
*/
function _getFieldObjectTypes(){
var sql = 'SELECT fieldID,objectTypeID FROM objectTypeFields';
function _getFieldItemTypes(){
var sql = 'SELECT fieldID, itemTypeID FROM itemTypeFields';
var results = Scholar.DB.query(sql);
if (!results){
throw ('No fields in objectTypeFields!');
throw ('No fields in itemTypeFields!');
}
var fields = new Array();
for (var i=0; i<results.length; i++){
if (!fields[results[i]['fieldID']]){
fields[results[i]['fieldID']] = new Array();
}
fields[results[i]['fieldID']][results[i]['objectTypeID']] = true;
fields[results[i]['fieldID']][results[i]['itemTypeID']] = true;
}
return fields;
}
@ -1305,14 +1305,14 @@ Scholar.ObjectFields = new function(){
throw ('No fields in database!');
}
var fieldObjectTypes = _getFieldObjectTypes();
var fieldItemTypes = _getFieldItemTypes();
for (i=0,len=result.length; i<len; i++){
_fields[result[i]['fieldID']] = {
id: result[i]['fieldID'],
name: result[i]['fieldName'],
formatID: result[i]['fieldFormatID'],
objectTypes: fieldObjectTypes[result[i]['fieldID']]
itemTypes: fieldItemTypes[result[i]['fieldID']]
};
// Store by name as well as id
_fields[result[i]['fieldName']] = _fields[result[i]['fieldID']];
@ -1321,9 +1321,9 @@ Scholar.ObjectFields = new function(){
}
/*
var objects = Scholar.Objects.getAll();
var items = Scholar.Items.getAll();
var obj = objects[9];
var obj = items[9];
for (var i=0,len=obj.numCreators(); i<len; i++){
Scholar.debug(Scholar.varDump(obj.getCreator(i)));
}

View file

@ -412,11 +412,11 @@ Scholar.DB = new function(){
for (var i=parseInt(fromVersion) + 1; i<=toVersion; i++){
// For now, just wipe and recreate
if (i==6){
if (i==7){
_initializeSchema();
}
if (i==7){
if (i==8){
// do stuff
// _updateDBVersion(i);
}

View file

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

View file

@ -15,7 +15,7 @@ Scholar.TreeView.prototype.setTree = function(treebox)
return;
this._treebox = treebox;
var newRows = Scholar.Objects.getTreeRows();
var newRows = Scholar.Items.getTreeRows();
for(var i = 0; i < newRows.length; i++)
this._insertItem(newRows[i], 0, i+1); //object ref, isContainerOpen, level
@ -85,7 +85,7 @@ Scholar.TreeView.prototype.toggleOpenState = function(row)
}
else
{
var newRows = Scholar.Objects.getTreeRows(this._getObjectAtRow(row).getID()); //Get children
var newRows = Scholar.Items.getTreeRows(this._getObjectAtRow(row).getID()); //Get children
for(var i = 0; i < newRows.length; i++)
{
@ -245,10 +245,10 @@ function removeDynamicRows()
function getFullFieldList(item)
{
var fields = Scholar.ObjectFields.getObjectTypeFields(item.getField("objectTypeID"));
var fields = Scholar.ItemFields.getItemTypeFields(item.getField("itemTypeID"));
var fieldNames = new Array("title","dateAdded","dateModified","source","rights");
for(var i = 0; i<fields.length; i++)
fieldNames.push(Scholar.ObjectFields.getName(fields[i]));
fieldNames.push(Scholar.ItemFields.getName(fields[i]));
return fieldNames;
}

View file

@ -1,14 +1,14 @@
-- 6
-- 7
DROP TABLE IF EXISTS version;
CREATE TABLE version (
version INTEGER PRIMARY KEY
);
DROP TABLE IF EXISTS objects;
CREATE TABLE objects (
objectID INTEGER PRIMARY KEY,
objectTypeID INT,
DROP TABLE IF EXISTS items;
CREATE TABLE items (
itemID INTEGER PRIMARY KEY,
itemTypeID INT,
title TEXT,
dateAdded DATETIME DEFAULT CURRENT_TIMESTAMP,
dateModified DATETIME DEFAULT CURRENT_TIMESTAMP,
@ -16,9 +16,9 @@
rights TEXT
);
DROP TABLE IF EXISTS objectTypes;
CREATE TABLE objectTypes (
objectTypeID INTEGER PRIMARY KEY,
DROP TABLE IF EXISTS itemTypes;
CREATE TABLE itemTypes (
itemTypeID INTEGER PRIMARY KEY,
typeName TEXT
);
@ -37,26 +37,27 @@
FOREIGN KEY (fieldFormatID) REFERENCES fieldFormat(fieldFormatID)
);
DROP TABLE IF EXISTS objectTypeFields;
CREATE TABLE objectTypeFields (
objectTypeID INT,
DROP TABLE IF EXISTS itemTypeFields;
CREATE TABLE itemTypeFields (
itemTypeID INT,
fieldID INT,
orderIndex INT,
PRIMARY KEY (objectTypeID, fieldID),
FOREIGN KEY (objectTypeID) REFERENCES objectTypes(objectTypeID),
FOREIGN KEY (fieldID) REFERENCES objectTypes(objectTypeID)
PRIMARY KEY (itemTypeID, fieldID),
FOREIGN KEY (itemTypeID) REFERENCES itemTypes(itemTypeID),
FOREIGN KEY (fieldID) REFERENCES itemTypes(itemTypeID)
);
DROP TABLE IF EXISTS objectData;
CREATE TABLE objectData (
objectID INT,
DROP TABLE IF EXISTS itemData;
CREATE TABLE itemData (
itemID INT,
fieldID INT,
value NONE,
PRIMARY KEY (objectID, fieldID),
FOREIGN KEY (objectID) REFERENCES objects(objectID),
PRIMARY KEY (itemID, fieldID),
FOREIGN KEY (itemID) REFERENCES items(itemID),
FOREIGN KEY (fieldID) REFERENCES fields(fieldID)
);
CREATE INDEX value ON objectData (value);
DROP INDEX IF EXISTS value;
CREATE INDEX value ON itemData (value);
DROP TABLE IF EXISTS keywords;
CREATE TABLE keywords (
@ -64,12 +65,12 @@
keyword TEXT
);
DROP TABLE IF EXISTS objectKeywords;
CREATE TABLE objectKeywords (
objectID INT,
DROP TABLE IF EXISTS itemKeywords;
CREATE TABLE itemKeywords (
itemID INT,
keywordID INT,
PRIMARY KEY (objectID, keywordID),
FOREIGN KEY (objectID) REFERENCES objects(objectID),
PRIMARY KEY (itemID, keywordID),
FOREIGN KEY (itemID) REFERENCES items(itemID),
FOREIGN KEY (keywordID) REFERENCES keywords(keywordID)
);
@ -89,13 +90,13 @@
creatorType TEXT
);
DROP TABLE IF EXISTS objectCreators;
CREATE TABLE objectCreators (
objectID INT,
DROP TABLE IF EXISTS itemCreators;
CREATE TABLE itemCreators (
itemID INT,
creatorID INT,
orderIndex INT DEFAULT 0,
PRIMARY KEY (objectID, creatorID),
FOREIGN KEY (objectID) REFERENCES objects(objectID),
PRIMARY KEY (itemID, creatorID),
FOREIGN KEY (itemID) REFERENCES items(itemID),
FOREIGN KEY (creatorID) REFERENCES creators(creatorID)
);
@ -121,8 +122,8 @@
INSERT INTO treeStructure VALUES (0, 1, 0, NULL);
-- Some sample data
INSERT INTO objectTypes VALUES (1,'Book');
INSERT INTO objectTypes VALUES (2,'Journal Article');
INSERT INTO itemTypes VALUES (1,'Book');
INSERT INTO itemTypes VALUES (2,'Journal Article');
INSERT INTO "fieldFormats" VALUES(1, '.*', 0);
INSERT INTO "fieldFormats" VALUES(2, '[0-9]*', 1);
@ -140,43 +141,43 @@
INSERT INTO fields VALUES (10,'publication',NULL);
INSERT INTO fields VALUES (11,'ISSN',NULL);
INSERT INTO objectTypeFields VALUES (1,1,1);
INSERT INTO objectTypeFields VALUES (1,2,2);
INSERT INTO objectTypeFields VALUES (1,3,3);
INSERT INTO objectTypeFields VALUES (1,4,4);
INSERT INTO objectTypeFields VALUES (1,5,5);
INSERT INTO objectTypeFields VALUES (1,6,6);
INSERT INTO objectTypeFields VALUES (1,7,7);
INSERT INTO objectTypeFields VALUES (1,8,8);
INSERT INTO objectTypeFields VALUES (1,9,9);
INSERT INTO objectTypeFields VALUES (2,10,1);
INSERT INTO objectTypeFields VALUES (2,2,2);
INSERT INTO objectTypeFields VALUES (2,3,3);
INSERT INTO objectTypeFields VALUES (2,8,4);
INSERT INTO itemTypeFields VALUES (1,1,1);
INSERT INTO itemTypeFields VALUES (1,2,2);
INSERT INTO itemTypeFields VALUES (1,3,3);
INSERT INTO itemTypeFields VALUES (1,4,4);
INSERT INTO itemTypeFields VALUES (1,5,5);
INSERT INTO itemTypeFields VALUES (1,6,6);
INSERT INTO itemTypeFields VALUES (1,7,7);
INSERT INTO itemTypeFields VALUES (1,8,8);
INSERT INTO itemTypeFields VALUES (1,9,9);
INSERT INTO itemTypeFields VALUES (2,10,1);
INSERT INTO itemTypeFields VALUES (2,2,2);
INSERT INTO itemTypeFields VALUES (2,3,3);
INSERT INTO itemTypeFields VALUES (2,8,4);
INSERT INTO "objects" VALUES(1, 1, 'Online connections: Internet interpersonal relationships', '2006-03-12 05:24:40', '2006-03-12 05:24:40', NULL, NULL);
INSERT INTO "objects" VALUES(2, 1, 'Computer-Mediated Communication: Human-to-Human Communication Across the Internet', '2006-03-12 05:25:50', '2006-03-12 05:25:50', NULL, NULL);
INSERT INTO "objects" VALUES(3, 2, 'Residential propinquity as a factor in marriage selection', '2006-03-12 05:26:37', '2006-03-12 05:26:37', NULL, NULL);
INSERT INTO "objects" VALUES(4, 1, 'Connecting: how we form social bonds and communities in the Internet age', '2006-03-12 05:27:15', '2006-03-12 05:27:15', NULL, NULL);
INSERT INTO "objects" VALUES(5, 1, 'Male, Female, Email: The Struggle for Relatedness in a Paranoid Society', '2006-03-12 05:27:36', '2006-03-12 05:27:36', NULL, NULL);
INSERT INTO "objects" VALUES(6, 2, 'Social Implications of Sociology', '2006-03-12 05:27:53', '2006-03-12 05:27:53', NULL, NULL);
INSERT INTO "objects" VALUES(7, 1, 'Social Pressures in Informal Groups: A Study of Human Factors in Housing', '2006-03-12 05:28:05', '2006-03-12 05:28:05', NULL, NULL);
INSERT INTO "objects" VALUES(8, 1, 'Cybersociety 2.0: Revisiting Computer-Mediated Community and Technology', '2006-03-12 05:28:37', '2006-03-12 05:28:37', NULL, NULL);
INSERT INTO "objects" VALUES(9, 2, 'The Computer as a Communication Device', '2006-03-12 05:29:03', '2006-03-12 05:29:03', NULL, NULL);
INSERT INTO "objects" VALUES(10, 2, 'What Does Research Say about the Nature of Computer-mediated Communication: Task-Oriented, Social-Emotion-Oriented, or Both?', '2006-03-12 05:29:12', '2006-03-12 05:29:12', NULL, NULL);
INSERT INTO "objects" VALUES(11, 1, 'The second self: computers and the human spirit', '2006-03-12 05:30:38', '2006-03-12 05:30:38', NULL, NULL);
INSERT INTO "objects" VALUES(12, 1, 'Life on the screen: identity in the age of the Internet', '2006-03-12 05:30:49', '2006-03-12 05:30:49', NULL, NULL);
INSERT INTO "objects" VALUES(13, 2, 'The computer conference: An altered state of communication', '2006-03-12 05:31:00', '2006-03-12 05:31:00', NULL, NULL);
INSERT INTO "objects" VALUES(14, 2, 'Computer Networks as Social Networks: Collaborative Work, Telework, and Community', '2006-03-12 05:31:17', '2006-03-12 05:31:17', NULL, NULL);
INSERT INTO "objects" VALUES(15, 1, 'The Internet in everyday life', '2006-03-12 05:31:41', '2006-03-12 05:31:41', NULL, NULL);
INSERT INTO "items" VALUES(1, 1, 'Online connections: Internet interpersonal relationships', '2006-03-12 05:24:40', '2006-03-12 05:24:40', NULL, NULL);
INSERT INTO "items" VALUES(2, 1, 'Computer-Mediated Communication: Human-to-Human Communication Across the Internet', '2006-03-12 05:25:50', '2006-03-12 05:25:50', NULL, NULL);
INSERT INTO "items" VALUES(3, 2, 'Residential propinquity as a factor in marriage selection', '2006-03-12 05:26:37', '2006-03-12 05:26:37', NULL, NULL);
INSERT INTO "items" VALUES(4, 1, 'Connecting: how we form social bonds and communities in the Internet age', '2006-03-12 05:27:15', '2006-03-12 05:27:15', NULL, NULL);
INSERT INTO "items" VALUES(5, 1, 'Male, Female, Email: The Struggle for Relatedness in a Paranoid Society', '2006-03-12 05:27:36', '2006-03-12 05:27:36', NULL, NULL);
INSERT INTO "items" VALUES(6, 2, 'Social Implications of Sociology', '2006-03-12 05:27:53', '2006-03-12 05:27:53', NULL, NULL);
INSERT INTO "items" VALUES(7, 1, 'Social Pressures in Informal Groups: A Study of Human Factors in Housing', '2006-03-12 05:28:05', '2006-03-12 05:28:05', NULL, NULL);
INSERT INTO "items" VALUES(8, 1, 'Cybersociety 2.0: Revisiting Computer-Mediated Community and Technology', '2006-03-12 05:28:37', '2006-03-12 05:28:37', NULL, NULL);
INSERT INTO "items" VALUES(9, 2, 'The Computer as a Communication Device', '2006-03-12 05:29:03', '2006-03-12 05:29:03', NULL, NULL);
INSERT INTO "items" VALUES(10, 2, 'What Does Research Say about the Nature of Computer-mediated Communication: Task-Oriented, Social-Emotion-Oriented, or Both?', '2006-03-12 05:29:12', '2006-03-12 05:29:12', NULL, NULL);
INSERT INTO "items" VALUES(11, 1, 'The second self: computers and the human spirit', '2006-03-12 05:30:38', '2006-03-12 05:30:38', NULL, NULL);
INSERT INTO "items" VALUES(12, 1, 'Life on the screen: identity in the age of the Internet', '2006-03-12 05:30:49', '2006-03-12 05:30:49', NULL, NULL);
INSERT INTO "items" VALUES(13, 2, 'The computer conference: An altered state of communication', '2006-03-12 05:31:00', '2006-03-12 05:31:00', NULL, NULL);
INSERT INTO "items" VALUES(14, 2, 'Computer Networks as Social Networks: Collaborative Work, Telework, and Community', '2006-03-12 05:31:17', '2006-03-12 05:31:17', NULL, NULL);
INSERT INTO "items" VALUES(15, 1, 'The Internet in everyday life', '2006-03-12 05:31:41', '2006-03-12 05:31:41', NULL, NULL);
INSERT INTO "objectData" VALUES(1, 7, 2001);
INSERT INTO "objectData" VALUES(1, 5, 'Cresskill, N.J.');
INSERT INTO "objectData" VALUES(1, 6, 'Hampton Press');
INSERT INTO "objectData" VALUES(2, 7, 2002);
INSERT INTO "objectData" VALUES(2, 6, 'Allyn & Bacon Publishers');
INSERT INTO "objectData" VALUES(2, 8, 347);
INSERT INTO "objectData" VALUES(2, 9, '0-205-32145-3');
INSERT INTO "itemData" VALUES(1, 7, 2001);
INSERT INTO "itemData" VALUES(1, 5, 'Cresskill, N.J.');
INSERT INTO "itemData" VALUES(1, 6, 'Hampton Press');
INSERT INTO "itemData" VALUES(2, 7, 2002);
INSERT INTO "itemData" VALUES(2, 6, 'Allyn & Bacon Publishers');
INSERT INTO "itemData" VALUES(2, 8, 347);
INSERT INTO "itemData" VALUES(2, 9, '0-205-32145-3');
INSERT INTO "creators" VALUES(1, 1, 'Susan B.', 'Barnes');
INSERT INTO "creators" VALUES(2, 1, 'J.S.', 'Bassard');
@ -194,24 +195,24 @@
INSERT INTO "creators" VALUES(14, 1, 'J.', 'Vallee');
INSERT INTO "creators" VALUES(15, 1, 'Barry', 'Wellman');
INSERT INTO "objectCreators" VALUES(1, 1, 0);
INSERT INTO "objectCreators" VALUES(2, 1, 0);
INSERT INTO "objectCreators" VALUES(3, 2, 0);
INSERT INTO "objectCreators" VALUES(4, 3, 0);
INSERT INTO "objectCreators" VALUES(5, 4, 0);
INSERT INTO "objectCreators" VALUES(6, 5, 0);
INSERT INTO "objectCreators" VALUES(7, 6, 0);
INSERT INTO "objectCreators" VALUES(8, 9, 0);
INSERT INTO "objectCreators" VALUES(9, 10, 0);
INSERT INTO "objectCreators" VALUES(10, 12, 0);
INSERT INTO "objectCreators" VALUES(11, 13, 0);
INSERT INTO "objectCreators" VALUES(12, 13, 0);
INSERT INTO "objectCreators" VALUES(13, 14, 0);
INSERT INTO "objectCreators" VALUES(14, 15, 0);
INSERT INTO "objectCreators" VALUES(15, 15, 0);
INSERT INTO "objectCreators" VALUES(7, 7, 1);
INSERT INTO "objectCreators" VALUES(7, 8, 2);
INSERT INTO "objectCreators" VALUES(9, 11, 1);
INSERT INTO "itemCreators" VALUES(1, 1, 0);
INSERT INTO "itemCreators" VALUES(2, 1, 0);
INSERT INTO "itemCreators" VALUES(3, 2, 0);
INSERT INTO "itemCreators" VALUES(4, 3, 0);
INSERT INTO "itemCreators" VALUES(5, 4, 0);
INSERT INTO "itemCreators" VALUES(6, 5, 0);
INSERT INTO "itemCreators" VALUES(7, 6, 0);
INSERT INTO "itemCreators" VALUES(8, 9, 0);
INSERT INTO "itemCreators" VALUES(9, 10, 0);
INSERT INTO "itemCreators" VALUES(10, 12, 0);
INSERT INTO "itemCreators" VALUES(11, 13, 0);
INSERT INTO "itemCreators" VALUES(12, 13, 0);
INSERT INTO "itemCreators" VALUES(13, 14, 0);
INSERT INTO "itemCreators" VALUES(14, 15, 0);
INSERT INTO "itemCreators" VALUES(15, 15, 0);
INSERT INTO "itemCreators" VALUES(7, 7, 1);
INSERT INTO "itemCreators" VALUES(7, 8, 2);
INSERT INTO "itemCreators" VALUES(9, 11, 1);
INSERT INTO folders VALUES (1241, 'Test Folder');
INSERT INTO folders VALUES (3262, 'Another Test Folder');