knjappserver 0.0.15 → 0.0.16

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 (44) hide show
  1. data/Gemfile +4 -2
  2. data/Gemfile.lock +24 -10
  3. data/README.rdoc +298 -1
  4. data/VERSION +1 -1
  5. data/bin/check_running.rb +2 -2
  6. data/knjappserver.gemspec +23 -5
  7. data/lib/files/database_schema.rb +124 -111
  8. data/lib/include/class_customio.rb +19 -5
  9. data/lib/include/class_erbhandler.rb +5 -22
  10. data/lib/include/class_httpresp.rb +66 -28
  11. data/lib/include/class_httpserver.rb +27 -14
  12. data/lib/include/class_httpsession.rb +161 -212
  13. data/lib/include/class_httpsession_contentgroup.rb +144 -0
  14. data/lib/include/class_httpsession_knjengine.rb +33 -68
  15. data/lib/include/class_httpsession_mongrel.rb +1 -1
  16. data/lib/include/class_httpsession_webrick.rb +1 -1
  17. data/lib/include/class_knjappserver.rb +105 -130
  18. data/lib/include/class_knjappserver_cleaner.rb +20 -13
  19. data/lib/include/class_knjappserver_cmdline.rb +44 -0
  20. data/lib/include/class_knjappserver_errors.rb +4 -1
  21. data/lib/include/class_knjappserver_logging.rb +48 -8
  22. data/lib/include/class_knjappserver_mailing.rb +36 -14
  23. data/lib/include/class_knjappserver_sessions.rb +78 -0
  24. data/lib/include/class_knjappserver_threadding.rb +18 -45
  25. data/lib/include/class_knjappserver_threadding_timeout.rb +78 -0
  26. data/lib/include/class_knjappserver_translations.rb +30 -0
  27. data/lib/include/class_knjappserver_web.rb +55 -3
  28. data/lib/include/class_log.rb +31 -3
  29. data/lib/include/class_log_access.rb +0 -15
  30. data/lib/include/class_log_data.rb +0 -15
  31. data/lib/include/class_log_data_link.rb +1 -14
  32. data/lib/include/class_log_data_value.rb +5 -17
  33. data/lib/include/class_session.rb +6 -18
  34. data/lib/include/magic_methods.rb +12 -14
  35. data/lib/pages/benchmark.rhtml +0 -0
  36. data/lib/pages/benchmark_print.rhtml +14 -0
  37. data/lib/pages/benchmark_simple.rhtml +3 -0
  38. data/lib/pages/benchmark_threadded_content.rhtml +21 -0
  39. data/lib/pages/spec.rhtml +26 -0
  40. data/lib/pages/spec_test_multiple_clients.rhtml +3 -0
  41. data/lib/pages/spec_threadded_content.rhtml +38 -0
  42. data/lib/scripts/benchmark.rb +65 -0
  43. data/spec/knjappserver_spec.rb +87 -43
  44. metadata +54 -20
