cs-3424: finish assignment 1
This commit is contained in:
parent
b8b47c1289
commit
ca81dac9ba
BIN
Summer-2024/CS-3424/Assignments/Assignment-1/Assignment.pdf
Normal file
BIN
Summer-2024/CS-3424/Assignments/Assignment-1/Assignment.pdf
Normal file
Binary file not shown.
90
Summer-2024/CS-3424/Assignments/Assignment-1/src/assign1.bash
Executable file
90
Summer-2024/CS-3424/Assignments/Assignment-1/src/assign1.bash
Executable file
@ -0,0 +1,90 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
|
||||||
|
LOG_FILE="${SCRIPT_DIR}/data/queries.log"
|
||||||
|
DATA_DIR="${SCRIPT_DIR}/data"
|
||||||
|
declare -A COURSE_DATA
|
||||||
|
|
||||||
|
log() {
|
||||||
|
local out
|
||||||
|
local title="${1?No title provided to log!}"
|
||||||
|
shift
|
||||||
|
local msg="${1?No message provided to log!}"
|
||||||
|
shift
|
||||||
|
out="[$(date)] ${title}: ${msg}"
|
||||||
|
printf "%s\n" "$out" >>"$LOG_FILE"
|
||||||
|
for body_line in "${@}"; do
|
||||||
|
printf "%s\n" "$body_line" >>"$LOG_FILE"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
show_options() {
|
||||||
|
cat <<-__EOS__
|
||||||
|
Enter one of the following actions or press CTRL-D to exit.
|
||||||
|
C - create a new course record
|
||||||
|
R - read an existing course record
|
||||||
|
U - update an existing course record
|
||||||
|
D - delete an existing course record
|
||||||
|
E - update enrolled student count of existing course
|
||||||
|
T - show total course count
|
||||||
|
__EOS__
|
||||||
|
}
|
||||||
|
|
||||||
|
err() {
|
||||||
|
printf "ERROR: %s\n" "${*}" 1>&2
|
||||||
|
}
|
||||||
|
|
||||||
|
check_course_file_access() {
|
||||||
|
local course_file="${1}"
|
||||||
|
if [[ ! -f "$course_file" ]]; then
|
||||||
|
err "course not found"
|
||||||
|
return 1
|
||||||
|
elif [[ ! -r "$course_file" ]]; then
|
||||||
|
local course="${course_file##*/}"
|
||||||
|
course="${course_file##*".crs"}"
|
||||||
|
err "course ${course} was found, but unable to read from its file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
. "${SCRIPT_DIR}/create.bash"
|
||||||
|
. "${SCRIPT_DIR}/delete.bash"
|
||||||
|
. "${SCRIPT_DIR}/enroll.bash"
|
||||||
|
. "${SCRIPT_DIR}/read.bash"
|
||||||
|
. "${SCRIPT_DIR}/total.bash"
|
||||||
|
. "${SCRIPT_DIR}/update.bash"
|
||||||
|
show_options
|
||||||
|
while read -r option; do
|
||||||
|
option="${option^^}"
|
||||||
|
case "$option" in
|
||||||
|
C)
|
||||||
|
create_course || true
|
||||||
|
;;
|
||||||
|
R)
|
||||||
|
read_course || true
|
||||||
|
;;
|
||||||
|
U)
|
||||||
|
update_course || true
|
||||||
|
;;
|
||||||
|
D)
|
||||||
|
delete_course || true
|
||||||
|
;;
|
||||||
|
E)
|
||||||
|
change_course_enrollment || true
|
||||||
|
;;
|
||||||
|
T)
|
||||||
|
total_courses || true
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
err "invalid option"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
show_options
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
main "${@}"
|
9
Summer-2024/CS-3424/Assignments/Assignment-1/src/create.bash
Executable file
9
Summer-2024/CS-3424/Assignments/Assignment-1/src/create.bash
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
. "${SCRIPT_DIR}/update.bash"
|
||||||
|
|
||||||
|
create_course() {
|
||||||
|
update_course "y" || return
|
||||||
|
}
|
1
Summer-2024/CS-3424/Assignments/Assignment-1/src/data/.gitignore
vendored
Normal file
1
Summer-2024/CS-3424/Assignments/Assignment-1/src/data/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
queries.log
|
@ -0,0 +1,3 @@
|
|||||||
|
BIO Biology
|
||||||
|
Human Anatomy and Physiology Laboratory II
|
||||||
|
MWF 8/26/24 12/14/24 3 59
|
@ -0,0 +1,3 @@
|
|||||||
|
BIO Biology
|
||||||
|
Plant Cell Biology
|
||||||
|
TH 8/26/24 12/15/24 3 51
|
@ -0,0 +1,3 @@
|
|||||||
|
CS Computer Science
|
||||||
|
Systems Programming
|
||||||
|
MWF 8/26/24 12/13/24 4 68
|
@ -0,0 +1,3 @@
|
|||||||
|
GEO Geological Sciences
|
||||||
|
Economic Geology Laboratory
|
||||||
|
TH 8/26/24 12/10/24 1 59
|
@ -0,0 +1,3 @@
|
|||||||
|
MAT Mathematics
|
||||||
|
Calculus I
|
||||||
|
TH 8/26/24 12/11/24 3 71
|
@ -0,0 +1,3 @@
|
|||||||
|
MAT Mathematics
|
||||||
|
Data Analysis and Interpretation
|
||||||
|
TH 8/26/24 12/12/24 3 60
|
@ -0,0 +1,3 @@
|
|||||||
|
MAT Mathematics
|
||||||
|
Mathematical Foundations of Cryptography
|
||||||
|
MWF 8/26/24 12/13/24 3 53
|
@ -0,0 +1,36 @@
|
|||||||
|
c
|
||||||
|
CS
|
||||||
|
Computer Science
|
||||||
|
3423
|
||||||
|
Systems Programming
|
||||||
|
TH
|
||||||
|
8/20/24
|
||||||
|
12/13/24
|
||||||
|
4
|
||||||
|
60
|
||||||
|
r
|
||||||
|
cs 3423
|
||||||
|
r
|
||||||
|
cs 3424
|
||||||
|
r
|
||||||
|
XXX 1234
|
||||||
|
u
|
||||||
|
cs
|
||||||
|
|
||||||
|
3421
|
||||||
|
Systems Laboratory
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
25
|
||||||
|
r
|
||||||
|
cs 3423
|
||||||
|
d
|
||||||
|
cs 3424
|
||||||
|
r
|
||||||
|
cs 3424
|
||||||
|
e
|
||||||
|
cs 3423
|
||||||
|
68
|
||||||
|
t
|
@ -0,0 +1,68 @@
|
|||||||
|
This file was generated by using "grep" to filter for lines containing "echo" or "read -p"
|
||||||
|
invocations, such that you may you use the exact verbiage in your script.
|
||||||
|
For example, this was the command line used to make this file (notwithstanding a small
|
||||||
|
amount of manual cleanup/formatting at the end):
|
||||||
|
|
||||||
|
for f in *.bash; do echo -e "\n$f:"; \grep -e echo -e "read -p" "$f"; done > a1_strings.txt
|
||||||
|
|
||||||
|
|
||||||
|
assign1.bash:
|
||||||
|
echo "Enter one of the following actions or press CTRL-D to exit."
|
||||||
|
echo "C - create a new course record"
|
||||||
|
echo "R - read an existing course record"
|
||||||
|
echo "U - update an existing course record"
|
||||||
|
echo "D - delete an existing course record"
|
||||||
|
echo "E - update enrolled student count of existing course"
|
||||||
|
echo "T - show total course count"
|
||||||
|
*) echo "ERROR: invalid option";;
|
||||||
|
|
||||||
|
create.bash:
|
||||||
|
read -p "Department code: " dept_code
|
||||||
|
read -p "Department name: " dept_name
|
||||||
|
read -p "Course number: " course_num
|
||||||
|
read -p "Course name: " course_name
|
||||||
|
read -p "Scheduled days: " course_sched
|
||||||
|
read -p "Course start: " course_start
|
||||||
|
read -p "Course end: " course_end
|
||||||
|
read -p "Credit hours: " course_hours
|
||||||
|
read -p "Enrolled students: " course_size
|
||||||
|
echo "ERROR: must provide a department code and course number" 1>&2
|
||||||
|
echo "ERROR: course already exists"
|
||||||
|
|
||||||
|
delete.bash:
|
||||||
|
read -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
echo "ERROR: course not found"
|
||||||
|
echo "$course_num was successfully deleted"
|
||||||
|
|
||||||
|
enroll.bash:
|
||||||
|
read -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
read -p "Enter an enrollment change amount: " change_amt
|
||||||
|
echo "ERROR: course not found"
|
||||||
|
|
||||||
|
read.bash:
|
||||||
|
read -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
echo "ERROR: course not found"
|
||||||
|
echo "Course department: ${dept_code^^} $dept_name"
|
||||||
|
echo "Course number: $course_num"
|
||||||
|
echo "Course name: $course_name"
|
||||||
|
echo "Scheduled days: $course_sched"
|
||||||
|
echo "Course start: $course_start"
|
||||||
|
echo "Course end: $course_end"
|
||||||
|
echo "Credit hours: $course_hours"
|
||||||
|
echo "Enrolled Students: $course_size"
|
||||||
|
|
||||||
|
total.bash:
|
||||||
|
echo "Total course records: $count"
|
||||||
|
|
||||||
|
update.bash:
|
||||||
|
read -p "Department code: " dept_code
|
||||||
|
read -p "Department name: " dept_name
|
||||||
|
read -p "Course number: " course_num
|
||||||
|
read -p "Course name: " course_name
|
||||||
|
read -p "Scheduled days: " course_sched
|
||||||
|
read -p "Course start: " course_start
|
||||||
|
read -p "Course end: " course_end
|
||||||
|
read -p "Credit hours: " course_hours
|
||||||
|
read -p "Enrolled students: " course_size
|
||||||
|
echo "ERROR: must provide a department code and course number" 1>&2
|
||||||
|
echo "ERROR: course not found"
|
26
Summer-2024/CS-3424/Assignments/Assignment-1/src/delete.bash
Executable file
26
Summer-2024/CS-3424/Assignments/Assignment-1/src/delete.bash
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
delete_course() {
|
||||||
|
local dept_code
|
||||||
|
local course_num
|
||||||
|
local course_name
|
||||||
|
|
||||||
|
read -r -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
dept_code="${dept_code^^}"
|
||||||
|
|
||||||
|
local course_file="${DATA_DIR}/${dept_code^^}${course_num}.crs"
|
||||||
|
check_course_file_access "$course_file" || return
|
||||||
|
|
||||||
|
local linenr=0
|
||||||
|
while read -r line; do
|
||||||
|
linenr="$((linenr + 1))"
|
||||||
|
if ((linenr == 2)); then
|
||||||
|
course_name="$line"
|
||||||
|
fi
|
||||||
|
done <"$course_file"
|
||||||
|
rm -f "$course_file"
|
||||||
|
|
||||||
|
log "DELETED" "${dept_code} ${course_num} ${course_name}"
|
||||||
|
}
|
33
Summer-2024/CS-3424/Assignments/Assignment-1/src/enroll.bash
Executable file
33
Summer-2024/CS-3424/Assignments/Assignment-1/src/enroll.bash
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
. "${SCRIPT_DIR}/read.bash"
|
||||||
|
|
||||||
|
change_course_enrollment() {
|
||||||
|
local dept_code
|
||||||
|
local course_num
|
||||||
|
local change_amt
|
||||||
|
|
||||||
|
read -r -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
dept_code="${dept_code^^}"
|
||||||
|
|
||||||
|
if [[ -z "$dept_code" ]] || [[ -z "$course_num" ]]; then
|
||||||
|
err "must provide a department code and course number"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -r -p "Enter an enrollment change amount: " change_amt
|
||||||
|
if [[ -z "$change_amt" ]]; then
|
||||||
|
err "no change amount provided"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
_read_course "$dept_code" "$course_num" || return 1
|
||||||
|
|
||||||
|
COURSE_DATA["dept_code"]="$dept_code"
|
||||||
|
COURSE_DATA["course_num"]="$course_num"
|
||||||
|
COURSE_DATA["course_size"]=$((COURSE_DATA["course_size"] + change_amt))
|
||||||
|
_update_course
|
||||||
|
log "ENROLLMENT" "${dept_code} ${course_num} ${COURSE_DATA["course_name"]}" "changed by ${change_amt}"
|
||||||
|
}
|
68
Summer-2024/CS-3424/Assignments/Assignment-1/src/read.bash
Executable file
68
Summer-2024/CS-3424/Assignments/Assignment-1/src/read.bash
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
_read_course() {
|
||||||
|
local dept_code="${1?No department code provided!}"
|
||||||
|
local course_num="${2?No course number provided!}"
|
||||||
|
dept_code="${dept_code^^}"
|
||||||
|
local course="${dept_code}${course_num}"
|
||||||
|
|
||||||
|
local dept_name
|
||||||
|
local course_name
|
||||||
|
local course_sched
|
||||||
|
local course_start
|
||||||
|
local course_end
|
||||||
|
local course_hours
|
||||||
|
local course_size
|
||||||
|
|
||||||
|
local course_file="${DATA_DIR}/${course}.crs"
|
||||||
|
|
||||||
|
check_course_file_access "$course_file" || return 1
|
||||||
|
|
||||||
|
local linenr=0
|
||||||
|
while read -r line; do
|
||||||
|
linenr="$((linenr + 1))"
|
||||||
|
if ((linenr == 1)); then
|
||||||
|
read -r dept_code dept_name <<<"$line"
|
||||||
|
elif ((linenr == 2)); then
|
||||||
|
read -r course_name <<<"$line"
|
||||||
|
elif ((linenr == 3)); then
|
||||||
|
read -r course_sched course_start course_end course_hours course_size <<<"$line"
|
||||||
|
else
|
||||||
|
err "unable to read ${course_file}, it has an invalid format!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done <"$course_file"
|
||||||
|
|
||||||
|
COURSE_DATA["dept_code"]="$dept_code"
|
||||||
|
COURSE_DATA["dept_name"]="$dept_name"
|
||||||
|
COURSE_DATA["course_num"]="$course_num"
|
||||||
|
COURSE_DATA["course_name"]="$course_name"
|
||||||
|
COURSE_DATA["course_sched"]="$course_sched"
|
||||||
|
COURSE_DATA["course_start"]="$course_start"
|
||||||
|
COURSE_DATA["course_end"]="$course_end"
|
||||||
|
COURSE_DATA["course_hours"]="$course_hours"
|
||||||
|
COURSE_DATA["course_size"]="$course_size"
|
||||||
|
}
|
||||||
|
|
||||||
|
read_course() {
|
||||||
|
local dept_code
|
||||||
|
local course_num
|
||||||
|
read -r -p "Enter a department code and course number: " dept_code course_num
|
||||||
|
|
||||||
|
_read_course "$dept_code" "$course_num" || return 1
|
||||||
|
|
||||||
|
printf "%s\n" "${COURSE_DATA[*]}"
|
||||||
|
|
||||||
|
cat <<-__EOS__
|
||||||
|
Course department: ${COURSE_DATA["dept_code"]} ${COURSE_DATA["dept_name"]}
|
||||||
|
Course number: ${COURSE_DATA["course_num"]}
|
||||||
|
Course name: ${COURSE_DATA["course_name"]}
|
||||||
|
Scheduled days: ${COURSE_DATA["course_sched"]}
|
||||||
|
Course start: ${COURSE_DATA["course_start"]}
|
||||||
|
Course end: ${COURSE_DATA["course_end"]}
|
||||||
|
Credit hours: ${COURSE_DATA["course_hours"]}
|
||||||
|
Enrolled Students: ${COURSE_DATA["course_size"]}
|
||||||
|
__EOS__
|
||||||
|
}
|
8
Summer-2024/CS-3424/Assignments/Assignment-1/src/total.bash
Executable file
8
Summer-2024/CS-3424/Assignments/Assignment-1/src/total.bash
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
total_courses() {
|
||||||
|
local courses=("${DATA_DIR}/"*.crs)
|
||||||
|
printf "Total course records: %d\n" "${#courses[@]}"
|
||||||
|
}
|
78
Summer-2024/CS-3424/Assignments/Assignment-1/src/update.bash
Executable file
78
Summer-2024/CS-3424/Assignments/Assignment-1/src/update.bash
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -eEuo pipefail
|
||||||
|
|
||||||
|
. "${SCRIPT_DIR}/read.bash"
|
||||||
|
|
||||||
|
_update_course() {
|
||||||
|
local dept_code="${COURSE_DATA["dept_code"]^^}"
|
||||||
|
local dept_name="${COURSE_DATA["dept_name"]}"
|
||||||
|
local course_num="${COURSE_DATA["course_num"]}"
|
||||||
|
local course_name="${COURSE_DATA["course_name"]}"
|
||||||
|
local course_sched="${COURSE_DATA["course_sched"]}"
|
||||||
|
local course_start="${COURSE_DATA["course_start"]}"
|
||||||
|
local course_end="${COURSE_DATA["course_end"]}"
|
||||||
|
local course_hours="${COURSE_DATA["course_hours"]}"
|
||||||
|
local course_size="${COURSE_DATA["course_size"]}"
|
||||||
|
|
||||||
|
cat <<-__EOS__ >"${DATA_DIR}/${dept_code}${course_num}.crs"
|
||||||
|
${dept_code} ${dept_name}
|
||||||
|
${course_name}
|
||||||
|
${course_sched} ${course_start} ${course_end} ${course_hours} ${course_size}
|
||||||
|
__EOS__
|
||||||
|
}
|
||||||
|
|
||||||
|
update_course() {
|
||||||
|
local create="${1:-}"
|
||||||
|
local dept_code
|
||||||
|
local dept_name
|
||||||
|
local course_num
|
||||||
|
local course_name
|
||||||
|
local course_sched
|
||||||
|
local course_start
|
||||||
|
local course_end
|
||||||
|
local course_hours
|
||||||
|
local course_size
|
||||||
|
|
||||||
|
read -r -p "Department code: " dept_code
|
||||||
|
read -r -p "Department name: " dept_name
|
||||||
|
read -r -p "Course number: " course_num
|
||||||
|
read -r -p "Course name: " course_name
|
||||||
|
read -r -p "Scheduled days: " course_sched
|
||||||
|
read -r -p "Course start: " course_start
|
||||||
|
read -r -p "Course end: " course_end
|
||||||
|
read -r -p "Credit hours: " course_hours
|
||||||
|
read -r -p "Enrolled students: " course_size
|
||||||
|
|
||||||
|
if [[ -z "$dept_code" ]] || [[ -z "$course_num" ]]; then
|
||||||
|
err "must provide a department code and course number"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local course_file="${DATA_DIR}/${dept_code^^}${course_num}.crs"
|
||||||
|
if [[ "$create" ]]; then
|
||||||
|
if [[ -f "$course_file" ]]; then
|
||||||
|
err "course already exists"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_read_course "${dept_code^^}" "$course_num" || return
|
||||||
|
fi
|
||||||
|
|
||||||
|
COURSE_DATA["dept_code"]="${dept_code:-${COURSE_DATA["dept_code"]}}"
|
||||||
|
COURSE_DATA["dept_name"]="${dept_name:-${COURSE_DATA["dept_name"]}}"
|
||||||
|
COURSE_DATA["course_num"]="${course_num:-${COURSE_DATA["course_num"]}}"
|
||||||
|
COURSE_DATA["course_name"]="${course_name:-${COURSE_DATA["course_name"]}}"
|
||||||
|
COURSE_DATA["course_sched"]="${course_sched:-${COURSE_DATA["course_sched"]}}"
|
||||||
|
COURSE_DATA["course_start"]="${course_start:-${COURSE_DATA["course_start"]}}"
|
||||||
|
COURSE_DATA["course_end"]="${course_end:-${COURSE_DATA["course_end"]}}"
|
||||||
|
COURSE_DATA["course_hours"]="${course_hours:-${COURSE_DATA["course_hours"]}}"
|
||||||
|
COURSE_DATA["course_size"]="${course_size:-${COURSE_DATA["course_size"]}}"
|
||||||
|
_update_course
|
||||||
|
|
||||||
|
if [[ "$create" ]]; then
|
||||||
|
log "CREATED" "${COURSE_DATA["dept_code"]} ${COURSE_DATA["course_num"]} ${COURSE_DATA["course_name"]}"
|
||||||
|
else
|
||||||
|
log "UPDATED" "${COURSE_DATA["dept_code"]} ${COURSE_DATA["course_num"]} ${COURSE_DATA["course_name"]}"
|
||||||
|
fi
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user