rubyrep 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 1.1.2 2009-05-10
2
+
3
+ * Bug fix: escape primary keys in replication triggers
4
+
1
5
  == 1.1.1 2009-02-02
2
6
 
3
7
  * Feature: optional use of an SQL logger
@@ -19,8 +19,8 @@ module RR
19
19
  # * a logger instance itself (Logger or Log4r::Logger) or
20
20
  # * the parameter to create a Logger with Logger.new
21
21
  # Examples:
22
- # +config.left[:logger] = STDOUT
23
- # +config.right[:logger] = Logger.new('rubyrep_debug.log')
22
+ # config.left[:logger] = STDOUT
23
+ # config.right[:logger] = Logger.new('rubyrep_debug.log')
24
24
  attr_accessor :right
25
25
 
26
26
  # Returns true unless running on windows...
@@ -39,7 +39,7 @@ module RR
39
39
  # * +params+: the parameter hash as described in #create_rep_trigger
40
40
  def key_clause(trigger_var, params)
41
41
  "concat_ws('#{params[:key_sep]}', " +
42
- params[:keys].map { |key| "'#{key}', #{trigger_var}.#{key}"}.join(", ") +
42
+ params[:keys].map { |key| "'#{key}', #{trigger_var}.#{quote_column_name(key)}"}.join(", ") +
43
43
  ")"
44
44
  end
45
45
  private :key_clause
@@ -10,7 +10,7 @@ module RR
10
10
  # * +params+: the parameter hash as described in #create_rep_trigger
11
11
  def key_clause(trigger_var, params)
12
12
  params[:keys].
13
- map { |key| "'#{key}#{params[:key_sep]}' || #{trigger_var}.#{key}"}.
13
+ map { |key| "'#{key}#{params[:key_sep]}' || #{trigger_var}.#{quote_column_name(key)}"}.
14
14
  join(" || '#{params[:key_sep]}' || ")
15
15
  end
16
16
  private :key_clause
@@ -2,7 +2,7 @@ module RR #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 1
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -64,7 +64,7 @@ describe "Unusual table and column name support" do
64
64
  end
65
65
  end
66
66
 
67
- it "should support trigger operations" do
67
+ it "should support trigger operations for strange tables" do
68
68
  trigger_name = 'rr_' + STRANGE_TABLE
69
69
  session = Session.new
70
70
  begin
@@ -98,4 +98,38 @@ describe "Unusual table and column name support" do
98
98
  session.left.execute "delete from rr_pending_changes"
99
99
  end
100
100
  end
101
+
102
+ it "should support trigger operations for table with strange primary keys" do
103
+ trigger_name = 'rr_table_with_strange_key'
104
+ session = Session.new
105
+ begin
106
+ session.left.replication_trigger_exists?(trigger_name, :table_with_strange_key).should be_false
107
+ session.left.create_replication_trigger({
108
+ :trigger_name => trigger_name,
109
+ :table => :table_with_strange_key,
110
+ :keys => [STRANGE_COLUMN],
111
+ :log_table => 'rr_pending_changes',
112
+ :activity_table => 'rr_running_flags',
113
+ :key_sep => '|',
114
+ :exclude_rr_activity => true
115
+ })
116
+ session.left.replication_trigger_exists?(trigger_name, :table_with_strange_key).should be_true
117
+ session.left.insert_record 'table_with_strange_key', {
118
+ STRANGE_COLUMN => '11'
119
+ }
120
+ log_record = session.left.select_one(
121
+ "select * from rr_pending_changes where change_table = 'table_with_strange_key'")
122
+ log_record['change_key'].should == "#{STRANGE_COLUMN}|11"
123
+ log_record['change_type'].should == 'I'
124
+
125
+ session.left.drop_replication_trigger trigger_name, :table_with_strange_key
126
+ session.left.replication_trigger_exists?(trigger_name, :table_with_strange_key).should be_false
127
+ ensure
128
+ if session.left.replication_trigger_exists?(trigger_name, :table_with_strange_key)
129
+ session.left.drop_replication_trigger trigger_name, :table_with_strange_key
130
+ end
131
+ session.left.execute "delete from #{session.left.quote_table_name(:table_with_strange_key)}"
132
+ session.left.execute "delete from rr_pending_changes"
133
+ end
134
+ end
101
135
  end
data/tasks/database.rake CHANGED
@@ -271,6 +271,15 @@ def create_sample_schema(database, config)
271
271
  return name, nil
272
272
  end
273
273
 
274
+ create_table :table_with_strange_key, :id => false do |t|
275
+ t.column STRANGE_COLUMN, :integer
276
+ end
277
+
278
+ ActiveRecord::Base.connection.execute(<<-end_sql)
279
+ ALTER TABLE table_with_strange_key ADD CONSTRAINT table_with_strange_key_pkey
280
+ PRIMARY KEY (#{ActiveRecord::Base.connection.quote_column_name(STRANGE_COLUMN)})
281
+ end_sql
282
+
274
283
  create_table STRANGE_TABLE do |t|
275
284
  t.column :first_fk, :integer
276
285
  t.column :second_fk, :integer
@@ -330,6 +339,7 @@ def drop_sample_schema(config)
330
339
  ActiveRecord::Schema.define do
331
340
  drop_table :rr_referencing rescue nil
332
341
  drop_table :rr_duplicate rescue nil
342
+ drop_table :table_with_strange_key rescue nil
333
343
  drop_table STRANGE_TABLE rescue nil
334
344
  drop_table :extender_type_check rescue nil
335
345
  drop_table :extender_no_record rescue nil
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyrep
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 1
8
+ - 2
9
+ version: 1.1.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Arndt Lehmann
@@ -9,39 +14,51 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-03 00:00:00 +09:00
17
+ date: 2010-05-10 00:00:00 +09:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: activesupport
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 3
30
+ - 5
23
31
  version: 2.3.5
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: activerecord
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 3
44
+ - 5
33
45
  version: 2.3.5
34
- version:
46
+ type: :runtime
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: hoe
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
40
52
  requirements:
41
53
  - - ">="
42
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 2
57
+ - 4
58
+ - 0
43
59
  version: 2.4.0
44
- version:
60
+ type: :development
61
+ version_requirements: *id003
45
62
  description: Asynchronous master-master replication of relational databases.
46
63
  email: mail@arndtlehman.com
47
64
  executables:
@@ -219,18 +236,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
219
236
  requirements:
220
237
  - - ">="
221
238
  - !ruby/object:Gem::Version
239
+ segments:
240
+ - 0
222
241
  version: "0"
223
- version:
224
242
  required_rubygems_version: !ruby/object:Gem::Requirement
225
243
  requirements:
226
244
  - - ">="
227
245
  - !ruby/object:Gem::Version
246
+ segments:
247
+ - 0
228
248
  version: "0"
229
- version:
230
249
  requirements: []
231
250
 
232
251
  rubyforge_project: rubyrep
233
- rubygems_version: 1.3.5
252
+ rubygems_version: 1.3.6
234
253
  signing_key:
235
254
  specification_version: 3
236
255
  summary: Asynchronous master-master replication of relational databases.