evt-message_store-postgres 0.1.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 +7 -0
- data/database/clear-events-table.sh +40 -0
- data/database/extensions.sql +1 -0
- data/database/functions/category.sql +10 -0
- data/database/functions/stream-version.sql +13 -0
- data/database/functions/write-event.sql +55 -0
- data/database/indexes/events-category-global-position.sql +1 -0
- data/database/indexes/events-category.sql +1 -0
- data/database/indexes/events-id.sql +1 -0
- data/database/indexes/events-stream-name-position-uniq.sql +1 -0
- data/database/indexes/events-stream-name.sql +1 -0
- data/database/install.sh +103 -0
- data/database/list-events.sh +52 -0
- data/database/table/events-table.sql +19 -0
- data/database/test/write-event-expected-version.sql +1 -0
- data/database/test/write-event.sql +1 -0
- data/database/uninstall.sh +60 -0
- data/lib/message_store/postgres.rb +24 -0
- data/lib/message_store/postgres/controls.rb +6 -0
- data/lib/message_store/postgres/controls/category.rb +34 -0
- data/lib/message_store/postgres/controls/message_data.rb +7 -0
- data/lib/message_store/postgres/controls/put.rb +26 -0
- data/lib/message_store/postgres/controls/stream_name.rb +22 -0
- data/lib/message_store/postgres/get.rb +91 -0
- data/lib/message_store/postgres/get/last.rb +111 -0
- data/lib/message_store/postgres/get/last/select_statement.rb +47 -0
- data/lib/message_store/postgres/get/select_statement.rb +88 -0
- data/lib/message_store/postgres/log.rb +11 -0
- data/lib/message_store/postgres/put.rb +145 -0
- data/lib/message_store/postgres/read.rb +12 -0
- data/lib/message_store/postgres/read/iterator.rb +17 -0
- data/lib/message_store/postgres/session.rb +128 -0
- data/lib/message_store/postgres/settings.rb +30 -0
- data/lib/message_store/postgres/stream_name.rb +52 -0
- data/lib/message_store/postgres/write.rb +46 -0
- data/scripts/evt-pg-create-db +7 -0
- data/scripts/evt-pg-delete-db +7 -0
- data/scripts/evt-pg-list-events +7 -0
- data/scripts/evt-pg-recreate-db +11 -0
- data/scripts/scripts_init.rb +12 -0
- metadata +156 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1f4b2f2927cc0e063949a067f30ac982f1418e4a
|
4
|
+
data.tar.gz: 0e9fb2772b23237a597fc14aa1ff0fde0a8567a3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ad29845afd4883df20ea3ed878d6338ff8cf94f892fa9ae8bd59e8d635b745ddfcc4d31ca6255683850d85f5d19fe87f47e2c0dc8f68802c07903f74c8c343cd
|
7
|
+
data.tar.gz: 3631c15fa6864977c03e3e48d1f395a17c1e201c8319247c70984d3f72694b83c882ae121a9e40074766d799b4d1be197326d49ee204c891099adfd216b05496
|
@@ -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=event_source
|
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=events
|
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,13 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION stream_version(
|
2
|
+
_stream_name varchar
|
3
|
+
)
|
4
|
+
RETURNS int
|
5
|
+
AS $$
|
6
|
+
DECLARE
|
7
|
+
stream_version int;
|
8
|
+
BEGIN
|
9
|
+
select max(position) into stream_version from events where stream_name = _stream_name;
|
10
|
+
|
11
|
+
return stream_version;
|
12
|
+
END;
|
13
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,55 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION write_event(
|
2
|
+
_id varchar,
|
3
|
+
_stream_name varchar,
|
4
|
+
_type varchar,
|
5
|
+
_data jsonb,
|
6
|
+
_metadata jsonb DEFAULT NULL,
|
7
|
+
_expected_version int DEFAULT NULL
|
8
|
+
)
|
9
|
+
RETURNS int
|
10
|
+
AS $$
|
11
|
+
DECLARE
|
12
|
+
event_id uuid;
|
13
|
+
stream_version int;
|
14
|
+
position int;
|
15
|
+
category varchar;
|
16
|
+
BEGIN
|
17
|
+
event_id = uuid(_id);
|
18
|
+
|
19
|
+
stream_version := stream_version(_stream_name);
|
20
|
+
|
21
|
+
if stream_version is null then
|
22
|
+
stream_version := -1;
|
23
|
+
end if;
|
24
|
+
|
25
|
+
if _expected_version is not null then
|
26
|
+
if _expected_version != stream_version then
|
27
|
+
raise exception 'Wrong expected version: % (Stream: %, Stream Version: %)', _expected_version, _stream_name, stream_version;
|
28
|
+
end if;
|
29
|
+
end if;
|
30
|
+
|
31
|
+
position := stream_version + 1;
|
32
|
+
|
33
|
+
insert into "events"
|
34
|
+
(
|
35
|
+
"id",
|
36
|
+
"stream_name",
|
37
|
+
"position",
|
38
|
+
"type",
|
39
|
+
"data",
|
40
|
+
"metadata"
|
41
|
+
)
|
42
|
+
values
|
43
|
+
(
|
44
|
+
event_id,
|
45
|
+
_stream_name,
|
46
|
+
position,
|
47
|
+
_type,
|
48
|
+
_data,
|
49
|
+
_metadata
|
50
|
+
)
|
51
|
+
;
|
52
|
+
|
53
|
+
return position;
|
54
|
+
END;
|
55
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1 @@
|
|
1
|
+
CREATE INDEX CONCURRENTLY "events_category_global_position_idx" ON "public"."events" 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 "events_category_idx" ON "public"."events" USING btree(category(stream_name) COLLATE "default" "pg_catalog"."text_ops" ASC NULLS LAST);
|
@@ -0,0 +1 @@
|
|
1
|
+
CREATE INDEX CONCURRENTLY "events_id_idx" ON "public"."events" USING btree(id ASC NULLS LAST);
|
@@ -0,0 +1 @@
|
|
1
|
+
CREATE UNIQUE INDEX CONCURRENTLY "events_stream_name_position_uniq_idx" ON "public"."events" USING btree(stream_name COLLATE "default" "pg_catalog"."text_ops" ASC NULLS LAST, "position" "pg_catalog"."int4_ops" ASC NULLS LAST);
|
@@ -0,0 +1 @@
|
|
1
|
+
CREATE INDEX CONCURRENTLY "events_stream_name_idx" ON "public"."events" USING btree(stream_name COLLATE "default" "pg_catalog"."text_ops" ASC NULLS LAST);
|
data/database/install.sh
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
echo
|
6
|
+
echo "Installing Database"
|
7
|
+
echo "= = ="
|
8
|
+
echo
|
9
|
+
|
10
|
+
default_name=event_source
|
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 -tAc "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 events table..."
|
65
|
+
base=$(script_dir)
|
66
|
+
psql $database -f $base/table/events-table.sql
|
67
|
+
echo
|
68
|
+
}
|
69
|
+
|
70
|
+
function create-functions {
|
71
|
+
base=$(script_dir)
|
72
|
+
echo "Creating functions..."
|
73
|
+
echo "category function"
|
74
|
+
psql $database -f $base/functions/category.sql
|
75
|
+
echo "stream_version function"
|
76
|
+
psql $database -f $base/functions/stream-version.sql
|
77
|
+
echo "write_sql function"
|
78
|
+
psql $database -f $base/functions/write-event.sql
|
79
|
+
echo
|
80
|
+
}
|
81
|
+
|
82
|
+
function create-indexes {
|
83
|
+
base=$(script_dir)
|
84
|
+
echo "Creating indexes..."
|
85
|
+
echo "events_id_idx"
|
86
|
+
psql $database -f $base/indexes/events-id.sql
|
87
|
+
echo "events_category_global_position_idx"
|
88
|
+
psql $database -f $base/indexes/events-category-global-position.sql
|
89
|
+
echo "events_category_idx"
|
90
|
+
psql $database -f $base/indexes/events-category.sql
|
91
|
+
echo "events_stream_name_idx"
|
92
|
+
psql $database -f $base/indexes/events-stream-name.sql
|
93
|
+
echo "events_stream_name_position_uniq_idx"
|
94
|
+
psql $database -f $base/indexes/events-stream-name-position-uniq.sql
|
95
|
+
echo
|
96
|
+
}
|
97
|
+
|
98
|
+
create-user
|
99
|
+
create-database
|
100
|
+
create-extensions
|
101
|
+
create-table
|
102
|
+
create-functions
|
103
|
+
create-indexes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
echo
|
6
|
+
echo "Listing Events"
|
7
|
+
echo "= = ="
|
8
|
+
echo
|
9
|
+
|
10
|
+
default_name=event_source
|
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=events
|
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 -c "SELECT * FROM $table"
|
50
|
+
else
|
51
|
+
psql $database -c "SELECT * FROM $table WHERE stream_name = '$stream_name'"
|
52
|
+
fi
|
@@ -0,0 +1,19 @@
|
|
1
|
+
-- ----------------------------
|
2
|
+
-- Table structure for events
|
3
|
+
-- ----------------------------
|
4
|
+
CREATE TABLE "public"."events" (
|
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" int4 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 events
|
18
|
+
-- ----------------------------
|
19
|
+
ALTER TABLE "public"."events" ADD PRIMARY KEY ("global_position") NOT DEFERRABLE INITIALLY IMMEDIATE;
|
@@ -0,0 +1 @@
|
|
1
|
+
SELECT write_event('someStream-123', 'SomeType', '{"someField":"some value"}', '{"someMetadataField":"some metadata value"}', 1);
|
@@ -0,0 +1 @@
|
|
1
|
+
SELECT write_event('someStream-123', 'SomeType', '{"someField":"some value"}', '{"someMetadataField":"some metadata value"}');
|
@@ -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=event_source
|
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 -tAc "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 -tAc "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,24 @@
|
|
1
|
+
require 'pg'
|
2
|
+
|
3
|
+
require 'message_store'
|
4
|
+
|
5
|
+
require 'log'
|
6
|
+
require 'telemetry'
|
7
|
+
require 'settings'; Settings.activate
|
8
|
+
|
9
|
+
require 'message_store/postgres/log'
|
10
|
+
|
11
|
+
require 'message_store/postgres/settings'
|
12
|
+
require 'message_store/postgres/session'
|
13
|
+
|
14
|
+
require 'message_store/postgres/stream_name'
|
15
|
+
|
16
|
+
require 'message_store/postgres/put'
|
17
|
+
require 'message_store/postgres/write'
|
18
|
+
|
19
|
+
require 'message_store/postgres/get/select_statement'
|
20
|
+
require 'message_store/postgres/get'
|
21
|
+
require 'message_store/postgres/get/last/select_statement'
|
22
|
+
require 'message_store/postgres/get/last'
|
23
|
+
require 'message_store/postgres/read/iterator'
|
24
|
+
require 'message_store/postgres/read'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# module MessageStore
|
2
|
+
# module Postgres
|
3
|
+
# module Controls
|
4
|
+
# Category = MessageStore::Controls::Category
|
5
|
+
# end
|
6
|
+
# end
|
7
|
+
# end
|
8
|
+
|
9
|
+
|
10
|
+
module MessageStore
|
11
|
+
module Postgres
|
12
|
+
module Controls
|
13
|
+
module Category
|
14
|
+
def self.example(category: nil, randomize_category: nil)
|
15
|
+
if randomize_category.nil?
|
16
|
+
if !category.nil?
|
17
|
+
randomize_category = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
randomize_category = true if randomize_category.nil?
|
22
|
+
|
23
|
+
category ||= 'test'
|
24
|
+
|
25
|
+
if randomize_category
|
26
|
+
category = "#{category}#{SecureRandom.hex(16)}XX"
|
27
|
+
end
|
28
|
+
|
29
|
+
category
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|