message-db 0.0.0 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/database/VERSION.txt +1 -0
- data/database/benchmark.sh +62 -0
- data/database/benchmark_get.sql +24 -0
- data/database/benchmark_write.sql +24 -0
- data/database/clear-messages.sh +26 -0
- data/database/extensions/pgcrypto.sql +1 -0
- data/database/functions/acquire-lock.sql +24 -0
- data/database/functions/cardinal-id.sql +18 -0
- data/database/functions/category.sql +10 -0
- data/database/functions/get-category-messages.sql +129 -0
- data/database/functions/get-last-stream-message.sql +37 -0
- data/database/functions/get-stream-messages.sql +71 -0
- data/database/functions/hash-64.sql +13 -0
- data/database/functions/id.sql +18 -0
- data/database/functions/is-category.sql +14 -0
- data/database/functions/message-store-version.sql +8 -0
- data/database/functions/stream-version.sql +19 -0
- data/database/functions/write-message.sql +73 -0
- data/database/indexes/messages-category.sql +7 -0
- data/database/indexes/messages-id.sql +5 -0
- data/database/indexes/messages-stream.sql +6 -0
- data/database/install-functions.sh +79 -0
- data/database/install-indexes.sh +33 -0
- data/database/install-privileges.sh +39 -0
- data/database/install-views.sh +42 -0
- data/database/install.sh +102 -0
- data/database/print-category-type-summary.sh +44 -0
- data/database/print-message-store-version.sh +32 -0
- data/database/print-messages.sh +44 -0
- data/database/print-stream-summary.sh +44 -0
- data/database/print-stream-type-summary.sh +44 -0
- data/database/print-type-category-summary.sh +44 -0
- data/database/print-type-stream-summary.sh +44 -0
- data/database/print-type-summary.sh +44 -0
- data/database/privileges/functions.sql +15 -0
- data/database/privileges/schema.sql +1 -0
- data/database/privileges/sequence.sql +1 -0
- data/database/privileges/table.sql +1 -0
- data/database/privileges/views.sql +6 -0
- data/database/roles/message-store.sql +7 -0
- data/database/schema/message-store.sql +1 -0
- data/database/tables/messages.sql +12 -0
- data/database/types/message.sql +15 -0
- data/database/uninstall.sh +54 -0
- data/database/update.sh +171 -0
- data/database/views/category-type-summary.sql +32 -0
- data/database/views/stream-summary.sql +28 -0
- data/database/views/stream-type-summary.sql +32 -0
- data/database/views/type-category-summary.sql +32 -0
- data/database/views/type-stream-summary.sql +32 -0
- data/database/views/type-summary.sql +28 -0
- data/database/write-test-message.sh +63 -0
- data/scripts/mdb-clear-messages +7 -0
- data/scripts/mdb-create-db +7 -0
- data/scripts/mdb-delete-db +7 -0
- data/scripts/mdb-install-functions +7 -0
- data/scripts/mdb-install-indexes +7 -0
- data/scripts/mdb-install-privileges +7 -0
- data/scripts/mdb-install-views +7 -0
- data/scripts/mdb-open-database-scripts-dir +5 -0
- data/scripts/mdb-print-category-type-summary +7 -0
- data/scripts/mdb-print-message-store-version +7 -0
- data/scripts/mdb-print-messages +7 -0
- data/scripts/mdb-print-stream-summary +7 -0
- data/scripts/mdb-print-stream-type-summary +7 -0
- data/scripts/mdb-print-type-category-summary +7 -0
- data/scripts/mdb-print-type-stream-summary +7 -0
- data/scripts/mdb-print-type-summary +7 -0
- data/scripts/mdb-recreate-db +11 -0
- data/scripts/mdb-update-db +7 -0
- data/scripts/mdb-write-test-message +7 -0
- metadata +95 -6
- data/MIT-License.txt +0 -20
@@ -0,0 +1,13 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION message_store.hash_64(
|
2
|
+
value varchar
|
3
|
+
)
|
4
|
+
RETURNS bigint
|
5
|
+
AS $$
|
6
|
+
DECLARE
|
7
|
+
_hash bigint;
|
8
|
+
BEGIN
|
9
|
+
SELECT left('x' || md5(hash_64.value), 17)::bit(64)::bigint INTO _hash;
|
10
|
+
return _hash;
|
11
|
+
END;
|
12
|
+
$$ LANGUAGE plpgsql
|
13
|
+
IMMUTABLE;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION message_store.id(
|
2
|
+
stream_name varchar
|
3
|
+
)
|
4
|
+
RETURNS varchar
|
5
|
+
AS $$
|
6
|
+
DECLARE
|
7
|
+
_id_separator_position integer;
|
8
|
+
BEGIN
|
9
|
+
_id_separator_position := STRPOS(id.stream_name, '-');
|
10
|
+
|
11
|
+
IF _id_separator_position = 0 THEN
|
12
|
+
RETURN NULL;
|
13
|
+
END IF;
|
14
|
+
|
15
|
+
RETURN SUBSTRING(id.stream_name, _id_separator_position + 1);
|
16
|
+
END;
|
17
|
+
$$ LANGUAGE plpgsql
|
18
|
+
IMMUTABLE;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION message_store.is_category(
|
2
|
+
stream_name varchar
|
3
|
+
)
|
4
|
+
RETURNS boolean
|
5
|
+
AS $$
|
6
|
+
BEGIN
|
7
|
+
IF NOT STRPOS(is_category.stream_name, '-') = 0 THEN
|
8
|
+
RETURN FALSE;
|
9
|
+
END IF;
|
10
|
+
|
11
|
+
RETURN TRUE;
|
12
|
+
END;
|
13
|
+
$$ LANGUAGE plpgsql
|
14
|
+
IMMUTABLE;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION message_store.stream_version(
|
2
|
+
stream_name varchar
|
3
|
+
)
|
4
|
+
RETURNS bigint
|
5
|
+
AS $$
|
6
|
+
DECLARE
|
7
|
+
_stream_version bigint;
|
8
|
+
BEGIN
|
9
|
+
SELECT
|
10
|
+
max(position) into _stream_version
|
11
|
+
FROM
|
12
|
+
messages
|
13
|
+
WHERE
|
14
|
+
messages.stream_name = stream_version.stream_name;
|
15
|
+
|
16
|
+
RETURN _stream_version;
|
17
|
+
END;
|
18
|
+
$$ LANGUAGE plpgsql
|
19
|
+
VOLATILE;
|
@@ -0,0 +1,73 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION message_store.write_message(
|
2
|
+
id varchar,
|
3
|
+
stream_name varchar,
|
4
|
+
"type" varchar,
|
5
|
+
data jsonb,
|
6
|
+
metadata jsonb DEFAULT NULL,
|
7
|
+
expected_version bigint DEFAULT NULL
|
8
|
+
)
|
9
|
+
RETURNS bigint
|
10
|
+
AS $$
|
11
|
+
DECLARE
|
12
|
+
_message_id uuid;
|
13
|
+
_stream_version bigint;
|
14
|
+
_next_position bigint;
|
15
|
+
BEGIN
|
16
|
+
PERFORM acquire_lock(write_message.stream_name);
|
17
|
+
|
18
|
+
_stream_version := stream_version(write_message.stream_name);
|
19
|
+
|
20
|
+
IF _stream_version IS NULL THEN
|
21
|
+
_stream_version := -1;
|
22
|
+
END IF;
|
23
|
+
|
24
|
+
IF write_message.expected_version IS NOT NULL THEN
|
25
|
+
IF write_message.expected_version != _stream_version THEN
|
26
|
+
RAISE EXCEPTION
|
27
|
+
'Wrong expected version: % (Stream: %, Stream Version: %)',
|
28
|
+
write_message.expected_version,
|
29
|
+
write_message.stream_name,
|
30
|
+
_stream_version;
|
31
|
+
END IF;
|
32
|
+
END IF;
|
33
|
+
|
34
|
+
_next_position := _stream_version + 1;
|
35
|
+
|
36
|
+
_message_id = uuid(write_message.id);
|
37
|
+
|
38
|
+
INSERT INTO messages
|
39
|
+
(
|
40
|
+
id,
|
41
|
+
stream_name,
|
42
|
+
position,
|
43
|
+
type,
|
44
|
+
data,
|
45
|
+
metadata
|
46
|
+
)
|
47
|
+
VALUES
|
48
|
+
(
|
49
|
+
_message_id,
|
50
|
+
write_message.stream_name,
|
51
|
+
_next_position,
|
52
|
+
write_message.type,
|
53
|
+
write_message.data,
|
54
|
+
write_message.metadata
|
55
|
+
)
|
56
|
+
;
|
57
|
+
|
58
|
+
IF current_setting('message_store.debug_write', true) = 'on' OR current_setting('message_store.debug', true) = 'on' THEN
|
59
|
+
RAISE NOTICE '» write_message';
|
60
|
+
RAISE NOTICE 'id ($1): %', write_message.id;
|
61
|
+
RAISE NOTICE 'stream_name ($2): %', write_message.stream_name;
|
62
|
+
RAISE NOTICE 'type ($3): %', write_message.type;
|
63
|
+
RAISE NOTICE 'data ($4): %', write_message.data;
|
64
|
+
RAISE NOTICE 'metadata ($5): %', write_message.metadata;
|
65
|
+
RAISE NOTICE 'expected_version ($6): %', write_message.expected_version;
|
66
|
+
RAISE NOTICE '_stream_version: %', _stream_version;
|
67
|
+
RAISE NOTICE '_next_position: %', _next_position;
|
68
|
+
END IF;
|
69
|
+
|
70
|
+
RETURN _next_position;
|
71
|
+
END;
|
72
|
+
$$ LANGUAGE plpgsql
|
73
|
+
VOLATILE;
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function script_dir {
|
6
|
+
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
7
|
+
echo "$val"
|
8
|
+
}
|
9
|
+
|
10
|
+
function create-types {
|
11
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
12
|
+
database=message_store
|
13
|
+
echo "(DATABASE_NAME is not set. Using: $database.)"
|
14
|
+
else
|
15
|
+
database=$DATABASE_NAME
|
16
|
+
fi
|
17
|
+
|
18
|
+
base=$(script_dir)
|
19
|
+
|
20
|
+
echo "» message type"
|
21
|
+
psql $database -q -f $base/types/message.sql
|
22
|
+
}
|
23
|
+
|
24
|
+
function create-functions {
|
25
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
26
|
+
database=message_store
|
27
|
+
echo "(DATABASE_NAME is not set. Using: $database.)"
|
28
|
+
else
|
29
|
+
database=$DATABASE_NAME
|
30
|
+
fi
|
31
|
+
|
32
|
+
base=$(script_dir)
|
33
|
+
|
34
|
+
echo "» message_store_version function"
|
35
|
+
psql $database -q -f $base/functions/message-store-version.sql
|
36
|
+
|
37
|
+
echo "» hash_64 function"
|
38
|
+
psql $database -q -f $base/functions/hash-64.sql
|
39
|
+
|
40
|
+
echo "» acquire_lock function"
|
41
|
+
psql $database -q -f $base/functions/acquire-lock.sql
|
42
|
+
|
43
|
+
echo "» category function"
|
44
|
+
psql $database -q -f $base/functions/category.sql
|
45
|
+
|
46
|
+
echo "» is_category function"
|
47
|
+
psql $database -q -f $base/functions/is-category.sql
|
48
|
+
|
49
|
+
echo "» id function"
|
50
|
+
psql $database -q -f $base/functions/id.sql
|
51
|
+
|
52
|
+
echo "» cardinal_id function"
|
53
|
+
psql $database -q -f $base/functions/cardinal-id.sql
|
54
|
+
|
55
|
+
echo "» stream_version function"
|
56
|
+
psql $database -q -f $base/functions/stream-version.sql
|
57
|
+
|
58
|
+
echo "» write_message function"
|
59
|
+
psql $database -q -f $base/functions/write-message.sql
|
60
|
+
|
61
|
+
echo "» get_stream_messages function"
|
62
|
+
psql $database -q -f $base/functions/get-stream-messages.sql
|
63
|
+
|
64
|
+
echo "» get_category_messages function"
|
65
|
+
psql $database -q -f $base/functions/get-category-messages.sql
|
66
|
+
|
67
|
+
echo "» get_last_stream_message function"
|
68
|
+
psql $database -q -f $base/functions/get-last-stream-message.sql
|
69
|
+
}
|
70
|
+
|
71
|
+
echo "Creating Types"
|
72
|
+
echo "- - -"
|
73
|
+
create-types
|
74
|
+
echo
|
75
|
+
|
76
|
+
echo "Creating Functions"
|
77
|
+
echo "- - -"
|
78
|
+
create-functions
|
79
|
+
echo
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function script_dir {
|
6
|
+
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
7
|
+
echo "$val"
|
8
|
+
}
|
9
|
+
|
10
|
+
function create-indexes {
|
11
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
12
|
+
database=message_store
|
13
|
+
echo "(DATABASE_NAME is not set. Using: $database.)"
|
14
|
+
else
|
15
|
+
database=$DATABASE_NAME
|
16
|
+
fi
|
17
|
+
|
18
|
+
base=$(script_dir)
|
19
|
+
|
20
|
+
echo "» messages_id index"
|
21
|
+
psql $database -q -f $base/indexes/messages-id.sql
|
22
|
+
|
23
|
+
echo "» messages_stream index"
|
24
|
+
psql $database -q -f $base/indexes/messages-stream.sql
|
25
|
+
|
26
|
+
echo "» messages_category index"
|
27
|
+
psql $database -q -f $base/indexes/messages-category.sql
|
28
|
+
}
|
29
|
+
|
30
|
+
echo "Creating Indexes"
|
31
|
+
echo "- - -"
|
32
|
+
create-indexes
|
33
|
+
echo
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function script_dir {
|
6
|
+
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
7
|
+
echo "$val"
|
8
|
+
}
|
9
|
+
|
10
|
+
function grant-privileges {
|
11
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
12
|
+
database=message_store
|
13
|
+
echo "(DATABASE_NAME is not set. Using: $database.)"
|
14
|
+
else
|
15
|
+
database=$DATABASE_NAME
|
16
|
+
fi
|
17
|
+
|
18
|
+
base=$(script_dir)
|
19
|
+
|
20
|
+
echo "» schema privileges"
|
21
|
+
psql $database -q -f $base/privileges/schema.sql
|
22
|
+
|
23
|
+
echo "» messages table privileges"
|
24
|
+
psql $database -q -f $base/privileges/table.sql
|
25
|
+
|
26
|
+
echo "» sequence privileges"
|
27
|
+
psql $database -q -f $base/privileges/sequence.sql
|
28
|
+
|
29
|
+
echo "» functions privileges"
|
30
|
+
psql $database -q -f $base/privileges/functions.sql
|
31
|
+
|
32
|
+
echo "» views privileges"
|
33
|
+
psql $database -q -f $base/privileges/views.sql
|
34
|
+
}
|
35
|
+
|
36
|
+
echo "Granting Privileges"
|
37
|
+
echo "- - -"
|
38
|
+
grant-privileges
|
39
|
+
echo
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function script_dir {
|
6
|
+
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
7
|
+
echo "$val"
|
8
|
+
}
|
9
|
+
|
10
|
+
function create-views {
|
11
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
12
|
+
database=message_store
|
13
|
+
echo "(DATABASE_NAME is not set. Using: $database.)"
|
14
|
+
else
|
15
|
+
database=$DATABASE_NAME
|
16
|
+
fi
|
17
|
+
|
18
|
+
base=$(script_dir)
|
19
|
+
|
20
|
+
echo "» stream_summary view"
|
21
|
+
psql $database -q -f $base/views/stream-summary.sql
|
22
|
+
|
23
|
+
echo "» type_summary view"
|
24
|
+
psql $database -q -f $base/views/type-summary.sql
|
25
|
+
|
26
|
+
echo "» stream_type_summary view"
|
27
|
+
psql $database -q -f $base/views/stream-type-summary.sql
|
28
|
+
|
29
|
+
echo "» type_stream_summary view"
|
30
|
+
psql $database -q -f $base/views/type-stream-summary.sql
|
31
|
+
|
32
|
+
echo "» category_type_summary view"
|
33
|
+
psql $database -q -f $base/views/category-type-summary.sql
|
34
|
+
|
35
|
+
echo "» type_category_summary view"
|
36
|
+
psql $database -q -f $base/views/type-category-summary.sql
|
37
|
+
}
|
38
|
+
|
39
|
+
echo "Creating Views"
|
40
|
+
echo "- - -"
|
41
|
+
create-views
|
42
|
+
echo
|
data/database/install.sh
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
function script_dir {
|
6
|
+
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
7
|
+
echo "$val"
|
8
|
+
}
|
9
|
+
|
10
|
+
base=$(script_dir)
|
11
|
+
|
12
|
+
echo
|
13
|
+
echo "Installing Database"
|
14
|
+
echo "Version: $(cat $base/VERSION.txt)"
|
15
|
+
echo "= = ="
|
16
|
+
|
17
|
+
if [ -z ${DATABASE_NAME+x} ]; then
|
18
|
+
database=message_store
|
19
|
+
echo "DATABASE_NAME is not set. Using: $database."
|
20
|
+
export DATABASE_NAME=$database
|
21
|
+
else
|
22
|
+
database=$DATABASE_NAME
|
23
|
+
fi
|
24
|
+
|
25
|
+
if [ -z ${PGOPTIONS+x} ]; then
|
26
|
+
export PGOPTIONS='-c client_min_messages=warning'
|
27
|
+
fi
|
28
|
+
|
29
|
+
function create-user {
|
30
|
+
base=$(script_dir)
|
31
|
+
|
32
|
+
echo "» message_store role"
|
33
|
+
psql -q -f $base/roles/message-store.sql
|
34
|
+
}
|
35
|
+
|
36
|
+
function create-database {
|
37
|
+
echo "» $database database"
|
38
|
+
createdb $database
|
39
|
+
}
|
40
|
+
|
41
|
+
function create-schema {
|
42
|
+
echo "» message_store schema"
|
43
|
+
psql $database -q -f $base/schema/message-store.sql
|
44
|
+
}
|
45
|
+
|
46
|
+
function create-extensions {
|
47
|
+
base=$(script_dir)
|
48
|
+
|
49
|
+
echo "» pgcrypto extension"
|
50
|
+
psql $database -q -f $base/extensions/pgcrypto.sql
|
51
|
+
}
|
52
|
+
|
53
|
+
function create-table {
|
54
|
+
base=$(script_dir)
|
55
|
+
|
56
|
+
echo "» messages table"
|
57
|
+
psql $database -q -f $base/tables/messages.sql
|
58
|
+
}
|
59
|
+
|
60
|
+
echo
|
61
|
+
|
62
|
+
echo "Creating User"
|
63
|
+
echo "- - -"
|
64
|
+
create-user
|
65
|
+
echo
|
66
|
+
|
67
|
+
echo "Creating Database"
|
68
|
+
echo "- - -"
|
69
|
+
create-database
|
70
|
+
echo
|
71
|
+
|
72
|
+
echo "Creating Schema"
|
73
|
+
echo "- - -"
|
74
|
+
create-schema
|
75
|
+
echo
|
76
|
+
|
77
|
+
echo "Creating Extensions"
|
78
|
+
echo "- - -"
|
79
|
+
create-extensions
|
80
|
+
echo
|
81
|
+
|
82
|
+
echo "Creating Table"
|
83
|
+
echo "- - -"
|
84
|
+
create-table
|
85
|
+
echo
|
86
|
+
|
87
|
+
# Install functions
|
88
|
+
source $base/install-functions.sh
|
89
|
+
|
90
|
+
# Install indexes
|
91
|
+
source $base/install-indexes.sh
|
92
|
+
|
93
|
+
# Install views
|
94
|
+
source $base/install-views.sh
|
95
|
+
|
96
|
+
# Install privileges
|
97
|
+
source $base/install-privileges.sh
|
98
|
+
|
99
|
+
echo "= = ="
|
100
|
+
echo "Done Installing Database"
|
101
|
+
echo "Version: $(cat $base/VERSION.txt)"
|
102
|
+
echo
|