Patch title: Release 84 bulk changes
Abstract:
File: /pliant/appli/database/pointer.pli
Key:
    Removed line
    Added line
   
abstract
  [This module will define the 'Data' and 'Database' generic


alias data_store data_store from "/pliant/appli/database/fil
abstract
  [This module will define the 'Data' and 'Database' generic


alias data_store data_store from "/pliant/appli/database/fil
alias data_write_off data_write_off from "/pliant/appli/data
alias data_write_on data_write_on from "/pliant/appli/databa
alias data_file_switch data_file_switch from "/pliant/appli/
alias data_file_switch data_file_switch from "/pliant/appli/
export data_store data_write_off data_write_on data_file_swi
export data_store data_file_switch



function data_set d v t
  arg_rw Data_ d ; arg Universal v ; arg Type t



function data_set d v t
  arg_rw Data_ d ; arg Universal v ; arg Type t
  d:base:sem request
  d:base:sem request "database set "+d:path
  d:interface set d addressof:v t
  d:base:sem release


function map_field r def -> f
  arg_rw Data_ r ; arg DataRecordFieldDef def ; arg Data_ f
  if (addressof r:interface)=(addressof def:record_interface
    def apply r f
  else
  d:interface set d addressof:v t
  d:base:sem release


function map_field r def -> f
  arg_rw Data_ r ; arg DataRecordFieldDef def ; arg Data_ f
  if (addressof r:interface)=(addressof def:record_interface
    def apply r f
  else
    r:base:sem rd_request
    r:base:sem rd_request "database map field "+r:path+def:path
    f := r:interface search r html_decode:(def:path 1 def:pa
    r:base:sem rd_release
    if f:adr=null
      f object := def default


function map_record s key -> r
  arg_rw Data_ s ; arg Str key ; arg Data_ r
    f := r:interface search r html_decode:(def:path 1 def:pa
    r:base:sem rd_release
    if f:adr=null
      f object := def default


function map_record s key -> r
  arg_rw Data_ s ; arg Str key ; arg Data_ r
  s:base:sem rd_request
  s:base:sem rd_request "database map record "+s:path+"/"+html_decode:key
  r := s:interface search s key false
  s:base:sem rd_release


function data_size s -> n
  arg_rw Data_ s ; arg Int n
  r := s:interface search s key false
  s:base:sem rd_release


function data_size s -> n
  arg_rw Data_ s ; arg Int n
  s:base:sem rd_request
  s:base:sem rd_request "database get size "+s:path
  n := s:interface count s "" ""
  s:base:sem rd_release


function data_create s key -> status
  arg_rw Data_ s ; arg Str key ; arg Status status
  n := s:interface count s "" ""
  s:base:sem rd_release


function data_create s key -> status
  arg_rw Data_ s ; arg Str key ; arg Status status
  s:base:sem request
  s:base:sem request "database create "+s:path+"/"+html_encode:key
  status := s:interface create s key
  s:base:sem release

function data_create s key record -> status
  arg_rw Data_ s ; arg Str key ; arg Type record ; arg Statu
  status := s:interface create s key
  s:base:sem release

function data_create s key record -> status
  arg_rw Data_ s ; arg Str key ; arg Type record ; arg Statu
  s:base:sem request
  s:base:sem request "database create "+s:path+"/"+html_encode:key
  status := s:interface create s key
  if status=success
    var Data_ r := s:interface search s key
    for (var Int i) 0 record:nb_fields-1
      r:interface create r (record field i):name
  s:base:sem release


function data_delete s key -> status
  arg_rw Data_ s ; arg Str key ; arg Status status
  status := s:interface create s key
  if status=success
    var Data_ r := s:interface search s key
    for (var Int i) 0 record:nb_fields-1
      r:interface create r (record field i):name
  s:base:sem release


function data_delete s key -> status
  arg_rw Data_ s ; arg Str key ; arg Status status
  s:base:sem request
  s:base:sem request "database delete "+s:path+"/"+html_encode:key
  status := s:interface delete s key
  s:base:sem release


method d1 search_path path createit -> d2
  arg Data_ d1 ; arg Str path ; arg CBool createit ; arg Dat
  var Pointer:Database_ b :> d1 base
  status := s:interface delete s key
  s:base:sem release


method d1 search_path path createit -> d2
  arg Data_ d1 ; arg Str path ; arg CBool createit ; arg Dat
  var Pointer:Database_ b :> d1 base
  if createit
    b:sem request
  else
    b:sem rd_request
  b:sem rd_request "database search path "+d1:path+" "+path
  var CBool rw := false
  d2 := d1
  var Str p := path
  while (p parse "/" any:(var Str k) "/" any:(var Str remain
    if (addressof d2:base:sem)<>(addressof b:sem)
  d2 := d1
  var Str p := path
  while (p parse "/" any:(var Str k) "/" any:(var Str remain
    if (addressof d2:base:sem)<>(addressof b:sem)
      if createit
      if rw
        b:sem release
      else
        b:sem rd_release
      b :> d2 base
        b:sem release
      else
        b:sem rd_release
      b :> d2 base
      if createit
        b:sem request
      if rw
        b:sem request "database search path "+d1:path+" "+path
      else
      else
        b:sem rd_request
    var Data_ temp := d2:interface search d2 html_decode:k f
        b:sem rd_request "database search path "+d1:path+" "+path
    var Data_ temp := d2:interface search d2 html_decode:k
    if temp:adr=null and createit
      if not rw
        b:sem rd_release
        b:sem request "database search path "+d1:path+" "+path
        rw := true
      if (d2:interface create d2 html_decode:k)=success
        temp := d2:interface search d2 html_decode:k
    d2 := temp ; p := "/"+remain
  if (p parse "/" any:(var Str k))
    if (addressof d2:base:sem)<>(addressof b:sem)
    d2 := temp ; p := "/"+remain
  if (p parse "/" any:(var Str k))
    if (addressof d2:base:sem)<>(addressof b:sem)
      if createit
      if rw
        b:sem release
      else
        b:sem rd_release
      b :> d2 base
        b:sem release
      else
        b:sem rd_release
      b :> d2 base
      if createit
        b:sem request
      if rw
        b:sem request "database search path "+d1:path+" "+path
      else
      else
        b:sem rd_request
    var Data_ temp := d2:interface search d2 html_decode:k f
        b:sem rd_request "database search path "+d1:path+" "+path
    var Data_ temp := d2:interface search d2 html_decode:k
    if temp:adr=null and createit
      if not rw
        b:sem rd_release
        b:sem request "database search path "+d1:path+" "+path
        rw := true
      if (d2:interface create d2 html_decode:k)=success
        temp := d2:interface search d2 html_decode:k
    d2 := temp
    d2 := temp
  if createit
  if rw
    b:sem release
  else
    b:sem rd_release


function data_reset d
  arg_rw Data_ d
    b:sem release
  else
    b:sem rd_release


function data_reset d
  arg_rw Data_ d
  d:base:sem request
  d:base:sem request "database reset "+d:path
  d:interface reset d
  d:base:sem release


function data_copy src dest
  arg_rw Data_ src dest
  d:interface reset d
  d:base:sem release


function data_copy src dest
  arg_rw Data_ src dest
  dest:base:sem request
  if (addressof src:base:sem)<>(addressof dest:base:sem)
    src:base:sem rd_request
  dest:interface reset dest
  data_rec_copy src dest
  if (addressof src:base:sem)<>(addressof dest:base:sem)
    src:base:sem rd_release
  dest:base:sem release
  part copy "database copy "+src:path+" -> "+dest:path
    dest:base:sem request
    if (addressof src:base:sem)<>(addressof dest:base:sem)
      src:base:sem rd_request
    dest:interface reset dest
    data_rec_copy src dest
    if (addressof src:base:sem)<>(addressof dest:base:sem)
      src:base:sem rd_release
    dest:base:sem release


function scan_first d c buf -> some
  arg Data_ d ; arg_w Data_ c ; arg_w DataScanBuffer buf ; a
  var Pointer:Database_ db :> d base


function scan_first d c buf -> some
  arg Data_ d ; arg_w Data_ c ; arg_w DataScanBuffer buf ; a
  var Pointer:Database_ db :> d base
  db:sem rd_request
  db:sem rd_request "database search first "+d:path
  c := d:interface first d "" "" buf
  db:sem rd_release
  some := c:adr<>null

function scan_next d c buf -> some
  arg Data_ d ; arg_w Data_ c ; arg_rw DataScanBuffer buf ; 
  var Pointer:Database_ db :> d base
  c := d:interface first d "" "" buf
  db:sem rd_release
  some := c:adr<>null

function scan_next d c buf -> some
  arg Data_ d ; arg_w Data_ c ; arg_rw DataScanBuffer buf ; 
  var Pointer:Database_ db :> d base
  db:sem rd_request
  db:sem rd_request "database search next "+d:path
  c := d:interface next d "" "" buf
  db:sem rd_release
  some := c:adr<>null


export ':>' ':=' '' '. size' '. create' '. delete' keyof pat
export '. pmap' data_reset data_copy
export each
  c := d:interface next d "" "" buf
  db:sem rd_release
  some := c:adr<>null


export ':>' ':=' '' '. size' '. create' '. delete' keyof pat
export '. pmap' data_reset data_copy
export each