rails_event_store_active_record 2.3.0 → 2.4.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/README.md +1 -1
- data/lib/rails_event_store_active_record/batch_enumerator.rb +3 -4
- data/lib/rails_event_store_active_record/event_repository.rb +51 -33
- data/lib/rails_event_store_active_record/event_repository_reader.rb +52 -44
- data/lib/rails_event_store_active_record/generators/migration_generator.rb +6 -4
- data/lib/rails_event_store_active_record/index_violation_detector.rb +15 -19
- data/lib/rails_event_store_active_record/pg_linearized_event_repository.rb +1 -8
- data/lib/rails_event_store_active_record/version.rb +1 -1
- data/lib/rails_event_store_active_record/with_abstract_base_class.rb +10 -10
- metadata +9 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b146f907eef70a988c0949381dbf897a4f93bd7aa9e1ccf8346559c2656feb80
|
4
|
+
data.tar.gz: 46b6f4ce8d62b7386d72a1219a375e012bd3d15b33b16fe552cb8adee9f4f6e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0be237c7518c776a5ee19e8625f39966a20f255b0076839695957df0aa337c181bc7c85351afb2a1fbffdd6b0fd75fa50217482c30d1aa82437b242a32552e8d
|
7
|
+
data.tar.gz: 32aa1160ba4de4081357319e25012330249b6e946d0e0b558452fe41e7a30aa25e70d65faf9897ba6b7afac841c6b2ea6011117a892a272179da58b38a96bbb4
|
data/README.md
CHANGED
@@ -4,4 +4,4 @@ Persistent event repository implementation for RubyEventStore based on ActiveRec
|
|
4
4
|
|
5
5
|
Includes repository implementation with linearized writes to achieve log-like properties of streams on top of SQL database engine.
|
6
6
|
|
7
|
-
Find out more at [https://railseventstore.org](https://railseventstore.org/)
|
7
|
+
Find out more at [https://railseventstore.org](https://railseventstore.org/)
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class BatchEnumerator
|
5
5
|
def initialize(batch_size, total_limit, reader)
|
6
|
-
@batch_size
|
6
|
+
@batch_size = batch_size
|
7
7
|
@total_limit = total_limit
|
8
|
-
@reader
|
8
|
+
@reader = reader
|
9
9
|
end
|
10
10
|
|
11
11
|
def each
|
@@ -13,7 +13,7 @@ module RailsEventStoreActiveRecord
|
|
13
13
|
offset_id = nil
|
14
14
|
|
15
15
|
0.step(total_limit - 1, batch_size) do |batch_offset|
|
16
|
-
batch_limit
|
16
|
+
batch_limit = [batch_size, total_limit - batch_offset].min
|
17
17
|
results, offset_id = reader.call(offset_id, batch_limit)
|
18
18
|
|
19
19
|
break if results.empty?
|
@@ -34,4 +34,3 @@ module RailsEventStoreActiveRecord
|
|
34
34
|
attr_reader :batch_size, :total_limit, :reader
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/core_ext/array"
|
4
|
-
require "activerecord-import"
|
5
4
|
|
6
5
|
module RailsEventStoreActiveRecord
|
7
6
|
class EventRepository
|
8
7
|
POSITION_SHIFT = 1
|
9
8
|
|
10
9
|
def initialize(model_factory: WithDefaultModels.new, serializer:)
|
11
|
-
@serializer
|
10
|
+
@serializer = serializer
|
12
11
|
|
13
12
|
@event_klass, @stream_klass = model_factory.call
|
14
13
|
@repo_reader = EventRepositoryReader.new(@event_klass, @stream_klass, serializer)
|
@@ -16,15 +15,13 @@ module RailsEventStoreActiveRecord
|
|
16
15
|
end
|
17
16
|
|
18
17
|
def append_to_stream(records, stream, expected_version)
|
19
|
-
hashes
|
18
|
+
hashes = []
|
20
19
|
event_ids = []
|
21
20
|
records.each do |record|
|
22
|
-
hashes
|
21
|
+
hashes << insert_hash(record, record.serialize(serializer))
|
23
22
|
event_ids << record.event_id
|
24
23
|
end
|
25
|
-
add_to_stream(event_ids, stream, expected_version)
|
26
|
-
@event_klass.import(hashes)
|
27
|
-
end
|
24
|
+
add_to_stream(event_ids, stream, expected_version) { @event_klass.insert_all!(hashes) }
|
28
25
|
end
|
29
26
|
|
30
27
|
def link_to_stream(event_ids, stream, expected_version)
|
@@ -55,13 +52,20 @@ module RailsEventStoreActiveRecord
|
|
55
52
|
end
|
56
53
|
|
57
54
|
def update_messages(records)
|
58
|
-
hashes
|
55
|
+
hashes = records.map { |record| upsert_hash(record, record.serialize(serializer)) }
|
59
56
|
for_update = records.map(&:event_id)
|
60
57
|
start_transaction do
|
61
|
-
existing =
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
existing =
|
59
|
+
@event_klass
|
60
|
+
.where(event_id: for_update)
|
61
|
+
.pluck(:event_id, :id, :created_at)
|
62
|
+
.reduce({}) { |acc, (event_id, id, created_at)| acc.merge(event_id => [id, created_at]) }
|
63
|
+
(for_update - existing.keys).each { |id| raise RubyEventStore::EventNotFound.new(id) }
|
64
|
+
hashes.each do |h|
|
65
|
+
h[:id] = existing.fetch(h.fetch(:event_id)).at(0)
|
66
|
+
h[:created_at] = existing.fetch(h.fetch(:event_id)).at(1)
|
67
|
+
end
|
68
|
+
@event_klass.upsert_all(hashes)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
@@ -77,23 +81,32 @@ module RailsEventStoreActiveRecord
|
|
77
81
|
@repo_reader.global_position(event_id)
|
78
82
|
end
|
79
83
|
|
84
|
+
def event_in_stream?(event_id, stream)
|
85
|
+
@repo_reader.event_in_stream?(event_id, stream)
|
86
|
+
end
|
87
|
+
|
80
88
|
private
|
89
|
+
|
81
90
|
attr_reader :serializer
|
82
91
|
|
83
92
|
def add_to_stream(event_ids, stream, expected_version)
|
84
|
-
last_stream_version = ->(stream_)
|
93
|
+
last_stream_version = ->(stream_) do
|
94
|
+
@stream_klass.where(stream: stream_.name).order("position DESC").first.try(:position)
|
95
|
+
end
|
85
96
|
resolved_version = expected_version.resolve_for(stream, last_stream_version)
|
86
97
|
|
87
98
|
start_transaction do
|
88
99
|
yield if block_given?
|
89
|
-
in_stream =
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
100
|
+
in_stream =
|
101
|
+
event_ids.map.with_index do |event_id, index|
|
102
|
+
{
|
103
|
+
stream: stream.name,
|
104
|
+
position: compute_position(resolved_version, index),
|
105
|
+
event_id: event_id,
|
106
|
+
created_at: Time.now.utc
|
107
|
+
}
|
108
|
+
end
|
109
|
+
@stream_klass.insert_all!(in_stream) unless stream.global?
|
97
110
|
end
|
98
111
|
self
|
99
112
|
rescue ActiveRecord::RecordNotUnique => e
|
@@ -101,30 +114,36 @@ module RailsEventStoreActiveRecord
|
|
101
114
|
end
|
102
115
|
|
103
116
|
def raise_error(e)
|
104
|
-
if detect_index_violated(e.message)
|
105
|
-
raise RubyEventStore::EventDuplicatedInStream
|
106
|
-
end
|
117
|
+
raise RubyEventStore::EventDuplicatedInStream if detect_index_violated(e.message)
|
107
118
|
raise RubyEventStore::WrongExpectedEventVersion
|
108
119
|
end
|
109
120
|
|
110
121
|
def compute_position(resolved_version, index)
|
111
|
-
unless resolved_version.nil?
|
112
|
-
resolved_version + index + POSITION_SHIFT
|
113
|
-
end
|
122
|
+
resolved_version + index + POSITION_SHIFT unless resolved_version.nil?
|
114
123
|
end
|
115
124
|
|
116
125
|
def detect_index_violated(message)
|
117
126
|
@index_violation_detector.detect(message)
|
118
127
|
end
|
119
128
|
|
120
|
-
def
|
129
|
+
def insert_hash(record, serialized_record)
|
121
130
|
{
|
122
|
-
event_id:
|
123
|
-
data:
|
124
|
-
metadata:
|
131
|
+
event_id: serialized_record.event_id,
|
132
|
+
data: serialized_record.data,
|
133
|
+
metadata: serialized_record.metadata,
|
125
134
|
event_type: serialized_record.event_type,
|
126
135
|
created_at: record.timestamp,
|
127
|
-
valid_at:
|
136
|
+
valid_at: optimize_timestamp(record.valid_at, record.timestamp)
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
def upsert_hash(record, serialized_record)
|
141
|
+
{
|
142
|
+
event_id: serialized_record.event_id,
|
143
|
+
data: serialized_record.data,
|
144
|
+
metadata: serialized_record.metadata,
|
145
|
+
event_type: serialized_record.event_type,
|
146
|
+
valid_at: optimize_timestamp(record.valid_at, record.timestamp)
|
128
147
|
}
|
129
148
|
end
|
130
149
|
|
@@ -136,5 +155,4 @@ module RailsEventStoreActiveRecord
|
|
136
155
|
@event_klass.transaction(requires_new: true, &block)
|
137
156
|
end
|
138
157
|
end
|
139
|
-
|
140
158
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class EventRepositoryReader
|
5
|
-
|
6
5
|
def initialize(event_klass, stream_klass, serializer)
|
7
6
|
@event_klass = event_klass
|
8
7
|
@stream_klass = stream_klass
|
@@ -38,9 +37,7 @@ module RailsEventStoreActiveRecord
|
|
38
37
|
end
|
39
38
|
|
40
39
|
def streams_of(event_id)
|
41
|
-
@stream_klass.where(event_id: event_id)
|
42
|
-
.pluck(:stream)
|
43
|
-
.map { |name| RubyEventStore::Stream.new(name) }
|
40
|
+
@stream_klass.where(event_id: event_id).pluck(:stream).map { |name| RubyEventStore::Stream.new(name) }
|
44
41
|
end
|
45
42
|
|
46
43
|
def position_in_stream(event_id, stream)
|
@@ -55,23 +52,28 @@ module RailsEventStoreActiveRecord
|
|
55
52
|
record.id - 1
|
56
53
|
end
|
57
54
|
|
55
|
+
def event_in_stream?(event_id, stream)
|
56
|
+
@stream_klass.where(event_id: event_id, stream: stream.name).exists?
|
57
|
+
end
|
58
|
+
|
58
59
|
private
|
60
|
+
|
59
61
|
attr_reader :serializer
|
60
62
|
|
61
63
|
def offset_limit_batch_reader(spec, stream)
|
62
|
-
batch_reader = ->(offset, limit)
|
63
|
-
stream
|
64
|
-
.offset(offset)
|
65
|
-
.limit(limit)
|
66
|
-
.map(&method(:record))
|
67
|
-
end
|
64
|
+
batch_reader = ->(offset, limit) { stream.offset(offset).limit(limit).map(&method(:record)) }
|
68
65
|
RubyEventStore::BatchEnumerator.new(spec.batch_size, spec.limit, batch_reader).each
|
69
66
|
end
|
70
67
|
|
71
68
|
def monotonic_id_batch_reader(spec, stream)
|
72
69
|
batch_reader = ->(offset_id, limit) do
|
73
70
|
search_in = spec.stream.global? ? @event_klass.table_name : @stream_klass.table_name
|
74
|
-
records =
|
71
|
+
records =
|
72
|
+
if offset_id.nil?
|
73
|
+
stream.limit(limit)
|
74
|
+
else
|
75
|
+
stream.where(start_offset_condition(spec, offset_id, search_in)).limit(limit)
|
76
|
+
end
|
75
77
|
[records.map(&method(:record)), records.last]
|
76
78
|
end
|
77
79
|
BatchEnumerator.new(spec.batch_size, spec.limit, batch_reader).each
|
@@ -80,29 +82,29 @@ module RailsEventStoreActiveRecord
|
|
80
82
|
def read_scope(spec)
|
81
83
|
if spec.stream.global?
|
82
84
|
stream = @event_klass
|
83
|
-
stream = stream.where(event_id: spec.with_ids)
|
84
|
-
stream = stream.where(event_type: spec.with_types)
|
85
|
+
stream = stream.where(event_id: spec.with_ids) if spec.with_ids?
|
86
|
+
stream = stream.where(event_type: spec.with_types) if spec.with_types?
|
85
87
|
stream = ordered(stream, spec)
|
86
|
-
stream = stream.limit(spec.limit)
|
87
|
-
stream = stream.where(start_condition_in_global_stream(spec))
|
88
|
-
stream = stream.where(stop_condition_in_global_stream(spec))
|
89
|
-
stream = stream.where(older_than_condition(spec))
|
88
|
+
stream = stream.limit(spec.limit) if spec.limit?
|
89
|
+
stream = stream.where(start_condition_in_global_stream(spec)) if spec.start
|
90
|
+
stream = stream.where(stop_condition_in_global_stream(spec)) if spec.stop
|
91
|
+
stream = stream.where(older_than_condition(spec)) if spec.older_than
|
90
92
|
stream = stream.where(older_than_or_equal_condition(spec)) if spec.older_than_or_equal
|
91
|
-
stream = stream.where(newer_than_condition(spec))
|
93
|
+
stream = stream.where(newer_than_condition(spec)) if spec.newer_than
|
92
94
|
stream = stream.where(newer_than_or_equal_condition(spec)) if spec.newer_than_or_equal
|
93
95
|
stream.order(id: order(spec))
|
94
96
|
else
|
95
97
|
stream = @stream_klass.preload(:event).where(stream: spec.stream.name)
|
96
|
-
stream = stream.where(event_id: spec.with_ids)
|
97
|
-
stream = stream.where(@event_klass.table_name => {event_type: spec.with_types}) if spec.with_types?
|
98
|
+
stream = stream.where(event_id: spec.with_ids) if spec.with_ids?
|
99
|
+
stream = stream.where(@event_klass.table_name => { event_type: spec.with_types }) if spec.with_types?
|
98
100
|
stream = ordered(stream.joins(:event), spec)
|
99
101
|
stream = stream.order(id: order(spec))
|
100
|
-
stream = stream.limit(spec.limit)
|
101
|
-
stream = stream.where(start_condition(spec))
|
102
|
-
stream = stream.where(stop_condition(spec))
|
103
|
-
stream = stream.where(older_than_condition(spec))
|
102
|
+
stream = stream.limit(spec.limit) if spec.limit?
|
103
|
+
stream = stream.where(start_condition(spec)) if spec.start
|
104
|
+
stream = stream.where(stop_condition(spec)) if spec.stop
|
105
|
+
stream = stream.where(older_than_condition(spec)) if spec.older_than
|
104
106
|
stream = stream.where(older_than_or_equal_condition(spec)) if spec.older_than_or_equal
|
105
|
-
stream = stream.where(newer_than_condition(spec))
|
107
|
+
stream = stream.where(newer_than_condition(spec)) if spec.newer_than
|
106
108
|
stream = stream.where(newer_than_or_equal_condition(spec)) if spec.newer_than_or_equal
|
107
109
|
stream
|
108
110
|
end
|
@@ -120,37 +122,41 @@ module RailsEventStoreActiveRecord
|
|
120
122
|
end
|
121
123
|
|
122
124
|
def start_offset_condition(specification, record_id, search_in)
|
123
|
-
condition = "#{search_in}.id #{specification.forward? ?
|
125
|
+
condition = "#{search_in}.id #{specification.forward? ? ">" : "<"} ?"
|
124
126
|
[condition, record_id]
|
125
127
|
end
|
126
128
|
|
127
129
|
def stop_offset_condition(specification, record_id, search_in)
|
128
|
-
condition = "#{search_in}.id #{specification.forward? ?
|
130
|
+
condition = "#{search_in}.id #{specification.forward? ? "<" : ">"} ?"
|
129
131
|
[condition, record_id]
|
130
132
|
end
|
131
133
|
|
132
134
|
def start_condition(specification)
|
133
|
-
start_offset_condition(
|
135
|
+
start_offset_condition(
|
136
|
+
specification,
|
134
137
|
@stream_klass.find_by!(event_id: specification.start, stream: specification.stream.name),
|
135
|
-
@stream_klass.table_name
|
138
|
+
@stream_klass.table_name
|
139
|
+
)
|
136
140
|
end
|
137
141
|
|
138
142
|
def stop_condition(specification)
|
139
|
-
stop_offset_condition(
|
143
|
+
stop_offset_condition(
|
144
|
+
specification,
|
140
145
|
@stream_klass.find_by!(event_id: specification.stop, stream: specification.stream.name),
|
141
|
-
@stream_klass.table_name
|
146
|
+
@stream_klass.table_name
|
147
|
+
)
|
142
148
|
end
|
143
149
|
|
144
150
|
def start_condition_in_global_stream(specification)
|
145
|
-
start_offset_condition(
|
151
|
+
start_offset_condition(
|
152
|
+
specification,
|
146
153
|
@event_klass.find_by!(event_id: specification.start),
|
147
|
-
@event_klass.table_name
|
154
|
+
@event_klass.table_name
|
155
|
+
)
|
148
156
|
end
|
149
157
|
|
150
158
|
def stop_condition_in_global_stream(specification)
|
151
|
-
stop_offset_condition(specification,
|
152
|
-
@event_klass.find_by!(event_id: specification.stop),
|
153
|
-
@event_klass.table_name)
|
159
|
+
stop_offset_condition(specification, @event_klass.find_by!(event_id: specification.stop), @event_klass.table_name)
|
154
160
|
end
|
155
161
|
|
156
162
|
def older_than_condition(specification)
|
@@ -176,14 +182,16 @@ module RailsEventStoreActiveRecord
|
|
176
182
|
def record(record)
|
177
183
|
record = record.event if @stream_klass === record
|
178
184
|
|
179
|
-
RubyEventStore::SerializedRecord
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
185
|
+
RubyEventStore::SerializedRecord
|
186
|
+
.new(
|
187
|
+
event_id: record.event_id,
|
188
|
+
metadata: record.metadata,
|
189
|
+
data: record.data,
|
190
|
+
event_type: record.event_type,
|
191
|
+
timestamp: record.created_at.iso8601(RubyEventStore::TIMESTAMP_PRECISION),
|
192
|
+
valid_at: (record.valid_at || record.created_at).iso8601(RubyEventStore::TIMESTAMP_PRECISION)
|
193
|
+
)
|
194
|
+
.deserialize(serializer)
|
187
195
|
end
|
188
196
|
end
|
189
197
|
|
@@ -7,16 +7,18 @@ end
|
|
7
7
|
|
8
8
|
module RailsEventStoreActiveRecord
|
9
9
|
class MigrationGenerator < Rails::Generators::Base
|
10
|
-
class Error < Thor::Error
|
10
|
+
class Error < Thor::Error
|
11
|
+
end
|
11
12
|
|
12
|
-
DATA_TYPES = %w
|
13
|
+
DATA_TYPES = %w[binary json jsonb].freeze
|
13
14
|
|
14
15
|
source_root File.expand_path(File.join(File.dirname(__FILE__), "../generators/templates"))
|
15
16
|
class_option(
|
16
17
|
:data_type,
|
17
18
|
type: :string,
|
18
19
|
default: "binary",
|
19
|
-
desc:
|
20
|
+
desc:
|
21
|
+
"Configure the data type for `data` and `meta data` fields in Postgres migration (options: #{DATA_TYPES.join("/")})"
|
20
22
|
)
|
21
23
|
|
22
24
|
def initialize(*args)
|
@@ -45,4 +47,4 @@ module RailsEventStoreActiveRecord
|
|
45
47
|
Time.now.strftime("%Y%m%d%H%M%S")
|
46
48
|
end
|
47
49
|
end
|
48
|
-
end if defined?(Rails::Generators::Base)
|
50
|
+
end if defined?(Rails::Generators::Base)
|
@@ -2,41 +2,37 @@
|
|
2
2
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class IndexViolationDetector
|
5
|
-
|
6
5
|
def initialize(event_store_events, event_store_events_in_streams)
|
7
|
-
@postgres_pkey_error
|
6
|
+
@postgres_pkey_error = "Key (event_id)".freeze
|
8
7
|
@postgres_index_error = "Key (stream, event_id)".freeze
|
9
|
-
@mysql5_pkey_error
|
10
|
-
@mysql8_pkey_error
|
11
|
-
@mysql5_index_error
|
12
|
-
@mysql8_index_error
|
13
|
-
|
14
|
-
|
8
|
+
@mysql5_pkey_error = "for key 'index_#{event_store_events}_on_event_id'".freeze
|
9
|
+
@mysql8_pkey_error = "for key '#{event_store_events}.index_#{event_store_events}_on_event_id'".freeze
|
10
|
+
@mysql5_index_error = "for key 'index_#{event_store_events_in_streams}_on_stream_and_event_id'".freeze
|
11
|
+
@mysql8_index_error =
|
12
|
+
"for key '#{event_store_events_in_streams}.index_#{event_store_events_in_streams}_on_stream_and_event_id'"
|
13
|
+
.freeze
|
14
|
+
@sqlite3_pkey_error = "constraint failed: #{event_store_events}.event_id".freeze
|
15
|
+
@sqlite3_index_error =
|
16
|
+
"constraint failed: #{event_store_events_in_streams}.stream, #{event_store_events_in_streams}.event_id".freeze
|
15
17
|
end
|
16
18
|
|
17
19
|
def detect(message)
|
18
|
-
detect_postgres(message) ||
|
19
|
-
detect_mysql(message) ||
|
20
|
-
detect_sqlite(message)
|
20
|
+
detect_postgres(message) || detect_mysql(message) || detect_sqlite(message)
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def detect_postgres(message)
|
26
|
-
message.include?(@postgres_pkey_error) ||
|
27
|
-
message.include?(@postgres_index_error)
|
26
|
+
message.include?(@postgres_pkey_error) || message.include?(@postgres_index_error)
|
28
27
|
end
|
29
28
|
|
30
29
|
def detect_mysql(message)
|
31
|
-
message.include?(@mysql5_pkey_error)
|
32
|
-
message.include?(@
|
33
|
-
message.include?(@mysql5_index_error) ||
|
34
|
-
message.include?(@mysql8_index_error)
|
30
|
+
message.include?(@mysql5_pkey_error) || message.include?(@mysql8_pkey_error) ||
|
31
|
+
message.include?(@mysql5_index_error) || message.include?(@mysql8_index_error)
|
35
32
|
end
|
36
33
|
|
37
34
|
def detect_sqlite(message)
|
38
|
-
message.include?(@sqlite3_pkey_error) ||
|
39
|
-
message.include?(@sqlite3_index_error)
|
35
|
+
message.include?(@sqlite3_pkey_error) || message.include?(@sqlite3_index_error)
|
40
36
|
end
|
41
37
|
end
|
42
38
|
|
@@ -1,20 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "activerecord-import"
|
4
|
-
|
5
3
|
module RailsEventStoreActiveRecord
|
6
4
|
class PgLinearizedEventRepository < EventRepository
|
7
|
-
|
8
5
|
def start_transaction(&proc)
|
9
6
|
ActiveRecord::Base.transaction(requires_new: true) do
|
10
|
-
ActiveRecord::Base
|
11
|
-
.connection
|
12
|
-
.execute("SELECT pg_advisory_xact_lock(1845240511599988039) as l")
|
13
|
-
.each{}
|
7
|
+
ActiveRecord::Base.connection.execute("SELECT pg_advisory_xact_lock(1845240511599988039) as l").each {}
|
14
8
|
|
15
9
|
proc.call
|
16
10
|
end
|
17
11
|
end
|
18
|
-
|
19
12
|
end
|
20
13
|
end
|
@@ -3,31 +3,31 @@
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class WithAbstractBaseClass
|
5
5
|
def initialize(base_klass)
|
6
|
-
|
7
|
-
"#{base_klass} must be an abstract class that inherits from ActiveRecord::Base"
|
8
|
-
|
6
|
+
unless base_klass < ActiveRecord::Base && base_klass.abstract_class?
|
7
|
+
raise ArgumentError.new("#{base_klass} must be an abstract class that inherits from ActiveRecord::Base")
|
8
|
+
end
|
9
9
|
@base_klass = base_klass
|
10
10
|
end
|
11
11
|
|
12
12
|
def call(instance_id: SecureRandom.hex)
|
13
|
-
[
|
14
|
-
build_event_klass(instance_id),
|
15
|
-
build_stream_klass(instance_id),
|
16
|
-
]
|
13
|
+
[build_event_klass(instance_id), build_stream_klass(instance_id)]
|
17
14
|
end
|
18
15
|
|
19
16
|
private
|
17
|
+
|
20
18
|
def build_event_klass(instance_id)
|
21
|
-
Object.const_set(
|
19
|
+
Object.const_set(
|
20
|
+
"Event_#{instance_id}",
|
22
21
|
Class.new(@base_klass) do
|
23
22
|
self.primary_key = :id
|
24
|
-
self.table_name
|
23
|
+
self.table_name = "event_store_events"
|
25
24
|
end
|
26
25
|
)
|
27
26
|
end
|
28
27
|
|
29
28
|
def build_stream_klass(instance_id)
|
30
|
-
Object.const_set(
|
29
|
+
Object.const_set(
|
30
|
+
"EventInStream_#{instance_id}",
|
31
31
|
Class.new(@base_klass) do
|
32
32
|
self.primary_key = :id
|
33
33
|
self.table_name = "event_store_events_in_streams"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_event_store_active_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_event_store
|
@@ -16,42 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.4.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.4.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '6.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: activerecord-import
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 1.0.2
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.2
|
40
|
+
version: '6.0'
|
55
41
|
description: |
|
56
42
|
Persistent event repository implementation for RubyEventStore based on ActiveRecord. Ships with database schema
|
57
43
|
and migrations suitable for PostgreSQL, MySQL ans SQLite database engines.
|
@@ -85,6 +71,7 @@ metadata:
|
|
85
71
|
changelog_uri: https://github.com/RailsEventStore/rails_event_store/releases
|
86
72
|
source_code_uri: https://github.com/RailsEventStore/rails_event_store
|
87
73
|
bug_tracker_uri: https://github.com/RailsEventStore/rails_event_store/issues
|
74
|
+
rubygems_mfa_required: 'true'
|
88
75
|
post_install_message:
|
89
76
|
rdoc_options: []
|
90
77
|
require_paths:
|
@@ -93,14 +80,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
80
|
requirements:
|
94
81
|
- - ">="
|
95
82
|
- !ruby/object:Gem::Version
|
96
|
-
version: '2.
|
83
|
+
version: '2.7'
|
97
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
85
|
requirements:
|
99
86
|
- - ">="
|
100
87
|
- !ruby/object:Gem::Version
|
101
88
|
version: '0'
|
102
89
|
requirements: []
|
103
|
-
rubygems_version: 3.
|
90
|
+
rubygems_version: 3.3.7
|
104
91
|
signing_key:
|
105
92
|
specification_version: 4
|
106
93
|
summary: Persistent event repository implementation for RubyEventStore based on ActiveRecord
|