module RailsSync::Table

Attributes

dest_table_name[R]

Public Instance Methods

create_temp_table() click to toggle source
# File lib/rails_sync/table.rb, line 89
def create_temp_table
  unless @dest_columns.include?(dest_primary_key)
    @dest_columns.unshift dest_primary_key
  end

  sql = "CREATE TABLE `#{@dest_table_name}` (\n"
  sql << dest_sql_table(only: @dest_columns)
  sql << ")"
  sql << "ENGINE=FEDERATED\n"
  sql << "CONNECTION='#{adapter.url}/#{@dest_table}';"

  connection.execute(sql)
end
dest_columns() click to toggle source
# File lib/rails_sync/table.rb, line 19
def dest_columns
  adapter.connection.columns(@dest_table)
end
dest_indexes() click to toggle source
# File lib/rails_sync/table.rb, line 23
def dest_indexes
  results = adapter.connection.indexes(@dest_table)
  results = results.map { |result| { result.name => result.columns } }
  results.to_combined_hash  # rails_com core ext
  results
end
dest_primary_key() click to toggle source
# File lib/rails_sync/table.rb, line 30
def dest_primary_key
  adapter.connection.primary_key(@dest_table)
end
dest_sql_table(only: [], except: [], pure: true) click to toggle source
# File lib/rails_sync/table.rb, line 34
def dest_sql_table(only: [], except: [], pure: true)
  if only.size > 0
    _columns = dest_columns.select { |column| only.include?(column.name) }
  else
    _columns = dest_columns.reject { |column| except.include?(column.name) }
  end

  if pure
    sql = ""
  else
    sql = "CREATE TABLE `#{@dest_table}` (\n"
  end

  _columns.each do |column|
    sql << "  `#{column.name}` #{column.sql_type}"
    sql << " COLLATE #{column.collation}" if column.collation.present?
    sql << " NOT NULL" if column.null.is_a?(FalseClass)
    if column.default
      sql << " DEFAULT '#{column.default}',\n"
    elsif column.default.nil? && column.null
      sql << " DEFAULT NULL,\n"
    else
      sql << ",\n"
    end
  end

  sql << "  PRIMARY KEY (`#{dest_primary_key}`)"

  _indexes = dest_indexes.reject { |_, value| (Array(value) & _columns.map { |col| col.name }).blank? }

  if _indexes.present?
    sql << ",\n"
  else
    sql << "\n"
  end
  _indexes.each do |index, columns|
    sql << "  KEY `#{index}` ("
    sql << Array(columns).map { |col| "`#{col}`" }.join(',')
    sql << "),\n"
  end

  sql.chomp!(",\n")

  if pure
    sql
  else
    sql << ")"
  end
end
drop_temp_table() click to toggle source
# File lib/rails_sync/table.rb, line 103
def drop_temp_table
  sql = "DROP TABLE IF EXISTS `#{@dest_table_name}`"

  connection.execute(sql)
end
instance_table() click to toggle source
# File lib/rails_sync/table.rb, line 5
def instance_table
  if same_server?
    # `source.table_name`
    @dest_table_name = @adapter.instance_variable_get(:@adapter_options)[:database].to_s + '.' + @dest_table.to_s
  else
    # `source_table_name`
    @dest_table_name = @dest.to_s + '_' + @table_name + '-' + @dest_table.to_s
  end
end
reset_temp_table() click to toggle source
# File lib/rails_sync/table.rb, line 84
def reset_temp_table
  drop_temp_table
  create_temp_table
end
same_server?() click to toggle source
# File lib/rails_sync/table.rb, line 15
def same_server?
  @server_id == adapter.server_id
end