@@ -0,0 +1,78 @@
1
+ class Knjappserver::Threadding_timeout
2
+ def initialize(args)
3
+ @args = args
4
+ @kas = @args[:kas]
5
+ raise "No time given." if !@args[:args].key?(:time)
6
+ @args[:time] = @args[:args][:time].to_s.to_i
7
+ @args[:args] = [] if !@args[:args]
8
+ @mutex = Mutex.new
9
+ end
10
+
11
+ def time=(newtime)
12
+ @args[:time] = newtime.to_s.to_i
13
+ end
14
+
15
+ def time
16
+ return @args[:time]
17
+ end
18
+
19
+ #Starts the timeout.
20
+ def start
21
+ @run = true
22
+ @thread = Thread.new do
23
+ loop do
24
+ begin
25
+ if @args[:counting]
26
+ @timeout = @args[:time]
27
+
28
+ while @timeout > 0
29
+ @timeout += -1
30
+ break if @kas.should_restart or !@run
31
+ sleep 1
32
+ end
33
+ else
34
+ sleep @args[:time]
35
+ end
36
+
37
+ break if @kas.should_restart or !@run
38
+
39
+ @mutex.synchronize do
40
+ @kas.threadpool.run do
41
+ @kas.ob.db.get_and_register_thread if @kas.ob.db.opts[:threadsafe]
42
+ @kas.db_handler.get_and_register_thread if @kas.db_handler.opts[:threadsafe]
43
+
44
+ Thread.current[:knjappserver] = {
45
+ :kas => self,
46
+ :db => @kas.db_handler
47
+ }
48
+
49
+ begin
50
+ @args[:block].call(*@args[:args])
51
+ ensure
52
+ @kas.ob.db.free_thread if @kas.ob.db.opts[:threadsafe]
53
+ @kas.db_handler.free_thread if @kas.db_handler.opts[:threadsafe]
54
+ end
55
+ end
56
+ end
57
+ rescue Exception => e
58
+ @kas.handle_error(e)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ #Stops the timeout.
65
+ def stop
66
+ @run = false
67
+ @mutex.synchronize do
68
+ @thread.kill if @thread.alive?
69
+ @thread = nil
70
+ end
71
+ end
72
+
73
+ #Returns various data.
74
+ def [](key)
75
+ return @timeout if key == :knjappserver_timeout
76
+ raise "No such key: '#{key}'."
77
+ end
78
+ end
@@ -0,0 +1,30 @@
1
+ class Knjappserver
2
+ def trans(obj, key, args = {})
3
+ if !args.key?(:locale)
4
+ if _session[:locale]
5
+ args[:locale] = _session[:locale]
6
+ elsif _httpsession.data[:locale]
7
+ args[:locale] = _httpsession.data[:locale]
8
+ end
9
+ end
10
+
11
+ trans_val = @translations.get(obj, key, args).to_s
12
+
13
+ if trans_val.length <= 0
14
+ trans_val = @events.call(:trans_no_str, {:obj => obj, :key => key, :args => args})
15
+ end
16
+
17
+ return trans_val
18
+ end
19
+
20
+ def trans_set(obj, values)
21
+ args = {}
22
+ args[:locale] = _session[:locale] if _session[:locale] and !args[:locale]
23
+ args[:locale] = _httpsession.data[:locale] if _httpsession.data[:locale] and !args[:locale]
24
+ @translations.set(obj, values, args)
25
+ end
26
+
27
+ def trans_del(obj)
28
+ @translations.delete(obj)
29
+ end
30
+ end
@@ -1,23 +1,75 @@
1
1
  class Knjappserver
2
+ #Imports a .rhtml-file and executes it.
3
+ def import(filepath)
4
+ _httpsession.eruby.import(filepath)
5
+ end
6
+
7
+ #Redirects to another URL.
2
8
  def redirect(url, args = {})
3
- return Knj::Web.redirect(url, args)
9
+ #Header way
10
+ if !_httpsession.alert_sent and !self.headers_sent?
11
+ if args[:perm]
12
+ _httpsession.resp.status = 301 if !self.headers_sent?
13
+ else
14
+ _httpsession.resp.status = 303 if !self.headers_sent?
15
+ end
16
+
17
+ self.header("Location", url) if !self.headers_sent?
18
+ end
19
+
20
+ print "<script type=\"text/javascript\">location.href=\"#{url}\";</script>"
21
+ exit
4
22
  end
5
23
 
24
+ #Sends a javascript-alert to the HTML.
6
25
  def alert(msg)
26
+ _httpsession.alert_sent = true
7
27
  Knj::Web.alert(msg)
8
28
  return self
9
29
  end
10
30
 
31
+ #Define a cookies in the clients browser.
32
+ def cookie(cookie)
33
+ raise "No HTTP-session attached to this thread." if !_httpsession
34
+ raise "HTTP-session not active." if !_httpsession.resp
35
+ raise "Not a hash: '#{cookie.class.name}', '#{cookie}'." unless cookie.is_a?(Hash)
36
+ _httpsession.resp.cookie(cookie)
37
+ end
38
+
39
+ #Sends a header to the clients browser.
11
40
  def header(key, val)
