knjrbfw 0.0.3

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 (208) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +14 -0
  4. data/Gemfile.lock +32 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +49 -0
  8. data/VERSION +1 -0
  9. data/lib/knj/.gitignore +1 -0
  10. data/lib/knj/arrayext.rb +157 -0
  11. data/lib/knj/autoload/activesupport.rb +2 -0
  12. data/lib/knj/autoload/backups/facets_dictionary.rb +430 -0
  13. data/lib/knj/autoload/backups/parsedate.rb +53 -0
  14. data/lib/knj/autoload/backups/ping.rb +64 -0
  15. data/lib/knj/autoload/cinch.rb +2 -0
  16. data/lib/knj/autoload/erubis.rb +6 -0
  17. data/lib/knj/autoload/facebooker.rb +3 -0
  18. data/lib/knj/autoload/facets_dictionary.rb +7 -0
  19. data/lib/knj/autoload/gd2.rb +2 -0
  20. data/lib/knj/autoload/gettext.rb +9 -0
  21. data/lib/knj/autoload/gtk2.rb +5 -0
  22. data/lib/knj/autoload/json_autoload.rb +7 -0
  23. data/lib/knj/autoload/magick.rb +6 -0
  24. data/lib/knj/autoload/mysql.rb +6 -0
  25. data/lib/knj/autoload/parsedate.rb +1 -0
  26. data/lib/knj/autoload/ping.rb +64 -0
  27. data/lib/knj/autoload/rexml.rb +12 -0
  28. data/lib/knj/autoload/soap.rb +3 -0
  29. data/lib/knj/autoload/sqlite3.rb +6 -0
  30. data/lib/knj/autoload/tmail.rb +6 -0
  31. data/lib/knj/autoload/twitter.rb +2 -0
  32. data/lib/knj/autoload/xmlsimple.rb +6 -0
  33. data/lib/knj/autoload/zip.rb +6 -0
  34. data/lib/knj/autoload.rb +136 -0
  35. data/lib/knj/compiler.rb +53 -0
  36. data/lib/knj/cpufreq.rb +40 -0
  37. data/lib/knj/datarow.rb +256 -0
  38. data/lib/knj/datestamp.rb +91 -0
  39. data/lib/knj/datet.rb +448 -0
  40. data/lib/knj/degulesider.rb +46 -0
  41. data/lib/knj/erb/apache_knjerb.conf +8 -0
  42. data/lib/knj/erb/cache/README +1 -0
  43. data/lib/knj/erb/erb.rb +21 -0
  44. data/lib/knj/erb/erb_1.9.rb +13 -0
  45. data/lib/knj/erb/erb_cache_clean.rb +20 -0
  46. data/lib/knj/erb/erb_fcgi.rb +44 -0
  47. data/lib/knj/erb/erb_fcgi_1.9.rb +44 -0
  48. data/lib/knj/erb/erb_fcgi_jruby.rb +7 -0
  49. data/lib/knj/erb/erb_jruby.rb +22 -0
  50. data/lib/knj/erb/include.rb +248 -0
  51. data/lib/knj/errors.rb +19 -0
  52. data/lib/knj/eruby.rb +224 -0
  53. data/lib/knj/event_filemod.rb +53 -0
  54. data/lib/knj/event_handler.rb +69 -0
  55. data/lib/knj/exchangerates.rb +39 -0
  56. data/lib/knj/ext/webrick.rb +31 -0
  57. data/lib/knj/filesystem.rb +8 -0
  58. data/lib/knj/fs/drivers/filesystem.rb +14 -0
  59. data/lib/knj/fs/drivers/ftp.rb +33 -0
  60. data/lib/knj/fs/drivers/ssh.rb +28 -0
  61. data/lib/knj/fs/fs.rb +36 -0
  62. data/lib/knj/gettext_fallback.rb +17 -0
  63. data/lib/knj/gettext_threadded.rb +77 -0
  64. data/lib/knj/google_sitemap.rb +59 -0
  65. data/lib/knj/gtk2.rb +277 -0
  66. data/lib/knj/gtk2_cb.rb +85 -0
  67. data/lib/knj/gtk2_menu.rb +57 -0
  68. data/lib/knj/gtk2_statuswindow.rb +64 -0
  69. data/lib/knj/gtk2_tv.rb +63 -0
  70. data/lib/knj/hash_methods.rb +37 -0
  71. data/lib/knj/http.rb +190 -0
  72. data/lib/knj/includes/appserver_cli.rb +39 -0
  73. data/lib/knj/ip2location.rb +22 -0
  74. data/lib/knj/ironruby-gtk2/button.rb +19 -0
  75. data/lib/knj/ironruby-gtk2/dialog.rb +44 -0
  76. data/lib/knj/ironruby-gtk2/entry.rb +9 -0
  77. data/lib/knj/ironruby-gtk2/gdk_event.rb +3 -0
  78. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +13 -0
  79. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +11 -0
  80. data/lib/knj/ironruby-gtk2/gladexml.rb +104 -0
  81. data/lib/knj/ironruby-gtk2/glib.rb +15 -0
  82. data/lib/knj/ironruby-gtk2/gtk2.rb +148 -0
  83. data/lib/knj/ironruby-gtk2/gtk_builder.rb +31 -0
  84. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +5 -0
  85. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +19 -0
  86. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +5 -0
  87. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +18 -0
  88. data/lib/knj/ironruby-gtk2/gtk_menu.rb +5 -0
  89. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +7 -0
  90. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +8 -0
  91. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +24 -0
  92. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +16 -0
  93. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +19 -0
  94. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +32 -0
  95. data/lib/knj/ironruby-gtk2/iconsize.rb +3 -0
  96. data/lib/knj/ironruby-gtk2/image.rb +15 -0
  97. data/lib/knj/ironruby-gtk2/label.rb +19 -0
  98. data/lib/knj/ironruby-gtk2/stock.rb +4 -0
  99. data/lib/knj/ironruby-gtk2/tests/test.glade +15 -0
  100. data/lib/knj/ironruby-gtk2/tests/test_2.rb +22 -0
  101. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +47 -0
  102. data/lib/knj/ironruby-gtk2/vbox.rb +5 -0
  103. data/lib/knj/ironruby-gtk2/window.rb +23 -0
  104. data/lib/knj/jruby-gtk2/builder/test_builder.glade +43 -0
  105. data/lib/knj/jruby-gtk2/builder/test_builder.rb +19 -0
  106. data/lib/knj/jruby-gtk2/builder/test_builder.ui +43 -0
  107. data/lib/knj/jruby-gtk2/builder.rb +27 -0
  108. data/lib/knj/jruby-gtk2/cellrenderertext.rb +12 -0
  109. data/lib/knj/jruby-gtk2/checkbutton.rb +3 -0
  110. data/lib/knj/jruby-gtk2/combobox.rb +29 -0
  111. data/lib/knj/jruby-gtk2/dialog.rb +44 -0
  112. data/lib/knj/jruby-gtk2/eventbutton.rb +21 -0
  113. data/lib/knj/jruby-gtk2/gladexml.rb +99 -0
  114. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  115. data/lib/knj/jruby-gtk2/gtk2.rb +246 -0
  116. data/lib/knj/jruby-gtk2/hbox.rb +10 -0
  117. data/lib/knj/jruby-gtk2/iconsize.rb +5 -0
  118. data/lib/knj/jruby-gtk2/image.rb +10 -0
  119. data/lib/knj/jruby-gtk2/liststore.rb +56 -0
  120. data/lib/knj/jruby-gtk2/menu.rb +40 -0
  121. data/lib/knj/jruby-gtk2/progressbar.rb +12 -0
  122. data/lib/knj/jruby-gtk2/statusicon.rb +8 -0
  123. data/lib/knj/jruby-gtk2/stock.rb +8 -0
  124. data/lib/knj/jruby-gtk2/tests/test_glade_window.glade +163 -0
  125. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +47 -0
  126. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +17 -0
  127. data/lib/knj/jruby-gtk2/tests/test_trayicon.png +0 -0
  128. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +18 -0
  129. data/lib/knj/jruby-gtk2/treeview.rb +105 -0
  130. data/lib/knj/jruby-gtk2/vbox.rb +12 -0
  131. data/lib/knj/jruby-gtk2/window.rb +11 -0
  132. data/lib/knj/jruby_compiler.rb +14 -0
  133. data/lib/knj/knj.rb +19 -0
  134. data/lib/knj/knj_controller.rb +13 -0
  135. data/lib/knj/knjdb/dbtime.rb +30 -0
  136. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +327 -0
  137. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +130 -0
  138. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +30 -0
  139. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +255 -0
  140. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +93 -0
  141. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +151 -0
  142. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +29 -0
  143. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +300 -0
  144. data/lib/knj/knjdb/libknjdb.rb +438 -0
  145. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +83 -0
  146. data/lib/knj/knjdb/libknjdb_row.rb +149 -0
  147. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +69 -0
  148. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  149. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
  150. data/lib/knj/libqt.rb +75 -0
  151. data/lib/knj/libqt_window.rb +10 -0
  152. data/lib/knj/locale_strings.rb +3 -0
  153. data/lib/knj/locales.rb +54 -0
  154. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +56 -0
  155. data/lib/knj/mail.rb +75 -0
  156. data/lib/knj/mailobj.rb +82 -0
  157. data/lib/knj/mount.rb +115 -0
  158. data/lib/knj/notify.rb +13 -0
  159. data/lib/knj/nvidia_settings.rb +45 -0
  160. data/lib/knj/objects.rb +731 -0
  161. data/lib/knj/opts.rb +38 -0
  162. data/lib/knj/os.rb +158 -0
  163. data/lib/knj/php.rb +717 -0
  164. data/lib/knj/php_parser/arguments.rb +5 -0
  165. data/lib/knj/php_parser/functions.rb +97 -0
  166. data/lib/knj/php_parser/php_parser.rb +99 -0
  167. data/lib/knj/php_parser/tests/test.rb +12 -0
  168. data/lib/knj/php_parser/tests/test_function.php +8 -0
  169. data/lib/knj/php_parser/tests/test_function_run.rb +19 -0
  170. data/lib/knj/power_manager.rb +31 -0
  171. data/lib/knj/rand.rb +10 -0
  172. data/lib/knj/retry.rb +71 -0
  173. data/lib/knj/rhodes/mutex.rb +11 -0
  174. data/lib/knj/rhodes/rhodes.js +3 -0
  175. data/lib/knj/rhodes/rhodes.rb +11 -0
  176. data/lib/knj/rsvgbin.rb +20 -0
  177. data/lib/knj/scripts/degulesider.rb +12 -0
  178. data/lib/knj/scripts/filesearch.rb +51 -0
  179. data/lib/knj/scripts/ip2location.rb +12 -0
  180. data/lib/knj/scripts/keepalive.rb +6 -0
  181. data/lib/knj/scripts/svn_merge.rb +29 -0
  182. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +41 -0
  183. data/lib/knj/sms.rb +54 -0
  184. data/lib/knj/sshrobot/sshrobot.rb +93 -0
  185. data/lib/knj/strings.rb +65 -0
  186. data/lib/knj/sysuser.rb +27 -0
  187. data/lib/knj/tests/compiler/compiler_test.rb +13 -0
  188. data/lib/knj/tests/compiler/compiler_test_file.rb +62 -0
  189. data/lib/knj/tests/test_degulesider.rb +11 -0
  190. data/lib/knj/tests/test_mount.rb +30 -0
  191. data/lib/knj/tests/test_retry.rb +30 -0
  192. data/lib/knj/thread.rb +32 -0
  193. data/lib/knj/thread2.rb +47 -0
  194. data/lib/knj/threadhandler.rb +130 -0
  195. data/lib/knj/threadpool.rb +177 -0
  196. data/lib/knj/translations.rb +139 -0
  197. data/lib/knj/unix_proc.rb +82 -0
  198. data/lib/knj/web.rb +932 -0
  199. data/lib/knj/webscripts/image.rhtml +82 -0
  200. data/lib/knj/win.rb +4 -0
  201. data/lib/knj/win_registry.rb +60 -0
  202. data/lib/knj/win_tightvnc.rb +127 -0
  203. data/lib/knj/x11vnc.rb +48 -0
  204. data/lib/knj/youtube.rb +38 -0
  205. data/lib/knjrbfw.rb +4 -0
  206. data/spec/knjrbfw_spec.rb +269 -0
  207. data/spec/spec_helper.rb +12 -0
  208. metadata +336 -0
