diff options
author | dave@33eels.com <dave@33eels.com@4eb1ac78-321c-0410-a911-ec516a8615a5> | 2008-09-15 19:59:24 (GMT) |
---|---|---|
committer | dave@33eels.com <dave@33eels.com@4eb1ac78-321c-0410-a911-ec516a8615a5> | 2008-09-15 19:59:24 (GMT) |
commit | 2e1d0b8a9e7ece43a90fdd3a5caf961ba5136a21 (patch) | |
tree | 75bdb284228304b063288f709dd66f19129c8cb3 /bandwagon/content/scripts/factory/feedFactory.js | |
parent | 750b6ed96d82753e916569da33af70580d8cd486 (diff) |
Implemented feed factory storage methods.
Added firstrun handling.
Default feeds.
git-svn-id: http://svn.mozilla.org/addons/trunk@18254 4eb1ac78-321c-0410-a911-ec516a8615a5
Diffstat (limited to 'bandwagon/content/scripts/factory/feedFactory.js')
-rw-r--r-- | bandwagon/content/scripts/factory/feedFactory.js | 551 |
1 files changed, 545 insertions, 6 deletions
diff --git a/bandwagon/content/scripts/factory/feedFactory.js b/bandwagon/content/scripts/factory/feedFactory.js index 0f20741..946d509 100644 --- a/bandwagon/content/scripts/factory/feedFactory.js +++ b/bandwagon/content/scripts/factory/feedFactory.js @@ -36,36 +36,575 @@ Bandwagon.Factory.FeedFactory = function(connection) { + this.Bandwagon = Bandwagon; this.connection = connection; } Bandwagon.Factory.FeedFactory.prototype.newFeed = function() { - // TODO + return new this.Bandwagon.Model.Feed(); } Bandwagon.Factory.FeedFactory.prototype.openFeed = function(feed_id) { - // TODO + if (!this.connection) + return null; + + var feeds = {}; + + var statement = this.connection.createStatement("SELECT * FROM feeds where id = ?1"); + + try + { + statement.bindInt32Parameter(0, feed_id); + statement.execute(); + + var feed = this._openFeedFromRS(statement); + + if (!feed) + return null; + + feed.feedItems = this._openFeedItems(feed); + + feeds[feed.url] = feed; + } + finally + { + statement.reset(); + } + + return feed; } Bandwagon.Factory.FeedFactory.prototype.openFeeds = function() { - // TODO + if (!this.connection) + return null; + + var feeds = {}; + + var statement = this.connection.createStatement("SELECT * FROM feeds"); + + try + { + while (statement.executeStep()) + { + var feed = this._openFeedFromRS(statement); + + if (!feed) + continue; + + feed.feedItems = this._openFeedItems(feed); + + feeds[feed.url] = feed; + } + } + finally + { + statement.reset(); + } + + return feeds; } Bandwagon.Factory.FeedFactory.prototype.commitFeed = function(feed) { - // TODO + if (!this.connection) + return; + + var statement = this.connection.createStatement("REPLACE INTO feeds VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)"); + + try + { + (feed.id==-1?statement.bindNullParameter(0):statement.bindInt32Parameter(0, feed.id)); + statement.bindUTF8StringParameter(1, feed.url); + statement.bindUTF8StringParameter(2, feed.name); + statement.bindUTF8StringParameter(3, feed.description); + statement.bindInt32Parameter(4, feed.dateAdded.getTime()/1000); + (feed.dateLastCheck == null?statement.bindNullParameter(5):statement.bindInt32Parameter(5, feed.dateLastCheck.getTime()/1000)); + statement.bindInt32Parameter(6, feed.updateInterval); + statement.bindInt32Parameter(7, (feed.showNotifications?1:0)); + statement.bindInt32Parameter(8, (feed.autoPublish?1:0)); + statement.bindInt32Parameter(9, (feed.active?1:0)); + + statement.execute(); + } + finally + { + statement.reset(); + } + + if (feed.id == -1) + { + feed.id = this.connection.lastInsertRowID; + } + + for (var id in feed.feedItems) + { + this._commitFeedItem(feed, feed.feedItems[id]); + } + + return true; } Bandwagon.Factory.FeedFactory.prototype.commitFeeds = function(feeds) { - // TODO + for (var id in feeds) + { + this.commitFeed(feeds[id]); + } } Bandwagon.Factory.FeedFactory.prototype.deleteFeed = function(feed) { - // TODO + if (!this.connection) + return null; + + var statement1 = this.connection.createStatement("DELETE FROM feeds where id = ?1"); + var statement2 = this.connection.createStatement("DELETE FROM feedItems where feed = ?1"); + + try + { + // TODO transaction here? + + statement1.bindInt32Parameter(0, feed.id); + statement1.execute(); + + statement2.bindInt32Parameter(0, feed.id); + statement2.execute(); + } + finally + { + statement1.reset(); + statement2.reset(); + } + + return (statement2.lastError>0?false:true); +} + +// private methods + +Bandwagon.Factory.FeedFactory.prototype._openFeedFromRS = function(resultset) +{ + var feed = new this.Bandwagon.Model.Feed(); + feed.id = resultset.getInt32(0); + feed.url = resultset.getUTF8String(1); + feed.name = resultset.getUTF8String(2); + feed.description = resultset.getUTF8String(3); + feed.dateAdded = new Date(resultset.getInt32(4)*1000); + + if (!resultset.getIsNull(5)) + feed.dateLastCheck = new Date(resultset.getInt32(5)*1000); + + feed.updateInterval = resultset.getInt32(6); + feed.showNotifications = (resultset.getInt32(7)==1?true:false); + feed.autoPublish = (resultset.getInt32(8)==1?true:false); + + return feed; +} + +Bandwagon.Factory.FeedFactory.prototype._openFeedItems = function(feed) +{ + var feedItems = {}; + + var statement = this.connection.createStatement("SELECT addons.* FROM addons LEFT JOIN feedItems ON addons.id = feedItems.addon WHERE feedItems.feed = ?1"); + + try + { + statement.bindInt32Parameter(0, feed.id); + + while (statement.executeStep()) + { + var feedItem = new this.Bandwagon.Model.FeedItem(); + + feedItem.id = statement.getInt32(0); + feedItem.guid = statement.getUTF8String(1); + feedItem.name = statement.getUTF8String(2); + feedItem.type = statement.getInt32(3); + feedItem.version = statement.getUTF8String(4); + feedItem.status = statement.getInt32(5); + feedItem.summary = statement.getUTF8String(6); + feedItem.description = statement.getUTF8String(7); + feedItem.icon = statement.getUTF8String(8); + feedItem.eula = statement.getUTF8String(9); + feedItem.thumbnail = statement.getUTF8String(10); + feedItem.learnmore = statement.getUTF8String(11); + feedItem.author = statement.getUTF8String(12); + feedItem.category = statement.getUTF8String(13); + feedItem.dateAdded = new Date(statement.getInt32(14)*1000); + + feedItem.compatibleApplications = this._openFeedItemCompatibleApplications(feedItem); + feedItem.compatibleOS = this._openFeedItemCompatibleOS(feedItem); + feedItem.installs = this._openFeedItemInstalls(feedItem); + feedItem.comments = this._openFeedItemComments(feedItem); + + feedItems[feedItem.guid] = feedItem; + } + } + finally + { + statement.reset(); + } + + return feedItems; +} + +Bandwagon.Factory.FeedFactory.prototype._openFeedItemCompatibleApplications = function(feedItem) +{ + var compatibleApplications = {}; + + var statement = this.connection.createStatement("SELECT * FROM addonCompatibleApplications WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, feedItem.id); + + 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.FeedFactory.prototype._openFeedItemCompatibleOS = function(feedItem) +{ + var compatibleOS = {}; + + var statement = this.connection.createStatement("SELECT * FROM addonCompatibleOS WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, feedItem.id); + + while (statement.executeStep()) + { + var os = statement.getUTF8String(1).toString().toUpperCase(); + + compatibleOS[os] = os; + } + } + finally + { + statement.reset(); + } + + return compatibleOS; +} + +Bandwagon.Factory.FeedFactory.prototype._openFeedItemInstalls = function(feedItem) +{ + var installs = {}; + + var statement = this.connection.createStatement("SELECT * FROM addonInstalls WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, feedItem.id); + + 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.FeedFactory.prototype._openFeedItemComments = function(feedItem) +{ + var comments = []; + + var statement = this.connection.createStatement("SELECT * FROM addonComments WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, feedItem.id); + + while (statement.executeStep()) + { + var comment = + { + comment: statement.getUTF8String(1), + author: statement.getUTF8String(2) + }; + + comments.push(comment); + } + } + finally + { + statement.reset(); + } + + return comments; +} + +Bandwagon.Factory.FeedFactory.prototype._commitFeedItem = function(feed, feedItem) +{ + 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 addonid = null; + + try + { + statement.bindUTF8StringParameter(0, feedItem.guid); + + while (statement.executeStep()) + { + addonid = statement.getInt32(0); + } + } + finally + { + statement.reset(); + } + + statement = this.connection.createStatement("REPLACE INTO addons VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15)"); + + try + { + if (addonid != null) + { + // addon already exists (in another feed, or from previous commit of this feed) + statement.bindInt32Parameter(0, addonid); + } + else if (feedItem.id != -1) + { + // addon doesn't already exist, but exists from a previous commit of this feed (?) + statement.bindInt32Parameter(0, feedItem.id); + } + else + { + // new addon + statement.bindNullParameter(0) + } + + statement.bindUTF8StringParameter(1, feedItem.guid); + statement.bindUTF8StringParameter(2, feedItem.name); + statement.bindInt32Parameter(3, feedItem.type); + statement.bindUTF8StringParameter(4, feedItem.version); + statement.bindInt32Parameter(5, feedItem.status); + statement.bindUTF8StringParameter(6, feedItem.summary); + statement.bindUTF8StringParameter(7, feedItem.description); + statement.bindUTF8StringParameter(8, feedItem.icon); + statement.bindUTF8StringParameter(9, feedItem.eula); + statement.bindUTF8StringParameter(10, feedItem.thumbnail); + statement.bindUTF8StringParameter(11, feedItem.learnmore); + statement.bindUTF8StringParameter(12, feedItem.author); + statement.bindUTF8StringParameter(13, feedItem.category); + statement.bindUTF8StringParameter(14, feedItem.dateAdded.getTime()/1000); + + statement.execute(); + } + finally + { + statement.reset(); + } + + if (feedItem.id == -1 && addonid == null) + { + addonid = this.connection.lastInsertRowID; + } + + // add the other addon bits + + for (var id in feedItem.compatibleApplications) + { + this._commitAddonCompatibleApplication(addonid, feedItem.compatibleApplications[id]); + } + + for (var id in feedItem.compatibleOS) + { + this._commitAddonCompatibleOS(addonid, feedItem.compatibleOS[id]); + } + + for (var id in feedItem.installs) + { + this._commitAddonInstall(addonid, feedItem.installs[id]); + } + + for (var i=0; i<feedItem.comments.length; i++) + { + this._commitAddonComment(addonid, feedItem.comments[i]); + } + + // add the feedItem connector + + if (feedItem.id == -1) + { + statement = this.connection.createStatement("REPLACE INTO feedItems VALUES (?1, ?2, ?3)"); + + try + { + statement.bindNullParameter(0); + statement.bindInt32Parameter(1, feed.id); + statement.bindInt32Parameter(2, addonid); + + statement.execute(); + } + finally + { + statement.reset(); + } + + feedItem.id = this.connection.lastInsertRowID; + } + + return true; +} + +Bandwagon.Factory.FeedFactory.prototype._commitAddonCompatibleApplication = function(addonid, application) +{ + var statement = this.connection.createStatement("DELETE FROM addonCompatibleApplications WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.execute(); + } + finally + { + statement.reset(); + } + + statement = this.connection.createStatement("INSERT INTO addonCompatibleApplications VALUES (?1, ?2, ?3, ?4, ?5, ?6)"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.bindUTF8StringParameter(1, application.name); + statement.bindInt32Parameter(2, application.applicationId); + statement.bindUTF8StringParameter(3, application.minVersion); + statement.bindUTF8StringParameter(4, application.maxVersion); + statement.bindUTF8StringParameter(5, application.guid); + + statement.execute(); + } + finally + { + statement.reset(); + } +} + +Bandwagon.Factory.FeedFactory.prototype._commitAddonCompatibleOS = function(addonid, os) +{ + var statement = this.connection.createStatement("DELETE FROM addonCompatibleOS WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.execute(); + } + finally + { + statement.reset(); + } + + statement = this.connection.createStatement("INSERT INTO addonCompatibleOS VALUES (?1, ?2)"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.bindUTF8StringParameter(1, os); + + statement.execute(); + } + finally + { + statement.reset(); + } +} + +Bandwagon.Factory.FeedFactory.prototype._commitAddonInstall = function(addonid, install) +{ + var statement = this.connection.createStatement("DELETE FROM addonInstalls WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.execute(); + } + finally + { + statement.reset(); + } + + statement = this.connection.createStatement("INSERT INTO addonInstalls VALUES (?1, ?2, ?3, ?4)"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.bindUTF8StringParameter(1, install.url); + statement.bindUTF8StringParameter(2, install.hash); + statement.bindUTF8StringParameter(3, install.os); + + statement.execute(); + } + finally + { + statement.reset(); + } +} + +Bandwagon.Factory.FeedFactory.prototype._commitAddonComment = function(addonid, comment) +{ + var statement = this.connection.createStatement("DELETE FROM addonComments WHERE addon = ?1"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.execute(); + } + finally + { + statement.reset(); + } + + statement = this.connection.createStatement("INSERT INTO addonComments VALUES (?1, ?2, ?3)"); + + try + { + statement.bindInt32Parameter(0, addonid); + statement.bindUTF8StringParameter(1, comment.comment); + statement.bindUTF8StringParameter(2, comment.author); + + statement.execute(); + } + finally + { + statement.reset(); + } } |