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
@@ -0,0 +1,361 @@
1
+ class Baza::Driver::Mysql::Table
2
+ attr_reader :list, :name
3
+
4
+ def initialize(args)
5
+ @args = args
6
+ @db = args[:db]
7
+ @data = args[:data]
8
+ @subtype = @db.opts[:subtype]
9
+ @list = Wref_map.new
10
+ @indexes_list = Wref_map.new
11
+ @name = @data[:Name].to_sym
12
+ @tables = args[:tables]
13
+
14
+ raise "Could not figure out name from: '#{@data}'." if @data[:Name].to_s.strip.empty?
15
+ end
16
+
17
+ def reload
18
+ @data = @db.q("SHOW TABLE STATUS WHERE `Name` = '#{@db.esc(self.name)}'").fetch
19
+ end
20
+
21
+ #Used to validate in Knj::Wrap_map.
22
+ def __object_unique_id__
23
+ return @data[:Name]
24
+ end
25
+
26
+ def drop
27
+ raise "Cant drop native table: '#{self.name}'." if self.native?
28
+ @db.query("DROP TABLE `#{@db.esc_table(self.name)}`")
29
+ @tables.__send__(:remove_from_list, self)
30
+ return nil
31
+ end
32
+
33
+ #Returns true if the table is safe to drop.
34
+ def native?
35
+ return true if @db.q("SELECT DATABASE() AS db").fetch[:db] == "mysql"
36
+ return false
37
+ end
38
+
39
+ def optimize
40
+ @db.query("OPTIMIZE TABLE `#{@db.esc_table(self.name)}`")
41
+ return self
42
+ end
43
+
44
+ def rows_count
45
+ return @db.q("SELECT COUNT(*) AS count FROM `#{@db.esc_table(self.name)}`").fetch[:count].to_i
46
+ end
47
+
48
+ def column(name)
49
+ name = name.to_sym
50
+
51
+ if col = @list.get!(name)
52
+ return @list[name]
53
+ end
54
+
55
+ self.columns(:name => name) do |col|
56
+ return col if col.name == name
57
+ end
58
+
59
+ raise Errno::ENOENT, "Column not found: '#{name}'."
60
+ end
61
+
62
+ def columns(args = nil)
63
+ @db.cols
64
+ ret = {}
65
+ sql = "SHOW FULL COLUMNS FROM `#{@db.esc_table(name)}`"
66
+ sql << " WHERE `Field` = '#{@db.esc(args[:name])}'" if args and args.key?(:name)
67
+
68
+ @db.q(sql) do |d_cols|
69
+ column_name = d_cols[:Field].to_sym
70
+ obj = @list.get!(name)
71
+
72
+ unless obj
73
+ obj = Baza::Driver::Mysql::Column.new(
74
+ table_name: name,
75
+ db: @db,
76
+ data: d_cols
77
+ )
78
+ @list[column_name] = obj
79
+ end
80
+
81
+ if block_given?
82
+ yield(obj)
83
+ else
84
+ ret[column_name] = obj
85
+ end
86
+ end
87
+
88
+ if block_given?
89
+ return nil
90
+ else
91
+ return ret
92
+ end
93
+ end
94
+
95
+ def indexes args = nil
96
+ @db.indexes
97
+ ret = {}
98
+
99
+ sql = "SHOW INDEX FROM `#{@db.esc_table(name)}`"
100
+ sql << " WHERE `Key_name` = '#{@db.esc(args[:name])}'" if args && args.key?(:name)
101
+
102
+ @db.q(sql) do |d_indexes|
103
+ next if d_indexes[:Key_name] == "PRIMARY"
104
+ obj = @indexes_list.get!(d_indexes[:Key_name].to_s)
105
+
106
+ unless obj
107
+ obj = Baza::Driver::Mysql::Index.new(
108
+ table_name: name,
109
+ db: @db,
110
+ data: d_indexes
111
+ )
112
+ obj.columns << d_indexes[:Column_name]
113
+ @indexes_list[d_indexes[:Key_name].to_s] = obj
114
+ end
115
+
116
+ if block_given?
117
+ yield obj
118
+ else
119
+ ret[d_indexes[:Key_name].to_s] = obj
120
+ end
121
+ end
122
+
123
+ if block_given?
124
+ return nil
125
+ else
126
+ return ret
127
+ end
128
+ end
129
+
130
+ def index(name)
131
+ name = name.to_s
132
+
133
+ if index = @indexes_list.get!(name)
134
+ return index
135
+ end
136
+
137
+ indexes(name: name) do |index|
138
+ return index if index.name.to_s == name
139
+ end
140
+
141
+ raise Errno::ENOENT, "Index not found: #{name}."
142
+ end
143
+
144
+ def create_columns(col_arr)
145
+ @db.transaction do
146
+ col_arr.each do |col_data|
147
+ sql = "ALTER TABLE `#{self.name}` ADD COLUMN #{@db.cols.data_sql(col_data)};"
148
+ @db.query(sql)
149
+ end
150
+ end
151
+ end
152
+
153
+ def create_indexes(index_arr, args = {})
154
+ return Baza::Driver::Mysql::Table.create_indexes(index_arr, args.merge(:table_name => self.name, :db => @db))
155
+ end
156
+
157
+ def self.create_indexes(index_arr, args = {})
158
+ db = args[:db]
159
+
160
+ if args[:return_sql]
161
+ sql = ""
162
+ first = true
163
+ end
164
+
165
+ index_arr.each do |index_data|
166
+ if !args[:return_sql]
167
+ sql = ""
168
+ end
169
+
170
+ if args[:create] or !args.key?(:create)
171
+ sql << "CREATE"
172
+ end
173
+
174
+ if index_data.is_a?(String) || index_data.is_a?(Symbol)
175
+ index_data = {name: index_data, columns: [index_data]}
176
+ end
177
+
178
+ raise "No name was given: '#{index_data}'." if !index_data.key?(:name) || index_data[:name].to_s.strip.empty?
179
+ raise "No columns was given on index: '#{index_data[:name]}'." if !index_data[:columns] || index_data[:columns].empty?
180
+
181
+ if args[:return_sql]
182
+ if first
183
+ first = false
184
+ else
185
+ sql << ", "
186
+ end
187
+ end
188
+
189
+ sql << " UNIQUE" if index_data[:unique]
190
+ sql << " INDEX `#{db.esc_col(index_data[:name])}`"
191
+
192
+ if args[:on_table] || !args.key?(:on_table)
193
+ sql << " ON `#{db.esc_table(args[:table_name])}`"
194
+ end
195
+
196
+ sql << " ("
197
+
198
+ first = true
199
+ index_data[:columns].each do |col_name|
200
+ sql << ", " if !first
201
+ first = false if first
202
+
203
+ sql << "`#{db.esc_col(col_name)}`"
204
+ end
205
+
206
+ sql << ")"
207
+
208
+ if !args[:return_sql]
209
+ db.query(sql)
210
+ end
211
+ end
212
+
213
+ if args[:return_sql]
214
+ return sql
215
+ else
216
+ return nil
217
+ end
218
+ end
219
+
220
+ def rename newname
221
+ newname = newname.to_sym
222
+ oldname = name
223
+
224
+ @tables.__send__(:remove_from_list, self)
225
+ @db.query("ALTER TABLE `#{@db.esc_table(oldname)}` RENAME TO `#{@db.esc_table(newname)}`")
226
+
227
+ @data[:Name] = newname
228
+ @name = newname
229
+ @tables.__send__(:add_to_list, self)
230
+
231
+ @list.each do |name, column|
232
+ column.args[:table_name] = newname
233
+ end
234
+
235
+ @indexes_list.each do |name, index|
236
+ index.args[:table_name] = newname
237
+ end
238
+ end
239
+
240
+ def truncate
241
+ @db.query("TRUNCATE `#{@db.esc_table(self.name)}`")
242
+ return self
243
+ end
244
+
245
+ def data
246
+ ret = {
247
+ name: self.name,
248
+ columns: [],
249
+ indexes: []
250
+ }
251
+
252
+ columns.each do |name, column|
253
+ ret[:columns] << column.data
254
+ end
255
+
256
+ indexes.each do |name, index|
257
+ ret[:indexes] << index.data if name != "PRIMARY"
258
+ end
259
+
260
+ return ret
261
+ end
262
+
263
+ def insert(data)
264
+ @db.insert(self.name, data)
265
+ end
266
+
267
+ def clone(newname, args = {})
268
+ raise "Invalid name." if newname.to_s.strip.empty?
269
+
270
+ sql = "CREATE TABLE `#{@db.esc_table(newname)}` ("
271
+ first = true
272
+ pkey_found = false
273
+ pkeys = []
274
+
275
+ columns do |col|
276
+ sql << ", " unless first
277
+ first = false if first
278
+
279
+ col_data = col.data
280
+ pkey_found = true if !pkey_found && col_data[:primarykey] && args[:force_single_pkey]
281
+
282
+ if args[:no_pkey] || (pkey_found && col_data[:primarykey] && args[:force_single_pkey])
283
+ col_data[:primarykey] = false
284
+ end
285
+
286
+ if col_data[:primarykey]
287
+ pkeys << col_data[:name]
288
+ col_data.delete(:primarykey)
289
+ end
290
+
291
+ if args[:all_cols_storage]
292
+ col_data[:storage] = args[:all_cols_storage]
293
+ end
294
+
295
+ sql << @db.cols.data_sql(col_data)
296
+ end
297
+
298
+ unless pkeys.empty?
299
+ sql << ", PRIMARY KEY ("
300
+
301
+ first = true
302
+ pkeys.each do |pkey|
303
+ sql << ", " unless first
304
+ first = false if first
305
+ sql << "`#{@db.esc_col(pkey)}`"
306
+ end
307
+
308
+ sql << ")"
309
+ end
310
+
311
+ sql << ")"
312
+ sql << " TABLESPACE #{args[:tablespace]}" if args[:tablespace]
313
+ sql << " ENGINE=#{args[:engine]}" if args[:engine]
314
+ sql << ";"
315
+
316
+ #Create table.
317
+ @db.query(sql)
318
+
319
+
320
+ #Insert data of previous data in a single query.
321
+ @db.query("INSERT INTO `#{@db.esc_table(newname)}` SELECT * FROM `#{@db.esc_table(self.name)}`")
322
+
323
+
324
+ #Create indexes.
325
+ new_table = @db.tables[newname]
326
+ indexes_list = []
327
+ indexes do |index|
328
+ indexes_list << index.data unless index.primary?
329
+ end
330
+
331
+ new_table.create_indexes(indexes_list)
332
+
333
+
334
+ #Return new table.
335
+ return new_table
336
+ end
337
+
338
+ #Returns the current engine of the table.
339
+ def engine
340
+ return @data[:Engine]
341
+ end
342
+
343
+ #Changes the engine for a table.
344
+ def engine=(newengine)
345
+ raise "Invalid engine: '#{newengine}'." unless newengine.to_s.match(/^[A-z]+$/)
346
+ @db.query("ALTER TABLE `#{@db.esc_table(self.name)}` ENGINE = #{newengine}") if self.engine.to_s != newengine.to_s
347
+ @data[:Engine] = newengine
348
+ end
349
+
350
+ private
351
+
352
+ def remove_column_from_list(col)
353
+ raise "Column not found: '#{col.name}'." unless @list.key?(col.name)
354
+ @list.delete(col.name)
355
+ end
356
+
357
+ def add_column_to_list(col)
358
+ raise "Column already exists: '#{col.name}'." if @list.key?(col.name)
359
+ @list[col.name] = col
360
+ end
361
+ end