#!/usr/bin/env bash set -ueo pipefail # usage: # - 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 fail() { echo "$1" >&2; exit 1 } listtags() { [ -z "$1" ] && fail "No filename supplied." FILENAME="$1" sqlite3 -table tags.db "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\"" } if [[ "$1" = "add" ]]; then shift [ "$1" = "tag" ] && TABLE="tags" && COLUMN="label" [ "$1" = "file" ] && TABLE="files" && COLUMN="filename" shift [ -z "$1" ] && fail "No value supplied." COUNTER=0 while true; do NEW_TAG="$1" shift sqlite3 -table tags.db "INSERT INTO $TABLE ($COLUMN) VALUES (\"${NEW_TAG}\")" COUNTER=$((COUNTER++)) [ -z "${1:-}" ] && break done sqlite3 -table tags.db "SELECT * FROM \"$TABLE\" LIMIT $COUNTER" exit 0 fi if [[ "$1" = "list" ]]; then [ -z "$2" ] && fail "No table supplied." TABLE_NAME="$2" sqlite3 -table tags.db "SELECT * FROM \"${TABLE_NAME}\"" exit 0 fi if [[ "$1" = "bytag" ]]; then [ -z "$2" ] && fail "No tag supplied." TAG_NAME="$2" sqlite3 -table tags.db "SELECT filename FROM files WHERE fid = (SELECT fid FROM tags_ties WHERE tid = (SELECT tid FROM tags WHERE label = \"${TAG_NAME}\"))" exit 0 fi if [[ "$1" = "tag" ]]; then shift [ -z "$1" ] && fail "No filename supplied." FILENAME="$1" shift [ -z "$1" ] && fail "No tag supplied." while true; do LABEL="$1" shift sqlite3 -table tags.db "INSERT INTO tags_ties (fid, tid) VALUES ((SELECT fid FROM files WHERE filename = \"$FILENAME\"),(SELECT tid FROM tags WHERE label = \"$LABEL\"))" [ -z "${1:-}" ] && break done listtags "$FILENAME" exit 0 fi if [[ "$1" = "listtags" ]]; then listtags "$2" exit 0 fi