baza 0.0.13 → 0.0.14

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.
@@ -3,7 +3,7 @@ require "monitor"
3
3
  #This class handels various MySQL-table-specific behaviour.
4
4
  class Baza::Driver::Mysql::Tables
5
5
  attr_reader :db, :list
6
-
6
+
7
7
  #Constructor. This should not be called manually.
8
8
  def initialize(args)
9
9
  @args = args
@@ -13,42 +13,42 @@ class Baza::Driver::Mysql::Tables
13
13
  @list = Wref_map.new
14
14
  @list_should_be_reloaded = true
15
15
  end
16
-
16
+
17
17
  #Cleans the wref-map.
18
18
  def clean
19
19
  @list.clean
20
20
  end
21
-
21
+
22
22
  #Returns a table by the given table-name.
23
23
  def [](table_name)
24
24
  table_name = table_name.to_sym
25
-
25
+
26
26
  begin
27
27
  return @list[table_name]
28
28
  rescue Wref::Recycled
29
29
  #ignore.
30
30
  end
31
-
31
+
32
32
  self.list(:name => table_name) do |table_obj|
33
33
  return table_obj if table_obj.name == table_name
34
34
  end
35
-
35
+
36
36
  raise Errno::ENOENT, "Table was not found: #{table_name}."
37
37
  end
38
-
38
+
39
39
  #Yields the tables of the current database.
40
40
  def list(args = {})
41
41
  ret = {} unless block_given?
42
-
42
+
43
43
  sql = "SHOW TABLE STATUS"
44
44
  sql << " WHERE `Name` = '#{@db.esc(args[:name])}'" if args[:name]
45
-
45
+
46
46
  @list_mutex.synchronize do
47
47
  @db.q(sql) do |d_tables|
48
48
  raise "No name was given from: #{d_tables}" unless d_tables.is_a?(Hash) && d_tables[:Name]
49
49
  name = d_tables[:Name].to_sym
50
50
  obj = @list.get!(name)
51
-
51
+
52
52
  if !obj
53
53
  obj = Baza::Driver::Mysql::Tables::Table.new(
54
54
  :db => @db,
@@ -57,7 +57,7 @@ class Baza::Driver::Mysql::Tables
57
57
  )
58
58
  @list[name] = obj
59
59
  end
60
-
60
+
61
61
  if block_given?
62
62
  yield(obj)
63
63
  else
@@ -65,23 +65,23 @@ class Baza::Driver::Mysql::Tables
65
65
  end
66
66
  end
67
67
  end
68
-
68
+
69
69
  if block_given?
70
70
  return nil
71
71
  else
72
72
  return ret
73
73
  end
74
74
  end
75
-
75
+
76
76
  CREATE_ALLOWED_KEYS = [:columns, :indexes, :temp, :return_sql]
77
77
  #Creates a new table by the given name and data.
78
78
  def create(name, data, args = nil)
79
79
  raise "No columns was given for '#{name}'." if !data[:columns] or data[:columns].empty?
80
-
80
+
81
81
  sql = "CREATE"
82
82
  sql << " TEMPORARY" if data[:temp]
83
83
  sql << " TABLE `#{name}` ("
84
-
84
+
85
85
  first = true
86
86
  data[:columns].each do |col_data|
87
87
  sql << ", " if !first
@@ -89,7 +89,7 @@ class Baza::Driver::Mysql::Tables
89
89
  col_data.delete(:after) if col_data[:after]
90
90
  sql << @db.cols.data_sql(col_data)
91
91
  end
92
-
92
+
93
93
  if data[:indexes] and !data[:indexes].empty?
94
94
  sql << ", "
95
95
  sql << Baza::Driver::Mysql::Tables::Table.create_indexes(data[:indexes], {
@@ -100,20 +100,20 @@ class Baza::Driver::Mysql::Tables
100
100
  :table_name => name
101
101
  })
102
102
  end
103
-
103
+
104
104
  sql << ")"
105
-
105
+
106
106
  return [sql] if args and args[:return_sql]
107
107
  @db.query(sql)
108
108
  end
109
-
109
+
110
110
  private
111
-
111
+
112
112
  def add_to_list(table)
