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