diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/q | 116 |
1 files changed, 116 insertions, 0 deletions
@@ -0,0 +1,116 @@ +#!/bin/sh +set -eu + + +usage() { + echo 'Usage: q TOPIC ACTION [OPTION]' +} + +CONSUMER='default-consumer' +while getopts 'C:' flag; do + case "$flag" in + C) + CONSUMER="$OPTARG" + ;; + *) + usage >&2 + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) + +TOPIC="${1:-}" +ACTION="${2:-}" + +eval "$(assert-arg -- "$TOPIC" 'TOPIC')" +eval "$(assert-arg -- "$ACTION" 'ACTION')" + + +Q_DIR="${Q_DIR:-$XDG_DATA_HOME/q}/topics/$TOPIC" +mkdir -p "$Q_DIR" +cd "$Q_DIR" + +mkdir -p tmp cur dead/"$CONSUMER" offset/"$CONSUMER" + +for f in n offset/"$CONSUMER"/n; do + if [ ! -e "$f" ]; then + echo 0 > "$f" + fi +done + + +case "$ACTION" in + in) + N="$(cat n)" + ID="$(uuid)" + cat > tmp/"$ID" + mv tmp/"$ID" cur/"$N" + echo $((N + 1)) > n + ;; + out) + N="$(cat offset/"$CONSUMER"/n)" + if [ ! -e cur/"$N" ]; then + exit 3 + fi + cat cur/"$N" + ;; + commit) + N="$(cat offset/"$CONSUMER"/n)" + if [ ! -e cur/"$N" ]; then + exit 3 + fi + echo $((N + 1)) > offset/"$CONSUMER"/n + ;; + dead) + N="$(cat offset/"$CONSUMER"/n)" + if [ ! -e cur/"$N" ]; then + exit 3 + fi + touch "dead/$CONSUMER/$N" + echo $((N + 1)) > offset/"$CONSUMER"/n + ;; + ls-dead) + ( + cd dead/"$CONSUMER"/ + find * 2>/dev/null | sort -n + ) + ;; + cat) + eval "$(assert-arg -- "${3:-}" 'N')" + OLD_N="$3" + if [ ! -e cur/"$OLD_N" ]; then + exit 3 + fi + cat cur/"$OLD_N" + ;; + revive) + eval "$(assert-arg -- "${3:-}" 'N')" + OLD_N="$3" + if [ ! -e dead/"$CONSUMER"/"$OLD_N" ]; then + exit 3 + fi + N="$(cat n)" + ln -s "$OLD_N" cur/"$N" + echo $((N + 1)) > n + rm -f dead/"$CONSUMER"/"$OLD_N" + ;; + size) + cat n + ;; + offset) + cat offset/"$CONSUMER"/n + ;; + has-data) + ! cmp -s n offset/"$CONSUMER"/n + ;; + reset) + eval "$(assert-arg -- "${3:-}" 'N')" + N="$3" + echo "$N" > offset/"$CONSUMER"/n + ;; + *) + echo "Bad ACTION: $ACTION" >&2 + exit 2 + ;; +esac |