knjrbfw 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +29 -8
  3. data/lib/knj/arrayext.rb +206 -153
  4. data/lib/knj/autoload/backups/ping.rb +2 -2
  5. data/lib/knj/autoload/erubis.rb +3 -3
  6. data/lib/knj/autoload/facets_dictionary.rb +2 -2
  7. data/lib/knj/autoload/gettext.rb +3 -3
  8. data/lib/knj/autoload/gtk2.rb +1 -1
  9. data/lib/knj/autoload/json.rb +14 -0
  10. data/lib/knj/autoload/magick.rb +3 -3
  11. data/lib/knj/autoload/mysql.rb +3 -3
  12. data/lib/knj/autoload/parsedate.rb +1 -1
  13. data/lib/knj/autoload/ping.rb +2 -2
  14. data/lib/knj/autoload/rexml.rb +5 -5
  15. data/lib/knj/autoload/soap.rb +1 -1
  16. data/lib/knj/autoload/sqlite3.rb +3 -3
  17. data/lib/knj/autoload/tmail.rb +3 -3
  18. data/lib/knj/autoload/xmlsimple.rb +3 -3
  19. data/lib/knj/autoload/zip.rb +3 -3
  20. data/lib/knj/autoload.rb +87 -81
  21. data/lib/knj/cmd_gen.rb +19 -19
  22. data/lib/knj/cmd_parser.rb +59 -0
  23. data/lib/knj/compiler.rb +34 -34
  24. data/lib/knj/cpufreq.rb +37 -37
  25. data/lib/knj/csv.rb +20 -0
  26. data/lib/knj/datarow.rb +406 -239
  27. data/lib/knj/datarow_custom.rb +124 -0
  28. data/lib/knj/datestamp.rb +89 -89
  29. data/lib/knj/datet.rb +550 -454
  30. data/lib/knj/db.rb +1 -0
  31. data/lib/knj/degulesider.rb +42 -44
  32. data/lib/knj/erb/erb.rb +5 -5
  33. data/lib/knj/erb/erb_cache_clean.rb +10 -10
  34. data/lib/knj/erb/erb_fcgi.rb +32 -32
  35. data/lib/knj/erb/erb_fcgi_1.9.rb +32 -32
  36. data/lib/knj/erb/erb_fcgi_jruby.rb +2 -2
  37. data/lib/knj/erb/erb_jruby.rb +5 -5
  38. data/lib/knj/erb/include.rb +243 -243
  39. data/lib/knj/errors.rb +19 -18
  40. data/lib/knj/eruby.rb +12 -10
  41. data/lib/knj/event_filemod.rb +31 -31
  42. data/lib/knj/event_handler.rb +73 -67
  43. data/lib/knj/exchangerates.rb +37 -37
  44. data/lib/knj/facebook_connect.rb +95 -18
  45. data/lib/knj/filesystem.rb +6 -6
  46. data/lib/knj/fs/drivers/filesystem.rb +12 -12
  47. data/lib/knj/fs/drivers/ftp.rb +31 -31
  48. data/lib/knj/fs/drivers/ssh.rb +26 -26
  49. data/lib/knj/fs/fs.rb +31 -31
  50. data/lib/knj/gettext_fallback.rb +15 -15
  51. data/lib/knj/gettext_threadded.rb +75 -75
  52. data/lib/knj/google_sitemap.rb +53 -53
  53. data/lib/knj/gtk2.rb +272 -272
  54. data/lib/knj/gtk2_cb.rb +80 -80
  55. data/lib/knj/gtk2_menu.rb +55 -55
  56. data/lib/knj/gtk2_statuswindow.rb +62 -62
  57. data/lib/knj/gtk2_tv.rb +58 -58
  58. data/lib/knj/hash_methods.rb +27 -36
  59. data/lib/knj/http.rb +189 -167
  60. data/lib/knj/http2.rb +259 -53
  61. data/lib/knj/image.rb +2 -2
  62. data/lib/knj/includes/appserver_cli.rb +18 -18
  63. data/lib/knj/includes/require_info.rb +15 -0
  64. data/lib/knj/ip2location.rb +20 -20
  65. data/lib/knj/ironruby-gtk2/button.rb +14 -14
  66. data/lib/knj/ironruby-gtk2/dialog.rb +42 -42
  67. data/lib/knj/ironruby-gtk2/entry.rb +4 -4
  68. data/lib/knj/ironruby-gtk2/gdk_event.rb +1 -1
  69. data/lib/knj/ironruby-gtk2/gdk_eventbutton.rb +11 -11
  70. data/lib/knj/ironruby-gtk2/gdk_pixbuf.rb +9 -9
  71. data/lib/knj/ironruby-gtk2/gladexml.rb +102 -102
  72. data/lib/knj/ironruby-gtk2/glib.rb +13 -13
  73. data/lib/knj/ironruby-gtk2/gtk2.rb +121 -121
  74. data/lib/knj/ironruby-gtk2/gtk_builder.rb +29 -29
  75. data/lib/knj/ironruby-gtk2/gtk_cellrenderertext.rb +3 -3
  76. data/lib/knj/ironruby-gtk2/gtk_combobox.rb +17 -17
  77. data/lib/knj/ironruby-gtk2/gtk_filechooserbutton.rb +3 -3
  78. data/lib/knj/ironruby-gtk2/gtk_liststore.rb +16 -16
  79. data/lib/knj/ironruby-gtk2/gtk_menu.rb +3 -3
  80. data/lib/knj/ironruby-gtk2/gtk_menuitem.rb +2 -2
  81. data/lib/knj/ironruby-gtk2/gtk_statusicon.rb +3 -3
  82. data/lib/knj/ironruby-gtk2/gtk_treeiter.rb +22 -22
  83. data/lib/knj/ironruby-gtk2/gtk_treeselection.rb +11 -11
  84. data/lib/knj/ironruby-gtk2/gtk_treeview.rb +17 -17
  85. data/lib/knj/ironruby-gtk2/gtk_treeviewcolumn.rb +30 -30
  86. data/lib/knj/ironruby-gtk2/iconsize.rb +1 -1
  87. data/lib/knj/ironruby-gtk2/image.rb +13 -13
  88. data/lib/knj/ironruby-gtk2/label.rb +17 -17
  89. data/lib/knj/ironruby-gtk2/stock.rb +2 -2
  90. data/lib/knj/ironruby-gtk2/tests/test_2.rb +14 -14
  91. data/lib/knj/ironruby-gtk2/tests/test_ironruby_window.rb +37 -37
  92. data/lib/knj/ironruby-gtk2/vbox.rb +3 -3
  93. data/lib/knj/ironruby-gtk2/window.rb +18 -18
  94. data/lib/knj/jruby-gtk2/builder/test_builder.rb +11 -11
  95. data/lib/knj/jruby-gtk2/builder.rb +25 -25
  96. data/lib/knj/jruby-gtk2/cellrenderertext.rb +10 -10
  97. data/lib/knj/jruby-gtk2/checkbutton.rb +1 -1
  98. data/lib/knj/jruby-gtk2/combobox.rb +27 -27
  99. data/lib/knj/jruby-gtk2/dialog.rb +40 -40
  100. data/lib/knj/jruby-gtk2/eventbutton.rb +19 -19
  101. data/lib/knj/jruby-gtk2/gladexml.rb +97 -97
  102. data/lib/knj/jruby-gtk2/gtk2.rb +203 -203
  103. data/lib/knj/jruby-gtk2/hbox.rb +8 -8
  104. data/lib/knj/jruby-gtk2/iconsize.rb +3 -3
  105. data/lib/knj/jruby-gtk2/image.rb +8 -8
  106. data/lib/knj/jruby-gtk2/liststore.rb +54 -54
  107. data/lib/knj/jruby-gtk2/menu.rb +35 -35
  108. data/lib/knj/jruby-gtk2/progressbar.rb +10 -10
  109. data/lib/knj/jruby-gtk2/statusicon.rb +3 -3
  110. data/lib/knj/jruby-gtk2/stock.rb +6 -6
  111. data/lib/knj/jruby-gtk2/tests/test_glade_window.rb +36 -36
  112. data/lib/knj/jruby-gtk2/tests/test_normal_window.rb +3 -3
  113. data/lib/knj/jruby-gtk2/tests/test_trayicon.rb +2 -2
  114. data/lib/knj/jruby-gtk2/treeview.rb +88 -88
  115. data/lib/knj/jruby-gtk2/vbox.rb +10 -10
  116. data/lib/knj/jruby-gtk2/window.rb +7 -7
  117. data/lib/knj/jruby_compiler.rb +12 -12
  118. data/lib/knj/knj.rb +12 -11
  119. data/lib/knj/knj_controller.rb +13 -8
  120. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +499 -316
  121. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +127 -125
  122. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +43 -25
  123. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +316 -241
  124. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3.rb +12 -0
  125. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_columns.rb +146 -146
  126. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_indexes.rb +24 -24
  127. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +283 -283
  128. data/lib/knj/knjdb/libknjdb.rb +96 -52
  129. data/lib/knj/knjdb/libknjdb_java_sqlite3.rb +78 -78
  130. data/lib/knj/knjdb/libknjdb_row.rb +147 -147
  131. data/lib/knj/knjdb/libknjdb_sqlite3_ironruby.rb +61 -61
  132. data/lib/knj/knjdb/revision.rb +262 -0
  133. data/lib/knj/libqt.rb +69 -69
  134. data/lib/knj/libqt_window.rb +8 -8
  135. data/lib/knj/locales.rb +62 -52
  136. data/lib/knj/maemo/fremantle-calendar/fremantle-calendar.rb +54 -54
  137. data/lib/knj/mail.rb +73 -73
  138. data/lib/knj/mailobj.rb +82 -80
  139. data/lib/knj/mount.rb +113 -113
  140. data/lib/knj/notify.rb +11 -11
  141. data/lib/knj/nvidia_settings.rb +43 -43
  142. data/lib/knj/objects/objects_sqlhelper.rb +474 -0
  143. data/lib/knj/objects.rb +569 -793
  144. data/lib/knj/opts.rb +38 -38
  145. data/lib/knj/os.rb +176 -158
  146. data/lib/knj/php.rb +853 -683
  147. data/lib/knj/php_parser/arguments.rb +3 -3
  148. data/lib/knj/php_parser/functions.rb +95 -95
  149. data/lib/knj/php_parser/php_parser.rb +16 -16
  150. data/lib/knj/php_parser/tests/test.rb +6 -6
  151. data/lib/knj/php_parser/tests/test_function_run.rb +6 -6
  152. data/lib/knj/power_manager.rb +29 -29
  153. data/lib/knj/process.rb +457 -0
  154. data/lib/knj/process_meta.rb +400 -0
  155. data/lib/knj/rand.rb +8 -8
  156. data/lib/knj/retry.rb +69 -69
  157. data/lib/knj/rhodes/delegate.rb +414 -0
  158. data/lib/knj/rhodes/rhodes.rb +114 -40
  159. data/lib/knj/rhodes/weakref.rb +80 -0
  160. data/lib/knj/rsvgbin.rb +18 -18
  161. data/lib/knj/scripts/degulesider.rb +2 -2
  162. data/lib/knj/scripts/filesearch.rb +35 -35
  163. data/lib/knj/scripts/ip2location.rb +2 -2
  164. data/lib/knj/scripts/keepalive.rb +2 -2
  165. data/lib/knj/scripts/php_to_rb_helper.rb +376 -0
  166. data/lib/knj/scripts/process_meta_exec.rb +104 -0
  167. data/lib/knj/scripts/svn_merge.rb +21 -21
  168. data/lib/knj/scripts/upgrade_knjrbfw_checker.rb +26 -26
  169. data/lib/knj/sms.rb +52 -52
  170. data/lib/knj/sshrobot/sshrobot.rb +90 -88
  171. data/lib/knj/sshrobot.rb +1 -0
  172. data/lib/knj/strings.rb +186 -74
  173. data/lib/knj/sysuser.rb +25 -25
  174. data/lib/knj/table_writer.rb +97 -0
  175. data/lib/knj/tests/compiler/compiler_test.rb +2 -2
  176. data/lib/knj/tests/test_degulesider.rb +1 -1
  177. data/lib/knj/tests/test_http2_proxy.rb +26 -0
  178. data/lib/knj/tests/test_mount.rb +9 -9
  179. data/lib/knj/tests/test_retry.rb +17 -17
  180. data/lib/knj/thread.rb +23 -24
  181. data/lib/knj/thread2.rb +45 -45
  182. data/lib/knj/threadhandler.rb +135 -102
  183. data/lib/knj/threadpool.rb +195 -145
  184. data/lib/knj/translations.rb +128 -119
  185. data/lib/knj/unix_proc.rb +80 -80
  186. data/lib/knj/web.rb +947 -881
  187. data/lib/knj/webscripts/image.rhtml +142 -67
  188. data/lib/knj/win.rb +2 -2
  189. data/lib/knj/win_registry.rb +58 -58
  190. data/lib/knj/win_tightvnc.rb +125 -125
  191. data/lib/knj/wref.rb +104 -0
  192. data/lib/knj/x11vnc.rb +46 -46
  193. data/lib/knj/youtube.rb +33 -36
  194. data/lib/knjrbfw.rb +1 -0
  195. data/spec/cmd_parser_spec.rb +25 -0
  196. data/spec/db_spec.rb +40 -0
  197. data/spec/db_spec_encoding_test_file.txt +1 -0
  198. data/spec/http2_spec.rb +37 -0
  199. data/spec/knjrbfw_spec.rb +17 -15
  200. data/spec/php_spec.rb +69 -0
  201. data/spec/process_meta_spec.rb +150 -0
  202. data/spec/process_spec.rb +107 -0
  203. data/spec/strings_spec.rb +21 -0
  204. data/spec/web_spec.rb +16 -0
  205. metadata +42 -21
  206. data/lib/knj/autoload/json_autoload.rb +0 -7
  207. data/lib/knj/autoload/twitter.rb +0 -2
  208. data/lib/knj/ext/webrick.rb +0 -31
  209. data/lib/knj/jruby-gtk2/gtk-4.0.jar +0 -0
  210. data/lib/knj/knjdb/mysql-connector-java-5.1.13-bin.jar +0 -0
  211. data/lib/knj/knjdb/sqlitejdbc-v056.jar +0 -0