@@ -0,0 +1,93 @@
1
+ class Knj::SSHRobot
2
+ def initialize(args)
3
+ @forwards = []
4
+ @args = Knj::ArrayExt.hash_sym(args)
5
+ @args[:port] = 22 if !@args.has_key?(:port)
6
+ end
7
+
8
+ def session
9
+ @session = self.session_spawn if !@session
10
+ return @session
11
+ end
12
+
13
+ def session_spawn
14
+ return Net::SSH.start(@args[:host], @args[:user], :password => @args[:passwd], :port => @args[:port].to_i)
15
+ end
16
+
17
+ def shell
18
+ return self.session.shell.sync
19
+ end
20
+
21
+ def sftp
22
+ @sftp = Net::SFTP.start(@args[:host], @args[:user], @args[:passwd], :port => @args[:port].to_i)
23
+ end
24
+
25
+ def exec(command)
26
+ return self.session.exec!(command)
27
+ end
28
+
29
+ def fileExists(filepath)
30
+ result = self.exec("ls " + Strings.UnixSafe(filepath)).strip
31
+
32
+ if result == filepath
33
+ return true
34
+ else
35
+ return false
36
+ end
37
+ end
38
+
39
+ def forward(args)
40
+ Knj::ArrayExt.hash_sym(args)
41
+ args[:type] = "local" if !args[:type]
42
+ args[:session] = self.session_spawn if !args[:session]
43
+ args[:host_local] = "0.0.0.0" if !args[:host_local]
44
+
45
+ return SSHRobot::Forward.new(args)
46
+ end
47
+
48
+ alias getShell shell
49
+ alias getSFTP sftp
50
+ alias shellCMD exec
51
+ end
52
+
53
+ class Knj::SSHRobot::Forward
54
+ attr_reader :open
55
+
56
+ def initialize(args)
57
+ @open = true
58
+ @args = args
59
+ @thread = Knj::Thread.new do
60
+ begin
61
+ #args[:session].logger.sev_threshold = Logger::Severity::DEBUG
62
+ if args[:type] == "local"
63
+ @args[:session].forward.local(@args[:host_local], @args[:port_local].to_i, @args[:host], @args[:port_remote].to_i)
64
+ elsif args[:type] == "remote"
65
+ @args[:session].forward.remote_to(@args[:port_local], @args[:host], @args[:port_remote], @args[:host_local])
66
+ else
67
+ raise "No valid type given."
68
+ end
69
+
70
+ @args[:session].loop do
71
+ true
72
+ end
73
+ rescue Exception => e
74
+ puts e.inspect
75
+ puts e.backtrace
76
+
77
+ @open = false
78
+ end
79
+ end
80
+ end
81
+
82
+ def close
83
+ if !@args
84
+ return nil
85
+ end
86
+
87
+ @args[:session].close
88
+ @open = false
89
+ @thread.exit
90
+ @args = nil
91
+ @thread = nil
92
+ end
93
+ end
@@ -0,0 +1,65 @@
1
+ module Knj::Strings
2
+ def self.UnixSafe(tha_string)
3
+ return tha_string.to_s.gsub(" ", "\\ ").gsub("&", "\&").gsub("(", "\\(").gsub(")", "\\)").gsub('"', '\"').gsub("\n", "\"\n\"")
4
+ end
5
+
6
+ def self.unixsafe(string)
7
+ return Knj::Strings.UnixSafe(string)
8
+ end
9
+
10
+ def self.searchstring(string)
11
+ words = []
12
+ string = string.to_s
13
+
14
+ matches = string.scan /(\"(.+?)\")/
15
+ matches.each do |matcharr|
16
+ word = matcharr[1]
17
+
18
+ if word and word.length > 0
19
+ words << matcharr[1]
20
+ string = string.gsub(matcharr[0], "")
21
+ end
22
+ end
23
+
24
+ string.split(/\s/).each do |word|
25
+ words << word if word and word.length > 0
26
+ end
27
+
28
+ return words
29
+ end
30
+
31
+ def self.is_email?(str)
32
+ return true if str.to_s.match(/^\S+@\S+\.\S+$/)
33
+ return false
34
+ end
35
+
36
+ def self.is_phonenumber?(str)
37
+ return true if str.to_s.match(/^\+\d{2}\d+$/)
38
+ return false
39
+ end
40
+
41
+ def self.js_safe(str)
42
+ return str.gsub("\r", "").gsub("\n", "\\n").gsub('"', '\"');
43
+ end
44
+
45
+ def self.yn_str(value, str_yes, str_no)
46
+ value = value.to_i if Knj::Php.is_numeric(value)
47
+
48
+ if value.is_a?(Integer)
49
+ if value == 0
50
+ return str_no
51
+ else
52
+ return str_yes
53
+ end
54
+ end
55
+
56
+ return str_no if !value
57
+ return str_yes
58
+ end
59
+
60
+ def self.shorten(str, maxlength)
61
+ str = str.to_s
62
+ str = str.slice(0..(maxlength - 1)).strip + "..." if str.length > maxlength
63
+ return str
64
+ end
65
+ end
@@ -0,0 +1,27 @@
1
+ class Knj::Sysuser
2
+ def initialize(data)
3
+ @data = data
4
+ end
5
+
6
+ def self.list(paras = {})
7
+ cont = File.read("/etc/passwd")
8
+
9
+ list = []
10
+ cont.split("\n").each do |line|
11
+ linearr = line.split(":")
12
+
13
+ list << Knj::Sysuser.new(
14
+ "nick" => linearr[0],
15
+ "home" => linearr[5],
16
+ "shell" => linearr[6]
17
+ )
18
+ end
19
+
20
+ return list
21
+ end
22
+
23
+ def [](key)
24
+ raise "No such key: " + key if !@data.has_key?(key)
25
+ return @data[key]
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ require "knj/knj"
2
+ require "knj/compiler"
3
+
4
+ compiler = Knj::Compiler.new
5
+
6
+ time_start = Time.new.to_f
7
+
8
+ #0.upto(10000) do
9
+ compiler.eval_file("compiler_test_file.rb")
10
+ #end
11
+
12
+ time_spent = Time.new.to_f - time_start
13
+ print "#{time_spent}\n"
@@ -0,0 +1,62 @@
1
+ # The Computer Language Benchmarks Game
2
+ # http://shootout.alioth.debian.org/
3
+ #
4
+ # contributed by Karl von Laudermann
5
+ # modified by Jeremy Echols
6
+ # modified by Detlef Reichl
7
+ # modified by Joseph LaFata
8
+ # modified by Peter Zotov
9
+
10
+ size = ARGV.shift.to_i
11
+
12
+ puts "P4\n#{size} #{size}"
13
+
14
+ byte_acc = 0
15
+ bit_num = 0
16
+
17
+ y = 0
18
+ while y < size
19
+ ci = (2.0*y/size)-1.0
20
+
21
+ x = 0
22
+ while x < size
23
+ zrzr = zr = 0.0
24
+ zizi = zi = 0.0
25
+ cr = (2.0*x/size)-1.5
26
+ escape = 0b1
27
+
28
+ z = 0
29
+ while z < 50
30
+ tr = zrzr - zizi + cr
31
+ ti = 2.0*zr*zi + ci
32
+ zr = tr
33
+ zi = ti
34
+ # preserve recalculation
35
+ zrzr = zr*zr
36
+ zizi = zi*zi
37
+ if zrzr+zizi > 4.0
38
+ escape = 0b0
39
+ break
40
+ end
41
+ z += 1
42
+ end
43
+
44
+ byte_acc = (byte_acc << 1) | escape
45
+ bit_num += 1
46
+
47
+ # Code is very similar for these cases, but using separate blocks
48
+ # ensures we skip the shifting when it's unnecessary, which is most cases.
49
+ if (bit_num == 8)
50
+ print byte_acc.chr
51
+ byte_acc = 0
52
+ bit_num = 0
53
+ elsif (x == size - 1)
54
+ byte_acc <<= (8 - bit_num)
55
+ print byte_acc.chr
56
+ byte_acc = 0
57
+ bit_num = 0
58
+ end
59
+ x += 1
60
+ end
61
+ y += 1
62
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "knj/autoload"
4
+ include Knj
5
+
6
+ dgs = Degulesider.new
7
+ results = dgs.search(
8
+ :where => "Engvej 3, 4970 Rødby"
9
+ )
10
+
11
+ Php.print_r(results)
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Dir.chdir(File.dirname(__FILE__))
4
+ require "../autoload"
5
+
6
+ print "Listing all mounts.\n"
7
+ mounts = Knj::Mount.list
8
+ mounts.each do |mount|
9
+ Knj::Php.print_r(mount.data)
10
+ print "Access: #{mount.access?}\n\n"
11
+ end
12
+
13
+ mounts = Knj::Mount.list("from_search" => "test_dir")
14
+ mounts.each do |mount|
15
+ print "Unmounting test_dir.\n"
16
+ mount.umount
17
+ end
18
+
19
+ print "Mount binding test_dir to test_dir_to.\n"
20
+ Knj::Mount.mount(
21
+ "from" => "test_dir",
22
+ "to" => "test_dir_to",
23
+ "bind" => true
24
+ )
25
+
26
+ mounts = Knj::Mount.list("from_search" => "test_dir")
27
+ mounts.each do |mount|
28
+ print "Unmounting test_dir.\n"
29
+ mount.umount
30
+ end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Dir.chdir(File.dirname(__FILE__))
4
+ require "../autoload"
5
+
6
+ count = 0
7
+ result = Knj::Retry.try(
8
+ :exit => false,
9
+ :interrupt => true,
10
+ :errors => [Knj::Errors::NotFound, RuntimeError],
11
+ :timeout => 1,
12
+ :tries => 3,
13
+ :return_error => true
14
+ ) do
15
+ count += 1
16
+ print "Count: #{count.to_s}\n"
17
+
18
+ if count <= 2
19
+ exit
20
+ end
21
+
22
+ if count <= 3
23
+
24
+ #raise "Test"
25
+ end
26
+ end
27
+
28
+ #print "Error 1 was a #{result[0][:error].class.to_s} with the message: #{result[0][:error].message.to_s}\n"
29
+
30
+ Knj::Php.print_r(result)
data/lib/knj/thread.rb ADDED
@@ -0,0 +1,32 @@
1
+ #This class behaves like a normal thread - but it shows error-messages and tracebacks. Normal threads dont do that.
2
+ class Knj::Thread < Thread
3
+ attr_accessor :data
4
+
5
+ def initialize(*args, &block)
6
+ @data = {}
7
+ raise "No block was given." if !block_given?
8
+
9
+ abort_on_exception = true
10
+ super(*args) do
11
+ begin
12
+ block.call(*args)
13
+ rescue SystemExit
14
+ exit
15
+ rescue Exception => e
16
+ print "Error: "
17
+ puts e.inspect
18
+ print "\n"
19
+ puts e.backtrace
20
+ print "\n\n"
21
+ end
22
+ end
23
+ end
24
+
25
+ def [](key)
26
+ return @data[key]
27
+ end
28
+
29
+ def []=(key, value)
30
+ return @data[key] = value
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ class Knj::Thread2
2
+ def initialize(args = {}, &block)
3
+ @args = args
4
+ @block = block if block_given?
5
+ @callbacks = {}
6
+ end
7
+
8
+ def connect(signal, &block)
9
+ @callbacks[signal] = [] if !@callbacks.has_key?(signal)
10
+ @callbacks[signal] << block
11
+ end
12
+
13
+ def call(signal, *args)
14
+ return false if !@callbacks.has_key?(signal)
15
+ @callbacks[signal].each do |block|
16
+ block.call(*args)
17
+ end
18
+
19
+ return {:count => count}
20
+ end
21
+
22
+ def run
23
+ Thread.new do
24
+ abort_on_exception = true
25
+ call(:on_run)
26
+
27
+ begin
28
+ @block.call
29
+ rescue SystemExit
30
+ call(:on_exit)
31
+ exit
32
+ rescue Exception => e
33
+ call(:on_error, e)
34
+
35
+ if !@args.has_key?(:print_error) or @args[:print_error]
36
+ print "Error: "
37
+ puts e.inspect
38
+ print "\n"
39
+ puts e.backtrace
40
+ print "\n\n"
41
+ end
42
+ end
43
+
44
+ call(:on_done)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,130 @@
1
+ class Knj::Threadhandler
2
+ attr_reader :inactive_blocks, :args, :activate_blocks, :mutex
3
+
4
+ def initialize(args = {})
5
+ @args = args
6
+ @objects = []
7
+ @args[:timeout] = 5 if !@args[:timeout]
8
+ @inactive_blocks = []
9
+ @activate_blocks = []
10
+ @mutex = Mutex.new
11
+
12
+ @thread_timeout = Knj::Thread.new do
13
+ loop do
14
+ sleep @args[:timeout]
15
+ break if !@mutex
16
+ check_inactive
17
+ end
18
+ end
19
+ end
20
+
21
+ def on_spawn_new(&block)
22
+ raise "Destroyed Knj::Threadhandler." if !@mutex
23
+ @spawn_new_block = block
24
+ end
25
+
26
+ def on_inactive(&block)
27
+ raise "Destroyed Knj::Threadhandler." if !@mutex
28
+ @inactive_blocks << block
29
+ end
30
+
31
+ def on_activate(&block)
32
+ raise "Destroyed Knj::Threadhandler." if !@mutex
33
+ @activate_blocks << block
34
+ end
35
+
36
+ def destroy
37
+ return false if !@mutex
38
+
39
+ @thread_timeout.kill if @thread_timeout and @thread_timeout.alive?
40
+ @thread_timeout = nil
41
+
42
+ @mutex.synchronize do
43
+ @objects.each do |data|
44
+ @inactive_blocks.each do |block|
45
+ data[:inactive] = true
46
+ block.call(:obj => data[:object])
47
+ end
48
+ end
49
+ end
50
+
51
+ @args = nil
52
+ @objects = nil
53
+ @inactive_blocks = nil
54
+ @activate_blocks = nil
55
+ @mutex = nil
56
+ end
57
+
58
+ def check_inactive
59
+ raise "Destroyed Knj::Threadhandler." if !@mutex
60
+ @mutex.synchronize do
61
+ cur_time = Time.new.to_i - @args[:timeout]
62
+ @objects.each do |data|
63
+ if data[:free] and !data[:inactive] and data[:free] < cur_time
64
+ @inactive_blocks.each do |block|
65
+ data[:inactive] = true
66
+ block.call(:obj => data[:object])
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ def get_and_lock
74
+ raise "Destroyed Knj::Threadhandler." if !@mutex
75
+ newobj = nil
76
+
77
+ @mutex.synchronize do
78
+ retdata = false
79
+ @objects.each do |data|
80
+ if data[:free]
81
+ retdata = data
82
+ break
83
+ end
84
+ end
85
+
86
+ if retdata
87
+ #Test if object is still free - if not, try again - knj.
88
+ return get_and_lock if !retdata[:free]
89
+ retdata[:free] = false
90
+
91
+ if retdata[:inactive]
92
+ @activate_blocks.each do |block|
93
+ block.call(:obj => retdata[:object])
94
+ end
95
+
96
+ retdata.delete(:inactive)
97
+ end
98
+
99
+ return retdata[:object]
100
+ end
101
+
102
+ newobj = @spawn_new_block.call
103
+ @objects << {
104
+ :free => false,
105
+ :object => newobj
106
+ }
107
+ STDOUT.print "Spawned db and locked new.\n" if @args[:debug]
108
+ end
109
+
110
+ return newobj
111
+ end
112
+
113
+ def free(obj)
114
+ raise "Destroyed Knj::Threadhandler." if !@mutex
115
+
116
+ @mutex.synchronize do
117
+ freedata = false
118
+ @objects.each do |data|
119
+ if data[:object] == obj
120
+ freedata = data
121
+ break
122
+ end
123
+ end
124
+
125
+ raise "Could not find that object in list." if !freedata
126
+ STDOUT.print "Freed one.\n" if @args[:debug]
127
+ freedata[:free] = Time.new.to_i
128
+ end
129
+ end
130
+ end