Module: ActiveRecord::Import::SQLite3Adapter

Includes:
ImportSupport
Included in:
ConnectionAdapters::SQLite3Adapter
Defined in:
lib/activerecord-import/adapters/sqlite3_adapter.rb

Constant Summary collapse

MIN_VERSION_FOR_IMPORT =
"3.7.11".freeze
SQLITE_LIMIT_COMPOUND_SELECT =
500

Instance Method Summary collapse

Instance Method Details

#affected_rowsObject



61
62
63
64
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 61

def affected_rows
  result = execute('SELECT changes();')
  result.first[0]
end

#insert_many(sql, values, *args) ⇒ Object

sql can be a single string or an array. If it is an array all elements that are in position >= 1 will be appended to the final SQL.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 20

def insert_many(sql, values, *args) # :nodoc:
  number_of_inserts = 0
  ids = []

  base_sql, post_sql = if sql.is_a?( String )
    [sql, '']
  elsif sql.is_a?( Array )
    [sql.shift, sql.join( ' ' )]
  end

  value_sets = ::ActiveRecord::Import::ValueSetsRecordsParser.parse(values,
    max_records: SQLITE_LIMIT_COMPOUND_SELECT)

  transaction(requires_new: true) do
    value_sets.each do |value_set|
      number_of_inserts += 1
      sql2insert = base_sql + value_set.join( ',' ) + post_sql
      last_insert_id = insert( sql2insert, *args )
      if last_insert_id > 0
        first_insert_id = last_insert_id - affected_rows + 1
        ids.concat((first_insert_id..last_insert_id).to_a)
      end
    end
  end

  [number_of_inserts, ids]
end

#next_value_for_sequence(sequence_name) ⇒ Object



57
58
59
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 57

def next_value_for_sequence(sequence_name)
  %{nextval('#{sequence_name}')}
end

#pre_sql_statements(options) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 48

def pre_sql_statements( options)
  sql = []
  # Options :recursive and :on_duplicate_key_ignore are mutually exclusive
  if (options[:ignore] || options[:on_duplicate_key_ignore]) && !options[:recursive]
    sql << "OR IGNORE"
  end
  sql + super
end

#support_setting_primary_key_of_imported_objects?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 66

def support_setting_primary_key_of_imported_objects?
  true
end

#supports_import?(current_version = sqlite_version) ⇒ Boolean

Override our conformance to ActiveRecord::Import::ImportSupport interface to ensure that we only support import in supported version of SQLite. Which INSERT statements with multiple value sets was introduced in 3.7.11.

Returns:

  • (Boolean)


10
11
12
13
14
15
16
# File 'lib/activerecord-import/adapters/sqlite3_adapter.rb', line 10

def supports_import?(current_version = sqlite_version)
  if current_version >= MIN_VERSION_FOR_IMPORT
    true
  else
    false
  end
end