knjrbfw 0.0.28 → 0.0.29

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 CHANGED
@@ -7,7 +7,7 @@ source "http://rubygems.org"
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
9
  gem "rspec", "~> 2.3.0"
10
- gem "bundler", "~> 1.0.0"
10
+ gem "bundler", ">= 1.0.0"
11
11
  gem "jeweler", "~> 1.6.3"
12
12
  gem "rcov", ">= 0"
13
13
  gem "sqlite3" if RUBY_ENGINE != "jruby"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.28
1
+ 0.0.29
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.28"
8
+ s.version = "0.0.29"
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-04-27}
12
+ s.date = %q{2012-05-03}
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 = [
@@ -156,6 +156,7 @@ Gem::Specification.new do |s|
156
156
  "lib/knj/jruby-gtk2/treeview.rb",
157
157
  "lib/knj/jruby-gtk2/vbox.rb",
158
158
  "lib/knj/jruby-gtk2/window.rb",
159
+ "lib/knj/jruby/sqlitejdbc-v056.jar",
159
160
  "lib/knj/jruby_compiler.rb",
160
161
  "lib/knj/knj.rb",
161
162
  "lib/knj/knj_controller.rb",
@@ -233,6 +234,7 @@ Gem::Specification.new do |s|
233
234
  "lib/knj/thread2.rb",
234
235
  "lib/knj/threadhandler.rb",
235
236
  "lib/knj/threadpool.rb",
237
+ "lib/knj/threadsafe.rb",
236
238
  "lib/knj/translations.rb",
237
239
  "lib/knj/unix_proc.rb",
238
240
  "lib/knj/web.rb",
@@ -270,14 +272,14 @@ Gem::Specification.new do |s|
270
272
 
271
273
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
272
274
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
273
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
275
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
274
276
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.3"])
275
277
  s.add_development_dependency(%q<rcov>, [">= 0"])
276
278
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
277
279
  s.add_development_dependency(%q<rmagick>, [">= 0"])
278
280
  else
279
281
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
280
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
282
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
281
283
  s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
282
284
  s.add_dependency(%q<rcov>, [">= 0"])
283
285
  s.add_dependency(%q<sqlite3>, [">= 0"])
@@ -285,7 +287,7 @@ Gem::Specification.new do |s|
285
287
  end
286
288
  else
287
289
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
288
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
290
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
289
291
  s.add_dependency(%q<jeweler>, ["~> 1.6.3"])
290
292
  s.add_dependency(%q<rcov>, [">= 0"])
291
293
  s.add_dependency(%q<sqlite3>, [">= 0"])
@@ -1,3 +1,3 @@
1
1
  require "rubygems"
2
- require File.dirname(__FILE__) + "/json_autoload"
2
+ require "#{File.dirname(__FILE__)}/json_autoload"
3
3
  require "facebooker"
data/lib/knj/eruby.rb CHANGED
@@ -18,7 +18,7 @@ class Knj::Eruby
18
18
  if RUBY_PLATFORM == "java" or RUBY_ENGINE == "rbx"
19
19
  @cache_mode = :code_eval
20
20
  #@cache_mode = :compile_knj
21
- elsif RUBY_VERSION.slice(0..2) == "1.9" and RubyVM::InstructionSequence.respond_to?(:compile_file)
21
+ elsif RUBY_VERSION.slice(0..2) == "1.9" #and RubyVM::InstructionSequence.respond_to?(:compile_file)
22
22
  @cache_mode = :code_eval
23
23
  #@cache_mode = :inseq
24
24
  #@cache_mode = :compile_knj
@@ -37,21 +37,19 @@ class Knj::Eruby
37
37
  @error = false
38
38
  Dir.mkdir(@tmpdir) if !File.exists?(@tmpdir)
39
39
  filename = File.expand_path(filename)
40
- raise "File does not exist: #{filename}" if !File.exists?(filename)
41
- filetime = File.mtime(filename)
40
+ raise "File does not exist: #{filename}" unless File.exists?(filename)
42
41
  cachename = "#{@tmpdir}/#{filename.gsub("/", "_").gsub(".", "_")}.cache"
42
+ filetime = File.mtime(filename)
43
43
  cachetime = File.mtime(cachename) if File.exists?(cachename)
44
44
 
45
+ if !File.exists?(cachename) or filetime > cachetime
46
+ Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
47
+ File.chmod(0777, cachename)
48
+ cachetime = File.mtime(cachename)
49
+ reload_cache = true
50
+ end
51
+
45
52
  begin
46
- if !File.exists?(cachename) or filetime > cachetime
47
- Knj::Eruby::Handler.load_file(filename, {:cachename => cachename})
48
- File.chmod(0777, cachename)
49
- cachetime = File.mtime(cachename)
50
- reload_cache = true
51
- elsif !@cache.key?(cachename)
52
- reload_cache = true
53
- end
54
-
55
53
  case @cache_mode
56
54
  when :compile_knj
57
55
  @compiler.eval_file(:filepath => cachename, :fileident => filename)
@@ -63,9 +61,11 @@ class Knj::Eruby
63
61
  binding_use = eruby_binding.get_binding
64
62
  end
65
63
 
66
- @cache[cachename] = File.read(cachename) if reload_cache
67
- eval(@cache[cachename], binding_use, filename)
64
+ #No reason to cache contents of files - benchmarking showed little to no differene performance-wise, but caching took up a lot of memory, when a lot of files were cached - knj.
65
+ eval(File.read(cachename), binding_use, filename)
68
66
  when :inseq
67
+ reload_cache = true if !@cache.key?(cachename)
68
+
69
69
  if reload_cache or @cache[cachename][:time] < cachetime
70
70
  @cache[cachename] = {
71
71
  :inseq => RubyVM::InstructionSequence.compile(File.read(cachename), filename, nil, 1),
data/lib/knj/gtk2.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  module Knj::Gtk2
2
- autoload :Cb, "knj/gtk2_cb"
3
- autoload :Menu, "knj/gtk2_menu"
4
- autoload :StatusWindow, "knj/gtk2_statuswindow"
5
- autoload :Tv, "knj/gtk2_tv"
2
+ #Autoloader.
3
+ def self.const_missing(name)
4
+ require "#{$knjpath}knj/gtk2_#{name.to_s.downcase}"
5
+ return Knj::Gtk2.const_get(name)
6
+ end
6
7
 
7
8
  def msgbox(p1, p2 = "warning", p3 = "Warning")
8
9
  return Knj::Gtk2.msgbox(p1, p2, p3)
data/lib/knj/http2.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require "#{$knjpath}web"
2
2
 
3
3
  class Knj::Http2
4
- attr_reader :cookies
4
+ attr_reader :cookies, :args
5
5
 
6
6
  def initialize(args = {})
7
7
  args = {:host => args} if args.is_a?(String)
@@ -362,7 +362,7 @@ class Knj::Http2
362
362
  @resp = nil
363
363
  @mode = nil
364
364
 
365
- raise "No status-code was received from the server.\n\nHeaders:\n#{Knj::Php.print_r(resp.headers)}\n\nBody:\n#{resp.args[:body]}" if !resp.args[:code]
365
+ raise "No status-code was received from the server.\n\nHeaders:\n#{Knj::Php.print_r(resp.headers, true)}\n\nBody:\n#{resp.args[:body]}" if !resp.args[:code]
366
366
 
367
367
  if resp.args[:code].to_s == "302" and resp.header?("location") and (!@args.key?(:follow_redirects) or @args[:follow_redirects])
368
368
  uri = URI.parse(resp.header("location"))
Binary file
@@ -21,7 +21,7 @@ class KnjDB_sqlite3
21
21
  if @knjdb.opts[:sqlite_driver]
22
22
  require @knjdb.opts[:sqlite_driver]
23
23
  else
24
- require "#{File.dirname(__FILE__)}/../../sqlitejdbc-v056.jar"
24
+ require "#{File.dirname(__FILE__)}/../../../jruby/sqlitejdbc-v056.jar"
25
25
  end
26
26
 
27
27
  require "java"
@@ -45,7 +45,7 @@ class KnjDB_sqlite3
45
45
  begin
46
46
  return KnjDB_sqlite3_result_java.new(self, @stat.executeQuery(string))
47
47
  rescue java.sql.SQLException => e
48
- if e.message == "java.sql.SQLException: query does not return ResultSet"
48
+ if e.message.to_s.index("query does not return ResultSet") != nil
49
49
  return KnjDB_sqlite3_result_java.new(self, nil)
50
50
  else
51
51
  raise e
@@ -45,7 +45,7 @@ class KnjDB_sqlite3::Tables
45
45
  if block_given?
46
46
  yield(obj)
47
47
  else
48
- ret[d_tables[:Name]] = obj
48
+ ret[d_tables[:name]] = obj
49
49
  end
50
50
  end
51
51
  end
@@ -1,7 +1,8 @@
1
1
  class Knj::Db
2
- unless Kernel.const_defined?("Rho")
3
- autoload :Dbtime, "#{$knjpath}knjdb/dbtime.rb"
4
- autoload :Revision, "#{$knjpath}knjdb/revision.rb"
2
+ #Autoloader.
3
+ def self.const_missing(name)
4
+ require "#{$knjpath}knjdb/#{name.to_s.downcase}"
5
+ return Knj::Db.const_get(name)
5
6
  end
6
7
 
7
8
  attr_reader :opts, :conn, :conns, :int_types
@@ -178,7 +179,7 @@ class Knj::Db
178
179
  end
179
180
 
180
181
  def insert(tablename, arr_insert, args = {})
181
- conn_exec do |driver|
182
+ self.conn_exec do |driver|
182
183
  sql = "INSERT INTO #{driver.escape_table}#{tablename.to_s}#{driver.escape_table} ("
183
184
 
184
185
  first = true
@@ -213,7 +214,7 @@ class Knj::Db
213
214
  end
214
215
 
215
216
  def insert_multi(tablename, arr_hashes)
216
- conn_exec do |driver|
217
+ self.conn_exec do |driver|
217
218
  if driver.respond_to?(:insert_multi)
218
219
  return false if arr_hashes.empty?
219
220
  driver.insert_multi(tablename, arr_hashes)
@@ -228,7 +229,7 @@ class Knj::Db
228
229
  def update(tablename, arr_update, arr_terms = {})
229
230
  return false if arr_update.empty?
230
231
 
231
- conn_exec do |driver|
232
+ self.conn_exec do |driver|
232
233
  sql = ""
233
234
  sql << "UPDATE #{driver.escape_col}#{tablename.to_s}#{driver.escape_col} SET "
234
235
 
@@ -256,7 +257,7 @@ class Knj::Db
256
257
  def select(tablename, arr_terms = nil, args = nil, &block)
257
258
  sql = ""
258
259
 
259
- conn_exec do |driver|
260
+ self.conn_exec do |driver|
260
261
  sql = "SELECT * FROM #{driver.escape_table}#{tablename.to_s}#{driver.escape_table}"
261
262
 
262
263
  if arr_terms != nil and !arr_terms.empty?
@@ -285,18 +286,21 @@ class Knj::Db
285
286
  return self.q(sql, &block)
286
287
  end
287
288
 
288
- def selectsingle(tablename, arr_terms = nil, args = {})
289
- args["limit"] = 1
290
- return self.select(tablename, arr_terms, args).fetch
291
- end
292
-
293
289
  def single(tablename, arr_terms = nil, args = {})
294
290
  args["limit"] = 1
295
- return self.select(tablename, arr_terms, args).fetch
291
+
292
+ #Experienced very weird memory leak if this was not done by block. Maybe bug in Ruby 1.9.2? - knj
293
+ self.select(tablename, arr_terms, args) do |data|
294
+ return data
295
+ end
296
+
297
+ return false
296
298
  end
297
299
 
300
+ alias :selectsingle :single
301
+
298
302
  def delete(tablename, arr_terms)
299
- conn_exec do |driver|
303
+ self.conn_exec do |driver|
300
304
  sql = "DELETE FROM #{driver.escape_table}#{tablename}#{driver.escape_table}"
301
305
 
302
306
  if arr_terms != nil and !arr_terms.empty?
@@ -305,6 +309,8 @@ class Knj::Db
305
309
 
306
310
  driver.query(sql)
307
311
  end
312
+
313
+ return nil
308
314
  end
309
315
 
310
316
  def makeWhere(arr_terms, driver)
@@ -320,6 +326,8 @@ class Knj::Db
320
326
 
321
327
  if value.is_a?(Array)
322
328
  sql << "#{driver.escape_col}#{key}#{driver.escape_col} IN (#{Knj::ArrayExt.join(:arr => value, :sep => ",", :surr => "'", :callback => proc{|ele| self.esc(ele)})})"
329
+ elsif value.is_a?(Hash)
330
+ raise "Dont know how to handle hash."
323
331
  else
324
332
  sql << "#{driver.escape_col}#{key}#{driver.escape_col} = #{driver.escape_val}#{driver.escape(value)}#{driver.escape_val}"
325
333
  end
@@ -540,7 +548,7 @@ class Knj::Db
540
548
  end
541
549
 
542
550
  def method_missing(method_name, *args)
543
- conn_exec do |driver|
551
+ self.conn_exec do |driver|
544
552
  if driver.respond_to?(method_name.to_sym)
545
553
  return driver.send(method_name, *args)
546
554
  end
@@ -64,7 +64,7 @@ class Knj::Objects
64
64
  if val[1] == "asc"
65
65
  ordermode = " ASC"
66
66
  elsif val[1] == "desc"
67
- ordermode = "DESC"
67
+ ordermode = " DESC"
68
68
  end
69
69
 
70
70
  if val[0].is_a?(Array)
data/lib/knj/php.rb CHANGED
@@ -60,7 +60,7 @@ module Knj::Php
60
60
  end
61
61
 
62
62
  retstr << "[#{keystr}] => "
63
- retstr << print_r(pair[1], true, count + 1).to_s
63
+ retstr << Knj::Php.print_r(pair[1], true, count + 1).to_s
64
64
  end
65
65
 
66
66
  i = 0
@@ -107,8 +107,8 @@ module Knj::Php
107
107
  i_spaces += 1
108
108
  end
109
109
 
110
- retstr << "[" + arr_count.to_s + "] => "
111
- retstr << print_r(i, true, count + 1).to_s
110
+ retstr << "[#{arr_count}] => "
111
+ retstr << Knj::Php.print_r(i, true, count + 1).to_s
112
112
  arr_count += 1
113
113
  end
114
114
 
@@ -128,21 +128,21 @@ module Knj::Php
128
128
  elsif argument.is_a?(Exception)
129
129
  retstr << "#\{#{argument.class.to_s}: #{argument.message}}\n"
130
130
  elsif cstr == "Knj::Unix_proc"
131
- retstr << "#{argument.class.to_s}::data - "
132
- retstr << print_r(argument.data, true, count).to_s
131
+ retstr << "#{argument.class.name}::data - "
132
+ retstr << Knj::Php.print_r(argument.data, true, count).to_s
133
133
  elsif cstr == "Thread"
134
- retstr << "#{argument.class.to_s} - "
134
+ retstr << "#{argument.class.name} - "
135
135
 
136
136
  hash = {}
137
137
  argument.keys.each do |key|
138
138
  hash[key] = argument[key]
139
139
  end
140
140
 
141
- retstr << print_r(hash, true, count).to_s
141
+ retstr << Knj::Php.print_r(hash, true, count).to_s
142
142
  elsif cstr == "Class"
143
143
  retstr << "#{argument.class.to_s} - "
144
144
  hash = {"name" => argument.name}
145
- retstr << print_r(hash, true, count).to_s
145
+ retstr << Knj::Php.print_r(hash, true, count).to_s
146
146
  elsif cstr == "URI::Generic"
147
147
  retstr << "#{argument.class.to_s}{\n"
148
148
  methods = [:host, :port, :scheme, :path]
@@ -972,10 +972,5 @@ module Knj::Php
972
972
  return PHP.unserialize(argument.to_s)
973
973
  end
974
974
 
975
- @methods = instance_methods
976
- def self.php_list_defined_methods
977
- return @methods
978
- end
979
-
980
975
  module_function(*instance_methods)
981
976
  end
data/lib/knj/process.rb CHANGED
@@ -128,25 +128,39 @@ class Knj::Process
128
128
  @on_rec.call(result_obj) do |answer_block|
129
129
  $stderr.print "Running enum-block for #{answer_block}\n" if @debug
130
130
 
131
+ #Block has ended on hosts side - break out of block-loop.
131
132
  break if !@blocks_send.key?(id)
133
+
134
+ #Throw the result at the block running.
132
135
  y << answer_block
136
+
137
+ #This is to prevent the block-loop from running again, until host has confirmed it wants another result.
133
138
  dobreak = false
134
139
 
135
140
  loop do
141
+ #Block has ended on hosts-side - break of out block-loop.
136
142
  if !@blocks_send.key?(id)
137
143
  dobreak = true
138
144
  break
139
145
  end
140
146
 
141
- break if @blocks_send[id][:waiting_for_result]
147
+ #If waiting for result then release the loop and return another result.
148
+ if @blocks_send[id][:waiting_for_result]
149
+ @blocks_send[id][:waiting_for_result] = false
150
+ break
151
+ end
152
+
153
+ #Wait a little with checking for another result to not use 100% CPU.
142
154
  sleep 0.01
143
155
  end
144
156
 
157
+ #The block-loop should not run again - it has been prematurely interrupted on the host-side.
145
158
  break if dobreak
146
159
  end
147
160
  end
148
161
  when "send_block_res"
149
162
  begin
163
+ #The host wants another result. Set the 'waiting-for-result' and wait for the enumerator to run. Then return result from enumerator (code is right above here).
150
164
  @blocks_send[obj][:waiting_for_result] = true
151
165
  res = @blocks_send[obj][:enum].next
152
166
  self.answer(id, {"result" => res})
@@ -167,29 +181,38 @@ class Knj::Process
167
181
 
168
182
  self.answer(id, "ok")
169
183
  when "send_block_buffer"
170
- buffer_use = true
171
-
172
184
  Knj::Thread.new do
185
+ mutex = Mutex.new #Protecting 'buffer_answers'-variable. Crashing JRuby...
173
186
  result_obj = Knj::Process::Resultobject.new(:process => self, :id => id, :obj => obj)
174
187
  block_res = nil
188
+ buffer_done = false
175
189
 
176
190
  begin
177
- if buffer_use
178
- buffer_answers = []
179
- buffer_done = false
180
-
181
- buffer_thread = Knj::Thread.new do
182
- loop do
191
+ buffer_answers = []
192
+
193
+ buffer_thread = Knj::Thread.new do
194
+ dobreak = false
195
+ loop do
196
+ arr = nil
197
+ mutex.synchronize do
183
198
  arr = buffer_answers.shift(200)
184
-
185
- if !arr.empty?
186
- $stderr.print "Sending: #{arr.length} results.\n" if @debug
187
- self.answer(id, arr, "answer_block")
188
- else
189
- sleep 0.05
199
+ end
200
+
201
+ if !arr.empty?
202
+ $stderr.print "Sending: #{arr.length} results.\n" if @debug
203
+ self.answer(id, arr, "answer_block")
204
+ else
205
+ $stderr.print "Waiting for buffer-stuff (#{arr.length}, #{buffer_done}).\n" if @debug
206
+ sleep 0.05
207
+ end
208
+
209
+ if buffer_done
210
+ mutex.synchronize do
211
+ $stderr.print "Buffer-answers: #{buffer_answers.length}, #{buffer_answers.empty?}\n" if @debug
212
+ dobreak = true if buffer_answers.empty? #since a break will not affect the real loop in Mutex#synchronize set this variable.
190
213
  end
191
214
 
192
- break if buffer_done and buffer_answers.empty?
215
+ break if dobreak
193
216
  end
194
217
  end
195
218
  end
@@ -198,22 +221,23 @@ class Knj::Process
198
221
  begin
199
222
  count = 0
200
223
  block_res = @on_rec.call(result_obj) do |answer_block|
201
- if buffer_use
202
- loop do
203
- if buffer_answers.length > 1000
204
- $stderr.print "Buffer is more than 1000 - sleeping and tries again in 0.05 sec.\n" if @debug
205
- sleep 0.05
206
- else
207
- break
208
- end
224
+ loop do
225
+ len = nil
226
+ mutex.synchronize do
227
+ len = buffer_answers.length
228
+ end
229
+
230
+ if len > 1000
231
+ $stderr.print "Buffer is more than 1000 - sleeping and tries again in 0.05 sec.\n" if @debug
232
+ sleep 0.05
233
+ else
234
+ break
209
235
  end
210
236
  end
211
237
 
212
238
  count += 1
213
- if buffer_use
239
+ mutex.synchronize do
214
240
  buffer_answers << answer_block
215
- else
216
- self.answer(id, [answer_block], "answer_block")
217
241
  end
218
242
 
219
243
  if count >= 100
@@ -234,10 +258,10 @@ class Knj::Process
234
258
  end
235
259
  end
236
260
  ensure
237
- buffer_done = true if buffer_use
261
+ buffer_done = true
238
262
  end
239
263
  ensure
240
- buffer_thread.join if buffer_use
264
+ buffer_thread.join
241
265
  end
242
266
  rescue Exception => e
243
267
  $stderr.print Knj::Errors.error_str(e) if @debug
@@ -394,7 +394,7 @@ class Knj::Process_meta::Proxy_obj
394
394
 
395
395
  def initialize(args)
396
396
  @args = args
397
- @_process_meta_buffer_use = false
397
+ @_process_meta_block_buffer_use = false
398
398
  ObjectSpace.define_finalizer(self, @args[:process_meta].method(:proxy_finalizer))
399
399
  end
400
400
 
@@ -538,9 +538,13 @@ class Knj::Process_meta::Proxy_obj::Buffered_caller
538
538
  self._pm_flush
539
539
 
540
540
  if @args[:async]
541
+ threads_remove = []
541
542
  @threads.each do |thread|
542
543
  thread.join
544
+ threads_remove << thread
543
545
  end
546
+
547
+ @threads -= threads_remove
544
548
  end
545
549
 
546
550
  raise @raise_error if @raise_error
@@ -354,7 +354,7 @@ end
354
354
 
355
355
  funcs_skip = [:foreach]
356
356
  funcs_remove = [:session_start]
357
- funcs_all = funcs_skip | Knj::Php.php_list_defined_methods
357
+ funcs_all = funcs_skip | Knj::Php.instance_methods
358
358
 
359
359
  funcs_all.each do |method_name|
360
360
  next if funcs_skip.index(method_name) != nil
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "knj/autoload"
4
- include Knj
5
4
 
6
- dgs = Degulesider.new
5
+ dgs = Knj::Degulesider.new
7
6
  results = dgs.search(
8
7
  :where => "Engvej 3, 4970 Rødby"
9
8
  )
10
9
 
11
- Php.print_r(results)
10
+ Knj::Php.print_r(results)
@@ -0,0 +1,33 @@
1
+ #Copied from Headius: https://github.com/headius/thread_safe. Not just bundeled because I would like to make changes later...
2
+ #Minor modifications from Headius's original lib like submoduled, lower-case-safe and more...
3
+
4
+ if defined?(JRUBY_VERSION)
5
+ require "jruby/synchronized"
6
+
7
+ module Knj::Threadsafe
8
+ # A thread-safe subclass of Array. This version locks
9
+ # against the object itself for every method call,
10
+ # ensuring only one thread can be reading or writing
11
+ # at a time. This includes iteration methods like
12
+ # #each.
13
+ class Array < ::Array
14
+ include JRuby::Synchronized
15
+ end
16
+
17
+ # A thread-safe subclass of Hash. This version locks
18
+ # against the object itself for every method call,
19
+ # ensuring only one thread can be reading or writing
20
+ # at a time. This includes iteration methods like
21
+ # #each.
22
+ class Hash < ::Hash
23
+ include JRuby::Synchronized
24
+ end
25
+ end
26
+ else
27
+ # Because MRI never runs code in parallel, the existing
28
+ # non-thread-safe structures should usually work fine.
29
+ module Knj::ThreadSafe
30
+ Array = ::Array
31
+ Hash = ::Hash
32
+ end
33
+ end
data/lib/knj/win.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  module Knj::Win
2
- autoload :Registry, $knjpath + "win_registry"
3
- autoload :TightVNC, $knjpath + "win_tightvnc"
2
+ #Autoloader.
3
+ def self.const_missing(name)
4
+ require "#{$knjpath}knj/win_#{name.to_s.downcase}"
5
+ end
4
6
  end
data/lib/knj/wref.rb CHANGED
@@ -6,6 +6,7 @@ class Knj::Wref
6
6
  @id = obj.__id__
7
7
 
8
8
  if RUBY_ENGINE == "jruby"
9
+ require "java"
9
10
  @weakref = java.lang.ref.WeakReference.new(obj)
10
11
  else
11
12
  @class_name = obj.class.name.to_sym
data/spec/amixer_spec.rb CHANGED
@@ -3,7 +3,6 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
  describe "Amixer" do
4
4
  it "should load by using autoload" do
5
5
  require "knjrbfw"
6
- require "knj/autoload"
7
6
 
8
7
  $amixer = Knj::Amixer.new
9
8
  end
@@ -20,6 +19,7 @@ describe "Amixer" do
20
19
  mixers.each do |name, mixer|
21
20
  next if !mixer.volume?
22
21
  mixer.vol_add -5
22
+ mixer.vol_add 3
23
23
  end
24
24
  end
25
25
  end
data/spec/db_spec.rb CHANGED
@@ -8,7 +8,8 @@ describe "Db" do
8
8
 
9
9
  require "knj/db"
10
10
  require "knj/os"
11
- require "sqlite3" if !Kernel.const_defined?("SQLite3")
11
+ require "rubygems"
12
+ require "sqlite3" if !Kernel.const_defined?("SQLite3") and RUBY_ENGINE != "jruby"
12
13
 
13
14
  db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
14
15
  File.unlink(db_path) if File.exists?(db_path)
@@ -27,6 +28,15 @@ describe "Db" do
27
28
  ]
28
29
  })
