Class: Apartment::Adapters::AbstractAdapter

Inherits:
Object
  • Object
show all
Includes:
ActiveSupport::Callbacks
Defined in:
lib/apartment/adapters/abstract_adapter.rb

Defined Under Namespace

Classes: SeparateDbConnectionHandler

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ AbstractAdapter

@constructor

@param {Hash} config Database config


12
13
14
# File 'lib/apartment/adapters/abstract_adapter.rb', line 12

def initialize(config)
  @config = config
end

Instance Attribute Details

#default_tenantObject Also known as: default_schema

Return the original public tenant

@return {String} default tenant name


45
46
47
# File 'lib/apartment/adapters/abstract_adapter.rb', line 45

def default_tenant
  @default_tenant || Apartment.default_tenant
end

Instance Method Details

#create(tenant) ⇒ Object

Create a new tenant, import schema, seed if appropriate

@param {String} tenant Tenant name


20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/apartment/adapters/abstract_adapter.rb', line 20

def create(tenant)
  run_callbacks :create do
    create_tenant(tenant)

    switch(tenant) do
      import_database_schema

      # Seed data if appropriate
      seed_data if Apartment.seed_after_create

      yield if block_given?
    end
  end
end

#currentObject

Note alias_method here doesn’t work with inheritence apparently ??



37
38
39
# File 'lib/apartment/adapters/abstract_adapter.rb', line 37

def current
  Apartment.connection.current_database
end

#drop(tenant) ⇒ Object

Drop the tenant

@param {String} tenant name


54
55
56
57
58
59
60
61
# File 'lib/apartment/adapters/abstract_adapter.rb', line 54

def drop(tenant)
  with_neutral_connection(tenant) do |conn|
    drop_command(conn, tenant)
  end

rescue *rescuable_exceptions => exception
  raise_drop_tenant_error!(tenant, exception)
end

#each(tenants = Apartment.tenant_names) ⇒ Object

Iterate over all tenants, switch to tenant and yield tenant name



94
95
96
97
98
# File 'lib/apartment/adapters/abstract_adapter.rb', line 94

def each(tenants = Apartment.tenant_names)
  tenants.each do |tenant|
    switch(tenant){ yield tenant }
  end
end

#environmentify(tenant) ⇒ Object

Prepend the environment if configured and the environment isn’t already there

@param {String} tenant Database name
@return {String} tenant name with Rails environment *optionally* prepended


128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/apartment/adapters/abstract_adapter.rb', line 128

def environmentify(tenant)
  unless tenant.include?(Rails.env)
    if Apartment.prepend_environment
      "#{Rails.env}_#{tenant}"
    elsif Apartment.append_environment
      "#{tenant}_#{Rails.env}"
    else
      tenant
    end
  else
    tenant
  end
end

#process_excluded_modelsObject

Establish a new connection for each specific excluded model



102
103
104
105
106
107
# File 'lib/apartment/adapters/abstract_adapter.rb', line 102

def process_excluded_models
  # All other models will shared a connection (at Apartment.connection_class) and we can modify at will
  Apartment.excluded_models.each do |excluded_model|
    process_excluded_model(excluded_model)
  end
end

#resetObject

Reset the tenant connection to the default



111
112
113
# File 'lib/apartment/adapters/abstract_adapter.rb', line 111

def reset
  Apartment.establish_connection @config
end

#seed_dataObject Also known as: seed

Load the rails seed file into the db



117
118
119
120
# File 'lib/apartment/adapters/abstract_adapter.rb', line 117

def seed_data
  # Don't log the output of seeding the db
  silence_warnings{ load_or_raise(Apartment.seed_data_file) } if Apartment.seed_data_file
end

#switch(tenant = nil) ⇒ Object

Connect to tenant, do your biz, switch back to previous tenant

@param {String?} tenant to connect to


81
82
83
84
85
86
87
88
89
90
# File 'lib/apartment/adapters/abstract_adapter.rb', line 81

def switch(tenant = nil)
  begin
    previous_tenant = current
    switch!(tenant)
    yield

  ensure
    switch!(previous_tenant) rescue reset
  end
end

#switch!(tenant = nil) ⇒ Object

Switch to a new tenant

@param {String} tenant name


67
68
69
70
71
72
73
74
75
# File 'lib/apartment/adapters/abstract_adapter.rb', line 67

def switch!(tenant = nil)
  run_callbacks :switch do
    return reset if tenant.nil?

    connect_to_new(tenant).tap do
      Apartment.connection.clear_query_cache
    end
  end
end