acts_as_shardable 0.2.0 → 0.3.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/acts_as_shardable.rb +85 -18
- data/lib/acts_as_shardable/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 682f5dff4f95776b0c2a8d19e67d7521de209bb0
|
4
|
+
data.tar.gz: 9f1478defcf88c299bdba64aa6fec066c9b55bfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4acf829b64e9391ded87d396a69daf4c20569850d76f51e967f6de2b8ab0acb22df8a74d42201030ac21330539838087f99ca78ba3bec3003ce1d633b6f30cb3
|
7
|
+
data.tar.gz: e1cc62c238ab080f94d802443289047d674222df0f871087d926e0095222bfa0c243f696d4467161565599d6277cd4e1c14ef1671c19180ea5c2c8eab7c3df4d
|
data/README.md
CHANGED
data/lib/acts_as_shardable.rb
CHANGED
@@ -24,37 +24,92 @@ module ActsAsShardable
|
|
24
24
|
# Updates the associated record with values matching those of the instance attributes.
|
25
25
|
# Returns the number of affected rows.
|
26
26
|
define_method :_update_record do |attribute_names = self.attribute_names|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
|
28
|
+
was, is = changes[self.class.base_class.shard_method]
|
29
|
+
|
30
|
+
if was
|
31
|
+
# shard_column changed
|
32
|
+
table_was = self.class.base_class.sharding(was).table_name
|
33
|
+
table_is = self.class.base_class.sharding(is).table_name
|
34
|
+
raise WrongShardingError, "Please move from #{table_was} to #{table_is} manually."
|
30
35
|
else
|
31
|
-
|
32
|
-
if
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
# shard_column not changing
|
37
|
+
if locking_enabled?
|
38
|
+
lock_col = self.class.base_class.locking_column
|
39
|
+
previous_lock_value = self[lock_col]
|
40
|
+
self[lock_col] = previous_lock_value + 1
|
41
|
+
|
42
|
+
attribute_names += [lock_col].compact
|
43
|
+
attribute_names.uniq!
|
44
|
+
|
45
|
+
begin
|
46
|
+
relation = self.class.base_class.sharding(is).unscoped
|
47
|
+
|
48
|
+
affected_rows = relation.where(
|
49
|
+
self.class.primary_key => id,
|
50
|
+
lock_col => previous_lock_value,
|
51
|
+
).update_all(
|
52
|
+
Hash[attributes_for_update(attribute_names).map do |name|
|
53
|
+
[name, _read_attribute(name)]
|
54
|
+
end]
|
55
|
+
)
|
56
|
+
|
57
|
+
unless affected_rows == 1
|
58
|
+
raise ActiveRecord::StaleObjectError.new(self, "update")
|
59
|
+
end
|
60
|
+
|
61
|
+
affected_rows
|
42
62
|
|
43
|
-
|
63
|
+
# If something went wrong, revert the version.
|
64
|
+
rescue Exception
|
65
|
+
send(lock_col + '=', previous_lock_value)
|
66
|
+
raise
|
67
|
+
end
|
44
68
|
else
|
45
|
-
|
69
|
+
attributes_values = arel_attributes_with_values_for_update(attribute_names)
|
70
|
+
if attributes_values.empty?
|
71
|
+
0
|
72
|
+
else
|
73
|
+
shard.unscoped._update_record attributes_values, id, id_was
|
74
|
+
end
|
46
75
|
end
|
47
76
|
end
|
48
77
|
end
|
49
78
|
|
50
79
|
private :_update_record
|
51
80
|
|
81
|
+
|
82
|
+
define_method :touch do |*names|
|
83
|
+
raise ActiveRecordError, "cannot touch on a new record object" unless persisted?
|
84
|
+
|
85
|
+
attributes = timestamp_attributes_for_update_in_model
|
86
|
+
attributes.concat(names)
|
87
|
+
|
88
|
+
unless attributes.empty?
|
89
|
+
current_time = current_time_from_proper_timezone
|
90
|
+
changes = {}
|
91
|
+
|
92
|
+
attributes.each do |column|
|
93
|
+
column = column.to_s
|
94
|
+
changes[column] = write_attribute(column, current_time)
|
95
|
+
end
|
96
|
+
|
97
|
+
changes[self.class.locking_column] = increment_lock if locking_enabled?
|
98
|
+
|
99
|
+
clear_attribute_changes(changes.keys)
|
100
|
+
primary_key = self.class.primary_key
|
101
|
+
shard.unscoped.where(primary_key => self[primary_key]).update_all(changes) == 1
|
102
|
+
else
|
103
|
+
true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
52
107
|
# Creates a record with values matching those of the instance attributes
|
53
108
|
# and returns its id.
|
54
109
|
define_method :_create_record do |attribute_names = self.attribute_names|
|
55
110
|
attributes_values = arel_attributes_with_values_for_create(attribute_names)
|
56
111
|
|
57
|
-
new_id =
|
112
|
+
new_id = shard.unscoped.insert attributes_values
|
58
113
|
self.id ||= new_id if self.class.base_class.primary_key
|
59
114
|
|
60
115
|
@new_record = false
|
@@ -63,6 +118,12 @@ module ActsAsShardable
|
|
63
118
|
|
64
119
|
private :_create_record
|
65
120
|
|
121
|
+
define_method :shard do
|
122
|
+
self.class.base_class.sharding(self[self.class.base_class.shard_method])
|
123
|
+
end
|
124
|
+
|
125
|
+
private :shard
|
126
|
+
|
66
127
|
self.class.send :define_method, :sharding do |column|
|
67
128
|
i = column.to_i % shard_mod
|
68
129
|
klass = "#{base_class.name.demodulize}_%04d" % i
|
@@ -81,7 +142,8 @@ module ActsAsShardable
|
|
81
142
|
self.const_get('ActiveRecord_Relation').class_exec do
|
82
143
|
def to_proto(*args)
|
83
144
|
msg_class = base_class.name.demodulize.pluralize
|
84
|
-
|
145
|
+
module_name = base_class.name.deconstantize.constantize
|
146
|
+
module_name::Messages.const_get(msg_class).new(msg_class.underscore => map { |r| r.to_proto(*args) })
|
85
147
|
end
|
86
148
|
end
|
87
149
|
end
|
@@ -90,7 +152,12 @@ module ActsAsShardable
|
|
90
152
|
end
|
91
153
|
end
|
92
154
|
end
|
155
|
+
|
156
|
+
define_method :real do
|
157
|
+
self.class.sharding(self[self.class.base_class.shard_method]).find(id)
|
158
|
+
end
|
93
159
|
end
|
160
|
+
|
94
161
|
end
|
95
162
|
|
96
163
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_shardable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- scorix
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|