113
113
  raise "Already exists: '#{table.name}'." if @list.key?(table.name) and @list[table.name].__id__ != table.__id__
114
114
  @list[table.name] = table
115
115
  end
116
-
116
+
117
117
  def remove_from_list(table)
118
118
  raise "Table not in list: '#{table.name}'." if !@list.key?(table.name)
119
119
  @list.delete(table.name)
@@ -122,7 +122,7 @@ end
122
122
 
123
123
  class Baza::Driver::Mysql::Tables::Table
124
124
  attr_reader :list, :name
125
-
125
+
126
126
  def initialize(args)
127
127
  @args = args
128
128
  @db = args[:db]
@@ -132,65 +132,65 @@ class Baza::Driver::Mysql::Tables::Table
132
132
  @indexes_list = Wref_map.new
133
133
  @name = @data[:Name].to_sym
134
134
  @tables = args[:tables]
135
-
135
+
136
136
  raise "Could not figure out name from: '#{@data}'." if @data[:Name].to_s.strip.length <= 0
137
137
  end
138
-
138
+
139
139
  def reload
140
140
  @data = @db.q("SHOW TABLE STATUS WHERE `Name` = '#{@db.esc(self.name)}'").fetch
141
141
  end
142
-
142
+
143
143
  #Used to validate in Knj::Wrap_map.
144
144
  def __object_unique_id__
145
145
  return @data[:Name]
146
146
  end
147
-
147
+
148
148
  def drop
149
149
  raise "Cant drop native table: '#{self.name}'." if self.native?
150
150
  @db.query("DROP TABLE `#{@db.esc_table(self.name)}`")
151
151
  @tables.__send__(:remove_from_list, self)
152
152
  return nil
153
153
  end
154
-
154
+
155
155
  #Returns true if the table is safe to drop.
156
156
  def native?
157
157
  return true if @db.q("SELECT DATABASE() AS db").fetch[:db] == "mysql"
158
158
  return false
159
159
  end
160
-
160
+
161
161
  def optimize
162
162
  @db.query("OPTIMIZE TABLE `#{@db.esc_table(self.name)}`")
163
163
  return self
164
164
  end
165
-
165
+
166
166
  def rows_count
167
167
  return @db.q("SELECT COUNT(*) AS count FROM `#{@db.esc_table(self.name)}`").fetch[:count].to_i
168
168
  end
169
-
169
+
170
170
  def column(name)
171
171
  name = name.to_sym
172
-
172
+
173
173
  if col = @list.get!(name)
174
174
  return @list[name]
175
175
  end
176
-
176
+
177
177
  self.columns(:name => name) do |col|
178
178
  return col if col.name == name
179
179
  end
180
-
180
+
181
181
  raise Errno::ENOENT, "Column not found: '#{name}'."
182
182
  end
183
-
183
+
184
184
  def columns(args = nil)
185
185
  @db.cols
186
186
  ret = {}
187
187
  sql = "SHOW FULL COLUMNS FROM `#{@db.esc_table(self.name)}`"
188
188
  sql << " WHERE `Field` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
189
-
189
+
190
190
  @db.q(sql) do |d_cols|
191
191
  name = d_cols[:Field].to_sym
192
192
  obj = @list.get!(name)
193
-
193
+
194
194
  if !obj
195
195
  obj = Baza::Driver::Mysql::Columns::Column.new(
196
196
  :table_name => self.name,
@@ -199,71 +199,70 @@ class Baza::Driver::Mysql::Tables::Table
199
199
  )
200
200
  @list[name] = obj
201
201
  end
202
-
202
+
203
203
  if block_given?
204
204
  yield(obj)
205
205
  else
206
206
  ret[name] = obj
207
207
  end
208
208
  end
209
-
209
+
210
210
  if block_given?
211
211
  return nil
212
212
  else
213
213
  return ret
214
214
  end
215
215
  end
216
-
217
- def indexes(args = nil)
216
+
217
+ def indexes args = nil
218
218
  @db.indexes
219
219
  ret = {}
220
-
221
- sql = "SHOW INDEX FROM `#{@db.esc_table(self.name)}`"
222
- sql << " WHERE `Key_name` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
223
-
220
+
221
+ sql = "SHOW INDEX FROM `#{@db.esc_table(name)}`"
222
+ sql << " WHERE `Key_name` = '#{@db.esc(args[:name])}'" if args && args.key?(:name)
223
+
224
224
  @db.q(sql) do |d_indexes|
225
225
  next if d_indexes[:Key_name] == "PRIMARY"
226
-
227
226
  obj = @indexes_list.get!(d_indexes[:Key_name].to_s)
228
-
229
- if !obj
227
+
228
+ unless obj
230
229
  obj = Baza::Driver::Mysql::Indexes::Index.new(
231
- :table_name => self.name,
232
- :db => @db,
233
- :data => d_indexes
230
+ table_name: name,
231
+ db: @db,
232
+ data: d_indexes
234
233
  )
235
234
  obj.columns << d_indexes[:Column_name]
236
235
  @indexes_list[d_indexes[:Key_name].to_s] = obj
237
236
  end
238
-
237
+
239
238
  if block_given?
240
- yield(obj)
239
+ yield obj
241
240
  else
242
241
  ret[d_indexes[:Key_name].to_s] = obj
243
242
  end
244
243
  end
245
-
244
+
246
245
  if block_given?
247
246
  return nil
248
247
  else
249
248
  return ret
250
249
  end
251
250
  end
252
-
251
+
253
252
  def index(name)
254
253
  name = name.to_s
255
-
254
+
256
255
  if index = @indexes_list.get!(name)
257
256
  return index
258
257
  end
259
-
258
+
260
259
  self.indexes(:name => name) do |index|
261
260
  return index if index.name.to_s == name
262
261
  end
263
-
262
+
264
263
  raise Errno::ENOENT, "Index not found: #{name}."
265
264
  end
266
-
265
+
267
266
  def create_columns(col_arr)
268
267
  @db.transaction do
269
268
  col_arr.each do |col_data|
@@ -272,35 +271,35 @@ class Baza::Driver::Mysql::Tables::Table
272
271
  end
273
272
  end
274
273
  end
275
-
274
+
276
275
  def create_indexes(index_arr, args = {})
277
276
  return Baza::Driver::Mysql::Tables::Table.create_indexes(index_arr, args.merge(:table_name => self.name, :db => @db))
278
277
  end
279
-
278
+
280
279
  def self.create_indexes(index_arr, args = {})
281
280
  db = args[:db]
282
-
281
+
283
282
  if args[:return_sql]
284
283
  sql = ""
285
284
  first = true
286
285
  end
287
-
286
+
288
287
  index_arr.each do |index_data|
289
288
  if !args[:return_sql]
290
289
  sql = ""
291
290
  end
292
-
291
+
293
292
  if args[:create] or !args.key?(:create)
294
293
  sql << "CREATE"
295
294
  end
296
-
295
+
297
296
  if index_data.is_a?(String) or index_data.is_a?(Symbol)
298
297
  index_data = {:name => index_data, :columns => [index_data]}
299
298
  end
300
-
299
+
301
300
  raise "No name was given: '#{index_data}'." if !index_data.key?(:name) or index_data[:name].to_s.strip.empty?
302
301
  raise "No columns was given on index: '#{index_data[:name]}'." if !index_data[:columns] or index_data[:columns].empty?
303
-
302
+
304
303
  if args[:return_sql]
305
304
  if first
306
305
  first = false
@@ -308,167 +307,176 @@ class Baza::Driver::Mysql::Tables::Table
308
307
  sql << ", "
309
308
  end
310
309
  end
311
-
310
+
312
311
  sql << " UNIQUE" if index_data[:unique]
313
312
  sql << " INDEX `#{db.esc_col(index_data[:name])}`"
314
-
313
+
315
314
  if args[:on_table] or !args.key?(:on_table)
316
315
  sql << " ON `#{db.esc_table(args[:table_name])}`"
317
316
  end
318
-
317
+
319
318
  sql << " ("
320
-
319
+
321
320
  first = true
322
321
  index_data[:columns].each do |col_name|
323
322
  sql << ", " if !first
324
323
  first = false if first
