data_fabric 1.0.2 → 1.1.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/CHANGELOG CHANGED
@@ -1 +1,14 @@
1
+ DataFabric changelog
2
+
3
+ v1.1.0 - 2008-11-22
4
+
5
+ - Cache connections so we don't have to reconnect constantly. (Justin Balthrop, Geni)
6
+ - Clean up logging API (not backwards-compatible)
7
+ - Verify wrapped connections automatically so cached mysql connections older than 8 hours
8
+ don't die due to timeout.
9
+ - Please note this version is not Rails 2.2-compatible. DataFabric 2.0 will be.
10
+
11
+
12
+ Detailed commit history:
13
+
1
14
  http://github.com/fiveruns/data_fabric/commits/master
data/Manifest CHANGED
@@ -62,7 +62,8 @@ Manifest
62
62
  Rakefile
63
63
  README.rdoc
64
64
  test/connection_test.rb
65
- test/database.yml.example
65
+ test/database.yml
66
+ test/database.yml.mysql
66
67
  test/database_test.rb
67
68
  test/shard_test.rb
68
69
  test/test_helper.rb
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'echoe'
3
3
 
4
+ #gem 'rails', '=2.0.2'
5
+
4
6
  require File.dirname(__FILE__) << "/lib/data_fabric/version"
5
7
 
6
8
  Echoe.new 'data_fabric' do |p|
@@ -8,14 +10,16 @@ Echoe.new 'data_fabric' do |p|
8
10
  p.author = "Mike Perham"
9
11
  p.email = 'mperham@gmail.com'
10
12
  p.project = 'fiveruns'
11
- p.summary = 'Sharding and replication support for ActiveRecord 2.x'
13
+ p.summary = 'Sharding and replication support for ActiveRecord 2.0 and 2.1'
12
14
  p.url = "http://github.com/fiveruns/data_fabric"
13
- p.dependencies = ['activerecord >=2.0.2']
15
+ # p.dependencies = ['activerecord >=2.0.2']
14
16
  p.development_dependencies = []
15
17
  p.rubygems_version = nil
16
18
  p.include_rakefile = true
17
19
  end
18
20
 
21
+ task :test => [:pretest]
22
+
19
23
  task :pretest do
20
24
  setup(false)
21
25
  end
@@ -33,7 +37,7 @@ def load_database_yml
33
37
  if !File.exist?(filename)
34
38
  STDERR.puts "\n*** ERROR ***:\n" <<
35
39
  "You must have a 'test/database.yml' file in order to create the test database. " <<
36
- "An example is provided in 'test/database.yml.example'.\n\n"
40
+ "An example is provided in 'test/database.yml.mysql'.\n\n"
37
41
  exit 1
38
42
  end
39
43
  YAML::load(ERB.new(IO.read(filename)).result)
@@ -42,12 +46,12 @@ end
42
46
  def setup_connection
43
47
  require 'active_record'
44
48
  ActiveRecord::Base.configurations = load_database_yml
45
- ActiveRecord::Base.establish_connection('fiveruns_city_austin_test_master')
46
49
  ActiveRecord::Base.logger = Logger.new(STDOUT)
47
- ActiveRecord::Base.logger.level = Logger::DEBUG
50
+ ActiveRecord::Base.logger.level = Logger::INFO
48
51
  end
49
52
 
50
53
  def using_connection(database_identifier, &block)
54
+ ActiveRecord::Base.establish_connection(database_identifier)
51
55
  ActiveRecord::Base.connection.instance_eval(&block)
52
56
  end
53
57
 
@@ -56,18 +60,30 @@ def setup(create = false)
56
60
 
57
61
  ActiveRecord::Base.configurations.each_pair do |identifier, config|
58
62
  using_connection(identifier) do
59
- db_name = config['database']
60
- if create
61
- execute "drop database if exists #{db_name}"
62
- execute "create database #{db_name}"
63
- end
64
- execute "use #{db_name}"
65
- execute "drop table if exists the_whole_burritos"
66
- execute "drop table if exists enchiladas"
67
- execute "create table enchiladas (id integer not null auto_increment, name varchar(30) not null, primary key(id))"
68
- execute "insert into enchiladas (id, name) values (1, '#{db_name}')"
69
- execute "create table the_whole_burritos (id integer not null auto_increment, name varchar(30) not null, primary key(id))"
70
- execute "insert into the_whole_burritos (id, name) values (1, '#{db_name}')"
63
+ send("create_#{config['adapter']}", create, config['database'])
71
64
  end
