knjrbfw 0.0.32 → 0.0.33
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/Gemfile +2 -0
- data/Gemfile.lock +38 -0
- data/VERSION +1 -1
- data/knjrbfw.gemspec +11 -4
- data/lib/knj/autoload/wref.rb +6 -0
- data/lib/knj/autoload.rb +5 -3
- data/lib/knj/datarow.rb +74 -37
- data/lib/knj/errors.rb +5 -2
- data/lib/knj/http2.rb +8 -2
- data/lib/knj/knj.rb +0 -2
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +22 -4
- data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +6 -8
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +1 -1
- data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +6 -8
- data/lib/knj/knjdb/libknjdb.rb +27 -20
- data/lib/knj/knjdb/revision.rb +1 -1
- data/lib/knj/objects.rb +194 -109
- data/lib/knj/threadhandler.rb +2 -1
- data/lib/knj/unix_proc.rb +3 -3
- data/spec/datet_spec.rb +43 -0
- data/spec/knjrbfw_spec.rb +0 -290
- data/spec/objects_spec.rb +274 -0
- data/spec/php_spec.rb +28 -7
- data/spec/process_spec.rb +7 -1
- data/spec/web_spec.rb +61 -0
- metadata +40 -17
- data/lib/knj/wref.rb +0 -251
- data/spec/wref_spec.rb +0 -10
data/Gemfile
CHANGED
@@ -2,6 +2,8 @@ source "http://rubygems.org"
|
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
|
+
gem "wref"
|
6
|
+
gem "tsafe"
|
5
7
|
|
6
8
|
# Add dependencies to develop your gem here.
|
7
9
|
# Include everything needed to run rake, tests, features, etc.
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.3)
|
5
|
+
git (1.2.5)
|
6
|
+
jeweler (1.6.4)
|
7
|
+
bundler (~> 1.0)
|
8
|
+
git (>= 1.2.5)
|
9
|
+
rake
|
10
|
+
rake (0.9.2.2)
|
11
|
+
rcov (0.9.11)
|
12
|
+
rcov (0.9.11-java)
|
13
|
+
rmagick (2.13.1)
|
14
|
+
rspec (2.3.0)
|
15
|
+
rspec-core (~> 2.3.0)
|
16
|
+
rspec-expectations (~> 2.3.0)
|
17
|
+
rspec-mocks (~> 2.3.0)
|
18
|
+
rspec-core (2.3.1)
|
19
|
+
rspec-expectations (2.3.0)
|
20
|
+
diff-lcs (~> 1.1.2)
|
21
|
+
rspec-mocks (2.3.0)
|
22
|
+
sqlite3 (1.3.6)
|
23
|
+
tsafe (0.0.0)
|
24
|
+
wref (0.0.0)
|
25
|
+
|
26
|
+
PLATFORMS
|
27
|
+
java
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
bundler (>= 1.0.0)
|
32
|
+
jeweler (~> 1.6.3)
|
33
|
+
rcov
|
34
|
+
rmagick
|
35
|
+
rspec (~> 2.3.0)
|
36
|
+
sqlite3
|
37
|
+
tsafe
|
38
|
+
wref
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.33
|
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.33"
|
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-18}
|
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 = [
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
".document",
|
21
21
|
".rspec",
|
22
22
|
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
23
24
|
"LICENSE.txt",
|
24
25
|
"README.rdoc",
|
25
26
|
"Rakefile",
|
@@ -50,6 +51,7 @@ Gem::Specification.new do |s|
|
|
50
51
|
"lib/knj/autoload/sqlite3.rb",
|
51
52
|
"lib/knj/autoload/tmail.rb",
|
52
53
|
"lib/knj/autoload/tzinfo.rb",
|
54
|
+
"lib/knj/autoload/wref.rb",
|
53
55
|
"lib/knj/autoload/xmlsimple.rb",
|
54
56
|
"lib/knj/autoload/zip.rb",
|
55
57
|
"lib/knj/cmd_gen.rb",
|
@@ -242,7 +244,6 @@ Gem::Specification.new do |s|
|
|
242
244
|
"lib/knj/win.rb",
|
243
245
|
"lib/knj/win_registry.rb",
|
244
246
|
"lib/knj/win_tightvnc.rb",
|
245
|
-
"lib/knj/wref.rb",
|
246
247
|
"lib/knj/x11vnc.rb",
|
247
248
|
"lib/knj/youtube.rb",
|
248
249
|
"lib/knjrbfw.rb",
|
@@ -253,6 +254,7 @@ Gem::Specification.new do |s|
|
|
253
254
|
"spec/db_spec_encoding_test_file.txt",
|
254
255
|
"spec/http2_spec.rb",
|
255
256
|
"spec/knjrbfw_spec.rb",
|
257
|
+
"spec/objects_spec.rb",
|
256
258
|
"spec/php_spec.rb",
|
257
259
|
"spec/process_meta_spec.rb",
|
258
260
|
"spec/process_spec.rb",
|
@@ -260,7 +262,6 @@ Gem::Specification.new do |s|
|
|
260
262
|
"spec/strings_spec.rb",
|
261
263
|
"spec/threadsafe_spec.rb",
|
262
264
|
"spec/web_spec.rb",
|
263
|
-
"spec/wref_spec.rb",
|
264
265
|
"testfiles/image.jpg"
|
265
266
|
]
|
266
267
|
s.homepage = %q{http://github.com/kaspernj/knjrbfw}
|
@@ -273,6 +274,8 @@ Gem::Specification.new do |s|
|
|
273
274
|
s.specification_version = 3
|
274
275
|
|
275
276
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
277
|
+
s.add_runtime_dependency(%q<wref>, [">= 0"])
|
278
|
+
s.add_runtime_dependency(%q<tsafe>, [">= 0"])
|
276
279
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
277
280
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
278
281
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
|
@@ -280,6 +283,8 @@ Gem::Specification.new do |s|
|
|
280
283
|
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
281
284
|
s.add_development_dependency(%q<rmagick>, [">= 0"])
|
282
285
|
else
|
286
|
+
s.add_dependency(%q<wref>, [">= 0"])
|
287
|
+
s.add_dependency(%q<tsafe>, [">= 0"])
|
283
288
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
284
289
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
285
290
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
@@ -288,6 +293,8 @@ Gem::Specification.new do |s|
|
|
288
293
|
s.add_dependency(%q<rmagick>, [">= 0"])
|
289
294
|
end
|
290
295
|
else
|
296
|
+
s.add_dependency(%q<wref>, [">= 0"])
|
297
|
+
s.add_dependency(%q<tsafe>, [">= 0"])
|
291
298
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
292
299
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
293
300
|
s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
|
data/lib/knj/autoload.rb
CHANGED
@@ -6,7 +6,6 @@ module Knj
|
|
6
6
|
autoload :Fs, $knjpath + "fs/fs"
|
7
7
|
autoload :Php_parser, $knjpath + "php_parser/php_parser"
|
8
8
|
autoload :SSHRobot, $knjpath + "sshrobot/sshrobot"
|
9
|
-
autoload :Wref_map, $knjpath + "wref"
|
10
9
|
end
|
11
10
|
|
12
11
|
#ruby objects.
|
@@ -85,6 +84,9 @@ end
|
|
85
84
|
autoload :Dictionary, $knjpath + "autoload/facets_dictionary"
|
86
85
|
|
87
86
|
#gems
|
88
|
-
autoload :Facebooker, $knjpath + "autoload/facebooker"
|
89
|
-
autoload :Cinch, $knjpath + "autoload/cinch"
|
90
87
|
autoload :ActiveSupport, $knjpath + "autoload/activesupport"
|
88
|
+
autoload :Cinch, $knjpath + "autoload/cinch"
|
89
|
+
autoload :Facebooker, $knjpath + "autoload/facebooker"
|
90
|
+
autoload :Tsafe, "tsafe"
|
91
|
+
autoload :Wref, $knjpath + "autoload/wref"
|
92
|
+
autoload :Wref_map, $knjpath + "autoload/wref"
|
data/lib/knj/datarow.rb
CHANGED
@@ -5,7 +5,10 @@
|
|
5
5
|
# user = ob.get(:User, 1) #=> <Models::User> that extends <Knj::Datarow>
|
6
6
|
class Knj::Datarow
|
7
7
|
#Returns the data-hash that contains all the data from the database.
|
8
|
-
|
8
|
+
def data
|
9
|
+
self.reload if @should_reload
|
10
|
+
return @data
|
11
|
+
end
|
9
12
|
|
10
13
|
#Returns the Knj::Objects which handels this model.
|
11
14
|
attr_reader :ob
|
@@ -482,63 +485,92 @@ class Knj::Datarow
|
|
482
485
|
@classname = newclassname
|
483
486
|
end
|
484
487
|
|
485
|
-
#Initializes the object. This should be called from Knj::Objects.
|
486
|
-
|
487
|
-
|
488
|
-
|
488
|
+
#Initializes the object. This should be called from 'Knj::Objects' and not manually.
|
489
|
+
#===Examples
|
490
|
+
# user = ob.get(:User, 3)
|
491
|
+
def initialize(data, args = nil)
|
492
|
+
@ob = self.class.ob
|
489
493
|
raise "No ob given." if !@ob
|
494
|
+
@db = ob.db
|
490
495
|
|
491
|
-
if
|
492
|
-
@data =
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
+
if data.is_a?(Hash) and data.key?(:id)
|
497
|
+
@data = data
|
498
|
+
@id = @data[:id].to_i
|
499
|
+
elsif data
|
500
|
+
@id = data.to_i
|
501
|
+
|
502
|
+
classname = self.class.classname.to_sym
|
503
|
+
if @ob.ids_cache_should.key?(classname)
|
504
|
+
#ID caching is enabled for this model - dont reload until first use.
|
505
|
+
raise Knj::Errors::NotFound, "ID was not found in cache: '#{id}'." if !@ob.ids_cache[classname].key?(@id)
|
506
|
+
@should_reload = true
|
507
|
+
else
|
508
|
+
#ID caching is not enabled - reload now to check if row exists. Else set 'should_reload'-variable if 'skip_reload' is set.
|
509
|
+
if !args or !args[:skip_reload]
|
510
|
+
self.reload
|
511
|
+
else
|
512
|
+
@should_reload = true
|
513
|
+
end
|
514
|
+
end
|
496
515
|
else
|
497
|
-
raise Knj::Errors::InvalidData, "Could not figure out the data from '#{
|
516
|
+
raise Knj::Errors::InvalidData, "Could not figure out the data from '#{data.class.name}'."
|
498
517
|
end
|
518
|
+
|
519
|
+
raise "Invalid ID: '#{@id}'." if @id.to_i <= 0
|
499
520
|
end
|
500
521
|
|
501
522
|
#Reloads the data from the database.
|
523
|
+
#===Examples
|
502
524
|
# old_username = user[:username]
|
503
525
|
# user.reload
|
504
526
|
# print "The username changed in the database!" if user[:username] != old_username
|
505
527
|
def reload
|
506
|
-
data = @db.single(self.table, {:id => @
|
507
|
-
if
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
528
|
+
@data = @db.single(self.table, {:id => @id})
|
529
|
+
raise Knj::Errors::NotFound, "Could not find any data for the object with ID: '#{@id}' in the table '#{self.table}'." if !@data
|
530
|
+
@should_reload = false
|
531
|
+
end
|
532
|
+
|
533
|
+
#Tells the object that it should reloads its data because it has changed. It wont reload before it is required though, which may save you a couple of SQL-calls.
|
534
|
+
#===Examples
|
535
|
+
# obj = _ob.get(:User, 5)
|
536
|
+
# obj.should_reload
|
537
|
+
def should_reload
|
538
|
+
@should_reload = true
|
539
|
+
@data = nil
|
512
540
|
end
|
513
541
|
|
514
542
|
#Writes/updates new data for the object.
|
515
543
|
#===Examples
|
516
544
|
# user.update(:username => 'New username', :date_changed => Time.now)
|
517
545
|
def update(newdata)
|
518
|
-
@db.update(self.table, newdata, {:id => @
|
519
|
-
self.
|
520
|
-
|
521
|
-
if @ob
|
522
|
-
@ob.call("object" => self, "signal" => "update")
|
523
|
-
end
|
546
|
+
@db.update(self.table, newdata, {:id => @id})
|
547
|
+
self.should_reload
|
548
|
+
@ob.call("object" => self, "signal" => "update") if @ob
|
524
549
|
end
|
525
550
|
|
526
551
|
#Forcefully destroys the object. This is done after deleting it and should not be called manually.
|
527
552
|
def destroy
|
553
|
+
@id = nil
|
528
554
|
@ob = nil
|
529
555
|
@db = nil
|
530
556
|
@data = nil
|
557
|
+
@should_reload = nil
|
531
558
|
end
|
532
559
|
|
533
560
|
#Returns true if that key exists on the object.
|
561
|
+
#===Examples
|
562
|
+
# print "Looks like the user has a name." if user.key?(:name)
|
534
563
|
def key?(key)
|
564
|
+
self.reload if @should_reload
|
535
565
|
return @data.key?(key.to_sym)
|
536
566
|
end
|
537
567
|
alias has_key? key?
|
538
568
|
|
539
569
|
#Returns true if the object has been deleted.
|
570
|
+
#===Examples
|
571
|
+
# print "That user is deleted." if user.deleted?
|
540
572
|
def deleted?
|
541
|
-
return true if !@ob and !@data
|
573
|
+
return true if !@ob and !@data and !@id
|
542
574
|
return false
|
543
575
|
end
|
544
576
|
|
@@ -548,9 +580,11 @@ class Knj::Datarow
|
|
548
580
|
# print "ID again: #{user.id}\n"
|
549
581
|
def [](key)
|
550
582
|
raise "Key was not a symbol: '#{key.class.name}'." if !key.is_a?(Symbol)
|
551
|
-
|
583
|
+
return @id if !@data and key == :id and @id
|
584
|
+
self.reload if @should_reload
|
585
|
+
raise "No data was loaded on the object? Maybe you are trying to call a deleted object? (#{self.class.classname}(#{@id}), #{@should_reload})" if !@data
|
552
586
|
return @data[key] if @data.key?(key)
|
553
|
-
raise "No such key: '#{key}' on '#{self.class.name}'."
|
587
|
+
raise "No such key: '#{key}' on '#{self.class.name}' (#{@data.keys.join(", ")}) (#{@should_reload})."
|
554
588
|
end
|
555
589
|
|
556
590
|
#Writes/updates a keys value on the object.
|
@@ -558,21 +592,26 @@ class Knj::Datarow
|
|
558
592
|
# user[:username] = 'New username'
|
559
593
|
def []=(key, value)
|
560
594
|
self.update(key.to_sym => value)
|
561
|
-
self.
|
595
|
+
self.should_reload
|
562
596
|
end
|
563
597
|
|
564
598
|
#Returns the objects ID.
|
565
599
|
def id
|
566
600
|
raise "This object has been deleted." if self.deleted?
|
567
|
-
raise "No
|
568
|
-
return @
|
601
|
+
raise "No ID on object." if !@id
|
602
|
+
return @id
|
569
603
|
end
|
570
604
|
|
571
|
-
#This enable
|
572
|
-
|
605
|
+
#This enable Wref to not return the wrong object.
|
606
|
+
def __object_unique_id__
|
607
|
+
return 0 if self.deleted?
|
608
|
+
return self.id
|
609
|
+
end
|
573
610
|
|
574
611
|
#Tries to figure out, and returns, the possible name or title for the object.
|
575
612
|
def name
|
613
|
+
self.reload if @should_reload
|
614
|
+
|
576
615
|
if @data.key?(:title)
|
577
616
|
return @data[:title]
|
578
617
|
elsif @data.key?(:name)
|
@@ -590,10 +629,7 @@ class Knj::Datarow
|
|
590
629
|
#Calls the name-method and returns a HTML-escaped value. Also "[no name]" if the name is empty.
|
591
630
|
def name_html
|
592
631
|
name_str = self.name.to_s
|
593
|
-
if name_str.length <= 0
|
594
|
-
name_str = "[no name]"
|
595
|
-
end
|
596
|
-
|
632
|
+
name_str = "[no name]" if name_str.length <= 0
|
597
633
|
return name_str
|
598
634
|
end
|
599
635
|
|
@@ -605,8 +641,9 @@ class Knj::Datarow
|
|
605
641
|
# user.each do |key, val|
|
606
642
|
# print "#{key}: #{val}\n" #=> username: John Doe
|
607
643
|
# end
|
608
|
-
def each(&
|
609
|
-
|
644
|
+
def each(*args, &block)
|
645
|
+
self.reload if @should_reload
|
646
|
+
return @data.each(*args, &block)
|
610
647
|
end
|
611
648
|
|
612
649
|
private
|
data/lib/knj/errors.rb
CHANGED
@@ -34,8 +34,11 @@ module Knj::Errors
|
|
34
34
|
str = ""
|
35
35
|
|
36
36
|
if args[:html]
|
37
|
-
str << "<b>#{err.class.name}</b>: #{err.message}<br />\n<br />\n"
|
38
|
-
|
37
|
+
str << "<b>#{Knj::Web.html(err.class.name)}</b>: #{Knj::Web.html(err.message)}<br />\n<br />\n"
|
38
|
+
|
39
|
+
err.backtrace.each do |bt|
|
40
|
+
str << "#{Knj::Web.html(bt)}<br />\n"
|
41
|
+
end
|
39
42
|
else
|
40
43
|
str << "#{err.class.name}: #{err.message}\n\n"
|
41
44
|
str << err.backtrace.join("\n")
|
data/lib/knj/http2.rb
CHANGED
@@ -273,16 +273,22 @@ class Knj::Http2
|
|
273
273
|
|
274
274
|
if val.class.name == "Tempfile" and val.respond_to?("original_filename")
|
275
275
|
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val.original_filename}\";#{@nl}"
|
276
|
+
praw << "Content-Length: #{val.bytesize}#{@nl}"
|
277
|
+
elsif val.is_a?(Hash) and val[:filename]
|
278
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val[:filename]}\";#{@nl}"
|
279
|
+
praw << "Content-Length: #{val[:content].bytesize}#{@nl}"
|
276
280
|
else
|
277
281
|
praw << "Content-Disposition: form-data; name=\"#{key}\";#{@nl}"
|
282
|
+
praw << "Content-Length: #{val.bytesize}#{@nl}"
|
278
283
|
end
|
279
284
|
|
280
285
|
praw << "Content-Type: text/plain#{@nl}"
|
281
|
-
praw << "Content-Length: #{val.length}#{@nl}"
|
282
286
|
praw << @nl
|
283
287
|
|
284
288
|
if val.is_a?(StringIO)
|
285
289
|
praw << val.read
|
290
|
+
elsif val.is_a?(Hash) and val[:content]
|
291
|
+
praw << val[:content].to_s
|
286
292
|
else
|
287
293
|
praw << val.to_s
|
288
294
|
end
|
@@ -292,7 +298,7 @@ class Knj::Http2
|
|
292
298
|
|
293
299
|
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
294
300
|
header_str << "Content-Type: multipart/form-data; boundary=#{boundary}#{@nl}"
|
295
|
-
header_str << self.header_str(self.default_headers(args).merge("Content-Length" => praw.
|
301
|
+
header_str << self.header_str(self.default_headers(args).merge("Content-Length" => praw.bytesize), args)
|
296
302
|
header_str << "#{@nl}"
|
297
303
|
header_str << praw
|
298
304
|
header_str << "--#{boundary}--"
|
data/lib/knj/knj.rb
CHANGED
@@ -263,15 +263,15 @@ class KnjDB_mysql
|
|
263
263
|
case @subtype
|
264
264
|
when "mysql"
|
265
265
|
@mutex.synchronize do
|
266
|
-
return @conn.insert_id
|
266
|
+
return @conn.insert_id.to_i
|
267
267
|
end
|
268
268
|
when "mysql2"
|
269
269
|
@mutex.synchronize do
|
270
|
-
return @conn.last_id
|
270
|
+
return @conn.last_id.to_i
|
271
271
|
end
|
272
272
|
when "java"
|
273
273
|
data = self.query("SELECT LAST_INSERT_ID() AS id").fetch
|
274
|
-
return data[:id] if data.key?(:id)
|
274
|
+
return data[:id].to_i if data.key?(:id)
|
275
275
|
raise "Could not figure out last inserted ID."
|
276
276
|
end
|
277
277
|
end
|
@@ -294,7 +294,8 @@ class KnjDB_mysql
|
|
294
294
|
@port = nil
|
295
295
|
end
|
296
296
|
|
297
|
-
|
297
|
+
#Inserts multiple rows in a table. Can return the inserted IDs if asked to in arguments.
|
298
|
+
def insert_multi(tablename, arr_hashes, args = nil)
|
298
299
|
sql = "INSERT INTO `#{self.esc_table(tablename)}` ("
|
299
300
|
|
300
301
|
first = true
|
@@ -329,6 +330,23 @@ class KnjDB_mysql
|
|
329
330
|
sql << ")"
|
330
331
|
|
331
332
|
self.query(sql)
|
333
|
+
|
334
|
+
if args and args[:return_id]
|
335
|
+
first_id = self.lastID
|
336
|
+
raise "Invalid ID: #{first_id}" if first_id.to_i <= 0
|
337
|
+
ids = [first_id]
|
338
|
+
1.upto(arr_hashes.length - 1) do |count|
|
339
|
+
ids << first_id + count
|
340
|
+
end
|
341
|
+
|
342
|
+
ids_length = ids.length
|
343
|
+
arr_hashes_length = arr_hashes.length
|
344
|
+
raise "Invalid length (#{ids_length}, #{arr_hashes_length})." if ids_length != arr_hashes_length
|
345
|
+
|
346
|
+
return ids
|
347
|
+
else
|
348
|
+
return nil
|
349
|
+
end
|
332
350
|
end
|
333
351
|
end
|
334
352
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "#{$knjpath}wref"
|
2
|
-
|
3
1
|
class KnjDB_mysql::Tables
|
4
2
|
attr_reader :db, :list
|
5
3
|
|
@@ -8,7 +6,7 @@ class KnjDB_mysql::Tables
|
|
8
6
|
@db = @args[:db]
|
9
7
|
@subtype = @db.opts[:subtype]
|
10
8
|
@list_mutex = Mutex.new
|
11
|
-
@list =
|
9
|
+
@list = Wref_map.new
|
12
10
|
@list_should_be_reloaded = true
|
13
11
|
end
|
14
12
|
|
@@ -22,7 +20,7 @@ class KnjDB_mysql::Tables
|
|
22
20
|
|
23
21
|
begin
|
24
22
|
return @list[table_name]
|
25
|
-
rescue
|
23
|
+
rescue Wref::Recycled
|
26
24
|
#ignore.
|
27
25
|
end
|
28
26
|
|
@@ -105,8 +103,8 @@ class KnjDB_mysql::Tables::Table
|
|
105
103
|
@db = args[:db]
|
106
104
|
@data = args[:data]
|
107
105
|
@subtype = @db.opts[:subtype]
|
108
|
-
@list =
|
109
|
-
@indexes_list =
|
106
|
+
@list = Wref_map.new
|
107
|
+
@indexes_list = Wref_map.new
|
110
108
|
|
111
109
|
raise "Could not figure out name from: '#{@data}'." if !@data[:Name]
|
112
110
|
end
|
@@ -143,7 +141,7 @@ class KnjDB_mysql::Tables::Table
|
|
143
141
|
|
144
142
|
begin
|
145
143
|
return @list[name]
|
146
|
-
rescue
|
144
|
+
rescue Wref::Recycled
|
147
145
|
#ignore.
|
148
146
|
end
|
149
147
|
|
@@ -223,7 +221,7 @@ class KnjDB_mysql::Tables::Table
|
|
223
221
|
|
224
222
|
begin
|
225
223
|
return @indexes_list[name]
|
226
|
-
rescue
|
224
|
+
rescue Wref::Recycled
|
227
225
|
#ignore.
|
228
226
|
end
|
229
227
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "#{$knjpath}wref"
|
2
|
-
|
3
1
|
class KnjDB_sqlite3::Tables
|
4
2
|
attr_reader :db, :driver
|
5
3
|
|
@@ -8,7 +6,7 @@ class KnjDB_sqlite3::Tables
|
|
8
6
|
@db = @args[:db]
|
9
7
|
|
10
8
|
@list_mutex = Mutex.new
|
11
|
-
@list =
|
9
|
+
@list = Wref_map.new
|
12
10
|
end
|
13
11
|
|
14
12
|
def [](table_name)
|
@@ -16,7 +14,7 @@ class KnjDB_sqlite3::Tables
|
|
16
14
|
|
17
15
|
begin
|
18
16
|
return @list[table_name]
|
19
|
-
rescue
|
17
|
+
rescue Wref::Recycled
|
20
18
|
#ignore.
|
21
19
|
end
|
22
20
|
|
@@ -83,8 +81,8 @@ class KnjDB_sqlite3::Tables::Table
|
|
83
81
|
@db = args[:db]
|
84
82
|
@data = args[:data]
|
85
83
|
|
86
|
-
@list =
|
87
|
-
@indexes_list =
|
84
|
+
@list = Wref_map.new
|
85
|
+
@indexes_list = Wref_map.new
|
88
86
|
end
|
89
87
|
|
90
88
|
def name
|
@@ -267,13 +265,13 @@ class KnjDB_sqlite3::Tables::Table
|
|
267
265
|
|
268
266
|
begin
|
269
267
|
return @indexes_list[name]
|
270
|
-
rescue
|
268
|
+
rescue Wref::Recycled
|
271
269
|
if @db.opts[:index_append_table_name]
|
272
270
|
tryname = "#{self.name}__#{name}"
|
273
271
|
|
274
272
|
begin
|
275
273
|
return @indexes_list[tryname]
|
276
|
-
rescue
|
274
|
+
rescue Wref::Recycled
|
277
275
|
#ignore.
|
278
276
|
end
|
279
277
|
else
|
data/lib/knj/knjdb/libknjdb.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "wref"
|
3
|
+
|
1
4
|
#A wrapper of several possible database-types.
|
2
5
|
#
|
3
6
|
#===Examples
|
@@ -28,7 +31,8 @@ class Knj::Db
|
|
28
31
|
@int_types = ["int", "bigint", "tinyint", "smallint", "mediumint"]
|
29
32
|
|
30
33
|
if !@opts[:threadsafe]
|
31
|
-
|
34
|
+
require "monitor"
|
35
|
+
@mutex = Monitor.new
|
32
36
|
end
|
33
37
|
|
34
38
|
@debug = @opts[:debug]
|
@@ -209,7 +213,7 @@ class Knj::Db
|
|
209
213
|
#===Examples
|
210
214
|
# db.insert(:users, {:name => "John", :lastname => "Doe"})
|
211
215
|
# id = db.insert(:users, {:name => "John", :lastname => "Doe"}, :return_id => true)
|
212
|
-
def insert(tablename, arr_insert, args =
|
216
|
+
def insert(tablename, arr_insert, args = nil)
|
213
217
|
self.conn_exec do |driver|
|
214
218
|
sql = "INSERT INTO #{driver.escape_table}#{tablename.to_s}#{driver.escape_table} ("
|
215
219
|
|
@@ -240,25 +244,37 @@ class Knj::Db
|
|
240
244
|
sql << ")"
|
241
245
|
|
242
246
|
driver.query(sql)
|
243
|
-
return driver.lastID if args[:return_id]
|
247
|
+
return driver.lastID if args and args[:return_id]
|
244
248
|
end
|
245
249
|
end
|
246
250
|
|
247
|
-
#Simply and optimal insert multiple rows into a table in a single query.
|
251
|
+
#Simply and optimal insert multiple rows into a table in a single query. Uses the drivers functionality if supported or inserts each row manually.
|
248
252
|
#
|
249
253
|
#===Examples
|
250
254
|
# db.insert_multi(:users, [
|
251
255
|
# {:name => "John", :lastname => "Doe"},
|
252
256
|
# {:name => "Kasper", :lastname => "Johansen"}
|
253
257
|
# ])
|
254
|
-
def insert_multi(tablename, arr_hashes)
|
258
|
+
def insert_multi(tablename, arr_hashes, args = nil)
|
259
|
+
return false if arr_hashes.empty?
|
260
|
+
|
255
261
|
self.conn_exec do |driver|
|
256
262
|
if driver.respond_to?(:insert_multi)
|
257
|
-
return
|
258
|
-
driver.insert_multi(tablename, arr_hashes)
|
263
|
+
return driver.insert_multi(tablename, arr_hashes, args)
|
259
264
|
else
|
265
|
+
ids = [] if args and args[:return_id]
|
260
266
|
arr_hashes.each do |hash|
|
261
|
-
|
267
|
+
if ids
|
268
|
+
ids << self.insert(tablename, hash, args)
|
269
|
+
else
|
270
|
+
self.insert(tablename, hash)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
if ids
|
275
|
+
return ids
|
276
|
+
else
|
277
|
+
return nil
|
262
278
|
end
|
263
279
|
end
|
264
280
|
end
|
@@ -416,18 +432,9 @@ class Knj::Db
|
|
416
432
|
@conns.free(conn)
|
417
433
|
end
|
418
434
|
elsif @conn
|
419
|
-
|
420
|
-
@
|
421
|
-
|
422
|
-
return nil
|
423
|
-
end
|
424
|
-
rescue ThreadError => e
|
425
|
-
if e.message != "deadlock; recursive locking"
|
426
|
-
yield(@conn)
|
427
|
-
return nil
|
428
|
-
else
|
429
|
-
raise e
|
430
|
-
end
|
435
|
+
@mutex.synchronize do
|
436
|
+
yield(@conn)
|
437
|
+
return nil
|
431
438
|
end
|
432
439
|
end
|
433
440
|
|
data/lib/knj/knjdb/revision.rb
CHANGED
@@ -217,7 +217,7 @@ class Knj::Db::Revision
|
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
220
|
-
|
220
|
+
rows_init("db" => db, "table" => table_obj, "rows" => table_data["rows"]) if table_data and table_data["rows"]
|
221
221
|
rescue Knj::Errors::NotFound => e
|
222
222
|
if table_data["renames"]
|
223
223
|
table_data["renames"].each do |table_name_rename|
|