CKDELETE [ KSAM/3000 Reference Manual ] MPE/iX 5.0 Documentation
KSAM/3000 Reference Manual
CKDELETE
This procedure logically deletes a record from a KSAM file.
CALL "CKDELETE" USING fileable, status
In order to logically delete records from a KSAM file, you can use the
procedure CKDELETE. A logically deleted record is marked by a code of
binary 1's in the first two characters of the record, but is not
physically removed from the file. The deletion mark makes such a record
inaccessible but does not physically reduce the size of the file. The
utility program FCOPY (described in section II) can be used to compact a
KSAM file by copying only active records, excluding deleted records, to a
new KSAM file.
CKDELETE deletes the record at which the logical record pointer is
currently positioned. Therefore, CKDELETE must be preceded by a call
that positions the pointer (see Table 3-3).
PARAMETERS
filetable an 8-word record containing the number and name of the
file, its input-output type, access mode, and a code
indicating whether the previous operation was successful
and if so what it was. (Refer to Filetable Parameter
discussion earlier in this section.)
status one word (two 8-bit characters) set to a pair of values
upon completion of the call to CKDELETE indicating
whether the call was successful and if not, why not.
(Refer to Status Parameter discussion earlier in this
section.)
USING CKDELETE
In order to delete a record, you should first read the record into the
working storage section of your program with a call to CKREAD if in
sequential mode, a call to CKREADBYKEY if in random mode, or a call to
either if in dynamic mode. CKDELETE can be called only if the file is
currently open for both input and output (input-output type =2). This
allows the record to be read into your program's data area and then
written back to the file with the delete mark. Following execution of
CKDELETE, the deleted record can no longer be accessed.
SHARED ACCESS. If the file was opened for shared access with CKOPENSHR,
you must lock the file with CKLOCK before you can delete any records with
CKDELETE. Because CKDELETE depends on the logical record pointer, the
call to CKLOCK should precede the call that positions the pointer. The
call to CKUNLOCK is then called after the call to CKDELETE. To
illustrate, the sequence of calls in shared access should be:
CKLOCK <----- to lock file
CKSTART or CKREADBYKEY <-------------- to position pointer
.
.
.
CKDELETE<----- to delete record at which pointer is positioned
CKUNLOCK<----- to unlock file
Following the call to CKDELETE, the pointer is positioned to the next key
following the key in the deleted record.
EXAMPLES
The following examples show the use of CKDELETE for sequential access
using CKREAD and for random access using CKREADBYKEY. The WORKING-STORAGE
SECTION from Figure 3-2 and the FINISH procedure from the CKCLOSE example
are assumed for these examples.
1. Sequential Delete.
In order to delete all records whose primary key begins with "P",
first position the file to the start of these records with CKSTART
and then read each record with CKREAD and delete it with CKDELETE.
WORKING-STORAGE SECTION.
77 RELOP PIC S9(4) COMP.
77 KEYVAL PIC X(20).
77 KEYLOC PIC S9(4) COMP.
77 KEYLENGTH PIC S9(4) COMP.
.
.
.
PROCEDURE DIVISION.
START.
MOVE 2 TO I-O-TYPE.
MOVE 0 TO A-MODE.
CALL "CKOPEN" USING FILETABLE, STAT.
.
. <---------- check status
.
FIND-REC.
MOVE 0 TO RELOP.<-------------------- test for equality between
primary key and KEY
MOVE "P" TO KEYVAL.
MOVE 3 TO KEYLOC.
MOVE 1 TO KEYLENGTH.<----- check first character only
CALL "CKSTART" USING FILETABLE, STAT, RELOP, KEYVAL, KEYLOC,
KEYLENGTH.
IF STATUS-KEY-1 = "0" THEN
GO TO READ-REC.
IF STAT = "23" THEN
DISPLAY "NO RECORD FOUND"
GO TO FINISH.
IF STATUS-KEY-1 = "9" THEN
CALL "CKERROR" USING STAT, RESULT
DISPLAY "CKERROR NO.=", RESULT
GO TO FINISH.
READ-REC.
CALL "CKREAD" USING FILETABLE, STAT, REC, RECSIZE.
IF STATUS-KEY-1 = "1" THEN
DISPLAY "END OF FILE REACHED"
GO TO FINISH.
IF STATUS-KEY-1 = "0" THEN
IF NAME OF REC NOT LESS THAN "Q "THEN
DISPLAY "DELETIONS COMPLETED"
GO TO FINISH;
ELSE GO TO DELETE-REC;
ELSE
DISPLAY "CKREAD ERROR, STATUS =", STAT
IF STATUS-KEY-1 = "9" THEN
CALL "CKERROR" USING STAT, RESULT
DISPLAY "CKERROR NO.", RESULT.
GO TO READ-REC.
DELETE-REC.
CALL "CKDELETE" USING FILETABLE, STAT.
IF STATUS-KEY-1 = "0" THEN
DISPLAY "DELETED"
GO TO READ-REC;
ELSE
DISPLAY "CKDELETE ERROR, STATUS = ", STAT
IF STATUS-KEY-1 = "9" THEN
CALL "CKERROR" USING STAT, RESULT
DISPLAY"CKERROR NO.=", RESULT
GO TO READ-REC.
_________________________________________________________________
NOTE If access is shared, the file must be opened with a call to
CKOPENSHR and then locked before the call to CKSTART that
initially sets the pointer. The file should remain locked
while the records to be deleted are read and then marked for
deletion. If the file is not locked before CKSTART is
called, other users can change the file so that the record
pointer points to the wrong record.
_________________________________________________________________
2. Random Delete.
A file containing the primary keys of those records to be deleted
from a KSAM file is read into the working storage area DAT. These
key values are used by CKREADBYKEY to locate and read the items to
be deleted by CKDELETE.
PROCEDURE DIVISION.
START.
MOVE 2 TO I-O-TYPE, A-MODE.
CALL "CKOPEN" USING FILETABLE, STAT.
.
. check status
.
READ-KEY.
READ DATA-FILE INTO DAT;
AT END GO TO FINISH.
CALL "CKREADBYKEY" USING FILETABLE, STAT, REC, NAME OF DAT, KEYLOC, RECSIZE.
IF STATUS-KEY-1 = "0" THEN
GO TO DELETE-RECORD.
DISPLAY "CKREADBYKEY ERROR, STATUS = ",STAT.
IF STATUS-KEY-1 = "9" THEN
CALL "CKERROR" USING STAT, RESULT
DISPLAY "CKERROR ", RESULT
GO TO READ-KEY.
DELETE-RECORD.
CALL "CKDELETE" USING FILETABLE, STAT.
IF STATUS-KEY-1 = "0" THEN
DISPLAY REC, " DELETED"
GO TO READ-KEY.
DISPLAY "CKDELETE ERROR, STATUS =",STAT.
IF STATUS-KEY-1 = "9" THEN
CALL "CKERROR" USING STAT, RESULT
DISPLAY "CKERROR NO. =", RESULT.
GO TO READ-KEY.
NOTE Note: If access is shared, the file must be opened with a call to
CKOPENSHR; a call to CKLOCK must precede the call to CKREADBYKEY
and a call to CKUNLOCK must follow the CKDELETE error tests and
should precede the return to READ-KEY.
MPE/iX 5.0 Documentation