summaryrefslogtreecommitdiff
path: root/src/q
blob: bf7be22f814cee8dc2e38e7ce7d6968c30e8f29f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/sh
set -eu


usage() {
	echo 'Usage: q TOPIC ACTION [OPTION]'
}

CONSUMER='default-consumer'
DIR="${Q_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/q}/topics"
while getopts 'C:D:' flag; do
	case "$flag" in
		(C)
			CONSUMER="$OPTARG"
			;;
		(D)
			DIR="$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="$DIR/$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