baza 0.0.14 → 0.0.15

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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +58 -13
  3. data/VERSION +1 -1
  4. data/baza.gemspec +15 -3
  5. data/include/db.rb +871 -865
  6. data/include/drivers/mysql/mysql.rb +104 -297
  7. data/include/drivers/mysql/mysql_column.rb +133 -0
  8. data/include/drivers/mysql/mysql_columns.rb +4 -127
  9. data/include/drivers/mysql/mysql_index.rb +76 -0
  10. data/include/drivers/mysql/mysql_indexes.rb +0 -73
  11. data/include/drivers/mysql/mysql_result.rb +42 -0
  12. data/include/drivers/mysql/mysql_result_java.rb +61 -0
  13. data/include/drivers/mysql/mysql_result_mysql2.rb +26 -0
  14. data/include/drivers/mysql/mysql_result_unbuffered.rb +72 -0
  15. data/include/drivers/mysql/mysql_sqlspecs.rb +1 -1
  16. data/include/drivers/mysql/mysql_table.rb +361 -0
  17. data/include/drivers/mysql/mysql_tables.rb +23 -381
  18. data/include/drivers/sqlite3/libknjdb_java_sqlite3.rb +17 -22
  19. data/include/drivers/sqlite3/libknjdb_sqlite3_ironruby.rb +13 -13
  20. data/include/drivers/sqlite3/sqlite3.rb +39 -105
  21. data/include/drivers/sqlite3/sqlite3_column.rb +146 -0
  22. data/include/drivers/sqlite3/sqlite3_columns.rb +17 -149
  23. data/include/drivers/sqlite3/sqlite3_index.rb +55 -0
  24. data/include/drivers/sqlite3/sqlite3_indexes.rb +0 -52
  25. data/include/drivers/sqlite3/sqlite3_result.rb +35 -0
  26. data/include/drivers/sqlite3/sqlite3_result_java.rb +39 -0
  27. data/include/drivers/sqlite3/sqlite3_table.rb +399 -0
  28. data/include/drivers/sqlite3/sqlite3_tables.rb +7 -403
  29. data/include/idquery.rb +19 -19
  30. data/include/model.rb +139 -139
  31. data/include/model_handler_sqlhelper.rb +74 -74
  32. data/spec/support/driver_columns_collection.rb +17 -0
  33. metadata +14 -2
@@ -29,11 +29,16 @@ class Baza::Driver::Mysql::Tables
29
29
  #ignore.
30
30
  end
31
31
 
32
- self.list(:name => table_name) do |table_obj|
32
+ tables = []
33
+ list(name: table_name) do |table_obj|
33
34
  return table_obj if table_obj.name == table_name
34
35
  end
35
36
 
36
- raise Errno::ENOENT, "Table was not found: #{table_name}."
37
+ list do |table_obj|
38
+ tables << table_obj.name
39
+ end
40
+
41
+ raise Errno::ENOENT, "Table was not found: '#{table_name}' (#{table_name.class.name}) (tables: #{tables})."
37
42
  end
38
43
 
39
44
  #Yields the tables of the current database.
@@ -50,10 +55,10 @@ class Baza::Driver::Mysql::Tables
50
55
  obj = @list.get!(name)
51
56
 
52
57
  if !obj
