|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
assignTags(){
|
|
|
|
local filename
|
|
|
|
local tags
|
|
|
|
local tagIDs
|
|
|
|
local tagIDsOr
|
|
|
|
local fileID
|
|
|
|
filename="$(findFile "$1")"
|
|
|
|
[ ! -e "$filename" ] && exit 1
|
|
|
|
tags="$(cat - | sed '/^$/d')"
|
|
|
|
fileID="$(findFileId "$filename")"
|
|
|
|
# If there are tags
|
|
|
|
if [ -n "$tags" ]; then
|
|
|
|
local values
|
|
|
|
local orlist
|
|
|
|
while read -r line; do
|
|
|
|
values+=",('$(safeSQL "$line")')"
|
|
|
|
orlist+=" OR name = '$(safeSQL "$line")'"
|
|
|
|
done <<<"$(echo "$tags")"
|
|
|
|
values="$(echo "$values" | sed 's/^,//')"
|
|
|
|
orlist="$(echo "$orlist" | sed 's/^ OR //')"
|
|
|
|
|
|
|
|
# Ensure that all the tags exist
|
|
|
|
echo "INSERT INTO tags (name) VALUES $values
|
|
|
|
EXCEPT SELECT name FROM tags;" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
|
|
|
|
# Get the tag ids we need to assosiate with the current file
|
|
|
|
tagIDs="$(echo "SELECT id FROM tags WHERE $orlist" |
|
|
|
|
sqlite3 "${sqliteFile}")"
|
|
|
|
|
|
|
|
#Loop through them all
|
|
|
|
while read -r tagID; do
|
|
|
|
tagIDsOr+=" OR tagID = $(safeSQL "$tagID")"
|
|
|
|
|
|
|
|
# Check the tag is already linkded with the file
|
|
|
|
local existing
|
|
|
|
existing="$(echo "SELECT id FROM links
|
|
|
|
WHERE itemID = $(safeSQL "$fileID")
|
|
|
|
AND tagID = $(safeSQL "$tagID")" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
)"
|
|
|
|
|
|
|
|
# If not, add a link
|
|
|
|
if [ -z "$existing" ]; then
|
|
|
|
echo "INSERT INTO links (itemID,tagID)
|
|
|
|
VALUES ($(safeSQL "$fileID"),$(safeSQL "$tagID"))" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
fi
|
|
|
|
done <<<"$(echo "$tagIDs")"
|
|
|
|
tagIDsOr="$(echo "$tagIDsOr" | sed 's/^ OR //')"
|
|
|
|
|
|
|
|
# Delete any links that are not in the list
|
|
|
|
echo "DELETE FROM links
|
|
|
|
WHERE itemID = $(safeSQL "$fileID")
|
|
|
|
AND NOT ( $tagIDsOr )" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
|
|
|
|
else # If there are no tags, simply delete any that are referenced
|
|
|
|
echo "DELETE FROM links WHERE itemID = '$(safeSQL "$fileID")'" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
listTags(){
|
|
|
|
vecho "listTags $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
local header="--header"
|
|
|
|
[ "$1" = "--noheader" ] && header=""
|
|
|
|
echo "SELECT tags.name,COUNT(links.id) count
|
|
|
|
FROM tags LEFT JOIN links ON tags.id = links.tagID
|
|
|
|
GROUP BY tags.id" |
|
|
|
|
sqlite3 --column $header "${sqliteFile}"
|
|
|
|
}
|
|
|
|
|
|
|
|
purgeTags(){
|
|
|
|
vecho "purgeTags $*"
|
|
|
|
echo "DELETE FROM tags WHERE id IN (
|
|
|
|
SELECT id FROM tags WHERE id NOT IN (SELECT tagID FROM links)
|
|
|
|
)"| sqlite3 --column --header "${sqliteFile}"
|
|
|
|
}
|