activerecord_worm_table 0.4.0 → 0.5.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.
- data/README.rdoc +3 -2
- data/VERSION +1 -1
- data/lib/activerecord_worm_table.rb +48 -15
- metadata +2 -2
data/README.rdoc
CHANGED
|
@@ -12,13 +12,14 @@ model methods, like finders, work transparently
|
|
|
12
12
|
|
|
13
13
|
to use, just <tt>include ActiveRecord::WormTable</tt> into your model :
|
|
14
14
|
|
|
15
|
-
class Foo
|
|
15
|
+
class Foo < ActiveRecord::Base
|
|
16
16
|
include ActiveRecord::WormTable
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
there are class methods to get the different table names, and manipulate the version :
|
|
20
20
|
|
|
21
21
|
* <tt>Foo.table_name</tt> : current active table name
|
|
22
|
+
* <tt>Foo.advance_version(&block)</tt> : run +block+ to create a new version of the table. the working table will appear active to the +Thread+ running +block+ , and if +block+ completes then the working table will become permanently globally active
|
|
22
23
|
* <tt>Foo.working_table_name</tt> : current working table name
|
|
23
24
|
* <tt>Foo.advance_version</tt> : make active table historical, working table active and create a new working table
|
|
24
25
|
|
|
@@ -43,7 +44,7 @@ operations too limited, to easily make it generic. wouldn't be too hard to exten
|
|
|
43
44
|
future version unintentionally.
|
|
44
45
|
* Commit, do not mess with rakefile, version, or history.
|
|
45
46
|
(if you want to have your own version, that is fine but
|
|
46
|
-
|
|
47
|
+
bump version in a commit by itself I can ignore when I pull)
|
|
47
48
|
* Send me a pull request. Bonus points for topic branches.
|
|
48
49
|
|
|
49
50
|
== Copyright
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.5.0
|
|
@@ -26,10 +26,24 @@ module ActiveRecord
|
|
|
26
26
|
def ClassMethods.included(mod)
|
|
27
27
|
mod.instance_eval do
|
|
28
28
|
alias_method :org_table_name, :table_name
|
|
29
|
-
alias_method :table_name, :
|
|
29
|
+
alias_method :table_name, :active_working_table_or_active_table_name
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
+
# number of historical tables to keep around for posterity, or more likely
|
|
34
|
+
# to ensure running transactions aren't taken down by advance_version
|
|
35
|
+
# recreating a table. default 2
|
|
36
|
+
def historical_version_count
|
|
37
|
+
@historical_version_count || 2
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# set the number of historical tables to keep around to ensure running
|
|
41
|
+
# transactions aren't interrupted by truncating working tables. 2 is default
|
|
42
|
+
def set_historical_version_count(count)
|
|
43
|
+
@historical_version_count = count
|
|
44
|
+
end
|
|
45
|
+
alias :historical_version_count= :set_historical_version_count
|
|
46
|
+
|
|
33
47
|
# hide the ActiveRecord::Base method, which redefines a table_name method,
|
|
34
48
|
# and instead capture the given name as the base_table_name
|
|
35
49
|
def set_table_name(name)
|
|
@@ -40,25 +54,14 @@ module ActiveRecord
|
|
|
40
54
|
def base_table_name
|
|
41
55
|
if !@base_table_name
|
|
42
56
|
@base_table_name = org_table_name
|
|
57
|
+
# the original table_name method re-aliases itself !
|
|
43
58
|
class << self
|
|
44
|
-
alias_method :table_name, :
|
|
59
|
+
alias_method :table_name, :active_working_table_or_active_table_name
|
|
45
60
|
end
|
|
46
61
|
end
|
|
47
62
|
@base_table_name
|
|
48
63
|
end
|
|
49
64
|
|
|
50
|
-
# number of historical tables to keep around for posterity, or more likely
|
|
51
|
-
# to ensure running transactions aren't taken down by advance_version
|
|
52
|
-
# recreating a table
|
|
53
|
-
def historical_version_count
|
|
54
|
-
@historical_version_count || 2
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def set_historical_version_count(count)
|
|
58
|
-
@historical_version_count = count
|
|
59
|
-
end
|
|
60
|
-
alias :historical_version_count= :set_historical_version_count
|
|
61
|
-
|
|
62
65
|
# use schema of from table to recreate to table
|
|
63
66
|
def dup_table_schema(from, to)
|
|
64
67
|
connection.execute( "drop table if exists #{to}")
|
|
@@ -121,7 +124,7 @@ module ActiveRecord
|
|
|
121
124
|
end
|
|
122
125
|
end
|
|
123
126
|
|
|
124
|
-
# name of the active table
|
|
127
|
+
# name of the active table read direct from db
|
|
125
128
|
def active_table_name
|
|
126
129
|
st = switch_table_name
|
|
127
130
|
begin
|
|
@@ -168,7 +171,37 @@ module ActiveRecord
|
|
|
168
171
|
else
|
|
169
172
|
connection.execute( "truncate table #{new_wtn}" )
|
|
170
173
|
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def thread_local_key_name
|
|
177
|
+
"ActiveRecord::WormTable::" + self.to_s
|
|
178
|
+
end
|
|
171
179
|
|
|
180
|
+
def active_working_table_name
|
|
181
|
+
Thread.current[thread_local_key_name]
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def active_working_table_name=(name)
|
|
185
|
+
Thread.current[thread_local_key_name] = name
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# name of the active table, or the working table if inside a new_version block
|
|
189
|
+
def active_working_table_or_active_table_name
|
|
190
|
+
active_working_table_name || active_table_name
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# make the working table temporarily active [ for this thread only ],
|
|
194
|
+
# execute the block, and if completed without exception then
|
|
195
|
+
# make the working table permanently active
|
|
196
|
+
def new_version(&block)
|
|
197
|
+
begin
|
|
198
|
+
self.active_working_table_name = working_table_name
|
|
199
|
+
r = block.call
|
|
200
|
+
advance_version
|
|
201
|
+
r
|
|
202
|
+
ensure
|
|
203
|
+
self.active_working_table_name = nil
|
|
204
|
+
end
|
|
172
205
|
end
|
|
173
206
|
end
|
|
174
207
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord_worm_table
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- mccraig mccraig of the clan mccraig
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-11-
|
|
12
|
+
date: 2009-11-12 00:00:00 +00:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|