Class: KnjDB_mysql::Tables::Table

Inherits:
Object
  • Object
show all
Defined in:
lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Table

Returns a new instance of Table.



110
111
112
113
114
115
116
117
118
119
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 110

def initialize(args)
  @args = args
  @db = args[:db]
  @data = args[:data]
  @subtype = @db.opts[:subtype]
  @list = Wref_map.new
  @indexes_list = Wref_map.new
  
  raise "Could not figure out name from: '#{@data}'." if @data[:Name].to_s.strip.length <= 0
end

Instance Attribute Details

#listObject (readonly)

Returns the value of attribute list.



108
109
110
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 108

def list
  @list
end

Class Method Details

.create_indexes(index_arr, args = {}) ⇒ Object



261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 261

def self.create_indexes(index_arr, args = {})
  db = args[:db]
  
  if args[:return_sql]
    sql = ""
    first = true
  end
  
  index_arr.each do |index_data|
    if !args[:return_sql]
      sql = ""
    end
    
    if args[:create] or !args.key?(:create)
      sql << "CREATE"
    end
    
    if index_data.is_a?(String)
      index_data = {"name" => index_data, "columns" => [index_data]}
    end
    
    raise "No name was given." if !index_data.key?("name") or index_data["name"].strip.length <= 0
    raise "No columns was given on index: '#{index_data["name"]}'." if !index_data["columns"] or index_data["columns"].empty?
    
    if args[:return_sql]
      if first
        first = false
      else
        sql << ", "
      end
    end
    
    sql << " UNIQUE" if index_data["unique"]
    sql << " INDEX `#{db.esc_col(index_data["name"])}`"
    
    if args[:on_table] or !args.key?(:on_table)
      sql << " ON `#{db.esc_table(args[:table_name])}`"
    end
    
    sql << " ("
    
    first = true
    index_data["columns"].each do |col_name|
      sql << ", " if !first
      first = false if first
      
      sql << "`#{db.esc_col(col_name)}`"
    end
    
    sql << ")"
    
    if !args[:return_sql]
      db.query(sql)
    end
  end
  
  if args[:return_sql]
    return sql
  else
    return nil
  end
end

Instance Method Details

#__object_unique_id__Object

Used to validate in Knj::Wrap_map.



126
127
128
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 126

def __object_unique_id__
  return @data[:Name]
end

#clone(newname, args = {}) ⇒ Object



364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 364

def clone(newname, args = {})
  raise "Invalid name." if newname.to_s.strip.empty?
  
  sql = "CREATE TABLE `#{@db.esc_table(newname)}` ("
  first = true
  pkey_found = false
  pkeys = []
  
  self.columns do |col|
    sql << ", " if !first
    first = false if first
    
    col_data = col.data
    pkey_found = true if !pkey_found and col_data["primarykey"] and args[:force_single_pkey]
    
    if args[:no_pkey] or (pkey_found and col_data["primarykey"] and args[:force_single_pkey])
		col_data["primarykey"] = false
	end
	
	if col_data["primarykey"]
		pkeys << col_data["name"]
		col_data.delete("primarykey")
	end
	
	if args[:all_cols_storage]
		col_data["storage"] = args[:all_cols_storage]
	end
	
    sql << @db.cols.data_sql(col_data)
  end
  
  if !pkeys.empty?
	sql << ", PRIMARY KEY ("
	
	first = true
	pkeys.each do |pkey|
		sql << ", " if !first
		first = false if first
		sql << "`#{@db.esc_col(pkey)}`"
	end
	
	sql << ")"
  end
  
  sql << ")"
  sql << " TABLESPACE #{args[:tablespace]}" if args[:tablespace]
  sql << " ENGINE=#{args[:engine]}" if args[:engine]
  sql << ";"
  
  puts sql
  
  #Create table.
  @db.query(sql)
  
  
  #Insert data of previous data in a single query.
  @db.query("INSERT INTO `#{newname}` SELECT * FROM `#{self.name}`")
  
  
  #Create indexes.
  new_table = @db.tables[newname]
  indexes_list = []
  self.indexes do |index|
	indexes_list << index.data if !index.primary?
  end
  
  new_table.create_indexes(indexes_list)
  
  
  #Return new table.
  return new_table
end

#column(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 154

def column(name)
  name = name.to_s
  
  if col = @list.get!(name)
    return @list[name]
  end
  
  self.columns(:name => name) do |col|
    return col if col.name == name
  end
  
  raise Errno::ENOENT, "Column not found: '#{name}'."
end

#columns(args = nil) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 168