data/lib/knj/sysuser.rb CHANGED
@@ -1,27 +1,27 @@
1
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.key?(key)
25
- return @data[key]
26
- end
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.key?(key)
25
+ return @data[key]
26
+ end
27
27
  end
@@ -0,0 +1,97 @@
1
+ class Knj::Table_writer
2
+ def initialize(args = {})
3
+ @args = args
4
+
5
+ if !@args["filepath"]
6
+ raise "No filepath was given."
7
+ end
8
+
9
+ if @args["format"] == "csv"
10
+ @fp = File.open(@args["filepath"], "w")
11
+ elsif @args["format"] == "excel5"
12
+ require "spreadsheet"
13
+
14
+ @wb = Spreadsheet::Workbook.new
15
+ @ws = @wb.create_worksheet
16
+ @row = 0
17
+ else
18
+ raise "Unsupported format: '#{@args["format"]}'."
19
+ end
20
+ end
21
+
22
+ def write_row(arr)
23
+ if @args["format"] == "csv"
24
+ arr.each_index do |key|
25
+ val = arr[key]
26
+
27
+ if val.is_a?(Hash) and val["type"] == "decimal"
28
+ arr[key] = Knj::Php.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
29
+ elsif val.is_a?(Hash) and val["type"] == "date"
30
+ arr[key] = Knj::Php.date(@args["date_format"], val["value"])
31
+ end
32
+ end
33
+
34
+ line_str = Knj::Csv.arr_to_csv(arr, @args["expl"], @args["surr"])
35
+
36
+ #line_str = line_str.encode("iso8859-1") if @args["encoding"] == "iso8859-1"
37
+
38
+ @fp.write(line_str)
39
+ elsif @args["format"] == "excel5"
40
+ col_count = 0
41
+ arr.each do |val|
42
+ if val.is_a?(Hash) and val["type"] == "decimal"
43
+ @ws[@row, col_count] = Knj::Php.number_format(val["value"], @args["amount_decimals"], @args["amount_dsep"], @args["amount_tsep"])
44
+ elsif val.is_a?(Hash) and val["type"] == "date"
45
+ @ws[@row, col_count] = Knj::Php.date(@args["date_format"], val["value"])
46
+ else
47
+ @ws[@row, col_count] = val
48
+ end
49
+
50
+ col_count += 1
51
+ end
52
+
53
+ @row += 1
54
+ else
55
+ raise "Unsupported format: '#{@args["format"]}'."
56
+ end
57
+ end
58
+
59
+ def close
60
+ if @args["format"] == "csv"
61
+ @fp.close
62
+ elsif @args["format"] == "excel5"
63
+ dirname = File.dirname(@args["filepath"])
64
+ basename = File.basename(@args["filepath"], File.extname(@args["filepath"]))
65
+
66
+ temp_path = "#{dirname}/#{basename}.xls"
67
+
68
+ @wb.write(temp_path)
69
+ @wb = nil
70
+ @ws = nil
71
+
72
+ FileUtils.mv(temp_path, @args["filepath"])
73
+ else
74
+ raise "Unsupported format: '#{@args["format"]}'."
75
+ end
76
+ end
77
+
78
+ def ext
79
+ if @args["format"] == "csv"
80
+ return "csv"
81
+ elsif @args["format"] == "excel5"
82
+ return "xls"
83
+ else
84
+ raise "Unsupported format: '#{@args["format"]}'."
85
+ end
86
+ end
87
+
88
+ def ftype
89
+ if @args["format"] == "csv"
90
+ return "text/csv"
91
+ elsif @args["format"] == "excel5"
92
+ return "application/ms-excel"
93
+ else
94
+ raise "Unsupported format: '#{@args["format"]}'."
95
+ end
96
+ end
97
+ end
@@ -1,12 +1,12 @@
1
1
  require "knj/knj"
