baza 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.rdoc +106 -1
- data/VERSION +1 -1
- data/baza.gemspec +103 -0
- data/include/db.rb +108 -29
- data/include/drivers/mysql/mysql.rb +52 -47
- data/include/drivers/mysql/mysql_columns.rb +48 -41
- data/include/drivers/mysql/mysql_indexes.rb +2 -2
- data/include/drivers/mysql/mysql_tables.rb +91 -59
- data/include/drivers/sqlite3/sqlite3.rb +66 -45
- data/include/drivers/sqlite3/sqlite3_columns.rb +41 -39
- data/include/drivers/sqlite3/sqlite3_indexes.rb +2 -2
- data/include/drivers/sqlite3/sqlite3_tables.rb +86 -54
- data/include/dump.rb +5 -2
- data/include/revision.rb +130 -90
- data/spec/baza_spec.rb +312 -263
- data/spec/info_mysql_example.rb +6 -0
- data/spec/info_sqlite3.rb +20 -0
- metadata +22 -3
@@ -10,7 +10,7 @@ class Baza::Driver::Sqlite3::Tables
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def [](table_name)
|
13
|
-
table_name = table_name.
|
13
|
+
table_name = table_name.to_sym
|
14
14
|
|
15
15
|
begin
|
16
16
|
ret = @list[table_name]
|
@@ -20,7 +20,7 @@ class Baza::Driver::Sqlite3::Tables
|
|
20
20
|
end
|
21
21
|
|
22
22
|
self.list do |table_obj|
|
23
|
-
return table_obj if table_obj.name
|
23
|
+
return table_obj if table_obj.name == table_name
|
24
24
|
end
|
25
25
|
|
26
26
|
raise Errno::ENOENT, "Table was not found: #{table_name}."
|
@@ -30,23 +30,25 @@ class Baza::Driver::Sqlite3::Tables
|
|
30
30
|
ret = {} unless block_given?
|
31
31
|
|
32
32
|
@list_mutex.synchronize do
|
33
|
-
q_tables = @db.select("sqlite_master", {"type" => "table"}, {
|
33
|
+
q_tables = @db.select("sqlite_master", {"type" => "table"}, {:orderby => "name"}) do |d_tables|
|
34
34
|
next if d_tables[:name] == "sqlite_sequence"
|
35
35
|
|
36
|
-
|
36
|
+
tname = d_tables[:name].to_sym
|
37
|
+
obj = @list.get!(tname)
|
37
38
|
|
38
39
|
if !obj
|
39
40
|
obj = Baza::Driver::Sqlite3::Tables::Table.new(
|
40
41
|
:db => @db,
|
41
|
-
:data => d_tables
|
42
|
+
:data => d_tables,
|
43
|
+
:tables => self
|
42
44
|
)
|
43
|
-
@list[
|
45
|
+
@list[tname] = obj
|
44
46
|
end
|
45
47
|
|
46
48
|
if block_given?
|
47
49
|
yield(obj)
|
48
50
|
else
|
49
|
-
ret[
|
51
|
+
ret[tname] = obj
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -58,11 +60,25 @@ class Baza::Driver::Sqlite3::Tables
|
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
63
|
+
def remove_from_list(table)
|
64
|
+
@list.delete(table.name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_to_list(table)
|
68
|
+
raise "Already exists: '#{table.name}'." if @list.key?(table.name) and @list[table.name].__id__ != table.__id__
|
69
|
+
@list[table.name] = table
|
70
|
+
end
|
71
|
+
|
72
|
+
CREATE_ALLOWED_KEYS = [:indexes, :columns]
|
61
73
|
def create(name, data, args = nil)
|
74
|
+
data.each do |key, val|
|
75
|
+
raise "Invalid key: '#{key}' (#{key.class.name})." if !CREATE_ALLOWED_KEYS.include?(key)
|
76
|
+
end
|
77
|
+
|
62
78
|
sql = "CREATE TABLE `#{name}` ("
|
63
79
|
|
64
80
|
first = true
|
65
|
-
data[
|
81
|
+
data[:columns].each do |col_data|
|
66
82
|
sql << ", " if !first
|
67
83
|
first = false if first
|
68
84
|
sql << @db.cols.data_sql(col_data)
|
@@ -76,13 +92,13 @@ class Baza::Driver::Sqlite3::Tables
|
|
76
92
|
@db.query(sql)
|
77
93
|
end
|
78
94
|
|
79
|
-
if data.key?(
|
95
|
+
if data.key?(:indexes) and data[:indexes]
|
80
96
|
table_obj = self[name]
|
81
97
|
|
82
98
|
if args and args[:return_sql]
|
83
|
-
ret += table_obj.create_indexes(data[
|
99
|
+
ret += table_obj.create_indexes(data[:indexes], :return_sql => true)
|
84
100
|
else
|
85
|
-
table_obj.create_indexes(data[
|
101
|
+
table_obj.create_indexes(data[:indexes])
|
86
102
|
end
|
87
103
|
end
|
88
104
|
|
@@ -95,28 +111,25 @@ class Baza::Driver::Sqlite3::Tables
|
|
95
111
|
end
|
96
112
|
|
97
113
|
class Baza::Driver::Sqlite3::Tables::Table
|
114
|
+
attr_reader :name, :type
|
115
|
+
|
98
116
|
def initialize(args)
|
99
117
|
@db = args[:db]
|
100
118
|
@data = args[:data]
|
119
|
+
@name = @data[:name].to_sym
|
120
|
+
@type = @data[:type].to_sym
|
121
|
+
@tables = args[:tables]
|
101
122
|
|
102
123
|
@list = Wref_map.new
|
103
124
|
@indexes_list = Wref_map.new
|
104
125
|
end
|
105
126
|
|
106
|
-
def name
|
107
|
-
return @data[:name]
|
108
|
-
end
|
109
|
-
|
110
|
-
def type
|
111
|
-
return @data[:type]
|
112
|
-
end
|
113
|
-
|
114
127
|
def maxlength
|
115
128
|
return @data[:maxlength]
|
116
129
|
end
|
117
130
|
|
118
131
|
def reload
|
119
|
-
@data = @db.select("sqlite_master", {"type" => "table", "name" => self.name}, {
|
132
|
+
@data = @db.select("sqlite_master", {"type" => "table", "name" => self.name}, {:orderby => "name"}).fetch
|
120
133
|
end
|
121
134
|
|
122
135
|
def rows_count
|
@@ -128,6 +141,7 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
128
141
|
def drop
|
129
142
|
raise "Cant drop native table: '#{self.name}'." if self.native?
|
130
143
|
@db.query("DROP TABLE `#{self.name}`")
|
144
|
+
@tables.remove_from_list(self)
|
131
145
|
end
|
132
146
|
|
133
147
|
#Returns true if the table is safe to drop.
|
@@ -141,8 +155,20 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
141
155
|
end
|
142
156
|
|
143
157
|
def rename(newname)
|
144
|
-
|
158
|
+
newname = newname.to_sym
|
159
|
+
|
160
|
+
@tables.remove_from_list(self)
|
161
|
+
self.clone(newname, :return_table => false)
|
145
162
|
self.drop
|
163
|
+
@data[:name] = newname
|
164
|
+
@name = newname
|
165
|
+
@tables.add_to_list(self)
|
166
|
+
|
167
|
+
#Rename table on all columns.
|
168
|
+
#FIXME: This should only be done for columns that exists in memory. However a reference to the table should not be set, at this would force the table to stay in memory, when the column is still referenced...
|
169
|
+
self.columns.each do |name, col|
|
170
|
+
col.args[:table_name] = newname
|
171
|
+
end
|
146
172
|
end
|
147
173
|
|
148
174
|
def truncate
|
@@ -165,7 +191,8 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
165
191
|
ret = {}
|
166
192
|
|
167
193
|
@db.q("PRAGMA table_info(`#{@db.esc_table(self.name)}`)") do |d_cols|
|
168
|
-
|
194
|
+
name = d_cols[:name].to_sym
|
195
|
+
obj = @list.get!(name)
|
169
196
|
|
170
197
|
if !obj
|
171
198
|
obj = Baza::Driver::Sqlite3::Columns::Column.new(
|
@@ -173,13 +200,13 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
173
200
|
:db => @db,
|
174
201
|
:data => d_cols
|
175
202
|
)
|
176
|
-
@list[
|
203
|
+
@list[name] = obj
|
177
204
|
end
|
178
205
|
|
179
206
|
if block_given?
|
180
207
|
yield(obj)
|
181
208
|
else
|
182
|
-
ret[
|
209
|
+
ret[name] = obj
|
183
210
|
end
|
184
211
|
end
|
185
212
|
|
@@ -213,7 +240,7 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
213
240
|
first = false if first
|
214
241
|
sql << @db.cols.data_sql(col.data)
|
215
242
|
|
216
|
-
if col_data[
|
243
|
+
if col_data[:after] and col_data[:after] == name
|
217
244
|
sql << ", #{@db.cols.data_sql(col_data)}"
|
218
245
|
end
|
219
246
|
end
|
@@ -228,7 +255,7 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
228
255
|
|
229
256
|
sql << "`#{name}`"
|
230
257
|
|
231
|
-
if col_data[
|
258
|
+
if col_data[:after] and col_data[:after] == name
|
232
259
|
sql << ", ''"
|
233
260
|
end
|
234
261
|
end
|
@@ -237,7 +264,7 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
237
264
|
@db.query("DROP TABLE `#{temp_name}`")
|
238
265
|
end
|
239
266
|
|
240
|
-
def clone(newname)
|
267
|
+
def clone(newname, args = nil)
|
241
268
|
raise "Invalid name." if newname.to_s.strip.length <= 0
|
242
269
|
cols_cur = self.columns
|
243
270
|
|
@@ -254,7 +281,12 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
254
281
|
|
255
282
|
sql = "INSERT INTO `#{newname}` SELECT * FROM `#{self.name}`"
|
256
283
|
@db.query(sql)
|
257
|
-
|
284
|
+
|
285
|
+
if args and args[:return_table] == false
|
286
|
+
return nil
|
287
|
+
else
|
288
|
+
return @db.tables[newname]
|
289
|
+
end
|
258
290
|
end
|
259
291
|
|
260
292
|
def copy(args = {})
|
@@ -266,20 +298,20 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
266
298
|
sql = "CREATE TABLE `#{self.name}` ("
|
267
299
|
first = true
|
268
300
|
cols_cur.each do |name, col|
|
269
|
-
next if args[
|
301
|
+
next if args[:drops] and args[:drops].index(name) != nil
|
270
302
|
|
271
303
|
sql << ", " if !first
|
272
304
|
first = false if first
|
273
305
|
|
274
|
-
if args.key?(
|
275
|
-
sql << @db.cols.data_sql(args[
|
306
|
+
if args.key?(:alter_columns) and args[:alter_columns][name.to_sym]
|
307
|
+
sql << @db.cols.data_sql(args[:alter_columns][name.to_sym])
|
276
308
|
else
|
277
309
|
sql << @db.cols.data_sql(col.data)
|
278
310
|
end
|
279
311
|
|
280
|
-
if args[
|
281
|
-
args[
|
282
|
-
if col_data[
|
312
|
+
if args[:new]
|
313
|
+
args[:new].each do |col_data|
|
314
|
+
if col_data[:after] and col_data[:after] == name
|
283
315
|
sql << ", #{@db.cols.data_sql(col_data)}"
|
284
316
|
end
|
285
317
|
end
|
@@ -291,16 +323,16 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
291
323
|
sql = "INSERT INTO `#{self.name}` SELECT "
|
292
324
|
first = true
|
293
325
|
cols_cur.each do |name, col|
|
294
|
-
next if args[
|
326
|
+
next if args[:drops] and args[:drops].index(name) != nil
|
295
327
|
|
296
328
|
sql << ", " if !first
|
297
329
|
first = false if first
|
298
330
|
|
299
331
|
sql << "`#{name}`"
|
300
332
|
|
301
|
-
if args[
|
302
|
-
args[
|
303
|
-
if col_data[
|
333
|
+
if args[:news]
|
334
|
+
args[:news].each do |col_data|
|
335
|
+
if col_data[:after] and col_data[:after] == name
|
304
336
|
sql << ", ''"
|
305
337
|
end
|
306
338
|
end
|
@@ -313,7 +345,7 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
313
345
|
end
|
314
346
|
|
315
347
|
def index(name)
|
316
|
-
name = name.
|
348
|
+
name = name.to_sym
|
317
349
|
|
318
350
|
begin
|
319
351
|
return @indexes_list[name]
|
@@ -352,12 +384,12 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
352
384
|
match_name = d_indexes[:name].match(/__(.+)$/)
|
353
385
|
|
354
386
|
if match_name
|
355
|
-
name = match_name[1]
|
387
|
+
name = match_name[1].to_sym
|
356
388
|
else
|
357
|
-
name = d_indexes[:name]
|
389
|
+
name = d_indexes[:name].to_sym
|
358
390
|
end
|
359
391
|
else
|
360
|
-
name = d_indexes[:name]
|
392
|
+
name = d_indexes[:name].to_sym
|
361
393
|
end
|
362
394
|
|
363
395
|
obj = Baza::Driver::Sqlite3::Indexes::Index.new(
|
@@ -366,13 +398,13 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
366
398
|
:data => d_indexes
|
367
399
|
)
|
368
400
|
obj.columns << name
|
369
|
-
@indexes_list[d_indexes[:name]] = obj
|
401
|
+
@indexes_list[d_indexes[:name].to_sym] = obj
|
370
402
|
end
|
371
403
|
|
372
404
|
if block_given?
|
373
405
|
yield(obj)
|
374
406
|
else
|
375
|
-
ret[d_indexes[:name]] = obj
|
407
|
+
ret[d_indexes[:name].to_sym] = obj
|
376
408
|
end
|
377
409
|
end
|
378
410
|
|
@@ -390,19 +422,19 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
390
422
|
|
391
423
|
index_arr.each do |index_data|
|
392
424
|
if index_data.is_a?(String)
|
393
|
-
index_data = {
|
425
|
+
index_data = {:name => index_data, :columns => [index_data]}
|
394
426
|
end
|
395
427
|
|
396
|
-
raise "No name was given." if !index_data.key?(
|
397
|
-
raise "No columns was given on index #{index_data[
|
428
|
+
raise "No name was given in data: '#{index_data}'." if !index_data.key?(:name) or index_data[:name].strip.empty?
|
429
|
+
raise "No columns was given on index #{index_data[:name]}." if index_data[:columns].empty?
|
398
430
|
|
399
|
-
name = index_data[
|
431
|
+
name = index_data[:name]
|
400
432
|
name = "#{self.name}__#{name}" if @db.opts[:index_append_table_name]
|
401
433
|
|
402
434
|
sql = "CREATE INDEX '#{@db.esc_col(name)}' ON `#{@db.esc_table(self.name)}` ("
|
403
435
|
|
404
436
|
first = true
|
405
|
-
index_data[
|
437
|
+
index_data[:columns].each do |col_name|
|
406
438
|
sql << ", " if !first
|
407
439
|
first = false if first
|
408
440
|
|
@@ -427,17 +459,17 @@ class Baza::Driver::Sqlite3::Tables::Table
|
|
427
459
|
|
428
460
|
def data
|
429
461
|
ret = {
|
430
|
-
|
431
|
-
|
432
|
-
|
462
|
+
:name => name,
|
463
|
+
:columns => [],
|
464
|
+
:indexes => []
|
433
465
|
}
|
434
466
|
|
435
467
|
columns.each do |name, column|
|
436
|
-
ret[
|
468
|
+
ret[:columns] << column.data
|
437
469
|
end
|
438
470
|
|
439
471
|
indexes.each do |name, index|
|
440
|
-
ret[
|
472
|
+
ret[:indexes] << index.data if name != "PRIMARY"
|
441
473
|
end
|
442
474
|
|
443
475
|
return ret
|
data/include/dump.rb
CHANGED
@@ -50,7 +50,7 @@ class Baza::Dump
|
|
50
50
|
|
51
51
|
@table_obj = table_obj
|
52
52
|
self.update_status
|
53
|
-
|
53
|
+
puts "Dumping table: '#{table_obj.name}'." if @debug
|
54
54
|
self.dump_table(io, table_obj)
|
55
55
|
end
|
56
56
|
end
|
@@ -62,8 +62,11 @@ class Baza::Dump
|
|
62
62
|
|
63
63
|
#Dumps the given table into the given IO.
|
64
64
|
def dump_table(io, table_obj)
|
65
|
+
create_data = table_obj.data
|
66
|
+
create_data.delete(:name)
|
67
|
+
|
65
68
|
#Get SQL for creating table and add it to IO.
|
66
|
-
sqls = @args[:db].tables.create(table_obj.name,
|
69
|
+
sqls = @args[:db].tables.create(table_obj.name, create_data, :return_sql => true)
|
67
70
|
sqls.each do |sql|
|
68
71
|
io.write("#{sql};\n")
|
69
72
|
end
|