Class: KnjDB_sqlite3::Tables::Table

Inherits:
Object
  • Object
show all
Defined in:
lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Table

Returns a new instance of Table.



96
97
98
99
100
101
102
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 96

def initialize(args)
  @db = args[:db]
  @data = args[:data]
  
  @list = Wref_map.new
  @indexes_list = Wref_map.new
end

Instance Method Details

#clone(newname) ⇒ Object



229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 229

def clone(newname)
  raise "Invalid name." if newname.to_s.strip.length <= 0
  cols_cur = self.columns
  
  sql = "CREATE TABLE `#{newname}` ("
  first = true
  cols_cur.each do |name, col|
    sql << ", " if !first
    first = false if first
    sql << @db.cols.data_sql(col.data)
  end
  
  sql << ");"
  @db.query(sql)
  
  sql = "INSERT INTO `#{newname}` SELECT * FROM `#{self.name}`"
  @db.query(sql)
  return @db.tables[newname]
end

#column(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


146
147
148
149
150
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 146

def column(name)
  list = self.columns
  return list[name] if list[name]
  raise Errno::ENOENT.new("Column not found: #{name}.")
end

#columnsObject



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 152

def columns
  @db.cols
  ret = {}
  
  @db.q("PRAGMA table_info(`#{@db.esc_table(self.name)}`)") do |d_cols|
    obj = @list.get!(d_cols[:name])
    
    if !obj
      obj = KnjDB_sqlite3::Columns::Column.new(
        :table_name => self.name,
        :db => @db,
        :data => d_cols
      )
      @list[d_cols[:name]] = obj
    end
    
    if block_given?
      yield(obj)
    else
      ret[d_cols[:name]] = obj
    end
  end
  
  if block_given?
    return nil
  else
    return ret
  end
end

#copy(args = {}) ⇒ Object



249
250
251
252
253
254
255
256
257
258
259
260
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
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 249

def copy(args = {})
  temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
  cloned_tabled = self.clone(temp_name)
  cols_cur = self.columns
  @db.query("DROP TABLE `#{self.name}`")
  
  sql = "CREATE TABLE `#{self.name}` ("
  first = true
  cols_cur.each do |name, col|
    next if args["drops"] and args["drops"].index(name) != nil
    
    sql << ", " if !first
    first = false if first
    
    if args.key?("alter_columns") and args["alter_columns"][name.to_s]
      sql << @db.cols.data_sql(args["alter_columns"][name.to_s])
    else
      sql << @db.cols.data_sql(col.data)
    end
    
    if args["new"]
      args["new"].each do |col_data|
        if col_data["after"] and col_data["after"] == name
          sql << ", #{@db.cols.data_sql(col_data)}"
        end
      end
    end
  end
  sql << ");"
  @db.query(sql)
  
  sql = "INSERT INTO `#{self.name}` SELECT "
  first = true
  cols_cur.each do |name, col|
    next if args["drops"] and args["drops"].index(name) != nil
    
    sql << ", " if !first
    first = false if first
    
    sql << "`#{name}`"
    
    if args["news"]
      args["news"].each do |col_data|
        if col_data["after"] and col_data["after"] == name
          sql << ", ''"
        end
      end
    end
  end
  
  sql << " FROM `#{temp_name}`"
  @db.query(sql)
  @db.query("DROP TABLE `#{temp_name}`")
end

#create_column_programmatic(col_data) ⇒ Object



192
193
194
195
196
197
198
199
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
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 192

def create_column_programmatic(col_data)
  temp_name = "temptable_#{Time.now.to_f.to_s.hash}"
  cloned_tabled = self.clone(temp_name)
  cols_cur = self.columns
  @db.query("DROP TABLE `#{self.name}`")
  
  sql = "CREATE TABLE `#{self.name}` ("
  first = true
  cols_cur.each do |name, col|
    sql << ", " if !first
    first = false if first
    sql << @db.cols.data_sql(col.data)
    
    if col_data["after"] and col_data["after"] == name
      sql << ", #{@db.cols.data_sql(col_data)}"
    end
  end
  sql << ");"
  @db.query(sql)
  
  sql = "INSERT INTO `#{self.name}` SELECT "
  first = true
  cols_cur.each do |name, col|
    sql << ", " if !first
    first = false if first
    
    sql << "`#{name}`"
    
    if col_data["after"] and col_data["after"] == name
      sql << ", ''"
    end
  end
  sql << " FROM `#{temp_name}`"
  @db.query(sql)
  @db.query("DROP TABLE `#{temp_name}`")
end

#create_columns(col_arr) ⇒ Object



182
183
184
185
186
187
188
189
190
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 182

def create_columns(col_arr)
  col_arr.each do |col_data|
    #if col_data.key?("after")
    #  self.create_column_programmatic(col_data)
    #else
      @db.query("ALTER TABLE `#{self.name}` ADD COLUMN #{@db.cols.data_sql(col_data)};")
    #end
  end
end

#create_indexes(index_arr, args = nil) ⇒ Object



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
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 375

def create_indexes(index_arr, args = nil)
  if args and args[:return_sql]
    ret = []
  end
  
  index_arr.each do |index_data|
    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"].empty?
    
    name = index_data["name"]
    name = "#{self.name}__#{name}" if @db.opts[:index_append_table_name]
    
    sql = "CREATE INDEX '#{@db.esc_col(name)}' ON `#{@db.esc_table(self.name)}` ("
    
    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 and args[:return_sql]
      ret << sql
    else
      @db.query(sql)
    end
  end
  
  if args and args[:return_sql]
    return ret
  else
    return nil
  end
end

#dataObject



417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 417

def data
  ret = {
    "name" => 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

Drops the table from the database.



117
118
119
120
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 117

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

#index(name) ⇒ Object

Raises:

  • (Errno::ENOENT)


304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 304

def index(name)
  name = name.to_s
  
  begin
    return @indexes_list[name]
  rescue Wref::Recycled
    if @db.opts[:index_append_table_name]
      tryname = "#{self.name}__#{name}"
      
      begin
        return @indexes_list[tryname]
      rescue Wref::Recycled
        #ignore.
      end
    else
      #ignore
    end
  end
  
  self.indexes do |index|
    return index if index.name.to_s == name
  end
  
  raise Errno::ENOENT.new("Index not found: #{name}.")
end

#indexesObject



330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 330

def indexes
  @db.indexes
  ret = {} unless block_given?
  
  @db.q("PRAGMA index_list(`#{@db.esc_table(self.name)}`)") do |d_indexes|
    next if d_indexes[:Key_name] == "PRIMARY"
    
    obj = @indexes_list.get!(d_indexes[:name])
    
    if !obj
      if @db.opts[:index_append_table_name]
        match_name = d_indexes[:name].match(/__(.+)$/)
        
        if match_name
          name = match_name[1]
        else
          name = d_indexes[:name]
        end
      else
        name = d_indexes[:name]
      end
      
      obj = KnjDB_sqlite3::Indexes::Index.new(
        :table_name => self.name,
        :db => @db,
        :data => d_indexes
      )
      obj.columns << name
      @indexes_list[d_indexes[:name]] = obj
    end
    
    if block_given?
      yield(obj)
    else
      ret[d_indexes[:name]] = obj
    end
  end
  
  if block_given?
    return nil
  else
    return ret
  end
end

#insert(data) ⇒ Object



435
436
437
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 435

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

#maxlengthObject



112
113
114
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 112

def maxlength
  return @data[:maxlength]
end

#nameObject



104
105
106
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 104

def name
  return @data[:name]
end

#native?Boolean

Returns true if the table is safe to drop.

Returns:

  • (Boolean)


123
124
125
126
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 123

def native?
  return true if self.name.to_s == "sqlite_sequence"
  return false
end

#optimizeObject



128
129
130
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 128

def optimize
  raise "stub!"
end

#rename(newname) ⇒ Object



132
133
134
135
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 132

def rename(newname)
  self.clone(newname)
  self.drop
end

#tableObject



142
143
144
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 142

def table
  return @db.tables[@table_name]
end

#truncateObject



137
138
139
140
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 137

def truncate
  @db.query("DELETE FROM `#{self.name}` WHERE 1=1")
  return nil
end

#typeObject



108
109
110
# File 'lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb', line 108

def type
  return @data[:type]
end