dbhijacker 0.4.5 → 0.4.6

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dbhijacker (0.4.5)
4
+ dbhijacker (0.4.6)
5
5
  rails (~> 2.3.14)
6
6
 
7
7
  GEM
data/hijacker.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dbhijacker}
5
5
  s.homepage = "https://github.com/crystalcommerce/hijacker"
6
- s.version = "0.4.5"
6
+ s.version = "0.4.6"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
9
  s.authors = ["Michael Xavier", "Donald Plummer", "Woody Peterson"]
@@ -1,4 +1,31 @@
1
+ #Dummy exceptions if driver not loaded
2
+ if !defined?(Mysql2)
3
+ module Mysql2
4
+ class Error < StandardError
5
+ attr_accessor :errno
6
+ end
7
+ end
8
+ end
9
+
10
+ if !defined?(Mysql)
11
+ module Mysql
12
+ class Error < StandardError
13
+ attr_accessor :errno
14
+ end
15
+ end
16
+ end
17
+
1
18
  class Hijacker::Database < ActiveRecord::Base
19
+ module MissingDatabaseError
20
+ MYSQL_UNKNOWN_DB_ERRNO = 1049
21
+
22
+ def self.===(e)
23
+ return true if e.is_a?(Hijacker::InvalidDatabase)
24
+ (e.is_a?(Mysql::Error) || e.is_a?(Mysql2::Error)) &&
25
+ e.errno == MYSQL_UNKNOWN_DB_ERRNO
26
+ end
27
+ end
28
+
2
29
  establish_connection(Hijacker.root_config)
3
30
 
4
31
  has_many :aliases, :class_name => "Hijacker::Alias"
@@ -12,6 +39,7 @@ class Hijacker::Database < ActiveRecord::Base
12
39
 
13
40
  alias_attribute :name, :database
14
41
 
42
+
15
43
  def sister?
16
44
  master_id.present?
17
45
  end
@@ -79,7 +107,7 @@ class Hijacker::Database < ActiveRecord::Base
79
107
  sites.each do |db|
80
108
  begin
81
109
  Hijacker.connect_to_master(db)
82
- rescue Hijacker::InvalidDatabase
110
+ rescue MissingDatabaseError
83
111
  next
84
112
  end
85
113
  yield db
@@ -87,7 +115,7 @@ class Hijacker::Database < ActiveRecord::Base
87
115
  ensure
88
116
  begin
89
117
  Hijacker.connect_to_master(original_database)
90
- rescue Hijacker::InvalidDatabase
118
+ rescue MissingDatabaseError
91
119
  end
92
120
  end
93
121
  end
@@ -118,4 +146,9 @@ class Hijacker::Database < ActiveRecord::Base
118
146
  Hijacker::Database.connection.
119
147
  execute("DELETE FROM `disabled_databases` WHERE `database_name` = '#{database}'")
120
148
  end
149
+
150
+ private
151
+ def self.catch_missing_database(&block)
152
+ block.call
153
+ end
121
154
  end
@@ -65,17 +65,33 @@ module Hijacker
65
65
  it "connects to each of the database and reconnects to the original" do
66
66
  original_db = Hijacker::Database.current
67
67
  Hijacker.should_receive(:connect).exactly(Database.all.size + 1).times
68
- Database.connect_each do |db|
69
- # noop
70
- end
68
+ Database.connect_each {}
71
69
 
72
70
  Hijacker::Database.current.should == original_db
73
71
  end
74
72
 
75
73
  it "eats invalid database errors" do
76
- Hijacker.stub!(:connect).and_raise(Hijacker::InvalidDatabase)
74
+ Hijacker.stub(:connect).and_raise(Hijacker::InvalidDatabase)
77
75
  expect { Database.connect_each {|db| } }.not_to raise_error
78
76
  end
77
+
78
+ it "eats mysql-specific errors for missing databases" do
79
+ [Mysql::Error, Mysql2::Error].each do |klass|
80
+ exception = klass.new("Unknown database 'fake'")
81
+ exception.errno = 1049
82
+ Hijacker.stub(:connect).and_raise(exception)
83
+ expect { Database.connect_each {} }.to_not raise_error
84
+ end
85
+ end
86
+
87
+ it "does not eat unrelated mysql-specific databases" do
88
+ [Mysql::Error, Mysql2::Error].each do |klass|
89
+ exception = klass.new("WAT")
90
+ exception.errno = 2000
91
+ Hijacker.stub(:connect).and_raise(exception)
92
+ expect { Database.connect_each {} }.to raise_error(klass)
93
+ end
94
+ end
79
95
  end
80
96
  end
81
97
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbhijacker
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 5
10
- version: 0.4.5
9
+ - 6
10
+ version: 0.4.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Xavier
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
195
  requirements: []
196
196
 
197
197
  rubyforge_project:
198
- rubygems_version: 1.8.24
198
+ rubygems_version: 1.8.17
199
199
  signing_key:
200
200
  specification_version: 3
201
201
  summary: One application, multiple client databases