baza 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
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