evt-message_store-postgres 0.9.0.0 → 0.10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/message_store/postgres.rb +0 -2
- data/lib/message_store/postgres/controls/put.rb +3 -2
- data/lib/message_store/postgres/get.rb +63 -18
- data/lib/message_store/postgres/get/last.rb +19 -9
- data/lib/message_store/postgres/put.rb +1 -0
- data/lib/message_store/postgres/session.rb +9 -9
- metadata +17 -30
- data/database/clear-events-table.sh +0 -40
- data/database/extensions.sql +0 -1
- data/database/functions/category.sql +0 -10
- data/database/functions/get-messages.sql +0 -63
- data/database/functions/hash-64.sql +0 -13
- data/database/functions/stream-version.sql +0 -14
- data/database/functions/write-message.sql +0 -60
- data/database/indexes/messages-category-global-position.sql +0 -1
- data/database/indexes/messages-id.sql +0 -1
- data/database/indexes/messages-stream-name-position-uniq.sql +0 -1
- data/database/install.sh +0 -106
- data/database/print-messages.sh +0 -52
- data/database/table/messages-table.sql +0 -19
- data/database/test/hash-64.sql +0 -1
- data/database/test/write-message-expected-version.sql +0 -1
- data/database/test/write-message.sql +0 -1
- data/database/uninstall.sh +0 -60
- data/lib/message_store/postgres/get/last/select_statement.rb +0 -47
- data/lib/message_store/postgres/get/select_statement.rb +0 -102
- data/scripts/evt-pg-create-db +0 -7
- data/scripts/evt-pg-delete-db +0 -7
- data/scripts/evt-pg-print-messages +0 -7
- data/scripts/evt-pg-recreate-db +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1713903f546fd100c97c8431062fc70cd7e77d76b17b4a47c61e6222d327014c
|
4
|
+
data.tar.gz: 3752aa65bb75968be8dcc0f79ea18d38751eaebe92c9c36231cc40f096ee465a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 164bde3d9e587fb2384501e630d1d3020ef5d9dc5174d748e455f27b9955b1c455c83799c02677b038932fc94a09b5526077f521425328f9f06a73c956f2c42b
|
7
|
+
data.tar.gz: acc2b7385136a1d1e9d401588eab91e8caa8df02bc44cfe388407c1fd902862e49c970fa36d4b061295ee98ced1261997b0af8840edde9c0fd499b6bcf958892
|
@@ -16,9 +16,7 @@ require 'message_store/postgres/stream_name'
|
|
16
16
|
require 'message_store/postgres/put'
|
17
17
|
require 'message_store/postgres/write'
|
18
18
|
|
19
|
-
require 'message_store/postgres/get/select_statement'
|
20
19
|
require 'message_store/postgres/get'
|
21
|
-
require 'message_store/postgres/get/last/select_statement'
|
22
20
|
require 'message_store/postgres/get/last'
|
23
21
|
require 'message_store/postgres/read/iterator'
|
24
22
|
require 'message_store/postgres/read'
|
@@ -10,15 +10,16 @@ module MessageStore
|
|
10
10
|
|
11
11
|
message ||= MessageData::Write.example
|
12
12
|
|
13
|
+
position = nil
|
13
14
|
instances.times do
|
14
|
-
MessageStore::Postgres::Put.(message, stream_name)
|
15
|
+
position = MessageStore::Postgres::Put.(message, stream_name)
|
15
16
|
|
16
17
|
unless message_specified
|
17
18
|
message.id = MessageData::Write.id
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
|
-
stream_name
|
22
|
+
[stream_name, position]
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -3,10 +3,14 @@ module MessageStore
|
|
3
3
|
class Get
|
4
4
|
include MessageStore::Get
|
5
5
|
|
6
|
-
initializer :batch_size, :condition
|
7
|
-
|
8
6
|
dependency :session, Session
|
9
7
|
|
8
|
+
initializer na(:batch_size), :condition
|
9
|
+
|
10
|
+
def batch_size
|
11
|
+
@batch_size ||= Defaults.batch_size
|
12
|
+
end
|
13
|
+
|
10
14
|
def self.build(batch_size: nil, session: nil, condition: nil)
|
11
15
|
new(batch_size, condition).tap do |instance|
|
12
16
|
instance.configure(session: session)
|
@@ -31,32 +35,63 @@ module MessageStore
|
|
31
35
|
def call(stream_name, position: nil)
|
32
36
|
logger.trace { "Getting message data (Position: #{position.inspect}, Stream Name: #{stream_name}, Batch Size: #{batch_size.inspect})" }
|
33
37
|
|
34
|
-
|
38
|
+
position ||= Defaults.position
|
39
|
+
|
40
|
+
result = get_result(stream_name, position)
|
35
41
|
|
36
|
-
|
42
|
+
message_data = convert(result)
|
37
43
|
|
38
|
-
logger.info { "Finished getting message data (Count: #{
|
39
|
-
logger.info(tags: [:data, :message_data]) {
|
44
|
+
logger.info { "Finished getting message data (Count: #{message_data.length}, Position: #{position.inspect}, Stream Name: #{stream_name}, Batch Size: #{batch_size.inspect})" }
|
45
|
+
logger.info(tags: [:data, :message_data]) { message_data.pretty_inspect }
|
40
46
|
|
41
|
-
|
47
|
+
message_data
|
42
48
|
end
|
43
49
|
|
44
|
-
def
|
45
|
-
logger.trace { "Getting
|
50
|
+
def get_result(stream_name, position)
|
51
|
+
logger.trace { "Getting result (Stream: #{stream_name}, Position: #{position.inspect}, Batch Size: #{batch_size.inspect}, Condition: #{condition || '(none)'})" }
|
52
|
+
|
53
|
+
sql_command = self.class.sql_command(stream_name, position, batch_size, condition)
|
46
54
|
|
47
|
-
|
55
|
+
cond = self.class.constrain_condition(condition)
|
48
56
|
|
49
|
-
|
57
|
+
params = [
|
58
|
+
stream_name,
|
59
|
+
position,
|
60
|
+
batch_size,
|
61
|
+
cond
|
62
|
+
]
|
50
63
|
|
51
|
-
|
64
|
+
result = session.execute(sql_command, params)
|
52
65
|
|
53
|
-
|
66
|
+
logger.debug { "Finished getting result (Count: #{result.ntuples}, Stream: #{stream_name}, Position: #{position.inspect}, Batch Size: #{batch_size.inspect}, Condition: #{condition || '(none)'})" }
|
67
|
+
|
68
|
+
result
|
54
69
|
end
|
55
70
|
|
56
|
-
def
|
57
|
-
|
71
|
+
def self.constrain_condition(condition)
|
72
|
+
return nil if condition.nil?
|
73
|
+
|
74
|
+
"(#{condition})"
|
75
|
+
end
|
58
76
|
|
59
|
-
|
77
|
+
def self.sql_command(stream_name, position, batch_size, condition)
|
78
|
+
parameters = '$1::varchar, $2::bigint, $3::bigint, $4::varchar'
|
79
|
+
|
80
|
+
if category_stream?(stream_name)
|
81
|
+
return "SELECT * FROM get_category_messages(#{parameters});"
|
82
|
+
else
|
83
|
+
return "SELECT * FROM get_stream_messages(#{parameters});"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.category_stream?(stream_name)
|
88
|
+
StreamName.category?(stream_name)
|
89
|
+
end
|
90
|
+
|
91
|
+
def convert(result)
|
92
|
+
logger.trace { "Converting result to message data (Result Count: #{result.ntuples})" }
|
93
|
+
|
94
|
+
message_data = result.map do |record|
|
60
95
|
record['data'] = Deserialize.data(record['data'])
|
61
96
|
record['metadata'] = Deserialize.metadata(record['metadata'])
|
62
97
|
record['time'] = Time.utc_coerced(record['time'])
|
@@ -64,9 +99,9 @@ module MessageStore
|
|
64
99
|
MessageData::Read.build record
|
65
100
|
end
|
66
101
|
|
67
|
-
logger.debug { "Converted
|
102
|
+
logger.debug { "Converted result to message data (Message Data Count: #{message_data.length})" }
|
68
103
|
|
69
|
-
|
104
|
+
message_data
|
70
105
|
end
|
71
106
|
|
72
107
|
module Deserialize
|
@@ -86,6 +121,16 @@ module MessageStore
|
|
86
121
|
Clock::UTC.coerce(local_time)
|
87
122
|
end
|
88
123
|
end
|
124
|
+
|
125
|
+
module Defaults
|
126
|
+
def self.position
|
127
|
+
0
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.batch_size
|
131
|
+
1000
|
132
|
+
end
|
133
|
+
end
|
89
134
|
end
|
90
135
|
end
|
91
136
|
end
|
@@ -13,11 +13,11 @@ module MessageStore
|
|
13
13
|
def call(stream_name)
|
14
14
|
logger.trace { "Getting last message data (Stream Name: #{stream_name})" }
|
15
15
|
|
16
|
-
|
16
|
+
result = get_result(stream_name)
|
17
17
|
|
18
|
-
return nil if
|
18
|
+
return nil if result.nil?
|
19
19
|
|
20
|
-
message_data = convert(
|
20
|
+
message_data = convert(result[0])
|
21
21
|
|
22
22
|
logger.info { "Finished getting message data (Stream Name: #{stream_name})" }
|
23
23
|
logger.info(tags: [:data, :message_data]) { message_data.pretty_inspect }
|
@@ -25,18 +25,28 @@ module MessageStore
|
|
25
25
|
message_data
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def get_result(stream_name)
|
29
29
|
logger.trace { "Getting last record (Stream: #{stream_name})" }
|
30
30
|
|
31
|
-
|
31
|
+
sql_command = self.class.sql_command(stream_name)
|
32
32
|
|
33
|
-
|
33
|
+
params = [
|
34
|
+
stream_name
|
35
|
+
]
|
34
36
|
|
35
|
-
|
37
|
+
result = session.execute(sql_command, params)
|
36
38
|
|
37
|
-
|
39
|
+
logger.debug { "Finished getting result (Count: #{result.ntuples}, Stream: #{stream_name}" }
|
38
40
|
|
39
|
-
|
41
|
+
return nil if result.ntuples == 0
|
42
|
+
|
43
|
+
result
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.sql_command(stream_name)
|
47
|
+
parameters = '$1::varchar'
|
48
|
+
|
49
|
+
"SELECT * FROM get_last_message(#{parameters});"
|
40
50
|
end
|
41
51
|
|
42
52
|
def convert(record)
|
@@ -57,6 +57,7 @@ module MessageStore
|
|
57
57
|
return id, type, data, metadata
|
58
58
|
end
|
59
59
|
|
60
|
+
## TODO Rename to put_messages
|
60
61
|
def insert_message(id, stream_name, type, data, metadata, expected_version)
|
61
62
|
serialized_data = serialized_data(data)
|
62
63
|
serialized_metadata = serialized_metadata(metadata)
|
@@ -33,7 +33,7 @@ module MessageStore
|
|
33
33
|
|
34
34
|
if connected?
|
35
35
|
logger.debug { "Already connected. A new connection will not be built." }
|
36
|
-
return
|
36
|
+
return connection
|
37
37
|
end
|
38
38
|
|
39
39
|
logger.debug { "Not connected. A new connection will be built." }
|
@@ -80,9 +80,9 @@ module MessageStore
|
|
80
80
|
settings
|
81
81
|
end
|
82
82
|
|
83
|
-
def execute(
|
84
|
-
logger.trace { "Executing
|
85
|
-
logger.trace(tag: :data) {
|
83
|
+
def execute(sql_command, params=nil)
|
84
|
+
logger.trace { "Executing SQL command" }
|
85
|
+
logger.trace(tag: :data) { sql_command }
|
86
86
|
logger.trace(tag: :data) { params.pretty_inspect }
|
87
87
|
|
88
88
|
unless connected?
|
@@ -90,12 +90,12 @@ module MessageStore
|
|
90
90
|
end
|
91
91
|
|
92
92
|
if params.nil?
|
93
|
-
connection.exec(
|
94
|
-
logger.debug { "Executed
|
93
|
+
connection.exec(sql_command).tap do
|
94
|
+
logger.debug { "Executed SQL command (no params)" }
|
95
95
|
end
|
96
96
|
else
|
97
|
-
connection.exec_params(
|
98
|
-
logger.debug { "Executed
|
97
|
+
connection.exec_params(sql_command, params).tap do
|
98
|
+
logger.debug { "Executed SQL command with params" }
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -117,7 +117,7 @@ module MessageStore
|
|
117
117
|
s = settings.dup
|
118
118
|
|
119
119
|
if s.has_key?(:password)
|
120
|
-
s[:password] = '
|
120
|
+
s[:password] = '*' * 8
|
121
121
|
end
|
122
122
|
|
123
123
|
s
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evt-message_store-postgres
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Eventide Project
|
8
8
|
autorequire:
|
9
9
|
bindir: scripts
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: evt-message_store
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: evt-message_store-postgres-database
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: evt-log
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,31 +124,10 @@ dependencies:
|
|
110
124
|
version: '0'
|
111
125
|
description: " "
|
112
126
|
email: opensource@eventide-project.org
|
113
|
-
executables:
|
114
|
-
- evt-pg-print-messages
|
115
|
-
- evt-pg-delete-db
|
116
|
-
- evt-pg-create-db
|
117
|
-
- evt-pg-recreate-db
|
127
|
+
executables: []
|
118
128
|
extensions: []
|
119
129
|
extra_rdoc_files: []
|
120
130
|
files:
|
121
|
-
- database/clear-events-table.sh
|
122
|
-
- database/extensions.sql
|
123
|
-
- database/functions/category.sql
|
124
|
-
- database/functions/get-messages.sql
|
125
|
-
- database/functions/hash-64.sql
|
126
|
-
- database/functions/stream-version.sql
|
127
|
-
- database/functions/write-message.sql
|
128
|
-
- database/indexes/messages-category-global-position.sql
|
129
|
-
- database/indexes/messages-id.sql
|
130
|
-
- database/indexes/messages-stream-name-position-uniq.sql
|
131
|
-
- database/install.sh
|
132
|
-
- database/print-messages.sh
|
133
|
-
- database/table/messages-table.sql
|
134
|
-
- database/test/hash-64.sql
|
135
|
-
- database/test/write-message-expected-version.sql
|
136
|
-
- database/test/write-message.sql
|
137
|
-
- database/uninstall.sh
|
138
131
|
- lib/message_store/postgres.rb
|
139
132
|
- lib/message_store/postgres/controls.rb
|
140
133
|
- lib/message_store/postgres/controls/category.rb
|
@@ -144,8 +137,6 @@ files:
|
|
144
137
|
- lib/message_store/postgres/controls/stream_name.rb
|
145
138
|
- lib/message_store/postgres/get.rb
|
146
139
|
- lib/message_store/postgres/get/last.rb
|
147
|
-
- lib/message_store/postgres/get/last/select_statement.rb
|
148
|
-
- lib/message_store/postgres/get/select_statement.rb
|
149
140
|
- lib/message_store/postgres/log.rb
|
150
141
|
- lib/message_store/postgres/put.rb
|
151
142
|
- lib/message_store/postgres/read.rb
|
@@ -154,10 +145,6 @@ files:
|
|
154
145
|
- lib/message_store/postgres/settings.rb
|
155
146
|
- lib/message_store/postgres/stream_name.rb
|
156
147
|
- lib/message_store/postgres/write.rb
|
157
|
-
- scripts/evt-pg-create-db
|
158
|
-
- scripts/evt-pg-delete-db
|
159
|
-
- scripts/evt-pg-print-messages
|
160
|
-
- scripts/evt-pg-recreate-db
|
161
148
|
homepage: https://github.com/eventide-project/message-store-postgres
|
162
149
|
licenses:
|
163
150
|
- MIT
|
@@ -1,40 +0,0 @@
|
|
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;"
|
data/database/extensions.sql
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
@@ -1,63 +0,0 @@
|
|
1
|
-
CREATE OR REPLACE FUNCTION get_messages(
|
2
|
-
_stream_name varchar,
|
3
|
-
_positon bigint,
|
4
|
-
_batch_size bigint
|
5
|
-
|
6
|
-
|
7
|
-
_type varchar,
|
8
|
-
_data jsonb,
|
9
|
-
_metadata jsonb DEFAULT NULL,
|
10
|
-
_expected_version bigint DEFAULT NULL
|
11
|
-
)
|
12
|
-
RETURNS bigint
|
13
|
-
AS $$
|
14
|
-
DECLARE
|
15
|
-
message_id uuid;
|
16
|
-
stream_version bigint;
|
17
|
-
position bigint;
|
18
|
-
category varchar;
|
19
|
-
stream_name_hash bigint;
|
20
|
-
BEGIN
|
21
|
-
message_id = uuid(_id);
|
22
|
-
|
23
|
-
stream_name_hash = hash_64(_stream_name);
|
24
|
-
PERFORM pg_advisory_xact_lock(stream_name_hash);
|
25
|
-
|
26
|
-
stream_version := stream_version(_stream_name);
|
27
|
-
|
28
|
-
if stream_version is null then
|
29
|
-
stream_version := -1;
|
30
|
-
end if;
|
31
|
-
|
32
|
-
if _expected_version is not null then
|
33
|
-
if _expected_version != stream_version then
|
34
|
-
raise exception 'Wrong expected version: % (Stream: %, Stream Version: %)', _expected_version, _stream_name, stream_version;
|
35
|
-
end if;
|
36
|
-
end if;
|
37
|
-
|
38
|
-
position := stream_version + 1;
|
39
|
-
|
40
|
-
insert into "messages"
|
41
|
-
(
|
42
|
-
"id",
|
43
|
-
"stream_name",
|
44
|
-
"position",
|
45
|
-
"type",
|
46
|
-
"data",
|
47
|
-
"metadata"
|
48
|
-
)
|
49
|
-
values
|
50
|
-
(
|
51
|
-
message_id,
|
52
|
-
_stream_name,
|
53
|
-
position,
|
54
|
-
_type,
|
55
|
-
_data,
|
56
|
-
_metadata
|
57
|
-
)
|
58
|
-
;
|
59
|
-
|
60
|
-
return position;
|
61
|
-
END;
|
62
|
-
$$ LANGUAGE plpgsql
|
63
|
-
VOLATILE;
|
@@ -1,14 +0,0 @@
|
|
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;
|
@@ -1,60 +0,0 @@
|
|
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;
|
@@ -1 +0,0 @@
|
|
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);
|
@@ -1 +0,0 @@
|
|
1
|
-
CREATE INDEX CONCURRENTLY "messages_id_idx" ON "public"."messages" USING btree(id ASC NULLS LAST);
|
@@ -1 +0,0 @@
|
|
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);
|
data/database/install.sh
DELETED
@@ -1,106 +0,0 @@
|
|
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
|
-
|
31
|
-
user_exists=`psql postgres -qtAXc "SELECT 1 FROM pg_roles WHERE rolname='$user'"`
|
32
|
-
|
33
|
-
if [ "$user_exists" = "1" ]; then
|
34
|
-
echo "Database user \"$user\" was previously created. Not creating again."
|
35
|
-
else
|
36
|
-
echo "Database user \"$user\" has not yet been created"
|
37
|
-
echo "Creating database user \"$user\"..."
|
38
|
-
createuser -s $user
|
39
|
-
fi
|
40
|
-
|
41
|
-
echo
|
42
|
-
}
|
43
|
-
|
44
|
-
function create-database {
|
45
|
-
echo "Database name is: $database"
|
46
|
-
echo "Creating database \"$database\"..."
|
47
|
-
createdb $database
|
48
|
-
echo
|
49
|
-
}
|
50
|
-
|
51
|
-
function script_dir {
|
52
|
-
val="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
53
|
-
echo "$val"
|
54
|
-
}
|
55
|
-
|
56
|
-
function create-extensions {
|
57
|
-
echo "Creating extensions..."
|
58
|
-
base=$(script_dir)
|
59
|
-
psql $database -f $base/extensions.sql
|
60
|
-
echo
|
61
|
-
}
|
62
|
-
|
63
|
-
function create-table {
|
64
|
-
echo "Creating messages table..."
|
65
|
-
base=$(script_dir)
|
66
|
-
psql $database -f $base/table/messages-table.sql
|
67
|
-
echo
|
68
|
-
}
|
69
|
-
|
70
|
-
function create-functions {
|
71
|
-
base=$(script_dir)
|
72
|
-
echo "Creating functions..."
|
73
|
-
|
74
|
-
echo "hash_64 function"
|
75
|
-
psql $database -f $base/functions/hash-64.sql
|
76
|
-
|
77
|
-
echo "category function"
|
78
|
-
psql $database -f $base/functions/category.sql
|
79
|
-
|
80
|
-
echo "stream_version function"
|
81
|
-
psql $database -f $base/functions/stream-version.sql
|
82
|
-
|
83
|
-
echo "write_sql function"
|
84
|
-
psql $database -f $base/functions/write-message.sql
|
85
|
-
|
86
|
-
echo
|
87
|
-
}
|
88
|
-
|
89
|
-
function create-indexes {
|
90
|
-
base=$(script_dir)
|
91
|
-
echo "Creating indexes..."
|
92
|
-
echo "messages_id_idx"
|
93
|
-
psql $database -f $base/indexes/messages-id.sql
|
94
|
-
echo "messages_category_global_position_idx"
|
95
|
-
psql $database -f $base/indexes/messages-category-global-position.sql
|
96
|
-
echo "messages_stream_name_position_uniq_idx"
|
97
|
-
psql $database -f $base/indexes/messages-stream-name-position-uniq.sql
|
98
|
-
echo
|
99
|
-
}
|
100
|
-
|
101
|
-
create-user
|
102
|
-
create-database
|
103
|
-
create-extensions
|
104
|
-
create-table
|
105
|
-
create-functions
|
106
|
-
create-indexes
|
data/database/print-messages.sh
DELETED
@@ -1,52 +0,0 @@
|
|
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
|
@@ -1,19 +0,0 @@
|
|
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;
|
data/database/test/hash-64.sql
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
SELECT hash_64('someStream-123');
|
@@ -1 +0,0 @@
|
|
1
|
-
SELECT write_message(gen_random_uuid()::varchar, 'testWriteIsolation'::varchar, 'SomeType'::varchar, '{"attribute": "79a59e513f9182d5754abdf9b90e2179"}'::jsonb, '{"metaAttribute": "6b3ae03d713a51a445290f3fc4b5223a"}'::jsonb, 1::bigint);
|
@@ -1 +0,0 @@
|
|
1
|
-
SELECT write_message(gen_random_uuid()::varchar, 'testWriteIsolation'::varchar, 'SomeType'::varchar, '{"attribute": "79a59e513f9182d5754abdf9b90e2179"}'::jsonb, '{"metaAttribute": "6b3ae03d713a51a445290f3fc4b5223a"}'::jsonb);
|
data/database/uninstall.sh
DELETED
@@ -1,60 +0,0 @@
|
|
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
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module MessageStore
|
2
|
-
module Postgres
|
3
|
-
class Get
|
4
|
-
class Last
|
5
|
-
class SelectStatement
|
6
|
-
include Log::Dependency
|
7
|
-
|
8
|
-
initializer :stream_name
|
9
|
-
|
10
|
-
def self.build(stream_name)
|
11
|
-
new(stream_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
def sql
|
15
|
-
logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name})" }
|
16
|
-
|
17
|
-
statement = <<-SQL
|
18
|
-
SELECT
|
19
|
-
id::varchar,
|
20
|
-
stream_name::varchar,
|
21
|
-
position::bigint,
|
22
|
-
type::varchar,
|
23
|
-
global_position::bigint,
|
24
|
-
data::varchar,
|
25
|
-
metadata::varchar,
|
26
|
-
time::timestamp
|
27
|
-
FROM
|
28
|
-
messages
|
29
|
-
WHERE
|
30
|
-
stream_name = '#{stream_name}'
|
31
|
-
ORDER BY
|
32
|
-
position DESC
|
33
|
-
LIMIT
|
34
|
-
1
|
35
|
-
;
|
36
|
-
SQL
|
37
|
-
|
38
|
-
logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name})" }
|
39
|
-
logger.debug(tags: [:data, :sql]) { "Statement: #{statement}" }
|
40
|
-
|
41
|
-
statement
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,102 +0,0 @@
|
|
1
|
-
module MessageStore
|
2
|
-
module Postgres
|
3
|
-
class Get
|
4
|
-
class SelectStatement
|
5
|
-
include Log::Dependency
|
6
|
-
|
7
|
-
initializer :stream_name, na(:position), na(:batch_size), :condition
|
8
|
-
|
9
|
-
def position
|
10
|
-
@position ||= Defaults.position
|
11
|
-
end
|
12
|
-
|
13
|
-
def batch_size
|
14
|
-
@batch_size ||= Defaults.batch_size
|
15
|
-
end
|
16
|
-
|
17
|
-
def stream_type_list
|
18
|
-
@stream_type_list ||= StreamName.get_type_list(stream_name)
|
19
|
-
end
|
20
|
-
|
21
|
-
def category_stream?
|
22
|
-
is_category_stream ||= StreamName.category?(stream_name)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.build(stream_name, position: nil, batch_size: nil, condition: nil)
|
26
|
-
new(stream_name, position, batch_size, condition)
|
27
|
-
end
|
28
|
-
|
29
|
-
def sql
|
30
|
-
logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name}, Category: #{category_stream?}, Types: #{stream_type_list.inspect}, Position: #{position}, Batch Size: #{batch_size}, Condition: #{condition || '(none)'})" }
|
31
|
-
|
32
|
-
formatted_where_clause = where_clause.each_line.to_a.join(" ")
|
33
|
-
|
34
|
-
statement = <<~SQL
|
35
|
-
SELECT
|
36
|
-
id::varchar,
|
37
|
-
stream_name::varchar,
|
38
|
-
position::bigint,
|
39
|
-
type::varchar,
|
40
|
-
global_position::bigint,
|
41
|
-
data::varchar,
|
42
|
-
metadata::varchar,
|
43
|
-
time::timestamp
|
44
|
-
FROM
|
45
|
-
messages
|
46
|
-
WHERE
|
47
|
-
#{formatted_where_clause}
|
48
|
-
ORDER BY
|
49
|
-
#{position_field} ASC
|
50
|
-
LIMIT
|
51
|
-
#{batch_size}
|
52
|
-
;
|
53
|
-
SQL
|
54
|
-
|
55
|
-
logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name}, Category: #{category_stream?}, Types: #{stream_type_list.inspect}, Position: #{position}, Batch Size: #{batch_size}, Condition: #{condition || '(none)'})" }
|
56
|
-
logger.debug(tags: [:data, :sql]) { "Statement: #{statement}" }
|
57
|
-
|
58
|
-
statement
|
59
|
-
end
|
60
|
-
|
61
|
-
def where_clause
|
62
|
-
clause = <<~SQL.chomp
|
63
|
-
#{discriminator_field} = '#{stream_name}' AND
|
64
|
-
#{position_field} >= #{position}
|
65
|
-
SQL
|
66
|
-
|
67
|
-
unless condition.nil?
|
68
|
-
clause << " AND\n(#{condition})"
|
69
|
-
end
|
70
|
-
|
71
|
-
clause
|
72
|
-
end
|
73
|
-
|
74
|
-
def discriminator_field
|
75
|
-
unless category_stream?
|
76
|
-
'stream_name'
|
77
|
-
else
|
78
|
-
'category(stream_name)'
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def position_field
|
83
|
-
unless category_stream?
|
84
|
-
'position'
|
85
|
-
else
|
86
|
-
'global_position'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
module Defaults
|
91
|
-
def self.position
|
92
|
-
0
|
93
|
-
end
|
94
|
-
|
95
|
-
def self.batch_size
|
96
|
-
1000
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
data/scripts/evt-pg-create-db
DELETED
data/scripts/evt-pg-delete-db
DELETED
data/scripts/evt-pg-recreate-db
DELETED
@@ -1,11 +0,0 @@
|
|
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
|