Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/bandwagon/content/scripts/factory/feedFactory.js
diff options
context:
space:
mode:
authordave@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)
commit2e1d0b8a9e7ece43a90fdd3a5caf961ba5136a21 (patch)
tree75bdb284228304b063288f709dd66f19129c8cb3 /bandwagon/content/scripts/factory/feedFactory.js
parent750b6ed96d82753e916569da33af70580d8cd486 (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.js551
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();
+ }
}