knjrbfw 0.0.23 → 0.0.24

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 (48) hide show
  1. data/VERSION +1 -1
  2. data/knjrbfw.gemspec +7 -4
  3. data/lib/knj/autoload.rb +1 -61
  4. data/lib/knj/datarow.rb +7 -10
  5. data/lib/knj/datarow_custom.rb +12 -2
  6. data/lib/knj/datet.rb +107 -0
  7. data/lib/knj/eruby.rb +21 -12
  8. data/lib/knj/gettext_threadded.rb +1 -1
  9. data/lib/knj/http2.rb +27 -9
  10. data/lib/knj/image.rb +10 -0
  11. data/lib/knj/includes/require_info.rb +3 -3
  12. data/lib/knj/knj.rb +16 -9
  13. data/lib/knj/knj_controller.rb +10 -1
  14. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql.rb +26 -9
  15. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_columns.rb +11 -8
  16. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_indexes.rb +5 -0
  17. data/lib/knj/knjdb/drivers/mysql/knjdb_mysql_tables.rb +83 -26
  18. data/lib/knj/knjdb/drivers/sqlite3/knjdb_sqlite3_tables.rb +3 -3
  19. data/lib/knj/knjdb/libknjdb.rb +19 -20
  20. data/lib/knj/knjdb/revision.rb +9 -2
  21. data/lib/knj/kvm.rb +100 -0
  22. data/lib/knj/locale_strings.rb +32 -3
  23. data/lib/knj/locales.rb +1 -4
  24. data/lib/knj/memory_analyzer.rb +335 -0
  25. data/lib/knj/objects/objects_sqlhelper.rb +2 -2
  26. data/lib/knj/objects.rb +44 -11
  27. data/lib/knj/opts.rb +8 -8
  28. data/lib/knj/os.rb +13 -0
  29. data/lib/knj/php.rb +18 -33
  30. data/lib/knj/process.rb +3 -0
  31. data/lib/knj/process_meta.rb +1 -1
  32. data/lib/knj/rhodes/mutex.rb +2 -1
  33. data/lib/knj/rhodes/rhodes.js +5 -1
  34. data/lib/knj/rhodes/rhodes.rb +15 -15
  35. data/lib/knj/rhodes/youtube_embed.erb +12 -0
  36. data/lib/knj/rhodes/youtube_open.erb +45 -0
  37. data/lib/knj/strings.rb +2 -1
  38. data/lib/knj/translations.rb +3 -3
  39. data/lib/knj/unix_proc.rb +15 -4
  40. data/lib/knj/web.rb +17 -247
  41. data/lib/knj/webscripts/image.rhtml +9 -3
  42. data/lib/knj/wref.rb +109 -70
  43. data/spec/datet_spec.rb +30 -0
  44. data/spec/http2_spec.rb +23 -0
  45. data/spec/php_spec.rb +3 -0
  46. metadata +20 -17
  47. data/lib/knj/rhodes/delegate.rb +0 -414
  48. data/lib/knj/rhodes/weakref.rb +0 -80
@@ -15,6 +15,7 @@ class Knj::Rhodes
15
15
  require "#{$knjpath}errors.rb"
16
16
  require "#{$knjpath}gettext_threadded.rb"
17
17
  require "#{$knjpath}locales.rb"
18
+ require "#{$knjpath}locale_strings.rb"
18
19
  require "#{$knjpath}web.rb"
19
20
 
20
21
  if !Kernel.const_defined?("Mutex")
@@ -22,11 +23,6 @@ class Knj::Rhodes
22
23
  require "#{$knjpath}rhodes/mutex.rb"
23
24
  end
24
25
 
25
- if !Kernel.const_defined?("WeakRef")
26
- print "WeakRef not defined - loading alternative.\n"
27
- require "#{$knjpath}rhodes/weakref.rb"
28
- end
29
-
30
26
  require "#{$knjpath}opts.rb"
31
27
 
32
28
  require "#{$knjpath}knjdb/libknjdb.rb"
