Simple database: Difference between revisions
Content added Content deleted
(Added COBOL solution with sample session.) |
|||
Line 227: | Line 227: | ||
else return ((*p1)->date > (*p2)->date); |
else return ((*p1)->date > (*p2)->date); |
||
}</lang> |
}</lang> |
||
=={{header|COBOL}}== |
|||
This is a souped-up version of the task from [[Take notes on the command line]]. It stores the current date, a tag, a title and a note as an entry in a file. The database produced is not particularly human-readable or easy to modify, but it is in a well-structured format. |
|||
{{works with|OpenCOBOL}} |
|||
<lang 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." |
|||
.</lang> |
|||
Sample session: |
|||
<pre> |
|||
$ ./database -c "Reminder" "Bob's Birthday" "Buy birthday present for Bob." |
|||
$ ./database -c "Wishlist" "Beethoven" "Beethoven's Ode to Joy" |
|||
$ ./database -c "Reminder" "Add to Simple Database" "Add brainf*** example for Simple Database on Rosetta Code." |
|||
... |
|||
$ ./database -f "Mozart" |
|||
An entry with that title was not found. |
|||
$ ./database -t |
|||
Date added: 2013/08/13 Tag: Reminder |
|||
Title: Bob's Birthday |
|||
Contents: |
|||
Buy birthday present for Bob. |
|||
Date added: 2013/08/13 Tag: Reminder |
|||
Title: Add to Simple Database |
|||
Contents: |
|||
Add brainf*** example for Simple Database on Rosetta Code. |
|||
Date added: 2013/08/13 Tag: Wishlist |
|||
Title: Beethoven |
|||
Contents: |
|||
Beethoven's Ode to Joy |
|||
$ ./database -r "Beethoven" |
|||
$ ./database -l |
|||
Date added: 2013/08/13 Tag: Reminder |
|||
Title: Add to Simple Database |
|||
Contents: |
|||
Add brainf*** example for Simple Database on Rosetta Code. |
|||
$ |
|||
</pre> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |