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