@@ -43,7 +39,7 @@ class Knj::Rhodes
43
39
  @db = Knj::Db.new(
44
40
  :type => "sqlite3",
45
41
  :subtype => "rhodes",
46
- :path => "#{Rho::RhoApplication.get_base_app_path}app/rhodes_default.sqlite3",
42
+ :path => "#{Rho::RhoApplication.get_user_path}rhodes_default.sqlite3",
47
43
  :return_keys => "symbols",
48
44
  :require => false
49
45
  )
@@ -54,6 +50,7 @@ class Knj::Rhodes
54
50
  schema = {"tables" => {}}
55
51
  end
56
52
 
53
+ #Table used for options-module.
57
54
  schema["tables"]["Option"] = {
58
55
  "columns" => [
59
56
  {"name" => "id", "type" => "int", "autoincr" => true, "primarykey" => true},
@@ -62,23 +59,26 @@ class Knj::Rhodes
62
59
  ]
63
60
  }
64
61
 
62
+ #Run database-revision.
65
63
  dbrev = Knj::Db::Revision.new
66
64
  dbrev.init_db("schema" => schema, "db" => @db)
67
65
 
66
+ #Initialize options-module.
67
+ Knj::Opts.init(
68
+ "table" => "Option",
69
+ "knjdb" => @db
70
+ )
71
+
72
+ #Initialize objects-module.
68
73
  @ob = Knj::Objects.new(
69
74
  :db => @db,
70
75
  :class_path => "#{Rho::RhoApplication.get_base_app_path}app/models",
71
76
  :require => false,
72
77
  :module => @args[:module],
73
- :datarow => true,
74
- :cache => :none
75
- )
76
-
77
- Knj::Opts.init(
78
- "table" => "Option",
79
- "knjdb" => @db
78
+ :datarow => true
80
79
  )
81
80
 
81
+ #Initialize locales.
82
82
  @gettext = Knj::Gettext_threadded.new
83
83
  @gettext.load_dir("#{Rho::RhoApplication.get_base_app_path}app/locales")
84
84
 
@@ -181,8 +181,8 @@ class Knj::Rhodes
181
181
  end
182
182
 
183
183
  #This method is used to emulate web-behavior and make Knj::Locales.number_out and friends work properly.
184
- def _session(key)
185
- return $rhodes.session_key(key)
184
+ def _session
185
+ return {:locale => $rhodes.locale}
186
186
  end
187
187
 
188
188
  #This method is used to make gettext work.
