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
2022-11-11 11:58:15 +00:00
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
2022-11-11 11:58:15 +00:00
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
2022-11-11 11:58:15 +00:00
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 "
2022-11-11 11:58:15 +00:00
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 "
2022-11-11 11:58:15 +00:00
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
2022-11-11 11:58:15 +00:00
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