/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is bandwagon. * * The Initial Developer of the Original Code is * Mozilla Corporation. * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): David McNamara * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ Bandwagon.Factory.CollectionFactory = function(connection) { this.Bandwagon = Bandwagon; this.connection = connection; } Bandwagon.Factory.CollectionFactory.prototype.openServiceDocument = function() { if (!this.connection) return null; var statement = this.connection.createStatement("SELECT * FROM serviceDocument LIMIT 1"); var serviceDocument = null; try { statement.execute(); while (statement.executeStep()) { serviceDocument = new this.Bandwagon.Model.ServiceDocument(); serviceDocument.emailResourceURL = statement.getUTF8String(0); serviceDocument.collectionListResourceURL = statement.getUTF8String(1); } } finally { statement.reset(); } return serviceDocument; } Bandwagon.Factory.CollectionFactory.prototype.commitServiceDocument = function(serviceDocument) { if (!this.connection) return null; var statement1 = this.connection.createStatement("DELETE FROM serviceDocument"); try { statement1.execute(); } finally { statement1.reset(); } var statement2 = this.connection.createStatement("INSERT INTO serviceDocument VALUES (?1, ?2)"); try { statement2.bindUTF8StringParameter(0, serviceDocument.emailResourceURL); statement2.bindUTF8StringParameter(1, serviceDocument.collectionListResourceURL); statement2.execute(); } finally { statement2.reset(); } } Bandwagon.Factory.CollectionFactory.prototype.newCollection = function() { return new this.Bandwagon.Model.Collection(); } Bandwagon.Factory.CollectionFactory.prototype.openCollection = function(collection_id) { if (!this.connection) return null; var collections = {}; var statement = this.connection.createStatement("SELECT * FROM collections where id = ?1"); try { statement.bindInt32Parameter(0, collection_id); statement.execute(); var collection = this._openCollectionFromRS(statement); if (!collection) return null; collection.addons = this._openAddons(collection); collections[collection.resourceURL] = collection; } finally { statement.reset(); } return collection; } Bandwagon.Factory.CollectionFactory.prototype.openCollections = function() { if (!this.connection) return null; var collections = {}; var statement = this.connection.createStatement("SELECT * FROM collections"); try { while (statement.executeStep()) { var collection = this._openCollectionFromRS(statement); if (!collection) continue; collection.addons = this._openAddons(collection); collections[collection.resourceURL] = collection; } } finally { statement.reset(); } return collections; } Bandwagon.Factory.CollectionFactory.prototype.commitCollection = function(collection) { if (!this.connection) return; var statement = this.connection.createStatement("REPLACE INTO collections VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17)"); try { (collection.storageID==-1?statement.bindNullParameter(0):statement.bindInt32Parameter(0, collection.storageID)); statement.bindUTF8StringParameter(1, collection.resourceURL); statement.bindUTF8StringParameter(2, collection.name); statement.bindUTF8StringParameter(3, collection.description); statement.bindInt32Parameter(4, collection.dateAdded.getTime()/1000); (collection.dateLastCheck == null?statement.bindNullParameter(5):statement.bindInt32Parameter(5, collection.dateLastCheck.getTime()/1000)); statement.bindInt32Parameter(6, collection.updateInterval); statement.bindInt32Parameter(7, (collection.showNotifications?1:0)); statement.bindInt32Parameter(8, (collection.autoPublish?1:0)); statement.bindInt32Parameter(9, (collection.active?1:0)); statement.bindInt32Parameter(10, collection.addonsPerPage); statement.bindUTF8StringParameter(11, collection.creator); statement.bindInt32Parameter(12, collection.listed); statement.bindInt32Parameter(13, collection.writable); statement.bindInt32Parameter(14, collection.subscribed); (collection.lastModified == null?statement.bindNullParameter(15):statement.bindInt32Parameter(15, collection.lastModified.getTime()/1000)); statement.bindUTF8StringParameter(16, collection.addonsResourceURL); statement.execute(); } finally { statement.reset(); } if (collection.storageID == -1) { collection.storageID = this.connection.lastInsertRowID; } for (var id in collection.addons) { this._commitAddon(collection, collection.addons[id]); } return true; } Bandwagon.Factory.CollectionFactory.prototype.commitCollections = function(collections) { for (var id in collections) { this.commitCollection(collections[id]); } } Bandwagon.Factory.CollectionFactory.prototype.deleteCollection = function(collection) { if (!this.connection) return null; var statement1 = this.connection.createStatement("DELETE FROM collections where id = ?1"); var statement2 = this.connection.createStatement("DELETE FROM collectionsAddons where collection = ?1"); try { // TODO transaction here? statement1.bindInt32Parameter(0, collection.storageID); statement1.execute(); statement2.bindInt32Parameter(0, collection.storageID); statement2.execute(); } finally { statement1.reset(); statement2.reset(); } return (statement2.lastError>0?false:true); } // private methods Bandwagon.Factory.CollectionFactory.prototype._openCollectionFromRS = function(resultset) { var collection = new this.Bandwagon.Model.Collection(); collection.storageID = resultset.getInt32(0); collection.resourceURL = resultset.getUTF8String(1); collection.name = resultset.getUTF8String(2); collection.description = resultset.getUTF8String(3); collection.dateAdded = new Date(resultset.getInt32(4)*1000); if (!resultset.getIsNull(5)) collection.dateLastCheck = new Date(resultset.getInt32(5)*1000); collection.updateInterval = resultset.getInt32(6); collection.showNotifications = (resultset.getInt32(7)==1?true:false); collection.autoPublish = (resultset.getInt32(8)==1?true:false); collection.active = (resultset.getInt32(9)==1?true:false); collection.addonsPerPage = resultset.getInt32(10); collection.creator = resultset.getUTF8String(11); collection.listed = resultset.getInt32(12); collection.writable = resultset.getInt32(13); collection.subscribed = resultset.getInt32(14); if (!resultset.getIsNull(15)) collection.lastModified = new Date(resultset.getInt32(15)*1000); collection.addonsResourceURL = resultset.getUTF8String(16); return collection; } Bandwagon.Factory.CollectionFactory.prototype._openAddons = function(collection) { var addons = {}; var statement = this.connection.createStatement("SELECT addons.*, collectionsAddons.id, collectionsAddons.read FROM addons LEFT JOIN collectionsAddons ON addons.id = collectionsAddons.addon WHERE collectionsAddons.collection = ?1 LIMIT ?2"); try { statement.bindInt32Parameter(0, collection.storageID); statement.bindInt32Parameter(1, this.Bandwagon.DEFAULT_ADDONS_PER_PAGE); while (statement.executeStep()) { var addon = new this.Bandwagon.Model.Addon(); addon.Bandwagon = this.Bandwagon; addon.storageID = statement.getInt32(0); addon.guid = statement.getUTF8String(1); addon.name = statement.getUTF8String(2); addon.type = statement.getInt32(3); addon.version = statement.getUTF8String(4); addon.status = statement.getInt32(5); addon.summary = statement.getUTF8String(6); addon.description = statement.getUTF8String(7); addon.icon = statement.getUTF8String(8); addon.eula = statement.getUTF8String(9); addon.thumbnail = statement.getUTF8String(10); addon.learnmore = statement.getUTF8String(11); addon.author = statement.getUTF8String(12); addon.category = statement.getUTF8String(13); addon.dateAdded = new Date(statement.getInt32(14)*1000); addon.collectionsAddonsStorageID = statement.getInt32(15); addon.read = (statement.getInt32(16)==1?true:false); addon.compatibleApplications = this._openAddonCompatibleApplications(addon); addon.compatibleOS = this._openAddonCompatibleOS(addon); addon.installs = this._openAddonInstalls(addon); addon.comments = this._openAddonComments(addon); addon.authors = this._openAddonAuthors(addon); addons[addon.guid] = addon; } } finally { statement.reset(); } return addons; } Bandwagon.Factory.CollectionFactory.prototype._openAddonCompatibleApplications = function(addon) { var compatibleApplications = {}; var statement = this.connection.createStatement("SELECT * FROM addonCompatibleApplications WHERE addon = ?1"); try { statement.bindInt32Parameter(0, addon.storageID); while (statement.executeStep()) { var application = { name: statement.getUTF8String(1).toString().toUpperCase(), applicationId: statement.getInt32(2), minVersion: statement.getUTF8String(3), maxVersion: statement.getUTF8String(4), guid: statement.getUTF8String(5) }; compatibleApplications[application.name.toUpperCase()] = application; } } finally { statement.reset(); } return compatibleApplications; } Bandwagon.Factory.CollectionFactory.prototype._openAddonCompatibleOS = function(addon) { var compatibleOS = {}; var statement = this.connection.createStatement("SELECT * FROM addonCompatibleOS WHERE addon = ?1"); try { statement.bindInt32Parameter(0, addon.storageID); while (statement.executeStep()) { var os = statement.getUTF8String(1).toString().toUpperCase(); compatibleOS[os] = os; } } finally { statement.reset(); } return compatibleOS; } Bandwagon.Factory.CollectionFactory.prototype._openAddonInstalls = function(addon) { var installs = {}; var statement = this.connection.createStatement("SELECT * FROM addonInstalls WHERE addon = ?1"); try { statement.bindInt32Parameter(0, addon.storageID); while (statement.executeStep()) { var install = { url: statement.getUTF8String(1), hash: statement.getUTF8String(2), os: statement.getUTF8String(3).toString().toUpperCase() }; installs[install.os] = install; } } finally { statement.reset(); } return installs; } Bandwagon.Factory.CollectionFactory.prototype._openAddonComments = function(addon) { var comments = []; var statement = this.connection.createStatement("SELECT * FROM addonComments WHERE addon = ?1"); try { statement.bindInt32Parameter(0, addon.storageID); while (statement.executeStep()) { var comment = { comment: statement.getUTF8String(1), author: statement.getUTF8String(2) }; comments.push(comment); } } finally { statement.reset(); } return comments; } Bandwagon.Factory.CollectionFactory.prototype._openAddonAuthors = function(addon) { var authors = []; var statement = this.connection.createStatement("SELECT * FROM addonAuthors WHERE addon = ?1"); try { statement.bindInt32Parameter(0, addon.storageID); while (statement.executeStep()) { authors.push(statement.getUTF8String(1)); } } finally { statement.reset(); } return authors; } Bandwagon.Factory.CollectionFactory.prototype._commitAddon = function(collection, addon) { if (!this.connection) return; // addons // if guid already exists - just update the addon // if guid doesn't exist - insert var statement = this.connection.createStatement("SELECT id FROM addons where guid = ?1"); var addonStorageID = null; try { statement.bindUTF8StringParameter(0, addon.guid); while (statement.executeStep()) { addonStorageID = statement.getInt32(0); } } finally { statement.reset(); } var statement2 = this.connection.createStatement("REPLACE INTO addons VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15)"); try { if (addonStorageID != null) { // addon already exists (in another collection, or from previous commit of this collection) statement2.bindInt32Parameter(0, addonStorageID); } else if (addon.storageID != -1) { // addon doesn't already exist, but exists from a previous commit of this collection (?) statement2.bindInt32Parameter(0, addon.storageID); } else { // new addon statement2.bindNullParameter(0) } statement2.bindUTF8StringParameter(1, addon.guid); statement2.bindUTF8StringParameter(2, addon.name); statement2.bindInt32Parameter(3, addon.type); statement2.bindUTF8StringParameter(4, addon.version); statement2.bindInt32Parameter(5, addon.status); statement2.bindUTF8StringParameter(6, addon.summary); statement2.bindUTF8StringParameter(7, addon.description); statement2.bindUTF8StringParameter(8, addon.icon); statement2.bindUTF8StringParameter(9, addon.eula); statement2.bindUTF8StringParameter(10, addon.thumbnail); statement2.bindUTF8StringParameter(11, addon.learnmore); statement2.bindUTF8StringParameter(12, addon.author); statement2.bindUTF8StringParameter(13, addon.category); statement2.bindUTF8StringParameter(14, addon.dateAdded.getTime()/1000); statement2.execute(); } finally { statement2.reset(); } if (addon.storageID == -1 && addonStorageID == null) { addonStorageID = this.connection.lastInsertRowID; } // add the other addon bits for (var id in addon.compatibleApplications) { this._commitAddonCompatibleApplication(addonStorageID, addon.compatibleApplications[id]); } for (var id in addon.compatibleOS) { this._commitAddonCompatibleOS(addonStorageID, addon.compatibleOS[id]); } for (var id in addon.installs) { this._commitAddonInstall(addonStorageID, addon.installs[id]); } for (var i=0; i