Class: Rake::DataTask::Sqlite

Inherits:
Db
  • Object
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.

Parameters:

  • options (Hash)

    the connection parameters

Options Hash (options):

  • 'database' (String)

    the database name



16
17
18
19
20
21
# File 'lib/data_task/adapters/sqlite.rb', line 16

def initialize options
  @connection = SQLite3::Database.new(options['database'] || 'temp')

  # set up trackig if it isn't set up already
  set_up_tracking if !tracking_tables?
end

Instance Method Details

#[](name) ⇒ Object



169
170
171
# File 'lib/data_task/adapters/sqlite.rb', line 169

def [](name)
  Data.new(name, self)
end

#create_table(table_name, data_definition, column_definitions, track_table = true) ⇒ Object Also known as: create_data



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/data_task/adapters/sqlite.rb', line 76

def create_table table_name, data_definition, column_definitions, track_table=true
  drop_table table_name
  execute "    create table \#{table_name} \#{column_definitions}\n    \#{ \"as \#{data_definition}\" if !data_definition.nil? }\n  EOSQL\n  if track_table\n    create_tracking_rules(table_name)\n    track_creation table_name, 0\n  end\nend\n"

#create_view(view_name, select_stmt) ⇒ Object



113
114
115
116
# File 'lib/data_task/adapters/sqlite.rb', line 113

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



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/data_task/adapters/sqlite.rb', line 90

def drop_table table_name
  execute "drop table if exists #{table_name}"

  # manually cascade the drop operation to views for this table
  views_for_dropped_table = execute "    select name from sqlite_master \n    where \n      type = 'view' and (\n        -- add trailing space for views without where statements\n        sql || ' ' like \"% from \#{table_name} %\" or\n        sql like \"% join \#{table_name} %\"\n      )\n  EOSQL\n  views_for_dropped_table.flatten.each do |view_name|\n    drop_view view_name\n  end\n\n  return if table_name.casecmp(TABLE_TRACKER_NAME) == 0\n  track_drop table_name\nend\n"

#drop_view(view_name) ⇒ Object



118
119
120
# File 'lib/data_task/adapters/sqlite.rb', line 118

def drop_view view_name
  execute "drop view if exists #{view_name}"
end

#execute(sql) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/data_task/adapters/sqlite.rb', line 23

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_supportedObject



162
163
164
165
166
167
# File 'lib/data_task/adapters/sqlite.rb', line 162

def operations_supported
  {
    :by_db => operations_supported_by_db,
    :by_app => [:truncate, :create]
  }
end

#reset_tracking(options = {}) ⇒ Object



59
60
61
# File 'lib/data_task/adapters/sqlite.rb', line 59

def reset_tracking options = {}
  truncate_table TABLE_TRACKER_NAME
end

#set_up_tracking(options = {}) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/data_task/adapters/sqlite.rb', line 47

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?

Returns:

  • (Boolean)


131
132
133
# File 'lib/data_task/adapters/sqlite.rb', line 131

def table_exists? table_name, options = {}
  relation_exists?(table_name, 'table', options)
end

#table_mtime(table_name) ⇒ Object Also known as: data_mtime



63
64
65
66
67
68
69
70
71
72
# File 'lib/data_task/adapters/sqlite.rb', line 63

def table_mtime table_name
  Sql.get_single_time(
  execute "    -- assume time is UTC (Sqlite3 default) and add offset for Ruby's Time.parse \n    select datetime(max(time)) || ' -0000'\n    from \#{TABLE_TRACKER_NAME} \n    where relation_name = '\#{table_name}'\n  EOSQL\n  )\nend\n"

#table_tracker_columnsObject



40
41
42
43
44
45
# File 'lib/data_task/adapters/sqlite.rb', line 40

def table_tracker_columns
  # replace the default datatype for time with SQLite's timestamp
  super.merge({
    :time => {:data_type => :timestamp}
  })
end

#tear_down_tracking(options = {}) ⇒ Object



55
56
57
# File 'lib/data_task/adapters/sqlite.rb', line 55

def tear_down_tracking options = {}
  drop_table TABLE_TRACKER_NAME
end

#track_drop(table_name) ⇒ Object



122
123
124
125
126
127
128
129
# File 'lib/data_task/adapters/sqlite.rb', line 122

def track_drop table_name
  execute "    delete from \#{TABLE_TRACKER_NAME} \n    where \n      relation_name = '\#{table_name}' and \n      relation_type = '\#{relation_type_values[:table]}'\n  EOSQL\nend\n"

#track_truncate(table_name) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/data_task/adapters/sqlite.rb', line 149

def track_truncate table_name
  execute "    update \#{TABLE_TRACKER_NAME}\n    set \n      operation = '\#{operation_values[:truncate]}',\n      -- Sqlite generates times at UTC and stores them without zone information\n      time = datetime('now')\n    where\n      relation_name = '\#{table_name}' and\n      relation_type = '\#{relation_type_values[:table]}'\n  EOSQL\nend\n"

#tracking_tables?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/data_task/adapters/sqlite.rb', line 36

def tracking_tables?
  table_exists?(TABLE_TRACKER_NAME)
end

#truncate_table(table_name) ⇒ Object Also known as: truncate_data



141
142
143
144
145
# File 'lib/data_task/adapters/sqlite.rb', line 141

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

Returns:

  • (Boolean)


137
138
139
# File 'lib/data_task/adapters/sqlite.rb', line 137

def view_exists? table_name, options = {}
  relation_exists?(table_name, 'view', options)
end