10 ! ISAM Example Program
20 !
30 ! This program is a simple example of how to handle ISAM files, both
40 ! primary and secondary.  It simulates a very simple-minded mailing
50 ! list program, with the addresses keyed by both name and by user
60 ! defined hash code.
70 !
80 ! Define the Mailing List file record
90 !
100 MAP1 LABEL
110     MAP2 NAME,S,25
120     MAP2 ADDRESS,S,25
130     MAP2 STATE,S,2
140     MAP2 ZIP,S,5
150     MAP2 HASH,S,10
160
170 ! Define record sizes
180
190 MAP1 RECSIZE,F,6,67                         ! Size of data record
200
210 ! Open the primary and secondary files
220     OPEN #1, "LABELS", INDEXED, RECSIZE, RELKEY1
230     OPEN #2, "HASH", INDEXED, RECSIZE, RELKEY1
240
250 PROMPT:
260     PRINT
270     INPUT "ENTER FUNCTION (1=ADD,2=DELETE,3=INQUIRE,4=PRINT,99=END): "; FUNCTION
280     ON FUNCTION GOTO ADD'RECORD,DELETE'RECORD,INQUIRE'RECORD,PRINT'LABELS
290     IF FUNCTION = 99 THEN GOTO END'IT
300     GOTO PROMPT
310
320 ADD'RECORD:
330     INPUT "ENTER NAME: "; NAME
340     INPUT "ENTER ADDRESS: "; ADDRESS
350     INPUT "ENTER STATE: "; STATE
360     INPUT "ENTER ZIP: "; ZIP
370     INPUT "ENTER HASH: "; HASH
380 ! Add trailing blanks to the keys
390     NAME = NAME + SPACE(25-LEN(NAME))
400     HASH = HASH + SPACE(25-LEN(HASH))
410 ! Verify name is not duplicate by looking it up
420     ISAM #1, 1, NAME
430     IF ERF(1) = 0 THEN PRINT "DUPLICATE NAME" : GOTO ADD'RECORD
440 ! Verify hash is no duplicate
450     ISAM #2, 1, HASH
460     IF ERF(2) = 0 THEN PRINT "DUPLICATE HASH" : GOTO ADD'RECORD
470 ! Get free data record from primary file & write record out
480     ISAM #1, 5, NAME
490     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
500     WRITE #1, LABEL
510 ! Add key to primary file
520     ISAM #1, 3, NAME
530     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
540 ! Add key to secondary file
550     ISAM #2, 3, HASH
560     IF ERF(2) <> 0 THEN GOTO ISAM'ERROR
570     GOTO PROMPT
580
590 DELETE'RECORD:
600     INPUT "ENTER NAME: "; NAME
610     NAME = NAME + SPACE(25-LEN(NAME))
620 ! Verify the key exists
630     ISAM #1, 1, NAME
640     IF ERF(1) = 33 THEN PRINT "RECORD NOT FOUND" : GOTO PROMPT
650     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
660     READ #1, LABEL
670 ! Delete the data record
680     ISAM #1, 6, NAME
690     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
700 ! Delete the key from the primary index
710     ISAM #1, 4, NAME
720     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
730 ! Delete the key from the secodary index
740     ISAM #2, 4, HASH
750     IF ERF(2) <> 0 THEN GOTO ISAM'ERROR
760     GOTO PROMPT
770
780 INQUIRE'RECORD:
790     INPUT "BY NAME (1) OR HASH (2): "; FUNCTION
800     IF FUNCTION = 2 THEN GOTO BY'HASH
810     INPUT "NAME: "; NAME
820     NAME = NAME + SPACE(25-LEN(NAME))
830 ! Locate the record
840     ISAM #1, 1, NAME
850     IF ERF(1) = 33 THEN PRINT "RECORD NOT FOUND" : GOTO PROMPT
860     IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
870 ! Read the record
880 READ'RECORD:
890     READ #1, LABEL
900     PRINT NAME, HASH
910     PRINT ADDRESS, STATE, ZIP
920     GOTO PROMPT
930 ! Locate record by hash code
940 BY'HASH:
950     INPUT "HASH: "; HASH
960     HASH = HASH + SPACE(10-LEN(HASH))
970     ISAM #2, 1, HASH
980     IF ERF(2) = 33 THEN PRINT "RECORD NOT FOUND" : GOTO PROMPT
990     IF ERF(2) <> 0 THEN GOTO ISAM'ERROR
1000    GOTO READ'RECORD
1010
1020 PRINT'LABELS:
1030 ! Read null key to get to front of file
1040    NAME = SPACE(25)
1050    ISAM #1, 1, NAME
1060 ! Loop thru file doing sequential reads until we hit the end
1070 LOOP:
1080    ISAM #1, 2, NAME
1090    IF ERF(1) = 38 THEN GOTO PROMPT         ! we hit end-of-file
1100    IF ERF(1) <> 0 THEN GOTO ISAM'ERROR
1110    READ #1, LABEL
1120    PRINT
1130    PRINT NAME, HASH
1140    PRINT ADDRESS, STATE, ZIP
1150    GOTO LOOP
1160
1170 END'IT:
1180 ! Be sure and close files before we exit
1190    CLOSE #1
1200    CLOSE #2
1210    END
1220
1230 ISAM'ERROR:
1240    PRINT "?FATAL ISAM ERROR"
1250    END