knjrbfw 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
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")