29
30
 
31
+
32
+
33
+ #Get a list of tables and check the list for errors.
34
+ list = db.tables.list
35
+ raise "Table not found: 'test'." if !list.key?("test")
36
+ raise "Table-name expected to be 'test' but wasnt: '#{list["test"].name}'." if list["test"].name != "test"
37
+
38
+
39
+ #Test revision to create tables.
30
40
  schema = {
31
41
  "tables" => {
32
42
  "test_table" => {
data/spec/http2_spec.rb CHANGED
@@ -49,7 +49,7 @@ describe "Http2" do
49
49
  ]
50
50
  urls = ["robots.txt"]
51
51
 
52
- http = Knj::Http2.new(:host => "www.partyworm.dk", :debug => true)
52
+ http = Knj::Http2.new(:host => "www.partyworm.dk", :debug => false)
53
53
  0.upto(105) do |count|
54
54
  url = urls[rand(urls.size)]
55
55
  #print "Doing request #{count} of 200 (#{url}).\n"
data/spec/knjrbfw_spec.rb CHANGED
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
3
  describe "Knjrbfw" do
4
4
  it "should be able to generate a sample SQLite database and add a sample table, with sample columns and with a sample index to it" do
5
5
  require "knjrbfw"
6
- require "sqlite3"
6
+ require "sqlite3" if RUBY_ENGINE != "jruby"
7
7
 
8
8
  db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
9
9
 
@@ -193,7 +193,7 @@ describe "Knjrbfw" do
193
193
  end
194
194
 
195
195
  it "should delete the temp database again." do
196
- db_path = "#{Dir.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
196
+ db_path = "#{Knj::Os.tmpdir}/knjrbfw_test_sqlite3.sqlite3"
197
197
  File.unlink(db_path) if File.exists?(db_path)
198
198
  end
199
199
 
@@ -296,7 +296,8 @@ describe "Knjrbfw" do
296
296
  end
297
297
 
298
298
  it "should be able to draw rounded transparent corners on images." do
299
- require "rmagick"
299
+ require "rubygems"
300
+ require "RMagick"
300
301
 
301
302
  pic = Magick::Image.read("#{File.dirname(__FILE__)}/../testfiles/image.jpg").first
302
303
  pic.format = "png"
@@ -2,10 +2,11 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Process_meta" do
4
4
  it "should be able to start a server and a client" do
5
- require "knj/autoload"
5
+ require "knj/process_meta"
6
+ require "timeout"
6
7
 
7
8
  #Start the activity.
8
- $process_meta = Knj::Process_meta.new("debug" => false, "debug_err" => true)
9
+ $process_meta = Knj::Process_meta.new("debug" => false, "debug_err" => true, "id" => "process_meta_spec")
9
10
  end
10
11
 
11
12
  it "should be able to do various operations" do
@@ -37,15 +38,13 @@ describe "Process_meta" do
37
38
  $ids << proxy_obj3.__id__
38
39
 
39
40
  proxy_obj.test_block do |i|
40
- if i == 5
41
- break
42
- end
41
+ break if i == 5
43
42
  end
44
43
 
45
44
  last_num = proxy_obj.last_num
46
45
  raise "Expected last num to be 5 but it wasnt: '#{last_num}'." if last_num != 5
47
46
 
48
- #Somehow define_finalizer is always one behind, so we have to do funny one here.
47
+ #Somehow define_finalizer is always one behind, so we have to do another funny one here.
49
48
  ObjectSpace.define_finalizer(self, $process_meta.method(:proxy_finalizer))
50
49
  end
51
50
 
@@ -74,14 +73,16 @@ describe "Process_meta" do
74
73
 
75
74
  #Do a lot of calls at the same time to test thread-safety.
76
75
  threads = []
77
- 0.upto(10) do |i|
78
- should_return = "Kasper".slice(0, i)
79
- threads << Knj::Thread.new do
80
- 0.upto(500) do
81
- res = proxy_obj.slice(0, i)
76
+ 0.upto(10) do |thread_i|
77
+ should_return = "Kasper".slice(0, thread_i)
78
+ thread = Knj::Thread.new do
79
+ 0.upto(500) do |num_i|
80
+ res = proxy_obj.slice(0, thread_i)
82
81
  raise "Should return: '#{should_return}' but didnt: '#{res}'." if res != should_return
83
82
  end
84
83
  end
84
+
85
+ threads << thread
85
86
  end
86
87
 
87
88
  threads.each do |thread|
@@ -99,19 +100,24 @@ describe "Process_meta" do
99
100
  end
100
101
 
101
102
  #Ensure the expected has actually been increased by running the block.
102
- raise "Expected end-result of 11 but got: '#{expect}'." if expect != 1001
103
+ raise "Expected end-result of 1001 but got: '#{expect}'." if expect != 1001
103
104
 
104
105
 
106
+ proxy_int = $process_meta.spawn_object(:Integer, nil, 5)
105
107
  proxy_int._process_meta_block_buffer_use = true
106
108
  expect = 5
107
- proxy_int.upto(10000) do |i|
108
- raise "Expected '#{expect}' but got: '#{i}'." if i != expect
109
- expect += 1
109
+
110
+ #If this takes more than 10 secs - something is wrong (JRuby can take a long time)...
111
+ Timeout.timeout(10) do
112
+ proxy_int.upto(10000) do |i|
113
+ raise "Expected '#{expect}' but got: '#{i}'." if i != expect
114
+ expect += 1
115
+ end
110
116
  end
111
117
 
112
118
 
113
119
  #Ensure the expected has actually been increased by running the block.
114
- raise "Expected end-result of 11 but got: '#{expect}'." if expect != 10001
120
+ raise "Expected end-result of 10001 but got: '#{expect}'." if expect != 10001
115
121
 
116
122
  #Try to unset an object.
117
123
  proxy_obj._process_meta_unset
@@ -132,14 +138,14 @@ describe "Process_meta" do
132
138
  nil
133
139
  ")
134
140
 
135
- Timeout.timeout(5) do
141
+ Timeout.timeout(10) do
136
142
  expect = 8
137
143
  $process_meta.static("Kaspertest", "kaspertest") do |count|
138
- raise "Expected '#{expect}' but got: '#{count}'."
144
+ raise "Expected '#{expect}' but got: '#{count}'." if expect != count
139
145
  expect += 1
140
146
  end
141
147
 
142
- raise "Expected '13' but got: '#{expect}'."
148
+ raise "Expected '13' but got: '#{expect}'." if expect != 13
143
149
  end
144
150
  end
145
151
 
data/spec/process_spec.rb CHANGED
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Process" do
4
4
  it "should be able to start a server and a client" do
5
- require "knj/autoload"
5
+ require "timeout"
6
6
 
7
7
  tcp_server = TCPServer.new("0.0.0.0", 15678)
8
8
  conn_client = TCPSocket.new("localhost", 15678)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knjrbfw
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.28
4
+ version: 0.0.29
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-27 00:00:00.000000000 +02:00
12
+ date: 2012-05-03 00:00:00.000000000 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
17
- requirement: &15665000 !ruby/object:Gem::Requirement
17
+ requirement: &20663780 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,21 +22,21 @@ dependencies:
22
22
  version: 2.3.0
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *15665000
25
+ version_requirements: *20663780
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: bundler
28
- requirement: &15664000 !ruby/object:Gem::Requirement
28
+ requirement: &20663120 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
- - - ~>
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.0.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *15664000
36
+ version_requirements: *20663120
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: jeweler
39
- requirement: &15663060 !ruby/object:Gem::Requirement
39
+ requirement: &20626880 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 1.6.3
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *15663060
47
+ version_requirements: *20626880
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rcov
50
- requirement: &15656020 !ruby/object:Gem::Requirement
50
+ requirement: &20625900 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *15656020
58
+ version_requirements: *20625900
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: sqlite3
61
- requirement: &15655380 !ruby/object:Gem::Requirement
61
+ requirement: &20624280 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *15655380
69
+ version_requirements: *20624280
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rmagick
72
- requirement: &15654840 !ruby/object:Gem::Requirement
72
+ requirement: &20621140 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,7 +77,7 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *15654840
80
+ version_requirements: *20621140
81
81
  description: Including stuff for HTTP, SSH and much more.
82
82
  email: k@spernj.org
83
83
  executables: []
@@ -225,6 +225,7 @@ files:
225
225
  - lib/knj/jruby-gtk2/treeview.rb
226
226
  - lib/knj/jruby-gtk2/vbox.rb
227
227
  - lib/knj/jruby-gtk2/window.rb
228
+ - lib/knj/jruby/sqlitejdbc-v056.jar
228
229
  - lib/knj/jruby_compiler.rb
229
230
  - lib/knj/knj.rb
230
231
  - lib/knj/knj_controller.rb
@@ -302,6 +303,7 @@ files:
302
303
  - lib/knj/thread2.rb
303
304
  - lib/knj/threadhandler.rb
304
305
  - lib/knj/threadpool.rb
306
+ - lib/knj/threadsafe.rb
305
307
  - lib/knj/translations.rb
306
308
  - lib/knj/unix_proc.rb
307
309
  - lib/knj/web.rb
@@ -343,7 +345,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
343
345
  version: '0'
344
346
  segments:
345
347
  - 0
346
- hash: 894302943033086074
348
+ hash: -1825671310375953872
347
349
  required_rubygems_version: !ruby/object:Gem::Requirement
348
350
  none: false
349
351
  requirements: