rhodes-framework 1.1.1 → 1.2.0

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.
data/lib/rational.rb CHANGED
@@ -3,7 +3,7 @@ class Fixnum
3
3
  alias quof fdiv
4
4
  alias rdiv quo
5
5
 
6
- alias power! **
6
+ alias power! ** unless defined?(0.power!)
7
7
  alias rpower **
8
8
 
9
9
  end
@@ -13,7 +13,7 @@ class Bignum
13
13
  alias quof fdiv
14
14
  alias rdiv quo
15
15
 
16
- alias power! **
16
+ alias power! ** unless defined?(0.power!)
17
17
  alias rpower **
18
18
 
19
19
  end
data/lib/rho/rho.rb CHANGED
@@ -3,10 +3,12 @@ require 'rho/render'
3
3
  require 'rho/rhoapplication'
4
4
  require 'rhom'
5
5
  require 'rhofsconnector'
6
+ require 'rho/rhoerror'
6
7
 
7
8
  module Rho
8
9
  class RHO
9
10
  APPLICATIONS = {}
11
+ APPNAME = 'app'
10
12
 
11
13
  def initialize(app_manifest_filename=nil)
12
14
  puts "Calling RHO.initialize"
@@ -25,10 +27,25 @@ module Rho
25
27
  Rhom::RhomDbAdapter::close
26
28
  end
27
29
 
30
+ def raise_rhoerror(errCode)
31
+ raise Rho::RhoError.new(errCode)
32
+ end
33
+
34
+ def get_app(appname)
35
+ if (APPLICATIONS[appname].nil?)
36
+ require RhoApplication::get_app_path(appname)+'application'
37
+ APPLICATIONS[appname] = Object.const_get('AppApplication').new
38
+ end
39
+ APPLICATIONS[appname]
40
+ end
41
+
28
42
  # Return the directories where we need to load configuration files
29
43
  def process_model_dirs(app_manifest_filename=nil)
30
44
  File.open(app_manifest_filename).each do |line|
31
- require File.join(File.dirname(app_manifest_filename), line.chop)
45
+ str = line.chomp
46
+ if str != nil and str.length > 0
47
+ require File.join(File.dirname(app_manifest_filename), str )
48
+ end
32
49
  end
33
50
  end
34
51
 
@@ -38,10 +55,19 @@ module Rho
38
55
  File.open(Rho::RhoFSConnector.get_rhoconfig_filename).each do |line|
39
56
  parts = line.chop.split('=')
40
57
  key = parts[0]
41
- value = parts[1..parts.length-1].join('=') if parts and parts.length > 1
58
+ value = nil
59
+ if key and defined? RHO_ME
60
+ value = rho_get_app_property(key.strip)
61
+ end
62
+
63
+ if !value
64
+ value = parts[1] if parts[1]
65
+ end
66
+
42
67
  if key and value