53
- obj = Baza::Driver::Mysql::Tables::Table.new(
54
- :db => @db,
55
- :data => d_tables,
56
- :tables => self
58
+ obj = Baza::Driver::Mysql::Table.new(
59
+ db: @db,
60
+ data: d_tables,
61
+ tables: self
57
62
  )
58
63
  @list[name] = obj
59
64
  end
@@ -76,7 +81,7 @@ class Baza::Driver::Mysql::Tables
76
81
  CREATE_ALLOWED_KEYS = [:columns, :indexes, :temp, :return_sql]
77
82
  #Creates a new table by the given name and data.
78
83
  def create(name, data, args = nil)
79
- raise "No columns was given for '#{name}'." if !data[:columns] or data[:columns].empty?
84
+ raise "No columns was given for '#{name}'." if !data[:columns] || data[:columns].empty?
80
85
 
81
86
  sql = "CREATE"
82
87
  sql << " TEMPORARY" if data[:temp]
@@ -84,401 +89,38 @@ class Baza::Driver::Mysql::Tables
84
89
 
85
90
  first = true
86
91
  data[:columns].each do |col_data|
87
- sql << ", " if !first
92
+ sql << ", " unless first
88
93
  first = false if first
89
94
  col_data.delete(:after) if col_data[:after]
90
95
  sql << @db.cols.data_sql(col_data)
91
96
  end
92
97
 
93
- if data[:indexes] and !data[:indexes].empty?
98
+ if data[:indexes] && !data[:indexes].empty?
94
99
  sql << ", "
95
- sql << Baza::Driver::Mysql::Tables::Table.create_indexes(data[:indexes], {
96
- :db => @db,
97
- :return_sql => true,
98
- :create => false,
99
- :on_table => false,
100
- :table_name => name
100
+ sql << Baza::Driver::Mysql::Table.create_indexes(data[:indexes], {
101
+ db: @db,
102
+ return_sql: true,
103
+ create: false,
104
+ on_table: false,
105
+ table_name: name
101
106
  })
102
107
  end
103
108
 
104
109
  sql << ")"
105
110
 
106
- return [sql] if args and args[:return_sql]
111
+ return [sql] if args && args[:return_sql]
107
112
  @db.query(sql)
108
113
  end
109
114
 
110
115
  private
111
116
 
112
117
  def add_to_list(table)
113
- raise "Already exists: '#{table.name}'." if @list.key?(table.name) and @list[table.name].__id__ != table.__id__
118
+ raise "Already exists: '#{table.name}'." if @list.key?(table.name) && @list[table.name].__id__ != table.__id__
114
119
  @list[table.name] = table
115
120
  end
116
121
 
117
122
  def remove_from_list(table)
118
- raise "Table not in list: '#{table.name}'." if !@list.key?(table.name)
123
+ raise "Table not in list: '#{table.name}'." unless @list.key?(table.name)
119
124
  @list.delete(table.name)
120
125
  end
121
126
  end
122
-
123
- class Baza::Driver::Mysql::Tables::Table
124
- attr_reader :list, :name
125
-
126
- def initialize(args)
127
- @args = args
128
- @db = args[:db]
129
- @data = args[:data]
130
- @subtype = @db.opts[:subtype]
131
- @list = Wref_map.new
132
- @indexes_list = Wref_map.new
133
- @name = @data[:Name].to_sym
134
- @tables = args[:tables]
135
-
136
- raise "Could not figure out name from: '#{@data}'." if @data[:Name].to_s.strip.length <= 0
137
- end
138
-
139
- def reload
140
- @data = @db.q("SHOW TABLE STATUS WHERE `Name` = '#{@db.esc(self.name)}'").fetch
141
- end
142
-
143
- #Used to validate in Knj::Wrap_map.
144
- def __object_unique_id__
145
- return @data[:Name]
146
- end
147
-
148
- def drop
149
- raise "Cant drop native table: '#{self.name}'." if self.native?
150
- @db.query("DROP TABLE `#{@db.esc_table(self.name)}`")
151
- @tables.__send__(:remove_from_list, self)
152
- return nil
153
- end
154
-
155
- #Returns true if the table is safe to drop.
156
- def native?
157
- return true if @db.q("SELECT DATABASE() AS db").fetch[:db] == "mysql"
158
- return false
159
- end
160
-
161
- def optimize
162
- @db.query("OPTIMIZE TABLE `#{@db.esc_table(self.name)}`")
163
- return self
164
- end
165
-
166
- def rows_count
167
- return @db.q("SELECT COUNT(*) AS count FROM `#{@db.esc_table(self.name)}`").fetch[:count].to_i
168
- end
169
-
170
- def column(name)
171
- name = name.to_sym
172
-
173
- if col = @list.get!(name)
174
- return @list[name]
175
- end
176
-
177
- self.columns(:name => name) do |col|
178
- return col if col.name == name
179
- end
180
-
181
- raise Errno::ENOENT, "Column not found: '#{name}'."
182
- end
183
-
184
- def columns(args = nil)
185
- @db.cols
186
- ret = {}
187
- sql = "SHOW FULL COLUMNS FROM `#{@db.esc_table(self.name)}`"
188
- sql << " WHERE `Field` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
189
-
190
- @db.q(sql) do |d_cols|
191
- name = d_cols[:Field].to_sym
192
- obj = @list.get!(name)
193
-
194
- if !obj
195
- obj = Baza::Driver::Mysql::Columns::Column.new(
196
- :table_name => self.name,
197
- :db => @db,
198
- :data => d_cols
199
- )
200
- @list[name] = obj
201
- end
202
-
203
- if block_given?
204
- yield(obj)
205
- else
206
- ret[name] = obj
207
- end
208
- end
209
-
210
- if block_given?
211
- return nil
212
- else
213
- return ret
214
- end
215
- end
216
-
217
- def indexes args = nil
218
- @db.indexes
219
- ret = {}
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
- @db.q(sql) do |d_indexes|
225
- next if d_indexes[:Key_name] == "PRIMARY"
226
- obj = @indexes_list.get!(d_indexes[:Key_name].to_s)
227
-
228
- unless obj
229
- obj = Baza::Driver::Mysql::Indexes::Index.new(
230
- table_name: name,
231
- db: @db,
232
- data: d_indexes
233
- )
234
- obj.columns << d_indexes[:Column_name]
235
- @indexes_list[d_indexes[:Key_name].to_s] = obj
236
- end
237
-
238
- if block_given?
239
- yield obj
240
- else
241
- ret[d_indexes[:Key_name].to_s] = obj
242
- end
243
- end
244
-
245
- if block_given?
246
- return nil
247
- else
248
- return ret
249
- end
250
- end
251
-
252
- def index(name)
253
- name = name.to_s
254
-
255
- if index = @indexes_list.get!(name)
256
- return index
257
- end
258
-
259
- self.indexes(:name => name) do |index|
260
- return index if index.name.to_s == name
261
- end
262
-
263
- raise Errno::ENOENT, "Index not found: #{name}."
264
- end
265
-
266
- def create_columns(col_arr)
267
- @db.transaction do
268
- col_arr.each do |col_data|
269
- sql = "ALTER TABLE `#{self.name}` ADD COLUMN #{@db.cols.data_sql(col_data)};"
270
- @db.query(sql)
271
- end
272
- end
273
- end
274
-
275
- def create_indexes(index_arr, args = {})
276
- return Baza::Driver::Mysql::Tables::Table.create_indexes(index_arr, args.merge(:table_name => self.name, :db => @db))
277
- end
278
-
279
- def self.create_indexes(index_arr, args = {})
280
- db = args[:db]
281
-
282
- if args[:return_sql]
283
- sql = ""
284
- first = true
285
- end
286
-
287
- index_arr.each do |index_data|
288
- if !args[:return_sql]
289
- sql = ""
290
- end
291
-
292
- if args[:create] or !args.key?(:create)
293
- sql << "CREATE"
294
- end
295
-
296
- if index_data.is_a?(String) or index_data.is_a?(Symbol)
297
- index_data = {:name => index_data, :columns => [index_data]}
298
- end
299
-
300
- raise "No name was given: '#{index_data}'." if !index_data.key?(:name) or index_data[:name].to_s.strip.empty?
301
- raise "No columns was given on index: '#{index_data[:name]}'." if !index_data[:columns] or index_data[:columns].empty?
302
-
303
- if args[:return_sql]
304
- if first
305
- first = false
306
- else
307
- sql << ", "
308
- end
309
- end
310
-
311
- sql << " UNIQUE" if index_data[:unique]
312
- sql << " INDEX `#{db.esc_col(index_data[:name])}`"
313
-
314
- if args[:on_table] or !args.key?(:on_table)
315
- sql << " ON `#{db.esc_table(args[:table_name])}`"
316
- end
317
-
318
- sql << " ("
319
-
320
- first = true
321
- index_data[:columns].each do |col_name|
322
- sql << ", " if !first
323
- first = false if first
324
-
325
- sql << "`#{db.esc_col(col_name)}`"
326
- end
327
-
328
- sql << ")"
329
-
330
- if !args[:return_sql]
331
- db.query(sql)
332
- end
333
- end
334
-
335
- if args[:return_sql]
336
- return sql
337
- else
338
- return nil
339
- end
340
- end
341
-
342
- def rename(newname)
343
- newname = newname.to_sym
344
- oldname = self.name
345
-
346
- @tables.__send__(:remove_from_list, self)
347
- @db.query("ALTER TABLE `#{@db.esc_table(oldname)}` RENAME TO `#{@db.esc_table(newname)}`")
348
-
349
- @data[:Name] = newname
350
- @name = newname
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
361
- end
362
-
363
- def truncate
364
- @db.query("TRUNCATE `#{@db.esc_table(self.name)}`")
365
- return self
366
- end
367
-
368
- def data
369
- ret = {
370
- :name => self.name,
371
- :columns => [],
372
- :indexes => []
373
- }
374
-
375
- columns.each do |name, column|
376
- ret[:columns] << column.data
377
- end
378
-
379
- indexes.each do |name, index|
380
- ret[:indexes] << index.data if name != "PRIMARY"
381
- end
382
-
383
- return ret
384
- end
385
-
386
- def insert(data)
387
- @db.insert(self.name, data)
388
- end
389
-
390
- def clone(newname, args = {})
391
- raise "Invalid name." if newname.to_s.strip.empty?
392
-
393
- sql = "CREATE TABLE `#{@db.esc_table(newname)}` ("
394
- first = true
395
- pkey_found = false
396
- pkeys = []
397
-
398
- columns do |col|
399
- sql << ", " if !first
400
- first = false if first
401
-
402
- col_data = col.data
403
- pkey_found = true if !pkey_found and col_data[:primarykey] and args[:force_single_pkey]
404
-
405
- if args[:no_pkey] or (pkey_found and col_data[:primarykey] and args[:force_single_pkey])
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
-
418
- sql << @db.cols.data_sql(col_data)
419
- end
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 << ")"
432
- end
433
-
434
- sql << ")"
435
- sql << " TABLESPACE #{args[:tablespace]}" if args[:tablespace]
436
- sql << " ENGINE=#{args[:engine]}" if args[:engine]
437
- sql << ";"
438
-
439
- #Create table.
440
- @db.query(sql)
441
-
442
-
443
- #Insert data of previous data in a single query.
444
- @db.query("INSERT INTO `#{@db.esc_table(newname)}` SELECT * FROM `#{@db.esc_table(self.name)}`")
445
-
446
-
447
- #Create indexes.
448
- new_table = @db.tables[newname]
449
- indexes_list = []
450
- indexes do |index|
451
- indexes_list << index.data unless index.primary?
452
- end
453
-
454
- new_table.create_indexes(indexes_list)
455
-
456
-
457
- #Return new table.
458
- return new_table
459
- end
460
-
461
- #Returns the current engine of the table.
462
- def engine
463
- return @data[:Engine]
464
- end
465
-
466
- #Changes the engine for a table.
467
- def 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
471
- end
472
-
473
- private
474
-
475
- def remove_column_from_list(col)
476
- raise "Column not found: '#{col.name}'." if !@list.key?(col.name)
477
- @list.delete(col.name)
478
- end
479
-
480
- def add_column_to_list(col)
481
- raise "Column already exists: '#{col.name}'." if @list.key?(col.name)
482
- @list[col.name] = col
483
- end
484
- end
@@ -2,30 +2,30 @@ class KnjDB_java_sqlite3
2
2
  def escape_table
3
3
  return "`"
4
4
  end
5
-
5
+
6
6
  def escape_col
7
7
  return "`"
8
8
  end
9
-
9
+
10
10
  def escape_val
11
11
  return "'"
12
12
  end
13
-
13
+
14
14
  def initialize(baza_db_obj)
15
15
  @baza_db = baza_db_obj
16
-
16
+
17
17
  if @baza_db.opts[:sqlite_driver]
18
18
  require @baza_db.opts[:sqlite_driver]
19
19
  else
20
20
  require File.dirname(__FILE__) + "/sqlitejdbc-v056.jar"
21
21
  end
22
-
22
+
23
23
  require "java"
24
24
  import "org.sqlite.JDBC"
25
25
  @conn = java.sql.DriverManager::getConnection("jdbc:sqlite:" + @baza_db.opts[:path])
26
26
  @stat = @conn.createStatement
27
27
  end
28
-
28
+
29
29
  def query(string)
30
30
  begin
31
31
  return KnjDB_java_sqlite3_result.new(@stat.executeQuery(string))
@@ -37,21 +37,18 @@ class KnjDB_java_sqlite3
37
37
  end
38
38
  end
39
39
  end
40
-
40
+
41
41
  def fetch(result)
42
42
  return result.fetch
43
43
  end
44
-
44
+
45
45
  def escape(string)
46
- if (!string)
47
- return ""
48
- end
49
-
50
- string = string.gsub("'", "\\'")
46
+ return "" unless string
47
+ string = string.gsub("'", "\\'")
51
48
  return string
52
49
  end
53
-
54
- def lastID
50
+
51
+ def last_id
55
52
  return @conn.last_insert_row_id
56
53
  end
57
54
  end
@@ -60,24 +57,22 @@ class KnjDB_java_sqlite3_result
60
57
  def initialize(rs)
61
58
  @rs = rs
62
59
  @index = 0
63
-
60
+
64
61
  if rs
65
62
  @metadata = rs.getMetaData
66
63
  @columns_count = @metadata.getColumnCount
67
64
  end
68
65
  end
69
-
66
+
70
67
  def fetch
71
- if !@rs.next
72
- return false
73
- end
74
-
68
+ return false unless @rs.next
69
+
75
70
  tha_return = {}
76
71
  for i in (1..@columns_count)
77
72
  col_name = @metadata.getColumnName(i)
78
73
  tha_return.store(col_name, @rs.getString(i))
79
74
  end
80
-
75
+
81
76
  return tha_return
82
77
  end
83
78
  end
@@ -5,38 +5,38 @@ class Baza::Driver::Sqlite3_ironruby
5
5
  def escape_table
6
6
  return "`"
7
7
  end
8
-
8
+
9
9
  def escape_col
10
10
  return "`"
11
11
  end
12
-
12
+
13
13
  def escape_val
14
14
  return "'"
15
15
  end
16
-
16
+
17
17
  def initialize(baza_db_obj)
18
18
  @baza_db = baza_db_obj
19
19
  @conn = Mono::Data::SqliteClient::SqliteConnection.new("URI=file:" + @baza_db.opts[:path] + ",version=3")
20
20
  @conn.Open
21
21
  end
22
-
22
+
23
23
  def query(string)
24
24
  dbcmd = @conn.CreateCommand
25
25
  dbcmd.CommandText = string
26
26
  reader = dbcmd.ExecuteReader
27
27
  return Baza::Driver::Sqlite3_ironruby_result.new(reader)
28
28
  end
29
-
29
+
30
30
  def escape(string)
31
31
  if (!string)
32
32
  return ""
33
33
  end
34
-
34
+
35
35
  string = string.gsub("'", "\\'")
36
36
  return string
37
37
  end
38
-
39
- def lastID
38
+
39
+ def last_id
40
40
  return @conn.last_insert_row_id
41
41
  end
42
42
  end
@@ -45,14 +45,14 @@ class Baza::Driver::Sqlite3_ironruby_result
45
45
  def initialize(reader)
46
46
  @reader = reader
47
47
  end
48
-
48
+
49
49
  def fetch
50
50
  if !@reader.Read
51
51
  return false
52
52
  end
53
-
53
+
54
54
  ret = {}
55
-
55
+
56
56
  count = 0
57
57
  while true
58
58
  begin
@@ -60,10 +60,10 @@ class Baza::Driver::Sqlite3_ironruby_result
60
60
  rescue IndexError => e
61
61
  break
62
62
  end
63
-
63
+
64
64
  count += 1
65
65
  end
66
-
66
+
67
67
  return ret
68
68
  end
69
69
  end