diff --git a/master.sql b/master.sql
new file mode 100644
index 0000000..f251a82
--- /dev/null
+++ b/master.sql
@@ -0,0 +1,530 @@
+-- ***** BEGIN LICENSE BLOCK *****
+--
+-- This file is part of the Zotero Data Server.
+--
+-- Copyright © 2010 Center for History and New Media
+-- George Mason University, Fairfax, Virginia, USA
+-- http://zotero.org
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU Affero General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU Affero General Public License for more details.
+--
+-- You should have received a copy of the GNU Affero General Public License
+-- along with this program. If not, see .
+--
+-- ***** END LICENSE BLOCK *****
+
+SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
+
+CREATE TABLE `abstractCreators` (
+ `creatorID` int(10) unsigned NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `abstractItems` (
+ `itemID` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ PRIMARY KEY (`itemID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `baseFieldMappings` (
+ `itemTypeID` smallint(5) unsigned NOT NULL,
+ `baseFieldID` smallint(5) unsigned NOT NULL,
+ `fieldID` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`itemTypeID`,`baseFieldID`,`fieldID`),
+ KEY `baseFieldID` (`baseFieldID`),
+ KEY `fieldID` (`fieldID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `charsets` (
+ `charsetID` tinyint(3) unsigned NOT NULL,
+ `charset` varchar(50) NOT NULL,
+ PRIMARY KEY (`charsetID`),
+ KEY `charset` (`charset`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `creatorTypes` (
+ `creatorTypeID` smallint(5) unsigned NOT NULL,
+ `creatorTypeName` varchar(50) NOT NULL,
+ `custom` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`creatorTypeID`),
+ UNIQUE KEY `creatorTypeName` (`creatorTypeName`),
+ KEY `custom` (`custom`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `fields` (
+ `fieldID` smallint(5) unsigned NOT NULL,
+ `fieldName` varchar(50) NOT NULL,
+ `fieldFormatID` tinyint(3) unsigned DEFAULT NULL,
+ `custom` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`fieldID`),
+ UNIQUE KEY `fieldName` (`fieldName`),
+ KEY `custom` (`custom`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `groups` (
+ `groupID` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `libraryID` int(10) unsigned NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `slug` varchar(255) DEFAULT NULL,
+ `type` enum('PublicOpen','PublicClosed','Private') NOT NULL DEFAULT 'Private',
+ `libraryEditing` enum('admins','members') NOT NULL DEFAULT 'admins',
+ `libraryReading` enum('members','all') NOT NULL DEFAULT 'all',
+ `fileEditing` enum('none','admins','members') NOT NULL DEFAULT 'admins',
+ `description` text NOT NULL,
+ `url` varchar(255) NOT NULL,
+ `hasImage` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `dateAdded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `dateModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `version` tinyint(3) unsigned NOT NULL DEFAULT '1',
+ PRIMARY KEY (`groupID`),
+ UNIQUE KEY `libraryID` (`libraryID`),
+ UNIQUE KEY `slug` (`slug`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `groupUsers` (
+ `groupID` int(10) unsigned NOT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `role` enum('owner','admin','member') NOT NULL DEFAULT 'member',
+ `joined` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `lastUpdated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`groupID`,`userID`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `itemTypeCreatorTypes` (
+ `itemTypeID` smallint(5) unsigned NOT NULL,
+ `creatorTypeID` smallint(5) unsigned NOT NULL,
+ `primaryField` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`itemTypeID`,`creatorTypeID`),
+ KEY `creatorTypeID` (`creatorTypeID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `itemTypeFields` (
+ `itemTypeID` smallint(5) unsigned NOT NULL,
+ `fieldID` smallint(5) unsigned NOT NULL,
+ `hide` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `orderIndex` tinyint(3) unsigned NOT NULL,
+ PRIMARY KEY (`itemTypeID`,`fieldID`),
+ KEY `fieldID` (`fieldID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `itemTypes` (
+ `itemTypeID` smallint(5) unsigned NOT NULL,
+ `itemTypeName` varchar(50) NOT NULL,
+ `custom` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`itemTypeID`),
+ UNIQUE KEY `itemTypeName` (`itemTypeName`),
+ KEY `custom` (`custom`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE IF NOT EXISTS `keyAccessLog` (
+ `keyID` int(10) unsigned NOT NULL,
+ `ipAddress` int(10) unsigned NOT NULL DEFAULT '0',
+ `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`keyID`,`ipAddress`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+
+CREATE TABLE `keyPermissions` (
+ `keyID` int(10) unsigned NOT NULL,
+ `libraryID` int(10) unsigned NOT NULL,
+ `permission` enum('library','notes','write') NOT NULL,
+ `granted` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`keyID`,`libraryID`,`permission`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `keys` (
+ `keyID` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `key` char(24) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
+ `dateAdded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `lastUsed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`keyID`),
+ UNIQUE KEY `key` (`key`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `libraries` (
+ `libraryID` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `libraryType` enum('user','group') NOT NULL,
+ `lastUpdated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `version` int(10) unsigned NOT NULL DEFAULT '0',
+ `shardID` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`libraryID`),
+ KEY `libraryType` (`libraryType`),
+ KEY `shardID` (`shardID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `processorDaemons` (
+ `mode` enum('download','upload','error','index') NOT NULL,
+ `addr` int(10) unsigned NOT NULL,
+ `port` smallint(5) unsigned NOT NULL,
+ `lastSeen` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`mode`,`addr`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `sessions` (
+ `sessionID` char(32) CHARACTER SET ascii NOT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `ipAddress` int(10) unsigned DEFAULT NULL,
+ `exclusive` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`sessionID`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `shardHosts` (
+ `shardHostID` tinyint(3) unsigned NOT NULL,
+ `address` varchar(15) NOT NULL,
+ `port` smallint(5) unsigned NOT NULL DEFAULT 3306,
+ `state` enum('up','readonly','down') NOT NULL,
+ PRIMARY KEY (`shardHostID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `shards` (
+ `shardID` smallint(5) unsigned NOT NULL,
+ `shardHostID` tinyint(3) unsigned NOT NULL,
+ `db` varchar(20) NOT NULL,
+ `state` enum('up','readonly','down') NOT NULL,
+ `items` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`shardID`),
+ KEY `shardHostID` (`shardHostID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageAccounts` (
+ `userID` int(10) unsigned NOT NULL,
+ `quota` mediumint(8) unsigned DEFAULT 10000 NOT NULL,
+ `expiration` timestamp NULL DEFAULT DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 10 YEARS),
+ PRIMARY KEY (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageDownloadLog` (
+ `ownerUserID` int(10) unsigned NOT NULL,
+ `downloadUserID` int(10) unsigned DEFAULT NULL,
+ `ipAddress` int(10) unsigned NULL,
+ `storageFileID` int(10) unsigned NOT NULL,
+ `filename` varchar(1024) NOT NULL,
+ `size` int(10) unsigned NOT NULL,
+ `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageFiles` (
+ `storageFileID` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `hash` char(32) NOT NULL,
+ `filename` varchar(255) NOT NULL,
+ `size` int(10) unsigned NOT NULL,
+ `zip` tinyint(1) unsigned NOT NULL,
+ `lastAdded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`storageFileID`),
+ UNIQUE KEY `hash` (`hash`,`filename`,`zip`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageFilesExisting` (
+ `storageFileID` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`storageFileID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageLastSync` (
+ `userID` int(10) unsigned NOT NULL,
+ `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageUploadLog` (
+ `ownerUserID` int(10) unsigned NOT NULL,
+ `uploadUserID` int(10) unsigned NOT NULL,
+ `ipAddress` int(10) unsigned NULL,
+ `storageFileID` int(10) unsigned NOT NULL,
+ `filename` varchar(1024) NOT NULL,
+ `size` int(10) unsigned NOT NULL,
+ `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `storageUploadQueue` (
+ `uploadKey` char(32) NOT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `hash` char(32) NOT NULL,
+ `filename` varchar(1024) NOT NULL,
+ `zip` tinyint(1) unsigned NOT NULL,
+ `size` int(10) unsigned NOT NULL,
+ `mtime` bigint(13) unsigned NOT NULL,
+ `contentType` varchar(75) DEFAULT NULL,
+ `charset` varchar(25) DEFAULT NULL,
+ `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`uploadKey`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncDownloadProcessLog` (
+ `userID` int(10) unsigned NOT NULL,
+ `lastsync` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `objects` int(10) unsigned NOT NULL,
+ `ipAddress` int(10) unsigned NOT NULL,
+ `processorHost` int(10) unsigned NOT NULL,
+ `processDuration` float(6,2) NOT NULL,
+ `totalDuration` smallint(5) unsigned NOT NULL,
+ `error` tinyint(4) NOT NULL DEFAULT '0',
+ `finished` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ KEY `finished` (`finished`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncDownloadQueue` (
+ `syncDownloadQueueID` int(10) unsigned NOT NULL,
+ `processorHost` int(10) unsigned DEFAULT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `sessionID` char(32) CHARACTER SET ascii NOT NULL,
+ `lastsync` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `lastsyncMS` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `version` smallint(5) unsigned NOT NULL,
+ `params` mediumtext NOT NULL,
+ `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `objects` int(10) unsigned NOT NULL,
+ `lastCheck` timestamp NULL DEFAULT NULL,
+ `tries` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `started` timestamp NULL DEFAULT NULL,
+ `syncDownloadProcessID` int(10) unsigned DEFAULT NULL,
+ `finished` timestamp NULL DEFAULT NULL,
+ `finishedMS` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `xmldata` longtext,
+ `errorCode` int(10) unsigned DEFAULT NULL,
+ `errorMessage` text,
+ PRIMARY KEY (`syncDownloadQueueID`),
+ KEY `userID` (`userID`),
+ KEY `sessionID` (`sessionID`),
+ KEY `started` (`started`),
+ KEY `syncDownloadProcessID` (`syncDownloadProcessID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncProcesses` (
+ `syncProcessID` int(10) unsigned NOT NULL,
+ `userID` int(10) unsigned NOT NULL,
+ `started` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`syncProcessID`),
+ UNIQUE KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncProcessLocks` (
+ `syncProcessID` int(10) unsigned NOT NULL,
+ `libraryID` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`syncProcessID`,`libraryID`),
+ KEY `libraryID` (`libraryID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncUploadQueue` (
+ `syncUploadQueueID` int(10) unsigned NOT NULL,
+ `processorHost` int(10) unsigned DEFAULT NULL,
+ `xmldata` longtext NOT NULL,
+ `dataLength` int(10) unsigned NOT NULL DEFAULT '0',
+ `hasCreator` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `userID` int(10) unsigned NOT NULL,
+ `sessionID` char(32) CHARACTER SET ascii NOT NULL,
+ `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `errorCheck` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `tries` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `started` timestamp NULL DEFAULT NULL,
+ `startedMS` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `syncProcessID` int(10) unsigned DEFAULT NULL,
+ `finished` timestamp NULL DEFAULT NULL,
+ `finishedMS` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `errorCode` int(10) unsigned DEFAULT NULL,
+ `errorMessage` mediumtext,
+ PRIMARY KEY (`syncUploadQueueID`),
+ UNIQUE KEY `sessionID` (`sessionID`),
+ UNIQUE KEY `syncProcessID` (`syncProcessID`),
+ KEY `userID` (`userID`),
+ KEY `started` (`started`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncUploadQueueLocks` (
+ `syncUploadQueueID` int(10) unsigned NOT NULL,
+ `libraryID` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`syncUploadQueueID`,`libraryID`),
+ KEY `libraryID` (`libraryID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncUploadProcessLog` (
+ `userID` int(10) unsigned NOT NULL,
+ `dataLength` int(10) unsigned NOT NULL,
+ `processorHost` int(10) unsigned NOT NULL,
+ `processDuration` float(6,2) NOT NULL,
+ `totalDuration` smallint(5) unsigned NOT NULL,
+ `error` tinyint(4) NOT NULL DEFAULT '0',
+ `finished` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ KEY `finished` (`finished`),
+ KEY `userID` (`userID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `syncUploadQueuePostWriteLog` (
+ `syncUploadQueueID` int(10) unsigned NOT NULL,
+ `objectType` enum('group','groupUser') NOT NULL,
+ `ids` varchar(30) NOT NULL,
+ `action` enum('update','delete') NOT NULL,
+ PRIMARY KEY (`syncUploadQueueID`,`objectType`,`ids`,`action`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+CREATE TABLE `users` (
+ `userID` int(10) unsigned NOT NULL,
+ `libraryID` int(10) unsigned NOT NULL,
+ `username` varchar(255) NOT NULL,
+ `joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `lastSyncTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`userID`),
+ UNIQUE KEY `libraryID` (`libraryID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
+ALTER TABLE `baseFieldMappings`
+ ADD CONSTRAINT `baseFieldMappings_ibfk_1` FOREIGN KEY (`itemTypeID`) REFERENCES `itemTypes` (`itemTypeID`),
+ ADD CONSTRAINT `baseFieldMappings_ibfk_2` FOREIGN KEY (`baseFieldID`) REFERENCES `fields` (`fieldID`),
+ ADD CONSTRAINT `baseFieldMappings_ibfk_3` FOREIGN KEY (`fieldID`) REFERENCES `fields` (`fieldID`);
+
+ALTER TABLE `groups`
+ ADD CONSTRAINT `groups_ibfk_1` FOREIGN KEY (`libraryID`) REFERENCES `libraries` (`libraryID`) ON DELETE CASCADE;
+
+ALTER TABLE `groupUsers`
+ ADD CONSTRAINT `groupUsers_ibfk_1` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`) ON DELETE CASCADE,
+ ADD CONSTRAINT `groupUsers_ibfk_2` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE,
+ ADD CONSTRAINT `groupUsers_ibfk_3` FOREIGN KEY (`groupID`) REFERENCES `groups` (`groupID`) ON DELETE CASCADE,
+ ADD CONSTRAINT `groupUsers_ibfk_4` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE;
+
+ALTER TABLE `itemTypeCreatorTypes`
+ ADD CONSTRAINT `itemTypeCreatorTypes_ibfk_1` FOREIGN KEY (`itemTypeID`) REFERENCES `itemTypes` (`itemTypeID`),
+ ADD CONSTRAINT `itemTypeCreatorTypes_ibfk_2` FOREIGN KEY (`creatorTypeID`) REFERENCES `creatorTypes` (`creatorTypeID`);
+
+ALTER TABLE `itemTypeFields`
+ ADD CONSTRAINT `itemTypeFields_ibfk_1` FOREIGN KEY (`itemTypeID`) REFERENCES `itemTypes` (`itemTypeID`),
+ ADD CONSTRAINT `itemTypeFields_ibfk_2` FOREIGN KEY (`fieldID`) REFERENCES `fields` (`fieldID`);
+
+ALTER TABLE `keys`
+ ADD CONSTRAINT `keys_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE;
+
+ALTER TABLE `keyPermissions`
+ ADD CONSTRAINT `keyPermissions_ibfk_1` FOREIGN KEY (`keyID`) REFERENCES `keys` (`keyID`) ON DELETE CASCADE;
+
+ALTER TABLE `libraries`
+ ADD CONSTRAINT `libraries_ibfk_1` FOREIGN KEY (`shardID`) REFERENCES `shards` (`shardID`);
+
+ALTER TABLE `sessions`
+ ADD CONSTRAINT `sessions_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE;
+
+ALTER TABLE `shards`
+ ADD CONSTRAINT `shards_ibfk_1` FOREIGN KEY (`shardHostID`) REFERENCES `shardHosts` (`shardHostID`);
+
+ALTER TABLE `storageAccounts`
+ ADD CONSTRAINT `storageAccounts_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `storageLastSync`
+ ADD CONSTRAINT `storageLastSync_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `storageUploadQueue`
+ ADD CONSTRAINT `storageUploadQueue_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `syncDownloadQueue`
+ ADD CONSTRAINT `syncDownloadQueue_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE ON UPDATE CASCADE,
+ ADD CONSTRAINT `syncDownloadQueue_ibfk_3` FOREIGN KEY (`sessionID`) REFERENCES `sessions` (`sessionID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `syncProcesses`
+ ADD CONSTRAINT `syncProcesses_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`);
+
+ALTER TABLE `syncProcessLocks`
+ ADD CONSTRAINT `syncProcessLocks_ibfk_1` FOREIGN KEY (`syncProcessID`) REFERENCES `syncProcesses` (`syncProcessID`) ON DELETE CASCADE ON UPDATE CASCADE,
+ ADD CONSTRAINT `syncProcessLocks_ibfk_2` FOREIGN KEY (`libraryID`) REFERENCES `libraries` (`libraryID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `syncUploadQueue`
+ ADD CONSTRAINT `syncUploadQueue_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `users` (`userID`) ON DELETE CASCADE ON UPDATE CASCADE,
+ ADD CONSTRAINT `syncUploadQueue_ibfk_2` FOREIGN KEY (`syncProcessID`) REFERENCES `syncProcesses` (`syncProcessID`) ON DELETE SET NULL,
+ ADD CONSTRAINT `syncUploadQueue_ibfk_3` FOREIGN KEY (`sessionID`) REFERENCES `sessions` (`sessionID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `syncUploadQueueLocks`
+ ADD CONSTRAINT `syncUploadQueueLocks_ibfk_1` FOREIGN KEY (`syncUploadQueueID`) REFERENCES `syncUploadQueue` (`syncUploadQueueID`) ON DELETE CASCADE ON UPDATE CASCADE,
+ ADD CONSTRAINT `syncUploadQueueLocks_ibfk_2` FOREIGN KEY (`libraryID`) REFERENCES `libraries` (`libraryID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `syncUploadQueuePostWriteLog`
+ ADD CONSTRAINT `syncUploadQueuePostWriteLog_ibfk_1` FOREIGN KEY (`syncUploadQueueID`) REFERENCES `syncUploadQueue` (`syncUploadQueueID`) ON DELETE CASCADE;
+
+ALTER TABLE `users`
+ ADD CONSTRAINT `users_ibfk_1` FOREIGN KEY (`libraryID`) REFERENCES `libraries` (`libraryID`) ON DELETE CASCADE;
+
+
+
+CREATE EVENT sessionGC ON SCHEDULE EVERY 5 MINUTE DO
+ DELETE S FROM sessions S LEFT JOIN syncUploadQueue USING (sessionID) WHERE timestamp