Module: Octopus::Model::ClassMethods

Includes:
SharedMethods
Defined in:
lib/octopus/model.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SharedMethods

#using

Class Method Details

.extended(base) ⇒ Object



68
69
70
71
72
73
# File 'lib/octopus/model.rb', line 68

def self.extended(base)
  base.class_attribute(:replicated)
  base.class_attribute(:sharded)
  base.class_attribute(:allowed_shards)
  base.hijack_methods
end

Instance Method Details

#allow_shard(*shards) ⇒ Object



83
84
85
86
# File 'lib/octopus/model.rb', line 83

def allow_shard(*shards)
  self.allowed_shards ||= []
  self.allowed_shards += shards
end

#allowed_shard?(shard) ⇒ Boolean

Returns:

  • (Boolean)


133
134
135
136
137
138
139
# File 'lib/octopus/model.rb', line 133

def allowed_shard?(shard)
  if custom_octopus_connection
    allowed_shards && shard && allowed_shards.include?(shard)
  else
    true
  end
end

#clear_active_connections_with_octopus!Object



158
159
160
161
162
163
164
# File 'lib/octopus/model.rb', line 158

def clear_active_connections_with_octopus!
  if should_use_normal_connection?
    clear_active_connections_without_octopus!
  else
    connection_proxy.clear_active_connections!
  end
end

#clear_all_connections_with_octopus!Object



166
167
168
169
170
171
172
# File 'lib/octopus/model.rb', line 166

def clear_all_connections_with_octopus!
  if should_use_normal_connection?
    clear_all_connections_without_octopus!
  else
    connection_proxy.clear_all_connections!
  end
end

#connected_with_octopus?Boolean

Returns:

  • (Boolean)


174
175
176
177
178
179
180
# File 'lib/octopus/model.rb', line 174

def connected_with_octopus?
  if should_use_normal_connection?
    connected_without_octopus?
  else
    connection_proxy.connected?
  end
end

#connection_pool_with_octopusObject



150
151
152
153
154
155
156
# File 'lib/octopus/model.rb', line 150

def connection_pool_with_octopus
  if should_use_normal_connection?
    connection_pool_without_octopus
  else
    connection_proxy.connection_pool
  end
end

#connection_proxyObject



119
120
121
122
123
# File 'lib/octopus/model.rb', line 119

def connection_proxy
  ActiveRecord::Base.class_variable_defined?(:@@connection_proxy) &&
    ActiveRecord::Base.class_variable_get(:@@connection_proxy) ||
    ActiveRecord::Base.class_variable_set(:@@connection_proxy, Octopus::Proxy.new)
end

#connection_with_octopusObject



141
142
143
144
145
146
147
148
# File 'lib/octopus/model.rb', line 141

def connection_with_octopus
  if should_use_normal_connection?
    connection_without_octopus
  else
    connection_proxy.current_model = self
    connection_proxy
  end
end

#hijack_methodsObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/octopus/model.rb', line 88

def hijack_methods
  around_save :run_on_shard, :unless => lambda { self.class.custom_octopus_connection }
  after_initialize :set_current_shard

  class_attribute :custom_octopus_connection

  class << self
    attr_accessor :custom_octopus_table_name

    alias_method :connection_without_octopus, :connection
    alias_method :connection, :connection_with_octopus

    alias_method :connection_pool_without_octopus, :connection_pool
    alias_method :connection_pool, :connection_pool_with_octopus

    alias_method :clear_all_connections_without_octopus!, :clear_all_connections!
    alias_method :clear_all_connections!, :clear_all_connections_with_octopus!

    alias_method :clear_active_connections_without_octopus!, :clear_active_connections!
    alias_method :clear_active_connections!, :clear_active_connections_with_octopus!

    alias_method :connected_without_octopus?, :connected?
    alias_method :connected?, :connected_with_octopus?

    def table_name=(value = nil)
      self.custom_octopus_table_name = true
      super
    end
  end
end

#octopus_establish_connection(spec = ) ⇒ Object



187
188
189
190
# File 'lib/octopus/model.rb', line 187

def octopus_establish_connection(spec = ENV['DATABASE_URL'])
  self.custom_octopus_connection = true if spec
  establish_connection(spec)
end

#octopus_set_table_name(value = nil) ⇒ Object



192
193
194
195
# File 'lib/octopus/model.rb', line 192

def octopus_set_table_name(value = nil)
  ActiveSupport::Deprecation.warn 'Calling `octopus_set_table_name` is deprecated and will be removed in Octopus 1.0.', caller
  set_table_name(value)
end

#replicated_modelObject



75
76
77
# File 'lib/octopus/model.rb', line 75

def replicated_model
  self.replicated = true
end

#set_table_name_with_octopus(value = nil, &block) ⇒ Object



182
183
184
185
# File 'lib/octopus/model.rb', line 182

def set_table_name_with_octopus(value = nil, &block)
  self.custom_octopus_table_name = true
  set_table_name_without_octopus(value, &block)
end

#sharded_modelObject



79
80
81
# File 'lib/octopus/model.rb', line 79

def sharded_model
  self.sharded = true
end

#should_use_normal_connection?Boolean

Returns:

  • (Boolean)


125
126
127
128
129
130
131
# File 'lib/octopus/model.rb', line 125

def should_use_normal_connection?
  if !Octopus.enabled?
    true
  elsif custom_octopus_connection
    !connection_proxy.block || !allowed_shard?(connection_proxy.current_shard)
  end
end