evt-message_store-postgres-database 0.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a0f4bb6cb696f88af5f25636de90de8a77dd47c1998c7b8a92a4a053debd2328
4
+ data.tar.gz: b5f19af7297e09cee6cc1a15d708756618ebf499be46435d2c0bf468540a810e
5
+ SHA512:
6
+ metadata.gz: 59b9a5d456bfbb21649322559cbf9335478c1afc78012dac917985c5687f43dfaf32fb0a370771a1e05ca6c934258b43f51919ba9d8c045f5c4170aabb6e86f8
7
+ data.tar.gz: e026fca219bf6bfa0abc15d70f683f9a2c32c113d25b81e46fadbdc74674f72441c8aa56722a681939c0088957c61e3b7709a558c7abf869e9c7a4596b6d60da
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo
6
+ echo "Clearing Events Table"
7
+ echo "= = ="
8
+ echo
9
+
10
+ default_name=message_store
11
+
12
+ if [ -z ${DATABASE_USER+x} ]; then
13
+ echo "(DATABASE_USER is not set)"
14
+ user=$default_name
15
+ else
16
+ user=$DATABASE_USER
17
+ fi
18
+ echo "Database user is: $user"
19
+
20
+ if [ -z ${DATABASE_NAME+x} ]; then
21
+ echo "(DATABASE_NAME is not set)"
22
+ database=$default_name
23
+ else
24
+ database=$DATABASE_NAME
25
+ fi
26
+ echo "Database name is: $database"
27
+
28
+ default_table_name=messages
29
+
30
+ if [ -z ${TABLE_NAME+x} ]; then
31
+ echo "(TABLE_NAME is not set)"
32
+ table=$default_table_name
33
+ else
34
+ table=$TABLE_NAME
35
+ fi
36
+ echo "Table name is: $table"
37
+
38
+ echo
39
+
40
+ psql $database -c "TRUNCATE $table RESTART IDENTITY;"
@@ -0,0 +1 @@
1
+ CREATE EXTENSION IF NOT EXISTS "pgcrypto";
@@ -0,0 +1,10 @@
1
+ CREATE OR REPLACE FUNCTION category(
2
+ _stream_name varchar
3
+ )
4
+ RETURNS varchar
5
+ AS $$
6
+ BEGIN
7
+ return split_part(_stream_name, '-', 1);
8
+ END;
9
+ $$ LANGUAGE plpgsql
10
+ IMMUTABLE;
@@ -0,0 +1,45 @@
1
+ CREATE OR REPLACE FUNCTION get_category_messages(
2
+ _stream_name varchar,
3
+ _position bigint DEFAULT 0,
4
+ _batch_size bigint DEFAULT 1000,
5
+ _condition varchar DEFAULT NULL
6
+ )
7
+ RETURNS SETOF message
8
+ AS $$
9
+ DECLARE
10
+ command text;
11
+ BEGIN
12
+ command := '
13
+ SELECT
14
+ id::varchar,
15
+ stream_name::varchar,
16
+ type::varchar,
17
+ position::bigint,
18
+ global_position::bigint,
19
+ data::varchar,
20
+ metadata::varchar,
21
+ time::timestamp
22
+ FROM
23
+ messages
24
+ WHERE
25
+ category(stream_name) = $1 AND
26
+ global_position >= $2';
27
+
28
+ if _condition is not null then
29
+ command := command || ' AND
30
+ %s';
31
+ command := format(command, _condition);
32
+ end if;
33
+
34
+ command := command || '
35
+ ORDER BY
36
+ global_position ASC
37
+ LIMIT
38
+ $3';
39
+
40
+ -- RAISE NOTICE '%', command;
41
+
42
+ RETURN QUERY EXECUTE command USING _stream_name, _position, _batch_size;
43
+ END;
44
+ $$ LANGUAGE plpgsql
45
+ VOLATILE;
@@ -0,0 +1,33 @@
1
+ CREATE OR REPLACE FUNCTION get_last_message(
2
+ _stream_name varchar
3
+ )
4
+ RETURNS SETOF message
5
+ AS $$
6
+ DECLARE
7
+ command text;
8
+ BEGIN
9
+ command := '
10
+ SELECT
11
+ id::varchar,
12
+ stream_name::varchar,
13
+ type::varchar,
14
+ position::bigint,
15
+ global_position::bigint,
16
+ data::varchar,
17
+ metadata::varchar,
18
+ time::timestamp
19
+ FROM
20
+ messages
21
+ WHERE
22
+ stream_name = $1
23
+ ORDER BY
24
+ position DESC
25
+ LIMIT
26
+ 1';
27
+
28
+ -- RAISE NOTICE '%', command;
29
+
30
+ RETURN QUERY EXECUTE command USING _stream_name;
31
+ END;
32
+ $$ LANGUAGE plpgsql
33
+ VOLATILE;
@@ -0,0 +1,45 @@
1
+ CREATE OR REPLACE FUNCTION get_stream_messages(
2
+ _stream_name varchar,
3
+ _position bigint DEFAULT 0,
4
+ _batch_size bigint DEFAULT 1000,
5
+ _condition varchar DEFAULT NULL
6
+ )
7
+ RETURNS SETOF message
8
+ AS $$
9
+ DECLARE
10
+ command text;
11
+ BEGIN
12
+ command := '
13
+ SELECT
14
+ id::varchar,
15
+ stream_name::varchar,
16
+ type::varchar,
17
+ position::bigint,
18
+ global_position::bigint,
19
+ data::varchar,
20
+ metadata::varchar,
21
+ time::timestamp
22
+ FROM
23
+ messages
24
+ WHERE
25
+ stream_name = $1 AND
26
+ position >= $2';
27
+
28
+ if _condition is not null then
29
+ command := command || ' AND
30
+ %s';
31
+ command := format(command, _condition);
32
+ end if;
33
+
34
+ command := command || '
35
+ ORDER BY
36
+ position ASC
37
+ LIMIT
38
+ $3';
39
+
40
+ -- RAISE NOTICE '%', command;
41
+
42
+ RETURN QUERY EXECUTE command USING _stream_name, _position, _batch_size;
43
+ END;
44
+ $$ LANGUAGE plpgsql
45
+ VOLATILE;
@@ -0,0 +1,13 @@
1
+ CREATE OR REPLACE FUNCTION hash_64(
2
+ _stream_name varchar
3
+ )
4
+ RETURNS bigint
5
+ AS $$
6
+ DECLARE
7
+ hash bigint;
8
+ BEGIN
9
+ select left('x' || md5(_stream_name), 16)::bit(64)::bigint into hash;
10
+ return hash;
11
+ END;
12
+ $$ LANGUAGE plpgsql
13
+ IMMUTABLE;
@@ -0,0 +1,68 @@
1
+ :stream_name, na(:position), na(:batch_size), :condition
2
+
3
+
4
+ module Defaults
5
+ def self.position
6
+ 0
7
+ end
8
+
9
+ def self.batch_size
10
+ 1000
11
+ end
12
+ end
13
+
14
+
15
+ - - -
16
+
17
+ command := 'SELECT * FROM messages WHERE $1';
18
+ RETURN QUERY EXECUTE command USING where_clause;
19
+
20
+ - - -
21
+ select * from messages where metadata @> '{"correlationStreamName":"someCorrelation"}';
22
+ - - -
23
+ select * from get_messages($$metadata @> '{"correlationStreamName":"someCorrelation"}'$$);
24
+ - - -
25
+
26
+
27
+ _sql := format('
28
+ SELECT *
29
+ FROM (
30
+ SELECT p.person_id, p.name, p.team, %1$s(s.score)::int AS score
31
+ ,rank() OVER (PARTITION BY p.team
32
+ ORDER BY %1$s(s.score) DESC)::int AS rnk
33
+ FROM person p
34
+ %2$s score s USING (person_id)
35
+ %3$s
36
+ GROUP BY 1
37
+ ) sub
38
+ WHERE rnk < 3
39
+ ORDER BY team, rnk'
40
+ , _agg
41
+ , CASE WHEN _left_join THEN 'LEFT JOIN' ELSE 'JOIN' END
42
+ , CASE WHEN _where_name <> '' THEN 'WHERE p.name LIKE $1' ELSE '' END
43
+ );
44
+
45
+ -- debug -- quote when tested ok
46
+ -- RAISE NOTICE '%', _sql;
47
+
48
+ -- execute -- unquote when tested ok
49
+ RETURN QUERY EXECUTE _sql
50
+
51
+
52
+ - - -
53
+
54
+ CREATE OR REPLACE FUNCTION get_messages()
55
+ RETURNS SETOF messages
56
+ AS $$
57
+ DECLARE
58
+ _sql text;
59
+ BEGIN
60
+
61
+ _sql := 'RETURN QUERY SELECT * FROM messages'
62
+
63
+ -- RETURN QUERY EXECUTE _sql
64
+
65
+ RETURN QUERY SELECT * FROM messages;
66
+ END;
67
+ $$ LANGUAGE plpgsql
68
+ VOLATILE;
@@ -0,0 +1,14 @@
1
+ CREATE OR REPLACE FUNCTION stream_version(
2
+ _stream_name varchar
3
+ )
4
+ RETURNS bigint
5
+ AS $$
6
+ DECLARE
7
+ stream_version bigint;
8
+ BEGIN
9
+ select max(position) into stream_version from messages where stream_name = _stream_name;
10
+
11
+ return stream_version;
12
+ END;
13
+ $$ LANGUAGE plpgsql
14
+ VOLATILE;
@@ -0,0 +1,60 @@
1
+ CREATE OR REPLACE FUNCTION 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
+ position bigint;
15
+ category varchar;
16
+ stream_name_hash bigint;
17
+ BEGIN
18
+ message_id = uuid(_id);
19
+
20
+ stream_name_hash = hash_64(_stream_name);
21
+ PERFORM pg_advisory_xact_lock(stream_name_hash);
22
+
23
+ stream_version := stream_version(_stream_name);
24
+
25
+ if stream_version is null then
26
+ stream_version := -1;
27
+ end if;
28
+
29
+ if _expected_version is not null then
30
+ if _expected_version != stream_version then
31
+ raise exception 'Wrong expected version: % (Stream: %, Stream Version: %)', _expected_version, _stream_name, stream_version;
32
+ end if;
33
+ end if;
34
+
35
+ position := stream_version + 1;
36
+
37
+ insert into "messages"
38
+ (
39
+ "id",
40
+ "stream_name",
41
+ "position",
42
+ "type",
43
+ "data",
44
+ "metadata"
45
+ )
46
+ values
47
+ (
48
+ message_id,
49
+ _stream_name,
50
+ position,
51
+ _type,
52
+ _data,
53
+ _metadata
54
+ )
55
+ ;
56
+
57
+ return position;
58
+ END;
59
+ $$ LANGUAGE plpgsql
60
+ VOLATILE;
@@ -0,0 +1 @@
1
+ CREATE INDEX CONCURRENTLY "messages_category_global_position_idx" ON "public"."messages" USING btree(category(stream_name) COLLATE "default" "pg_catalog"."text_ops" ASC NULLS LAST, "global_position" "pg_catalog"."int8_ops" ASC NULLS LAST);
@@ -0,0 +1 @@
1
+ CREATE INDEX CONCURRENTLY "messages_id_idx" ON "public"."messages" USING btree(id ASC NULLS LAST);
@@ -0,0 +1 @@
1
+ CREATE UNIQUE INDEX CONCURRENTLY "messages_stream_name_position_uniq_idx" ON "public"."messages" USING btree(stream_name COLLATE "default" "pg_catalog"."text_ops" ASC NULLS LAST, "position" "pg_catalog"."int8_ops" ASC NULLS LAST);
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo
6
+ echo "Installing Database"
7
+ echo "= = ="
8
+ echo
9
+
10
+ default_name=message_store
11
+
12
+ if [ -z ${DATABASE_USER+x} ]; then
13
+ echo "(DATABASE_USER is not set. Default will be used.)"
14
+ user=$default_name
15
+ else
16
+ user=$DATABASE_USER
17
+ fi
18
+
19
+ if [ -z ${DATABASE_NAME+x} ]; then
20
+ echo "(DATABASE_NAME is not set. Default will be used.)"
21
+ database=$default_name
22
+ else
23
+ database=$DATABASE_NAME
24
+ fi
25
+
26
+ echo
27
+
28
+ function create-user {
29
+ echo "Database user is: $user"
30
+ createuser -s $user
31
+ echo
32
+ }
33
+
34
+ function create-database {
35
+ echo "Database name is: $database"
36
+ echo "Creating database \"$database\"..."
37
+ createdb $database
38
+ echo
39
+ }
40
+
41
+ function script_dir {
42
+ val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
43
+ echo "$val"
44
+ }
45
+
46
+ function create-extensions {
47
+ echo "Creating extensions..."
48
+ base=$(script_dir)
49
+ psql $database -f $base/extensions.sql
50
+ echo
51
+ }
52
+
53
+ function create-table {
54
+ echo "Creating messages table..."
55
+ psql $database -f $base/table/messages-table.sql
56
+ echo
57
+ }
58
+
59
+ function create-types {
60
+ base=$(script_dir)
61
+ echo "Creating types..."
62
+
63
+ echo "message type"
64
+ psql $database -f $base/types/message.sql
65
+
66
+ echo
67
+ }
68
+
69
+ function create-functions {
70
+ echo "Creating functions..."
71
+ base=$(script_dir)
72
+
73
+ echo "hash_64 function"
74
+ psql $database -f $base/functions/hash-64.sql
75
+
76
+ echo "category function"
77
+ psql $database -f $base/functions/category.sql
78
+
79
+ echo "stream_version function"
80
+ psql $database -f $base/functions/stream-version.sql
81
+
82
+ echo "write_message function"
83
+ psql $database -f $base/functions/write-message.sql
84
+
85
+ echo "get_stream_messages function"
86
+ psql $database -f $base/functions/get-stream-messages.sql
87
+
88
+ echo "get_category_messages function"
89
+ psql $database -f $base/functions/get-category-messages.sql
90
+
91
+ echo "get_last_message function"
92
+ psql $database -f $base/functions/get-last-message.sql
93
+
94
+ echo
95
+ }
96
+
97
+ function create-indexes {
98
+ echo "Creating indexes..."
99
+ base=$(script_dir)
100
+
101
+ echo "messages_id_idx"
102
+ psql $database -f $base/indexes/messages-id.sql
103
+
104
+ echo "messages_category_global_position_idx"
105
+ psql $database -f $base/indexes/messages-category-global-position.sql
106
+
107
+ echo "messages_stream_name_position_uniq_idx"
108
+ psql $database -f $base/indexes/messages-stream-name-position-uniq.sql
109
+
110
+ echo
111
+ }
112
+
113
+ create-user
114
+ create-database
115
+ create-extensions
116
+ create-table
117
+ create-types
118
+ create-functions
119
+ create-indexes
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo
6
+ echo "Installing Functions"
7
+ echo "= = ="
8
+ echo
9
+
10
+ default_name=message_store
11
+
12
+ if [ -z ${DATABASE_NAME+x} ]; then
13
+ echo "(DATABASE_NAME is not set. Default will be used.)"
14
+ database=$default_name
15
+ else
16
+ database=$DATABASE_NAME
17
+ fi
18
+
19
+ echo
20
+
21
+ function script_dir {
22
+ val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
23
+ echo "$val"
24
+ }
25
+
26
+ function create-types {
27
+ base=$(script_dir)
28
+ echo "Creating types..."
29
+
30
+ echo "message type"
31
+ psql $database -f $base/types/message.sql
32
+
33
+ echo
34
+ }
35
+
36
+ function create-functions {
37
+ echo "Creating functions..."
38
+ base=$(script_dir)
39
+
40
+ echo "hash_64 function"
41
+ psql $database -f $base/functions/hash-64.sql
42
+
43
+ echo "category function"
44
+ psql $database -f $base/functions/category.sql
45
+
46
+ echo "stream_version function"
47
+ psql $database -f $base/functions/stream-version.sql
48
+
49
+ echo "write_message function"
50
+ psql $database -f $base/functions/write-message.sql
51
+
52
+ echo "get_stream_messages function"
53
+ psql $database -f $base/functions/get-stream-messages.sql
54
+
55
+ echo "get_category_messages function"
56
+ psql $database -f $base/functions/get-category-messages.sql
57
+
58
+ echo "get_last_message function"
59
+ psql $database -f $base/functions/get-last-message.sql
60
+
61
+ echo
62
+ }
63
+
64
+ create-types
65
+ create-functions
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo
6
+ echo "Printing Messages"
7
+ echo "= = ="
8
+ echo
9
+
10
+ default_name=message_store
11
+
12
+ if [ -z ${DATABASE_USER+x} ]; then
13
+ echo "(DATABASE_USER is not set)"
14
+ user=$default_name
15
+ else
16
+ user=$DATABASE_USER
17
+ fi
18
+ echo "Database user is: $user"
19
+
20
+ if [ -z ${DATABASE_NAME+x} ]; then
21
+ echo "(DATABASE_NAME is not set)"
22
+ database=$default_name
23
+ else
24
+ database=$DATABASE_NAME
25
+ fi
26
+ echo "Database name is: $database"
27
+
28
+ default_table_name=messages
29
+
30
+ if [ -z ${TABLE_NAME+x} ]; then
31
+ echo "(TABLE_NAME is not set)"
32
+ table=$default_table_name
33
+ else
34
+ table=$TABLE_NAME
35
+ fi
36
+ echo "Table name is: $table"
37
+
38
+ if [ -z ${STREAM_NAME+x} ]; then
39
+ echo "(STREAM_NAME is not set)"
40
+ stream_name=''
41
+ else
42
+ stream_name=$STREAM_NAME
43
+ echo "Stream name is: $STREAM_NAME"
44
+ fi
45
+
46
+ echo
47
+
48
+ if [ -z $stream_name ]; then
49
+ psql $database -x -c "SELECT * FROM $table"
50
+ else
51
+ psql $database -x -c "SELECT * FROM $table WHERE stream_name = '$stream_name'"
52
+ fi
@@ -0,0 +1,19 @@
1
+ -- ----------------------------
2
+ -- Table structure for messages
3
+ -- ----------------------------
4
+ CREATE TABLE "public"."messages" (
5
+ "id" UUID NOT NULL DEFAULT gen_random_uuid(),
6
+ "stream_name" varchar(255) NOT NULL COLLATE "default",
7
+ "type" varchar(255) NOT NULL COLLATE "default",
8
+ "position" bigint NOT NULL,
9
+ "global_position" bigserial NOT NULL ,
10
+ "data" jsonb,
11
+ "metadata" jsonb,
12
+ "time" TIMESTAMP WITHOUT TIME ZONE DEFAULT (now() AT TIME ZONE 'utc') NOT NULL
13
+ )
14
+ WITH (OIDS=FALSE);
15
+
16
+ -- ----------------------------
17
+ -- Primary key structure for table messages
18
+ -- ----------------------------
19
+ ALTER TABLE "public"."messages" ADD PRIMARY KEY ("global_position") NOT DEFERRABLE INITIALLY IMMEDIATE;
@@ -0,0 +1,15 @@
1
+ DO $$
2
+ BEGIN
3
+ IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'message') THEN
4
+ CREATE TYPE message AS (
5
+ id varchar,
6
+ stream_name varchar,
7
+ type varchar,
8
+ position bigint,
9
+ global_position bigint,
10
+ data varchar,
11
+ metadata varchar,
12
+ time timestamp
13
+ );
14
+ END IF;
15
+ END$$;
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -e
4
+
5
+ echo
6
+ echo "Uninstalling Database"
7
+ echo "= = ="
8
+ echo
9
+
10
+ default_name=message_store
11
+
12
+ if [ -z ${DATABASE_USER+x} ]; then
13
+ echo "(DATABASE_USER is not set. Default will be used.)"
14
+ user=$default_name
15
+ else
16
+ user=$DATABASE_USER
17
+ fi
18
+
19
+ if [ -z ${DATABASE_NAME+x} ]; then
20
+ echo "(DATABASE_NAME is not set. Default will be used.)"
21
+ database=$default_name
22
+ else
23
+ database=$DATABASE_NAME
24
+ fi
25
+
26
+ echo
27
+
28
+ function delete-user {
29
+ echo "Database user is: $user"
30
+
31
+ user_exists=`psql postgres -qtAXc "SELECT 1 FROM pg_roles WHERE rolname='$user'"`
32
+
33
+ if [ "$user_exists" = "1" ]; then
34
+ echo "Deleting database user \"$user\"..."
35
+ dropuser $user
36
+ else
37
+ echo "Database user \"$user\" does not exist. Not deleting."
38
+ fi
39
+
40
+ echo
41
+ }
42
+
43
+ function delete-database {
44
+ echo "Database name is: $database"
45
+
46
+ database_exists=`psql postgres -qtAXc "SELECT 1 FROM pg_database WHERE datname='$database'"`
47
+
48
+ if [ "$database_exists" = "1" ]; then
49
+ echo "Deleting database \"$database\"..."
50
+ dropdb $database
51
+ else
52
+ echo "Database \"$database\" does not exist. Not deleting."
53
+ fi
54
+
55
+ echo
56
+ }
57
+
58
+
59
+ delete-database
60
+ delete-user
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path '../database', __dir__
4
+ script_filename = 'install.sh'
5
+ script_filepath = File.join root, script_filename
6
+
7
+ system script_filepath
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path '../database', __dir__
4
+ script_filename = 'uninstall.sh'
5
+ script_filepath = File.join root, script_filename
6
+
7
+ system script_filepath
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path '../database', __dir__
4
+ script_filename = 'print-messages.sh'
5
+ script_filepath = File.join root, script_filename
6
+
7
+ system script_filepath
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path '../database', __dir__
4
+
5
+ script_filename = 'uninstall.sh'
6
+ script_filepath = File.join root, script_filename
7
+ system script_filepath
8
+
9
+ script_filename = 'install.sh'
10
+ script_filepath = File.join root, script_filename
11
+ system script_filepath
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evt-message_store-postgres-database
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - The Eventide Project
8
+ autorequire:
9
+ bindir: scripts
10
+ cert_chain: []
11
+ date: 2018-06-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: " "
14
+ email: opensource@eventide-project.org
15
+ executables:
16
+ - evt-pg-print-messages
17
+ - evt-pg-delete-db
18
+ - evt-pg-create-db
19
+ - evt-pg-recreate-db
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - database/clear-events-table.sh
24
+ - database/extensions.sql
25
+ - database/functions/category.sql
26
+ - database/functions/get-category-messages.sql
27
+ - database/functions/get-last-message.sql
28
+ - database/functions/get-stream-messages.sql
29
+ - database/functions/hash-64.sql
30
+ - database/functions/scratch.sql
31
+ - database/functions/stream-version.sql
32
+ - database/functions/write-message.sql
33
+ - database/indexes/messages-category-global-position.sql
34
+ - database/indexes/messages-id.sql
35
+ - database/indexes/messages-stream-name-position-uniq.sql
36
+ - database/install.sh
37
+ - database/install_functions.sh
38
+ - database/print-messages.sh
39
+ - database/table/messages-table.sql
40
+ - database/types/message.sql
41
+ - database/uninstall.sh
42
+ - scripts/evt-pg-create-db
43
+ - scripts/evt-pg-delete-db
44
+ - scripts/evt-pg-print-messages
45
+ - scripts/evt-pg-recreate-db
46
+ homepage: https://github.com/eventide-project/message-store-postgres-database
47
+ licenses:
48
+ - MIT
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 2.7.3
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: Message store PostgreSQL database definition
70
+ test_files: []