[Info-vax] Date field in MAIL.MAI record?
Hein RMS van den Heuvel
heinvandenheuvel at gmail.com
Mon Jul 11 10:44:11 EDT 2011
On Jul 11, 7:36 am, gartm... at nonsense.immunbio.mpg.de (Christoph
Gartmann) wrote:
> Hello,
>
> anyone out there familiar with the structure of MAIL.MAI records? Specifically
> I need to know the position and length of the date field. I assume it is a
> quadword. True?
Indeed, a regular OpenVMS 64 bit date & time.
The primary key is a slight variation on the date.
Any particular language? Here is an old DCL script I had.
It uses the primary key to start reading after a provided start date
range.
$ type [.MAIL_EXAMPLES]MAIL_LIST.COM
$start:
$i = 0
$key = "12345678"
$if p2.eqs."" then p2 = "MAIL.MAI"
$if p1.eqs."" then p1 = 8 ! No mails older than 5-JAN-1866 5:59:41.36
$start_date = p1 ! 96="2-Sep-1992", 97="24-Jul-1993", 98="15-Jun-1994"
$key[00,32]=%x00000001
$key[32,32]=%x'p1'0000
$OPEN/READ/SHARE=WRITE/ERROR=Oooops file 'p2'
$READ/MATCH=GE/KEY=&key file rec ! Position in file
$loop:
$READ/END=Done file rec ! Ok, so we do not process the first
record...
$ i = i + 1
$bin_date = F$EXTRACT(0,8,rec)
$asc_date = F$FAO("!%D",f$cvui(32,32,f$fao("!AD",8,bin_date)))
$k1 = F$FAO("!XL", F$CVSI(0,32,rec))
$k2 = F$FAO("!XL", F$CVSI(32,32,rec))
$write sys$output k2, " ", k1, " ", asc_date, " ", i
$goto loop
$Done:
$WRITE sys$output i, " messages processed in total."
$CLOSE file
$EXIT
AA = Jul - 2010
AB = May - 2011
$ @[.MAIL_EXAMPLES]MAIL_LIST.COM AB [.VMSMAIL]mail.mai
00AB14C5 41340000 23-JUN-2011 00:30:45.25 1
00AB14C5 41450000 23-JUN-2011 00:30:45.36 2
00AB14C5 41570000 23-JUN-2011 00:30:45.48 3
00AB14C5 4AC00000 23-JUN-2011 00:31:01.27 4
00AB14C5 4AD30000 23-JUN-2011 00:31:01.39 5
00AB14C5 7B750000 23-JUN-2011 00:32:22.99 6
6 messages processed in total.
And here some more DCL code to check external flag and/or message
record.
$READ/END=Done file rec
$bin_date = F$EXTRACT(0,8,rec)
$asc_date = F$FAO("!%D",f$cvui(32,32,f$fao("!AD",8,bin_date)))
$k1 = F$FAO("!XL", F$CVSI(0,32,rec))
$k2 = F$FAO("!XL", F$CVSI(32,32,rec))
$if F$CVSI(387,1,rec) then goto loop ! bit 3, byte 48, external flag.
$ i = i + 1
$mes[00,32]=F$CVSI(16,32,rec)
$mes[32,16]=F$CVSI(48,16,rec)
$READ/MATCH=EQ/KEY=&mes/ERRO=not_found mess message
note: this READ /KEY=&xxx where xxx is binary does NOT work if any
byte value happens to be a double quote. I have workarounds for that,
or just use a real language like Macro :-)
hth,
Hein
More information about the Info-vax
mailing list