database_slave 0.1.1 → 0.1.2

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZjZhMzMxNjJjNmYzZmNmM2VkYTc0OGY1MmJjMjhkNzJhYzVlOTczZA==
4
+ ZjI2MGU0NGYzZWZmNGE4MGU2MTRmZTJiYWQ4NjMwNWQ0Mzg1OTE4Yg==
5
5
  data.tar.gz: !binary |-
6
- NzlkOGUyODcwOWVkOTQxNTYyN2VmYjcxMjY3ZTk1ZmE0NjcwN2YwZQ==
6
+ NmU3NzE0ZjM1ZjVmMTc5N2QwMzg1MGViM2QzNDQzYjFkMmQyMTdlNQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NWNkMzAzNjcwOTI5M2ViZjk0OGEwOWQyODlmMjcyNzg1YmMwZmRjZGZhMWFj
10
- MjczMjc5ZWUxNjQzYzUzY2E2MjZjODI2YTQzODkxZmU0Yzg5YWIwYjdjZTc1
11
- ZDUzYTMyYmE4MzFlZWQ4MjZiN2VmNmQ3Y2M4MGIzZjZkNDM1MTI=
9
+ ZDcwNTc3YjFlY2U3NDYyMzU0MjNkZGM1MjNlODgyMTFhMTNkNjAxODQ3ZmQ3
10
+ NTJjNWZiYzkyYjc1MDVhYTQxOGU3MDg0Mzc5NGQ4ZDFiZDQwZDk2MzEyMWQz
11
+ ZDVlNmQyNjExMGY4MmIyYWZiMGY4NWJmMDJiZjgzMTU1OTNhMWY=
12
12
  data.tar.gz: !binary |-
13
- YTgzNWZiMjdmYjFjOTZkYTM0ZmM5YmJjNWI4MDk0NWFmYjE0YTQ5NjY1NDc3
14
- M2YzMTQyZTYyZTA1ZjViZDhlMzUyMGQ0NWFkODExOTJkODMwMzllODk1Y2Fm
15
- OTc3ZjhiYzNiZjEwNmI1NTQ0ZjA1OTc0MGQxN2I1Nzc5YzRmOWM=
13
+ OGZiMzhiMzA3OWFhMDBjODFmYTJkZmYwMmE1MzZlMjExNGI1ZGVjNTEwMTEz
14
+ YThiZjJiZWY4YjA2MjRjOTA1OWY4Zjg1MTYyOTllYTllYTZjNTZkNmVhYWVl
15
+ ZDRlMWRkMmMyODBjYTVhYWNjMTc5YTNhMjc3ZTU3Yzc0NTViMjc=
data/CHANGELOG CHANGED
@@ -1,4 +1,10 @@
1
+ 0.1.2 - 2015-03-31
2
+ * support new usage:
3
+ ActiveRecord::Base.using(:slave_name) do
4
+ end
5
+ * prevent usage: ActiveRecord::Base.using(:slave_name).where()
6
+ * add error classes
1
7
  0.1.1 - 2015.03.31
2
8
  * alias using using_slave
3
- * 解决父查询中包含default_scope等子查询而导致父查询不走从库的bug
4
- * supprt pluck/count/sum etc.
9
+ * bug fixed: 父查询中包含default_scope等子查询时导致父查询不走从库
10
+ * supprt includes/pluck/count/sum etc.
data/README.md CHANGED
@@ -87,6 +87,8 @@ There are two ways to use slave database:
87
87
  end