@@ -0,0 +1,12 @@
1
+ <div data-role="page">
2
+ <div data-role="header">
3
+ <h1><%=_"YouTube embedded"%></h1>
4
+
5
+ <a href="javascript: history.back(-1)" class="ui-btn-left" data-icon="back" data-back="true"><%=_("Back")%></a>
6
+ </div>
7
+ <div data-role="content">
8
+ <center>
9
+ <iframe width="100%" height="<%=@iframe_height%>px" src="http://www.youtube.com/embed/<%=@params["youtube_id"]%>" frameborder="0" allowfullscreen></iframe>
10
+ </center>
11
+ </div>
12
+ </div>
@@ -0,0 +1,45 @@
1
+ <div data-role="page">
2
+ <div data-role="header">
3
+ <h1><%=_"Open YouTube link"%></h1>
4
+
5
+ <a href="javascript: history.back(-1)" class="ui-btn-left" data-icon="back" data-back="true"><%=_("Back")%></a>
6
+ </div>
7
+ <div data-role="content">
8
+ <ul data-role="listview">
9
+ <%if System::get_property('platform') != "APPLE"%>
10
+ <li>
11
+ <a href="javascript: knj_rhodes_html_links({'url': 'vnd.youtube://<%=@params["youtube_id"]%>'})">
12
+ <h3><%=_"Open in built-in app. (VND)"%></h3>
13
+ <p><%=_"This will trigger the YouTube-app. in Android."%></p>
14
+ </a>
15
+ </li>
16
+ <%end%>
17
+
18
+ <%if System::get_property("platform") == "APPLE"%>
19
+ <li>
20
+ <a href="javascript: knj_rhodes_html_links({'url': iphone_str})">
21
+ <h3><%=_"Open in built-in app. (iPhone)"%></h3>
22
+ <p><%=_"This will trigger the YouTube-app. on iPhone."%></p>
23
+ </a>
24
+ </li>
25
+ <%end%>
26
+
27
+ <li>
28
+ <a href="javascript: knj_rhodes_html_links({'url': 'http://www.youtube.com/watch?v=<%=@params["youtube_id"]%>'})">
29
+ <h3><%=_"Open YouTube-URL"%></h3>
30
+ <p><%=_"This will open the YouTube-video in a browser."%></p>
31
+ </a>
32
+ </li>
33
+ <li>
34
+ <a href="<%=url_for(:action => :youtube_embed, :query => {:youtube_id => @params["youtube_id"]})%>">
35
+ <h3><%=_"Open YouTube embedded"%></h3>
36
+ <p><%=_"Watch the video in this app. using embedding from YouTube."%></p>
37
+ </a>
38
+ </li>
39
+ </ul>
40
+
41
+ <script>
42
+ var iphone_str = "[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\"http://www.youtube.com/v/oHg5SJYRHA0&f=gdata_videos\"]]; "
43
+ </script>
44
+ </div>
45
+ </div>
data/lib/knj/strings.rb CHANGED
@@ -110,6 +110,7 @@ module Knj::Strings
110
110
  #Returns 'Yes' or 'No' based on a value. The value can be 0, 1, yes, no, true or false.
111
111
  def self.yn_str(value, str_yes = "Yes", str_no = "No")
112
112
  value = value.to_i if Knj::Php.is_numeric(value)
113
+ value_s = value.to_s
113
114
 
114
115
  if value.is_a?(Integer)
115
116
  if value == 0
@@ -119,7 +120,7 @@ module Knj::Strings
119
120
  end
120
121
  end
121
122
 
122
- return str_no if !value or value == "no"
123
+ return str_no if !value or value_s == "no" or value_s == "false" or value_s == ""
123
124
  return str_yes
124
125
  end
125
126
 
@@ -113,11 +113,11 @@ class Knj::Translations
113
113
  "object_class" => obj.class.name
114
114
  })
115
115
  trans.each do |tran|
116
- #Delete the translation object.
117
- @ob.delete(tran)
118
-
119
116
  #Delete the cache if defined on the object.
120
117
  cache.delete(tran[:key].to_sym) if cache and cache.key?(tran[:key].to_sym)
118
+
119
+ #Delete the translation object.
120
+ @ob.delete(tran)
121
121
  end
122
122
  end
123
123
  end
data/lib/knj/unix_proc.rb CHANGED
@@ -12,7 +12,7 @@ class Knj::Unix_proc
12
12
  begin
13
13
  proc_ele = PROCS[pid]
14
14
  proc_ele.update_data(data)
15
- rescue WeakRef::RefError
15
+ rescue Knj::Wref::Recycled
16
16
  proc_ele = Knj::Unix_proc.new(data)
17
17
  PROCS[pid] = proc_ele
18
18
  end
@@ -30,7 +30,7 @@ class Knj::Unix_proc
30
30
  end
31
31
 
32
32
  MUTEX.synchronize do
33
- ret = []
33
+ ret = [] unless block_given?
34
34
  res = Knj::Os.shellcmd(cmdstr)
35
35
 
