263 lines
8.4 KiB
COBOL
263 lines
8.4 KiB
COBOL
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. simple-database.
|
|
|
|
ENVIRONMENT DIVISION.
|
|
INPUT-OUTPUT SECTION.
|
|
FILE-CONTROL.
|
|
SELECT OPTIONAL database-file ASSIGN Database-Path
|
|
ORGANIZATION INDEXED
|
|
ACCESS SEQUENTIAL
|
|
RECORD KEY data-title
|
|
ALTERNATE RECORD KEY data-tag
|
|
WITH DUPLICATES
|
|
ALTERNATE RECORD KEY date-added
|
|
WITH DUPLICATES
|
|
FILE STATUS file-status
|
|
.
|
|
DATA DIVISION.
|
|
FILE SECTION.
|
|
FD database-file.
|
|
01 database-record.
|
|
*> Date is in YYYYMMDD format.
|
|
03 date-added PIC 9(8).
|
|
03 data-tag PIC X(20).
|
|
03 data-title PIC X(50).
|
|
03 data-contents PIC X(200).
|
|
*> Adding extra space is considered good style so the record
|
|
*> can be expanded in the future.
|
|
03 FILLER PIC X(50).
|
|
|
|
WORKING-STORAGE SECTION.
|
|
78 Database-Path VALUE "database.dat".
|
|
|
|
01 file-status PIC XX.
|
|
88 file-ok VALUE "00".
|
|
88 duplicate-key VALUE "22".
|
|
88 key-not-found VALUE "23".
|
|
|
|
01 num-args PIC 99.
|
|
|
|
01 action PIC XX.
|
|
88 create-entry VALUE "-c".
|
|
88 remove-entry VALUE "-r".
|
|
88 find-entry VALUE "-f".
|
|
88 print-latest VALUE "-l".
|
|
88 print-database VALUES "-a", "-d", "-t".
|
|
*> Printed by title.
|
|
88 print-by-title VALUE "-a".
|
|
88 print-by-date VALUE "-d".
|
|
88 print-by-tag VALUE "-t".
|
|
88 print-help VALUES "-h", SPACES.
|
|
|
|
01 read-direction-flag PIC X VALUE SPACE.
|
|
88 read-backwards VALUE "B".
|
|
|
|
01 edited-date PIC 9(4)/99/99.
|
|
PROCEDURE DIVISION.
|
|
DECLARATIVES.
|
|
database-file-error SECTION.
|
|
USE AFTER ERROR ON database-file
|
|
|
|
DISPLAY "An error has occurred while using " Database-Path
|
|
". Error no. " file-status
|
|
DISPLAY "The program will terminate."
|
|
|
|
CLOSE database-file
|
|
|
|
GOBACK
|
|
.
|
|
END DECLARATIVES.
|
|
|
|
main-line.
|
|
DISPLAY 1 UPON ARGUMENT-NUMBER
|
|
ACCEPT action FROM ARGUMENT-VALUE
|
|
|
|
ACCEPT num-args FROM ARGUMENT-NUMBER
|
|
|
|
EVALUATE TRUE
|
|
WHEN create-entry
|
|
IF num-args >= 4
|
|
PERFORM write-entry
|
|
ELSE
|
|
DISPLAY "-a requires arguments to enter in the "
|
|
"database. See help (-h) for details."
|
|
END-IF
|
|
|
|
WHEN remove-entry
|
|
IF num-args >= 2
|
|
PERFORM delete-entry
|
|
ELSE
|
|
DISPLAY "-r requires the title of the entry to "
|
|
"delete."
|
|
END-IF
|
|
|
|
WHEN find-entry
|
|
IF num-args >= 2
|
|
PERFORM display-specified-entry
|
|
ELSE
|
|
DISPLAY "-f requires the title of the entry to "
|
|
"find."
|
|
END-IF
|
|
|
|
WHEN print-latest
|
|
PERFORM show-latest
|
|
|
|
WHEN print-database
|
|
PERFORM show-database
|
|
|
|
WHEN print-help
|
|
PERFORM show-general-help
|
|
|
|
WHEN OTHER
|
|
DISPLAY action " is not a valid option."
|
|
END-EVALUATE
|
|
|
|
GOBACK
|
|
.
|
|
write-entry.
|
|
OPEN EXTEND database-file
|
|
|
|
DISPLAY 2 UPON ARGUMENT-NUMBER
|
|
ACCEPT data-tag FROM ARGUMENT-VALUE
|
|
DISPLAY 3 UPON ARGUMENT-NUMBER
|
|
ACCEPT data-title FROM ARGUMENT-VALUE
|
|
IF data-title = SPACES
|
|
DISPLAY "The title cannot be blank."
|
|
PERFORM close-and-terminate
|
|
END-IF
|
|
|
|
DISPLAY 4 UPON ARGUMENT-NUMBER
|
|
ACCEPT data-contents FROM ARGUMENT-VALUE
|
|
|
|
ACCEPT date-added FROM DATE YYYYMMDD
|
|
|
|
WRITE database-record
|
|
INVALID KEY
|
|
IF duplicate-key
|
|
DISPLAY "An entry in the database already has "
|
|
"that title. Please choose a different "
|
|
"title or remove the entry."
|
|
ELSE
|
|
PERFORM database-file-error
|
|
END-IF
|
|
END-WRITE
|
|
|
|
PERFORM close-database
|
|
.
|
|
delete-entry.
|
|
PERFORM get-title-arg
|
|
OPEN I-O database-file
|
|
PERFORM read-title
|
|
|
|
DELETE database-file
|
|
|
|
PERFORM close-database
|
|
.
|
|
display-specified-entry.
|
|
PERFORM get-title-arg
|
|
OPEN INPUT database-file
|
|
PERFORM read-title
|
|
|
|
PERFORM show-record
|
|
|
|
PERFORM close-database
|
|
.
|
|
get-title-arg.
|
|
DISPLAY 2 UPON ARGUMENT-NUMBER
|
|
ACCEPT data-title FROM ARGUMENT-VALUE
|
|
.
|
|
read-title.
|
|
START database-file KEY IS = data-title
|
|
INVALID KEY
|
|
IF key-not-found
|
|
DISPLAY "An entry with that title was not found."
|
|
PERFORM close-and-terminate
|
|
ELSE
|
|
PERFORM database-file-error
|
|
END-IF
|
|
END-START
|
|
|
|
READ database-file
|
|
.
|
|
close-and-terminate.
|
|
PERFORM close-database
|
|
GOBACK
|
|
.
|
|
show-latest.
|
|
OPEN INPUT database-file
|
|
|
|
PERFORM start-at-last-date
|
|
READ database-file
|
|
PERFORM show-record
|
|
|
|
PERFORM close-database
|
|
.
|
|
show-database.
|
|
OPEN INPUT database-file
|
|
|
|
EVALUATE TRUE
|
|
WHEN print-by-title
|
|
*> Primary key is the title.
|
|
CONTINUE
|
|
WHEN print-by-tag
|
|
MOVE LOW-VALUES TO data-tag
|
|
START database-file KEY IS > data-tag
|
|
WHEN print-by-date
|
|
PERFORM start-at-last-date
|
|
SET read-backwards TO TRUE
|
|
END-EVALUATE
|
|
|
|
PERFORM FOREVER
|
|
*> The problem with statements instead of functions...
|
|
IF NOT read-backwards
|
|
READ database-file NEXT
|
|
AT END
|
|
EXIT PERFORM
|
|
END-READ
|
|
ELSE
|
|
READ database-file PREVIOUS
|
|
AT END
|
|
EXIT PERFORM
|
|
END-READ
|
|
END-IF
|
|
|
|
PERFORM show-record
|
|
DISPLAY SPACE
|
|
END-PERFORM
|
|
|
|
PERFORM close-database
|
|
.
|
|
start-at-last-date.
|
|
MOVE HIGH-VALUES TO date-added
|
|
START database-file KEY IS < date-added
|
|
.
|
|
close-database.
|
|
CLOSE database-file
|
|
.
|
|
show-record.
|
|
MOVE date-added TO edited-date
|
|
DISPLAY "Date added: " edited-date " Tag: " data-tag
|
|
DISPLAY "Title: " data-title
|
|
DISPLAY "Contents:"
|
|
DISPLAY " " FUNCTION TRIM(data-contents)
|
|
.
|
|
show-general-help.
|
|
DISPLAY "Help: Possible options are:"
|
|
DISPLAY " -a - Show all the entries (sorted by title)."
|
|
DISPLAY " -c - Create a new entry in the database. -c needs"
|
|
" further arguments in this format:"
|
|
DISPLAY ' "tag" "title" "content"'
|
|
DISPLAY " Max argument sizes (in characters): tag - 20, "
|
|
"title - 50, content - 200"
|
|
DISPLAY " The title must be unique and not be blank."
|
|
DISPLAY " -d - Show all the entries sorted by date added."
|
|
DISPLAY " -f - Finds and displays entry with the title "
|
|
"provided. The title should be specified as shown for "
|
|
"-c."
|
|
DISPLAY " -h - Show this help menu."
|
|
DISPLAY " -l - Show the latest entry."
|
|
DISPLAY " -r - Remove the entry with the title provided. "
|
|
"The title should be specified as shown for -c."
|
|
DISPLAY " -t - Show all the entries sorted by tag."
|
|
.
|