2
- require "knj/compiler"
2
+ require "#{$knjpath}compiler"
3
3
 
4
4
  compiler = Knj::Compiler.new
5
5
 
6
6
  time_start = Time.new.to_f
7
7
 
8
8
  #0.upto(10000) do
9
- compiler.eval_file("compiler_test_file.rb")
9
+ compiler.eval_file("compiler_test_file.rb")
10
10
  #end
11
11
 
12
12
  time_spent = Time.new.to_f - time_start
@@ -5,7 +5,7 @@ include Knj
5
5
 
6
6
  dgs = Degulesider.new
7
7
  results = dgs.search(
8
- :where => "Engvej 3, 4970 Rødby"
8
+ :where => "Engvej 3, 4970 Rødby"
9
9
  )
10
10
 
11
11
  Php.print_r(results)
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby1.9.1
2
+
3
+ require "#{File.dirname(__FILE__)}/../../knjrbfw.rb"
4
+ require "knj/autoload"
5
+
6
+ proxy_settings = Marshal.load(File.read("#{File.dirname(__FILE__)}/test_http2_proxy_settings.marshal"))
7
+
8
+ http = Knj::Http2.new(
9
+ :host => "www.partyworm.dk",
10
+ :proxy => proxy_settings
11
+ )
12
+
13
+ urls = [
14
+ "?show=users_search",
15
+ "?show=users_online",
16
+ "?show=drinksdb",
17
+ "?show=forum&fid=9&tid=1917&page=0"
18
+ ]
19
+ urls = ["robots.txt"]
20
+
21
+ 0.upto(105) do |count|
22
+ url = urls[rand(urls.size)]
23
+ print "Doing request #{count} of 200 (#{url}).\n"
24
+ res = http.get(url)
25
+ raise "Body was empty." if res.body.to_s.length <= 0
26
+ end
@@ -6,25 +6,25 @@ require "../autoload"
6
6
  print "Listing all mounts.\n"