36
36
  res.scan(/^(\S+)\s+([0-9]+)\s+([0-9.]+)\s+([0-9.]+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+ (.+)($|\n)/) do |match|
@@ -60,11 +60,22 @@ class Knj::Unix_proc
60
60
  next if !found
61
61
  end
62
62
 
63
- ret << Knj::Unix_proc.spawn(data)
63
+ proc_obj = Knj::Unix_proc.spawn(data)
64
+
65
+ if block_given?
66
+ yield(proc_obj)
67
+ else
68
+ ret << proc_obj
69
+ end
64
70
  end
65
71
 
66
72
  PROCS.clean
67
- return ret
73
+
74
+ if block_given?
75
+ return nil
76
+ else
77
+ return ret
78
+ end
68
79
  end
69
80
  end
70
81
 
data/lib/knj/web.rb CHANGED
@@ -1,213 +1,16 @@
1
1
  class Knj::Web
2
- attr_reader :session, :cgi, :data
3
-
4
- def initialize(args = {})
5
- @args = Knj::ArrayExt.hash_sym(args)
6
- @db = @args[:db] if @args[:db]
7
- @args[:tmp] = "/tmp" if !@args[:tmp]
8
-
9
- raise "No ID was given." if !@args[:id]
10
- raise "No DB was given." if !@args[:db]
11
-
12
- if @args[:cgi]
13
- @cgi = @args[:cgi]
14
- elsif $_CGI
15
- @cgi = $_CGI
16
- else
17
- if ENV["HTTP_HOST"] or $knj_eruby or Knj::Php.class_exists("Apache")
18
- @cgi = CGI.new
19
- end
20
- end
21
-
22
- $_CGI = @cgi if !$_CGI
23
- self.read_cgi
24
-
25
- if $_FCGI
26
- KnjEruby.connect("exit") do
27
- @session.close
28
-
29
- @post = nil
30
- @get = nil
31
- @server = nil
32
- @cookie = nil
33
-
34
- $_POST = nil
35
- $_GET = nil
36
- $_SERVER = nil
37
- $_COOKIE = nil
38
- end
39
- else
40
- Kernel.at_exit do
41
- @session.close
42
-
43
- @post = nil
44
- @get = nil
45
- @server = nil
46
- @cookie = nil
47
-
48
- $_POST = nil
49
- $_GET = nil
50
- $_SERVER = nil
51
- $_COOKIE = nil
52
- end
53
- end
54
- end
55
-
56
- def read_cgi(args = {})
57
- args.each do |key, value|
58
- if key == :cgi
59
- @cgi = value
60
- else
61
- raise "No such key: #{key.to_s}"
62
- end
63
- end
64
-
65
- if $_FCGI_COUNT and $_FCGI and $_CGI
66
- @server = {}
67
- $_CGI.env_table.each do |key, value|
68
- @server[key] = value
69
- end
70
- elsif $_CGI and ENV["HTTP_HOST"] and ENV["REMOTE_ADDR"]
71
- @server = {}
72
- ENV.each do |key, value|
73
- @server[key] = value
74
- end
75
- elsif Knj::Php.class_exists("Apache")
76
- @server = {
77
- "HTTP_HOST" => Apache.request.hostname,
78
- "HTTP_USER_AGENT" => Apache.request.headers_in["User-Agent"],
79
- "REMOTE_ADDR" => Apache.request.remote_host(1),
80
- "REQUEST_URI" => Apache.request.unparsed_uri
81
- }
82
- else
83
- @server = {}
84
- end
85
-
86
- @files = {}
87
- @post = {}
88
- if @cgi and @cgi.request_method == "POST"
89
- @cgi.params.each do |pair|
90
- do_files = false
91
- isstring = true
92
- varname = pair[0]
93
- stringparse = nil
94
-
95
- if pair[1][0].class.name == "Tempfile"
96
- if varname[0..3] == "file"
97
- isstring = false
98
- do_files = true
99
-
100
- if pair[1][0].size > 0
101
- stringparse = {
102
- "name" => pair[1][0].original_filename,
103
- "tmp_name" => pair[1][0].path,
104
- "size" => pair[1][0].size,
105
- "error" => 0
106
- }
107
-
108
- stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
109
- end
110
- else
111
- stringparse = File.read(pair[1][0].path)
112
- end
113
- elsif pair[1][0].is_a?(StringIO)
114
- if varname[0..3] == "file"
115
- tmpname = @args[:tmp] + "/knj_web_upload_#{Time.now.to_f.to_s}_#{rand(1000).to_s.untaint}"
116
- isstring = false
117
- do_files = true
118
- cont = pair[1][0].string
119
- Knj::Php.file_put_contents(tmpname, cont.to_s)
120
-
121
- if cont.length > 0
122
- stringparse = {
123
- "tmp_name" => tmpname,
124
- "size" => cont.length,
125
- "error" => 0
126
- }
127
-
128
- stringparse["name"] = pair[1][0].original_filename if pair[1][0].respond_to?("original_filename")
129
- end
130
- else
131
- stringparse = pair[1][0].string
132
- end
133
- else
134
- stringparse = pair[1][0]
135
- end
136
-
137
- if stringparse
138
- if !do_files
139
- if isstring
140
- Knj::Web.parse_name(@post, varname, stringparse)
141
- else
142
- @post[varname] = stringparse
143
- end
144
- else
145
- if isstring
146
- Knj::Web.parse_name(@files, varname, stringparse)
147
- else
148
- @files[varname] = stringparse
149
- end
150
- end
151
- end
152
- end
153
- end
154
-
155
-
156
- if @cgi and @cgi.query_string
157
- @get = Knj::Web.parse_urlquery(@cgi.query_string)
158
- else
159
- @get = {}
160
- end
2
+ #Parses URI and returns hash with data.
3
+ def self.parse_uri(str)
4
+ uri_match = str.to_s.match(/^\/(.+?\..+?|)(\?(.+)|)$/)
5
+ raise "Could not parse the URI: '#{str}'." if !uri_match
161
6
 
162
- @cookie = {}
163
- if @cgi
164
- @cgi.cookies.each do |key, value|
165
- @cookie[key] = value[0]
166
- end
167
- end
168
-
169
- self.global_params if @args[:globals]
170
-
171
- if @cookie[@args[:id]] and (sdata = @args[:db].single(:sessions, :id => @cookie[@args[:id]]))
172
- @data = Knj::ArrayExt.hash_sym(sdata)
173
-
174
- if @data
175
- if @data[:user_agent] != @server["HTTP_USER_AGENT"] or @data[:ip] != @server["REMOTE_ADDR"]
176
- @data = nil
177
- else
178
- @db.update(:sessions, {"last_url" => @server["REQUEST_URI"].to_s, "date_active" => Time.new}, {"id" => @data[:id]})
179
- session_id = @args[:id] + "_" + @data[:id]
180
- end
181
- end
182
- end
183
-
184
- if !@data or !session_id
185
- @db.insert(:sessions,
186
- :date_start => Time.new,
187
- :date_active => Time.new,
188
- :user_agent => @server["HTTP_USER_AGENT"],
189
- :ip => @server["REMOTE_ADDR"],
190
- :last_url => @server["REQUEST_URI"].to_s
191
- )
192
-
193
- @data = Knj::ArrayExt.hash_sym(@db.single(:sessions, :id => @db.last_id))
194
- session_id = @args[:id] + "_" + @data[:id]
195
- Knj::Php.setcookie(@args[:id], @data[:id])
196
- end
197
-
198
- require "cgi/session"
199
- require "cgi/session/pstore"
200
- @session = CGI::Session.new(@session, "database_manager" => CGI::Session::PStore, "session_id" => session_id, "session_path" => @args[:tmp])
201
- end
202
-
203
- def [](key)
204
- return @session[key.to_sym]
205
- end
206
-
207
- def []=(key, value)
208
- return @session[key.to_sym] = value
7
+ return {
8
+ :path => "/#{uri_match[1]}",
9
+ :query => uri_match[3]
10
+ }
209
11
  end
210
12
 
13
+ #Parses cookies-string and returns hash with parsed cookies.
211
14
  def self.parse_cookies(str)
212
15
  ret = {}
213
16
 
@@ -356,22 +159,6 @@ class Knj::Web
356
159
  end
357
160
  end
358
161
 
359
- def global_params
360
- $_POST = @post
361
- $_GET = @get
362
- $_COOKIE = @cookie
363
- $_FILES = @files
364
- $_SERVER = @server
365
- end
366
-
367
- def destroy
368
- @cgi = nil
369
- @post = nil
370
- @get = nil
371
- @session = nil
372
- @args = nil
373
- end
374
-
375
162
  def self.require_eruby(filepath)
376
163
  cont = File.read(filepath).untaint
377
164
  parse = Erubis.Eruby.new(cont)
@@ -722,13 +509,8 @@ class Knj::Web
722
509
  return html
723
510
  end
724
511
 
725
- def self.rendering_engine
726
- begin
727
- servervar = _server
728
- rescue Exception
729
- servervar = $_SERVER
730
- end
731
-
512
+ def self.rendering_engine(servervar = nil)
513
+ servervar = _server if !servervar
732
514
  if !servervar
733
515
  raise "Could not figure out meta data."
734
516
  end
@@ -749,13 +531,8 @@ class Knj::Web
749
531
  end
750
532
  end
751
533
 
752
- def self.os
753
- begin
754
- servervar = _server
755
- rescue Exception
756
- servervar = $_SERVER
757
- end
758
-
534
+ def self.os(servervar = nil)
535
+ servervar = _server if !servervar
759
536
  if !servervar
760
537
  raise "Could not figure out meta data."
761
538
  end
@@ -778,14 +555,7 @@ class Knj::Web
778
555
  end
779
556
 
780
557
  def self.browser(servervar = nil)
781
- if !servervar
782
- begin
783
- servervar = _server
784
- rescue Exception => e
785
- servervar = $_SERVER
786
- end
787
- end
788
-
558
+ servervar = _server if !servervar
789
559
  raise "Could not figure out meta data." if !servervar
790
560
  agent = servervar["HTTP_USER_AGENT"].to_s.downcase
791
561
 
@@ -923,10 +693,10 @@ class Knj::Web
923
693
  end
924
694
 
925
695
  def self.locale(args = {})
926
- begin
696
+ if args[:servervar]
697
+ servervar = args[:servervar]
698
+ else
927
699
  servervar = _server
928
- rescue Exception
929
- servervar = $_SERVER
930
700
  end
931
701
 
932
702
  if !servervar
@@ -26,6 +26,12 @@
26
26
  end
27
27
  end
28
28
 
29
+ #Base64-encoding of path.
30
+ if _get["path64"]
31
+ require "base64"
32
+ _get["path"] = Base64.decode64(_get["path64"])
33
+ end
34
+
29
35
 
30
36
  idstr = Digest::MD5.hexdigest("#{_get["path"]}_#{_get["smartsize"].to_i}_#{_get["width"].to_i}_#{_get["height"].to_i}_#{_get["maxwidth"].to_i}_#{_get["maxheight"].to_i}_#{_get["rounded_corners"].to_i}_#{_get["border"].to_i}_#{_get["border_color"]}")
31
37
 
@@ -38,9 +44,9 @@
38
44
 
39
45
  tmp_use = false
40
46
  tmp_write = false
41
- if $knj_webscripts_image_config
47
+ if Knj::CONFIG["webscripts_image"]
42
48
  tmp_use = true
43
- tmp_path = "#{$knj_webscripts_image_config["tmp_path"]}/#{idstr}"
49
+ tmp_path = "#{Knj::CONFIG["webscripts_image"]["tmp_path"]}/#{idstr}"
44
50
  tmp_exists = File.exists?(tmp_path)
45
51
  tmp_write = true if !tmp_exists
46
52
 
@@ -167,7 +173,7 @@
167
173
  if tmp_use and !force
168
174
  _kas.header("Last-Modified", "#{time_orig.httpdate} GMT") if time_orig
169
175
  _kas.header("Content-Type", "image/png")
170
- _httpsession.force_content(File.new(tmp_path))
176
+ _httpsession.force_content(File.read(tmp_path))
171
177
  else
172
178
  _kas.header("Last-Modified", "#{time_orig.httpdate} GMT") if time_orig
173
179
  _kas.header("Content-Type", "image/png")