Patch title: Release 93 bulk changes
Abstract:
File: /appli/database/file.pli
Key:
    Removed line
    Added line
   
abstract
  [Handles datas stored in a file, using HTML like tags.]


function destroy df
  arg_w DatabaseFile df
  df:common flags += database_loading
abstract
  [Handles datas stored in a file, using HTML like tags.]


function destroy df
  arg_w DatabaseFile df
  df:common flags += database_loading
  if pliant_execution_phase>=execution_phase_free
    return
  # if pliant_execution_phase>=execution_phase_free
  #   return
  df clear_modified
  database_all_sem request
  database_all_list remove df:all_node
  database_all_sem release



method df log_required -> required
  arg_rw DatabaseFile df ; arg CBool required
  if df:common:flags:database_loading
    return false
  df clear_modified
  database_all_sem request
  database_all_list remove df:all_node
  database_all_sem release



method df log_required -> required
  arg_rw DatabaseFile df ; arg CBool required
  if df:common:flags:database_loading
    return false
  if df:logname:len=0
    return false
  if not df:common:flags:database_modified
    df set_modified
    if auto_store
      daemon "database autostore daemon"
        while database_modified_count>0 and not daemon_emerg
          daemon_sleep auto_store_step
          data_store false
  if not df:common:flags:database_modified
    df set_modified
    if auto_store
      daemon "database autostore daemon"
        while database_modified_count>0 and not daemon_emerg
          daemon_sleep auto_store_step
          data_store false
  if df:logname:len=0
    return false
  df wr_counter += 1
  if (addressof df:log)=null
    atomic_add database_handle_count 1
    if database_handle_count>database_handle_limit
      daemon "database autoclose daemon"
        data_store false
    df log :> new Stream
    if df:logname=df:filename
      # temporary log
      df:log open df:filename append+linecache+safe
  df wr_counter += 1
  if (addressof df:log)=null
    atomic_add database_handle_count 1
    if database_handle_count>database_handle_limit
      daemon "database autoclose daemon"
        data_store false
    df log :> new Stream
    if df:logname=df:filename
      # temporary log
      df:log open df:filename append+linecache+safe
      df:log safe_configure "journal"
    else
      # full log
      var FileInfo info := file_query df:logname standard
      df:log open df:filename append+safe
    else
      # full log
      var FileInfo info := file_query df:logname standard
      df:log open df:filename append+safe
      df:log safe_configure "journal"
      df:log writeline "<precovery offset=[dq]"+string:(shun
      df:log close
      df:log open df:logname append+linecache+safe
      df:log writeline "<precovery offset=[dq]"+string:(shun
      df:log close
      df:log open df:logname append+linecache+safe
      df:log safe_configure "journal"
    if df:log=failure
      df log :> null map Stream
      return false
  var Link:Str lt :> data_read_login_tag
  if (addressof df:login_tag)<>addressof:lt
    df log_line lt
    df login_tag :> lt
  required := true


function database_recode filename encoding
  arg Str filename encoding
  part copy "recode "+filename
    var Link:Stream old :> new Stream
    old open filename in+safe
    var Link:Stream s :> new Stream
    s open filename+".tmp" out+safe
    if df:log=failure
      df log :> null map Stream
      return false
  var Link:Str lt :> data_read_login_tag
  if (addressof df:login_tag)<>addressof:lt
    df log_line lt
    df login_tag :> lt
  required := true


function database_recode filename encoding
  arg Str filename encoding
  part copy "recode "+filename
    var Link:Stream old :> new Stream
    old open filename in+safe
    var Link:Stream s :> new Stream
    s open filename+".tmp" out+safe
    s safe_configure "journal"
    var CBool ok
    if encoding="zlib"
      s writeline "<zlib>"
      var Link:Stream z :> new Stream
      z open "zlib:" "" out+safe pliant_default_file_system 
      copy_lines old z
      z flush sync
      ok := z:close=success and s:close=success
    else
      copy_lines old s
      s flush sync
      ok := s:close=success
    if ok and old:close=success
      file_delete filename
      file_move filename+".tmp" filename
      file_directory_flush filename
    else
      file_delete filename+".tmp"



    var CBool ok
    if encoding="zlib"
      s writeline "<zlib>"
      var Link:Stream z :> new Stream
      z open "zlib:" "" out+safe pliant_default_file_system 
      copy_lines old z
      z flush sync
      ok := z:close=success and s:close=success
    else
      copy_lines old s
      s flush sync
      ok := s:close=success
    if ok and old:close=success
      file_delete filename
      file_move filename+".tmp" filename
      file_directory_flush filename
    else
      file_delete filename+".tmp"