72
65
  end
73
66
  end
67
+
68
+ def create_sqlite3(create, db_name)
69
+ execute "drop table if exists the_whole_burritos"
70
+ execute "drop table if exists enchiladas"
71
+ execute "create table enchiladas (id integer not null primary key, name varchar(30) not null)"
72
+ execute "insert into enchiladas (id, name) values (1, '#{db_name}')"
73
+ execute "create table the_whole_burritos (id integer not null primary key, name varchar(30) not null)"
74
+ execute "insert into the_whole_burritos (id, name) values (1, '#{db_name}')"
75
+ end
76
+
77
+ def create_mysql(create, db_name)
78
+ if create
79
+ execute "drop database if exists #{db_name}"
80
+ execute "create database #{db_name}"
81
+ end
82
+ execute "use #{db_name}"
83
+ execute "drop table if exists the_whole_burritos"
84
+ execute "drop table if exists enchiladas"
85
+ execute "create table enchiladas (id integer not null auto_increment, name varchar(30) not null, primary key(id))"
86
+ execute "insert into enchiladas (id, name) values (1, '#{db_name}')"
87
+ execute "create table the_whole_burritos (id integer not null auto_increment, name varchar(30) not null, primary key(id))"
88
+ execute "insert into the_whole_burritos (id, name) values (1, '#{db_name}')"
89
+ end
data/TESTING.rdoc CHANGED
@@ -4,10 +4,10 @@ data_fabric has two layers of tests: unit tests and integration tests.
4
4
  == Running the Unit Tests
5
5
 
6
6
  The unit tests test both with and without an actual database. test/database_test.rb
7
- tests against a MySQL database. The other unit tests mock AR so no actual database is
8
- required. You must customize test/database.yml to point to your MySQL database.
9
- "rake pretest" will set up MySQL to run the tests but you will need to customize
10
- the connection settings in the Rakefile pretest task.
7
+ tests against a database. The other unit tests mock AR so no actual database is
8
+ required. You can use the standard test/database.yml which tests against SQLite3
9
+ or customize the provided test/database.yml.mysql. The "rake create_db" task will
10
+ set up the necessary databases and tables.
11
11
 
12
12
 
13
13
  == Running the Integration Tests
@@ -27,6 +27,4 @@ then be able to run the example application's tests.
27
27
 
28
28
  == Submitting Bugs
29
29
 
30
- If you think you've found a problem with data_fabric, please write a unit or integration test
31
- which reproduces the problem. This should make tracking down and fixing the bug relatively
32
- easy and provides a regression test for future releases.
30
+ If you think you've found a problem with data_fabric, contact me at mperham AT gmail.com.
data/data_fabric.gemspec CHANGED
@@ -1,146 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
1
2
 
2
- # Gem::Specification for Data_fabric-1.0.2
3
- # Originally generated by Echoe
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{data_fabric}
5
+ s.version = "1.1.0"
4
6
 