325
-
324
+
326
325
  sql << "`#{db.esc_col(col_name)}`"
327
326
  end
328
-
327
+
329
328
  sql << ")"
330
-
329
+
331
330
  if !args[:return_sql]
332
331
  db.query(sql)
333
332
  end
334
333
  end
335
-
334
+
336
335
  if args[:return_sql]
337
336
  return sql
338
337
  else
339
338
  return nil
340
339
  end
341
340
  end
342
-
341
+
343
342
  def rename(newname)
344
343
  newname = newname.to_sym
345
344
  oldname = self.name
346
-
345
+
347
346
  @tables.__send__(:remove_from_list, self)
348
347
  @db.query("ALTER TABLE `#{@db.esc_table(oldname)}` RENAME TO `#{@db.esc_table(newname)}`")
349
-
348
+
350
349
  @data[:Name] = newname
351
350
  @name = newname
352
351
  @tables.__send__(:add_to_list, self)
352
+
353
+ @list.each do |name, column|
354
+ column.instance_variable_set(:@name, newname)
355
+ column.args[:Field] = newname
356
+ end
357
+
358
+ @indexes_list.each do |name, index|
359
+ index.args[:table_name] = newname
360
+ end
353
361
  end
354
-
362
+
355
363
  def truncate
356
364
  @db.query("TRUNCATE `#{@db.esc_table(self.name)}`")
357
365
  return self
358
366
  end
359
-
367
+
360
368
  def data
361
369
  ret = {
362
370
  :name => self.name,
363
371
  :columns => [],
364
372
  :indexes => []
365
373
  }
366
-
374
+
367
375
  columns.each do |name, column|
368
376
  ret[:columns] << column.data
369
377
  end
370
-
378
+
371
379
  indexes.each do |name, index|
372
380
  ret[:indexes] << index.data if name != "PRIMARY"
373
381
  end
374
-
382
+
375
383
  return ret
376
384
  end
377
-
385
+
378
386
  def insert(data)
379
387
  @db.insert(self.name, data)
380
388
  end
381
-
389
+
382
390
  def clone(newname, args = {})
383
391
  raise "Invalid name." if newname.to_s.strip.empty?
384
-
392
+
385
393
  sql = "CREATE TABLE `#{@db.esc_table(newname)}` ("
386
394
  first = true
387
395
  pkey_found = false
388
396
  pkeys = []
389
-
390
- self.columns do |col|
397
+
398
+ columns do |col|
391
399
  sql << ", " if !first
392
400
  first = false if first
393
-
401
+
394
402
  col_data = col.data
395
403
  pkey_found = true if !pkey_found and col_data[:primarykey] and args[:force_single_pkey]
396
-
404
+
397
405
  if args[:no_pkey] or (pkey_found and col_data[:primarykey] and args[:force_single_pkey])
398
- col_data[:primarykey] = false
399
- end
400
-
401
- if col_data[:primarykey]
402
- pkeys << col_data[:name]
403
- col_data.delete(:primarykey)
404
- end
405
-
406
- if args[:all_cols_storage]
407
- col_data[:storage] = args[:all_cols_storage]
408
- end
409
-
406
+ col_data[:primarykey] = false
407
+ end
408
+
409
+ if col_data[:primarykey]
410
+ pkeys << col_data[:name]
411
+ col_data.delete(:primarykey)
412
+ end
413
+
414
+ if args[:all_cols_storage]
415
+ col_data[:storage] = args[:all_cols_storage]
416
+ end
417
+
410
418
  sql << @db.cols.data_sql(col_data)
411
419
  end
412
-
413
- if !pkeys.empty?
414
- sql << ", PRIMARY KEY ("
415
-
416
- first = true
417
- pkeys.each do |pkey|
418
- sql << ", " if !first
419
- first = false if first
420
- sql << "`#{@db.esc_col(pkey)}`"
421
- end
422
-
423
- sql << ")"
420
+
421
+ unless pkeys.empty?
422
+ sql << ", PRIMARY KEY ("
423
+
424
+ first = true
425
+ pkeys.each do |pkey|
426
+ sql << ", " if !first
427
+ first = false if first
428
+ sql << "`#{@db.esc_col(pkey)}`"
429
+ end
430
+
431
+ sql << ")"
424
432
  end
