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.
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