def columns(args = nil)
  @db.cols
  ret = {}
  sql = "SHOW FULL COLUMNS FROM `#{self.name}`"
  sql << " WHERE `Field` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
  
  @db.q(sql) do |d_cols|
    obj = @list.get!(d_cols[:Field].to_s)
    
    if !obj
      obj = KnjDB_mysql::Columns::Column.new(
        :table_name => self.name,
        :db => @db,
        :data => d_cols
      )
      @list[d_cols[:Field].to_s] = obj
    end
    
    if block_given?
      yield(obj)
    else
      ret[d_cols[:Field].to_s] = obj
    end
  end
  
  if block_given?
    return nil
  else
    return ret
  end
end

#create_columns(col_arr) ⇒ Object



250
251
252
253
254
255
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 250

def create_columns(col_arr)
  col_arr.each do |col_data|
    sql = "ALTER TABLE `#{self.name}` ADD COLUMN #{@db.cols.data_sql(col_data)};"
    @db.query(sql)
  end
end

#create_indexes(index_arr, args = {}) ⇒ Object



257
258
259
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 257

def create_indexes(index_arr, args = {})
  return KnjDB_mysql::Tables::Table.create_indexes(index_arr, args.merge(:table_name => self.name, :db => @db))
end

#dataObject



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 337

def data
  ret = {
    "name" => self.name,
    "columns" => [],
    "indexes" => []
  }
  
  columns.each do |name, column|
    ret["columns"] << column.data
  end
  
  indexes.each do |name, index|
    ret["indexes"] << index.data if name != "PRIMARY"
  end
  
  return ret
end

#dropObject



134
135
136
137
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 134

def drop
  raise "Cant drop native table: '#{self.name}'." if self.native?
  @db.query("DROP TABLE `#{self.name}`")
end

#engineObject

Returns the current engine of the table.



360
361
362
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 360

def engine
return @data[:Engine]
end

#engine=(newengine) ⇒ Object

Changes the engine for a table.



438
439
440
441
442
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 438

def engine=(newengine)
raise "Invalid engine: '#{newengine}'." if !newengine.to_s.match(/^[A-z]+$/)
@db.query("ALTER TABLE `#{@db.esc_table(self.name)}` ENGINE = #{newengine}") if self.engine.to_s != newengine.to_s
@data[:Engine] = newengine
end

#index(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 236

def index(name)
  name = name.to_s
  
  if index = @indexes_list.get!(name)
    return index
  end
  
  self.indexes(:name => name) do |index|
    return index if index.name.to_s == name
  end
  
  raise Errno::ENOENT, "Index not found: #{name}."
end

#indexes(args = nil) ⇒ Object



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 200

def indexes(args = nil)
  @db.indexes
  ret = {}
  
  sql = "SHOW INDEX FROM `#{self.name}`"
  sql << " WHERE `Key_name` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
  
  @db.q(sql) do |d_indexes|
    next if d_indexes[:Key_name] == "PRIMARY"
    
    obj = @indexes_list.get!(d_indexes[:Key_name].to_s)
    
    if !obj
      obj = KnjDB_mysql::Indexes::Index.new(
        :table_name => self.name,
        :db => @db,
        :data => d_indexes
      )
      obj.columns << d_indexes[:Column_name]
      @indexes_list[d_indexes[:Key_name].to_s] = obj
    end
    
    if block_given?
      yield(obj)
    else
      ret[d_indexes[:Key_name].to_s] = obj
    end
  end
  
  if block_given?
    return nil
  else
    return ret
  end
end

#insert(data) ⇒ Object



355
356
357
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 355

def insert(data)
  @db.insert(self.name, data)
end

#nameObject



130
131
132
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 130

def name
  return @data[:Name]
end

#native?Boolean

Returns true if the table is safe to drop.

Returns:

  • (Boolean)


140
141
142
143
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 140

def native?
  return true if @db.q("SELECT DATABASE() AS db").fetch[:db] == "mysql"
  return false
end

#optimizeObject



145
146
147
148
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 145

def optimize
  @db.query("OPTIMIZE TABLE `#{self.name}`")
  return self
end

#reloadObject



121
122
123
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 121

def reload
  @data = @db.q("SHOW TABLE STATUS WHERE `Name` = '#{@db.esc(self.name)}'").fetch
end

#rename(newname) ⇒ Object



324
325
326
327
328
329
330
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 324

def rename(newname)
  oldname = self.name
  @db.query("ALTER TABLE `#{oldname}` RENAME TO `#{newname}`")
  @db.tables.list[newname] = self
  @db.tables.list.delete(oldname)
  @data[:Name] = newname
end

#rows_countObject



150
151
152
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 150

def rows_count
  return @data[:Rows].to_i
end

#truncateObject



332
333
334
335
# File 'lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb', line 332

def truncate
  @db.query("TRUNCATE `#{self.name}`")
  return self
end