574 lines
22 KiB
Mathematica
574 lines
22 KiB
Mathematica
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; ;
|
|
; Copyright 2006, 2012 Fidelity Information Services, Inc ;
|
|
; ;
|
|
; This source code contains the intellectual property ;
|
|
; of its copyright holder(s), and is made available ;
|
|
; under a license. If you do not know the terms of ;
|
|
; the license, please stop and do not read further. ;
|
|
; ;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
gdeget: ;read in an existing GD or create a default
|
|
LOAD
|
|
n abs,contents,rel,xregs,xsegs,reglist,map,$et
|
|
i debug s $et="b"
|
|
e s $et="g ABORT^GDE:($p($p($zs,"","",3),""-"")'=""%GDE"") u io w !,$p($zs,"","",3,999),! h"
|
|
; if zchset is UTF-8 open in raw mode to avoid BADCHAR errors
|
|
; For OS390 aka z/OS, use BINARY mode
|
|
s abs=1,update=0,chset=$SELECT($ZV["OS390":"BINARY",$ZV["VMS":"",$ZCHSET="UTF-8":"M",1:"")
|
|
o file:(exc="g badfile":rewind:recordsize=SIZEOF("dsk_blk"):readonly:fixed:blocksize=SIZEOF("dsk_blk"):ichset=chset)
|
|
u file r rec
|
|
i debug u @useio
|
|
; header
|
|
s label=$ze(rec,1,12)
|
|
s olabel=label
|
|
s mach=$p($zver," ",4)
|
|
s seghasencrflag=FALSE
|
|
if ($e(label,0,9)="GTCGBDUNX"),$e(label,$l(label)-1,99)>5 s seghasencrflag=TRUE
|
|
s reghasv550fields=FALSE
|
|
if ($e(label,0,9)="GTCGBDUNX"),$e(label,$l(label)-1,99)>6 s reghasv550fields=TRUE
|
|
s reghasv600fields=FALSE
|
|
if ($e(label,0,9)="GTCGBDUNX"),$e(label,$l(label)-1,99)>7 s reghasv600fields=TRUE
|
|
set v550=0
|
|
i (label="GTCGBDUNX007")!(label="GTCGBDUNX107") s label=hdrlab,v550=1,update=1 ;autoconvert
|
|
i (v550=1) n SIZEOF d v550init
|
|
set v542=0
|
|
i (label="GTCGBLDIR009")!(label="GTCGBDUNX006")!(label="GTCGBDUNX106") s label=hdrlab,v542=1,update=1 ;autoconvert
|
|
i (v542=1) n SIZEOF d v542init
|
|
set v534=0
|
|
i (label="GTCGBDUNX105")!((label="GTCGBDUNX005")&(mach="IA64")) s label=hdrlab,v534=1,update=1 ;autoconvert
|
|
i (v534=1) n SIZEOF d v534init
|
|
set v533=0
|
|
i (gtm64=TRUE),(label="GTCGBDUNX006") s label=hdrlab,v533=1,update=1 ;autoconvert
|
|
i (v533=1) n SIZEOF d v533init
|
|
set v532=0
|
|
i (label="GTCGBLDIR008")!(label="GTCGBDUNX005") s label=hdrlab,v532=1,update=1 ;autoconvert
|
|
i (v532=1),(mach'="IA64") n gtm64 s gtm64=FALSE
|
|
i (v532=1),(mach'="IA64") n SIZEOF d v532init
|
|
set v5ft1=0
|
|
i (label="GTCGBLDIR008")!(label="GTCGBDUNX004") s label=hdrlab,v5ft1=1,update=1 ;autoconvert
|
|
i v5ft1=1 n gtm64 s gtm64=FALSE
|
|
i v5ft1=1 n SIZEOF d v5ft1init
|
|
set v44=0
|
|
i (label="GTCGBLDIR007")!(label="GTCGBDUNX003") s label=hdrlab,v44=1,update=1 ;autoconvert
|
|
i v44=1 n gtm64 s gtm64=FALSE
|
|
i v44=1 n MAXNAMLN,MAXSEGLN,MAXREGLN,SIZEOF d v44init
|
|
s v30=0
|
|
i (label="GTCGBLDIR006")!(label="GTCGBDUNX002") s label=hdrlab,v30=4,update=1 ;autoconvert
|
|
i v30=4 n gtm64 s gtm64=FALSE
|
|
i label'=hdrlab d cretmps,CONVERT^GDEOGET,verify s encryptsupported=FALSE,update=1 q ;autoconvert
|
|
s filesize=$$bin2num($ze(rec,13,16))
|
|
s abs=abs+SIZEOF("gd_header")
|
|
; contents
|
|
i (gtm64=TRUE) d
|
|
. i $ze(rec,abs,abs+7)'=$c(0,0,0,0,0,0,0,0) zm gdeerr("INPINTEG") ; filler
|
|
. s abs=abs+8
|
|
e d
|
|
. i $ze(rec,abs,abs+3)'=$c(0,0,0,0) zm gdeerr("INPINTEG") ; filler
|
|
. s abs=abs+4
|
|
s contents("maxrecsize")=$$bin2num($ze(rec,abs,abs+3)),abs=abs+4
|
|
s contents("mapcnt")=$$bin2num($ze(rec,abs,abs+1)),abs=abs+2
|
|
s contents("regioncnt")=$$bin2num($ze(rec,abs,abs+1)),abs=abs+2
|
|
s contents("segmentcnt")=$$bin2num($ze(rec,abs,abs+1)),abs=abs+2
|
|
i $ze(rec,abs,abs+1)'=$tr($j("",2)," ",ZERO) zm gdeerr("INPINTEG") ; filler
|
|
i (gtm64=TRUE) d
|
|
. s abs=abs+6 ; including padding
|
|
. s contents("maps")=$$bin2num($ze(rec,abs,abs+7)),abs=abs+8
|
|
. s contents("regions")=$$bin2num($ze(rec,abs,abs+7)),abs=abs+8
|
|
. s contents("segments")=$$bin2num($ze(rec,abs,abs+7)),abs=abs+8
|
|
. s abs=abs+24 ;skip link, tab_ptr and id pointers
|
|
. s contents("end")=$$bin2num($ze(rec,abs,abs+7)),abs=abs+8
|
|
e d
|
|
. s abs=abs+2
|
|
. s contents("maps")=$$bin2num($ze(rec,abs,abs+3)),abs=abs+4
|
|
. s contents("regions")=$$bin2num($ze(rec,abs,abs+3)),abs=abs+4
|
|
. s contents("segments")=$$bin2num($ze(rec,abs,abs+3)),abs=abs+4
|
|
. s abs=abs+12 ;skip link, tab_ptr and id pointers
|
|
. s contents("end")=$$bin2num($ze(rec,abs,abs+3)),abs=abs+4
|
|
i contents("regioncnt")'=contents("segmentcnt") zm gdeerr("INPINTEG")
|
|
i contents("regioncnt")-1>contents("mapcnt") zm gdeerr("INPINTEG")
|
|
; verify offsets
|
|
i abs'=(SIZEOF("gd_header")+SIZEOF("gd_contents")+1) zm gdeerr("INPINTEG")
|
|
s x=contents("maps")
|
|
i x+1'=(abs-SIZEOF("gd_header")) zm gdeerr("INPINTEG")
|
|
s x=x+(contents("mapcnt")*SIZEOF("gd_map"))
|
|
i x'=contents("regions") zm gdeerr("INPINTEG")
|
|
s x=x+(contents("regioncnt")*SIZEOF("gd_region"))
|
|
i x'=contents("segments") zm gdeerr("INPINTEG")
|
|
s x=x+(contents("segmentcnt")*(SIZEOF("gd_segment")-v30))
|
|
i x'=contents("end") zm gdeerr("INPINTEG")
|
|
s rel=abs
|
|
; maps - verify that mapped regions and regions are 1-to-1
|
|
k reglist
|
|
f i=1:1:contents("mapcnt") d map
|
|
zm:'$$MAP2NAM^GDEMAP(.map) gdeerr("INPINTEG")
|
|
s s=""
|
|
f i=1:1:contents("regioncnt") s s=$o(reglist(s))
|
|
i $l($o(reglist(s))) zm gdeerr("INPINTEG")
|
|
; regions
|
|
k regs,xregs s regs=0
|
|
f i=1:1:contents("regioncnt") d region
|
|
i regs'=contents("regioncnt") zm gdeerr("INPINTEG")
|
|
; segments
|
|
k segs,xsegs s segs=0
|
|
f i=1:1:contents("segmentcnt") d segment
|
|
i segs'=contents("segmentcnt") zm gdeerr("INPINTEG")
|
|
; template access method
|
|
s tmpacc=$$gderead(4)
|
|
i accmeth'[("\"_tmpacc) zm gdeerr("INPINTEG")
|
|
; templates
|
|
k tmpreg,tmpseg
|
|
d cretmps
|
|
i (reghasv550fields=TRUE) d tmpreg("ALIGNSIZE")
|
|
f s="ALLOCATION" d tmpreg(s)
|
|
i (reghasv550fields=TRUE) d tmpreg("AUTOSWITCHLIMIT")
|
|
f s="BEFORE_IMAGE","BUFFER_SIZE" d tmpreg(s)
|
|
i tmpreg("BUFFER_SIZE")<minreg("BUFFER_SIZE") s tmpreg("BUFFER_SIZE")=minreg("BUFFER_SIZE"),update=1
|
|
i 'v30 d tmpreg("COLLATION_DEFAULT")
|
|
i (reghasv550fields=TRUE) d tmpreg("EPOCH_INTERVAL")
|
|
f s="EXTENSION","FILE_NAME" d tmpreg(s)
|
|
i (reghasv600fields=TRUE) d tmpreg("INST_FREEZE_ON_ERROR")
|
|
f s="JOURNAL","KEY_SIZE","NULL_SUBSCRIPTS" d tmpreg(s)
|
|
i (reghasv600fields=TRUE) d tmpreg("QDBRUNDOWN")
|
|
f s="RECORD_SIZE" d tmpreg(s) ;,"STOP_ENABLE"
|
|
; need to handle versioning
|
|
i 'v44&'v30 d tmpreg("STDNULLCOLL")
|
|
i (reghasv550fields=TRUE) d tmpreg("SYNC_IO")
|
|
i (reghasv550fields=TRUE) d tmpreg("YIELD_LIMIT")
|
|
; minimum allocation/extension was changed in V54001; check if default current value is lower and if so adjust it
|
|
i tmpreg("ALLOCATION")<minreg("ALLOCATION") s tmpreg("ALLOCATION")=minreg("ALLOCATION"),update=1
|
|
i tmpreg("EXTENSION")<minreg("EXTENSION") s tmpreg("EXTENSION")=minreg("EXTENSION"),update=1
|
|
i (reghasv550fields=TRUE) i tmpreg("ALIGNSIZE")<minreg("ALIGNSIZE") s tmpreg("ALIGNSIZE")=minreg("ALIGNSIZE"),update=1
|
|
i (reghasv550fields=TRUE) i tmpreg("AUTOSWITCHLIMIT")<minreg("AUTOSWITCHLIMIT") d
|
|
. s tmpreg("AUTOSWITCHLIMIT")=minreg("AUTOSWITCHLIMIT"),update=1
|
|
f i=2:1:$l(accmeth,"\") s am=$p(accmeth,"\",i) d
|
|
. i am="MM" d:$zl(rec)-(rel-1)<3 nextrec i +$ze(rec,rel,rel+2)'=2 d tmpmm q
|
|
. f s="ACCESS_METHOD","ALLOCATION","BLOCK_SIZE","BUCKET_SIZE","DEFER" d tmpseg(am,s)
|
|
. i (seghasencrflag=TRUE) d tmpseg(am,"ENCRYPTION_FLAG")
|
|
. f s="EXTENSION_COUNT","FILE_TYPE","GLOBAL_BUFFER_COUNT","LOCK_SPACE" d tmpseg(am,s)
|
|
. i 'v30 d tmpseg(am,"RESERVED_BYTES") ;autoconvert, can be condensed someday
|
|
. d tmpseg(am,"WINDOW_SIZE")
|
|
.
|
|
c file
|
|
; resolve
|
|
s s=""
|
|
f s s=$o(nams(s)) q:'$l(s) zm:'$d(xregs(nams(s))) gdeerr("INPINTEG") s nams(s)=xregs(nams(s))
|
|
f s s=$o(regs(s)) q:'$l(s) zm:'$d(xsegs(regs(s,"DYNAMIC_SEGMENT"))) gdeerr("INPINTEG") d
|
|
. s regs(s,"DYNAMIC_SEGMENT")=xsegs(regs(s,"DYNAMIC_SEGMENT"))
|
|
f s s=$o(segs(s)) q:'$l(s) s am=segs(s,"ACCESS_METHOD") d
|
|
. s x=""
|
|
. f s x=$o(segs(s,x)) q:x="" d
|
|
. . i x'="FILE_NAME",'$l(tmpseg(am,x)) zm:segs(s,x) gdeerr("INPINTEG") s segs(s,x)=""
|
|
; fall through !
|
|
verify: s x=$$ALL^GDEVERIF
|
|
i 'x zm gdeerr("INPINTEG")
|
|
q
|
|
|
|
;----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
badfile ;file access failed
|
|
s:'debug $et="" u file:exc="" s abortzs=$zs zm gdeerr("GDREADERR"):file,+abortzs
|
|
h
|
|
;
|
|
bin2num:(bin) ; binary number -> number
|
|
n num,i
|
|
s num=0
|
|
i endian=TRUE f i=$zl(bin):-1:1 s num=$za(bin,i)*HEX($zl(bin)-i*2)+num
|
|
e f i=1:1:$zl(bin) s num=$za(bin,i)*HEX(i-1*2)+num
|
|
q num
|
|
;
|
|
|
|
;----------------------------------------------------------------------------------------------------------------------------------
|
|
map:
|
|
i $zl(rec)-(rel-1)<SIZEOF("gd_map") d nextrec
|
|
s s=$ze(rec,rel,rel+SIZEOF("mident")-1),rel=rel+SIZEOF("mident")
|
|
s x=$zf(s,$c(0))-2 i x=-2 s x=SIZEOF("mident")
|
|
s s=$ze(s,1,x)
|
|
i (gtm64=TRUE) s x=$$bin2num($ze(rec,rel,rel+3)),rel=rel+8 ; read 4 bytes, but skip 8 bytes
|
|
e s x=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
s map(s)=x
|
|
s reglist(x)="",x=x-contents("regions")
|
|
i x#SIZEOF("gd_region") zm gdeerr("INPINTEG")
|
|
i x\SIZEOF("gd_region")'<contents("regioncnt") zm gdeerr("INPINTEG")
|
|
s abs=abs+SIZEOF("gd_map")
|
|
q
|
|
region:
|
|
i $zl(rec)-(rel-1)<SIZEOF("gd_region") d nextrec
|
|
s regs=regs+1
|
|
s l=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s s=$ze(rec,rel,rel+l-1),rel=rel+MAXREGLN,xregs(abs-1-SIZEOF("gd_header"))=s
|
|
s regs(s,"KEY_SIZE")=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s regs(s,"RECORD_SIZE")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
i (gtm64=TRUE) s regs(s,"DYNAMIC_SEGMENT")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+8 ; read 4 bytes, but skip 8
|
|
e s regs(s,"DYNAMIC_SEGMENT")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
s x=regs(s,"DYNAMIC_SEGMENT")-contents("segments")
|
|
i x#(SIZEOF("gd_segment")-v30) zm gdeerr("INPINTEG") ; autoconvert
|
|
i x\(SIZEOF("gd_segment")-v30)'<contents("segmentcnt") zm gdeerr("INPINTEG") ; autoconvert
|
|
i (gtm64=TRUE) d
|
|
. i $ze(rec,rel,rel+7)'=$c(0,0,0,0,0,0,0,0) zm gdeerr("INPINTEG") ; static segment
|
|
. s rel=rel+8
|
|
e d
|
|
. i $ze(rec,rel,rel+3)'=$c(0,0,0,0) zm gdeerr("INPINTEG") ; static segment
|
|
. s rel=rel+4
|
|
i $ze(rec,rel)'=ZERO zm gdeerr("INPINTEG") ; OPEN state
|
|
s rel=rel+1
|
|
i $ze(rec,rel)'=ZERO zm gdeerr("INPINTEG") ; lock_write
|
|
s rel=rel+1
|
|
s regs(s,"NULL_SUBSCRIPTS")=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
s regs(s,"JOURNAL")=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
s regs(s,"ALLOCATION")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4 ; journal options
|
|
; check if allocation is below new minimums (changed in V54001) if so adjust it to be at least that much
|
|
i regs(s,"ALLOCATION")<minreg("ALLOCATION") s regs(s,"ALLOCATION")=minreg("ALLOCATION"),update=1
|
|
s regs(s,"EXTENSION")=$$bin2num($ze(rec,rel,rel+SIZEOF("reg_jnl_deq")-1)),rel=rel+SIZEOF("reg_jnl_deq")
|
|
; check if allocation is below new minimums (changed in V54001) if so adjust it to be at least that much
|
|
i regs(s,"EXTENSION")<minreg("EXTENSION") s regs(s,"EXTENSION")=minreg("EXTENSION"),update=1
|
|
i (reghasv550fields=TRUE) d
|
|
. s regs(s,"AUTOSWITCHLIMIT")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
. s regs(s,"ALIGNSIZE")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
. i regs(s,"ALIGNSIZE")<minreg("ALIGNSIZE") s regs(s,"ALIGNSIZE")=minreg("ALIGNSIZE"),update=1
|
|
. i regs(s,"AUTOSWITCHLIMIT")<minreg("AUTOSWITCHLIMIT") s regs(s,"AUTOSWITCHLIMIT")=minreg("AUTOSWITCHLIMIT"),update=1
|
|
. s regs(s,"EPOCH_INTERVAL")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
. s regs(s,"SYNC_IO")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
. s regs(s,"YIELD_LIMIT")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
e d
|
|
. s regs(s,"AUTOSWITCHLIMIT")=8388600
|
|
. s regs(s,"ALIGNSIZE")=4096
|
|
. s regs(s,"EPOCH_INTERVAL")=300
|
|
. s regs(s,"SYNC_IO")=0
|
|
. s regs(s,"YIELD_LIMIT")=8
|
|
s regs(s,"BUFFER_SIZE")=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
i regs(s,"BUFFER_SIZE")<minreg("BUFFER_SIZE") s regs(s,"BUFFER_SIZE")=minreg("BUFFER_SIZE"),update=1
|
|
s regs(s,"BEFORE_IMAGE")=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
i $ze(rec,rel,rel+3)'=$tr($j("",4)," ",ZERO) zm gdeerr("INPINTEG") ; 4 chars
|
|
s rel=rel+4
|
|
s regs(s,"COLLATION_DEFAULT")=$$bin2num($ze(rec,rel)),rel=rel+1 ; default collating type
|
|
; stdnullcoll is applicable from V5
|
|
i 'v44&'v30 s regs(s,"STDNULLCOLL")=$$bin2num($ze(rec,rel))
|
|
e d
|
|
. i $ze(rec,rel)'=$tr($j("",1)," ",ZERO) zm gdeerr("INPINTEG") ; 1 chars
|
|
. s regs(s,"STDNULLCOLL")=0
|
|
s rel=rel+1
|
|
i (reghasv600fields=TRUE) d
|
|
. s regs(s,"INST_FREEZE_ON_ERROR")=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
. s regs(s,"QDBRUNDOWN")=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
e d
|
|
. s regs(s,"INST_FREEZE_ON_ERROR")=0
|
|
. s regs(s,"QDBRUNDOWN")=0
|
|
s l=$$bin2num($ze(rec,rel)),rel=rel+1 ;jnl_file_len
|
|
s regs(s,"FILE_NAME")=$ze(rec,rel,rel+l-1),rel=rel+SIZEOF("file_spec")
|
|
s rel=rel+SIZEOF("gd_region_padding") ; padding
|
|
i $ze(rec,rel,rel+7)'=$tr($j("",8)," ",ZERO) zm gdeerr("INPINTEG") ; reserved
|
|
s rel=rel+8 ; reserved
|
|
s abs=abs+SIZEOF("gd_region")
|
|
q
|
|
segment:
|
|
i $zl(rec)-(rel-1)<(SIZEOF("gd_segment")-v30) d nextrec ; autoconvert
|
|
s segs=segs+1
|
|
s x=$$bin2num($ze(rec,rel+SIZEOF("am_offset")-v30,rel+SIZEOF("am_offset")-v30+3)) ; autoconvert
|
|
s am=$s(x=1:"BG",x=2:"MM",x=4:"USER",1:"ERROR")
|
|
i am="ERROR" zm gdeerr("INPINTEG")
|
|
s l=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s s=$ze(rec,rel,rel+l-1),rel=rel+MAXSEGLN,xsegs(abs-1-SIZEOF("gd_header"))=s
|
|
s segs(s,"ACCESS_METHOD")=am
|
|
s l=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s segs(s,"FILE_NAME")=$ze(rec,rel,rel+l-1),rel=rel+SIZEOF("file_spec")
|
|
s segs(s,"BLOCK_SIZE")=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s segs(s,"EXTENSION_COUNT")=$$bin2num($ze(rec,rel,rel+1)),rel=rel+2
|
|
s segs(s,"ALLOCATION")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
i (gtm64=TRUE) d
|
|
. i $ze(rec,rel,rel+7)'=$tr($j("",8)," ",ZERO) zm gdeerr("INPINTEG") ; reserved for clb
|
|
. s rel=rel+12 ; padding
|
|
e d
|
|
. i $ze(rec,rel,rel+3)'=$tr($j("",4)," ",ZERO) zm gdeerr("INPINTEG") ; reserved for clb
|
|
. s rel=rel+4
|
|
i $ze(rec,rel,rel+3)'=".DAT" zm gdeerr("INPINTEG")
|
|
s rel=rel+4
|
|
s segs(s,"DEFER")=$$bin2num($ze(rec,rel))
|
|
s rel=rel+1
|
|
s x=$$bin2num($ze(rec,rel)),rel=rel+1
|
|
s segs(s,"FILE_TYPE")=$s(x=0:"DYNAMIC",1:"ERROR")
|
|
i segs(s,"FILE_TYPE")="ERROR" zm gdeerr("INPINTEG")
|
|
s segs(s,"BUCKET_SIZE")=$$bin2num($ze(rec,rel))
|
|
s rel=rel+1
|
|
s segs(s,"WINDOW_SIZE")=$$bin2num($ze(rec,rel))
|
|
s rel=rel+1
|
|
s segs(s,"LOCK_SPACE")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
s segs(s,"GLOBAL_BUFFER_COUNT")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4
|
|
i 'v30 s segs(s,"RESERVED_BYTES")=$$bin2num($ze(rec,rel,rel+3)),rel=rel+4 ;autoconvert
|
|
e s segs(s,"RESERVED_BYTES")=0
|
|
s rel=rel+4 ; access method already processed
|
|
i (gtm64=TRUE) d
|
|
. i $ze(rec,rel,rel+7)'=$tr($j("",8)," ",ZERO) zm gdeerr("INPINTEG") ; file_cntl pointer
|
|
. s rel=rel+8
|
|
. i $ze(rec,rel,rel+7)'=$tr($j("",8)," ",ZERO) zm gdeerr("INPINTEG") ; repl_list pointer
|
|
. s rel=rel+8
|
|
e d
|
|
. i $ze(rec,rel,rel+3)'=$tr($j("",4)," ",ZERO) zm gdeerr("INPINTEG") ; file_cntl pointer
|
|
. s rel=rel+4
|
|
. i $ze(rec,rel,rel+3)'=$tr($j("",4)," ",ZERO) zm gdeerr("INPINTEG") ; repl_list pointer
|
|
. s rel=rel+4
|
|
; If the gld file has the encrytion flag, read it. Also read only if
|
|
; the current platform is encrpytion enabled. Otherwise default to 0
|
|
s segs(s,"ENCRYPTION_FLAG")=$S(((encsupportedplat=TRUE)&(seghasencrflag=TRUE)):$$bin2num($ze(rec,rel,rel+3)),1:0)
|
|
i (seghasencrflag=TRUE) d
|
|
. s rel=rel+4
|
|
. if (gtm64=TRUE) s rel=rel+4 ; Padding bytes for 64 bit platforms
|
|
s abs=abs+SIZEOF("gd_segment")-v30
|
|
q
|
|
gderead:(max)
|
|
n s
|
|
i $zl(rec)-(rel-1)<3 d nextrec
|
|
s l=$ze(rec,rel,rel+2),rel=rel+3,abs=abs+3
|
|
i l>max zm gdeerr("INPINTEG")
|
|
i $zl(rec)-(rel-1)<l d nextrec
|
|
s s=$ze(rec,rel,rel+l-1),rel=rel+l,abs=abs+l
|
|
q s
|
|
;
|
|
tmpreg:(s)
|
|
i $zl(rec)-(rel-1)<3 d nextrec
|
|
s l=$ze(rec,rel,rel+2),rel=rel+3,abs=abs+3
|
|
i $zl(rec)-(rel-1)<l d nextrec
|
|
s tmpreg(s)=$ze(rec,rel,rel+l-1),rel=rel+l,abs=abs+l
|
|
q
|
|
tmpseg:(a,s)
|
|
i $zl(rec)-(rel-1)<3 d nextrec
|
|
s l=$ze(rec,rel,rel+2),rel=rel+3,abs=abs+3
|
|
i $zl(rec)-(rel-1)<l d nextrec
|
|
s tmpseg(a,s)=$s($l(tmpseg(a,s)):$ze(rec,rel,rel+l-1),1:"") s rel=rel+l,abs=abs+l
|
|
q
|
|
nextrec:
|
|
n nextrec
|
|
u file r nextrec
|
|
i debug u @useio
|
|
s rec=$ze(rec,rel,$zl(rec))_nextrec,rel=1
|
|
q
|
|
;----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
CREATE
|
|
k contents,nams,regs,segs,tmpreg,tmpseg
|
|
s update=1
|
|
s header=$tr($j("",SIZEOF("gd_header")-16)," ",ZERO)
|
|
s nams=2,(nams("*"),nams("#"))=defreg
|
|
s regs=1,regs(defreg,"DYNAMIC_SEGMENT")=defseg,reg="regs(defreg)"
|
|
d cretmps
|
|
s x=""
|
|
f s x=$o(tmpreg(x)) q:'$l(x) s @reg@(x)=tmpreg(x)
|
|
s segs=1
|
|
s am=tmpacc d maktseg
|
|
q
|
|
cretmps:
|
|
s tmpreg("ALIGNSIZE")=4096
|
|
s tmpreg("ALLOCATION")=2048
|
|
s tmpreg("AUTOSWITCHLIMIT")=8386560
|
|
s tmpreg("BEFORE_IMAGE")=1
|
|
s tmpreg("BUFFER_SIZE")=2308
|
|
s tmpreg("COLLATION_DEFAULT")=0
|
|
s tmpreg("EPOCH_INTERVAL")=300
|
|
s tmpreg("EXTENSION")=2048
|
|
s tmpreg("FILE_NAME")=""
|
|
s tmpreg("JOURNAL")=0
|
|
s tmpreg("INST_FREEZE_ON_ERROR")=0
|
|
s tmpreg("KEY_SIZE")=64
|
|
s tmpreg("NULL_SUBSCRIPTS")=0
|
|
s tmpreg("QDBRUNDOWN")=0
|
|
s tmpreg("RECORD_SIZE")=256
|
|
s tmpreg("STDNULLCOLL")=0
|
|
s tmpreg("SYNC_IO")=0
|
|
s tmpreg("YIELD_LIMIT")=8
|
|
;s tmpreg("STOP_ENABLED")=1
|
|
s tmpseg("BG","ACCESS_METHOD")="BG"
|
|
s tmpseg("BG","ALLOCATION")=100
|
|
s tmpseg("BG","BLOCK_SIZE")=1024
|
|
s tmpseg("BG","BUCKET_SIZE")=""
|
|
s tmpseg("BG","DEFER")=""
|
|
s tmpseg("BG","EXTENSION_COUNT")=100
|
|
s tmpseg("BG","FILE_TYPE")="DYNAMIC"
|
|
s tmpseg("BG","GLOBAL_BUFFER_COUNT")=defglo
|
|
s tmpseg("BG","RESERVED_BYTES")=0
|
|
s tmpseg("BG","LOCK_SPACE")=40
|
|
s tmpseg("BG","WINDOW_SIZE")=""
|
|
s tmpseg("BG","ENCRYPTION_FLAG")=0
|
|
d tmpmm
|
|
s tmpseg("USER","ACCESS_METHOD")="USER"
|
|
s tmpseg("USER","ALLOCATION")=""
|
|
s tmpseg("USER","BLOCK_SIZE")=""
|
|
s tmpseg("USER","BUCKET_SIZE")=""
|
|
s tmpseg("USER","DEFER")=""
|
|
s tmpseg("USER","EXTENSION_COUNT")=""
|
|
s tmpseg("USER","FILE_TYPE")="DYNAMIC"
|
|
s tmpseg("USER","GLOBAL_BUFFER_COUNT")=""
|
|
s tmpseg("USER","RESERVED_BYTES")=0
|
|
s tmpseg("USER","LOCK_SPACE")=""
|
|
s tmpseg("USER","WINDOW_SIZE")=""
|
|
s tmpseg("USER","ENCRYPTION_FLAG")=0
|
|
s tmpacc="BG"
|
|
q
|
|
tmpmm: s tmpseg("MM","ACCESS_METHOD")="MM"
|
|
s tmpseg("MM","ALLOCATION")=100
|
|
s tmpseg("MM","BLOCK_SIZE")=1024
|
|
s tmpseg("MM","BUCKET_SIZE")=""
|
|
s tmpseg("MM","DEFER")=1
|
|
s tmpseg("MM","EXTENSION_COUNT")=100
|
|
s tmpseg("MM","FILE_TYPE")="DYNAMIC"
|
|
s tmpseg("MM","GLOBAL_BUFFER_COUNT")=1024
|
|
s tmpseg("MM","RESERVED_BYTES")=0
|
|
s tmpseg("MM","LOCK_SPACE")=40
|
|
s tmpseg("MM","WINDOW_SIZE")=""
|
|
s tmpseg("MM","ENCRYPTION_FLAG")=0
|
|
q
|
|
maktseg: s segs(defseg,"FILE_NAME")=defdb
|
|
s seg="segs(defseg)",x=""
|
|
f s x=$o(tmpseg(am,x)) q:'$l(x) s @seg@(x)=tmpseg(am,x)
|
|
q
|
|
v44init:
|
|
s SIZEOF("am_offset")=308
|
|
s SIZEOF("file_spec")=256
|
|
s SIZEOF("gd_header")=16
|
|
s SIZEOF("gd_contents")=44
|
|
s SIZEOF("gd_map")=12
|
|
s SIZEOF("gd_region")=316
|
|
s SIZEOF("gd_segment")=320
|
|
s SIZEOF("mident")=8
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
s SIZEOF("gd_region_padding")=0
|
|
s MAXNAMLN=SIZEOF("mident"),MAXREGLN=16,MAXSEGLN=16
|
|
i ver'="VMS" s SIZEOF("blk_hdr")=8
|
|
e s SIZEOF("blk_hdr")=7
|
|
q
|
|
v5ft1init:
|
|
s SIZEOF("am_offset")=324
|
|
s SIZEOF("file_spec")=256
|
|
s SIZEOF("gd_header")=16
|
|
s SIZEOF("gd_contents")=44
|
|
s SIZEOF("gd_map")=36
|
|
s SIZEOF("gd_region")=332
|
|
s SIZEOF("gd_segment")=336
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
s SIZEOF("gd_region_padding")=0
|
|
i ver'="VMS" s SIZEOF("blk_hdr")=8
|
|
e s SIZEOF("blk_hdr")=7
|
|
q
|
|
v532init:
|
|
s SIZEOF("am_offset")=324
|
|
s SIZEOF("file_spec")=256
|
|
s SIZEOF("gd_header")=16
|
|
s SIZEOF("gd_contents")=44
|
|
s SIZEOF("gd_map")=36
|
|
s SIZEOF("gd_region")=332
|
|
s SIZEOF("gd_segment")=336
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
i (gtm64=TRUE) s SIZEOF("gd_region_padding")=4
|
|
e s SIZEOF("gd_region_padding")=0
|
|
;s MAXNAMLN=SIZEOF("mident")-1,MAXREGLN=32,MAXSEGLN=32
|
|
;s PARNAMLN=31,PARREGLN=31,PARSEGLN=31
|
|
i ver'="VMS" s SIZEOF("blk_hdr")=16
|
|
e s SIZEOF("blk_hdr")=7
|
|
q
|
|
v533init:
|
|
s SIZEOF("am_offset")=324
|
|
s SIZEOF("file_spec")=256
|
|
s SIZEOF("gd_header")=16
|
|
s SIZEOF("gd_contents")=44
|
|
s SIZEOF("gd_map")=36
|
|
s SIZEOF("gd_region")=332
|
|
s SIZEOF("gd_segment")=340
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
i (gtm64=TRUE) s SIZEOF("gd_region_padding")=4
|
|
e s SIZEOF("gd_region_padding")=0
|
|
s MAXNAMLN=SIZEOF("mident")-1,MAXREGLN=32,MAXSEGLN=32
|
|
s PARNAMLN=31,PARREGLN=31,PARSEGLN=31
|
|
i ver'="VMS" s SIZEOF("blk_hdr")=16
|
|
e s SIZEOF("blk_hdr")=7
|
|
q
|
|
v534init:
|
|
s SIZEOF("am_offset")=332
|
|
s SIZEOF("file_spec")=256
|
|
s SIZEOF("gd_header")=16
|
|
s SIZEOF("gd_contents")=80
|
|
s SIZEOF("gd_map")=40
|
|
s SIZEOF("gd_region")=344
|
|
s SIZEOF("gd_segment")=352
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("blk_hdr")=16
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
i (gtm64=TRUE) s SIZEOF("gd_region_padding")=4
|
|
e s SIZEOF("gd_region_padding")=0
|
|
s MAXNAMLN=SIZEOF("mident")-1,MAXREGLN=32,MAXSEGLN=32 ; maximum name length allowed is 31 characters
|
|
s PARNAMLN=31,PARREGLN=31,PARSEGLN=31
|
|
q
|
|
v542init:
|
|
i (olabel="GTCGBLDIR009")!(olabel="GTCGBDUNX006") d ; 32-bit
|
|
. s SIZEOF("am_offset")=324
|
|
. s SIZEOF("file_spec")=256
|
|
. s SIZEOF("gd_header")=16
|
|
. s SIZEOF("gd_contents")=44
|
|
. s SIZEOF("gd_map")=36
|
|
. s SIZEOF("gd_region")=332
|
|
. s SIZEOF("gd_region_padding")=0
|
|
. if (olabel="GTCGBLDIR009") s SIZEOF("gd_segment")=336 ; VMS
|
|
. e s SIZEOF("gd_segment")=340
|
|
e d ; 64-bit
|
|
. s SIZEOF("am_offset")=332
|
|
. s SIZEOF("file_spec")=256
|
|
. s SIZEOF("gd_header")=16
|
|
. s SIZEOF("gd_contents")=80
|
|
. s SIZEOF("gd_map")=40
|
|
. s SIZEOF("gd_region")=344
|
|
. s SIZEOF("gd_region_padding")=4
|
|
. s SIZEOF("gd_segment")=360
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("blk_hdr")=16
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=2
|
|
s MAXNAMLN=SIZEOF("mident")-1,MAXREGLN=32,MAXSEGLN=32 ; maximum name length allowed is 31 characters
|
|
s PARNAMLN=31,PARREGLN=31,PARSEGLN=31
|
|
q
|
|
v550init:
|
|
i (olabel="GTCGBDUNX007") d
|
|
. s SIZEOF("am_offset")=324
|
|
. s SIZEOF("file_spec")=256
|
|
. s SIZEOF("gd_header")=16
|
|
. s SIZEOF("gd_contents")=44
|
|
. s SIZEOF("gd_map")=36
|
|
. s SIZEOF("gd_region")=356
|
|
. s SIZEOF("gd_region_padding")=2
|
|
. s SIZEOF("gd_segment")=340
|
|
e d
|
|
. s SIZEOF("am_offset")=332
|
|
. s SIZEOF("file_spec")=256
|
|
. s SIZEOF("gd_header")=16
|
|
. s SIZEOF("gd_contents")=80
|
|
. s SIZEOF("gd_map")=40
|
|
. s SIZEOF("gd_region")=368
|
|
. s SIZEOF("gd_region_padding")=6
|
|
. s SIZEOF("gd_segment")=360
|
|
s SIZEOF("mident")=32
|
|
s SIZEOF("blk_hdr")=16
|
|
s SIZEOF("rec_hdr")=3
|
|
s SIZEOF("dsk_blk")=512
|
|
s SIZEOF("max_str")=32767
|
|
s SIZEOF("reg_jnl_deq")=4
|
|
s MAXNAMLN=SIZEOF("mident")-1,MAXREGLN=32,MAXSEGLN=32 ; maximum name length allowed is 31 characters
|
|
s PARNAMLN=31,PARREGLN=31,PARSEGLN=31
|
|
q
|