]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/site-watcher/db/db.factor
factor: trim using lists
[factor.git] / extra / site-watcher / db / db.factor
index 3527f57074632ba8ad13ae75dfd127b577f77dd2..120f64b3fbc8cc4966ed49deaefde0f49d230c96 100644 (file)
@@ -1,25 +1,22 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors continuations db db.sqlite db.tuples db.types
-io.directories io.files.temp kernel ;
+USING: accessors calendar combinators.smart db db.sqlite
+db.tuples db.types debugger io.files.temp io.streams.string
+kernel sequences ;
 IN: site-watcher.db
 
-: site-watcher-path ( -- path ) "site-watcher.db" temp-file ; inline
+TUPLE: account account-name email twitter sms ;
 
-[ site-watcher-path delete-file ] ignore-errors
-
-: with-sqlite-db ( quot -- )
-    site-watcher-path <sqlite-db> swap with-db ; inline
-
-TUPLE: account account-id email ;
-
-: <account> ( email -- account )
+: <account> ( account-name email -- account )
     account new
-        swap >>email ;
+        swap >>email
+        swap >>account-name ;
 
 account "ACCOUNT" {
-    { "account-id" "ACCOUNT_ID" +db-assigned-id+ }
+    { "account-name" "ACCOUNT_NAME" VARCHAR +user-assigned-id+ }
     { "email" "EMAIL" VARCHAR }
+    { "twitter" "TWITTER" VARCHAR }
+    { "sms" "SMS" VARCHAR }
 } define-persistent
 
 TUPLE: site site-id url up? changed? last-up error last-error ;
@@ -28,6 +25,12 @@ TUPLE: site site-id url up? changed? last-up error last-error ;
     site new
         swap >>url ;
 
+: site-with-url ( url -- site )
+    <site> select-tuple ;
+
+: site-with-id ( id -- site )
+    site new swap >>site-id select-tuple ;
+
 site "SITE" {
     { "site-id" "SITE_ID" INTEGER +db-assigned-id+ }
     { "url" "URL" VARCHAR }
@@ -38,14 +41,90 @@ site "SITE" {
     { "last-error" "LAST_ERROR" TIMESTAMP }
 } define-persistent
 
-TUPLE: watching-site account-id site-id ;
+TUPLE: watching-site account-name site-id ;
 
-: <watching-site> ( account-id site-id -- watching-site )
+: <watching-site> ( account-name site-id -- watching-site )
     watching-site new
         swap >>site-id
-        swap >>account-id ;
+        swap >>account-name ;
 
 watching-site "WATCHING_SITE" {
-    { "account-id" "ACCOUNT_ID" INTEGER +user-assigned-id+ }
+    { "account-name" "ACCOUNT_NAME" VARCHAR +user-assigned-id+ }
     { "site-id" "SITE_ID" INTEGER +user-assigned-id+ }
 } define-persistent
+
+TUPLE: spidering-site < watching-site max-depth max-count ;
+
+C: <spidering-site> spidering-site
+
+SLOT: site
+
+M: watching-site site>>
+    site-id>> site-with-id ;
+
+SLOT: account
+
+M: watching-site account>>
+    account-name>> account new swap >>account-name select-tuple ;
+
+spidering-site "SPIDERING_SITE" {
+    { "max-depth" "MAX_DEPTH" INTEGER }
+    { "max-count" "MAX_COUNT" INTEGER }
+} define-persistent
+
+: spidering-sites ( username -- sites )
+    spidering-site new swap >>account-name select-tuples ;
+
+: insert-site ( url -- site )
+    <site> dup select-tuple [ ] [ dup t >>up? insert-tuple ] ?if ;
+
+: select-account/site ( username url -- account site )
+    insert-site site-id>> ;
+
+: add-spidered-site ( username url -- )
+    select-account/site 10 10 <spidering-site> insert-tuple ;
+
+: remove-spidered-site ( username url -- )
+    select-account/site 10 10 <spidering-site> delete-tuples ;
+
+TUPLE: reporting-site site-id email url up? changed? last-up? error last-error ;
+
+: set-notify-site-watchers ( site new-up? -- site )
+    [ over up?>> = [ t >>changed? ] unless ] keep >>up? ;
+
+: site-good ( site -- )
+    t set-notify-site-watchers
+    now >>last-up
+    f >>error
+    f >>last-error
+    update-tuple ;
+
+: site-bad ( site error -- )
+    [ error. ] with-string-writer >>error
+    f set-notify-site-watchers
+    now >>last-error
+    update-tuple ;
+
+: sites-to-report ( -- seq )
+    "select users.email, site.url, site.up, site.changed, site.last_up, site.error, site.last_error from users, site, watching_site where users.username = watching_site.account_name and site.site_id = watching_site.site_id and site.changed = '1'" sql-query
+    [ [ reporting-site boa ] input<sequence ] map
+    "update site set changed = 0;" sql-command ;
+
+: insert-account ( account-name email -- ) <account> insert-tuple ;
+
+: find-sites ( -- seq ) f <site> select-tuples ;
+
+: watch-site ( username url -- )
+    select-account/site <watching-site> insert-tuple ;
+
+: unwatch-site ( username url -- )
+    select-account/site <watching-site> delete-tuples ;
+
+: watching-sites ( username -- sites )
+    f <watching-site> select-tuples
+    [ site-id>> site new swap >>site-id select-tuple ] map ;
+
+: site-watcher-path ( -- path ) "site-watcher.db" cache-file ; inline
+
+: with-site-watcher-db ( quot -- )
+    site-watcher-path <sqlite-db> swap with-db ; inline