baza 0.0.0 → 0.0.1
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.
- 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
|