Class: ActiveRecord::Instant

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/instant.rb,
lib/active_record/instant/version.rb

Defined Under Namespace

Classes: TemporaryTableNotExist

Constant Summary collapse

VERSION =
"0.1.0"

Instance Method Summary collapse

Constructor Details

#initialize(basename, baseclass: ActiveRecord::Base, extensions: []) ⇒ Instant

Returns a new instance of Instant.



8
9
10
11
12
13
# File 'lib/active_record/instant.rb', line 8

def initialize(basename, baseclass: ActiveRecord::Base, extensions: [])
  @basename = basename
  @baseclass = baseclass
  @extensions = extensions
  @conn = @baseclass.connection
end

Instance Method Details

#create_table!(temporary: false, force: false) ⇒ Object



27
28
29
30
31
# File 'lib/active_record/instant.rb', line 27

def create_table!(temporary: false, force: false)
  @conn.create_table(table_name(temporary: temporary), force: force) do |t|
    yield(t) if block_given?
  end
end

#drop_tables!Object



55
56
57
58
59
60
61
# File 'lib/active_record/instant.rb', line 55

def drop_tables!
  @baseclass.transaction do
    execute "DROP TABLE IF EXISTS #{@conn.quote_table_name table_name(temporary: true)}"
    execute "DROP TABLE IF EXISTS #{@conn.quote_table_name table_name}"
    execute "DROP TABLE IF EXISTS #{@conn.quote_table_name stale_table_name}"
  end
end

#model(temporary: false) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/active_record/instant.rb', line 33

def model(temporary: false)
  table_name = table_name(temporary: temporary)
  model_name = table_name.classify
  if Object.const_defined?(model_name)
    Object.const_get(model_name).tap(&:reset_column_information)
  else
    klass = Class.new(@baseclass) { |c| c.table_name = table_name }
    klass.send(:include, *@extensions) if @extensions.present?
    Object.const_set(model_name, klass)
  end
end

#promote_temporary_table!Object



45
46
47
48
49
50
51
52
53
# File 'lib/active_record/instant.rb', line 45

def promote_temporary_table!
  fail TemporaryTableNotExist unless table_exists?(temporary: true)

  @baseclass.transaction do
    execute "DROP TABLE IF EXISTS #{@conn.quote_table_name stale_table_name}"
    execute "ALTER TABLE #{model.quoted_table_name} RENAME TO #{@conn.quote_table_name stale_table_name}" if table_exists?
    execute "ALTER TABLE #{model(temporary: true).quoted_table_name} RENAME TO #{model.quoted_table_name}"
  end
end

#stale_table_nameObject



23
24
25
# File 'lib/active_record/instant.rb', line 23

def stale_table_name
  "stale_#{table_name}"
end

#table_exists?(temporary: false) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/active_record/instant.rb', line 19

def table_exists?(temporary: false)
  @conn.data_source_exists?(table_name(temporary: temporary))
end

#table_name(temporary: false) ⇒ Object



15
16
17
# File 'lib/active_record/instant.rb', line 15

def table_name(temporary: false)
  temporary ? "temporary_#{@basename}" : @basename
end