7
7
  mounts = Knj::Mount.list
8
8
  mounts.each do |mount|
9
- Knj::Php.print_r(mount.data)
10
- print "Access: #{mount.access?}\n\n"
9
+ Knj::Php.print_r(mount.data)
10
+ print "Access: #{mount.access?}\n\n"
11
11
  end
12
12
 
13
13
  mounts = Knj::Mount.list("from_search" => "test_dir")
14
14
  mounts.each do |mount|
15
- print "Unmounting test_dir.\n"
16
- mount.umount
15
+ print "Unmounting test_dir.\n"
16
+ mount.umount
17
17
  end
18
18
 
19
19
  print "Mount binding test_dir to test_dir_to.\n"
20
20
  Knj::Mount.mount(
21
- "from" => "test_dir",
22
- "to" => "test_dir_to",
23
- "bind" => true
21
+ "from" => "test_dir",
22
+ "to" => "test_dir_to",
23
+ "bind" => true
24
24
  )
25
25
 
26
26
  mounts = Knj::Mount.list("from_search" => "test_dir")
27
27
  mounts.each do |mount|
28
- print "Unmounting test_dir.\n"
29
- mount.umount
28
+ print "Unmounting test_dir.\n"
29
+ mount.umount
30
30
  end
@@ -5,24 +5,24 @@ require "../autoload"
5
5
 
