Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-oracle.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-oracle.xql	29 Jun 2001 20:33:23 -0000	1.1
@@ -0,0 +1,495 @@
+<?xml version="1.0"?>
+
+<queryset>
+   <rdbms><type>oracle</type><version>8.1.6</version></rdbms>
+
+<fullquery name="bboard_forum_p.bboard_forum_p">      
+      <querytext>
+      
+        begin
+            :1 := bboard_forum.forum_p(:forum_id);
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_new.create_forum">      
+      <querytext>
+      
+        begin
+            :1 := bboard_forum.new (
+                forum_id => :forum_id,
+                short_name => :short_name,
+                charter => :charter,
+                moderated_p => :moderated_p,
+                bboard_id => :bboard_id,
+                context_id => :context_id,
+                creation_user => :creation_user,
+                creation_ip => :creation_ip
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_set.update_forum">      
+      <querytext>
+      
+        begin
+            bboard_forum.set_attrs (
+                forum_id => :forum_id,
+                short_name => :short_name,
+                charter => :charter,
+                moderated_p => :moderated_p,
+                bboard_id => :bboard_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_p.bboard_category_p">      
+      <querytext>
+      
+        begin
+            :1 := bboard_category.category_p(:category_id);
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_new.create_category">      
+      <querytext>
+      
+	begin
+	    :1 := bboard_category.new (
+	        category_id => :category_id,
+	        short_name => :short_name,
+	        description => :description,
+	        forum_id => :forum_id
+	    );
+	end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_set.update_category">      
+      <querytext>
+      
+        begin
+            bboard_category.set_attrs (
+                category_id => :category_id,
+                short_name => :short_name,
+                description => :description,
+                forum_id => :forum_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_new.message_new">      
+      <querytext>
+      
+        begin
+            :1 := bboard_message.new (
+                message_id => :message_id,
+                reply_to => :reply_to,
+                sent_date => :sent_date,
+                sender => :sender,
+                title => :title,
+                mime_type => :mime_type,
+                data => empty_blob(),
+                context_id => :context_id,
+                creation_user => :creation_user,
+                creation_ip => :creation_ip
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_new.message_new_set_blob">      
+      <querytext>
+      
+        update cr_revisions
+            set content = empty_blob()
+            where revision_id = :revision_id
+        returning content into :1
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set.message_set_attr">      
+      <querytext>
+      
+        begin
+            bboard_message.set_attrs (
+                message_id => :message_id,
+                reply_to => :reply_to,
+                sent_date => :sent_date,
+                sender => :sender,
+                title => :title,
+                mime_type => :mime_type,
+                context_id => :context_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set.message_set_content">      
+      <querytext>
+      
+        update cr_revisions
+            set content = empty_blob()
+            where revision_id = :revision_id
+        returning content into :1
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_clear_categories.bboard_message_clear_categories">      
+      <querytext>
+      
+        begin
+            bboard_message.clear_categories ( :message_id );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_add_category.bboard_message_add_category">      
+      <querytext>
+      
+        begin
+            bboard_message.add_category (
+                message_id => :message_id,
+                category_id => :category_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_remove_category.bboard_message_remove_category">      
+      <querytext>
+      
+        begin
+            bboard_message.remove_category (
+                message_id => :message_id,
+                category_id => :category_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set_status.bboard_message_set_status">      
+      <querytext>
+      
+        begin
+            bboard_message.set_status (
+                message_id => :message_id,
+                forum_id => :forum_id,
+                status => :status
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_forum.forum_subscribe">      
+      <querytext>
+      
+        begin
+            bboard_forum.subscribe (
+                forum_id => :forum_id,
+                subscriber_id => :subscriber_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_category.category_subscribe">      
+      <querytext>
+      
+        begin
+            bboard_category.subscribe (
+                category_id => :category_id,
+                subscriber_id => :subscriber_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_thread.thread_subscribe">      
+      <querytext>
+      
+        begin
+            bboard_message.subscribe (
+                thread_id => :thread_id,
+                subscriber_id => :subscriber_id
+            );
+        end;
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_subscribed_p.check_message_subscribed">      
+      <querytext>
+      
+	select count(*) as subscribed_p from bboard_thread_subscribers
+	where subscriber_id = :user_id
+	      and thread_id in (select message_id
+	                        from acs_messages b
+	                        connect by b.message_id = prior b.reply_to 
+	                        start with message_id = :message_id)
+
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_forum.bboard_forum_containing_message">      
+      <querytext>
+      
+	select bboard_forum.forum_containing_message(:message_id) as forum_id
+	  from dual
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_url.first_ancestor">      
+      <querytext>
+      
+	select acs_message.first_ancestor(:message_id) as ancestor_id 
+            from dual
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.insert_image">      
+      <querytext>
+      
+             begin
+                :1 := acs_message.new_image (
+                    message_id     => :message_id,
+                    image_id       => :file_id,
+                    file_name      => :short_filename,
+                    title          => :title,
+                    mime_type      => :mime_type,
+                    content        => empty_blob(),
+                    width          => :width,
+                    height         => :height,
+                    creation_user  => :user_id,
+                    creation_ip    => :creation_ip,
+                    is_live        => 't'
+            );
+            end;
+        
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.get_revision">      
+      <querytext>
+      
+        select content_item.get_latest_revision(:file_id) as revision_id
+        from dual
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.set_content">      
+      <querytext>
+      
+    update cr_revisions
+        set content = empty_blob()
+        where revision_id = :revision_id
+        returning content into :1
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_file.insert_file">      
+      <querytext>
+      
+            begin
+                :1 := acs_message.new_file (
+                    message_id     => :message_id,
+                    file_id        => :file_id,
+                    file_name      => :short_filename,
+                    title          => :title,
+                    mime_type      => :mime_type,
+                    content        => empty_blob(),
+                    creation_user  => :user_id,
+                    creation_ip    => :creation_ip,
+                    is_live        => 't'
+            );
+            end;
+        
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.get_revision">      
+      <querytext>
+      
+        select content_item.get_latest_revision(:file_id) as revision_id
+        from dual
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.set_content">      
+      <querytext>
+      
+    update cr_revisions
+        set content = empty_blob()
+        where revision_id = :revision_id
+        returning content into :1
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.is_file_image">      
+      <querytext>
+      
+	select image_id
+            from images
+            where image_id = content_item.get_latest_revision(:file_id)
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.delete_image">      
+      <querytext>
+      
+	    begin
+	        acs_message.delete_image(:file_id);
+	    end;
+	
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.delete_file">      
+      <querytext>
+      
+	    begin
+   	        acs_message.delete_file(:file_id);
+	    end;
+	
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_garbage_collect.clear_revision_references">      
+      <querytext>
+
+update cr_items 
+   set latest_revision=null, live_revision=null
+ where item_id = -1;
+
+      </querytext>
+</fullquery>
+
+<fullquery name="bboard_garbage_collect.bboard_alert_clean">      
+      <querytext>
+      
+	declare
+	    cursor alerts_cursor is
+ 
+ 	    select object_id
+ 	         from acs_objects
+ 	         where object_id in (select object_id
+                                       from acs_objects
+                                      where object_type = 'acs_message'
+                  	              start with context_id in (select forum_id
+                                                                  from bboard_forums)
+ 	                              connect by prior object_id = context_id)
+ 	               and object_id not in (select message_id
+ 	                                       from bboard_forum_message_map)
+             order by object_id desc;
+	begin
+  	    for alert_val in alerts_cursor loop
+	        bboard_message.remove(alert_val.object_id);
+	    end loop;
+	end;
+    
+      </querytext>
+</fullquery>
+
+<partialquery name="bboard_schedule_sends.subscribers">      
+  <querytext>
+        select subscriber_id as recipient_id, thread_id as grouping_id,
+               sysdate as wait_until
+          from bboard_thread_subscribers s
+          where s.thread_id in (select message_id 
+                                  from acs_messages
+                                 start with message_id = :message_id
+                               connect by message_id = prior reply_to)
+            and s.subscriber_id in (select party_id 
+                                      from acs_object_party_privilege_map 
+                                     where object_id = :message_id 
+                                       and privilege = 'bboard_read_message')
+  </querytext>
+</partialquery>
+ 
+<partialquery name="bboard_schedule_sends.category_subscribers">      
+  <querytext>
+	select s.subscriber_id as recipient_id, s.category_id as grouping_id,
+	       sysdate as wait_until
+	  from bboard_category_subscribers s, bboard_category_message_map m
+	  where m.message_id = :message_id
+	    and s.category_id = m.category_id
+            and s.subscriber_id in (select party_id 
+                                      from acs_object_party_privilege_map 
+                                     where object_id = :message_id 
+                                       and privilege = 'bboard_read_message')
+  </querytext>
+</partialquery>
+
+
+<partialquery name="bboard_schedule_sends.forum_subscribers">      
+  <querytext>
+        select s.subscriber_id as recipient_id, s.forum_id as grouping_id,
+               sysdate as wait_until
+            from bboard_forum_subscribers s, bboard_forum_message_map m
+            where m.message_id = :message_id
+              and s.forum_id = m.forum_id
+              and s.subscriber_id in (select party_id 
+                                        from acs_object_party_privilege_map 
+                                       where object_id = :message_id 
+                                         and privilege = 'bboard_read_message')
+  </querytext>
+</partialquery>
+</queryset>
+
Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql	29 Jun 2001 20:33:23 -0000	1.1
@@ -0,0 +1,461 @@
+<?xml version="1.0"?>
+
+<queryset>
+   <rdbms><type>postgresql</type><version>7.1</version></rdbms>
+
+<fullquery name="bboard_forum_p.bboard_forum_p">      
+      <querytext>
+            select bboard_forum__forum_p(:forum_id);
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_new.create_forum">      
+      <querytext>
+            select bboard_forum__new (
+                :forum_id,
+                :short_name,
+                :charter,
+                :moderated_p,
+                :bboard_id,
+                :context_id,
+                now(),
+                :creation_user,
+                :creation_ip,
+                'bboard_forum'
+            );
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_set.update_forum">      
+      <querytext>
+         select bboard_forum__set_attrs (
+                :forum_id,
+                :short_name,
+                :charter,
+                :moderated_p,
+                :bboard_id
+            );
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_p.bboard_category_p">      
+      <querytext>
+        select bboard_category__category_p(:category_id);
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_new.create_category">      
+      <querytext>
+	    select bboard_category__new (
+	        :category_id,
+	        :short_name,
+	        :description,
+	        :forum_id,
+                null,
+                now(),
+                null,
+                null,
+                'bboard_category'
+	    );
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_set.update_category">      
+      <querytext>
+            select bboard_category__set_attrs (
+                :category_id,
+                :short_name,
+                :description,
+                :forum_id
+            );
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_new.message_new">      
+      <querytext>
+            select bboard_message__new (
+                :message_id,
+                :reply_to,
+                :sent_date,
+                :sender,
+                null,          -- rfc822_id
+                :title,
+                :mime_type,
+                null,          -- text
+	        null,          -- data
+                :context_id,
+                now(),
+                :creation_user,
+                :creation_ip,
+                'acs_message'
+            );
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_new.message_new_set_blob">      
+      <querytext>
+
+        update cr_revisions
+            set content = :content
+            where revision_id = :revision_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set.message_set_attr">      
+      <querytext>
+
+          select bboard_message__set_attrs (
+                :message_id,
+                :reply_to,
+                :sent_date,
+                :sender,
+                :title,
+                :mime_type,
+                :context_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set.message_set_content">      
+      <querytext>
+
+        update cr_revisions
+            set content = :content
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_clear_categories.bboard_message_clear_categories">      
+      <querytext>
+
+          select bboard_message__clear_categories ( :message_id );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_add_category.bboard_message_add_category">      
+      <querytext>
+
+        select bboard_message__add_category (
+                :message_id,
+                :category_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_remove_category.bboard_message_remove_category">      
+      <querytext>
+
+            select bboard_message__remove_category (
+                :message_id,
+                :category_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set_status.bboard_message_set_status">      
+      <querytext>
+
+            select bboard_message__set_status (
+                :message_id,
+                :forum_id,
+                :status
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_forum.forum_subscribe">      
+      <querytext>
+
+            select bboard_forum__subscribe (
+                :forum_id,
+                :subscriber_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_category.category_subscribe">      
+      <querytext>
+
+            select bboard_category__subscribe (
+                :category_id,
+                :subscriber_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_subscribe_thread.thread_subscribe">      
+      <querytext>
+
+            select bboard_message__subscribe (
+                :thread_id,
+                :subscriber_id
+            );
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_subscribed_p.check_message_subscribed">      
+      <querytext>
+
+	select count(*) as subscribed_p from bboard_thread_subscribers
+	 where subscriber_id = :user_id
+	   and thread_id in 
+               (select message_id 
+                  from acs_messages b
+                 where tree_sortkey like
+                       (select tree_sortkey 
+                          from acs_messages
+                         where message_id = :message_id) || '%')
+
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_forum.bboard_forum_containing_message">      
+      <querytext>
+      
+	select bboard_forum__forum_containing_message(:message_id) as forum_id
+	  
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_url.first_ancestor">      
+      <querytext>
+      
+	select acs_message__first_ancestor(:message_id) as ancestor_id 
+            
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.insert_image">      
+      <querytext>
+
+                select acs_message__new_image (
+                    :message_id,
+                    :file_id,
+                    :short_filename,
+                    :title,
+                    null,       -- description
+                    :mime_type,
+                    null,       -- content
+                    :width,
+                    :height,
+                    now(),
+                    :user_id,
+                    :creation_ip,
+                    't'         -- is_live
+                );
+        
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.get_revision">      
+      <querytext>
+      
+        select content_item__get_latest_revision(:file_id) as revision_id
+        
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.set_content">      
+      <querytext>
+
+    update cr_revisions
+        set content = :content
+        where revision_id = :revision_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_file.insert_file">      
+      <querytext>
+                select acs_message__new_file (
+                    :message_id,
+                    :file_id,
+                    :short_filename,
+                    :title,
+                    null,           -- description
+                    :mime_type,
+                    null,           -- content
+                    now(),
+                    :user_id,
+                    :creation_ip,
+                    't'             -- is_live
+                );
+        
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.get_revision">      
+      <querytext>
+      
+        select content_item__get_latest_revision(:file_id) as revision_id
+        
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_attach_image.set_content">      
+      <querytext>
+
+    update cr_revisions
+        set content = :content
+        where revision_id = :revision_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.is_file_image">      
+      <querytext>
+      
+	select image_id
+            from images
+            where image_id = content_item__get_latest_revision(:file_id)
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.delete_image">      
+      <querytext>
+
+	    select acs_message__delete_image(:file_id);
+	
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_delete_attachment.delete_file">      
+      <querytext>
+
+   	    select acs_message__delete_file(:file_id);
+	
+      </querytext>
+</fullquery>
+
+ 
+ 
+<fullquery name="bboard_garbage_collect.clear_revision_references">      
+      <querytext>
+
+update cr_items
+   set latest_revision=null, live_revision=null
+ where item_id in 
+       (select object_id as message_id
+          from acs_objects
+         where object_type = 'acs_message'
+           and object_id not in (select message_id 
+                                 from bboard_forum_message_map));
+    
+      </querytext>
+</fullquery>
+
+<fullquery name="bboard_garbage_collect.bboard_alert_clean">      
+      <querytext>
+
+declare
+    message_rec record;
+begin
+    for message_rec in
+        select object_id as message_id
+          from acs_objects
+         where object_type = 'acs_message'
+           and object_id not in (select message_id 
+                                   from bboard_forum_message_map)
+    loop
+        perform bboard_message__remove(message_rec.message_id);
+    end loop;
+
+    return 0;
+end;
+    
+      </querytext>
+</fullquery>
+
+
+<partialquery name="bboard_schedule_sends.thread_subscribers">      
+  <querytext>
+        select subscriber_id as recipient_id, thread_id as grouping_id,
+               now() as wait_until
+          from bboard_thread_subscribers s
+         where s.thread_id in 
+               (select message_id from acs_messages
+                 where tree_sortkey like 
+                       (select substring(tree_sortkey from 0 for 4) || '%'
+                          from acs_messages
+                         where message_id = :message_id))
+           and s.subscriber_id in (select party_id 
+                                     from acs_object_party_privilege_map 
+                                    where object_id = :message_id 
+                                      and privilege = 'bboard_read_message')
+
+  </querytext>
+</partialquery>
+ 
+<partialquery name="bboard_schedule_sends.category_subscribers">      
+  <querytext>
+  
+	select s.subscriber_id as recipient_id, s.category_id as grouping_id,
+	       now() as wait_until
+	  from bboard_category_subscribers s, bboard_category_message_map m
+	  where m.message_id = :message_id
+	    and s.category_id = m.category_id
+            and s.subscriber_id in (select party_id 
+                                      from acs_object_party_privilege_map 
+                                     where object_id = :message_id 
+                                       and privilege = 'bboard_read_message')
+  </querytext>
+</partialquery>
+
+
+<partialquery name="bboard_schedule_sends.forum_subscribers">      
+  <querytext>
+        select s.subscriber_id as recipient_id, s.forum_id as grouping_id,
+               now() as wait_until
+            from bboard_forum_subscribers s, bboard_forum_message_map m
+            where m.message_id = :message_id
+              and s.forum_id = m.forum_id
+              and s.subscriber_id in (select party_id 
+                                        from acs_object_party_privilege_map 
+                                       where object_id = :message_id 
+                                         and privilege = 'bboard_read_message')
+  </querytext>
+</partialquery>
+
+</queryset>
Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.tcl	20 Apr 2001 20:51:09 -0000	1.1
+++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.tcl	29 Jun 2001 20:33:23 -0000	1.2
@@ -365,32 +365,19 @@
     }
 
     # Thread based sends
-    acs_messaging_send_query -message_id $email_message_id -query {
-        select subscriber_id as recipient_id, thread_id as grouping_id,
-               sysdate as wait_until
-          from bboard_thread_subscribers s
-          where s.thread_id in (select message_id from acs_messages
-                                    start with message_id = :message_id
-                                    connect by message_id = prior reply_to)
-    } -bind [list message_id $message_id]
+    acs_messaging_send_query -message_id $email_message_id \
+	    -query [db_map thread_subscribers] \
+            -bind [list message_id $message_id]
 
     # Category based sends
-    acs_messaging_send_query -message_id $email_message_id -query {
-	select s.subscriber_id as recipient_id, s.category_id as grouping_id,
-	       sysdate as wait_until
-	  from bboard_category_subscribers s, bboard_category_message_map m
-	  where m.message_id = :message_id
-	    and s.category_id = m.category_id
-    } -bind [list message_id $message_id]
+    acs_messaging_send_query -message_id $email_message_id \
+	    -query [db_map category_subscribers] \
+	    -bind [list message_id $message_id]
 
     # Forum based sends
-    acs_messaging_send_query -message_id $email_message_id -query {
-        select s.subscriber_id as recipient_id, s.forum_id as grouping_id,
-               sysdate as wait_until
-            from bboard_forum_subscribers s, bboard_forum_message_map m
-            where m.message_id = :message_id
-                and s.forum_id = m.forum_id
-    } -bind [list message_id $message_id]
+    acs_messaging_send_query -message_id $email_message_id \
+	    -query [db_map forum_subscribers] \
+	    -bind [list message_id $message_id]
 }
 
 ad_proc -public bboard_subscribe_forum {
@@ -637,6 +624,7 @@
 
 ad_proc -public bboard_message_url {
     {-absolute:boolean}
+    {-top:boolean}
     {message_id}
     {forum_id ""}
 } {
@@ -651,9 +639,13 @@
     # This is a workaround to a bug in acs-messaging-procs/first_ancestor
     # that won't be deployed until after this next bboard release -akk
 
-    db_1row first_ancestor {
-	select acs_message.first_ancestor(:message_id) as ancestor_id 
-            from dual
+    if {! $top_p} {
+        db_1row first_ancestor {
+	    select acs_message.first_ancestor(:message_id) as ancestor_id 
+                from dual
+        }
+    } else {
+        set ancestor_id $message_id
     }
 
     if { $message_id == $ancestor_id } {
@@ -681,6 +673,12 @@
     return "$prefix[bboard_message_page]?message_id=$message_id&forum_id=$forum_id$anchor"
 }
 
+ad_proc -public bboard_subscriptions_url {} {
+    Returns URL for managing bboard subscriptions.
+} {
+    return "[ad_conn location][ad_conn package_url]subscriptions"
+}
+
 # if i were cool, i'd implement an Omega(log n) solution for this
 # i am not however, cool
 
@@ -921,7 +919,7 @@
 	set result [ad_html_to_text $content]
     } else {
 	set result "Error display bboard posting as email!
-Out bboard system has received a post we don't know how to 
+Our bboard system has received a post we don't know how to 
 send via email.  Please go to the below URL for a better shot 
 at displaying."
     }
@@ -931,7 +929,9 @@
     set footer "--------------------
 This is a posting from the $forum_name bboard.
 To reply you can go to:
-[bboard_message_url -absolute $message_id $forum_id]"
+[bboard_message_url -absolute $message_id $forum_id]
+To unsubscribe from this or other bboard posts go to:
+[bboard_subscriptions_url]"
 
     return "${header}
 
@@ -967,7 +967,7 @@
     }
 
     set email_mesg_id [bboard_message_new -sender $user_id \
-                         -title "$forum_name - $title" \
+                         -title "$title \[$forum_name\]" \
                          -mime_type "text/plain" \
                          -content [bboard_alert_message -mime_type $mime_type \
                                        -content $content \
@@ -983,28 +983,46 @@
 
 ad_proc -private bboard_garbage_collect {
 } {
+    garbage collects deleted messages, message email artifacts, etc.,
 
+    In particular, this deletes message objects that aren't currently
+    in a forum, but that are children of bboard messages or bboard forums.
+
 } {
     acs_messaging_process_queue
-    db_dml bboard_alert_clean {
-	declare
-	    cursor alerts_cursor is
-                select object_id 
-	            from acs_objects
-	            where object_type = 'acs_message'
-                        and object_id not in (select message_id
-                                                 from bboard_forum_message_map)
-                        and (context_id in (select message_id
-                                              from bboard_forum_message_map)
-                             or 
-                               context_id in (select object_id
-                                                from acs_objects
-                                                where object_type = 
-                                                      'bboard_forum'));
-	begin
-  	    for alert_val in alerts_cursor loop
-	        acs_message.delete(alert_val.object_id);
-	    end loop;
-	end;
+
+    if {[db_type] == "postgresql"} {
+	bboard_garbage_collect_postgresql
+    } else {
+	db_exec_plsql bboard_alert_clean ""
     }
+}
+
+ad_proc -private bboard_garbage_collect_postgresql {} {
+    Works around postgresql bugs that make it impossible
+    to delete multiple items in a single transaction
+
+    WARNING The Postgres version of these queries
+    assume that acs-messaging is only used by bboard,
+    and will delete entries made by any other package.
+    If this poses a problem, revisit the oracle queries
+    and port the CONNECT BY query faithfully.
+} {
+    db_foreach get_orphans {
+        select object_id as message_id
+          from acs_objects
+         where object_type = 'acs_message'
+           and object_id not in (select message_id 
+                                 from bboard_forum_message_map)
+    } {
+	db_dml clear_revision_references {
+	    update cr_items
+               set latest_revision=null, live_revision=null
+             where item_id = :message_id
+	}
+
+	db_exec_plsql delete_message {
+	    select bboard_message__remove(:message_id);
+	}
+    }
 }
\ No newline at end of file
Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs.xql	29 Jun 2001 20:33:23 -0000	1.1
@@ -0,0 +1,221 @@
+<?xml version="1.0"?>
+<queryset>
+
+<fullquery name="bboard_forum_get.forum_get">      
+      <querytext>
+      
+        select * from bboard_forums where forum_id = :forum_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_get.category_get">      
+      <querytext>
+      
+        select * from bboard_categories where category_id = :category_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_new.message_new_revision">      
+      <querytext>
+      
+        select live_revision as revision_id
+            from cr_items
+            where item_id = :message_id
+        for update
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_set.message_revision">      
+      <querytext>
+      
+        select live_revision as revision_id from cr_items
+            where item_id = :message_id
+            for update
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_get.message_get">      
+      <querytext>
+      
+        select * from acs_messages_all where message_id = :message_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_unsubscribe_forum.forum_unsubscribe">      
+      <querytext>
+      
+        delete from bboard_forum_subscribers
+            where forum_id = :forum_id
+                and subscriber_id = :subscriber_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_unsubscribe_category.category_unsubscribe">      
+      <querytext>
+      
+        delete from bboard_category_subscribers
+            where category_id = :category_id
+                and subscriber_id = :subscriber_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_unsubscribe_thread.thread_unsubscribe">      
+      <querytext>
+      
+        delete from bboard_thread_subscribers
+            where thread_id = :thread_id
+                and subscriber_id = :subscriber_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_subscribed_p.check_category_subscribed">      
+      <querytext>
+      
+        select count(*) as subscribed_p from bboard_category_subscribers
+            where category_id = :category_id
+                and subscriber_id = :user_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_category_subscribed_p.check_category_forums_subscribed">      
+      <querytext>
+      
+		select count(*) as subscribed_p from bboard_forum_subscribers
+     	            where subscriber_id = :user_id
+		        and forum_id in (select bc.forum_id
+		                            from bboard_categories bc
+  		                            where bc.category_id = 
+                                                  :category_id)
+	    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_subscribed_p.check_forum_subscribed">      
+      <querytext>
+      
+        select count(*) as subscribed_p 
+            from bboard_forum_subscribers
+            where forum_id = :forum_id
+                and subscriber_id = :user_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_subscribed_p.check_message_cats_subscribed">      
+      <querytext>
+      
+		select count(*) as subscribed_p 
+		from bboard_category_subscribers
+		where subscriber_id = :user_id
+		      and category_id in (select bcmm.category_id
+		                          from bboard_category_message_map bcmm
+		                          where bcmm.message_id = :message_id)
+
+	    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_message_subscribed_p.check_message_forums_subscribed">      
+      <querytext>
+      
+		    select count(*) as subscribed_p 
+		    from bboard_forum_subscribers
+		    where subscriber_id = :user_id
+		          and forum_id in (select bfmm.forum_id
+   		                           from bboard_forum_message_map bfmm
+		                           where bfmm.message_id = :message_id)
+		
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_forum_moderated_p.forum_moderated_p">      
+      <querytext>
+      
+	select moderated_p
+  	  from bboard_forums
+	  where forum_id = :forum_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_check_and_register_mime_type.check_mime_type">      
+      <querytext>
+      
+	select mime_type
+	    from cr_mime_types
+	    where mime_type = :type
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_check_and_register_mime_type.insert_mime">      
+      <querytext>
+      
+		insert into cr_mime_types (mime_type)
+		values (:type)
+	    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_alert_message.forum_info">      
+      <querytext>
+      
+	select short_name as forum_name
+	    from bboard_forums
+	    where forum_id = :forum_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_alert_one_mesg.bboard_mesg_info">      
+      <querytext>
+      
+	select reply_to, sender, title, mime_type, content, email,
+               first_names||' '||last_name as full_name
+            from acs_messages_all, persons, parties
+            where message_id = :message_id
+                  and person_id = sender
+	          and party_id = person_id
+    
+      </querytext>
+</fullquery>
+
+ 
+<fullquery name="bboard_alert_message.forum_info">      
+      <querytext>
+      
+	select short_name as forum_name
+	    from bboard_forums
+	    where forum_id = :forum_id
+    
+      </querytext>
+</fullquery>
+
+ 
+</queryset>