425
-
433
+
426
434
  sql << ")"
427
435
  sql << " TABLESPACE #{args[:tablespace]}" if args[:tablespace]
428
436
  sql << " ENGINE=#{args[:engine]}" if args[:engine]
429
437
  sql << ";"
430
-
438
+
431
439
  #Create table.
432
440
  @db.query(sql)
433
-
434
-
441
+
442
+
435
443
  #Insert data of previous data in a single query.
436
444
  @db.query("INSERT INTO `#{@db.esc_table(newname)}` SELECT * FROM `#{@db.esc_table(self.name)}`")
437
-
438
-
445
+
446
+
439
447
  #Create indexes.
440
448
  new_table = @db.tables[newname]
441
449
  indexes_list = []
442
- self.indexes do |index|
443
- indexes_list << index.data if !index.primary?
450
+ indexes do |index|
451
+ indexes_list << index.data unless index.primary?
444
452
  end
445
-
453
+
446
454
  new_table.create_indexes(indexes_list)
447
-
448
-
455
+
456
+
449
457
  #Return new table.
450
458
  return new_table
451
459
  end
452
-
460
+
453
461
  #Returns the current engine of the table.
454
462
  def engine
455
463
  return @data[:Engine]
456
464
  end
457
-
465
+
458
466
  #Changes the engine for a table.
459
467
  def engine=(newengine)
460
- raise "Invalid engine: '#{newengine}'." if !newengine.to_s.match(/^[A-z]+$/)
461
- @db.query("ALTER TABLE `#{@db.esc_table(self.name)}` ENGINE = #{newengine}") if self.engine.to_s != newengine.to_s
462
- @data[:Engine] = newengine
468
+ raise "Invalid engine: '#{newengine}'." if !newengine.to_s.match(/^[A-z]+$/)
469
+ @db.query("ALTER TABLE `#{@db.esc_table(self.name)}` ENGINE = #{newengine}") if self.engine.to_s != newengine.to_s
470
+ @data[:Engine] = newengine
463
471
  end
464
-
472
+
465
473
  private
466
-
474
+
467
475
  def remove_column_from_list(col)
468
476
  raise "Column not found: '#{col.name}'." if !@list.key?(col.name)
469
477
  @list.delete(col.name)
470
478
  end
471
-
479
+
472
480
  def add_column_to_list(col)
473
481
  raise "Column already exists: '#{col.name}'." if @list.key?(col.name)
474
482
  @list[col.name] = col
@@ -5,25 +5,53 @@ class Baza::Driver::Sqlite3::Indexes
5
5
  end
6
6
 
7
7
  class Baza::Driver::Sqlite3::Indexes::Index
8
- attr_reader :columns
9
-
8
+ attr_reader :args, :columns
9
+
10
10
  def initialize(args)
11
11
  @args = args
12
12
  @columns = []
13
+ @db = args[:db]
13
14
  end
14
-
15
+
15
16
  def name
16
17
  return @args[:data][:name]
17
18
  end
18
-
19
+
20
+ def table_name
21
+ return @args[:table_name]
22
+ end
23
+
24
+ def table
25
+ return @db.tables[table_name]
26
+ end
27
+
19
28
  def drop
20
- @args[:db].query("DROP INDEX `#{self.name}`")
29
+ @db.query("DROP INDEX `#{name}`")
21
30
  end
22
-
31
+
32
+ def rename newname
33
+ newname = newname.to_sym
34
+
35
+ create_args = data
36
+ create_args[:name] = newname
37
+
38
+ drop
39
+ table.create_indexes([create_args])
40
+ @args[:data][:name] = newname
41
+ end
42
+
23
43
  def data
24
44
  return {
25
- :name => name,
26
- :columns => @columns
45
+ name: name,
46
+ columns: @columns
27
47
  }
28
48
  end
29
- end
49
+
50
+ def column_names
51
+ @columns
52
+ end
53
+
54
+ def to_s
55
+ "#<Baza::Driver::Sqlite3::Index name: \"#{name}\", columns: #{@columns}>"
56
+ end
57
+ end