6
6
  count = 0
7
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
8
+ :exit => false,
9
+ :interrupt => true,
10
+ :errors => [Knj::Errors::NotFound, RuntimeError],
11
+ :timeout => 1,
12
+ :tries => 3,
13
+ :return_error => true
14
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
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
26
  end
27
27
 
28
28
  #print "Error 1 was a #{result[0][:error].class.to_s} with the message: #{result[0][:error].message.to_s}\n"
data/lib/knj/thread.rb CHANGED
@@ -1,28 +1,27 @@
1
1
  #This class behaves like a normal thread - but it shows error-messages and tracebacks. Normal threads dont do that.
2
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
3
+ attr_accessor :data
4
+
5
+ def initialize(*args)
6
+ @data = {}
7
+ raise "No block was given." if !block_given?
8
+
9
+ super(*args) do
10
+ begin
11
+ yield(*args)
12
+ rescue SystemExit
13
+ exit
14
+ rescue Exception => e
16
15
  print Knj::Errors.error_str(e)
17
- end
18
- end
19
- end
20
-
21
- def [](key)
22
- return @data[key]
23
- end
24
-
25
- def []=(key, value)
26
- return @data[key] = value
27
- end
16
+ end
17
+ end
18
+ end
19
+
20
+ def [](key)
21
+ return @data[key]
22
+ end
23
+
24
+ def []=(key, value)
25
+ return @data[key] = value
26
+ end
28
27
  end
