message-db 0.0.0 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/database/VERSION.txt +1 -0
  3. data/database/benchmark.sh +62 -0
  4. data/database/benchmark_get.sql +24 -0
  5. data/database/benchmark_write.sql +24 -0
  6. data/database/clear-messages.sh +26 -0
  7. data/database/extensions/pgcrypto.sql +1 -0
  8. data/database/functions/acquire-lock.sql +24 -0
  9. data/database/functions/cardinal-id.sql +18 -0
  10. data/database/functions/category.sql +10 -0
  11. data/database/functions/get-category-messages.sql +129 -0
  12. data/database/functions/get-last-stream-message.sql +37 -0
  13. data/database/functions/get-stream-messages.sql +71 -0
  14. data/database/functions/hash-64.sql +13 -0
  15. data/database/functions/id.sql +18 -0
  16. data/database/functions/is-category.sql +14 -0
  17. data/database/functions/message-store-version.sql +8 -0
  18. data/database/functions/stream-version.sql +19 -0
  19. data/database/functions/write-message.sql +73 -0
  20. data/database/indexes/messages-category.sql +7 -0
  21. data/database/indexes/messages-id.sql +5 -0
  22. data/database/indexes/messages-stream.sql +6 -0
  23. data/database/install-functions.sh +79 -0
  24. data/database/install-indexes.sh +33 -0
  25. data/database/install-privileges.sh +39 -0
  26. data/database/install-views.sh +42 -0
  27. data/database/install.sh +102 -0
  28. data/database/print-category-type-summary.sh +44 -0
  29. data/database/print-message-store-version.sh +32 -0
  30. data/database/print-messages.sh +44 -0
  31. data/database/print-stream-summary.sh +44 -0
  32. data/database/print-stream-type-summary.sh +44 -0
  33. data/database/print-type-category-summary.sh +44 -0
  34. data/database/print-type-stream-summary.sh +44 -0
  35. data/database/print-type-summary.sh +44 -0
  36. data/database/privileges/functions.sql +15 -0
  37. data/database/privileges/schema.sql +1 -0
  38. data/database/privileges/sequence.sql +1 -0
  39. data/database/privileges/table.sql +1 -0
  40. data/database/privileges/views.sql +6 -0
  41. data/database/roles/message-store.sql +7 -0
  42. data/database/schema/message-store.sql +1 -0
  43. data/database/tables/messages.sql +12 -0
  44. data/database/types/message.sql +15 -0
  45. data/database/uninstall.sh +54 -0
  46. data/database/update.sh +171 -0
  47. data/database/views/category-type-summary.sql +32 -0
  48. data/database/views/stream-summary.sql +28 -0
  49. data/database/views/stream-type-summary.sql +32 -0
  50. data/database/views/type-category-summary.sql +32 -0
  51. data/database/views/type-stream-summary.sql +32 -0
  52. data/database/views/type-summary.sql +28 -0
  53. data/database/write-test-message.sh +63 -0
  54. data/scripts/mdb-clear-messages +7 -0
  55. data/scripts/mdb-create-db +7 -0
  56. data/scripts/mdb-delete-db +7 -0
  57. data/scripts/mdb-install-functions +7 -0
  58. data/scripts/mdb-install-indexes +7 -0
  59. data/scripts/mdb-install-privileges +7 -0
  60. data/scripts/mdb-install-views +7 -0
  61. data/scripts/mdb-open-database-scripts-dir +5 -0
  62. data/scripts/mdb-print-category-type-summary +7 -0
  63. data/scripts/mdb-print-message-store-version +7 -0
  64. data/scripts/mdb-print-messages +7 -0
  65. data/scripts/mdb-print-stream-summary +7 -0
  66. data/scripts/mdb-print-stream-type-summary +7 -0
  67. data/scripts/mdb-print-type-category-summary +7 -0
  68. data/scripts/mdb-print-type-stream-summary +7 -0
  69. data/scripts/mdb-print-type-summary +7 -0
  70. data/scripts/mdb-recreate-db +11 -0
  71. data/scripts/mdb-update-db +7 -0
  72. data/scripts/mdb-write-test-message +7 -0
  73. metadata +95 -6
  74. 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,8 @@
1
+ CREATE OR REPLACE FUNCTION message_store.message_store_version()
2
+ RETURNS varchar
3
+ AS $$
4
+ BEGIN
5
+ RETURN '1.1.3';
6
+ END;
7
+ $$ LANGUAGE plpgsql
8
+ VOLATILE;
@@ -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,7 @@
1
+ DROP INDEX IF EXISTS message_store.messages_category;
2
+
3
+ CREATE INDEX messages_category ON message_store.messages (
4
+ message_store.category(stream_name),
5
+ global_position,
6
+ message_store.category(metadata->>'correlationStreamName')
7
+ );
@@ -0,0 +1,5 @@
1
+ DROP INDEX IF EXISTS message_store.messages_id;
2
+
3
+ CREATE UNIQUE INDEX messages_id ON message_store.messages (
4
+ id
5
+ );
@@ -0,0 +1,6 @@
1
+ DROP INDEX IF EXISTS messages_stream;
2
+
3
+ CREATE UNIQUE INDEX messages_stream ON message_store.messages (
4
+ stream_name,
5
+ position
6
+ );
@@ -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
@@ -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