1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors continuations db db.sqlite db.tuples db.types
4 io.directories io.files.temp kernel io.streams.string calendar
5 debugger combinators.smart sequences ;
8 TUPLE: account account-id account-name email ;
10 : <account> ( account-name -- account )
15 { "account-id" "ACCOUNT_ID" +db-assigned-id+ }
16 { "account-name" "ACCOUNT_NAME" VARCHAR }
17 { "email" "EMAIL" VARCHAR }
20 TUPLE: site site-id url up? changed? last-up error last-error ;
22 : <site> ( url -- site )
27 { "site-id" "SITE_ID" INTEGER +db-assigned-id+ }
28 { "url" "URL" VARCHAR }
29 { "up?" "UP" BOOLEAN }
30 { "changed?" "CHANGED" BOOLEAN }
31 { "last-up" "LAST_UP" TIMESTAMP }
32 { "error" "ERROR" VARCHAR }
33 { "last-error" "LAST_ERROR" TIMESTAMP }
36 TUPLE: watching-site account-id site-id ;
38 : <watching-site> ( account-id site-id -- watching-site )
43 watching-site "WATCHING_SITE" {
44 { "account-id" "ACCOUNT_ID" INTEGER +user-assigned-id+ }
45 { "site-id" "SITE_ID" INTEGER +user-assigned-id+ }
48 TUPLE: reporting-site email url up? changed? last-up? error last-error ;
52 : set-notify-site-watchers ( site new-up? -- site )
53 [ over up?>> = [ t >>changed? ] unless ] keep >>up? ;
55 : site-good ( site -- )
56 t set-notify-site-watchers
62 : site-bad ( site error -- )
63 [ error. ] with-string-writer >>error
64 f set-notify-site-watchers
68 : sites-to-report ( -- seq )
69 "select account.email, site.url, site.up, site.changed, site.last_up, site.error, site.last_error from account, site, watching_site where account.account_id = watching_site.account_id and site.site_id = watching_site.site_id and site.changed = '1'" sql-query
70 [ [ reporting-site boa ] input<sequence ] map
71 "update site set changed = 'f';" sql-command ;
73 : insert-site ( url -- site )
74 <site> dup select-tuple [
75 dup t >>up? insert-tuple
78 : insert-account ( account-name -- ) <account> insert-tuple ;
80 : find-sites ( -- seq ) f <site> select-tuples ;
82 : select-account/site ( email url -- account site )
83 [ <account> select-tuple account-id>> ]
84 [ insert-site site-id>> ] bi* ;
88 : watch-site ( email url -- )
89 select-account/site <watching-site> insert-tuple ;
91 : unwatch-site ( email url -- )
92 select-account/site <watching-site> delete-tuples ;