43
- tmp = value.strip!
44
- Rho::RhoConfig.config[key.strip] = tmp.gsub(/'|"/,'') if tmp
68
+ val = value.strip.gsub(/\'|\"/,'')
69
+ val = val == 'nil' ? nil : val
70
+ Rho::RhoConfig.add_config(key.strip,val)
45
71
  end
46
72
  end
47
73
  rescue Exception => e
@@ -63,9 +89,10 @@ module Rho
63
89
 
64
90
  src_id = source['source_id']
65
91
  url = source['url']
92
+ name = source['name']
66
93
  if !self.source_initialized?(src_id)
67
94
  Rhom::RhomDbAdapter::insert_into_table('sources',
68
- {"source_id"=>src_id,"source_url"=>url})
95
+ {"source_id"=>src_id,"source_url"=>url,"name"=>name})
69
96
  end
70
97
  end
71
98
  end
@@ -74,15 +101,6 @@ module Rho
74
101
  def source_initialized?(source_id)
75
102
  Rhom::RhomDbAdapter::select_from_table('sources','*', 'source_id'=>source_id).size > 0 ? true : false
76
103
  end
77
-
78
- def get_app(appname)
79
- if (APPLICATIONS[appname].nil?)
80
- require RhoApplication::get_app_path(appname)+'application'
81
- #APPLICATIONS[appname] = Object.const_get(appname+'Application').new
82
- APPLICATIONS[appname] = Object.const_get('AppApplication').new
83
- end
84
- APPLICATIONS[appname]
85
- end
86
104
 
87
105
  def serve(req)
88
106
  begin
@@ -107,6 +125,8 @@ module Rho
107
125
  end
108
126
 
109
127
  def serve_index(index_name)
128
+ # TODO: Removed hardcoded appname
129
+ get_app(APPNAME).set_menu
110
130
  begin
111
131
  puts 'inside RHO.serve_index: ' + index_name
112
132
  res = init_response
@@ -118,6 +138,8 @@ module Rho
118
138
  end
119
139
 
120
140
  def serve_index_hash(index_name)
141
+ # TODO: Removed hardcoded appname
142
+ get_app(APPNAME).set_menu
121
143
  begin
122
144
  puts 'inside RHO.serve_index: ' + index_name
123
145
  res = init_response
@@ -161,10 +183,10 @@ module Rho
161
183
  data << "Expires: 0" << CRLF
162
184
 
163
185
  data << CRLF
164
- if ( !res['request-body'].nil? )
165
- data << res['request-body']
166
- end
167
-
186
+ if ( !res['request-body'].nil? )
187
+ data << res['request-body']
188
+ end
189
+
168
190
  data
169
191
  end
170
192
 
@@ -187,10 +209,10 @@ module Rho
187
209
  body << <<-_HTML_STRING_
188
210
  <html>
189
211
  <head>
190
- <title>Server Error</title>
191
212
  <meta name="viewport" content="width=320"/>
192
213
  </head>
193
214
  <body>
215
+ <h2>Server Error</h2>
194
216
  <p>
195
217
  _HTML_STRING_
196
218
  body << 'Error: ' << exception.message << "<br/>" if exception
@@ -213,13 +235,21 @@ module Rho
213
235
  class RhoConfig
214
236
 
215
237
  @@sources = {}
216
- @@config = {'start_path' => '/app',
217
- 'options_path' => '/app/Settings'}
238
+ @@config = {'start_path' => '/app', 'options_path' => '/app/Settings'}
218
239
 
219
240
  class << self
220
241
  def method_missing(name, *args)
221
- varname = name.to_s.sub(/=/,'')
222
- @@config[varname]
242
+ unless name == Fixnum
243
+ varname = name.to_s.gsub(/\=/,"")
244
+ setting = (name.to_s =~ /=/)
245
+ if setting
246
+ @@config[varname] = args[0]
247
+ # save changes to file
248
+ RhoConf.set_property_by_name(varname,args[0])
249
+ else
250
+ @@config[varname]
251
+ end
252
+ end
223
253
  end
224
254
 
225
255
  def sources
@@ -230,13 +260,18 @@ module Rho
230
260
  @@config
231
261
  end
232
262
 
263
+ def add_config(key,value)
264
+ @@config[key] = value if key # allow nil value
265
+ end
266
+
233
267
  def add_source(modelname, new_source=nil)
234
268
  if new_source
235
269
  unless @@sources[new_source]
236
270
  @@sources[modelname] = new_source
271
+ @@sources[modelname]['name'] ||= modelname
237
272
  end
238
273
  end
239
274
  end
240
275
  end
241
276
  end # RhoConfig
242
- end # Rho
277
+ end # Rho
@@ -3,15 +3,25 @@ require 'rhofsconnector'
3
3
 
4
4
  module Rho
5
5
  class RhoApplication
6
+ attr_accessor :default_menu
6
7
 
7
8
  def initialize
8
- if @rhom.nil?
9
+ unless @rhom
9
10
  @rhom = Rhom::Rhom.new
10
11
  end
12
+ unless @default_menu
13
+ @default_menu = { "Home" => :home, "Refresh" => :refresh,
14
+ "Sync" => :sync, "Options" => :options, "Log" => :log, :separator => nil, "Close" => :close }
15
+ end
11
16
  end
17
+
18
+ def set_menu(menu=nil)
19
+ disp_menu = menu ? menu : @default_menu
20
+ puts "RhoApplication: Using menu - #{disp_menu.inspect}"
21
+ WebView.set_menu_items(disp_menu)
22
+ end
12
23
 
13
24
  class << self
14
-
15
25
  def get_app_path(appname)
16
26
  Rho::RhoFSConnector::get_app_path(appname)
17
27
  end
@@ -23,13 +33,12 @@ module Rho
23
33
  def get_model_path(appname, modelname)
24
34
  Rho::RhoFSConnector::get_model_path(appname, modelname)
25
35
  end
26
-
27
36
  end
28
37
 
29
38
  def serve(req,res)
30
39
  req[:modelpath] = self.class.get_model_path req['application'], req['model']
31
40
  require req[:modelpath]+'controller'
32
- res['request-body'] = (Object.const_get(req['model']+'Controller').new).send :serve, @rhom, req, res
41
+ res['request-body'] = (Object.const_get(req['model']+'Controller').new).send :serve, self, @rhom, req, res
33
42
  end
34
43
 
35
44
  end # RhoApplication
@@ -4,6 +4,7 @@ require 'rho/rhoviewhelpers'
4
4
 
5
5
  module Rho
6
6
  class RhoController
7
+ attr_accessor :menu
7
8
 
8
9
  def default_action
9
10
  return Hash['GET','show','PUT','update','POST','update',
@@ -11,11 +12,14 @@ module Rho
11
12
  return Hash['GET','index','POST','create'][@request['request-method']]
12
13
  end
13
14
 
14
- def serve(object_mapping,req,res)
15
- @request, @response = req, res;
15
+ def serve(application,object_mapping,req,res)
16
+ @request, @response = req, res
16
17
  @object_mapping = object_mapping
17
18
  @params = RhoSupport::query_params req
18
- send req['action'].nil? ? default_action : req['action']
19
+ res = send req['action'].nil? ? default_action : req['action']
20
+ application.set_menu(@menu)
21
+ @menu = nil
22
+ res
19
23
  end
20
24
 
21
25
  # Returns true if the request's header contains "XMLHttpRequest".
@@ -0,0 +1,33 @@
1
+ module Rho
2
+ class RhoError < Exception
3
+ ERR_NONE = 0
4
+ ERR_NETWORK = 1
5
+ ERR_REMOTESERVER = 2
6
+ ERR_RUNTIME = 3
7
+ ERR_UNEXPECTEDSERVERRESPONSE = 4
8
+ ERR_DIFFDOMAINSINSYNCSRC = 5
9
+
10
+ attr_reader :code
11
+
12
+ def initialize(err_code)
13
+ @code = err_code
14
+ end
15
+
16
+ def message
17
+ if code == ERR_NETWORK
18
+ return "Could not establish network connection"
19
+ elsif code == ERR_REMOTESERVER
20
+ return "Server returned an error"
21
+ elsif code == ERR_RUNTIME
22
+ return "Internal error"
23
+ elsif code == ERR_UNEXPECTEDSERVERRESPONSE
24
+ return "Unexpected server response"
25
+ elsif code == ERR_DIFFDOMAINSINSYNCSRC
26
+ return "All sync sources should be from one domain"
27
+ end
28
+
29
+ return "Unknown error"
30
+ end
31
+
32
+ end # RhoError
33
+ end # Rho
data/lib/rho/rhoutils.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  module Rho
2
2
  class RhoUtils
3
3
  def self.load_offline_data(tables=[], dir_prefix=nil)
4
- first_row=true
5
4
  columns = []
6
5
  tables.each do |filename|
7
6
  Rhom::RhomDbAdapter.delete_all_from_table(filename)
7
+ Rhom::RhomDbAdapter.start_transaction
8
+
9
+ first_row=true
8
10
  prefix = dir_prefix.nil? ? "" : dir_prefix
9
11
  File.open(File.join(Rho::RhoFSConnector.get_base_app_path,'app',prefix,'fixtures',filename+'.txt')).each do |line|
10
12
  if first_row
@@ -18,8 +20,9 @@ module Rho
18
20
  end
19
21
  Rhom::RhomDbAdapter.insert_into_table(filename,row)
20
22
  end
23
+
24
+ Rhom::RhomDbAdapter.commit
21
25
  columns = []
22
- first_row = true
23
26
  end
24
27
  end
25
28
  end
data/lib/rhodes.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module Rhodes
2
2
  unless defined? Rhodes::VERSION
3
- VERSION = '1.1.1'
3
+ VERSION = '1.2.0'
4
4
  end
5
5
  unless defined? Rhodes::DBVERSION
6
- DBVERSION = '1.1.1'
6
+ DBVERSION = '1.2.0'
7
7
  end
8
8
 
9
9
  end
data/lib/rhom/rhom.rb CHANGED
@@ -21,17 +21,15 @@
21
21
 
22
22
  require 'rhom/rhom_object_factory'
23
23
  require 'rhom/rhom_object'
24
- if defined? RHO_DBME
25
- require 'rhom/rhom_db_adapterME'
26
- else
27
- require 'rhom/rhom_db_adapter'
28
- end
24
+ require 'rhom/rhom_db_adapter'
29
25
 
30
26
  module Rhom
31
- TABLE_NAME = 'object_values'
27
+ UPDATE_TYPES = ["'create'","'query'","'ask'"]
28
+
29
+ class RecordNotFound < StandardError
30
+ end
32
31
 
33
32
  class Rhom
34
- include RhomObject
35
33
  attr_accessor :factory
36
34
 
37
35
  def initialize
@@ -40,18 +38,33 @@ module Rhom
40
38
 
41
39
  class << Rhom
42
40
  def client_id
43
- c_id = ::Rhom::RhomDbAdapter::select_from_table('client_info','client_id')[0]
41
+ c_id = ::Rhom::RhomDbAdapter.select_from_table('client_info','client_id')[0]
44
42
  c_id.nil? ? nil : c_id['client_id']
45
43
  end
46
44
 
47
45
  def database_full_reset
48
- ::Rhom::RhomDbAdapter::delete_all_from_table(TABLE_NAME)
49
- ::Rhom::RhomDbAdapter::delete_all_from_table('client_info')
46
+ SyncEngine.stop_sync
47
+
48
+ ::Rhom::RhomDbAdapter.execute_sql("UPDATE client_info SET reset=1")
49
+
50
+ if defined? RHO_ME
51
+ ::Rhom::RhomDbAdapter.execute_sql("UPDATE sources SET token=NULL")
52
+ else
53
+ ::Rhom::RhomDbAdapter.execute_sql("UPDATE sources SET token=0")
54
+ end
55
+
56
+ if defined? RHO_DBME
57
+ ::Rhom::RhomDbAdapter.destroy_table('object_values')
58
+ #::Rhom::RhomDbAdapter.delete_all_from_table('object_values')
59
+ else
60
+ ::Rhom::RhomDbAdapter.delete_all_from_table('object_values')
61
+ ::Rhom::RhomDbAdapter.execute_sql("VACUUM")
62
+ end
50
63
  end
51
64
 
52
65
  def database_full_reset_and_logout
53
66
  database_full_reset
54
- SyncEngine::logout
67
+ SyncEngine.logout
55
68
  end
56
69
  end #class methods
57
70
  end # Rhom
@@ -17,20 +17,18 @@
17
17
  # You should have received a copy of the GNU General Public License
18
18
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
19
  #
20
- #$:.unshift(File.join(File.dirname(__FILE__), '../../'))
21
- # require 'sqlite3/database'
22
20
  require 'rhodes'
23
21
 
24
22
  module Rhom
25
23
  class RhomDbAdapter
26
24
 
27
25
  @@database = nil
26
+ @@inside_transaction = false
28
27
 
29
28
  class << self
30
29
 
31
30
  # maintains a single database connection
32
31
  def open(dbfile=nil)
33
- #puts "DB name = " + dbfile.inspect
34
32
  unless @@database or dbfile.nil?
35
33
  @@database = SQLite3::Database.new(dbfile)
36
34
  end
@@ -38,7 +36,7 @@ module Rhom
38
36
 
39
37
  # closes the database if and only if it is open
40
38
  def close
41
- if @@database #and not @@database.closed?
39
+ if @@database
42
40
  @@database.close
43
41
  @@database = nil
44
42
  else
@@ -47,32 +45,58 @@ module Rhom
47
45
  return true
48
46
  end
49
47
 
48
+ def start_transaction
49
+ begin
50
+ @@inside_transaction = true
51
+ @@database.start_transaction
52
+ rescue Exception => e
53
+ puts "exception when start_transaction"
54
+ end
55
+ end
56
+
57
+ def commit
58
+ begin
59
+ @@inside_transaction = false
60
+ @@database.commit
61
+ rescue Exception => e
62
+ puts "exception when commit transaction"
63
+ end
64
+ end
65
+
66
+ def rollback
67
+ begin
68
+ @@inside_transaction = false
69
+ @@database.rollback
70
+ rescue Exception => e
71
+ puts "exception when rollback transaction"
72
+ end
73
+ end
74
+
50
75
  # execute a sql statement
51
76
  # optionally, disable the factory processing
52
77
  # which returns the result array directly
53
78
  def execute_sql(sql=nil)
54
79
  result = []
55
80
  if sql
56
- #puts 'query is ' + sql
81
+ #puts "RhomDbAdapter: Executing query - #{sql}"
57
82
  # Make sure we lock the sync engine's mutex
58
83
  # before we perform a database transaction.
59
84
  # This prevents concurrency issues.
60
85
  begin
61
- SyncEngine::lock_sync_mutex
62
- # execute sql statement inside of transaction
63
- # result is returned as an array of hashes
64
- # @@database.transaction unless @@database.transaction_active?
65
- # @@database.results_as_hash = true
86
+ SyncEngine.lock_sync_mutex unless @@inside_transaction
66
87
  result = @@database.execute sql
67
- # @@database.commit
68
- SyncEngine::unlock_sync_mutex
88
+ SyncEngine.unlock_sync_mutex unless @@inside_transaction
69
89
  rescue Exception => e
70
- puts "exception when running query: #{e}"
90
+ #puts "exception when running query: #{e}"
71
91
  # make sure we unlock even if there's an error!
72
- SyncEngine::unlock_sync_mutex
92
+ if @@inside_transaction
93
+ raise
94
+ else
95
+ SyncEngine.unlock_sync_mutex
96
+ end
73
97
  end
74
98
  end
75
- #puts "returned #{result.length.to_s} records..."
99
+ #puts "result is: #{result.inspect}"
76
100
  result
77
101
  end
78
102
 
@@ -87,7 +111,6 @@ module Rhom
87
111
  if select_arr and select_arr.length > 0
88
112
  where_str += " and attrib in (#{select_str(select_arr)})"
89
113
  end
90
- #puts "where_str: #{where_str}" if where_str
91
114
  where_str
92
115
  end
93
116
 
@@ -109,19 +132,20 @@ module Rhom
109
132
  def string_from_key_vals(values, delim)
110
133
  vals = ""
111
134
  values.each do |key,value|
112
- vals << " #{key} = #{get_value_for_sql_stmt(value)} #{delim}"
135
+ op = value.nil? ? 'is ' : '= '
136
+ vals << " \"#{key}\" #{op} #{get_value_for_sql_stmt(value)} #{delim}"
113
137
  end
114
138
  vals
115
139
  end
116
140
 
117
141
  # generates a value for sql statement
118
142
  def get_value_for_sql_stmt(value)
119
- if value.is_a?(String)
120
- "'#{value}'"
121
- elsif value.nil?
143
+ if value.nil? or value == 'NULL'
122
144
  "NULL"
145
+ elsif value.is_a?(String)
146
+ "'#{value}'"
123
147
  else
124
- "#{value}"
148
+ "'#{value.to_s}'"
125
149
  end
126
150
  end
127
151
 
@@ -193,7 +217,16 @@ module Rhom
193
217
  end
194
218
  execute_sql query
195
219
  end
196
-
220
+
221
+ # deletes all rows from a given table by recreating db-file and save all other tables
222
+ def destroy_table(table)
223
+ query = nil
224
+ if table
225
+ query = "destroy #{table}"
226
+ end
227
+ execute_sql query
228
+ end
229
+
197
230
  # updates values (hash) in a given table which satisfy condition (hash)
198
231
  # example usage is the following:
199
232
  # update_into_table('object_values',{"value"=>"Electronics"},{"object"=>"some-object", "attrib"=>"industry"})
@@ -212,5 +245,5 @@ module Rhom
212
245
  end # Rhom
213
246
 
214
247
  at_exit do
215
- Rhom::RhomDbAdapter::close
248
+ ::Rhom::RhomDbAdapter.close
216
249
  end