diff options
Diffstat (limited to 'bandwagon/content/scripts/factory/collectionFactory.js')
-rw-r--r-- | bandwagon/content/scripts/factory/collectionFactory.js | 758 |
1 files changed, 758 insertions, 0 deletions
diff --git a/bandwagon/content/scripts/factory/collectionFactory.js b/bandwagon/content/scripts/factory/collectionFactory.js new file mode 100644 index 0000000..a6b59ac --- /dev/null +++ b/bandwagon/content/scripts/factory/collectionFactory.js @@ -0,0 +1,758 @@ +/* ***** 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<addon.comments.length; i++) + { + this._commitAddonComment(addonStorageID, addon.comments[i]); + } + + for (var id in addon.authors) + { + this._commitAddonAuthor(addonStorageID, addon.authors[id]); + } + + // add the addon connector + + var statement3 = this.connection.createStatement("REPLACE INTO collectionsAddons VALUES (?1, ?2, ?3, ?4)"); + + try + { + if (addon.collectionsAddonsStorageID == -1) + { + statement3.bindNullParameter(0); + } + else + { + statement3.bindInt32Parameter(0, addon.collectionsAddonsStorageID); + } + + statement3.bindInt32Parameter(1, collection.storageID); + statement3.bindInt32Parameter(2, addonStorageID); + statement3.bindInt32Parameter(3, (addon.read?1:0)); + + statement3.execute(); + } + finally + { + statement3.reset(); + } + + if (addon.collectionsAddonsStorageID == -1) + { + addon.collectionsAddonsStorageID = this.connection.lastInsertRowID; + } + + return true; +} + +Bandwagon.Factory.CollectionFactory.prototype._commitAddonCompatibleApplication = function(addonStorageID, application) +{ + var statement = this.connection.createStatement("DELETE FROM addonCompatibleApplications WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonStorageID); + statement.execute(); + } + finally + { + statement.reset(); + } + + var statement2 = this.connection.createStatement("INSERT INTO addonCompatibleApplications VALUES (?1, ?2, ?3, ?4, ?5, ?6)"); + + try + { + statement2.bindInt32Parameter(0, addonStorageID); + statement2.bindUTF8StringParameter(1, application.name); + statement2.bindInt32Parameter(2, application.applicationId); + statement2.bindUTF8StringParameter(3, application.minVersion); + statement2.bindUTF8StringParameter(4, application.maxVersion); + statement2.bindUTF8StringParameter(5, application.guid); + + statement2.execute(); + } + finally + { + statement2.reset(); + } +} + +Bandwagon.Factory.CollectionFactory.prototype._commitAddonCompatibleOS = function(addonStorageID, os) +{ + var statement = this.connection.createStatement("DELETE FROM addonCompatibleOS WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonStorageID); + statement.execute(); + } + finally + { + statement.reset(); + } + + var statement2 = this.connection.createStatement("INSERT INTO addonCompatibleOS VALUES (?1, ?2)"); + + try + { + statement2.bindInt32Parameter(0, addonStorageID); + statement2.bindUTF8StringParameter(1, os); + + statement2.execute(); + } + finally + { + statement2.reset(); + } +} + +Bandwagon.Factory.CollectionFactory.prototype._commitAddonInstall = function(addonStorageID, install) +{ + var statement = this.connection.createStatement("DELETE FROM addonInstalls WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonStorageID); + statement.execute(); + } + finally + { + statement.reset(); + } + + var statement2 = this.connection.createStatement("INSERT INTO addonInstalls VALUES (?1, ?2, ?3, ?4)"); + + try + { + statement2.bindInt32Parameter(0, addonStorageID); + statement2.bindUTF8StringParameter(1, install.url); + statement2.bindUTF8StringParameter(2, install.hash); + statement2.bindUTF8StringParameter(3, install.os); + + statement2.execute(); + } + finally + { + statement2.reset(); + } +} + +Bandwagon.Factory.CollectionFactory.prototype._commitAddonComment = function(addonStorageID, comment) +{ + var statement = this.connection.createStatement("DELETE FROM addonComments WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonStorageID); + statement.execute(); + } + finally + { + statement.reset(); + } + + var statement2 = this.connection.createStatement("INSERT INTO addonComments VALUES (?1, ?2, ?3)"); + + try + { + statement2.bindInt32Parameter(0, addonStorageID); + statement2.bindUTF8StringParameter(1, comment.comment); + statement2.bindUTF8StringParameter(2, comment.author); + + statement2.execute(); + } + finally + { + statement2.reset(); + } +} + +Bandwagon.Factory.CollectionFactory.prototype._commitAddonAuthor = function(addonStorageID, author) +{ + var statement = this.connection.createStatement("DELETE FROM addonAuthors WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonStorageID); + statement.execute(); + } + finally + { + statement.reset(); + } + + var statement2 = this.connection.createStatement("INSERT INTO addonAuthors VALUES (?1, ?2)"); + + try + { + statement2.bindInt32Parameter(0, addonStorageID); + statement2.bindUTF8StringParameter(1, author); + + statement2.execute(); + } + finally + { + statement2.reset(); + } +} + + |