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



87
88
89
90
91
92
# File 'lib/octopus/model.rb', line 87

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



102
103
104
105
# File 'lib/octopus/model.rb', line 102

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

#allowed_shard?(shard) ⇒ Boolean

Returns:

  • (Boolean)


153
154
155
156
157
158
159
# File 'lib/octopus/model.rb', line 153

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

#clear_active_connections_with_octopus!Object



178
179
180
181
182
183
184
# File 'lib/octopus/model.rb', line 178

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



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

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)


194
195
196
197
198
199
200
# File 'lib/octopus/model.rb', line 194

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

#connection_pool_with_octopusObject



170
171
172
173
174
175
176
# File 'lib/octopus/model.rb', line 170

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

#connection_proxyObject



139
140
141
142
143
# File 'lib/octopus/model.rb', line 139

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



161
162
163
164
165
166
167
168
# File 'lib/octopus/model.rb', line 161

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

#hijack_methodsObject



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/octopus/model.rb', line 107

def hijack_methods
  after_initialize :set_current_shard

  around_save :run_on_shard, :unless => lambda { self.class.custom_octopus_connection }

  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



207
208
209
210
# File 'lib/octopus/model.rb', line 207

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



212
213
214
215
# File 'lib/octopus/model.rb', line 212

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



94
95
96
# File 'lib/octopus/model.rb', line 94

def replicated_model
  self.replicated = true
end

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



202
203
204
205
# File 'lib/octopus/model.rb', line 202

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



98
99
100
# File 'lib/octopus/model.rb', line 98

def sharded_model
  self.sharded = true
end

#should_use_normal_connection?Boolean

Returns:

  • (Boolean)


145
146
147
148
149
150
151
# File 'lib/octopus/model.rb', line 145

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