baza 0.0.19 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +157 -0
- data/Gemfile +11 -9
- data/Gemfile.lock +41 -9
- data/README.md +1 -1
- data/Rakefile +19 -16
- data/VERSION +1 -1
- data/baza.gemspec +31 -7
- data/config/best_project_practice_rubocop.yml +2 -0
- data/config/best_project_practice_rubocop_todo.yml +157 -0
- data/lib/baza/base_sql_driver.rb +79 -20
- data/lib/baza/cloner.rb +2 -2
- data/lib/baza/column.rb +6 -0
- data/lib/baza/database.rb +33 -0
- data/lib/baza/database_model.rb +26 -0
- data/lib/baza/database_model_functionality.rb +10 -0
- data/lib/baza/database_model_name.rb +16 -0
- data/lib/baza/db.rb +210 -413
- data/lib/baza/dbtime.rb +20 -20
- data/lib/baza/driver.rb +3 -3
- data/lib/baza/drivers/active_record/columns.rb +1 -1
- data/lib/baza/drivers/active_record/indexes.rb +1 -1
- data/lib/baza/drivers/active_record/result.rb +3 -5
- data/lib/baza/drivers/active_record/tables.rb +2 -2
- data/lib/baza/drivers/active_record.rb +30 -16
- data/lib/baza/drivers/mysql/column.rb +51 -48
- data/lib/baza/drivers/mysql/columns.rb +8 -8
- data/lib/baza/drivers/mysql/database.rb +28 -0
- data/lib/baza/drivers/mysql/databases.rb +35 -0
- data/lib/baza/drivers/mysql/index.rb +32 -22
- data/lib/baza/drivers/mysql/result.rb +24 -24
- data/lib/baza/drivers/mysql/sqlspecs.rb +1 -1
- data/lib/baza/drivers/mysql/table.rb +80 -91
- data/lib/baza/drivers/mysql/tables.rb +30 -32
- data/lib/baza/drivers/mysql/unbuffered_result.rb +5 -5
- data/lib/baza/drivers/mysql.rb +127 -220
- data/lib/baza/drivers/mysql2/database.rb +2 -0
- data/lib/baza/drivers/mysql2/databases.rb +2 -0
- data/lib/baza/drivers/mysql2/result.rb +3 -5
- data/lib/baza/drivers/mysql2.rb +21 -106
- data/lib/baza/drivers/mysql_java/database.rb +2 -0
- data/lib/baza/drivers/mysql_java/databases.rb +2 -0
- data/lib/baza/drivers/mysql_java.rb +16 -12
- data/lib/baza/drivers/sqlite3/column.rb +33 -33
- data/lib/baza/drivers/sqlite3/columns.rb +6 -6
- data/lib/baza/drivers/sqlite3/database.rb +2 -0
- data/lib/baza/drivers/sqlite3/databases.rb +25 -0
- data/lib/baza/drivers/sqlite3/index.rb +20 -6
- data/lib/baza/drivers/sqlite3/result.rb +16 -17
- data/lib/baza/drivers/sqlite3/sqlspecs.rb +1 -1
- data/lib/baza/drivers/sqlite3/table.rb +99 -100
- data/lib/baza/drivers/sqlite3/tables.rb +30 -23
- data/lib/baza/drivers/sqlite3/unbuffered_result.rb +2 -2
- data/lib/baza/drivers/sqlite3.rb +27 -14
- data/lib/baza/drivers/sqlite3_java/database.rb +2 -0
- data/lib/baza/drivers/sqlite3_java/unbuffered_result.rb +2 -2
- data/lib/baza/drivers/sqlite3_java.rb +12 -10
- data/lib/baza/drivers/sqlite3_rhodes.rb +9 -7
- data/lib/baza/dump.rb +55 -55
- data/lib/baza/errors.rb +5 -0
- data/lib/baza/idquery.rb +25 -25
- data/lib/baza/index.rb +6 -0
- data/lib/baza/jdbc_driver.rb +6 -8
- data/lib/baza/jdbc_result.rb +1 -1
- data/lib/baza/model.rb +299 -309
- data/lib/baza/model_custom.rb +74 -72
- data/lib/baza/model_handler.rb +244 -255
- data/lib/baza/model_handler_sqlhelper.rb +122 -132
- data/lib/baza/mysql_base_driver.rb +112 -0
- data/lib/baza/query_buffer.rb +23 -23
- data/lib/baza/result_base.rb +2 -2
- data/lib/baza/revision.rb +67 -67
- data/lib/baza/row.rb +82 -84
- data/lib/baza/sqlspecs.rb +1 -1
- data/lib/baza/table.rb +31 -0
- data/lib/baza.rb +43 -10
- data/shippable.yml +1 -0
- data/spec/cloner_spec.rb +4 -4
- data/spec/drivers/active_record_mysql2_spec.rb +3 -3
- data/spec/drivers/active_record_mysql_spec.rb +2 -2
- data/spec/drivers/active_record_sqlite3_spec.rb +2 -2
- data/spec/drivers/mysql2_spec.rb +1 -0
- data/spec/drivers/mysql_spec.rb +1 -0
- data/spec/drivers/sqlite3_spec.rb +4 -5
- data/spec/info_active_record_example.rb +4 -6
- data/spec/info_active_record_mysql.rb +6 -7
- data/spec/info_active_record_mysql2.rb +2 -4
- data/spec/info_active_record_mysql2_shippable.rb +2 -4
- data/spec/info_active_record_mysql_shippable.rb +2 -4
- data/spec/info_active_record_sqlite3.rb +5 -6
- data/spec/info_mysql2_example.rb +1 -1
- data/spec/info_mysql2_shippable.rb +1 -1
- data/spec/info_mysql_example.rb +1 -1
- data/spec/info_mysql_shippable.rb +1 -1
- data/spec/info_sqlite3.rb +4 -3
- data/spec/model_handler_spec.rb +102 -115
- data/spec/spec_helper.rb +5 -5
- data/spec/support/driver_collection.rb +98 -95
- data/spec/support/driver_columns_collection.rb +18 -22
- data/spec/support/driver_databases_collection.rb +29 -0
- data/spec/support/driver_indexes_collection.rb +7 -6
- data/spec/support/driver_tables_collection.rb +38 -26
- metadata +49 -3
@@ -2,40 +2,43 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
2
2
|
attr_reader :name, :type
|
3
3
|
|
4
4
|
def initialize(args)
|
5
|
-
@db = args
|
6
|
-
@data = args
|
7
|
-
@name = @data
|
8
|
-
@type = @data
|
9
|
-
@tables = args
|
5
|
+
@db = args.fetch(:db)
|
6
|
+
@data = args.fetch(:data)
|
7
|
+
@name = @data.fetch(:name)
|
8
|
+
@type = @data.fetch(:type).to_sym
|
9
|
+
@tables = args.fetch(:tables)
|
10
10
|
|
11
11
|
@list = Wref::Map.new
|
12
12
|
@indexes_list = Wref::Map.new
|
13
13
|
end
|
14
14
|
|
15
15
|
def maxlength
|
16
|
-
|
16
|
+
@data.fetch(:maxlength)
|
17
17
|
end
|
18
18
|
|
19
19
|
def reload
|
20
|
-
|
20
|
+
data = @db.select("sqlite_master", {type: "table", name: name}, orderby: "name").fetch
|
21
|
+
raise Baza::Errors::TableNotFound unless data
|
22
|
+
@data = data
|
23
|
+
self
|
21
24
|
end
|
22
25
|
|
23
26
|
def rows_count
|
24
|
-
data = @db.
|
25
|
-
|
27
|
+
data = @db.query("SELECT COUNT(*) AS count FROM `#{name}`").fetch
|
28
|
+
data.fetch(:count).to_i
|
26
29
|
end
|
27
30
|
|
28
|
-
#Drops the table from the database.
|
31
|
+
# Drops the table from the database.
|
29
32
|
def drop
|
30
33
|
raise "Cant drop native table: '#{name}'." if native?
|
31
34
|
@db.query("DROP TABLE `#{name}`")
|
32
35
|
@tables.remove_from_list(self) if @tables.exists_in_list?(self)
|
33
36
|
end
|
34
37
|
|
35
|
-
#Returns true if the table is safe to drop.
|
38
|
+
# Returns true if the table is safe to drop.
|
36
39
|
def native?
|
37
40
|
return true if name.to_s == "sqlite_sequence"
|
38
|
-
|
41
|
+
false
|
39
42
|
end
|
40
43
|
|
41
44
|
def optimize
|
@@ -43,7 +46,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
43
46
|
end
|
44
47
|
|
45
48
|
def rename(newname)
|
46
|
-
newname = newname.
|
49
|
+
newname = newname.to_s
|
47
50
|
|
48
51
|
@tables.remove_from_list(self)
|
49
52
|
newtable = clone(newname)
|
@@ -53,37 +56,42 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
53
56
|
@name = newname
|
54
57
|
@tables.add_to_list(self)
|
55
58
|
|
56
|
-
#Rename table on all columns and indexes.
|
57
|
-
@list.each do |
|
59
|
+
# Rename table on all columns and indexes.
|
60
|
+
@list.each do |_name, column|
|
58
61
|
column.args[:table_name] = newname
|
59
62
|
end
|
60
63
|
|
61
|
-
@indexes_list.each do |
|
64
|
+
@indexes_list.each do |_name, index|
|
62
65
|
index.args[:table_name] = newname
|
63
66
|
end
|
64
67
|
end
|
65
68
|
|
69
|
+
# Drops the table and creates it again
|
66
70
|
def truncate
|
67
|
-
|
68
|
-
|
71
|
+
table_data = data
|
72
|
+
drop
|
73
|
+
@db.tables.create(table_data.delete(:name), table_data)
|
74
|
+
self
|
69
75
|
end
|
70
76
|
|
71
77
|
def table
|
72
|
-
|
78
|
+
@db.tables[@table_name]
|
73
79
|
end
|
74
80
|
|
75
81
|
def column(name)
|
76
|
-
|
77
|
-
|
78
|
-
|
82
|
+
columns do |column|
|
83
|
+
return column if column.name == name.to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
raise Baza::Errors::ColumnNotFound, "Column not found: #{name}"
|
79
87
|
end
|
80
88
|
|
81
89
|
def columns
|
82
90
|
@db.cols
|
83
|
-
ret =
|
91
|
+
ret = []
|
84
92
|
|
85
|
-
@db.
|
86
|
-
column_name = d_cols
|
93
|
+
@db.query("PRAGMA table_info(`#{@db.escape_table(name)}`)") do |d_cols|
|
94
|
+
column_name = d_cols.fetch(:name)
|
87
95
|
obj = @list.get(column_name)
|
88
96
|
|
89
97
|
unless obj
|
@@ -98,7 +106,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
98
106
|
if block_given?
|
99
107
|
yield obj
|
100
108
|
else
|
101
|
-
ret
|
109
|
+
ret << obj
|
102
110
|
end
|
103
111
|
end
|
104
112
|
|
@@ -111,28 +119,28 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
111
119
|
|
112
120
|
def create_columns(col_arr)
|
113
121
|
col_arr.each do |col_data|
|
114
|
-
#if col_data.key?("after")
|
122
|
+
# if col_data.key?("after")
|
115
123
|
# self.create_column_programmatic(col_data)
|
116
|
-
#else
|
117
|
-
|
118
|
-
#end
|
124
|
+
# else
|
125
|
+
@db.query("ALTER TABLE `#{name}` ADD COLUMN #{@db.cols.data_sql(col_data)};")
|
126
|
+
# end
|
119
127
|
end
|
120
128
|
end
|
121
129
|
|
122
130
|
def create_column_programmatic(col_data)
|
123
131
|
temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
|
124
|
-
cloned_tabled =
|
125
|
-
cols_cur =
|
126
|
-
@db.query("DROP TABLE `#{
|
132
|
+
cloned_tabled = clone(temp_name)
|
133
|
+
cols_cur = columns
|
134
|
+
@db.query("DROP TABLE `#{name}`")
|
127
135
|
|
128
|
-
sql = "CREATE TABLE `#{
|
136
|
+
sql = "CREATE TABLE `#{name}` ("
|
129
137
|
first = true
|
130
138
|
cols_cur.each do |name, col|
|
131
|
-
sql << ", "
|
139
|
+
sql << ", " unless first
|
132
140
|
first = false if first
|
133
141
|
sql << @db.cols.data_sql(col.data)
|
134
142
|
|
135
|
-
if col_data[:after]
|
143
|
+
if col_data[:after] && col_data[:after] == name
|
136
144
|
sql << ", #{@db.cols.data_sql(col_data)}"
|
137
145
|
end
|
138
146
|
end
|
@@ -141,15 +149,13 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
141
149
|
|
142
150
|
sql = "INSERT INTO `#{self.name}` SELECT "
|
143
151
|
first = true
|
144
|
-
cols_cur.each do |name,
|
145
|
-
sql << ", "
|
152
|
+
cols_cur.each do |name, _col|
|
153
|
+
sql << ", " unless first
|
146
154
|
first = false if first
|
147
155
|
|
148
156
|
sql << "`#{name}`"
|
149
157
|
|
150
|
-
if col_data[:after]
|
151
|
-
sql << ", ''"
|
152
|
-
end
|
158
|
+
sql << ", ''" if col_data[:after] && col_data[:after] == name
|
153
159
|
end
|
154
160
|
sql << " FROM `#{temp_name}`"
|
155
161
|
@db.query(sql)
|
@@ -161,23 +167,26 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
161
167
|
|
162
168
|
sql = "CREATE TABLE `#{newname}` ("
|
163
169
|
first = true
|
164
|
-
columns.each do |
|
170
|
+
columns.each do |col|
|
165
171
|
sql << ", " unless first
|
166
172
|
first = false if first
|
167
173
|
sql << @db.cols.data_sql(col.data)
|
168
174
|
end
|
169
|
-
|
170
175
|
sql << ");"
|
176
|
+
|
171
177
|
@db.query(sql)
|
172
178
|
@db.query("INSERT INTO `#{newname}` SELECT * FROM `#{name}`")
|
173
179
|
|
174
180
|
indexes_to_create = []
|
175
181
|
new_table = @db.tables[newname.to_sym]
|
176
|
-
indexes.each do |
|
177
|
-
index_name = name.
|
182
|
+
indexes.each do |index|
|
183
|
+
index_name = index.name.gsub(/\A#{Regexp.escape(name)}_/, "")
|
178
184
|
|
179
185
|
if @db.opts[:index_append_table_name] && match = index_name.match(/\A(.+?)__(.+)\Z/)
|
180
186
|
index_name = match[2]
|
187
|
+
else
|
188
|
+
# Two indexes with the same name can't exist, and we are cloning, so we need to change the name
|
189
|
+
index_name = "#{newname}_#{index_name}"
|
181
190
|
end
|
182
191
|
|
183
192
|
create_data = index.data
|
@@ -197,29 +206,28 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
197
206
|
|
198
207
|
def copy(args = {})
|
199
208
|
temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
|
200
|
-
cloned_tabled =
|
201
|
-
cols_cur =
|
202
|
-
@db.query("DROP TABLE `#{
|
209
|
+
cloned_tabled = clone(temp_name)
|
210
|
+
cols_cur = columns
|
211
|
+
@db.query("DROP TABLE `#{name}`")
|
203
212
|
|
204
|
-
sql = "CREATE TABLE `#{
|
213
|
+
sql = "CREATE TABLE `#{name}` ("
|
205
214
|
first = true
|
206
|
-
cols_cur.each do |
|
207
|
-
next if args[:drops] && args[:drops].to_s.include?(name
|
215
|
+
cols_cur.each do |col|
|
216
|
+
next if args[:drops] && args[:drops].to_s.include?(col.name)
|
208
217
|
|
209
|
-
sql << ", "
|
218
|
+
sql << ", " unless first
|
210
219
|
first = false if first
|
211
220
|
|
212
|
-
if args.key?(:alter_columns) && args[:alter_columns][name
|
213
|
-
sql << @db.cols.data_sql(args[:alter_columns][name
|
221
|
+
if args.key?(:alter_columns) && args[:alter_columns][col.name]
|
222
|
+
sql << @db.cols.data_sql(args[:alter_columns][col.name])
|
214
223
|
else
|
215
224
|
sql << @db.cols.data_sql(col.data)
|
216
225
|
end
|
217
226
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
end
|
227
|
+
next unless args[:new]
|
228
|
+
args[:new].each do |col_data|
|
229
|
+
if col_data[:after] && col_data[:after] == col.name
|
230
|
+
sql << ", #{@db.cols.data_sql(col_data)}"
|
223
231
|
end
|
224
232
|
end
|
225
233
|
end
|
@@ -227,22 +235,19 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
227
235
|
sql << ");"
|
228
236
|
@db.query(sql)
|
229
237
|
|
230
|
-
sql = "INSERT INTO `#{
|
238
|
+
sql = "INSERT INTO `#{name}` SELECT "
|
231
239
|
first = true
|
232
|
-
cols_cur.each do |
|
233
|
-
next if args[:drops] && args[:drops].to_s.include?(name
|
240
|
+
cols_cur.each do |col|
|
241
|
+
next if args[:drops] && args[:drops].to_s.include?(col.name)
|
234
242
|
|
235
|
-
sql << ", "
|
243
|
+
sql << ", " unless first
|
236
244
|
first = false if first
|
237
245
|
|
238
|
-
sql << "`#{name}`"
|
246
|
+
sql << "`#{col.name}`"
|
239
247
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
sql << ", ''"
|
244
|
-
end
|
245
|
-
end
|
248
|
+
next unless args[:news]
|
249
|
+
args[:news].each do |col_data|
|
250
|
+
sql << ", ''" if col_data[:after] && col_data[:after] == col.name
|
246
251
|
end
|
247
252
|
end
|
248
253
|
|
@@ -252,36 +257,33 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
252
257
|
end
|
253
258
|
|
254
259
|
def index(index_name)
|
255
|
-
index_name = index_name.
|
260
|
+
index_name = index_name.to_s
|
256
261
|
|
257
|
-
if index = @indexes_list[index_name]
|
262
|
+
if (index = @indexes_list[index_name])
|
258
263
|
return index
|
259
264
|
end
|
260
265
|
|
261
266
|
if @db.opts[:index_append_table_name]
|
262
267
|
tryname = "#{name}__#{index_name}"
|
263
268
|
|
264
|
-
if index = @indexes_list[tryname]
|
269
|
+
if (index = @indexes_list[tryname])
|
265
270
|
return index
|
266
271
|
end
|
267
272
|
end
|
268
273
|
|
269
|
-
indexes do |
|
270
|
-
if
|
271
|
-
|
272
|
-
end
|
273
|
-
|
274
|
-
return index if index.name.to_s == index_name.to_s
|
274
|
+
indexes do |index_i|
|
275
|
+
return index_i if index_i.name == "#{name}__#{index_name}"
|
276
|
+
return index_i if index_i.name == index_name
|
275
277
|
end
|
276
278
|
|
277
|
-
raise
|
279
|
+
raise Baza::Errors::IndexNotFound, "Index not found: #{index_name}."
|
278
280
|
end
|
279
281
|
|
280
282
|
def indexes
|
281
283
|
@db.indexes
|
282
|
-
ret =
|
284
|
+
ret = [] unless block_given?
|
283
285
|
|
284
|
-
@db.
|
286
|
+
@db.query("PRAGMA index_list(`#{@db.escape_table(name)}`)") do |d_indexes|
|
285
287
|
next if d_indexes[:Key_name] == "PRIMARY"
|
286
288
|
obj = @indexes_list.get(d_indexes[:name])
|
287
289
|
|
@@ -304,7 +306,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
304
306
|
if block_given?
|
305
307
|
yield(obj)
|
306
308
|
else
|
307
|
-
ret
|
309
|
+
ret << obj
|
308
310
|
end
|
309
311
|
end
|
310
312
|
|
@@ -316,31 +318,28 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
316
318
|
end
|
317
319
|
|
318
320
|
def create_indexes(index_arr, args = nil)
|
319
|
-
if args && args[:return_sql]
|
320
|
-
ret = []
|
321
|
-
end
|
321
|
+
ret = [] if args && args[:return_sql]
|
322
322
|
|
323
323
|
index_arr.each do |index_data|
|
324
|
-
if index_data.is_a?(String)
|
324
|
+
if index_data.is_a?(String) || index_data.is_a?(Symbol)
|
325
325
|
index_data = {name: index_data, columns: [index_data]}
|
326
326
|
end
|
327
327
|
|
328
328
|
raise "No name was given in data: '#{index_data}'." if !index_data.key?(:name) || index_data[:name].to_s.strip.empty?
|
329
329
|
raise "No columns was given on index #{index_data[:name]}." if !index_data[:columns] || index_data[:columns].empty?
|
330
330
|
|
331
|
-
|
332
|
-
|
331
|
+
index_name = index_data.fetch(:name).to_s
|
332
|
+
index_name = "#{name}__#{index_name}" if @db.opts[:index_append_table_name] && !index_name.start_with?("#{name}__")
|
333
333
|
|
334
334
|
sql = "CREATE"
|
335
335
|
sql << " UNIQUE" if index_data[:unique]
|
336
|
-
sql << " INDEX '#{@db.
|
336
|
+
sql << " INDEX '#{@db.escape_column(index_name)}' ON `#{@db.escape_table(name)}` ("
|
337
337
|
|
338
338
|
first = true
|
339
|
-
index_data
|
340
|
-
sql << ", "
|
339
|
+
index_data.fetch(:columns).each do |col_name|
|
340
|
+
sql << ", " unless first
|
341
341
|
first = false if first
|
342
|
-
|
343
|
-
sql << "`#{@db.esc_col(col_name)}`"
|
342
|
+
sql << "`#{@db.escape_column(col_name)}`"
|
344
343
|
end
|
345
344
|
|
346
345
|
sql << ")"
|
@@ -366,15 +365,15 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
366
365
|
indexes: []
|
367
366
|
}
|
368
367
|
|
369
|
-
columns
|
368
|
+
columns do |column|
|
370
369
|
ret[:columns] << column.data
|
371
370
|
end
|
372
371
|
|
373
|
-
indexes
|
374
|
-
ret[:indexes] << index.data
|
372
|
+
indexes do |index|
|
373
|
+
ret[:indexes] << index.data unless index.name == "PRIMARY"
|
375
374
|
end
|
376
375
|
|
377
|
-
|
376
|
+
ret
|
378
377
|
end
|
379
378
|
|
380
379
|
def insert(data)
|
@@ -391,8 +390,8 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
391
390
|
|
392
391
|
private
|
393
392
|
|
394
|
-
def parse_columns_from_sql
|
393
|
+
def parse_columns_from_sql(sql)
|
395
394
|
columns_sql = sql.match(/\((.+?)\)\Z/)[1]
|
396
|
-
|
395
|
+
columns_sql.split(",").map { |column| column.match(/`(.+)`/)[1] }
|
397
396
|
end
|
398
397
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "monitor"
|
2
|
+
|
1
3
|
class Baza::Driver::Sqlite3::Tables
|
2
4
|
attr_reader :db, :driver
|
3
5
|
|
@@ -5,33 +7,36 @@ class Baza::Driver::Sqlite3::Tables
|
|
5
7
|
@args = args
|
6
8
|
@db = @args[:db]
|
7
9
|
|
8
|
-
@list_mutex =
|
10
|
+
@list_mutex = Monitor.new
|
9
11
|
@list = Wref::Map.new
|
10
12
|
end
|
11
13
|
|
12
14
|
def [](table_name)
|
13
|
-
table_name = table_name.
|
15
|
+
table_name = table_name.to_s
|
14
16
|
|
15
17
|
if ret = @list.get(table_name)
|
16
18
|
return ret
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
return
|
21
|
+
list(name: table_name) do |table|
|
22
|
+
return table if table.name == table_name
|
21
23
|
end
|
22
24
|
|
23
|
-
raise
|
25
|
+
raise Baza::Errors::TableNotFound, "Table was not found: #{table_name}."
|
24
26
|
end
|
25
27
|
|
26
|
-
def list
|
27
|
-
ret =
|
28
|
+
def list(args = {})
|
29
|
+
ret = [] unless block_given?
|
28
30
|
|
29
31
|
@list_mutex.synchronize do
|
30
|
-
|
31
|
-
|
32
|
+
tables_args = {type: "table"}
|
33
|
+
tables_args[:name] = args.fetch(:name) if args[:name]
|
34
|
+
|
35
|
+
q_tables = @db.select("sqlite_master", tables_args, orderby: "name") do |d_tables|
|
36
|
+
table_name = d_tables.fetch(:name)
|
37
|
+
next if table_name == "sqlite_sequence"
|
32
38
|
|
33
|
-
|
34
|
-
obj = @list.get(tname)
|
39
|
+
obj = @list.get(table_name)
|
35
40
|
|
36
41
|
unless obj
|
37
42
|
obj = Baza::Driver::Sqlite3::Table.new(
|
@@ -39,25 +44,25 @@ class Baza::Driver::Sqlite3::Tables
|
|
39
44
|
data: d_tables,
|
40
45
|
tables: self
|
41
46
|
)
|
42
|
-
@list[
|
47
|
+
@list[table_name] = obj
|
43
48
|
end
|
44
49
|
|
45
50
|
if block_given?
|
46
|
-
yield
|
51
|
+
yield obj
|
47
52
|
else
|
48
|
-
ret
|
53
|
+
ret << obj
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
58
|
if block_given?
|
54
|
-
|
59
|
+
nil
|
55
60
|
else
|
56
|
-
|
61
|
+
ret
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
60
|
-
def exists_in_list?
|
65
|
+
def exists_in_list?(table)
|
61
66
|
@list.key?(table.name)
|
62
67
|
end
|
63
68
|
|
@@ -73,15 +78,17 @@ class Baza::Driver::Sqlite3::Tables
|
|
73
78
|
|
74
79
|
CREATE_ALLOWED_KEYS = [:indexes, :columns]
|
75
80
|
def create(name, data, args = nil)
|
76
|
-
data.
|
81
|
+
data.each_key do |key|
|
77
82
|
raise "Invalid key: '#{key}' (#{key.class.name})." unless CREATE_ALLOWED_KEYS.include?(key)
|
78
83
|
end
|
79
84
|
|
85
|
+
raise "No columns given" if data.fetch(:columns).empty?
|
86
|
+
|
80
87
|
sql = "CREATE TABLE `#{name}` ("
|
81
88
|
|
82
89
|
first = true
|
83
|
-
data
|
84
|
-
sql << ", "
|
90
|
+
data.fetch(:columns).each do |col_data|
|
91
|
+
sql << ", " unless first
|
85
92
|
first = false if first
|
86
93
|
sql << @db.cols.data_sql(col_data)
|
87
94
|
end
|
@@ -94,13 +101,13 @@ class Baza::Driver::Sqlite3::Tables
|
|
94
101
|
@db.query(sql)
|
95
102
|
end
|
96
103
|
|
97
|
-
if data
|
104
|
+
if data[:indexes]
|
98
105
|
table_obj = self[name]
|
99
106
|
|
100
107
|
if args && args[:return_sql]
|
101
|
-
ret += table_obj.create_indexes(data
|
108
|
+
ret += table_obj.create_indexes(data.fetch(:indexes), return_sql: true)
|
102
109
|
else
|
103
|
-
table_obj.create_indexes(data
|
110
|
+
table_obj.create_indexes(data.fetch(:indexes))
|
104
111
|
end
|
105
112
|
end
|
106
113
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Baza::Driver::Sqlite3::UnbufferedResult
|
2
|
-
def initialize(
|
2
|
+
def initialize(_driver, statement)
|
3
3
|
@statement = statement
|
4
4
|
@statement.execute
|
5
|
-
@columns = statement.columns.map
|
5
|
+
@columns = statement.columns.map(&:to_sym)
|
6
6
|
end
|
7
7
|
|
8
8
|
def fetch
|
data/lib/baza/drivers/sqlite3.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
#This class handels SQLite3-specific behaviour.
|
1
|
+
# This class handels SQLite3-specific behaviour.
|
2
2
|
class Baza::Driver::Sqlite3 < Baza::BaseSqlDriver
|
3
3
|
path = "#{File.dirname(__FILE__)}/sqlite3"
|
4
4
|
|
5
|
+
autoload :Database, "#{path}/database"
|
6
|
+
autoload :Databases, "#{path}/databases"
|
5
7
|
autoload :Table, "#{path}/table"
|
6
8
|
autoload :Tables, "#{path}/tables"
|
7
9
|
autoload :Column, "#{path}/column"
|
@@ -14,7 +16,14 @@ class Baza::Driver::Sqlite3 < Baza::BaseSqlDriver
|
|
14
16
|
|
15
17
|
attr_reader :mutex_statement_reader
|
16
18
|
|
17
|
-
|
19
|
+
def self.args
|
20
|
+
[{
|
21
|
+
label: "Path",
|
22
|
+
name: "path"
|
23
|
+
}]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Helper to enable automatic registering of database using Baza::Db.from_object
|
18
27
|
def self.from_object(args)
|
19
28
|
if args[:object].class.name == "SQLite3::Database"
|
20
29
|
return {
|
@@ -27,7 +36,7 @@ class Baza::Driver::Sqlite3 < Baza::BaseSqlDriver
|
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
|
-
#Constructor. This should not be called manually.
|
39
|
+
# Constructor. This should not be called manually.
|
31
40
|
def initialize(baza_db)
|
32
41
|
super
|
33
42
|
|
@@ -38,14 +47,14 @@ class Baza::Driver::Sqlite3 < Baza::BaseSqlDriver
|
|
38
47
|
@conn = @baza.opts[:conn]
|
39
48
|
else
|
40
49
|
raise "No path was given." unless @path
|
41
|
-
require
|
50
|
+
require "sqlite3" unless ::Object.const_defined?(:SQLite3)
|
42
51
|
|
43
52
|
@conn = ::SQLite3::Database.open(@path)
|
44
53
|
@conn.type_translation = false # Type translation is always done in the C ext for SQLite3
|
45
54
|
end
|
46
55
|
end
|
47
56
|
|
48
|
-
#Executes a query against the driver.
|
57
|
+
# Executes a query against the driver.
|
49
58
|
def query(sql)
|
50
59
|
@mutex_statement_reader.synchronize do
|
51
60
|
return Baza::Driver::Sqlite3::Result.new(self, @conn.prepare(sql))
|
@@ -53,29 +62,33 @@ class Baza::Driver::Sqlite3 < Baza::BaseSqlDriver
|
|
53
62
|
end
|
54
63
|
|
55
64
|
def query_ubuf(sql)
|
56
|
-
|
65
|
+
Baza::Driver::Sqlite3::UnbufferedResult.new(self, @conn.prepare(sql))
|
57
66
|
end
|
58
67
|
|
59
|
-
#Escapes a string to be safe to used in a query.
|
68
|
+
# Escapes a string to be safe to used in a query.
|
60
69
|
def escape(string)
|
61
|
-
#This code is taken directly from the documentation so we dont have to rely on the SQLite3::Database class. This way it can also be used with JRuby and IronRuby...
|
62
|
-
#http://sqlite-ruby.rubyforge.org/classes/SQLite/Database.html
|
63
|
-
|
70
|
+
# This code is taken directly from the documentation so we dont have to rely on the SQLite3::Database class. This way it can also be used with JRuby and IronRuby...
|
71
|
+
# http://sqlite-ruby.rubyforge.org/classes/SQLite/Database.html
|
72
|
+
string.to_s.gsub(/'/, "''")
|
64
73
|
end
|
65
74
|
|
66
|
-
#Returns the last inserted ID.
|
75
|
+
# Returns the last inserted ID.
|
67
76
|
def last_id
|
68
77
|
return @conn.last_insert_row_id if @conn.respond_to?(:last_insert_row_id)
|
69
|
-
|
78
|
+
query("SELECT last_insert_rowid() AS id").fetch[:id].to_i
|
70
79
|
end
|
71
80
|
|
72
|
-
#Closes the connection to the database.
|
81
|
+
# Closes the connection to the database.
|
73
82
|
def close
|
74
83
|
@mutex_statement_reader.synchronize { @conn.close }
|
75
84
|
end
|
76
85
|
|
77
|
-
#Starts a transaction, yields the database and commits.
|
86
|
+
# Starts a transaction, yields the database and commits.
|
78
87
|
def transaction
|
79
88
|
@conn.transaction { yield @baza }
|
80
89
|
end
|
90
|
+
|
91
|
+
def supports_multiple_databases?
|
92
|
+
false
|
93
|
+
end
|
81
94
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Baza::Driver::Sqlite3Java::UnbufferedResult < Baza::ResultBase
|
2
|
-
def initialize(
|
2
|
+
def initialize(_driver, result_set)
|
3
3
|
@result_set = result_set
|
4
4
|
|
5
5
|
if @result_set
|
@@ -22,7 +22,7 @@ class Baza::Driver::Sqlite3Java::UnbufferedResult < Baza::ResultBase
|
|
22
22
|
hash[@columns[count]] = @result_set.string(count + 1)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
hash
|
26
26
|
end
|
27
27
|
|
28
28
|
def each
|