File: generate-snapshot.sh

package info (click to toggle)
dqlite 1.18.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,372 kB
  • sloc: ansic: 57,583; makefile: 336; sh: 243
file content (101 lines) | stat: -rwxr-xr-x 2,148 bytes parent folder | download
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
#!/bin/sh

ROW_COUNT=1000
WAL_AUTOCHECKPOINT=0
MAIN_ONLY=0
usage() {
	cat <<USAGE
Usage: generate-snapshot.sh [--main-only] [--wal-limit <num>] [--row-count <num>] <output-dir>

Options:
  --main-only         Generate a main database only snapshot (no WAL)
  --wal-limit <num>   Maximum amount of WAL pages to keep (default: 0 - unbounded)
  --row-count <num>   Number of rows to generate (default: 1000)
  -h, --help          Show this help message

USAGE
	exit 0
}

# Parse arguments.
while [ $# -gt 0 ]; do
	case "$1" in
        --main-only)
            MAIN_ONLY=1
            shift 1
            ;;
		--wal-limit)
			if [ -z "$2" ]; then
				echo "Error: --wal-limit requires a value" >&2
				usage
			fi
			WAL_AUTOCHECKPOINT="$2"
			shift 2
			;;
		--row-count)
			if [ -z "$2" ]; then
				echo "Error: --row-count requires a value" >&2
				usage
			fi
			ROW_COUNT="$2"
			shift 2
			;;
		-h|--help)
			usage
			;;
		*)
			if [ -n "$OUTPUT_DIR" ]; then
                echo "Error: unknown option '$1'" >&2
                usage
            fi
            OUTPUT_DIR="$1"
            shift 1
			;;
	esac
done

if [ -z "$OUTPUT_DIR" ]; then
	echo "Error: Missing output directory" >&2
	usage
fi

# Cleanup.
trap 'rm -f temp temp-wal temp-shm' EXIT

SQLITE3_CHECKPOINT_ON_CLOSE=""
if [ "$MAIN_ONLY" -eq 0 ]; then
    SQLITE3_CHECKPOINT_ON_CLOSE=".dbconfig no_ckpt_on_close on"
fi

# First generate a sqlite3 database.
echo -n "Generating database with $ROW_COUNT rows..."
cat <<EOF | sqlite3 temp > /dev/null 2>&1
PRAGMA journal_mode=WAL;
PRAGMA wal_autocheckpoint=$WAL_AUTOCHECKPOINT;
$SQLITE3_CHECKPOINT_ON_CLOSE

CREATE TABLE test(id INTEGER PRIMARY KEY, value TEXT NOT NULL);
WITH RECURSIVE sequence AS (
   SELECT 1 AS id

   UNION ALL

   SELECT id + 1
   FROM sequence
   WHERE id < $ROW_COUNT
)
INSERT OR REPLACE INTO test
SELECT id, hex(randomblob(16))
FROM sequence;
EOF
echo "Done"

# Now generate a dqlite snapshot from the sqlite3 database.
echo -n "Generating snapshot in '$OUTPUT_DIR'..."
cat <<EOF | dqlite-utils > /dev/null 2>&1
.snapshot
.add-server "1"
ATTACH DATABASE "temp" AS test;
.finish "$OUTPUT_DIR"
EOF
echo "Done"