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}}==