! ISMBG2.BAS --- demonstrate bizarre bug in ISAM function 1 ! This problem occurs on AMOS 2.2C(452)-9 using ISAM.LIT ! This program compiles with /M. Use in conjunction with ISMBG2.CMD ! Bob Fowler, Applied Systems Research, 1994-Oct-19 ! THE PROBLEM: ! AlphaBASIC ISAM calls using X format variables generally work ok. ! The ISAM routines in SYSSTD,ISMSYM,ISMSBR,ERRSBR operate this way. ! If a string variable is passed, however, the calls will often fail. ! In particular, "ISAM #chan,1,string" (find key) may return an ERF ! error code 33 (key not found) when in fact the key actually exists. ! The program below demonstrates circumstances in which this occurs. ! The size of a displayed string effects the fate of the ISAM call, ! even though the display has absolutely nothing to do with the call. ! If a string of 6 characters is displayed, no problem occurs. ! If a string of 7 characters is displayed, the problem occurs, but ! a subsequent call with 6 characters displayed will cure the problem. ! If a string of 8 characters is displayed, the problem occurs, and ! will not go away until the program is exited and rerun. ! To demonstrate problem: ! (1) execute ISMBG2.CMD first ! (2) RUN ISMBG2.RUN to add new key and exit ! (3) RUN ISMBG2.RUN again to demonstrate problem MAP1 KeyX,X,15 MAP1 KeyS,S,15 ! increasing to 16 or 64 does not help MAP1 KeyS1,@KeyS MAP2 KeyS2,X,15 MAP1 Option,S,1 MAP1 I,F,6 MAP1 Length,F,6 MAP1 RELKEY,F,6 MAP1 Buffer,S,100 OPEN #1000, "ISMBG2", INDEXED, 256, RELKEY GetOpt: Option = "E" INPUT "Enter E(nd) A(dd) S(tring) X(unformatted): ", Option IF Option = "E" THEN END IF Option = "A" THEN GOTO Add IF Option = "S" THEN GOTO Try IF Option = "X" THEN GOTO Try GOTO GetOpt Add: KeyS = "ABCDE" : Buffer = KeyS KeyX = KeyS ! make sure that add works ISAM #1000, 1, KeyX IF ERF(1000) = 0 THEN PRINT "Record exists" : GOTO AddEnd IF ERF(1000) # 33 THEN PRINT "ERF"; ERF(1000) : END PRINT "ADDING KEY" ISAM #1000, 5, KeyX WRITEL #1000, Buffer ISAM #1000, 3, KeyX AddEnd: UNLOKR #1000 ! adding record causes problem to occur permanently GOTO GetOpt Try: INPUT "Length of dummy string (6,7,8): ", Length ! printing 6/7/8 x's causes no/temporary/permanent problem - bizarre!!! IF Length = 6 THEN PRINT "xxxxxx" IF Length = 7 THEN PRINT "xxxxxxx" IF Length = 8 THEN PRINT "xxxxxxxx" NxtTry: ! KeyS = "" ! does NOT fix problem KeyS = "ABCDE" ! key exists in file KeyX = KeyS ! doesn't cause problem IF Option = "S" THEN ISAM #1000, 1, KeyS ! gets IF Option = "X" THEN ISAM #1000, 1, KeyX ! always ok ! printing following causes problem to occur permanently ! FOR I = 1 TO 15 : PRINT ASC(KeyS2[I,I]); : NEXT I : PRINT ! the problem: following prints a phoney error 33 (record not found) PRINT "Error"; ERF(1000) UNLOKR #1000 GOTO GetOpt