Class: Rake::DataTask::Sqlite
- Inherits:
-
Db
- Object
- Db
- Rake::DataTask::Sqlite
show all
- Includes:
- NumericBooleans, StandardTransactions
- Defined in:
- lib/data_task/adapters/sqlite.rb
Constant Summary
Constants inherited
from Db
Db::LOG, Db::TABLE_TRACKER_COLUMNS, Db::TABLE_TRACKER_NAME
Instance Method Summary
collapse
Methods inherited from Db
#operation_values, #relation_type_values
Constructor Details
#initialize(options) ⇒ Sqlite
Connect to an Sqlite database.
20
21
22
23
24
25
|
# File 'lib/data_task/adapters/sqlite.rb', line 20
def initialize options
@connection = SQLite3::Database.new(options['database'] || 'temp')
set_up_tracking if !tracking_tables?
end
|
Instance Method Details
#[](name) ⇒ Object
173
174
175
|
# File 'lib/data_task/adapters/sqlite.rb', line 173
def [](name)
Data.new(name, self)
end
|
#create_table(table_name, data_definition, column_definitions = nil, track_table = true) ⇒ Object
Also known as:
create_data
80
81
82
83
84
85
86
87
88
89
90
|
# File 'lib/data_task/adapters/sqlite.rb', line 80
def create_table table_name, data_definition, column_definitions=nil, track_table=true
drop_table table_name
execute <<-EOSQL
create table #{table_name} #{column_definitions}
#{ "as #{data_definition}" if !data_definition.nil? }
EOSQL
if track_table
create_tracking_rules(table_name)
track_creation table_name, 0
end
end
|
#create_view(view_name, select_stmt) ⇒ Object
117
118
119
120
|
# File 'lib/data_task/adapters/sqlite.rb', line 117
def create_view view_name, select_stmt
drop_view view_name
execute "create view #{view_name} as #{select_stmt}"
end
|
#drop_table(table_name) ⇒ Object
Also known as:
drop_data
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/data_task/adapters/sqlite.rb', line 94
def drop_table table_name
execute "drop table if exists #{table_name}"
views_for_dropped_table = execute <<-EOSQL
select name from sqlite_master
where
type = 'view' and (
-- add trailing space for views without where statements
sql || ' ' like "% from #{table_name} %" or
sql like "% join #{table_name} %"
)
EOSQL
views_for_dropped_table.flatten.each do |view_name|
drop_view view_name
end
return if table_name.casecmp(TABLE_TRACKER_NAME) == 0
track_drop table_name
end
|
#drop_view(view_name) ⇒ Object
122
123
124
|
# File 'lib/data_task/adapters/sqlite.rb', line 122
def drop_view view_name
execute "drop view if exists #{view_name}"
end
|
#execute(sql) ⇒ Object
27
28
29
30
31
32
33
34
35
|
# File 'lib/data_task/adapters/sqlite.rb', line 27
def execute sql
connect if @connection.nil?
begin
@connection.execute sql
rescue SQLite3::SQLException => e
LOG.info e.message.chomp
raise e
end
end
|
#operations_supported ⇒ Object
166
167
168
169
170
171
|
# File 'lib/data_task/adapters/sqlite.rb', line 166
def operations_supported
{
:by_db => operations_supported_by_db,
:by_app => [:truncate, :create]
}
end
|
#reset_tracking(options = {}) ⇒ Object
63
64
65
|
# File 'lib/data_task/adapters/sqlite.rb', line 63
def reset_tracking options = {}
truncate_table TABLE_TRACKER_NAME
end
|
#set_up_tracking(options = {}) ⇒ Object
51
52
53
54
55
56
57
|
# File 'lib/data_task/adapters/sqlite.rb', line 51
def set_up_tracking options = {}
tear_down_tracking options
column_definitions = table_tracker_columns.map do |col,col_defn|
col.to_s + ' ' + col_defn[:data_type].to_s
end.join(', ')
create_table TABLE_TRACKER_NAME, nil, " (#{column_definitions})", false
end
|
#table_exists?(table_name, options = {}) ⇒ Boolean
Also known as:
data_exists?
135
136
137
|
# File 'lib/data_task/adapters/sqlite.rb', line 135
def table_exists? table_name, options = {}
relation_exists?(table_name, 'table', options)
end
|
#table_mtime(table_name) ⇒ Object
Also known as:
data_mtime
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/data_task/adapters/sqlite.rb', line 67
def table_mtime table_name
Sql.get_single_time(
execute <<-EOSQL
-- assume time is UTC (Sqlite3 default) and add offset for Ruby's Time.parse
select datetime(max(time)) || ' -0000'
from #{TABLE_TRACKER_NAME}
where relation_name = '#{table_name}'
EOSQL
)
end
|
#table_tracker_columns ⇒ Object
44
45
46
47
48
49
|
# File 'lib/data_task/adapters/sqlite.rb', line 44
def table_tracker_columns
super.merge({
:time => {:data_type => :timestamp}
})
end
|
#tear_down_tracking(options = {}) ⇒ Object
59
60
61
|
# File 'lib/data_task/adapters/sqlite.rb', line 59
def tear_down_tracking options = {}
drop_table TABLE_TRACKER_NAME
end
|
#track_drop(table_name) ⇒ Object
126
127
128
129
130
131
132
133
|
# File 'lib/data_task/adapters/sqlite.rb', line 126
def track_drop table_name
execute <<-EOSQL
delete from #{TABLE_TRACKER_NAME}
where
relation_name = '#{table_name}' and
relation_type = '#{relation_type_values[:table]}'
EOSQL
end
|
#track_truncate(table_name) ⇒ Object
153
154
155
156
157
158
159
160
161
162
163
164
|
# File 'lib/data_task/adapters/sqlite.rb', line 153
def track_truncate table_name
execute <<-EOSQL
update #{TABLE_TRACKER_NAME}
set
operation = '#{operation_values[:truncate]}',
-- Sqlite generates times at UTC and stores them without zone information
time = datetime('now')
where
relation_name = '#{table_name}' and
relation_type = '#{relation_type_values[:table]}'
EOSQL
end
|
#tracking_tables? ⇒ Boolean
40
41
42
|
# File 'lib/data_task/adapters/sqlite.rb', line 40
def tracking_tables?
table_exists?(TABLE_TRACKER_NAME)
end
|
#truncate_table(table_name) ⇒ Object
Also known as:
truncate_data
145
146
147
148
149
|
# File 'lib/data_task/adapters/sqlite.rb', line 145
def truncate_table table_name
return if table_name.casecmp(TABLE_TRACKER_NAME) == 0
execute "delete from #{table_name}"
track_truncate table_name
end
|
#view_exists?(table_name, options = {}) ⇒ Boolean
141
142
143
|
# File 'lib/data_task/adapters/sqlite.rb', line 141
def view_exists? table_name, options = {}
relation_exists?(table_name, 'view', options)
end
|