table_sync 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/docs/receiving.md +2 -2
- data/lib/table_sync/receiving/handler.rb +15 -14
- data/lib/table_sync/receiving/model/active_record.rb +11 -18
- data/lib/table_sync/receiving/model/sequel.rb +15 -25
- data/lib/table_sync/utils/interface_checker.rb +6 -0
- data/lib/table_sync/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6b452885641883758a131ec14f3a9aa2f8508bb1c3a540b8e78c727a8d86a88
|
4
|
+
data.tar.gz: efd055d98480febde524af5af5db5cfefde1b534a5fa40d7b8cb696ac11432ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd98bc390f5d04625d98c9c5fac179a9b588830210502727288b74c46f4badf4a177afbcbe02b67bd33cdd7ba8ed7d3fea593e3893e5519f5d2c40c01f3a454e
|
7
|
+
data.tar.gz: 230f6a412f0d2d55750a4d1edb75b5c9605730de1c6352d5e5d1e8b4375ed16081fe296f70ace3dff65b54d5b85bc1a18a153119d8a6f7c1994289d5170ddc80
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [4.1.0] - 2020-11-02
|
5
|
+
### Changed
|
6
|
+
- move `TableSync::Instrument.notify` from models to the handler
|
7
|
+
- fire `TableSync::Instrument.notify` after commit insted of in transaction
|
8
|
+
|
4
9
|
## [4.0.0] - 2020-10-23
|
5
10
|
### Returned
|
6
11
|
- config inheritance
|
data/Gemfile.lock
CHANGED
data/docs/receiving.md
CHANGED
@@ -22,7 +22,7 @@ class Rabbit::Handler::MainProject::TableSync < TableSync::ReceivingHandler
|
|
22
22
|
receive "User", to_table: :clients, events: %i[update destroy] do
|
23
23
|
mapping_overrides email: :project_user_email, id: :project_user_id
|
24
24
|
|
25
|
-
only :project_user_email, :project_user_id
|
25
|
+
only :project_user_email, :project_user_id, :project_id
|
26
26
|
target_keys :project_id, :project_user_id
|
27
27
|
rest_key :project_user_rest
|
28
28
|
version_key :project_user_version
|
@@ -37,7 +37,7 @@ class Rabbit::Handler::MainProject::TableSync < TableSync::ReceivingHandler
|
|
37
37
|
end
|
38
38
|
|
39
39
|
receive "User", to_model: CustomModel.new(:users) do
|
40
|
-
rest_key
|
40
|
+
rest_key false
|
41
41
|
end
|
42
42
|
end
|
43
43
|
```
|
@@ -109,22 +109,23 @@ class TableSync::Receiving::Handler < Rabbit::EventHandler
|
|
109
109
|
model = config.model
|
110
110
|
|
111
111
|
model.transaction do
|
112
|
-
if event == :update
|
113
|
-
|
114
|
-
|
115
|
-
|
112
|
+
results = if event == :update
|
113
|
+
config.before_update(**params)
|
114
|
+
model.upsert(**params)
|
115
|
+
else
|
116
|
+
config.before_destroy(**params)
|
117
|
+
model.destroy(**params)
|
118
|
+
end
|
119
|
+
|
120
|
+
model.after_commit do
|
121
|
+
TableSync::Instrument.notify table: model.table, schema: model.schema,
|
122
|
+
count: results.count, event: event, direction: :receive
|
123
|
+
end
|
116
124
|
|
117
|
-
|
118
|
-
|
119
|
-
end
|
125
|
+
if event == :update
|
126
|
+
model.after_commit { config.after_commit_on_update(**params.merge(results: results)) }
|
120
127
|
else
|
121
|
-
config.
|
122
|
-
|
123
|
-
results = model.destroy(**params)
|
124
|
-
|
125
|
-
model.after_commit do
|
126
|
-
config.after_commit_on_destroy(**params.merge(results: results))
|
127
|
-
end
|
128
|
+
model.after_commit { config.after_commit_on_destroy(**params.merge(results: results)) }
|
128
129
|
end
|
129
130
|
end
|
130
131
|
end
|
@@ -18,11 +18,18 @@ module TableSync::Receiving::Model
|
|
18
18
|
def trigger_transactional_callbacks?(*); end
|
19
19
|
end
|
20
20
|
|
21
|
+
attr_reader :table, :schema
|
22
|
+
|
21
23
|
def initialize(table_name)
|
22
24
|
@raw_model = Class.new(::ActiveRecord::Base) do
|
23
25
|
self.table_name = table_name
|
24
26
|
self.inheritance_column = nil
|
25
27
|
end
|
28
|
+
|
29
|
+
model_naming = ::TableSync::NamingResolver::ActiveRecord.new(table_name: table_name)
|
30
|
+
|
31
|
+
@table = model_naming.table.to_sym
|
32
|
+
@schema = model_naming.schema.to_sym
|
26
33
|
end
|
27
34
|
|
28
35
|
def columns
|
@@ -45,15 +52,15 @@ module TableSync::Receiving::Model
|
|
45
52
|
AND kcu.constraint_name = tc.constraint_name
|
46
53
|
WHERE
|
47
54
|
t.table_schema NOT IN ('pg_catalog', 'information_schema')
|
48
|
-
AND t.table_schema = '#{
|
49
|
-
AND t.table_name = '#{
|
55
|
+
AND t.table_schema = '#{schema}'
|
56
|
+
AND t.table_name = '#{table}'
|
50
57
|
ORDER BY
|
51
58
|
kcu.ordinal_position
|
52
59
|
SQL
|
53
60
|
end
|
54
61
|
|
55
62
|
def upsert(data:, target_keys:, version_key:, default_values:)
|
56
|
-
|
63
|
+
data.map do |datum|
|
57
64
|
conditions = datum.select { |k| target_keys.include?(k) }
|
58
65
|
|
59
66
|
row = raw_model.lock("FOR NO KEY UPDATE").where(conditions)
|
@@ -75,11 +82,6 @@ module TableSync::Receiving::Model
|
|
75
82
|
|
76
83
|
row_to_hash(row)
|
77
84
|
end.compact
|
78
|
-
|
79
|
-
TableSync::Instrument.notify(table: model_naming.table, schema: model_naming.schema,
|
80
|
-
event: :update, count: result.count, direction: :receive)
|
81
|
-
|
82
|
-
result
|
83
85
|
end
|
84
86
|
|
85
87
|
def destroy(data:, target_keys:, version_key:)
|
@@ -100,11 +102,6 @@ module TableSync::Receiving::Model
|
|
100
102
|
raise TableSync::DestroyError.new(data: data, target_keys: target_keys, result: result)
|
101
103
|
end
|
102
104
|
|
103
|
-
TableSync::Instrument.notify(
|
104
|
-
table: model_naming.table, schema: model_naming.schema,
|
105
|
-
event: :destroy, count: result.count, direction: :receive
|
106
|
-
)
|
107
|
-
|
108
105
|
result
|
109
106
|
end
|
110
107
|
|
@@ -121,11 +118,7 @@ module TableSync::Receiving::Model
|
|
121
118
|
attr_reader :raw_model
|
122
119
|
|
123
120
|
def db
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
def model_naming
|
128
|
-
::TableSync::NamingResolver::ActiveRecord.new(table_name: raw_model.table_name)
|
121
|
+
raw_model.connection
|
129
122
|
end
|
130
123
|
|
131
124
|
def row_to_hash(row)
|
@@ -2,8 +2,18 @@
|
|
2
2
|
|
3
3
|
module TableSync::Receiving::Model
|
4
4
|
class Sequel
|
5
|
+
attr_reader :table, :schema
|
6
|
+
|
5
7
|
def initialize(table_name)
|
6
8
|
@raw_model = Class.new(::Sequel::Model(table_name)).tap(&:unrestrict_primary_key)
|
9
|
+
|
10
|
+
model_naming = ::TableSync::NamingResolver::Sequel.new(
|
11
|
+
table_name: table_name,
|
12
|
+
db: @raw_model.db,
|
13
|
+
)
|
14
|
+
|
15
|
+
@table = model_naming.table.to_sym
|
16
|
+
@schema = model_naming.schema.to_sym
|
7
17
|
end
|
8
18
|
|
9
19
|
def columns
|
@@ -15,7 +25,7 @@ module TableSync::Receiving::Model
|
|
15
25
|
end
|
16
26
|
|
17
27
|
def upsert(data:, target_keys:, version_key:, default_values:)
|
18
|
-
qualified_version = ::Sequel.qualify(table_name, version_key)
|
28
|
+
qualified_version = ::Sequel.qualify(raw_model.table_name, version_key)
|
19
29
|
version_condition = ::Sequel.function(:coalesce, qualified_version, 0) <
|
20
30
|
::Sequel.qualify(:excluded, version_key)
|
21
31
|
|
@@ -24,18 +34,10 @@ module TableSync::Receiving::Model
|
|
24
34
|
|
25
35
|
insert_data = type_cast(data)
|
26
36
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
update_where: version_condition,
|
32
|
-
)
|
33
|
-
.multi_insert(insert_data)
|
34
|
-
|
35
|
-
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
36
|
-
count: result.count, event: :update, direction: :receive
|
37
|
-
|
38
|
-
result
|
37
|
+
dataset
|
38
|
+
.returning
|
39
|
+
.insert_conflict(target: target_keys, update: upd_spec, update_where: version_condition)
|
40
|
+
.multi_insert(insert_data)
|
39
41
|
end
|
40
42
|
|
41
43
|
def destroy(data:, target_keys:, version_key:)
|
@@ -47,10 +49,6 @@ module TableSync::Receiving::Model
|
|
47
49
|
raise TableSync::DestroyError.new(data: data, target_keys: target_keys, result: result)
|
48
50
|
end
|
49
51
|
|
50
|
-
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
51
|
-
count: result.count,
|
52
|
-
event: :destroy, direction: :receive
|
53
|
-
|
54
52
|
result
|
55
53
|
end
|
56
54
|
|
@@ -66,14 +64,6 @@ module TableSync::Receiving::Model
|
|
66
64
|
|
67
65
|
attr_reader :raw_model
|
68
66
|
|
69
|
-
def table_name
|
70
|
-
raw_model.table_name
|
71
|
-
end
|
72
|
-
|
73
|
-
def model_naming
|
74
|
-
::TableSync::NamingResolver::Sequel.new(table_name: table_name, db: db)
|
75
|
-
end
|
76
|
-
|
77
67
|
def dataset
|
78
68
|
raw_model.dataset
|
79
69
|
end
|
@@ -95,3 +95,9 @@ __END__
|
|
95
95
|
:primary_keys:
|
96
96
|
:parameters: []
|
97
97
|
:description: "returns an array with the primary_keys"
|
98
|
+
:table:
|
99
|
+
:parameters: []
|
100
|
+
:description: "returns an instance of Symbol"
|
101
|
+
:schema:
|
102
|
+
:parameters: []
|
103
|
+
:description: "returns an instance of Symbol"
|
data/lib/table_sync/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Umbrellio
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: memery
|
@@ -302,7 +302,7 @@ homepage: https://github.com/umbrellio/table_sync
|
|
302
302
|
licenses:
|
303
303
|
- MIT
|
304
304
|
metadata: {}
|
305
|
-
post_install_message:
|
305
|
+
post_install_message:
|
306
306
|
rdoc_options: []
|
307
307
|
require_paths:
|
308
308
|
- lib
|
@@ -318,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
318
318
|
version: '0'
|
319
319
|
requirements: []
|
320
320
|
rubygems_version: 3.2.0.rc.1
|
321
|
-
signing_key:
|
321
|
+
signing_key:
|
322
322
|
specification_version: 4
|
323
323
|
summary: DB Table synchronization between microservices based on Model's event system
|
324
324
|
and RabbitMQ messaging
|