file-storage-rss-procs.tcl
Does not contain a contract.
- Location:
- /packages/file-storage/tcl/file-storage-rss-procs.tcl
Related Files
- packages/file-storage/tcl/file-storage-rss-procs.xql
- packages/file-storage/tcl/file-storage-rss-procs.tcl
- packages/file-storage/tcl/file-storage-rss-procs-postgresql.xql
- packages/file-storage/tcl/file-storage-rss-procs-oracle.xql
[ hide source ] | [ make this the default ]
File Contents
namespace eval fs::rss {} ad_proc -private fs::rss::create_rss_gen_subscr_impl {} { Register the service contract implementation and return the impl_id @return impl_id of the created implementation } { return [acs_sc::impl::new_from_spec -spec { contract_name "RssGenerationSubscriber" name "fs_rss" owner "file-storage" aliases { datasource fs::rss::datasource lastUpdated fs::rss::lastUpdated } }] } ad_proc -private fs::rss::drop_rss_gen_subscr_impl {} { Unegister the service contract implementation and return the impl_id @return impl_id of the created implementation } { acs_sc::impl::delete -contract_name RssGenerationSubscriber -impl_name fs_rss } d_proc -private fs::rss::datasource { summary_context_id } { This procedure implements the "datasource" operation of the RssGenerationSubscriber service contract. Important: in this implementation, the summary_context_id is equal to the subscription_id, which we use to key into the fs_rss_subscrs table to find the folder_id. @author Andrew Grumet (aegrumet@alum.mit.edu) } { db_1row select_subscription {} set system_name [ad_system_name] set column_array(channel_title) $feed_title set column_array(channel_description) "Recent additions to the \"$folder_title\" folder on $system_name" set column_array(version) 2.0 set folder_info [fs::get_folder_package_and_root $folder_id] set package_id [lindex $folder_info 0] set root_folder_id [lindex $folder_info 1] set base_url [site_node::get_url_from_object_id -object_id $package_id] set ad_url [ad_url] set folder_url "${ad_url}${base_url}?folder_id=$folder_id" set column_array(channel_link) $folder_url set image_url "/resources/dotlrn/logo-user.gif" if { $image_url eq "" } { set column_array(image) "" } else { set column_array(image) [list \ url "${ad_url}$image_url" \ title $folder_title \ link $folder_url \ width "133" \ height "36"] } # We need this for enclosure URLs, which should end with an # actual filename so they can be downloaded cleanly. # # It looks like item::get_url returns unencoded folder paths. # But folder names can contain spaces, so we'll urlencode just in case. set pretty_folder_url "${ad_url}${base_url}" if { $folder_id != $root_folder_id } { set url_stub [content::item::get_virtual_path -root_folder_id $root_folder_id -item_id $folder_id] set stub_parts [split $url_stub /] set enc_url_stub_list [list] foreach part $stub_parts { lappend enc_url_stub_list [ns_urlencode $part] } set enc_url_stub [join $enc_url_stub_list /] append pretty_folder_url ${enc_url_stub}/ } set items [list] set counter 0 if {$descend_p == "f"} { set parent_clause "parent_id = :folder_id" } else { set parent_clause [db_map descend_parent_clause] } if {$include_revisions_p == "f"} { set revisions_clause "r.revision_id = o.live_revision" } else { set revisions_clause "r.item_id = o.object_id" } db_foreach select_files [subst -nocommands { select * from ( select o.object_id as item_id, o.title, o.name, o.file_upload_name, o.type, o.content_size, to_char(r.publish_date,'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi, r.description, r.revision_id from fs_objects o, cr_revisions r where $parent_clause and type != 'folder' and $revisions_clause order by last_modified desc ) as v fetch first :max_items rows only }] { set link "${ad_url}${base_url}file?file_id=$item_id&version_id=$revision_id" set content "content" set description $description if {$include_revisions_p == "t"} { append description "<br><br><b>Note:</b> This may be a new revision of an existing file." } # Always convert timestamp to GMT set publish_date_ansi [lc_time_tz_convert -from [lang::system::timezone] -to "Etc/GMT" -time_value $publish_date_ansi] set publish_timestamp "[clock format [clock scan $publish_date_ansi] -format "%a, %d %b %Y %H:%M:%S"] GMT" set iteminfo [list \ link $link \ title $title \ description $description \ timestamp $publish_timestamp ] if { $enclosure_match_patterns ne "" } { foreach pattern $enclosure_match_patterns { if { [string match $pattern $title] } { lappend iteminfo \ enclosure_url "${pretty_folder_url}$file_upload_name" \ enclosure_type $type \ enclosure_length $content_size break } } } lappend items $iteminfo if { $counter == 0 } { set column_array(channel_lastBuildDate) $publish_timestamp incr counter } } set column_array(items) $items set column_array(channel_language) "" set column_array(channel_copyright) "" set column_array(channel_managingEditor) "" set column_array(channel_webMaster) "" set column_array(channel_rating) "" set column_array(channel_skipDays) "" set column_array(channel_skipHours) "" return [array get column_array] } d_proc -private fs::rss::lastUpdated { summary_context_id } { Returns the time that the last file was modified, in Unix time. Returns 0 otherwise. @author Andrew Grumet (aegrumet@alum.mit.edu) } { #result differs on whether we're including revisions db_1row select_last_updated { select (max(last_modified)-to_date('1970-01-01','YYYY-MM-DD'))*60*60*24 as last_update from fs_rss_subscrs s, fs_objects f where s.subscr_id = :summary_context_id and f.parent_id = s.folder_id and f.type != 'folder' } return $last_update } d_proc -private fs::rss::build_feeds { folder_id } { Builds all rss feeds for a folder. @author Andrew Grumet (aegrumet@alum.mit.edu) } { #Don't use nested db_ calls because then fs::rss::datasource will #not see the results of in-progress transactions. set subscr_id_list [db_list select_subscrs {}] foreach subscr_id $subscr_id_list { rss_gen_report $subscr_id } } # Local variables: # mode: tcl # tcl-indent-level: 4 # indent-tabs-mode: nil # End: