aboutsummaryrefslogtreecommitdiff
path: root/cljssss-g.clj
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2009-02-19 21:23:27 +0100
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2009-02-19 21:23:27 +0100
commit179a03867f28b092527d84f6d9cd62ef04fd2fac (patch)
treea5aa3ce4231169bb5c04a7913cbe5794a4c107a0 /cljssss-g.clj
parent03a8ef22aa54073ba1b59252e594b8f37f90bc7e (diff)
Add function fetch-feed.
Diffstat (limited to 'cljssss-g.clj')
-rw-r--r--cljssss-g.clj102
1 files changed, 90 insertions, 12 deletions
diff --git a/cljssss-g.clj b/cljssss-g.clj
index 074e6ab..04977a9 100644
--- a/cljssss-g.clj
+++ b/cljssss-g.clj
@@ -2,7 +2,10 @@
(require [clojure.xml :as xml]
[clojure.contrib.sql :as sql]
compojure)
- (import (org.antlr.stringtemplate StringTemplateGroup))
+ (import (org.antlr.stringtemplate StringTemplateGroup)
+ (com.sun.syndication.io SyndFeedInput XmlReader)
+ (com.sun.syndication.feed.synd SyndFeed SyndEntry)
+ (java.net URL))
(use compojure))
(Class/forName "org.sqlite.JDBC")
@@ -18,28 +21,102 @@
(ANY "*"
(page-not-found)))
-(defmacro with-db [& body]
- `(sql/with-connection {:classname "org.sqlite.JDBC"
+(def db-connection-data {:classname "org.sqlite.JDBC"
:subprotocol "sqlite"
:subname "cljssss-g.sqlite3"
- :create true}
+ :create true})
+
+(defmacro with-db [& body]
+ `(sql/with-connection db-connection-data
+ ~@body))
+
+(defmacro with-dbt [& body]
+ `(with-db
(sql/transaction
~@body)))
+(defn fetch-feed [id]
+ (with-db
+ (sql/with-query-results [{uri :uri}]
+ ["SELECT uri FROM feed WHERE id = ?" id]
+ (let [feed #^SyndFeed (.build (new SyndFeedInput)
+ (new XmlReader (new URL uri)))]
+ (sql/transaction
+ (sql/update-or-insert-values :feed
+ ["id = ?" id]
+ {:id id
+ :uri uri
+ :language (.getLanguage feed)
+ :iri (.getURI feed)
+ :link (.getLink feed)
+ :rights (.trim (.getCopyright feed))
+ :title (.trim (.getTitle feed))
+ :subtitle (.trim (.getDescription feed))
+ :updated (.getPublishedDate feed)})
+ (doseq [entry #^SyndEntry (.getEntries feed)]
+ (sql/with-query-results [{potential-entry-id :id}]
+ ["SELECT id FROM entry WHERE iri = ?" (.getURI entry)]
+ (let [entry-id
+ (or potential-entry-id
+ (+ 1
+ (sql/with-query-results max-id
+ ["SELECT MAX(id) FROM entry"]
+ (or max-id -1))))]
+ (sql/update-or-insert-values :entry
+ ["id = ?" entry-id]
+ {:id entry-id
+ :language (.getLanguage entry)
+ :iri (.getURI entry)
+ :link (.getLink entry)
+ :rights (.trim (.getCopyright entry))
+ :title (.trim (.getTitle entry))
+ :summary_type (if (.getDescription entry)
+ (.getType (first (.getDescription entry)))
+ nil)
+ :summary (if (.getDescription entry)
+ (.getValue (first (.getDescription entry)))
+ nil)
+ :content_type (if (.getContents entry)
+ (.getType (first (.getContents entry)))
+ nil)
+ :content (if (.getContents entry)
+ (.getValue (first (.getContents entry)))
+ nil)
+ :updated (.getUpdatedDate entry)
+ :published (.getPublishedDate entry)})
+ (sql/update-or-insert-values :feed_entry_link
+ ["feed = ?, entry = ?" id entry-id]
+ {:feed id
+ :entry entry-id})))))))))
+
+
(run-server {:port 8080}
"/*" cljssss-g)
+;;;; Sample database content
+(comment
+ (with-dbt
+ (sql/update-or-insert-values :feed
+ ["id = ?" 0]
+ {:id 0
+ :uri "http://matthias.benkard.de/journal/feed/"})
+ (sql/update-or-insert-values :feed
+ ["id = ?" 1]
+ {:id 1
+ :uri "http://uxul.wordpress.com/feed/"})))
+
+
;;;; Database schema
(comment
- (with-db
+ (with-dbt
(sql/create-table :user
[:id "integer" "PRIMARY KEY"]
[:name "text"]
[:email "text"]
[:password "text"]))
- (with-db
+ (with-dbt
(sql/create-table :feed
[:id "integer" "PRIMARY KEY"]
[:uri "text"]
@@ -53,10 +130,10 @@
[:subtitle "text"]
[:updated "date"]))
- (with-db
+ (with-dbt
(sql/create-table :entry
[:id "integer" "PRIMARY KEY"]
- [:uri "text"]
+ [:uri "text"] ;?
[:language "text"]
[:content "blob"]
[:content_type "text"]
@@ -66,21 +143,22 @@
[:rights "text"]
[:source "integer"] ;:feed
[:title "text"]
- [:summary "text"]
+ [:summary "blob"]
+ [:summary_type "text"]
[:updated "date"]))
- (with-db
+ (with-dbt
(sql/create-table :feed_entry_link
[:feed "integer"]
[:entry "integer"]))
- (with-db
+ (with-dbt
(sql/create-table :user_feed_link ;subscription
[:user "integer"]
[:feed "integer"]
[:title "text"]))
- (with-db
+ (with-dbt
(sql/create-table :user_entry_link
[:user "integer"]
[:entry "integer"]