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
|