12
- Knj::Php.header("#{key}: #{val}")
41
+ raise "No HTTP-session attached to this thread." if !_httpsession
42
+ raise "HTTP-session not active." if !_httpsession.resp
43
+ _httpsession.resp.header(key, val)
13
44
  end
14
45
 
46
+ #Sends a raw header-line to the clients browser.
15
47
  def header_raw(str)
48
+ raise "No HTTP-session attached to this thread." if !_httpsession
49
+ raise "HTTP-session not active." if !_httpsession.resp
16
50
  Knj::Php.header(str)
17
51
  end
18
52
 
53
+ def headers_sent?
54
+ return true if _httpsession.resp.headers_sent
55
+ return false
56
+ end
57
+
58
+ def headers_send_size=(newsize)
59
+ if self.headers_sent?
60
+ raise "The headers are already sent and you cannot modify the send-size any more."
61
+ end
62
+
63
+ _httpsession.size_send = newsize.to_i
64
+ end
65
+
66
+ #Sends a javascript back to the browser and exits.
19
67
  def back
20
68
  Knj::Web.back
21
- return self
69
+ end
70
+
71
+ #Draw a input in a table.
72
+ def inputs(*args)
73
+ return Knj::Web.inputs(args)
22
74
  end
23
75
  end
@@ -34,15 +34,27 @@ class Knjappserver::Log < Knj::Datarow
34
34
  end
35
35
 
36
36
  def self.add(d)
37
- if !d.data.has_key?(:date_saved)
38
- d.data[:date_saved] = d.db.date_out(Knj::Datet.new)
39
- end
37
+ d.data[:date_saved] = Time.now if !d.data.key?(:date_saved)
40
38
  end
41
39
 
42
40
  def text
43
41
  return ob.get(:Log_data_value, self[:text_value_id])[:value]
44
42
  end
45
43
 
44
+ def comment
45
+ return "" if self[:comment_data_id].to_i == 0
46
+ log_data = ob.get(:Log_data_value, self[:comment_data_id])
47
+ return "" if !log_data
48
+ return log_data[:value]
49
+ end
50
+
51
+ def tag
52
+ return "" if self[:tag_data_id].to_i == 0
53
+ log_data = ob.get(:Log_data_value, self[:tag_data_id])
54
+ return "" if !log_data
55
+ return log_data[:value]
56
+ end
57
+
46
58
  def get
47
59
  ob.args[:knjappserver].log_data_hash(self[:get_keys_data_id], self[:get_values_data_id])
48
60
  end
@@ -51,6 +63,22 @@ class Knjappserver::Log < Knj::Datarow
51
63
  ob.args[:knjappserver].log_data_hash(self[:post_keys_data_id], self[:post_values_data_id])
52
64
  end
53
65
 
66
+ def cookie
67
+ ob.args[:knjappserver].log_data_hash(self[:cookie_keys_data_id], self[:cookie_values_data_id])
68
+ end
69
+
70
+ def meta
71
+ ob.args[:knjappserver].log_data_hash(self[:meta_keys_data_id], self[:meta_values_data_id])
72
+ end
73
+
74
+ def ip
75
+ meta_d = self.meta
76
+
77
+ return meta_d[:HTTP_X_FORWARDED_FOR] if meta_d.has_key?(:HTTP_X_FORWARDED_FOR)
78
+ return meta_d[:REMOTE_ADDR] if meta_d.has_key?(:REMOTE_ADDR)
79
+ return "[no ip logged]"
80
+ end
81
+
54
82
  def first_line
55
83
  lines = self.text.to_s.split("\n").first.to_s
56
84
  end
@@ -1,19 +1,4 @@
1
1
  class Knjappserver::Log_access < Knj::Datarow