88
88
  ```
89
89
 
90
+ Because of `alias`, you can use `using` instead of `using_slave`.
91
+
90
92
  # License
91
93
 
92
94
  See LICENSE file.
@@ -10,6 +10,32 @@ module DatabaseSlave
10
10
  delegate :using_slave, :using, to: :scoped
11
11
  end
12
12
  end
13
+
14
+ module ClassMethods
15
+ # 为了兼容老版本
16
+ # ActiveRecord::Base.using(:slave_name) do
17
+ # end
18
+ # 的写法, 这里迫不得已重写了scoped方法, 目的是:
19
+ #
20
+ # 当使用如上方式时, 将其using()方法代理到一个继承了ActiveRecord::Base的
21
+ # 空的具象类DatabaseSlave::NoneActiveRecord, 以便进而能够使用using方法,
22
+ # 因为ActiveRecord::Base是一个抽象类, 不能使用using方法.
23
+ #
24
+ # 且此种方式只能后接block, 不能用于级联式. 使用级联式会抛出异常, 具体见
25
+ # ActiveRecord::Relation#using_slave中的实现.
26
+ #
27
+ def scoped(options = nil)
28
+ if self.equal? ActiveRecord::Base
29
+ # Module.const_get(ActiveRecord::Base.subclasses.map(&:name).sort.first) || self
30
+ DatabaseSlave::NoneActiveRecord
31
+ else
32
+ super
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ class NoneActiveRecord < ActiveRecord::Base
13
39
  end
14
40
  end
15
41
 
@@ -30,7 +30,8 @@ module DatabaseSlave
30
30
  klass = self.const_set(slave_name.to_s.strip.camelize, Class.new)
31
31
 
32
32
  unless ActiveRecord::Base.respond_to?(spec.adapter_method)
33
- raise "AdapterNotFound: database configuration specifies nonexistent #{config['adapter']} adapter"
33
+ raise DatabaseSlave::AdapterNotFound,
34
+ "database configuration specifies not include #{config['adapter']} adapter"
34
35
  end
35
36
 
36
37
  ActiveRecord::Base.slave_connections << klass.name
@@ -0,0 +1,19 @@
1
+ module DatabaseSlave
2
+
3
+ # Generic Database Slave exception class.
4
+ class DatabaseSlaveError < StandardError
5
+ end
6
+
7
+ # Raised when using_slave() method used on a abstract class
8
+ # without a block given.
9
+ # For example: ActiveRecord::Base.using_slave().where() is not allowed.
10
+ class AbstractClassWithoutBlockError < DatabaseSlaveError
11
+ end
12
+
13
+ # Raised when slave connection doesn't exists.
14
+ class SlaveConnectionNotExists < DatabaseSlaveError
15
+ end
16
+
17
+ class AdapterNotFound < DatabaseSlaveError
18
+ end
19
+ end
@@ -33,13 +33,20 @@ module DatabaseSlave
33
33
  DatabaseSlave::RuntimeRegistry.current_slave_name = nil
34
34
  end
35
35
  else
36
+ # 不能使用抽象类级联式查询, 即不能使用ActiveRecord::Base.using().where()
37
+ if self.name.eql? DatabaseSlave::NoneActiveRecord.name
38
+ raise DatabaseSlave::AbstractClassWithoutBlockError,
39
+ 'a block must be given to abstract class, or you can use a specific class.'
40
+ end
41
+
36
42
  self.slave_name = "DatabaseSlave::ConnectionHandler::#{slave_name.to_s.strip.camelize}"
37
43
  relation = clone
38
44
 
39
45
  if ActiveRecord::Base.slave_connections.include? self.slave_name
40
46
  relation
41
47
  else
42
- raise "#{slave_name} is not exist."
48
+ raise DatabaseSlave::SlaveConnectionNotExists,
49
+ "#{slave_name} is not exists."
43
50
  end
44
51
  end
45
52
  else
@@ -1,3 +1,3 @@
1
1
  module DatabaseSlave
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'database_slave/base'
2
+ require 'database_slave/errors'
2
3
  require 'database_slave/configuration'
3
4
  require 'database_slave/connection_handler'
4
5
  require 'database_slave/runtime_registry'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: database_slave
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hayden Wei
@@ -26,6 +26,7 @@ files:
26
26
  - lib/database_slave/base.rb
27
27
  - lib/database_slave/configuration.rb
28
28
  - lib/database_slave/connection_handler.rb
29
+ - lib/database_slave/errors.rb
29
30
  - lib/database_slave/railtie.rb
30
31
  - lib/database_slave/relation.rb
31
32
  - lib/database_slave/runtime_registry.rb