knjrbfw 0.0.39 → 0.0.40
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.
- data/VERSION +1 -1
- data/knjrbfw.gemspec +5 -2
- data/lib/knj/datarow.rb +18 -15
- data/lib/knj/errors.rb +3 -0
- data/lib/knj/http2.rb +104 -38
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +62 -11
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +29 -11
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +10 -3
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +24 -0
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +30 -16
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +51 -8
- data/lib/knj/knjdb/dump.rb +121 -0
- data/lib/knj/knjdb/idquery.rb +109 -0
- data/lib/knj/knjdb/libknjdb.rb +97 -36
- data/lib/knj/knjdb/query_buffer.rb +43 -0
- data/lib/knj/locales.rb +4 -8
- data/lib/knj/objects/objects_sqlhelper.rb +2 -2
- data/lib/knj/process.rb +6 -0
- data/lib/knj/process_meta.rb +4 -2
- data/lib/knj/threadpool.rb +84 -40
- data/lib/knj/web.rb +1 -1
- data/spec/db_spec.rb +72 -10
- data/spec/http2_spec.rb +51 -14
- data/spec/process_meta_spec.rb +17 -1
- metadata +6 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.40
|
data/knjrbfw.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjrbfw}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.40"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-05-
|
12
|
+
s.date = %q{2012-05-25}
|
13
13
|
s.description = %q{Including stuff for HTTP, SSH and much more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -173,10 +173,13 @@ Gem::Specification.new do |s|
|
|
173
173
|
"lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb",
|
174
174
|
"lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_sqlspecs.rb",
|
175
175
|
"lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb",
|
176
|
+
"lib/knj/knjdb/dump.rb",
|
177
|
+
"lib/knj/knjdb/idquery.rb",
|
176
178
|
"lib/knj/knjdb/libknjdb.rb",
|
177
179
|
"lib/knj/knjdb/libknjdb_java_sqlite3.rb",
|
178
180
|
"lib/knj/knjdb/libknjdb_row.rb",
|
179
181
|
"lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb",
|
182
|
+
"lib/knj/knjdb/query_buffer.rb",
|
180
183
|
"lib/knj/knjdb/revision.rb",
|
181
184
|
"lib/knj/knjdb/sqlspecs.rb",
|
182
185
|
"lib/knj/kvm.rb",
|
data/lib/knj/datarow.rb
CHANGED
@@ -150,7 +150,7 @@ class Knj::Datarow
|
|
150
150
|
self.joined_tables(
|
151
151
|
classname => {
|
152
152
|
:where => {
|
153
|
-
colname.to_s => {:type =>
|
153
|
+
colname.to_s => {:type => :col, :name => :id}
|
154
154
|
}
|
155
155
|
}
|
156
156
|
)
|
@@ -220,7 +220,7 @@ class Knj::Datarow
|
|
220
220
|
self.joined_tables(
|
221
221
|
classname => {
|
222
222
|
:where => {
|
223
|
-
"id" => {:type =>
|
223
|
+
"id" => {:type => :col, :name => colname}
|
224
224
|
}
|
225
225
|
}
|
226
226
|
)
|
@@ -251,7 +251,7 @@ class Knj::Datarow
|
|
251
251
|
table_name => {
|
252
252
|
:where => {
|
253
253
|
"object_class" => self.name,
|
254
|
-
"object_id" => {:type =>
|
254
|
+
"object_id" => {:type => :col, :name => "id"},
|
255
255
|
"key" => val.to_s,
|
256
256
|
"locale" => proc{|d| _session[:locale]}
|
257
257
|
},
|
@@ -335,33 +335,33 @@ class Knj::Datarow
|
|
335
335
|
d.db.tables[table].columns do |col_obj|
|
336
336
|
col_name = col_obj.name
|
337
337
|
col_type = col_obj.type
|
338
|
-
col_type =
|
338
|
+
col_type = :int if col_type == :bigint or col_type == :tinyint or col_type == :mediumint or col_type == :smallint
|
339
339
|
sqlhelper_args[:cols][col_name] = true
|
340
340
|
|
341
341
|
self.define_bool_methods(:inst_methods => inst_methods, :col_name => col_name)
|
342
342
|
|
343
|
-
if col_type ==
|
343
|
+
if col_type == :enum and col_obj.maxlength == "'0','1'"
|
344
344
|
sqlhelper_args[:cols_bools] << col_name
|
345
|
-
elsif col_type ==
|
345
|
+
elsif col_type == :int and col_name.slice(-3, 3) == "_id"
|
346
346
|
sqlhelper_args[:cols_dbrows] << col_name
|
347
|
-
elsif col_type ==
|
347
|
+
elsif col_type == :int or col_type == :decimal
|
348
348
|
sqlhelper_args[:cols_num] << col_name
|
349
|
-
elsif col_type ==
|
349
|
+
elsif col_type == :varchar or col_type == :text or col_type == :enum
|
350
350
|
sqlhelper_args[:cols_str] << col_name
|
351
|
-
elsif col_type ==
|
351
|
+
elsif col_type == :date or col_type == :datetime
|
352
352
|
sqlhelper_args[:cols_date] << col_name
|
353
353
|
self.define_date_methods(:inst_methods => inst_methods, :col_name => col_name)
|
354
354
|
end
|
355
355
|
|
356
|
-
if col_type ==
|
356
|
+
if col_type == :int or col_type == :decimal
|
357
357
|
self.define_numeric_methods(:inst_methods => inst_methods, :col_name => col_name)
|
358
358
|
end
|
359
359
|
|
360
|
-
if col_type ==
|
360
|
+
if col_type == :int or col_type == :varchar
|
361
361
|
self.define_text_methods(:inst_methods => inst_methods, :col_name => col_name)
|
362
362
|
end
|
363
363
|
|
364
|
-
if col_type ==
|
364
|
+
if col_type == :time
|
365
365
|
self.define_time_methods(:inst_methods => inst_methods, :col_name => col_name)
|
366
366
|
end
|
367
367
|
end
|
@@ -369,7 +369,7 @@ class Knj::Datarow
|
|
369
369
|
if @columns_joined_tables
|
370
370
|
@columns_joined_tables.each do |table_name, table_data|
|
371
371
|
table_data[:where].each do |key, val|
|
372
|
-
val[:table] = self.table.to_sym if val.is_a?(Hash) and !val.key?(:table) and val[:type] ==
|
372
|
+
val[:table] = self.table.to_sym if val.is_a?(Hash) and !val.key?(:table) and val[:type].to_sym == :col
|
373
373
|
end
|
374
374
|
|
375
375
|
table_data[:datarow] = @ob.args[:module].const_get(table_name.to_sym) if !table_data.key?(:datarow)
|
@@ -425,7 +425,7 @@ class Knj::Datarow
|
|
425
425
|
when :cloned_ubuf
|
426
426
|
qargs = {:cloned_ubuf => true}
|
427
427
|
else
|
428
|
-
raise "Invalid key: '#{key}' for '#{self.name}'. Valid keys are: '#{@columns_sqlhelper_args[:cols].keys.sort}'."
|
428
|
+
raise "Invalid key: '#{key}' for '#{self.name}'. Valid keys are: '#{@columns_sqlhelper_args[:cols].keys.sort}'. Date-keys: '#{@columns_sqlhelper_args[:cols_date]}'."
|
429
429
|
end
|
430
430
|
end
|
431
431
|
|
@@ -523,7 +523,10 @@ class Knj::Datarow
|
|
523
523
|
raise Knj::Errors::InvalidData, "Could not figure out the data from '#{data.class.name}'."
|
524
524
|
end
|
525
525
|
|
526
|
-
|
526
|
+
if @id.to_i <= 0
|
527
|
+
raise "Invalid ID: '#{@id}' from '#{@data}'."if @data
|
528
|
+
raise "Invalid ID: '#{@id}'."
|
529
|
+
end
|
527
530
|
end
|
528
531
|
|
529
532
|
#Reloads the data from the database.
|
data/lib/knj/errors.rb
CHANGED
@@ -39,9 +39,12 @@ module Knj::Errors
|
|
39
39
|
err.backtrace.each do |bt|
|
40
40
|
str << "#{Knj::Web.html(bt)}<br />\n"
|
41
41
|
end
|
42
|
+
|
43
|
+
str << "<br />\n<br />\n"
|
42
44
|
else
|
43
45
|
str << "#{err.class.name}: #{err.message}\n\n"
|
44
46
|
str << err.backtrace.join("\n")
|
47
|
+
str << "\n\n"
|
45
48
|
end
|
46
49
|
|
47
50
|
return str
|
data/lib/knj/http2.rb
CHANGED
@@ -165,6 +165,7 @@ class Knj::Http2
|
|
165
165
|
header_str << "#{@nl}"
|
166
166
|
|
167
167
|
print "Http2: Writing headers.\n" if @debug
|
168
|
+
print "Header str: #{header_str}\n" if @debug
|
168
169
|
self.write(header_str)
|
169
170
|
|
170
171
|
print "Http2: Reading response.\n" if @debug
|
@@ -209,25 +210,46 @@ class Knj::Http2
|
|
209
210
|
if !@args.key?(:encoding_gzip) or @args[:encoding_gzip]
|
210
211
|
headers["Accept-Encoding"] = "gzip"
|
211
212
|
else
|
212
|
-
headers["Accept-Encoding"] = "none"
|
213
|
+
#headers["Accept-Encoding"] = "none"
|
213
214
|
end
|
214
215
|
|
215
216
|
return headers
|
216
217
|
end
|
217
218
|
|
218
|
-
|
219
|
+
#This is used to convert a hash to valid post-data recursivly.
|
220
|
+
def self.post_convert_data(pdata, args = nil)
|
219
221
|
praw = ""
|
220
222
|
|
221
223
|
if pdata.is_a?(Hash)
|
222
224
|
pdata.each do |key, val|
|
223
225
|
praw << "&" if praw != ""
|
224
|
-
|
226
|
+
|
227
|
+
if args and args[:orig_key]
|
228
|
+
key = "#{args[:orig_key]}[#{key}]"
|
229
|
+
end
|
230
|
+
|
231
|
+
if val.is_a?(Hash) or val.is_a?(Array)
|
232
|
+
praw << self.post_convert_data(val, {:orig_key => key})
|
233
|
+
else
|
234
|
+
praw << "#{Knj::Web.urlenc(key)}=#{Knj::Web.urlenc(Knj::Http2.post_convert_data(val))}"
|
235
|
+
end
|
225
236
|
end
|
226
237
|
elsif pdata.is_a?(Array)
|
227
238
|
count = 0
|
228
239
|
pdata.each do |val|
|
240
|
+
if args and args[:orig_key]
|
241
|
+
key = "#{args[:orig_key]}[#{count}]"
|
242
|
+
else
|
243
|
+
key = count
|
244
|
+
end
|
245
|
+
|
246
|
+
if val.is_a?(Hash) or val.is_a?(Array)
|
247
|
+
praw << self.post_convert_data(val, {:orig_key => key})
|
248
|
+
else
|
249
|
+
praw << "#{Knj::Web.urlenc(key)}=#{Knj::Web.urlenc(Knj::Http2.post_convert_data(val))}"
|
250
|
+
end
|
251
|
+
|
229
252
|
count += 1
|
230
|
-
praw << "#{count}=#{Knj::Web.urlenc(Knj::Http2.post_convert_data(val))}"
|
231
253
|
end
|
232
254
|
else
|
233
255
|
return pdata.to_s
|
@@ -246,7 +268,7 @@ class Knj::Http2
|
|
246
268
|
praw = Knj::Http2.post_convert_data(pdata)
|
247
269
|
|
248
270
|
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
249
|
-
header_str << self.header_str(self.default_headers(args).merge("Content-Length" => praw.length), args)
|
271
|
+
header_str << self.header_str(self.default_headers(args).merge("Content-Type" => "application/x-www-form-urlencoded", "Content-Length" => praw.length), args)
|
250
272
|
header_str << "#{@nl}"
|
251
273
|
header_str << praw
|
252
274
|
|
@@ -266,45 +288,89 @@ class Knj::Http2
|
|
266
288
|
@mutex.synchronize do
|
267
289
|
boundary = Digest::MD5.hexdigest(Time.now.to_f.to_s)
|
268
290
|
|
269
|
-
praw
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
291
|
+
#Generate 'praw'-variable with post-content.
|
292
|
+
tmp_path = "#{Knj::Os.tmpdir}/knj_http2_post_multiepart_tmp_#{boundary}"
|
293
|
+
|
294
|
+
begin
|
295
|
+
File.open(tmp_path, "w") do |praw|
|
296
|
+
pdata.each do |key, val|
|
297
|
+
praw << "--#{boundary}#{@nl}"
|
298
|
+
|
299
|
+
if val.class.name == "Tempfile" and val.respond_to?("original_filename")
|
300
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val.original_filename}\";#{@nl}"
|
301
|
+
praw << "Content-Length: #{val.to_s.bytesize}#{@nl}"
|
302
|
+
elsif val.is_a?(Hash) and val[:filename]
|
303
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val[:filename]}\";#{@nl}"
|
304
|
+
|
305
|
+
if val[:content]
|
306
|
+
praw << "Content-Length: #{val[:content].to_s.bytesize}#{@nl}"
|
307
|
+
elsif val[:fpath]
|
308
|
+
praw << "Content-Length: #{File.size(val[:fpath])}#{@nl}"
|
309
|
+
else
|
310
|
+
raise "Could not figure out where to get content from."
|
311
|
+
end
|
312
|
+
else
|
313
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\";#{@nl}"
|
314
|
+
praw << "Content-Length: #{val.to_s.bytesize}#{@nl}"
|
315
|
+
end
|
316
|
+
|
317
|
+
praw << "Content-Type: text/plain#{@nl}"
|
318
|
+
praw << @nl
|
319
|
+
|
320
|
+
if val.is_a?(StringIO)
|
321
|
+
praw << val.read
|
322
|
+
elsif val.is_a?(Hash) and val[:content]
|
323
|
+
praw << val[:content].to_s
|
324
|
+
elsif val.is_a?(Hash) and val[:fpath]
|
325
|
+
File.open(val[:fpath], "r") do |fp|
|
326
|
+
begin
|
327
|
+
while data = fp.sysread(4096)
|
328
|
+
praw << data
|
329
|
+
end
|
330
|
+
rescue EOFError
|
331
|
+
#ignore.
|
332
|
+
end
|
333
|
+
end
|
334
|
+
else
|
335
|
+
praw << val.to_s
|
336
|
+
end
|
337
|
+
|
338
|
+
praw << @nl
|
339
|
+
end
|
340
|
+
|
341
|
+
praw << "--#{boundary}--"
|
282
342
|
end
|
283
343
|
|
284
|
-
praw << "Content-Type: text/plain#{@nl}"
|
285
|
-
praw << @nl
|
286
344
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
345
|
+
#Generate header-string containing 'praw'-variable.
|
346
|
+
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
347
|
+
header_str << self.header_str(self.default_headers(args).merge(
|
348
|
+
"Content-Type" => "multipart/form-data; boundary=#{boundary}",
|
349
|
+
"Content-Length" => File.size(tmp_path)
|
350
|
+
), args)
|
351
|
+
header_str << @nl
|
352
|
+
|
353
|
+
|
354
|
+
#Debug.
|
355
|
+
print "Headerstr: #{header_str}\n" if @debug
|
356
|
+
|
357
|
+
|
358
|
+
#Write and return.
|
359
|
+
self.write(header_str)
|
360
|
+
File.open(tmp_path, "r") do |fp|
|
361
|
+
begin
|
362
|
+
while data = fp.sysread(4096)
|
363
|
+
@sock.write(data)
|
364
|
+
end
|
365
|
+
rescue EOFError
|
366
|
+
#ignore.
|
367
|
+
end
|
293
368
|
end
|
294
369
|
|
295
|
-
|
370
|
+
return self.read_response(args)
|
371
|
+
ensure
|
372
|
+
File.unlink(tmp_path) if File.exists?(tmp_path)
|
296
373
|
end
|
297
|
-
|
298
|
-
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
299
|
-
header_str << self.header_str(self.default_headers(args).merge("Content-Type" => "multipart/form-data; boundary=#{boundary}", "Content-Length" => praw.bytesize), args)
|
300
|
-
header_str << "#{@nl}"
|
301
|
-
header_str << praw
|
302
|
-
header_str << "--#{boundary}--"
|
303
|
-
|
304
|
-
print "Headerstr: #{header_str}\n" if @debug
|
305
|
-
|
306
|
-
self.write(header_str)
|
307
|
-
return self.read_response(args)
|
308
374
|
end
|
309
375
|
end
|
310
376
|
|
@@ -40,10 +40,12 @@ class KnjDB_mysql
|
|
40
40
|
@java_rs_data.delete(id)
|
41
41
|
end
|
42
42
|
|
43
|
+
#Cleans the wref-map holding the tables.
|
43
44
|
def clean
|
44
45
|
self.tables.clean if self.tables
|
45
46
|
end
|
46
47
|
|
48
|
+
#Respawns the connection to the MySQL-database.
|
47
49
|
def reconnect
|
48
50
|
case @subtype
|
49
51
|
when "mysql"
|
@@ -243,7 +245,7 @@ class KnjDB_mysql
|
|
243
245
|
when "\n" then "\\n"
|
244
246
|
when "\r" then "\\r"
|
245
247
|
when "\032" then "\\Z"
|
246
|
-
else "
|
248
|
+
else "\\#{$1}"
|
247
249
|
end
|
248
250
|
end
|
249
251
|
end
|
@@ -296,10 +298,18 @@ class KnjDB_mysql
|
|
296
298
|
|
297
299
|
#Inserts multiple rows in a table. Can return the inserted IDs if asked to in arguments.
|
298
300
|
def insert_multi(tablename, arr_hashes, args = nil)
|
299
|
-
sql = "INSERT INTO `#{
|
301
|
+
sql = "INSERT INTO `#{tablename}` ("
|
300
302
|
|
301
303
|
first = true
|
302
|
-
|
304
|
+
if args and args[:keys]
|
305
|
+
keys = args[:keys]
|
306
|
+
elsif arr_hashes.first.is_a?(Hash)
|
307
|
+
keys = arr_hashes.first.keys
|
308
|
+
else
|
309
|
+
raise "Could not figure out keys."
|
310
|
+
end
|
311
|
+
|
312
|
+
keys.each do |col_name|
|
303
313
|
sql << "," if !first
|
304
314
|
first = false if first
|
305
315
|
sql << "`#{self.esc_col(col_name)}`"
|
@@ -316,19 +326,33 @@ class KnjDB_mysql
|
|
316
326
|
end
|
317
327
|
|
318
328
|
first_key = true
|
319
|
-
hash.
|
320
|
-
|
321
|
-
first_key
|
322
|
-
|
323
|
-
|
329
|
+
if hash.is_a?(Array)
|
330
|
+
hash.each do |val|
|
331
|
+
if first_key
|
332
|
+
first_key = false
|
333
|
+
else
|
334
|
+
sql << ","
|
335
|
+
end
|
336
|
+
|
337
|
+
sql << "'#{self.escape(val)}'"
|
338
|
+
end
|
339
|
+
else
|
340
|
+
hash.each do |key, val|
|
341
|
+
if first_key
|
342
|
+
first_key = false
|
343
|
+
else
|
344
|
+
sql << ","
|
345
|
+
end
|
346
|
+
|
347
|
+
sql << "'#{self.escape(val)}'"
|
324
348
|
end
|
325
|
-
|
326
|
-
sql << "'#{self.escape(val)}'"
|
327
349
|
end
|
328
350
|
end
|
329
351
|
|
330
352
|
sql << ")"
|
331
353
|
|
354
|
+
return sql if args and args[:return_sql]
|
355
|
+
|
332
356
|
self.query(sql)
|
333
357
|
|
334
358
|
if args and args[:return_id]
|
@@ -348,9 +372,22 @@ class KnjDB_mysql
|
|
348
372
|
return nil
|
349
373
|
end
|
350
374
|
end
|
375
|
+
|
376
|
+
#Starts a transaction, yields the database and commits at the end.
|
377
|
+
def transaction
|
378
|
+
@knjdb.q("START TRANSACTION")
|
379
|
+
|
380
|
+
begin
|
381
|
+
yield(@knjdb)
|
382
|
+
ensure
|
383
|
+
@knjdb.q("COMMIT")
|
384
|
+
end
|
385
|
+
end
|
351
386
|
end
|
352
387
|
|
388
|
+
#This class controls the results for the normal MySQL-driver.
|
353
389
|
class KnjDB_mysql_result
|
390
|
+
#Constructor. This should not be called manually.
|
354
391
|
def initialize(driver, result)
|
355
392
|
@driver = driver
|
356
393
|
@result = result
|
@@ -365,17 +402,20 @@ class KnjDB_mysql_result
|
|
365
402
|
end
|
366
403
|
end
|
367
404
|
|
405
|
+
#Returns a single result.
|
368
406
|
def fetch
|
369
407
|
return self.fetch_hash_symbols if @driver.knjdb.opts[:return_keys] == "symbols"
|
370
408
|
return self.fetch_hash_strings
|
371
409
|
end
|
372
410
|
|
411
|
+
#Returns a single result as a hash with strings as keys.
|
373
412
|
def fetch_hash_strings
|
374
413
|
@mutex.synchronize do
|
375
414
|
return @result.fetch_hash
|
376
415
|
end
|
377
416
|
end
|
378
417
|
|
418
|
+
#Returns a single result as a hash with symbols as keys.
|
379
419
|
def fetch_hash_symbols
|
380
420
|
fetched = nil
|
381
421
|
@mutex.synchronize do
|
@@ -394,6 +434,7 @@ class KnjDB_mysql_result
|
|
394
434
|
return ret
|
395
435
|
end
|
396
436
|
|
437
|
+
#Loops over every result yielding it.
|
397
438
|
def each
|
398
439
|
while data = self.fetch_hash_symbols
|
399
440
|
yield(data)
|
@@ -401,7 +442,9 @@ class KnjDB_mysql_result
|
|
401
442
|
end
|
402
443
|
end
|
403
444
|
|
445
|
+
#This class controls the unbuffered result for the normal MySQL-driver.
|
404
446
|
class KnjDB_mysql_unbuffered_result
|
447
|
+
#Constructor. This should not be called manually.
|
405
448
|
def initialize(conn, opts, result)
|
406
449
|
@conn = conn
|
407
450
|
@result = result
|
@@ -415,6 +458,7 @@ class KnjDB_mysql_unbuffered_result
|
|
415
458
|
end
|
416
459
|
end
|
417
460
|
|
461
|
+
#Lods the keys for the object.
|
418
462
|
def load_keys
|
419
463
|
@keys = []
|
420
464
|
keys = @res.fetch_fields
|
@@ -423,6 +467,7 @@ class KnjDB_mysql_unbuffered_result
|
|
423
467
|
end
|
424
468
|
end
|
425
469
|
|
470
|
+
#Returns a single result.
|
426
471
|
def fetch
|
427
472
|
if @enum
|
428
473
|
begin
|
@@ -462,6 +507,7 @@ class KnjDB_mysql_unbuffered_result
|
|
462
507
|
end
|
463
508
|
end
|
464
509
|
|
510
|
+
#Loops over every single result yielding it.
|
465
511
|
def each
|
466
512
|
while data = self.fetch
|
467
513
|
yield(data)
|
@@ -469,11 +515,14 @@ class KnjDB_mysql_unbuffered_result
|
|
469
515
|
end
|
470
516
|
end
|
471
517
|
|
518
|
+
#This class controls the result for the MySQL2 driver.
|
472
519
|
class KnjDB_mysql2_result
|
520
|
+
#Constructor. This should not be called manually.
|
473
521
|
def initialize(result)
|
474
522
|
@result = result
|
475
523
|
end
|
476
524
|
|
525
|
+
#Returns a single result.
|
477
526
|
def fetch
|
478
527
|
@enum = @result.to_enum if !@enum
|
479
528
|
|
@@ -484,17 +533,19 @@ class KnjDB_mysql2_result
|
|
484
533
|
end
|
485
534
|
end
|
486
535
|
|
536
|
+
#Loops over every single result yielding it.
|
487
537
|
def each
|
488
538
|
@result.each do |res|
|
489
539
|
#This sometimes happens when streaming results...
|
490
540
|
next if !res
|
491
|
-
|
492
541
|
yield(res)
|
493
542
|
end
|
494
543
|
end
|
495
544
|
end
|
496
545
|
|
546
|
+
#This class controls the result for the Java-MySQL-driver.
|
497
547
|
class KnjDB_java_mysql_result
|
548
|
+
#Constructor. This should not be called manually.
|
498
549
|
def initialize(knjdb, opts, result)
|
499
550
|
@knjdb = knjdb
|
500
551
|
@result = result
|
@@ -1,10 +1,11 @@
|
|
1
|
+
#This class handels various MySQL-column-specific operations.
|
1
2
|
class KnjDB_mysql::Columns
|
2
|
-
|
3
|
-
|
3
|
+
#Constructor. Should not be called manually.
|
4
4
|
def initialize(args)
|
5
5
|
@args = args
|
6
6
|
end
|
7
7
|
|
8
|
+
#Returns the SQL for this column.
|
8
9
|
def data_sql(data)
|
9
10
|
raise "No type given." if !data["type"]
|
10
11
|
|
@@ -30,9 +31,11 @@ class KnjDB_mysql::Columns
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
34
|
+
#This class handels every MySQL-column, that can be returned from a table-object.
|
33
35
|
class KnjDB_mysql::Columns::Column
|
34
36
|
attr_reader :args
|
35
37
|
|
38
|
+
#Constructor. Should not be called manually.
|
36
39
|
def initialize(args)
|
37
40
|
@args = args
|
38
41
|
end
|
@@ -42,14 +45,17 @@ class KnjDB_mysql::Columns::Column
|
|
42
45
|
return @args[:data][:Field]
|
43
46
|
end
|
44
47
|
|
48
|
+
#Returns the name of the column.
|
45
49
|
def name
|
46
50
|
return @args[:data][:Field]
|
47
51
|
end
|
48
52
|
|
53
|
+
#Returns the table-object that this column belongs to.
|
49
54
|
def table
|
50
55
|
return @args[:db].tables[@args[:table_name]]
|
51
56
|
end
|
52
57
|
|
58
|
+
#Returns all data of the column in the knjdb-format.
|
53
59
|
def data
|
54
60
|
return {
|
55
61
|
"type" => self.type,
|
@@ -62,37 +68,43 @@ class KnjDB_mysql::Columns::Column
|
|
62
68
|
}
|
63
69
|
end
|
64
70
|
|
71
|
+
#Returns the type of the column (integer, varchar etc.).
|
65
72
|
def type
|
66
73
|
if !@type
|
67
74
|
if match = @args[:data][:Type].match(/^([A-z]+)$/)
|
68
75
|
@maxlength = false
|
69
|
-
@type = match[0]
|
76
|
+
@type = match[0].to_sym
|
70
77
|
elsif match = @args[:data][:Type].match(/^decimal\((\d+),(\d+)\)$/)
|
71
78
|
@maxlength = "#{match[1]},#{match[2]}"
|
72
|
-
@type =
|
79
|
+
@type = :decimal
|
73
80
|
elsif match = @args[:data][:Type].match(/^enum\((.+)\)$/)
|
74
81
|
@maxlength = match[1]
|
75
|
-
@type =
|
76
|
-
elsif match = @args[:data][:Type].match(/^(.+)\((\d+)\)
|
77
|
-
@maxlength = match[2]
|
78
|
-
@type = match[1]
|
82
|
+
@type = :enum
|
83
|
+
elsif match = @args[:data][:Type].match(/^(.+)\((\d+)\)/)
|
84
|
+
@maxlength = match[2].to_i
|
85
|
+
@type = match[1].to_sym
|
79
86
|
end
|
87
|
+
|
88
|
+
raise "Still not type from: '#{@args[:data][:Type]}'." if @type.to_s.strip.length <= 0
|
80
89
|
end
|
81
90
|
|
82
91
|
return @type
|
83
92
|
end
|
84
93
|
|
94
|
+
#Return true if the columns allows null. Otherwise false.
|
85
95
|
def null?
|
86
96
|
return false if @args[:data][:Null] == "NO"
|
87
97
|
return true
|
88
98
|
end
|
89
99
|
|
100
|
+
#Returns the maxlength.
|
90
101
|
def maxlength
|
91
|
-
self.type
|
102
|
+
self.type if !@maxlength
|
92
103
|
return @maxlength if @maxlength
|
93
104
|
return false
|
94
105
|
end
|
95
106
|
|
107
|
+
#Returns the default value for the column.
|
96
108
|
def default
|
97
109
|
return false if (self.type == "datetime" or self.type == "date") and @args[:data][:Default].to_s.strip.length <= 0
|
98
110
|
return false if (self.type == "int" or self.type == "bigint") and @args[:data][:Default].to_s.strip.length <= 0
|
@@ -100,24 +112,30 @@ class KnjDB_mysql::Columns::Column
|
|
100
112
|
return @args[:data][:Default]
|
101
113
|
end
|
102
114
|
|
115
|
+
#Returns true if the column is the primary key. Otherwise false.
|
103
116
|
def primarykey?
|
104
|
-
return
|
105
|
-
return
|
117
|
+
return true if @args[:data][:Key] == "PRI"
|
118
|
+
return false
|
106
119
|
end
|
107
120
|
|
121
|
+
#Returns true if the column is auto-increasing. Otherwise false.
|
108
122
|
def autoincr?
|
109
123
|
return true if @args[:data][:Extra].index("auto_increment") != nil
|
110
124
|
return false
|
111
125
|
end
|
112
126
|
|
127
|
+
#Returns the comment for the column.
|
113
128
|
def comment
|
114
129
|
return @args[:data][:Comment]
|
115
130
|
end
|
116
131
|
|
132
|
+
#Drops the column from the table.
|
117
133
|
def drop
|
118
134
|
@args[:db].query("ALTER TABLE `#{@args[:table_name]}` DROP COLUMN `#{self.name}`")
|
135
|
+
return nil
|
119
136
|
end
|
120
137
|
|
138
|
+
#Changes the column properties by the given hash.
|
121
139
|
def change(data)
|
122
140
|
col_escaped = "#{@args[:db].enc_col}#{@args[:db].esc_col(self.name)}#{@args[:db].enc_col}"
|
123
141
|
table_escape = "#{@args[:db].enc_table}#{@args[:db].esc_table(self.table.name)}#{@args[:db].enc_table}"
|