tags/tag.sh

107 lines
2.8 KiB
Bash
Raw Normal View History

2022-11-11 11:55:09 +00:00
#!/usr/bin/env bash
set -ueo pipefail
# usage:
2022-11-12 11:46:34 +00:00
# - init - create an empty database
2022-11-11 11:55:09 +00:00
# - add (tag|filename) $VALUE - adds a new tag or filename of $VALUE
# - list (tags|files) - lists all the values in a table
# - bytag $TAG - list all files by tag label
# - tag $FILENAME $TAG - tag $FILENAME with $TAG, $TAG can be repeated
# - listtags $FILENAME - list all tags for $FILENAME
DB_FILE="tags.db"
2022-11-12 11:46:34 +00:00
DB_SCHEMA="database.sql"
2022-11-11 11:55:09 +00:00
fail() {
echo "$1" >&2;
exit 1
}
2022-11-12 11:46:34 +00:00
log() {
echo "$1"
}
2022-11-11 11:55:09 +00:00
listtags() {
2022-11-11 12:20:11 +00:00
# $FILENAME $LIMIT
2022-11-11 11:55:09 +00:00
[ -z "$1" ] && fail "No filename supplied."
FILENAME="$1"
2022-11-11 12:20:11 +00:00
shift
LIMIT="${1:-0}"
ADDITIONAL_QUERY=""
[ $LIMIT -gt 0 ] && ADDITIONAL_QUERY="LIMIT $LIMIT"
sqlite3 -table "$DB_FILE" \
"SELECT filename, label from files \
INNER JOIN tags_ties ON tags_ties.fid = files.fid \
INNER JOIN tags ON tags.tid = tags_ties.tid \
WHERE filename = \"$FILENAME\"\
$ADDITIONAL_QUERY"
2022-11-11 11:55:09 +00:00
}
2022-11-12 11:46:34 +00:00
if [[ "$1" = "init" ]]; then
[ -f "$DB_FILE" ] && fail "Database file \"$DB_FILE\" already exists. Aborting."
cat "$DB_SCHEMA" | sqlite3 "$DB_FILE"
log "Empty database file \"$DB_FILE\" created."
exit 0
fi
2022-11-11 11:55:09 +00:00
if [[ "$1" = "add" ]]; then
shift
[ "$1" = "tag" ] && TABLE="tags" && COLUMN="label"
[ "$1" = "file" ] && TABLE="files" && COLUMN="filename"
2022-11-11 12:20:24 +00:00
# TODO: refactor the add function to allow adding hashes
# [ "$1" = "hash" ] && TABLE="hashes" && COLUMN="md5,filename"
2022-11-11 11:55:09 +00:00
shift
[ -z "$1" ] && fail "No value supplied."
COUNTER=0
while true; do
NEW_TAG="$1"
shift
sqlite3 -table "$DB_FILE" "INSERT INTO $TABLE ($COLUMN) VALUES (\"${NEW_TAG}\")"
2022-11-11 11:55:09 +00:00
COUNTER=$((COUNTER++))
[ -z "${1:-}" ] && break
done
sqlite3 -table "$DB_FILE" "SELECT * FROM \"$TABLE\" LIMIT $COUNTER"
2022-11-11 11:55:09 +00:00
exit 0
fi
if [[ "$1" = "list" ]]; then
[ -z "$2" ] && fail "No table supplied."
TABLE_NAME="$2"
sqlite3 -table "$DB_FILE" "SELECT * FROM \"${TABLE_NAME}\""
2022-11-11 11:55:09 +00:00
exit 0
fi
if [[ "$1" = "bytag" ]]; then
[ -z "$2" ] && fail "No tag supplied."
TAG_NAME="$2"
sqlite3 -table "$DB_FILE" "SELECT filename FROM files WHERE fid = (SELECT fid FROM tags_ties WHERE tid = (SELECT tid FROM tags WHERE label = \"${TAG_NAME}\"))"
2022-11-11 11:55:09 +00:00
exit 0
fi
if [[ "$1" = "tag" ]]; then
shift
[ -z "$1" ] && fail "No filename supplied."
FILENAME="$1"
shift
[ -z "$1" ] && fail "No tag supplied."
2022-11-11 12:20:11 +00:00
COUNTER=0
2022-11-11 11:55:09 +00:00
while true; do
LABEL="$1"
shift
sqlite3 -table "$DB_FILE" "INSERT INTO tags_ties (fid, tid) VALUES ((SELECT fid FROM files WHERE filename = \"$FILENAME\"),(SELECT tid FROM tags WHERE label = \"$LABEL\"))"
2022-11-11 12:20:11 +00:00
COUNTER=$((COUNTER++))
2022-11-11 11:55:09 +00:00
[ -z "${1:-}" ] && break
done
2022-11-11 12:20:11 +00:00
listtags "$FILENAME" "$COUNTER"
2022-11-11 11:55:09 +00:00
exit 0
fi
if [[ "$1" = "listtags" ]]; then
listtags "$2"
exit 0
fi