2
- def self.list(d)
3
- sql = "SELECT * FROM #{table} WHERE 1=1"
4
-
5
- ret = list_helper(d)
6
- d.args.each do |key, val|
7
- raise "Invalid key: #{key}."
8
- end
9
-
10
- sql += ret[:sql_where]
11
- sql += ret[:sql_order]
12
- sql += ret[:sql_limit]
13
-
14
- return d.ob.list_bysql(:Log_access, sql)
15
- end
16
-
17
2
  def get
18
3
  return data_hash("get")
19
4
  end
@@ -1,19 +1,4 @@
1
1
  class Knjappserver::Log_data < Knj::Datarow
2
- def self.list(d)
3
- sql = "SELECT * FROM #{table} WHERE 1=1"
4
-
5
- ret = list_helper(d)
6
- d.args.each do |key, val|
7
- raise "Invalid key: #{key}."
8
- end
9
-
10
- sql += ret[:sql_where]
11
- sql += ret[:sql_order]
12
- sql += ret[:sql_limit]
13
-
14
- return d.ob.list_bysql(:Log_data, sql)
15
- end
16
-
17
2
  def self.force(d, id_hash)
18
3
  data_obj = d.ob.get_by(:Log_data, {"id_hash" => id_hash})
19
4
 
@@ -1,16 +1,3 @@
1
1
  class Knjappserver::Log_data_link < Knj::Datarow
2
- def self.list(d)
3
- sql = "SELECT * FROM #{table} WHERE 1=1"
4
-
5
- ret = list_helper(d)
6
- d.args.each do |key, val|
7
- raise "Invalid key: #{key}."
8
- end
9
-
10
- sql += ret[:sql_where]
11
- sql += ret[:sql_order]
12
- sql += ret[:sql_limit]
13
-
14
- return d.ob.list_bysql(:Log_data_link, sql)
15
- end
2
+
16
3
  end
@@ -1,19 +1,4 @@
1
1
  class Knjappserver::Log_data_value < Knj::Datarow
2
- def self.list(d)
3
- sql = "SELECT * FROM #{table} WHERE 1=1"
4
-
5
- ret = list_helper(d)
6
- d.args.each do |key, val|
7
- raise "Invalid key: #{key}."
8
- end
9
-
10
- sql += ret[:sql_where]
11
- sql += ret[:sql_order]
12
- sql += ret[:sql_limit]
13
-
14
- return d.ob.list_bysql(:Log_data_value, sql)
15
- end
16
-
17
2
  def self.force(d, value)
