Method: Baza::Driver::Sqlite3::Table#clone

Defined in:
lib/baza/driver/sqlite3/table.rb

#clone(newname, args = nil) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/baza/driver/sqlite3/table.rb', line 165

def clone(newname, args = nil)
  raise "Invalid name." if newname.to_s.strip.empty?

  sql = "CREATE TABLE `#{newname}` ("
  first = true
  columns.each do |col|
    sql << ", " unless first
    first = false if first
    sql << @db.columns.data_sql(col.data)
  end
  sql << ");"

  @db.query(sql)
  @db.query("INSERT INTO `#{newname}` SELECT * FROM `#{name}`")

  indexes_to_create = []
  new_table = @db.tables[newname.to_sym]
  indexes.each do |index|
    index_name = index.name.gsub(/\A#{Regexp.escape(name)}_/, "")

    if @db.opts[:index_append_table_name] && (match = index_name.match(/\A(.+?)__(.+)\Z/))
      index_name = match[2]
    else
      # Two indexes with the same name can't exist, and we are cloning, so we need to change the name
      index_name = "#{newname}_#{index_name}"
    end

    create_data = index.data
    create_data[:name] = index_name

    indexes_to_create << create_data
  end

  new_table.create_indexes(indexes_to_create)

  if args && args[:return_table] == false
    return nil
  else
    return new_table
  end
end