evt-message_store-postgres 0.9.0.0 → 0.10.0.0
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.
- 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
|