18
3
  value_obj = d.ob.get_by(:Log_data_value, {
19
4
  "value" => value.to_s
@@ -27,8 +12,11 @@ class Knjappserver::Log_data_value < Knj::Datarow
27
12
  end
28
13
 
29
14
  def self.force_id(d, value)
30
- value_obj = d.db.query("SELECT * FROM Log_data_value WHERE value = '#{d.db.esc(value)}' LIMIT 1").fetch
31
- return value_obj[:id].to_i if value_obj
15
+ q_val = d.db.select(:Log_data_value, {"value" => value})
16
+ while d_val = q_val.fetch
17
+ return d_val[:id].to_i if d_val[:value].to_s == value.to_s #MySQL doesnt take upper/lower-case into consideration because value is a text-column... lame! - knj
18
+ end
19
+
32
20
  return d.db.insert(:Log_data_value, {:value => value}, {:return_id => true}).to_i
33
21
  end
34
22
  end
@@ -17,27 +17,15 @@ class Knjappserver::Session < Knj::Datarow
17
17
  end
18
18
  end
19
19
 
20
- def self.list(d)
21
- sql = "SELECT * FROM #{table} WHERE 1=1"
22
-
23
- ret = list_helper(d)
24
- d.args.each do |key, val|
25
- raise "Invalid key: #{key}."
26
- end
27
-
28
- sql += ret[:sql_where]
29
- sql += ret[:sql_order]
30
- sql += ret[:sql_limit]
31
-
32
- return d.ob.list_bysql(:Session, sql)
33
- end
34
-
35
20
  def self.add(d)
36
- d.data[:date_added] = Knj::Datet.new.dbstr if !d.data[:date_added]
21
+ d.data[:date_added] = Time.now if !d.data[:date_added]
22
+ d.data[:date_lastused] = Time.now if !d.data[:date_lastused]
37
23
  end
38
24
 
39
25
  def flush
40
- m_newdata = Base64.encode64(Marshal.dump(@sess_data))
41
- self[:sess_data] = m_newdata
26
+ self.update(
27
+ :sess_data => Base64.encode64(Marshal.dump(@sess_data)),
28
+ :date_lastused => Time.now
29
+ )
42
30
  end
43
31
  end
@@ -10,20 +10,24 @@ def _post
10
10
  return Thread.current[:knjappserver][:post] if Thread.current[:knjappserver]
11
11
  end
12
12
 
13
+ def _meta
14
+ return Thread.current[:knjappserver][:meta] if Thread.current[:knjappserver]
15
+ end
16
+
17
+ def _server
18
+ return Thread.current[:knjappserver][:meta] if Thread.current[:knjappserver]
19
+ end
20
+
13
21
  def _session
14
22
  return Thread.current[:knjappserver][:session].sess_data if Thread.current[:knjappserver] and Thread.current[:knjappserver][:session]
15
23
  end
16
24
 
17
25
  def _session_hash
18
- return Thread.current[:knjappserver][:session_hash] if Thread.current[:knjappserver]
26
+ return Thread.current[:knjappserver][:session].edata if Thread.current[:knjappserver] and Thread.current[:knjappserver][:session]
19
27
  end
20
28
 
21
29
  def _session_obj
22
- return Thread.current[:knjappserver][:session] if Thread.current[:knjappserver]
23
- end
24
-
25
- def _server
26
- return Thread.current[:knjappserver][:meta] if Thread.current[:knjappserver]
30
+ return Thread.current[:knjappserver][:session] if Thread.current[:knjappserver] and Thread.current[:knjappserver][:session]
27
31
  end
28
32
 
29
33
  def _httpsession
@@ -34,23 +38,17 @@ def _requestdata
34
38
  return Thread.current[:knjappserver] if Thread.current[:knjappserver]
35
39
  end
36
40
 
37
- def _meta
38
- return Thread.current[:knjappserver][:meta] if Thread.current[:knjappserver]
39
- end
40
-
41
41
  def _kas
42
42
  return Thread.current[:knjappserver][:kas] if Thread.current[:knjappserver]
43
- return $knjappserver[:knjappserver] if $knjappserver and $knjappserver[:knjappserver]
44
43
  end
45
44
 
46
45
  def _vars
47
46
  return Thread.current[:knjappserver][:kas].vars if Thread.current[:knjappserver]
48
- return $knjappserver[:knjappserver].vars if $knjappserver and $knjappserver[:knjappserver]
49
47
  end
50
48
 
51
49
  def _db
52
- return Thread.current[:knjappserver][:db] if Thread.current[:knjappserver]
53
- return $db if $db #return the global database object, if we are not running in a thread with one.
50
+ return Thread.current[:knjappserver][:db] if Thread.current[:knjappserver] and Thread.current[:knjappserver][:db] #This is the default use from a .rhtml-file.
51
+ return Thread.current[:knjappserver][:kas].db_handler if Thread.current[:knjappserver] and Thread.current[:knjappserver][:kas] #This is useually used when using autoload-argument for the appserver.
54
52
  end
55
53
 
56
54
  #This function makes it possible to define methods in ERubis-parsed files (else _buf-variable wouldnt be globally available).
File without changes
@@ -0,0 +1,14 @@
1
+ <%
2
+ 0.upto(100) do
3
+ print "Test 1<br />\n"
4
+ print "Test 2<br />\n"
5
+ print "Test 3<br />\n"
6
+ print "Test 4<br />\n"
7
+ print "Test 5<br />\n"
8
+ print "Test 6<br />\n"
9
+ print "Test 7<br />\n"
10
+ print "Test 8<br />\n"
11
+ print "Test 9<br />\n"
12
+ print "Test 10<br />\n"
13
+ end
14
+ %>