Module: JdbcSpec::SQLite3

Defined in:
lib/jdbc_adapter/jdbc_sqlite3.rb

Defined Under Namespace

Modules: Column

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.adapter_selectorObject



15
16
17
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 15

def self.adapter_selector
  [/sqlite/i, lambda {|cfg,adapt| adapt.extend(::JdbcSpec::SQLite3)}]
end

.column_selectorObject



11
12
13
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 11

def self.column_selector
  [/sqlite/i, lambda {|cfg,col| col.extend(::JdbcSpec::SQLite3::Column)}]
end

Instance Method Details

#add_column(table_name, column_name, type, options = {}) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 103

def add_column(table_name, column_name, type, options = {})
  if option_not_null = options[:null] == false
    option_not_null = options.delete(:null)
  end
  add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
  add_column_options!(add_column_sql, options)
  execute(add_column_sql)
  if option_not_null
    alter_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ALTER #{quote_column_name(column_name)} NOT NULL"
  end
end

#add_limit_offset!(sql, options) ⇒ Object

:nodoc:



161
162
163
164
165
166
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 161

def add_limit_offset!(sql, options) #:nodoc:
  if options[:limit]
    sql << " LIMIT #{options[:limit]}"
    sql << " OFFSET #{options[:offset]}" if options[:offset]
  end
end

#change_column(table_name, column_name, type, options = {}) ⇒ Object

:nodoc:



133
134
135
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 133

def change_column(table_name, column_name, type, options = {}) #:nodoc:
  execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
end

#change_column_default(table_name, column_name, default) ⇒ Object

:nodoc:



137
138
139
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 137

def change_column_default(table_name, column_name, default) #:nodoc:
  execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
end

#indexes(table_name, name = nil) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 176

def indexes(table_name, name = nil)
  result = select_rows("SELECT name, sql FROM sqlite_master WHERE tbl_name = '#{table_name}' AND type = 'index'", name)

  result.collect do |row|
    name = row[0]
    index_sql = row[1]
    unique = (index_sql =~ /unique/i)
    cols = index_sql.match(/\((.*)\)/)[1].gsub(/,/,' ').split
    ::ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, name, unique, cols)
  end
end

#insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) ⇒ Object

:nodoc:



149
150
151
152
153
154
155
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 149

def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
  log(sql,name) do
    @connection.execute_update(sql)
  end
  table = sql.split(" ", 4)[2]
  id_value || last_insert_id(table, nil)
end

#last_insert_id(table, sequence_name) ⇒ Object



157
158
159
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 157

def last_insert_id(table, sequence_name)
  Integer(select_value("SELECT SEQ FROM SQLITE_SEQUENCE WHERE NAME = '#{table}'"))
end

#modify_types(tp) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 65

def modify_types(tp)
  tp[:primary_key] = "INTEGER PRIMARY KEY AUTOINCREMENT"
  tp[:float] = { :name => "REAL" }
  tp[:decimal] = { :name => "REAL" }
  tp[:datetime] = { :name => "INTEGER" }
  tp[:timestamp] = { :name => "INTEGER" }
  tp[:time] = { :name => "INTEGER" }
  tp[:date] = { :name => "INTEGER" }
  tp[:boolean] = { :name => "INTEGER", :limit => 1}
  tp
end

#quote(value, column = nil) ⇒ Object

:nodoc:



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 77

def quote(value, column = nil) # :nodoc:
  return value.quoted_id if value.respond_to?(:quoted_id)

  case value
  when String
    if column && column.type == :binary
      "'#{quote_string(value).unpack("C*").collect {|v| v.to_s(16)}.join}'"
    else
      "'#{quote_string(value)}'"
    end
  else super
  end
end

#quote_string(str) ⇒ Object



91
92
93
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 91

def quote_string(str)
  str.gsub(/'/, "''")
end

#quoted_falseObject



99
100
101
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 99

def quoted_false
  '0'
end

#quoted_trueObject



95
96
97
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 95

def quoted_true
  '1'
end

#remove_column(table_name, column_name) ⇒ Object

:nodoc:



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 115

def remove_column(table_name, column_name) #:nodoc:
  cols = columns(table_name).collect {|col| col.name}
  cols.delete(column_name)
  cols = cols.join(', ')
  table_backup = table_name + "_backup"

  @connection.begin

  execute "CREATE TEMPORARY TABLE #{table_backup}(#{cols})"
  insert "INSERT INTO #{table_backup} SELECT #{cols} FROM #{table_name}"
  execute "DROP TABLE #{table_name}"
  execute "CREATE TABLE #{table_name}(#{cols})"
  insert "INSERT INTO #{table_name} SELECT #{cols} FROM #{table_backup}"
  execute "DROP TABLE #{table_backup}"

  @connection.commit
end

#remove_index(table_name, options = {}) ⇒ Object



172
173
174
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 172

def remove_index(table_name, options = {})
  execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
end

#rename_column(table_name, column_name, new_column_name) ⇒ Object

:nodoc:



141
142
143
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 141

def rename_column(table_name, column_name, new_column_name) #:nodoc:
  execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} RENAME TO #{new_column_name}"
end

#rename_table(name, new_name) ⇒ Object



145
146
147
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 145

def rename_table(name, new_name)
  execute "ALTER TABLE #{name} RENAME TO #{new_name}"
end

#tablesObject



168
169
170
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 168

def tables
  @connection.tables.select {|row| row.to_s !~ /^sqlite_/i }
end

#type_cast(value) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/jdbc_adapter/jdbc_sqlite3.rb', line 50

def type_cast(value)
  return nil if value.nil?
  case type
  when :string   then value
  when :integer  then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
  when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
  when :float    then value.to_f
  when :datetime then JdbcSpec::SQLite3::Column.cast_to_date_or_time(value)
  when :time     then JdbcSpec::SQLite3::Column.cast_to_time(value)
  when :decimal   then self.class.value_to_decimal(value)
  when :boolean   then self.class.value_to_boolean(value)
  else value
  end
end