|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 21888 (0x5580)
Types: TextFile
Names: »DATABAS1.PLI«
└─⟦57f0389e8⟧ Bits:30005761 SW1611 Access Manager v. 1.0
└─⟦this⟧ »DATABAS1.PLI«
DATABASE:
PROC OPTIONS (MAIN);
/* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DATABASE EXAMPLE VERSION 1.0 01/06/83 0916
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
%INCLUDE 'DATABASE.DCL';
/*
INTERFACE TO AM86(tm)
AM86EXTR.PLI CONTAINS THE EXTERNAL DEFINITIONS OF THE AM-86 ROUTINES
*/
%INCLUDE 'AM86EXTR.PLI';
DCL
DUMMY_KEY FIXED,
ENTDAT ENTRY (CHAR(3),FIXED) RETURNS (CHAR(ACTION_LEN));
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SET-UP DATABASE FIELD & KEY DESCRIPTORS
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
NO_FIELDS = MAX_FIELD + 1;
FLD_NAME(0) = 'Customer Number';
FLD_LEN(0) = 4;
FLD_NAME(1) = 'First Name';
FLD_LEN(1) = 16;
FLD_NAME(2) = 'Last Name';
FLD_LEN(2) = 20;
FLD_NAME(3) = 'Street Address';
FLD_LEN(3) = 20;
FLD_NAME(4) = 'City';
FLD_LEN(4) = 20;
FLD_NAME(5) = 'State';
FLD_LEN(5) = 2;
FLD_NAME(6) = 'Zipcode';
FLD_LEN(6) = 9;
FLD_NAME(7) = 'Customer Status';
FLD_LEN(7) = 8;
DCL
DATBUF_PTR POINTER,
1 CUST_REC,
2 CDF CHAR(1),
2 CNO CHAR(4),
2 CFN CHAR(16),
2 CLN CHAR(20),
2 CST CHAR(20),
2 CTY CHAR(20),
2 CSA CHAR(2),
2 CZP CHAR(9),
2 CSU CHAR(8);
KEY_LEN(0)=10;
KEY_TYPE(0)=0;
KEY_MAP(0)=2 ; /* KEY 0 = LAST NAME */
KEY_LEN(1)=11;
KEY_TYPE(1)=0;
KEY_MAP(1)=6 ; /* KEY 1 = ZIPCODE */
KEY_LEN(2)=4 ;
KEY_TYPE(2)=0;
KEY_MAP(2)=0 ; /* KEY 2 = CUST NUMBER */
UNIQ_KEY = 2 ; /* USED IN TEST OF UNIQUENESS */
DO KEY = 0 TO MAX_KEY;
IF KEY = UNIQ_KEY THEN
KEY_DUP(KEY) = NO;
ELSE
KEY_DUP(KEY) = YES;
KEY_NAME(KEY) = FLD_NAME(KEY_MAP(KEY));
END;
IDX_NAME(0) = 'NAME.IDX';
IDX_NAME(1) = 'ZIPC.IDX';
IDX_NAME(2) = 'NUMB.IDX';
NLOCK = 0; /* IGNORE LOCKS */
SLOCK = 1; /* SHARED RECORD LOCK */
XLOCK = 2; /* EXCLUSIVE RECORD LOCK */
SFILE = 3; /* SHARED FILE LOCK */
XFILE = 4; /* EXCLUSIVE FILE LOCK */
RLOCK = 5; /* RELEASE SLOCK OR XLOCK */
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
INITIALIZE INDEX FILES
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
SET_LENGTH = '12345678901';
IDX_KEY = SET_LENGTH;
SPACE = ' ';
/*
SET TERMINAL TO -1 FOR AUTOMATIC ASSIGNMENT BY AM-86
*/
TERMINAL = -1;
TRAP_ERRORS = YES;
TIME_OUT_TEST_DELAY = 2; /* APPROXIMATELY 2 SECONDS */
TERMINAL = INTUSR(TERMINAL,TRAP_ERRORS,TIME_OUT_TEST_DELAY);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(0,14);
NO_BUFFERS = 5;
NO_NODE_SECTORS = 4;
NO_DATA_FILES = 1;
NO_KEYS = MAX_KEY + 1;
IF SETUP(NO_BUFFERS,NO_KEYS,NO_NODE_SECTORS,NO_DATA_FILES) ü= 0 THEN
DO;
PUT SKIP LIST('Illegal SETUP Parameters');
STOP;
END;
DUMMY_KEY = -1;
DO KEY = 0 TO MAX_KEY;
KEY_NUM(KEY) = OPNIDX(DUMMY_KEY,IDX_NAME(KEY),
KEY_LEN(KEY), KEY_TYPE(KEY),KEY_DUP(KEY));
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(KEY,1);
END;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
INITIALIZE DATA FILE
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
FILE_NO = -1;
RECORD_LENGTH = 100;
FILNAME = 'CUSTOMER.DAT';
FILE_NO = OPNDAT(FILE_NO,SFILE,FILNAME,RECORD_LENGTH);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(0,10);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(1);
/*
CUST_REC IS THE DATA FILE BUFFER AREA
*/
DATBUF_PTR = ADDR(CUST_REC);
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
BEGIN DATABASE OPERATION
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
OPEN FILE (SYSCON) OUTPUT TITLE('$CON');
OPEN FILE (SYSLST) OUTPUT TITLE('$LST');
FOR_EVER = YESBIT;
DO WHILE (FOR_EVER);
CALL DATA_BASE();
END;
DATA_BASE:
PROC;
DCL
(LOCK_CODE,NDRN,DRN,CHOICE) FIXED,
(SAVE_KEY,LDRN,NO_LISTED) FIXED,
ROUTE CHAR(1),
(CONTINUE,STAYPUT) BIT(1),
(L_VALUE,U_VALUE,CONV_TARGET,TARGET) CHAR(MAX_KEY_LEN) VAR,
ACTION CHAR(ACTION_LEN);
CALL CLRSCR();
CHOICE = MAIN_MENU();
GOTO DB(CHOICE);
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ENTER NEW CUSTOMERS
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(1):
ACTION = ENTDAT('NEW',0);
LOCK_CODE = 0;
IF ACTION = 'SAVE' THEN
DO;
NDRN = UPDATE(0);
LOCK_CODE = FRELOK(FILE_NO,XLOCK,NDRN);
END;
IF LOCK_CODE ü= 0 THEN
CALL LOKTYP(8);
IF ACTION = 'SAVE' THEN
GOTO DB(1);
ELSE
RETURN;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SCAN/UPDATE/DELETE CUSTOMERS
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(2):
KEY = SEARCH_KEY();
PUT SKIP(2) EDIT ('Enter target value for ',KEY_NAME(KEY),',',
' or enter a period (.) to see main menu>>')
(3A,SKIP,A);
GET LIST (TARGET);
IF TARGET = '.' THEN RETURN;
CONV_TARGET = KEY_FORMAT(KEY,TARGET);
STAYPUT = YESBIT;
DO WHILE (STAYPUT);
DRN = SERKEY(KEY_NUM(KEY),FILE_NO,SLOCK,
CONV_TARGET,IDX_KEY);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(KEY,2);
IF LOKCOD() ü= 0 THEN
STAYPUT = CHECK_LOCK(KEY,DRN);
ELSE
STAYPUT =NOBIT;
END;
OLD_ACTION = 'CONT';
CONTINUE = YESBIT;
DO WHILE (CONTINUE & DRN ü= 0);
LDRN = DRN;
CALL READ_CUST(DRN);
ACTION = ENTDAT('OLD',DRN);
SAVE_KEY = KEY;
IF ACTION = 'SAVE' THEN
DRN = UPDATE(DRN);
IF ACTION = 'DELT' THEN
CALL DELETE(DRN);
IF ACTION ü= 'DELT' & FRELOK(FILE_NO,RLOCK,LDRN) ü= 0
THEN CALL LOKTYP(2);
IF ACTION = 'SAVE' ø ACTION = 'DELT' THEN
DO;
KEY = SAVE_KEY;
ACTION = OLD_ACTION;
END;
OLD_ACTION = ACTION;
CONV_TARGET = SUBSTR(IDX_KEY,1,KEY_LEN(KEY));
IDX_KEY = SET_LENGTH;
LOCK_CODE = 0;
STAYPUT = YESBIT;
DO WHILE (STAYPUT);
IF ACTION = 'CONT' THEN
DO;
DRN = AFTKEY(KEY_NUM(KEY),FILE_NO,
SLOCK, CONV_TARGET,IDX_KEY);
LOCK_CODE = LOKCOD();
END;
IF ACTION = 'BACK' THEN
DO;
DRN = BEFKEY(KEY_NUM(KEY),FILE_NO,
SLOCK, CONV_TARGET,IDX_KEY);
LOCK_CODE = LOKCOD();
END;
IF LOCK_CODE ü= 0 THEN
STAYPUT = CHECK_LOCK(KEY,DRN);
ELSE
STAYPUT = NOBIT;
END;
IF ACTION = 'STOP' THEN
CONTINUE = NOBIT;
END;
PUT SKIP(2) LIST ('SCAN ENDED');
CALL PAUSE();
RETURN;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
LIST CUSTOMERS
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(3):
KEY = SEARCH_KEY();
PUT SKIP(2) LIST (
'Do you want listing routed to printer (Y/N) >>');
GET LIST (ROUTE);
IF ROUTE = 'y' THEN ROUTE = 'Y';
PUT SKIP(3) EDIT (
'Enter lower and upper limits for ',KEY_NAME(KEY),' listing',
' separate values with a space >>') (3A,SKIP,A);
GET LIST (L_VALUE,U_VALUE);
L_VALUE = KEY_FORMAT(KEY,L_VALUE);
U_VALUE = KEY_FORMAT(KEY,U_VALUE);
DRN = SERKEY(KEY_NUM(KEY),FILE_NO,SLOCK,
L_VALUE,IDX_KEY);
IF LOKCOD() ü= 0 THEN
CALL SKIP_LOCK(KEY,DRN);
NO_LISTED = 0;
DO WHILE (DRN ü= 0 & COMPARE(KEY,IDX_KEY,U_VALUE) <= 0);
CALL READ_CUST(DRN);
CALL PRINT_CUST(ROUTE);
NO_LISTED = NO_LISTED + 1;
IF FRELOK(FILE_NO,SLOCK,DRN) ü= 0 THEN
CALL LOKTYP(4);
L_VALUE = SUBSTR(IDX_KEY,1,KEY_LEN(KEY));
IDX_KEY = SET_LENGTH;
DRN = AFTKEY(KEY_NUM(KEY),FILE_NO,SLOCK,
L_VALUE,IDX_KEY);
IF LOKCOD() ü= 0 THEN
CALL SKIP_LOCK(KEY,DRN);
END;
IF DRN ü= 0 THEN
LOCK_CODE = FRELOK(FILE_NO,SLOCK,DRN);
ELSE
LOCK_CODE = 0;
IF LOCK_CODE ü= 0 THEN
CALL LOKTYP(5);
PUT SKIP(2) EDIT (NO_LISTED,' records listed.') (F(6),A);
CALL PAUSE();
RETURN;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DATABASE STATISTICS
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(4):
CALL CLRSCR();
PUT SKIP EDIT (FILNAME,' has ',GETDFS(FILE_NO),
' records; currently, ',GETDFU(FILE_NO),
' of them are in use.') (2A,F(6),A,F(6),A);
PUT SKIP(4) EDIT (' INDEX','ENTRIES') (A,COLUMN(30),A);
PUT SKIP EDIT ('-----------------','-------') (A,COLUMN(30),A);
DO KEY = 0 TO MAX_KEY;
PUT SKIP EDIT (KEY_NAME(KEY),NOKEYS(KEY)) (A,COLUMN(30),F(6));
END;
PUT SKIP(4);
CALL PAUSE();
RETURN;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SAVE DATABASE UPDATES & RESTART
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(5):
IF SAVDAT(FILE_NO) ü= 0 THEN
CALL ERROR_TYPE(0,7);
DO KEY = 0 TO MAX_KEY;
IF SAVIDX(KEY_NUM(KEY)) ü= 0 THEN
CALL ERROR_TYPE(KEY,3);
END;
RETURN;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SAVE DATABASE UPDATES & TERMINATE
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DB(6):
CLOSE FILE (SYSLST);
IF CLSDAT(FILE_NO) ü= 0 THEN
CALL ERROR_TYPE(0,15);
DO KEY = 0 TO MAX_KEY;
IF CLSIDX(KEY_NUM(KEY)) ü= 0 THEN
CALL ERROR_TYPE(KEY,16);
END;
IF FRELOK(FILE_NO,SFILE,0) ü= 0 THEN
CALL ERROR_TYPE(0,13);
PUT SKIP(2) LIST (' *** SUCCESSFUL TERMINATION ***');
STOP;
END DATA_BASE;
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BEGINNING OF UTILITY FUNCTIONS
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CLEAR SCREEN ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
CLRSCR:
PROC EXTERNAL;
DCL
DUMMY FIXED BINARY(7);
DO DUMMY = 1 TO 24;
PUT SKIP;
END;
END CLRSCR;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MAIN MENU ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
MAIN_MENU:
PROC RETURNS (FIXED);
DCL
OP FIXED;
PUT SKIP EDIT (' AM-86(tm) DEMONSTRATION') (X(20),A);
PUT SKIP(2) EDIT(' Customer Database Operations') (X(20),A);
PUT SKIP EDIT(' Terminal ',TERMINAL) (X(20),A,F(2));
PUT SKIP EDIT(' ****************************') (X(20),A);
PUT SKIP(3) EDIT('1. Enter New Customers') (X(5),A);
PUT SKIP EDIT('2. Scan/Update/Delete Customer Records') (X(5),A);
PUT SKIP EDIT('3. List Customer Records') (X(5),A);
PUT SKIP EDIT('4. Database Statistics') (X(5),A);
PUT SKIP EDIT('5. Save All Files & Restart Operations') (X(5),A);
PUT SKIP EDIT('6. Terminate Operations') (X(5),A);
OP = 0;
DO WHILE (OP < 1 ø OP > 6);
PUT SKIP(2) LIST ('Enter desired operation number>>');
GET LIST (OP);
END;
RETURN(OP);
END MAIN_MENU;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SELECT SEARCH KEY ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
SEARCH_KEY:
PROC RETURNS (FIXED);
DCL
(KEY,KEY_NO) FIXED;
CALL CLRSCR();
PUT EDIT ('Customer Database Search Keys') (X(25),A);
PUT SKIP (3);
DO KEY = 0 TO MAX_KEY;
KEY_NO = KEY + 1;
PUT SKIP EDIT(KEY_NO,' - ',KEY_NAME(KEY)) (X(5),F(3),2A);
END;
KEY = 0;
DO WHILE (KEY < 1 ø KEY > NO_KEYS);
PUT SKIP(3) LIST('Enter desired key number>>');
GET LIST (KEY);
END;
RETURN(KEY-1);
END SEARCH_KEY;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ERROR HANDLING
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
ERROR_TYPE:
PROC (INFO,TYPE);
DCL
(T_KEY,INFO,DUMMY,TYPE) FIXED;
PUT SKIP(3) EDIT ('User Error #',ERRCOD(),' occurred while trying to ')
(A,F(4),A);
GOTO ET(TYPE);
ET(1): PUT EDIT ('open ',IDX_NAME(INFO)) (2A);
GOTO ET_STOP;
ET(2): PUT EDIT ('search ',KEY_NAME(INFO),' Index File') (3A);
GOTO ET_CLOSE;
ET(3): PUT EDIT('save ',IDX_NAME(INFO)) (2A);
GOTO ET_PCLOSE;
ET(4): PUT EDIT('remove old key from ',IDX_NAME(INFO)) (2A);
GOTO ET_CLOSE;
ET(5): PUT EDIT('enter key into ',IDX_NAME(INFO)) (2A);
GOTO ET_CLOSE;
ET(6): PUT EDIT('delete key from ',IDX_NAME(INFO)) (2A);
GOTO ET_CLOSE;
ET(7): PUT EDIT('save ',FILNAME) (2A);
INFO = -1;
GOTO ET_PCLOSE;
ET(8): PUT EDIT('get a new data record',' (',FILE_NO,')') (2A,F(3),A);
GOTO ET_STOP;
ET(9): PUT EDIT('delete data record #',INFO) (A,F(6));
GOTO ET_STOP;
ET(10): PUT EDIT('open ',FILNAME,' (',FILE_NO,')') (2A,F(3),A);
GOTO ET_STOP;
ET(11): PUT EDIT('read data record #',INFO) (A,F(6));
GOTO ET_STOP;
ET(12): PUT EDIT('write data record #',INFO) (A,F(6));
GOTO ET_STOP;
ET(13): PUT EDIT('release shared file lock on ',FILNAME) (2A);
GOTO ET_STOP;
ET(14): PUT EDIT('initialize user.') (A);
STOP;
ET(15): PUT EDIT('close ',FILNAME) (2A);
INFO = -1;
GOTO ET_PCLOSE;
ET(16): PUT EDIT('close ',IDX_NAME(INFO)) (2A);
GOTO ET_PCLOSE;
ET_CLOSE:
DUMMY = CLSDAT(FILE_NO);
DO T_KEY = 0 TO MAX_KEY;
IF T_KEY ü= INFO THEN DUMMY = CLSIDX(KEY_NUM(T_KEY));
END;
GOTO ET_STOP;
ET_PCLOSE:
T_KEY = INFO + 1;
IF T_KEY>MAX_KEY THEN STOP;
DO INFO = T_KEY TO MAX_KEY;
DUMMY = CLSIDX(KEY_NUM(INFO));
END;
ET_STOP:
PUT SKIP(2) EDIT('DEMONSTRATION TERMINATING WITH ERROR CODE #',
ERRCOD()) (A,F(4));
STOP;
END ERROR_TYPE;
LOKTYP:
PROC (TYPE) EXTERNAL;
DCL
(T_KEY,DUMMY,TYPE) FIXED;
PUT SKIP EDIT('Lock Type: ',TYPE,' Lock Code:',LOKCOD())
(A,F(3),A,F(3));
DUMMY = CLSDAT(FILE_NO);
DO T_KEY = 0 TO MAX_KEY;
DUMMY = CLSIDX(KEY_NUM(T_KEY));
END;
STOP;
END LOKTYP;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
STRIP TRAILING BLANKS
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
STRIP_BLANKS:
PROC (OLD_VAL) RETURNS(CHAR(MAX_FLD_LEN) VAR);
DCL
OLD_VAL CHAR(MAX_FLD_LEN),
(TEST,FLDLEN) FIXED;
FLDLEN = LENGTH(OLD_VAL);
DO TEST = FLDLEN TO 1 BY -1;
IF SUBSTR(OLD_VAL,TEST,1) ü= ' ' THEN
RETURN (SUBSTR(OLD_VAL,1,TEST));
END;
RETURN('');
END STRIP_BLANKS;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
READ DATA RECORD ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
READ_CUST:
PROC (DRN);
DCL
DRN FIXED;
IF READAT(FILE_NO,DRN,DATBUF_PTR) ü= 0 THEN
CALL ERROR_TYPE(DRN,11);
OLD_FLD(0) = STRIP_BLANKS(CNO);
OLD_FLD(1) = STRIP_BLANKS(CFN);
OLD_FLD(2) = STRIP_BLANKS(CLN);
OLD_FLD(3) = STRIP_BLANKS(CST);
OLD_FLD(4) = STRIP_BLANKS(CTY);
OLD_FLD(5) = STRIP_BLANKS(CSA);
OLD_FLD(6) = STRIP_BLANKS(CZP);
OLD_FLD(7) = STRIP_BLANKS(CSU);
END READ_CUST;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
LIST CUSTOMER RECORD ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
PRINT_CUST:
PROC (ROUTE);
DCL
ROUTE CHAR(1),
LIST_FILE FILE VARIABLE;
LFRMT:
FORMAT(X(28),5A);
IF ROUTE = 'Y' THEN
LIST_FILE = SYSLST;
ELSE
LIST_FILE = SYSCON;
PUT FILE(LIST_FILE) SKIP (2) EDIT(OLD_FLD(0),OLD_FLD(7))
(X(4),A,COLUMN(15),A);
PUT FILE(LIST_FILE) EDIT(OLD_FLD(1),' ',OLD_FLD(2)) (col(29),5A);
PUT FILE(LIST_FILE) SKIP EDIT(OLD_FLD(3)) (R(LFRMT));
PUT FILE(LIST_FILE) SKIP EDIT(OLD_FLD(4),', ',OLD_FLD(5),' ',OLD_FLD(6))
(R(LFRMT));
PUT FILE(LIST_FILE) SKIP;
END PRINT_CUST;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
PAUSE ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
PAUSE:
PROC;
DCL
DUMMY CHAR(1);
PUT SKIP(2) LIST ('Enter any character to continue ---');
GET LIST (DUMMY);
END PAUSE;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CONVERT TARGET VALUE TO KEY FORMAT ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
KEY_FORMAT:
PROC (KEY,TARGET) RETURNS (CHAR(MAX_KEY_LEN) VAR);
DCL
KEY FIXED,
TEMP CHAR(40) VAR,
TARGET CHAR(MAX_KEY_LEN) VAR;
IF UNIQ_KEY = KEY THEN
RETURN(TARGET);
ELSE
DO;
TEMP = TARGET øø SPACE;
RETURN(SUBSTR(TEMP,1,KEY_LEN(KEY)-2) øø
ASCII(0) øø ASCII(0));
END;
END KEY_FORMAT;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
COMPARE IDX_KEY & U_VALUE ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
COMPARE:
PROC (KEY,IDXVAL,UPVAL) RETURNS (FIXED);
DCL
(KL,KEY) FIXED,
(C1,C2) CHAR(40) VAR,
(IDXVAL,UPVAL) CHAR(MAX_KEY_LEN) VAR;
IF KEY = UNIQ_KEY THEN
KL = KEY_LEN(KEY);
ELSE
KL = KEY_LEN(KEY)-2;
C1 = IDXVAL øø SPACE;
C1 = SUBSTR(C1,1,KL);
C2 = UPVAL øø SPACE;
C2 = SUBSTR(C2,1,KL);
IF C1<C2 THEN
RETURN(-1);
ELSE IF C1>C2 THEN
RETURN(1);
ELSE
RETURN(0);
END COMPARE;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
CHECK LOCK ROUTINES
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
SKIP_LOCK:
PROC (KEY,DRN);
DCL
L_VALUE CHAR(MAX_KEY_LEN) VAR,
(KEY,DRN) FIXED;
DO WHILE (DRN ü= 0 & LOKCOD() ü= 0);
L_VALUE = SUBSTR(IDX_KEY,1,KEY_LEN(KEY));
IDX_KEY = SET_LENGTH;
DRN = AFTKEY(KEY_NUM(KEY),FILE_NO,SLOCK,
L_VALUE,IDX_KEY);
END;
END SKIP_LOCK;
CHECK_LOCK:
PROC (KEY,DRN) RETURNS (BIT(1));
DCL
CONV_TARGET CHAR(MAX_KEY_LEN) VAR,
(KEY,DRN) FIXED,
DUMMY CHAR(1);
PUT SKIP(2) LIST(
'Enter a "W" if you wish to wait for locked record(s)>>');
GET LIST (DUMMY);
IF DUMMY = 'W' ø DUMMY = 'w' THEN
RETURN(YESBIT);
DO WHILE (DRN ü= 0 & LOKCOD() ü= 0);
CONV_TARGET = SUBSTR(IDX_KEY,1,KEY_LEN(KEY));
IDX_KEY = SET_LENGTH;
IF OLD_ACTION = 'CONT' THEN
DRN = AFTKEY(KEY_NUM(KEY),FILE_NO,
SLOCK, CONV_TARGET,IDX_KEY);
ELSE
DRN = BEFKEY(KEY_NUM(KEY),FILE_NO,
SLOCK, CONV_TARGET,IDX_KEY);
END;
RETURN(NOBIT);
END CHECK_LOCK;
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
WARNING MESSAGES
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
WARNING_TYPE:
PROC (KEY,TYPE,RET_CODE);
DCL
(KEY,TYPE,RET_CODE) FIXED;
PUT SKIP(2) EDIT ('WARNING...Return Code #',RET_CODE,
' occurred while trying to ') (A,F(3),A);
GOTO WT(TYPE);
WT(1): PUT EDIT ('remove old key from ',IDX_NAME(KEY)) (2A);
CALL PAUSE();
RETURN;
WT(2): PUT EDIT ('enter key into ',IDX_NAME(KEY)) (2A);
CALL PAUSE();
RETURN;
WT(3): PUT EDIT ('delete key from ',IDX_NAME(KEY)) (2A);
CALL PAUSE();
RETURN;
END WARNING_TYPE;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ADD NEW KEY VALUE ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
ADD_KEY:
PROC (KEY,DRN);
DCL
(KEY,RET_CODE,K_FLD,DRN) FIXED;
K_FLD = KEY_MAP(KEY);
/*
REMOVE OLD KEY VALUE
*/
RET_CODE = DELKEY(KEY_NUM(KEY),FILE_NO,
XLOCK,OLD_FLD(K_FLD),DRN);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(KEY,4);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(6);
IF RET_CODE ü= 1 THEN
CALL WARNING_TYPE(KEY,1,RET_CODE);
/*
ADD NEW KEY VALUE
*/
RET_CODE = ADDKEY(KEY_NUM(KEY),FILE_NO,
XLOCK,NEW_FLD(K_FLD),DRN);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(KEY,5);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(7);
IF RET_CODE ü= 1 THEN
CALL WARNING_TYPE(KEY,2,RET_CODE);
END ADD_KEY;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
WRITE NEW DATA RECORD ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
WRITE_CUST:
PROC (DRN);
DCL
DRN FIXED;
CDF = ASCII(0); /* CLEAR DELETE FLAG */
CNO = NEW_FLD(0);
CFN = NEW_FLD(1);
CLN = NEW_FLD(2);
CST = NEW_FLD(3);
CTY = NEW_FLD(4);
CSA = NEW_FLD(5);
CZP = NEW_FLD(6);
CSU = NEW_FLD(7);
IF WRTDAT(FILE_NO,DRN,DATBUF_PTR) ü= 0 THEN
CALL ERROR_TYPE(DRN,12);
END WRITE_CUST;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DELETE KEY VALUE FROM INDEX ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DEL_KEY:
PROC (KEY,DRN);
DCL
(KEY,RET_CODE,K_FLD,DRN);
K_FLD = KEY_MAP(KEY);
RET_CODE = DELKEY(KEY_NUM(KEY),FILE_NO,
XLOCK,OLD_FLD(K_FLD),DRN);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(KEY,6);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(10);
IF RET_CODE ü= 1 THEN
CALL WARNING_TYPE(KEY,3,RET_CODE);
END DEL_KEY;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
UPDATE INDICES & DATA FILE ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
UPDATE:
PROC (DATA_RECORD) RETURNS (FIXED);
DCL
(FLD,KEY) FIXED,
(TMP_REC,DATA_RECORD) FIXED;
IF DATA_RECORD = 0 THEN
DO;
TMP_REC = NEWREC(FILE_NO,XLOCK);
IF ERRCOD() ü= 0 THEN
CALL ERROR_TYPE(0,8);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(3) ;
END;
ELSE
TMP_REC = DATA_RECORD;
DO KEY = 0 TO MAX_KEY;
FLD = KEY_MAP(KEY);
IF OLD_FLD(FLD) ü= NEW_FLD(FLD) THEN
CALL ADD_KEY(KEY,TMP_REC);
END;
DO FLD = 0 TO MAX_FIELD;
IF OLD_FLD(FLD) ü= NEW_FLD(FLD) THEN
DO;
CALL WRITE_CUST(TMP_REC);
RETURN(TMP_REC);
END;
END;
RETURN(TMP_REC);
END UPDATE;
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DELETE INDEX & DATA FILE ENTRY ROUTINE
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
DELETE:
PROC (DATA_RECORD);
DCL
(DATA_RECORD,FLD,KEY) FIXED;
DO KEY = 0 TO MAX_KEY;
FLD = KEY_MAP(KEY);
IF OLD_FLD(FLD) ü= '' THEN
CALL DEL_KEY(KEY,DATA_RECORD);
END;
IF RETREC(FILE_NO,XLOCK,DATA_RECORD) ü= 0 THEN
CALL ERROR_TYPE(DATA_RECORD,9);
IF LOKCOD() ü= 0 THEN
CALL LOKTYP(9);
END DELETE;
/*
END OF UTILITY FUNCTIONS
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
END;
«eof»