Patch title: Release 94 bulk changes
Abstract:
File: /pliant/appli/data_browser.pli
Key:
    Removed line
    Added line
abstract
  [This virtual tree page maps all the database data in the server as a tree in the HTTP server.]
doc
  [Don't use this as a sample on how to use Pliant database engine: ]
  [This page is using the low level interface whereas most of your applications will use the high level one.]

module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/util/encoding/html.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/appli/database.pli"
module "/pliant/appli/database/io.pli"
module "/pliant/storage/database.pli"
module "/pliant/storage/database/io.pli"

module "/pliant/fullpliant/user.pli"
module "/pliant/fullpliant/computer.pli"
module "/pliant/protocol/http/site.pli"


method page data_browser path options write
  arg_rw HtmlPage page ; arg Str path options ; arg CBool write
  implicit page

    var Data_ master := data_root search_path path false
    if master:adr=null
    
      http_request:answer_status := "404 There is no such data on this system"
      [There is no data ] ; fixed (text path) ; eol
    
    eif options="table"

      var List:Str cols ; var Int count := 0
      master:base:sem rd_request
      var Data_ line := master:interface first master "" "" (var DataScanBuffer buf)
      line:base:sem rd_request
      var Data_ col := line:interface first line "" "" (var DataScanBuffer buf2)
      while col:adr<>null
        col := line:interface next line "" "" buf2
        cols += col key ; count += 1
      line:base:sem rd_release
      table columns count+1
        cell void
        var Pointer:Str ptr :> cols first
        while exists:ptr
          cell header text:ptr
          ptr :> cols next ptr
        while line:adr<>null
          line:base:sem rd_request
          cell
            link line:key http_request:path+"/"+(html_encode line:key) options "table" no_extension
          var Pointer:Str ptr :> cols first
          while exists:ptr
            cell
              var Data_ col := line:interface search line ptr
              var Link:Type t :> col:interface type col
              if t<>Void and (col:interface get col addressof:(var Str value) Str)=success
                text value
            ptr :> cols next ptr
          line:base:sem rd_release
          line := master:interface next master "" "" buf
      master:base:sem rd_release

    else
    
      title "Data browser"
      table columns 2 border 0
        cell [Path:]
        cell (fixed text:path)
        master:base:sem rd_request
        var Link:Type t :> master:interface type master
        if t<>Void
          cell [Type:]
          cell fixed:(text t:name)
        if t<>Void and (master:interface get master addressof:(var Str value) Str)=success
          cell [Value:]
          var Data:Str test :> path pmap Str
          if write
            cell
              input "" test length 60 noeol
              button "Change it"
                goto_backward
          else
            cell fixed:(text value)
        master:base:sem rd_release
    
      if options<>"all" or not allowed:"administrator"
    
        master:base:sem rd_request
        var Data_ sub := master:interface first master "" "" (var DataScanBuffer buf)
        if sub:adr<>null
          table columns 4
            cell header
              bold [Key]
            cell header
              bold [Type]
            cell header
              bold [Value]
            cell void
            while sub:adr<>null
              cell
                link sub:key http_request:path+"/"+(html_encode sub:key) no_extension
              if (addressof sub:base)<>(addressof master:base)
                sub:base:sem rd_request
              var Link:Type t :> sub:interface type sub
              if t<>Void and (sub:interface get sub addressof:(var Str value) Str)=success
                cell fixed:(text t:name)
              else
                cell void
              if t<>Void and (sub:interface get sub addressof:(var Str value) Str)=success
                cell fixed:(text value)
              else
                cell void
              cell
                var Data_ more := sub:interface first sub "" "" (var DataScanBuffer buf2)
                if more:adr<>null
                  [...]
              if (addressof sub:base)<>(addressof master:base)
                sub:base:sem rd_release
              sub := master:interface next master "" "" buf
        master:base:sem rd_release

        if allowed:"administrator"
          small
            link "expand all" http_request:path no_extension options "all" ; eol

        if (addressof master:base)<>(addressof data_root:base)
          if allowed:"administrator"
            var Str mime := "text/plain"
            select "" (var Str mime) noeol
              option "view" "text/plain"
              option "store" "binary/*"
            button "download"
              var Data_ master2 := data_root search_path path false
              var Link:Database_ base :> master2 base
              if master2:adr<>null
                reset_http_answer
                http_request send_header "mime "+string:mime
                base:sem rd_request
                master2 store http_request:answer_stream
                base:sem rd_release
                http_request send_footer
              else
                [Internal bug in Pliant module /pliant/appli/data_browser.pli]
          if write
            input "" (var Str key) noeol
            button "create key" noeol
              (path pmap Set:Str) create key
              reload_page
            button "delete key"
              (path pmap Set:Str) delete key
              reload_page
          if allowed:"administrator"
            file_upload "" (var Str filename) noeol
            select "" (var Str action) noeol
              option "add and replace only" ""
              option "clear then add" "clear"
            button "upload"
              var Data_ master2 := data_root search_path path false
              var Link:Database_ base :> master2 base
              if master2:adr<>null
                base:sem request
                if action="clear"
                  master2:interface reset master2
                (var Stream s) open filename in+safe
                base get_root (var Data_ root)
                root load s
                base:sem release
                reload_page
              else
                [Internal bug in Pliant module /pliant/appli/data_browser.pli]
 
      else
    
        function display_data_tree data header page
          arg_rw Data_ data ; arg Str header ; arg_rw HtmlPage page
          cell
            fixed
              text header+data:key
          data:base:sem rd_request
          var Link:Type t :> data:interface type data
          if t<>Void
            cell
              small
                italic
                  text t:name
          else
            cell void
          if t<>Void and (data:interface get data addressof:(var Str value) Str)=success
            cell
              fixed
                text value
          else
            cell void
          var Data_ more := data:interface first data "" "" (var DataScanBuffer buf)
          while more:adr<>null
            data:base:sem rd_release
            display_data_tree more header+". " page
            data:base:sem rd_request
            more := data:interface next data "" "" buf
          data:base:sem rd_release
    
        table columns 3 border 0 padding 0
          cell header
            bold [Subpath]
          cell header
            bold [Type]
          cell header
            bold [Value]
          master:base:sem rd_request
          var Data_ sub := master:interface first master "" "" (var DataScanBuffer buf)
          while sub:adr<>null
            master:base:sem rd_release
            display_data_tree sub "" page
            master:base:sem rd_request
            sub := master:interface next master "" "" buf
          master:base:sem rd_release


export '. data_browser'