Patch title: Release 94 bulk changes
Abstract:
File: /pliant/appli/forum/database.pli
Key:
    Removed line
    Added line
submodule "/pliant/appli/database.pli"
submodule "/pliant/storage/database.pli"
module "/pliant/admin/file.pli"
public


type ForumMessage
  field Str user ; field DateTime datetime
  field Str encoding
  field Str message
  field Str report

type ForumPatchSection
  field Str release

type ForumDebate
  field Str path
  field Str subpath
  field Str subject
  field Str title
  field Str abstract
  field Str status
  field Set:Str maintainer
  field Set:ForumMessage message
  field Str last_author
  field DateTime last_message
  field Int patch_count <- 0
  field DateTime last_patch
  field Set:ForumPatchSection patch_section

type ForumSubject
  field Str label
  field Str order

type ForumStatus
  field Str label
  field Float archive_delay <- 7*86400
  field Str order
  field Str display_all_label

type ForumSubscriber
  field Str mailbox
  field Char frequency <- " "

type Forum
  field Str path
  field Str site
  field Str url
  field Str from <- "<forum@nowhere>"
  field Str read post maintainer
  field Str title
  field Str abstract
  field Str reference_path
  field Str live_path
  field Str official_path
  field Str patch_servers
  field Set:ForumSubject subject
  field Set:ForumStatus status
  field Set:ForumDebate debate
  field Set:ForumSubscriber subscriber
  field DateTime last_hourly_report
  field DateTime last_daily_report
  field DateTime last_weekly_report

type ForumDatabase
  field Set:Forum forum

(gvar Database:ForumDatabase forum_database) load "security:/forum.pdb" mount "/pliant/forum"


method d update path
  arg_rw Data:ForumDebate d ; arg Str path
  var Str u := ""
  var DateTime dt := undefined
  each m d:message
    u := m user ; dt := m datetime
  d last_author := u ; d last_message := dt
  file_tree_cleanup path
  var DateTime dt := undefined
  var Array:FileInfo files := file_list path standard+recursive
  for (var Int i) 0 files:size-1
    if dt=undefined or dt<files:i:datetime
      dt := files:i:datetime
  d patch_count := files size
  d last_patch := dt

method d timestamp -> dt
  arg Data:ForumDebate d ; arg DateTime dt
  if d:last_message=defined and d:last_patch=defined
    dt := shunt d:last_message>d:last_patch d:last_message d:last_patch
  eif d:last_message=defined
    dt := d last_message
  eif d:last_patch=defined
    dt := d last_patch
  else
    dt := datetime 3000 1 1 0 0 0 0

function forum_path f d subpath -> p
  arg Data:Forum f ; arg Data:ForumDebate d ; arg Str subpath p
  if d:path<>""
    return d:path+(subpath 1 subpath:len)
  p := f:path+d:subpath+keyof:d+subpath