data/lib/knj/thread2.rb CHANGED
@@ -1,47 +1,47 @@
1
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.key?(signal)
10
- @callbacks[signal] << block
11
- end
12
-
13
- def call(signal, *args)
14
- return false if !@callbacks.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.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
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.key?(signal)
10
+ @callbacks[signal] << block
11
+ end
12
+
13
+ def call(signal, *args)
14
+ return false if !@callbacks.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.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
47
  end
@@ -1,39 +1,46 @@
1
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)
2
+ attr_reader :inactive_blocks, :args, :activate_blocks, :mutex, :objects
3
+
4
+ def initialize(args = {})
5
+ require "#{$knjpath}errors"
6
+
7
+ @args = args
8
+ @objects = []
9
+ @args[:timeout] = 5 if !@args[:timeout]
10
+ @args[:max] = 50 if !@args[:max]
11
+ @inactive_blocks = []
12
+ @activate_blocks = []
13
+ @mutex = Mutex.new
14
+
15
+ @thread_timeout = Thread.new do
16
+ begin
17
+ loop do
18
+ sleep @args[:timeout]
19
+ break if !@mutex
20
+ check_inactive
21
+ end
22
+ rescue => e
23
+ STDOUT.print Knj::Errors.error_str(e)
24
+ end
25
+ end
26
+ end
27
+
28
+ def on_spawn_new(&block)
22
29
  raise "Destroyed Knj::Threadhandler." if !@mutex