5
- --- !ruby/object:Gem::Specification
6
- name: data_fabric
7
- version: !ruby/object:Gem::Version
8
- version: 1.0.2
9
- platform: ruby
10
- authors:
11
- - Mike Perham
12
- autorequire:
13
- bindir: bin
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Mike Perham"]
9
+ s.date = %q{2008-11-22}
10
+ s.description = %q{Sharding and replication support for ActiveRecord 2.0 and 2.1}
11
+ s.email = %q{mperham@gmail.com}
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/data_fabric/version.rb", "lib/data_fabric.rb", "README.rdoc"]
13
+ s.files = ["CHANGELOG", "example/app/controllers/accounts_controller.rb", "example/app/controllers/application.rb", "example/app/controllers/figments_controller.rb", "example/app/helpers/accounts_helper.rb", "example/app/helpers/application_helper.rb", "example/app/helpers/figments_helper.rb", "example/app/models/account.rb", "example/app/models/figment.rb", "example/app/views/accounts/index.html.erb", "example/app/views/layouts/application.html.erb", "example/config/boot.rb", "example/config/database.yml", "example/config/environment.rb", "example/config/environments/development.rb", "example/config/environments/production.rb", "example/config/environments/test.rb", "example/config/initializers/inflections.rb", "example/config/initializers/mime_types.rb", "example/config/initializers/new_rails_defaults.rb", "example/config/routes.rb", "example/db/migrate/20080702154628_create_accounts.rb", "example/db/migrate/20080702154820_create_figments.rb", "example/db/schema.rb", "example/public/404.html", "example/public/422.html", "example/public/500.html", "example/public/dispatch.cgi", "example/public/dispatch.fcgi", "example/public/dispatch.rb", "example/public/favicon.ico", "example/public/images/rails.png", "example/public/javascripts/application.js", "example/public/javascripts/controls.js", "example/public/javascripts/dragdrop.js", "example/public/javascripts/effects.js", "example/public/javascripts/prototype.js", "example/public/robots.txt", "example/Rakefile", "example/script/about", "example/script/console", "example/script/dbconsole", "example/script/destroy", "example/script/generate", "example/script/performance/benchmarker", "example/script/performance/profiler", "example/script/performance/request", "example/script/plugin", "example/script/process/inspector", "example/script/process/reaper", "example/script/process/spawner", "example/script/runner", "example/script/server", "example/test/fixtures/accounts.yml", "example/test/functional/accounts_controller_test.rb", "example/test/integration/account_figments_test.rb", "example/test/test_helper.rb", "init.rb", "lib/data_fabric/version.rb", "lib/data_fabric.rb", "Manifest", "Rakefile", "README.rdoc", "test/connection_test.rb", "test/database.yml", "test/database.yml.mysql", "test/database_test.rb", "test/shard_test.rb", "test/test_helper.rb", "test/thread_test.rb", "TESTING.rdoc", "data_fabric.gemspec"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://github.com/fiveruns/data_fabric}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Data_fabric", "--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{fiveruns}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{Sharding and replication support for ActiveRecord 2.0 and 2.1}
21
+ s.test_files = ["test/connection_test.rb", "test/database_test.rb", "test/shard_test.rb", "test/test_helper.rb", "test/thread_test.rb"]
14
22
 
15
- date: 2008-09-30 00:00:00 -05:00
16
- default_executable:
17
- dependencies:
18
- - !ruby/object:Gem::Dependency
19
- name: activerecord
20
- type: :runtime
21
- version_requirement:
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 2.0.2
27
- version:
28
- description: Sharding and replication support for ActiveRecord 2.x
29
- email: mperham@gmail.com
30
- executables: []
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
31
26
 
32
- extensions: []
33
-
34
- extra_rdoc_files:
35
- - CHANGELOG
36
- - lib/data_fabric/version.rb
37
- - lib/data_fabric.rb
38
- - README.rdoc
39
- files:
40
- - CHANGELOG
41
- - example/app/controllers/accounts_controller.rb
42
- - example/app/controllers/application.rb
43
- - example/app/controllers/figments_controller.rb
44
- - example/app/helpers/accounts_helper.rb
45
- - example/app/helpers/application_helper.rb
46
- - example/app/helpers/figments_helper.rb
47
- - example/app/models/account.rb
48
- - example/app/models/figment.rb
49
- - example/app/views/accounts/index.html.erb
50
- - example/app/views/layouts/application.html.erb
51
- - example/config/boot.rb
52
- - example/config/database.yml
53
- - example/config/environment.rb
54
- - example/config/environments/development.rb
55
- - example/config/environments/production.rb
56
- - example/config/environments/test.rb
57
- - example/config/initializers/inflections.rb
58
- - example/config/initializers/mime_types.rb
59
- - example/config/initializers/new_rails_defaults.rb
60
- - example/config/routes.rb
61
- - example/db/migrate/20080702154628_create_accounts.rb
62
- - example/db/migrate/20080702154820_create_figments.rb
63
- - example/db/schema.rb
64
- - example/public/404.html
65
- - example/public/422.html
66
- - example/public/500.html
67
- - example/public/dispatch.cgi
68
- - example/public/dispatch.fcgi
69
- - example/public/dispatch.rb
70
- - example/public/favicon.ico
71
- - example/public/images/rails.png
72
- - example/public/javascripts/application.js
73
- - example/public/javascripts/controls.js
74
- - example/public/javascripts/dragdrop.js
75
- - example/public/javascripts/effects.js
76
- - example/public/javascripts/prototype.js
77
- - example/public/robots.txt
78
- - example/Rakefile
79
- - example/script/about
80
- - example/script/console
81
- - example/script/dbconsole
82
- - example/script/destroy
83
- - example/script/generate
84
- - example/script/performance/benchmarker
85
- - example/script/performance/profiler
86
- - example/script/performance/request
87
- - example/script/plugin
88
- - example/script/process/inspector
89
- - example/script/process/reaper
90
- - example/script/process/spawner
91
- - example/script/runner
92
- - example/script/server
93
- - example/test/fixtures/accounts.yml
94
- - example/test/functional/accounts_controller_test.rb
95
- - example/test/integration/account_figments_test.rb
96
- - example/test/test_helper.rb
97
- - init.rb
98
- - lib/data_fabric/version.rb
99
- - lib/data_fabric.rb
100
- - Manifest
101
- - Rakefile
102
- - README.rdoc
103
- - test/connection_test.rb
104
- - test/database.yml.example
105
- - test/database_test.rb
106
- - test/shard_test.rb
107
- - test/test_helper.rb
108
- - test/thread_test.rb
109
- - TESTING.rdoc
110
- - data_fabric.gemspec
111
- has_rdoc: true
112
- homepage: http://github.com/fiveruns/data_fabric
113
- post_install_message:
114
- rdoc_options:
115
- - --line-numbers
116
- - --inline-source
117
- - --title
118
- - Data_fabric
119
- - --main
120
- - README.rdoc
121
- require_paths:
122
- - lib
123
- required_ruby_version: !ruby/object:Gem::Requirement
124
- requirements:
125
- - - ">="
126
- - !ruby/object:Gem::Version
127
- version: "0"
128
- version:
129
- required_rubygems_version: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- version: "0"
134
- version:
135
- requirements: []
136
-
137
- rubyforge_project: fiveruns
138
- rubygems_version: 1.2.0
139
- specification_version: 2
140
- summary: Sharding and replication support for ActiveRecord 2.x
141
- test_files:
142
- - test/connection_test.rb
143
- - test/database_test.rb
144
- - test/shard_test.rb
145
- - test/test_helper.rb
146
- - test/thread_test.rb
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ else
29
+ end
30
+ else
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  module DataFabric
2
2
  module Version
3
- STRING = "1.0.2"
3
+ STRING = "1.1.0"
4
4
  end
5
5
  end
data/lib/data_fabric.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'active_record'
2
2
  require 'active_record/version'
3
+ require 'data_fabric/version'
3
4
 
4
5
  # DataFabric adds a new level of flexibility to ActiveRecord connection handling.
5
6
  # You need to describe the topology for your database infrastructure in your model(s). As with ActiveRecord normally, different models can use different topologies.
@@ -36,27 +37,17 @@ require 'active_record/version'
36
37
  # end
37
38
  # end
38
39
  module DataFabric
39
-
40
- def self.logger
41
- ActiveRecord::Base.logger
42
- end
40
+
41
+ # Set this logger to log DataFabric operations.
42
+ # The logger should quack like a standard Ruby Logger.
43
+ mattr_accessor :logger
43
44
 
44
45
  def self.init
45
- logger.info "Loading data_fabric #{DataFabric::Version::STRING} with ActiveRecord #{ActiveRecord::VERSION::STRING}"
46
+ logger = ActiveRecord::Base.logger unless logger
47
+ log { "Loading data_fabric #{DataFabric::Version::STRING} with ActiveRecord #{ActiveRecord::VERSION::STRING}" }
46
48
  ActiveRecord::Base.send(:include, self)
47
49
  end
48
50
 
49
- mattr_writer :debugging
50
- @@debugging = false
51
-
52
- def self.debugging?
53
- if @@debugging.nil? && logger
54
- logger.debug?
55
- else
56
- !!@@debugging
57
- end
58
- end
59
-
60
51
  def self.activate_shard(shards, &block)
61
52
  ensure_setup
62
53
 
@@ -93,6 +84,11 @@ module DataFabric
93
84
  end
94
85
  end
95
86
 
87
+ def self.shard_active_for?(group)
88
+ return true unless group
89
+ Thread.current[:shards] and Thread.current[:shards][group.to_s]
90
+ end
91
+
96
92
  def self.included(model)
97
93
  # Wire up ActiveRecord::Base
98
94
  model.extend ClassMethods
@@ -101,7 +97,11 @@ module DataFabric
101
97
  def self.ensure_setup
102
98
  Thread.current[:shards] = {} unless Thread.current[:shards]
103
99
  end
104
-
100
+
101
+ def self.log(level=Logger::INFO, &block)
102
+ logger && logger.add(level, &block)
103
+ end
104
+
105
105
  # Class methods injected into ActiveRecord::Base
106
106
  module ClassMethods
107
107
  def data_fabric(options)
@@ -109,9 +109,8 @@ module DataFabric
109
109
  ActiveRecord::Base.active_connections[name] = proxy
110
110
 
111
111
  raise ArgumentError, "data_fabric does not support ActiveRecord's allow_concurrency = true" if allow_concurrency
112
- DataFabric.logger.info "Creating data_fabric proxy for class #{name}"
112
+ DataFabric.log { "Creating data_fabric proxy for class #{name}" }
113
113
  end
114
- alias :connection_topology :data_fabric # legacy
115
114
  end
116
115
 
117
116
  class StringProxy
@@ -126,109 +125,97 @@ module DataFabric
126
125
  class ConnectionProxy
127
126
  def initialize(model_class, options)
128
127
  @model_class = model_class
129
- @replicated = options[:replicated]
128
+ @replicated = options[:replicated]
130
129
  @shard_group = options[:shard_by]
131
- @prefix = options[:prefix]
132
- @current_role = 'slave' if @replicated
133
- @current_connection_name_builder = connection_name_builder
134
- @cached_connection = nil
135
- @current_connection_name = nil
136
- @role_changed = false
130
+ @prefix = options[:prefix]
131
+ @role = 'slave' if @replicated
137
132
 
138
133
  @model_class.send :include, ActiveRecordConnectionMethods if @replicated
139
134
  end
140
-
135
+
141
136
  delegate :insert, :update, :delete, :create_table, :rename_table, :drop_table, :add_column, :remove_column,
142
137
  :change_column, :change_column_default, :rename_column, :add_index, :remove_index, :initialize_schema_information,
143
- :dump_schema_information, :execute, :to => :master
138
+ :dump_schema_information, :execute, :execute_ignore_duplicate, :to => :master
144
139
 
140
+ def cache(&block)
141
+ connection.cache(&block)
142
+ end
143
+
145
144
  def transaction(start_db_transaction = true, &block)
146
- with_master { raw_connection.transaction(start_db_transaction, &block) }
145
+ with_master { connection.transaction(start_db_transaction, &block) }
147
146
  end
148
147
 
149
148
  def method_missing(method, *args, &block)
150
- unless @cached_connection and !@role_changed
151
- raw_connection
152
- @role_changed = false
153
- end
154
- if DataFabric.debugging?
155
- logger.debug("Calling #{method} on #{@cached_connection}")
156
- end
157
- raw_connection.send(method, *args, &block)
149
+ DataFabric.log(Logger::DEBUG) { "Calling #{method} on #{connection}" }
150
+ connection.send(method, *args, &block)
158
151
  end
159
152
 
160
153
  def connection_name
161
- @current_connection_name_builder.join('_')
154
+ connection_name_builder.join('_')
162
155
  end
163
156
 
164
157
  def disconnect!
165
- @cached_connection.disconnect! if @cached_connection
166
- @cached_connection = nil
158
+ if connected?
159
+ connection.disconnect!
160
+ cached_connections[connection_name] = nil
161
+ end
167
162
  end
168
163
 
169
164
  def verify!(arg)
170
- @cached_connection.verify!(0) if @cached_connection
165
+ connection.verify!(arg) if connected?
171
166
  end
172
167
 
173
168
  def with_master
169
+ # Allow nesting of with_master.
170
+ old_role = @role
174
171
  set_role('master')
175
172
  yield
176
173
  ensure
177
- set_role('slave')
174
+ set_role(old_role)
175
+ end
176
+
177
+ private
178
+
179
+ def cached_connections
180
+ @cached_connections ||= {}
178
181
  end
179
182
 
180
- private
181
-
182
183
  def connection_name_builder
183
- clauses = []
184
- clauses << @prefix if @prefix
185
- clauses << @shard_group if @shard_group
186
- clauses << StringProxy.new { DataFabric.active_shard(@shard_group) } if @shard_group
187
- clauses << RAILS_ENV
188
- clauses << StringProxy.new { @current_role } if @replicated
189
- clauses
184
+ @connection_name_builder ||= begin
185
+ clauses = []
186
+ clauses << @prefix if @prefix
187
+ clauses << @shard_group if @shard_group
188
+ clauses << StringProxy.new { DataFabric.active_shard(@shard_group) } if @shard_group
189
+ clauses << RAILS_ENV
190
+ clauses << StringProxy.new { @role } if @replicated
191
+ clauses
192
+ end
190
193
  end
191
194
 
192
- def raw_connection
193
- conn_name = connection_name
194
- unless already_connected_to? conn_name
195
- @cached_connection = begin
196
- config = ActiveRecord::Base.configurations[conn_name]
197
- raise ArgumentError, "Unknown database config: #{conn_name}, have #{ActiveRecord::Base.configurations.inspect}" unless config
198
- @model_class.establish_connection config
199
- if DataFabric.debugging?
200
- logger.debug "Switching from #{@current_connection_name || "(none)"} to #{conn_name}"
201
- end
202
- @current_connection_name = conn_name
203
- conn = @model_class.connection
204
- conn.verify! 0
205
- conn
206
- end
195
+ def connection
196
+ name = connection_name
197
+ if not connected?
198
+ config = ActiveRecord::Base.configurations[name]
199
+ raise ArgumentError, "Unknown database config: #{name}, have #{ActiveRecord::Base.configurations.inspect}" unless config
200
+ DataFabric.log { "Connecting to #{name}" }
201
+ @model_class.establish_connection(config)
202
+ cached_connections[name] = @model_class.connection
207
203
  @model_class.active_connections[@model_class.name] = self
208
204
  end
209
- @cached_connection
205
+ cached_connections[name].verify!(3600)
206
+ cached_connections[name]
210
207
  end
211
-
212
- def already_connected_to?(conn_name)
213
- conn_name == @current_connection_name and @cached_connection
208
+
209
+ def connected?
210
+ DataFabric.shard_active_for?(@shard_group) and cached_connections[connection_name]
214
211
  end
215
-
212
+
216
213
  def set_role(role)
217
- if @replicated and @current_role != role
218
- @current_role = role
219
- @role_changed = true
220
- end
214
+ @role = role if @replicated
221
215
  end
222
216
 
223
217
  def master
224
- set_role('master')
225
- return raw_connection
226
- ensure
227
- set_role('slave')
228
- end
229
-
230
- def logger
231
- DataFabric.logger
218
+ with_master { return connection }
232
219
  end
233
220
  end
234
221
 
@@ -2,15 +2,15 @@ require File.join(File.dirname(__FILE__), 'test_helper')
2
2
  require 'flexmock/test_unit'
3
3
 
4
4
  class PrefixModel < ActiveRecord::Base
5
- connection_topology :prefix => 'prefix'
5
+ data_fabric :prefix => 'prefix'
6
6
  end
7
7
 
8
8
  class ShardModel < ActiveRecord::Base
9
- connection_topology :shard_by => :city
9
+ data_fabric :shard_by => :city
10
10
  end
11
11
 
12
12
  class TheWholeEnchilada < ActiveRecord::Base
13
- connection_topology :prefix => 'fiveruns', :replicated => true, :shard_by => :city
13
+ data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
14
14
  end
15
15
 
16
16
  class AdapterMock < ActiveRecord::ConnectionAdapters::AbstractAdapter
@@ -43,7 +43,7 @@ end
43
43
  class ConnectionTest < Test::Unit::TestCase
44
44
 
45
45
  def test_should_install_into_arbase
46
- assert PrefixModel.methods.include?('connection_topology')
46
+ assert PrefixModel.methods.include?('data_fabric')
47
47
  end
48
48
 
49
49
  def test_prefix_connection_name
data/test/database.yml ADDED
@@ -0,0 +1,24 @@
1
+ # The unit tests make use of the data populated in these databases.
2
+ #
3
+ # Notes:
4
+ # - The database identifiers (e.g. "fiveruns_city_austin_test_master") MUST NOT
5
+ # be changed! Everything else may be changed.
6
+ # - The user defined for "fiveruns_city_austin_test_master" MUST have the
7
+ # privilege to create and drop databases and tables.
8
+
9
+
10
+ fiveruns_city_austin_test_master:
11
+ adapter: sqlite3
12
+ database: test/vr_austin_master.db
13
+
14
+ fiveruns_city_austin_test_slave:
15
+ adapter: sqlite3
16
+ database: test/vr_austin_slave.db
17
+
18
+ fiveruns_city_dallas_test_master:
19
+ adapter: sqlite3
20
+ database: test/vr_dallas_master.db
21
+
22
+ fiveruns_city_dallas_test_slave:
23
+ adapter: sqlite3
24
+ database: test/vr_dallas_slave.db
File without changes
@@ -3,7 +3,7 @@ require 'flexmock/test_unit'
3
3
  require 'erb'
4
4
 
5
5
  class TheWholeBurrito < ActiveRecord::Base
6
- connection_topology :prefix => 'fiveruns', :replicated => true, :shard_by => :city
6
+ data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
7
7
  end
8
8
 
9
9
  class DatabaseTest < Test::Unit::TestCase
@@ -18,11 +18,11 @@ class DatabaseTest < Test::Unit::TestCase
18
18
 
19
19
  # Should use the slave
20
20
  burrito = TheWholeBurrito.find(1)
21
- assert_equal 'vr_dallas_slave', burrito.name
21
+ assert_match 'vr_dallas_slave', burrito.name
22
22
 
23
23
  # Should use the master
24
24
  burrito.reload
25
- assert_equal 'vr_dallas_master', burrito.name
25
+ assert_match 'vr_dallas_master', burrito.name
26
26
 
27
27
  # ...but immediately set it back to default to the slave
28
28
  assert_equal 'fiveruns_city_dallas_test_slave', TheWholeBurrito.connection.connection_name
@@ -30,7 +30,7 @@ class DatabaseTest < Test::Unit::TestCase
30
30
  # Should use the master
31
31
  TheWholeBurrito.transaction do
32
32
  burrito = TheWholeBurrito.find(1)
33
- assert_equal 'vr_dallas_master', burrito.name
33
+ assert_match 'vr_dallas_master', burrito.name
34
34
  burrito.save!
35
35
  end
36
36
  end
data/test/thread_test.rb CHANGED
@@ -11,7 +11,7 @@ class ThreadTest < Test::Unit::TestCase
11
11
  class ThreadedEnchilada < ActiveRecord::Base
12
12
  self.allow_concurrency = true
13
13
  set_table_name :enchiladas
14
- connection_topology :prefix => 'fiveruns', :replicated => true, :shard_by => :city
14
+ data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
15
15
  end
16
16
  }
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_fabric
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
@@ -9,20 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-30 00:00:00 -05:00
12
+ date: 2008-11-22 00:00:00 -06:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activerecord
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 2.0.2
24
- version:
25
- description: Sharding and replication support for ActiveRecord 2.x
14
+ dependencies: []
15
+
16
+ description: Sharding and replication support for ActiveRecord 2.0 and 2.1
26
17
  email: mperham@gmail.com
27
18
  executables: []
28
19
 
@@ -98,7 +89,8 @@ files:
98
89
  - Rakefile
99
90
  - README.rdoc
100
91
  - test/connection_test.rb
101
- - test/database.yml.example
92
+ - test/database.yml
93
+ - test/database.yml.mysql
102
94
  - test/database_test.rb
103
95
  - test/shard_test.rb
104
96
  - test/test_helper.rb
@@ -132,10 +124,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
124
  requirements: []
133
125
 
134
126
  rubyforge_project: fiveruns
135
- rubygems_version: 1.2.0
127
+ rubygems_version: 1.3.1
136
128
  signing_key:
137
129
  specification_version: 2
138
- summary: Sharding and replication support for ActiveRecord 2.x
130
+ summary: Sharding and replication support for ActiveRecord 2.0 and 2.1
139
131
  test_files:
140
132
  - test/connection_test.rb
141
133
  - test/database_test.rb