23
- @spawn_new_block = block
24
- end
25
-
26
- def on_inactive(&block)
30
+ @spawn_new_block = block
31
+ end
32
+
33
+ def on_inactive(&block)
27
34
  raise "Destroyed Knj::Threadhandler." if !@mutex
28
- @inactive_blocks << block
29
- end
30
-
31
- def on_activate(&block)
35
+ @inactive_blocks << block
36
+ end
37
+
38
+ def on_activate(&block)
32
39
  raise "Destroyed Knj::Threadhandler." if !@mutex
33
- @activate_blocks << block
34
- end
35
-
36
- def destroy
40
+ @activate_blocks << block
41
+ end
42
+
43
+ def destroy
37
44
  return false if !@mutex
38
45
 
39
46
  @thread_timeout.kill if @thread_timeout and @thread_timeout.alive?
@@ -53,78 +60,104 @@ class Knj::Threadhandler
53
60
  @inactive_blocks = nil
54
61
  @activate_blocks = nil
55
62
  @mutex = nil
56
- end
57
-
58
- def check_inactive
63
+ end
64
+
65
+ def check_inactive
59
66
  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
67
+ @mutex.synchronize do
68
+ cur_time = Time.now.to_i - @args[:timeout]
69
+ @objects.each do |data|
70
+ if data[:free] and !data[:inactive] and data[:free] < cur_time
71
+ @inactive_blocks.each do |block|
72
+ data[:inactive] = true
73
+ block.call(:obj => data[:object])
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ def get_and_lock
74
81
  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
- @mutex.synchronize do
82
+ newobj = nil
83
+ sleep_do = false
84
+
85
+ begin
86
+ @mutex.synchronize do
87
+ retdata = false
88
+ @objects.each do |data|
89
+ if data[:free]
90
+ retdata = data
91
+ break
92
+ end
93
+ end
94
+
95
+ if retdata
96
+ #Test if object is still free - if not, try again - knj.
97
+ return get_and_lock if !retdata[:free]
98
+ retdata[:free] = false
99
+
100
+ if retdata[:inactive]
101
+ @activate_blocks.each do |block|
102
+ block.call(:obj => retdata[:object])
103
+ end
104
+
105
+ retdata.delete(:inactive)
106
+ end
107
+
108
+ return retdata[:object]
109
+ end
110
+
111
+ if @objects.length >= @args[:max]
112
+ #The maximum amount of objects has already been spawned... Sleep 0.1 sec and try to lock an object again...
113
+ raise Knj::Errors::Retry
114
+ else
115
+ #No free objects, but we can spawn a new one and use that...
116
+ newobj = @spawn_new_block.call
117
+ @objects << {
118
+ :free => false,
119
+ :object => newobj
120
+ }
121
+ STDOUT.print "Spawned db and locked new.\n" if @args[:debug]
122
+ end
123
+ end
124
+
125
+ return newobj
126
+ rescue Knj::Errors::Retry
127
+ STDOUT.print "All objects was taken - sleeping 0.1 sec and tries again.\n" #if @args[:debug]
128
+ sleep 0.1
129
+ retry
130
+ end
131
+ end
132
+
133
+ def free(obj)
134
+ @mutex.synchronize do
115
135
  return false if !@mutex or !@objects #something is trying to free and object, but the handler is destroyed. Dont crash but return false.
116
136
 
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
137
+ freedata = false
138
+ @objects.each do |data|
139
+ if data[:object] == obj
140
+ freedata = data
141
+ break
142
+ end
143
+ end
144
+
145
+ raise "Could not find that object in list." if !freedata
146
+ STDOUT.print "Freed one.\n" if @args[:debug]
147
+ freedata[:free] = Time.now.to_i
148
+ end
149
+ end
150
+
151
+ #Executes the given block with an element and then frees it.
152
+ def use
153
+ raise "No block was given." if !block_given?
154
+
155
+ obj = self.get_and_lock
156
+
157
+ begin
158
+ yield(obj)
159
+ ensure
160
+ self.free(obj)
161
+ end
162
+ end
130
163
  end