rhoconnect 3.4.5 → 4.0.0.beta.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +57 -3
- data/Gemfile +9 -7
- data/Gemfile.lock +37 -37
- data/Rakefile +18 -7
- data/bench/benchapp/Gemfile +1 -1
- data/bench/benchapp/config.ru +0 -3
- data/bench/benchapp/controllers/ruby/application.rb +17 -0
- data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
- data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
- data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
- data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
- data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/spec_helper.rb +2 -2
- data/bench/blobapp/Gemfile +1 -1
- data/bench/blobapp/config.ru +0 -3
- data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
- data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
- data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
- data/bench/blobapp/spec/spec_helper.rb +1 -1
- data/bench/lib/bench/cli.rb +1 -1
- data/bench/scripts/blob_cud_script.rb +1 -1
- data/bench/scripts/query_md_script.rb +1 -1
- data/bench/scripts/query_only_script.rb +1 -1
- data/bench/scripts/query_script.rb +1 -1
- data/bench/scripts/test_query_script.rb +7 -1
- data/bench/spec/mock_adapter_spec.rb +1 -1
- data/bench/spec/result_spec.rb +3 -3
- data/bin/rhoconnect +5 -3
- data/commands/dtach/dtach_install.rb +2 -2
- data/commands/execute.rb +8 -3
- data/commands/generators/app.rb +3 -3
- data/commands/generators/controller.rb +6 -0
- data/commands/generators/model.rb +6 -0
- data/commands/generators/source.rb +3 -3
- data/commands/generators/update.rb +1 -1
- data/commands/redis/redis_about.rb +2 -2
- data/commands/redis/redis_download.rb +1 -1
- data/commands/redis/redis_install.rb +4 -3
- data/commands/redis/redis_restart.rb +4 -4
- data/commands/redis/redis_start.rb +5 -4
- data/commands/redis/redis_startbg.rb +5 -4
- data/commands/redis/redis_status.rb +13 -0
- data/commands/redis/redis_stop.rb +3 -3
- data/commands/rhoconnect/config.rb +28 -16
- data/commands/rhoconnect/flushdb.rb +1 -2
- data/commands/rhoconnect/get_token.rb +15 -11
- data/commands/rhoconnect/restart.rb +13 -5
- data/commands/rhoconnect/set_admin_password.rb +8 -8
- data/commands/rhoconnect/start.rb +74 -16
- data/commands/rhoconnect/startbg.rb +1 -1
- data/commands/rhoconnect/startdebug.rb +1 -1
- data/commands/rhoconnect/stop.rb +13 -1
- data/commands/rhoconnect/web.rb +5 -5
- data/commands/rhoconnect_console/console.rb +7 -5
- data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
- data/commands/rhoconnect_war/war.rb +9 -9
- data/commands/utilities/blank_app.ru +56 -0
- data/commands/utilities/redis_runner.rb +54 -19
- data/doc/authentication.txt +80 -6
- data/doc/blob-sync.txt +104 -97
- data/doc/bulk-sync.txt +1 -1
- data/doc/client-java.txt +3 -3
- data/doc/client-objc.txt +2 -2
- data/doc/client.txt +4 -4
- data/doc/command-line.txt +105 -200
- data/doc/data-partitioning.txt +40 -0
- data/doc/deploying.txt +249 -77
- data/doc/extending-rhoconnect-server.txt +40 -57
- data/doc/heroku-addon.txt +2 -0
- data/doc/install.txt +45 -95
- data/doc/introduction.txt +1 -1
- data/doc/java-plugin.txt +365 -190
- data/doc/metadata.txt +1 -1
- data/doc/migration.txt +108 -142
- data/doc/preparing-production.txt +1 -1
- data/doc/push-backend-setup.txt +2 -0
- data/doc/push-client-setup-android.txt +78 -0
- data/doc/push-client-setup-bb.txt +81 -0
- data/doc/push-client-setup-ios.txt +70 -0
- data/doc/push-client-setup-rps.txt +200 -0
- data/doc/push-client-setup.txt +63 -66
- data/doc/push-server-setup.txt +67 -40
- data/doc/push-testing.txt +29 -0
- data/doc/push.txt +21 -6
- data/doc/rest-api.txt +128 -55
- data/doc/rhoconnect-redis-stack.txt +120 -0
- data/doc/settings.txt +4 -12
- data/doc/source-adapters-intro.txt +28 -0
- data/doc/source-adapters.txt +235 -272
- data/doc/stats-middleware.txt +9 -29
- data/doc/supported-platforms.txt +21 -30
- data/doc/testing.txt +40 -42
- data/doc/tutorial.txt +72 -57
- data/examples/simple/Gemfile +1 -1
- data/examples/simple/application.rb +4 -5
- data/examples/simple/my_server.rb +2 -2
- data/examples/simple/settings/settings.yml +1 -1
- data/generators/rhoconnect.rb +151 -50
- data/generators/templates/application/Gemfile +1 -1
- data/generators/templates/application/Rakefile +3 -3
- data/generators/templates/application/config.ru +1 -4
- data/generators/templates/application/controllers/application_controller.rb +17 -0
- data/generators/templates/application/controllers/js/application_controller.js +14 -0
- data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
- data/generators/templates/application/package.json +8 -0
- data/generators/templates/application/rcgemfile +2 -5
- data/generators/templates/application/settings/settings.yml +3 -3
- data/generators/templates/application/spec/application_controller_spec.rb +23 -0
- data/generators/templates/application/spec/js_spec.rb +25 -0
- data/generators/templates/application/spec/spec_helper.rb +21 -7
- data/generators/templates/source/controllers/js/controller.js +7 -0
- data/generators/templates/source/controllers/ruby/controller.rb +8 -0
- data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
- data/generators/templates/source/models/js/model.js +46 -0
- data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
- data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
- data/install.sh +5 -5
- data/installer/unix-like/create_texts.rb +2 -2
- data/installer/unix-like/rho_connect_install_constants.rb +2 -2
- data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
- data/installer/utils/constants.rb +4 -4
- data/js-adapters/ballroom.js +216 -0
- data/js-adapters/node.rb +52 -0
- data/js-adapters/node_channel.rb +181 -0
- data/js-adapters/request.js +27 -0
- data/js-adapters/response.js +57 -0
- data/js-adapters/rhoconnect_helpers.js +60 -0
- data/js-adapters/router.js +60 -0
- data/js-adapters/server.js +5 -0
- data/lib/rhoconnect/api/app/ans_login.rb +3 -3
- data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
- data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
- data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
- data/lib/rhoconnect/api/app/fast_update.rb +11 -10
- data/lib/rhoconnect/api/app/login.rb +5 -5
- data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
- data/lib/rhoconnect/api/app/push_objects.rb +12 -11
- data/lib/rhoconnect/api/app/query.rb +8 -7
- data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
- data/lib/rhoconnect/api/app/search.rb +8 -7
- data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
- data/lib/rhoconnect/api/client/create.rb +7 -7
- data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
- data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
- data/lib/rhoconnect/api/client/register.rb +12 -12
- data/lib/rhoconnect/api/client/reset.rb +5 -5
- data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
- data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
- data/lib/rhoconnect/api/source/list_sources.rb +16 -16
- data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
- data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
- data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
- data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
- data/lib/rhoconnect/api/system/login.rb +15 -15
- data/lib/rhoconnect/api/system/reset.rb +11 -11
- data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/stats.rb +22 -22
- data/lib/rhoconnect/api/user/create_user.rb +7 -7
- data/lib/rhoconnect/api/user/delete_client.rb +6 -6
- data/lib/rhoconnect/api/user/delete_user.rb +11 -10
- data/lib/rhoconnect/api/user/list_clients.rb +4 -4
- data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
- data/lib/rhoconnect/api/user/list_users.rb +3 -3
- data/lib/rhoconnect/api/user/ping.rb +3 -3
- data/lib/rhoconnect/api/user/show_user.rb +3 -3
- data/lib/rhoconnect/api/user/update_user.rb +5 -5
- data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
- data/lib/rhoconnect/api_token.rb +5 -6
- data/lib/rhoconnect/app.rb +6 -46
- data/lib/rhoconnect/application/init.rb +5 -2
- data/lib/rhoconnect/async.rb +76 -39
- data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
- data/lib/rhoconnect/client.rb +59 -9
- data/lib/rhoconnect/condition/admin_required.rb +27 -0
- data/lib/rhoconnect/condition/client_required.rb +50 -0
- data/lib/rhoconnect/condition/login_required.rb +22 -0
- data/lib/rhoconnect/condition/source_required.rb +49 -0
- data/lib/rhoconnect/condition/verbs.rb +17 -0
- data/lib/rhoconnect/condition/verify_success.rb +19 -0
- data/lib/rhoconnect/controller/app_base.rb +74 -0
- data/lib/rhoconnect/controller/base.rb +68 -0
- data/lib/rhoconnect/controller/clients_controller.rb +79 -0
- data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
- data/lib/rhoconnect/controller/js_base.rb +124 -0
- data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
- data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
- data/lib/rhoconnect/controller/sources_controller.rb +44 -0
- data/lib/rhoconnect/controller/store_controller.rb +25 -0
- data/lib/rhoconnect/controller/system_controller.rb +67 -0
- data/lib/rhoconnect/controller/users_controller.rb +99 -0
- data/lib/rhoconnect/db_adapter.rb +1 -3
- data/lib/rhoconnect/document.rb +159 -50
- data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
- data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
- data/lib/rhoconnect/handler/authenticate.rb +3 -0
- data/lib/rhoconnect/handler/bulk_data.rb +28 -0
- data/lib/rhoconnect/handler/changes/engine.rb +271 -0
- data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
- data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
- data/lib/rhoconnect/handler/changes/runner.rb +53 -0
- data/lib/rhoconnect/handler/changes.rb +31 -0
- data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
- data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
- data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
- data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
- data/lib/rhoconnect/handler/helpers.rb +4 -0
- data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
- data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
- data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
- data/lib/rhoconnect/handler/query/engine.rb +93 -0
- data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
- data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
- data/lib/rhoconnect/handler/query/runner.rb +270 -0
- data/lib/rhoconnect/handler/query.rb +19 -0
- data/lib/rhoconnect/handler/search/engine.rb +60 -0
- data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
- data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
- data/lib/rhoconnect/handler/search/runner.rb +104 -0
- data/lib/rhoconnect/handler/search.rb +26 -0
- data/lib/rhoconnect/handler/sync.rb +29 -0
- data/lib/rhoconnect/jobs/source_job.rb +13 -4
- data/lib/rhoconnect/js_adapter.rb +79 -0
- data/lib/rhoconnect/license.rb +10 -2
- data/lib/rhoconnect/middleware/current_user.rb +14 -1
- data/lib/rhoconnect/middleware/helpers.rb +10 -93
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
- data/lib/rhoconnect/model/base.rb +229 -0
- data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
- data/lib/rhoconnect/model/js_base.rb +121 -0
- data/lib/rhoconnect/ping/android.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
- data/lib/rhoconnect/read_state.rb +3 -3
- data/lib/rhoconnect/server.rb +159 -190
- data/lib/rhoconnect/source.rb +100 -11
- data/lib/rhoconnect/stats/record.rb +10 -10
- data/lib/rhoconnect/store.rb +905 -591
- data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
- data/lib/rhoconnect/tasks.rb +18 -4
- data/lib/rhoconnect/test_methods.rb +30 -17
- data/lib/rhoconnect/user.rb +35 -17
- data/lib/rhoconnect/utilities.rb +1 -1
- data/lib/rhoconnect/version.rb +2 -2
- data/lib/rhoconnect/web-console/server.rb +29 -14
- data/lib/rhoconnect/web-console/views/home.js +10 -10
- data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
- data/lib/rhoconnect.rb +120 -51
- data/rhoconnect.gemspec +4 -3
- data/spec/api/api_helper.rb +1 -6
- data/spec/api/app/fast_delete_spec.rb +4 -4
- data/spec/api/app/fast_insert_spec.rb +4 -4
- data/spec/api/app/fast_update_spec.rb +8 -8
- data/spec/api/app/push_deletes_spec.rb +2 -2
- data/spec/api/app/push_objects_spec.rb +5 -5
- data/spec/api/client/client_get_db_doc_spec.rb +6 -4
- data/spec/api/client/client_set_db_doc_spec.rb +3 -2
- data/spec/api/client/get_client_params_spec.rb +14 -0
- data/spec/api/client/list_client_docs_spec.rb +30 -20
- data/spec/api/client/reset_spec.rb +36 -0
- data/spec/api/source/get_source_params_spec.rb +23 -17
- data/spec/api/system/get_license_info_spec.rb +0 -20
- data/spec/api/system/login_spec.rb +8 -0
- data/spec/api/system/reset_spec.rb +0 -1
- data/spec/api/system/stats_spec.rb +5 -5
- data/spec/api/user/create_user_spec.rb +14 -6
- data/spec/api/user/delete_user_spec.rb +20 -18
- data/spec/api/user/list_users_spec.rb +5 -6
- data/spec/api/user/update_user_spec.rb +5 -4
- data/spec/apps/rhotestapp/config.ru +16 -1
- data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
- data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
- data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
- data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
- data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
- data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -1
- data/spec/bulk_data/bulk_data_spec.rb +20 -5
- data/spec/cli/cli_spec.rb +83 -0
- data/spec/client_spec.rb +20 -17
- data/spec/client_sync_spec.rb +244 -406
- data/spec/controllers/js_base_spec.rb +89 -0
- data/spec/doc/doc_spec.rb +18 -18
- data/spec/document_spec.rb +29 -13
- data/spec/dynamic_adapter_spec.rb +6 -6
- data/spec/generator/generator_spec.rb +7 -4
- data/spec/jobs/bulk_data_job_spec.rb +14 -10
- data/spec/jobs/source_job_spec.rb +8 -8
- data/spec/license_spec.rb +5 -2
- data/spec/models/js_model_spec.rb +39 -0
- data/spec/node_spec.rb +42 -0
- data/spec/perf/store_perf_spec.rb +67 -12
- data/spec/ping/android_spec.rb +1 -1
- data/spec/read_state_spec.rb +1 -1
- data/spec/rhoconnect_spec.rb +1 -1
- data/spec/server/cors_spec.rb +14 -18
- data/spec/server/server_spec.rb +265 -88
- data/spec/server/stats_spec.rb +1 -1
- data/spec/source_adapter_spec.rb +54 -27
- data/spec/source_spec.rb +8 -3
- data/spec/source_sync_spec.rb +538 -468
- data/spec/spec_helper.rb +35 -4
- data/spec/stats/record_spec.rb +10 -10
- data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
- data/spec/store_spec.rb +159 -179
- data/spec/support/shared_examples.rb +36 -27
- data/spec/sync_states_spec.rb +40 -33
- data/spec/test_methods_spec.rb +18 -14
- data/spec/user_spec.rb +17 -30
- metadata +156 -52
- data/bench/benchapp/application.rb +0 -39
- data/bench/blobapp/application.rb +0 -44
- data/commands/rhoconnect/clean_start.rb +0 -9
- data/commands/rhoconnect/create_user.rb +0 -18
- data/commands/rhoconnect/delete_device.rb +0 -9
- data/commands/rhoconnect/delete_user.rb +0 -8
- data/commands/rhoconnect/reset.rb +0 -16
- data/commands/rhoconnect/reset_refresh.rb +0 -11
- data/generators/templates/application/application.rb +0 -43
- data/lib/rhoconnect/client_sync.rb +0 -434
- data/lib/rhoconnect/dynamic_adapter.rb +0 -91
- data/lib/rhoconnect/middleware/admin_user.rb +0 -23
- data/lib/rhoconnect/middleware/current_request.rb +0 -16
- data/lib/rhoconnect/middleware/login_required.rb +0 -22
- data/lib/rhoconnect/source_adapter.rb +0 -132
- data/lib/rhoconnect/source_sync.rb +0 -464
- data/spec/apps/rhotestapp/application.rb +0 -23
@@ -1,26 +1,25 @@
|
|
1
1
|
module Rhoconnect
|
2
|
-
# Taken from http://github.com/voloko/
|
2
|
+
# Taken from http://github.com/voloko/store-model
|
3
3
|
#
|
4
|
-
# Simple
|
5
|
-
|
6
|
-
class Model
|
4
|
+
# Simple ORM for store-rb.
|
5
|
+
class StoreOrm
|
7
6
|
attr_accessor :id
|
8
7
|
|
9
8
|
def initialize(id=nil)
|
10
9
|
self.id = id
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
self.class.
|
12
|
+
def store #:nodoc:
|
13
|
+
self.class.store
|
15
14
|
end
|
16
15
|
|
17
16
|
# Issues delete commands for all defined fields
|
18
17
|
def delete(name = nil)
|
19
18
|
if name
|
20
|
-
|
19
|
+
store.delete_value(field_key(name.to_s))
|
21
20
|
else
|
22
21
|
self.class.fields.each do |field|
|
23
|
-
|
22
|
+
store.delete_value(field_key(field[:name]))
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -33,22 +32,22 @@ module Rhoconnect
|
|
33
32
|
# specified amount.
|
34
33
|
def increment!(name,amount=1)
|
35
34
|
raise ArgumentError, "Only integer fields can be incremented." unless self.class.fields.include?({:name => name.to_s, :type => :integer})
|
36
|
-
|
35
|
+
store.update_count(field_key(name), amount)
|
37
36
|
end
|
38
37
|
|
39
38
|
# Decrement the specified integer field by 1 or the
|
40
39
|
# specified amount.
|
41
40
|
def decrement!(name,amount=1)
|
42
41
|
raise ArgumentError, "Only integer fields can be decremented." unless self.class.fields.include?({:name => name.to_s, :type => :integer})
|
43
|
-
|
42
|
+
store.update_count(field_key(name), -amount)
|
44
43
|
end
|
45
44
|
|
46
45
|
def next_id #:nodoc:
|
47
|
-
|
46
|
+
store.incr "sequence:#{self.prefix}:id"
|
48
47
|
end
|
49
48
|
|
50
49
|
def self.is_exist?(id)
|
51
|
-
!
|
50
|
+
!store.get_value(self._field_key(self._prefix,id,'rho__id')).nil?
|
52
51
|
end
|
53
52
|
|
54
53
|
def to_array
|
@@ -59,16 +58,6 @@ module Rhoconnect
|
|
59
58
|
res
|
60
59
|
end
|
61
60
|
|
62
|
-
# TODO: not used anymore
|
63
|
-
# def update(attribs)
|
64
|
-
# self.class.fields.each do |field|
|
65
|
-
# if field[:name] != 'name' and field[:name] != 'rho__id'
|
66
|
-
# redis.del field_key(field[:name])
|
67
|
-
# end
|
68
|
-
# end
|
69
|
-
# self.class.populate_attributes(self,attribs)
|
70
|
-
# end
|
71
|
-
|
72
61
|
protected
|
73
62
|
def prefix #:nodoc:
|
74
63
|
@prefix ||= self.class.prefix || self.class.class_prefix(self.class)
|
@@ -132,8 +121,8 @@ module Rhoconnect
|
|
132
121
|
# Creates new model instance with given id
|
133
122
|
alias_method :with_key, :new
|
134
123
|
alias_method :with_next_key, :create
|
135
|
-
|
136
|
-
# Defines marshaled rw accessor for
|
124
|
+
|
125
|
+
# Defines marshaled rw accessor for store string value
|
137
126
|
def field(name, type = :string)
|
138
127
|
if @fields.nil?
|
139
128
|
@fields = []
|
@@ -146,30 +135,30 @@ module Rhoconnect
|
|
146
135
|
|
147
136
|
fields << {:name => name.to_s, :type => type}
|
148
137
|
if type == :string
|
149
|
-
class_eval "def #{name}; @#{name} ||=
|
150
|
-
class_eval "def #{name}=(value); @#{name} =
|
138
|
+
class_eval "def #{name}; @#{name} ||= store.get_value(field_key('#{name}')); end"
|
139
|
+
class_eval "def #{name}=(value); @#{name} = value.to_s; store.put_value(field_key('#{name}'), value.to_s); end"
|
151
140
|
else
|
152
|
-
class_eval "def #{name}; @#{name} ||= Marshal::#{class_name}.load(
|
153
|
-
class_eval "def #{name}=(value); @#{name} = value;
|
141
|
+
class_eval "def #{name}; @#{name} ||= Marshal::#{class_name}.load(store.get_value(field_key('#{name}'))); end"
|
142
|
+
class_eval "def #{name}=(value); @#{name} = value; store.put_value(field_key('#{name}'), Marshal::#{class_name}.dump(value)); end"
|
154
143
|
end
|
155
144
|
end
|
156
145
|
alias_method :value, :field
|
157
146
|
|
158
|
-
# Defines accessor for
|
147
|
+
# Defines accessor for store list
|
159
148
|
def list(name, type = :string)
|
160
149
|
class_name = marshal_class_name(name, type)
|
161
150
|
|
162
151
|
fields << {:name => name.to_s, :type => :list}
|
163
|
-
class_eval "def #{name}; @#{name} ||= ListProxy.new(self.
|
152
|
+
class_eval "def #{name}; @#{name} ||= ListProxy.new(self.store, field_key('#{name}'), Marshal::#{class_name}); end"
|
164
153
|
eval_writer(name)
|
165
154
|
end
|
166
155
|
|
167
|
-
# Defines accessor for
|
156
|
+
# Defines accessor for store set
|
168
157
|
def set(name, type = :string)
|
169
158
|
class_name = marshal_class_name(name, type)
|
170
159
|
|
171
160
|
fields << {:name => name.to_s, :type => :set}
|
172
|
-
class_eval "def #{name}; @#{name} ||= SetProxy.new(self.
|
161
|
+
class_eval "def #{name}; @#{name} ||= SetProxy.new(self.store, field_key('#{name}'), Marshal::#{class_name}); end"
|
173
162
|
eval_writer(name)
|
174
163
|
end
|
175
164
|
|
@@ -178,8 +167,8 @@ module Rhoconnect
|
|
178
167
|
end
|
179
168
|
|
180
169
|
# Redefine this to change connection options
|
181
|
-
def
|
182
|
-
@@
|
170
|
+
def store
|
171
|
+
@@store ||= Store.get_store(0)
|
183
172
|
end
|
184
173
|
|
185
174
|
def fields #:nodoc:
|
@@ -197,6 +186,19 @@ module Rhoconnect
|
|
197
186
|
field << v
|
198
187
|
end
|
199
188
|
end
|
189
|
+
END
|
190
|
+
end
|
191
|
+
|
192
|
+
def instance_eval_writer(name) #:nodoc:
|
193
|
+
instance_eval <<-END
|
194
|
+
def #{name}=(value)
|
195
|
+
field = self.#{name};
|
196
|
+
if value.respond_to?(:each)
|
197
|
+
value.each {|v| field << v}
|
198
|
+
else
|
199
|
+
field << v
|
200
|
+
end
|
201
|
+
end
|
200
202
|
END
|
201
203
|
end
|
202
204
|
|
@@ -269,146 +271,82 @@ module Rhoconnect
|
|
269
271
|
end
|
270
272
|
end
|
271
273
|
|
272
|
-
|
273
|
-
|
274
|
+
# PROXY implementations
|
274
275
|
class FieldProxy #:nodoc
|
275
|
-
def initialize(
|
276
|
-
|
276
|
+
def initialize(store_inst, name, marshal)
|
277
|
+
# TODO: this low-level access should be removed in 4.0
|
278
|
+
@store_db = store_inst.send(:db)
|
277
279
|
@name = name
|
278
280
|
@marshal = marshal
|
279
281
|
end
|
280
|
-
|
281
|
-
# def method_missing(method, *argv)
|
282
|
-
# translated_method = translate_method_name(method)
|
283
|
-
# raise NoMethodError.new("Method '#{method}' is not defined") unless translated_method
|
284
|
-
# @redis.send translated_method, @name, *argv
|
285
|
-
# end
|
286
|
-
#
|
287
|
-
# protected
|
288
|
-
# def translate_method_name(m)
|
289
|
-
# m
|
290
|
-
# end
|
291
282
|
end
|
292
283
|
|
293
|
-
|
294
|
-
|
295
284
|
class ListProxy < FieldProxy #:nodoc:
|
296
285
|
def <<(v)
|
297
|
-
@
|
286
|
+
@store_db.rpush @name, @marshal.dump(v)
|
298
287
|
end
|
299
288
|
alias_method :push_tail, :<<
|
300
289
|
|
301
290
|
def push_head(v)
|
302
|
-
@
|
291
|
+
@store_db.lpush @name, @marshal.dump(v)
|
303
292
|
end
|
304
293
|
|
305
294
|
def pop_tail
|
306
|
-
@marshal.load(@
|
295
|
+
@marshal.load(@store_db.rpop(@name))
|
307
296
|
end
|
308
297
|
|
309
298
|
def pop_head
|
310
|
-
@marshal.load(@
|
299
|
+
@marshal.load(@store_db.lpop(@name))
|
311
300
|
end
|
312
301
|
|
313
302
|
def [](from, to = nil)
|
314
303
|
if to.nil?
|
315
|
-
@marshal.load(@
|
304
|
+
@marshal.load(@store_db.lindex(@name, from))
|
316
305
|
else
|
317
|
-
@
|
306
|
+
@store_db.lrange(@name, from, to).map! { |v| @marshal.load(v) }
|
318
307
|
end
|
319
308
|
end
|
320
309
|
alias_method :range, :[]
|
321
310
|
|
322
311
|
def []=(index, v)
|
323
|
-
@
|
312
|
+
@store_db.lset(@name, index, @marshal.dump(v))
|
324
313
|
end
|
325
314
|
alias_method :set, :[]=
|
326
315
|
|
327
316
|
def include?(v)
|
328
|
-
@
|
317
|
+
@store_db.exists(@name, @marshal.dump(v))
|
329
318
|
end
|
330
319
|
|
331
320
|
def remove(count, v)
|
332
|
-
@
|
321
|
+
@store_db.lrem(@name, count, @marshal.dump(v))
|
333
322
|
end
|
334
|
-
|
335
|
-
# def length
|
336
|
-
# @redis.llen(@name)
|
337
|
-
# end
|
338
|
-
#
|
339
|
-
# def trim(from, to)
|
340
|
-
# @redis.ltrim(@name, from, to)
|
341
|
-
# end
|
342
|
-
#
|
343
|
-
# def to_s
|
344
|
-
# range(0, 100).join(', ')
|
345
|
-
# end
|
346
|
-
#
|
347
|
-
# protected
|
348
|
-
# def translate_method_name(m)
|
349
|
-
# COMMANDS[m]
|
350
|
-
# end
|
351
323
|
end
|
352
324
|
|
353
|
-
|
354
|
-
|
355
325
|
class SetProxy < FieldProxy #:nodoc:
|
356
|
-
# COMMANDS = {
|
357
|
-
# :intersect_store => "sinterstore",
|
358
|
-
# :union_store => "sunionstore",
|
359
|
-
# :diff_store => "sdiffstore",
|
360
|
-
# :move => "smove",
|
361
|
-
# }
|
362
|
-
|
363
326
|
def <<(v)
|
364
|
-
@
|
327
|
+
@store_db.sadd @name, @marshal.dump(v)
|
365
328
|
end
|
366
329
|
alias_method :add, :<<
|
367
330
|
|
368
331
|
def delete(v)
|
369
|
-
@
|
332
|
+
@store_db.srem @name, @marshal.dump(v)
|
370
333
|
end
|
371
334
|
alias_method :remove, :delete
|
372
335
|
|
373
336
|
def include?(v)
|
374
|
-
@
|
337
|
+
@store_db.sismember @name, @marshal.dump(v)
|
375
338
|
end
|
376
339
|
alias_method :has_key?, :include?
|
377
340
|
alias_method :member?, :include?
|
378
341
|
|
379
342
|
def members
|
380
|
-
members = @
|
343
|
+
members = @store_db.smembers(@name)
|
381
344
|
if members
|
382
345
|
members.map { |v| @marshal.load(v) }
|
383
346
|
else
|
384
347
|
[]
|
385
348
|
end
|
386
349
|
end
|
387
|
-
|
388
|
-
def intersect(*keys)
|
389
|
-
@redis.sinter(@name, *keys).map { |v| @marshal.load(v) }
|
390
|
-
end
|
391
|
-
|
392
|
-
def union(*keys)
|
393
|
-
@redis.sunion(@name, *keys).map { |v| @marshal.load(v) }
|
394
|
-
end
|
395
|
-
|
396
|
-
def diff(*keys)
|
397
|
-
@redis.sdiff(@name, *keys).map { |v| @marshal.load(v) }
|
398
|
-
end
|
399
|
-
|
400
|
-
# def length
|
401
|
-
# @redis.llen(@name)
|
402
|
-
# end
|
403
|
-
#
|
404
|
-
# def to_s
|
405
|
-
# members.join(', ')
|
406
|
-
# end
|
407
|
-
#
|
408
|
-
# protected
|
409
|
-
# def translate_method_name(m)
|
410
|
-
# COMMANDS[m]
|
411
|
-
# end
|
412
350
|
end
|
413
351
|
end
|
414
352
|
end
|
data/lib/rhoconnect/tasks.rb
CHANGED
@@ -141,6 +141,7 @@ namespace :rhoconnect do
|
|
141
141
|
desc "Run source adapter specs"
|
142
142
|
task :spec do
|
143
143
|
files = File.join('spec','**','*_spec.rb')
|
144
|
+
puts "files loaded are ****** #{files}"
|
144
145
|
RSpec::Core::RakeTask.new('rhoconnect:spec') do |t|
|
145
146
|
t.pattern = FileList[files]
|
146
147
|
t.rspec_opts = %w(-fn -b --color)
|
@@ -158,7 +159,7 @@ namespace :rhoconnect do
|
|
158
159
|
system("#{cmd} config.ru -P #{rhoconnect_pid}")
|
159
160
|
elsif jruby?
|
160
161
|
puts 'Starting rhoconnect in jruby environment...'
|
161
|
-
system("#{cmd}")
|
162
|
+
system("#{cmd} -r config.ru")
|
162
163
|
else
|
163
164
|
puts 'Detach with Ctrl+\ Re-attach with rake rhoconnect:attach'
|
164
165
|
sleep 2
|
@@ -177,7 +178,7 @@ namespace :rhoconnect do
|
|
177
178
|
system("#{cmd} config.ru -P #{rhoconnect_pid}")
|
178
179
|
elsif jruby?
|
179
180
|
puts 'Starting rhoconnect in jruby environment...'
|
180
|
-
system("#{cmd}")
|
181
|
+
system("#{cmd} -r config.ru")
|
181
182
|
else
|
182
183
|
system("bundle exec #{cmd} config.ru -P #{rhoconnect_pid}")
|
183
184
|
end
|
@@ -199,7 +200,7 @@ namespace :rhoconnect do
|
|
199
200
|
system("#{cmd} config.ru -P #{rhoconnect_pid}")
|
200
201
|
elsif jruby?
|
201
202
|
puts 'Starting rhoconnect in jruby environment...'
|
202
|
-
system("#{cmd}")
|
203
|
+
system("#{cmd} -r config.ru")
|
203
204
|
else
|
204
205
|
system("bundle exec #{cmd} config.ru -P #{rhoconnect_pid}")
|
205
206
|
end
|
@@ -228,7 +229,20 @@ namespace :rhoconnect do
|
|
228
229
|
if windows?
|
229
230
|
File.delete "#{rhoconnect_pid}" if system("FOR /F %A in (#{rhoconnect_pid}) do taskkill /F /PID %A")
|
230
231
|
else
|
231
|
-
|
232
|
+
if File.exist?("#{rhoconnect_pid}")
|
233
|
+
pid = `cat #{rhoconnect_pid}`
|
234
|
+
puts "Sending a QUIT signal to process #{pid}"
|
235
|
+
system "kill -3 #{pid}"
|
236
|
+
count = 0
|
237
|
+
loop do
|
238
|
+
sleep 1
|
239
|
+
count += 1
|
240
|
+
exit if !File.exist?("#{rhoconnect_pid}")
|
241
|
+
break if count >= 5
|
242
|
+
end
|
243
|
+
puts "Process #{pid} is still running. Sending a KILL signal to it ..."
|
244
|
+
system "kill -9 #{pid}"
|
245
|
+
end
|
232
246
|
end
|
233
247
|
end
|
234
248
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Rhoconnect
|
2
|
-
|
3
|
-
|
2
|
+
module Model
|
3
|
+
class Base
|
4
|
+
attr_accessor :result
|
5
|
+
end
|
4
6
|
end
|
5
7
|
|
6
8
|
module TestMethods
|
@@ -10,7 +12,7 @@ module Rhoconnect
|
|
10
12
|
app_id = 'application'
|
11
13
|
s_fields = {
|
12
14
|
:user_id => user_id,
|
13
|
-
:app_id => app_id
|
15
|
+
:app_id => app_id,
|
14
16
|
}
|
15
17
|
c_fields = {
|
16
18
|
:device_type => 'Apple',
|
@@ -22,7 +24,14 @@ module Rhoconnect
|
|
22
24
|
@u = User.create(:login => user_id)
|
23
25
|
@s = Source.load(adapter.to_s,s_fields)
|
24
26
|
@c = Client.create(c_fields,{:source_name => adapter.to_s})
|
25
|
-
|
27
|
+
|
28
|
+
@model = Rhoconnect::Model::Base.create(@s)
|
29
|
+
handler_sync = lambda { @model.query(params[:query])}
|
30
|
+
@query_engine = Rhoconnect::Handler::Query::Engine.new(@model, handler_sync, {})
|
31
|
+
handler_cud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
|
32
|
+
@cud_engine = Rhoconnect::Handler::Changes::Engine.new(['create', 'update', 'delete'], @model, handler_cud, {})
|
33
|
+
handler_search = lambda { @model.search(params[:search]) }
|
34
|
+
@search_engine = Rhoconnect::Handler::Search::Engine.new(@model, @c, handler_search, {})
|
26
35
|
end
|
27
36
|
|
28
37
|
# Executes the adapter's query method and returns
|
@@ -41,7 +50,7 @@ module Rhoconnect
|
|
41
50
|
# "2"=>{"name"=>"Best", "industry"=>"Software"}
|
42
51
|
# }
|
43
52
|
def test_query
|
44
|
-
res = @
|
53
|
+
res = @query_engine.do_sync
|
45
54
|
return @s.is_pass_through? ? res : md
|
46
55
|
end
|
47
56
|
|
@@ -60,7 +69,8 @@ module Rhoconnect
|
|
60
69
|
def test_search(search_params)
|
61
70
|
pass_through = @s.pass_through
|
62
71
|
@s.pass_through = 'true'
|
63
|
-
|
72
|
+
@search_engine.params[:search] = search_params
|
73
|
+
res = @search_engine.do_search
|
64
74
|
@s.pass_through = pass_through
|
65
75
|
res
|
66
76
|
end
|
@@ -93,7 +103,7 @@ module Rhoconnect
|
|
93
103
|
# {'index' => view}.to_json
|
94
104
|
# }
|
95
105
|
def test_metadata
|
96
|
-
@
|
106
|
+
@query_engine.do_sync
|
97
107
|
return @s.get_value(:metadata)
|
98
108
|
end
|
99
109
|
|
@@ -119,7 +129,7 @@ module Rhoconnect
|
|
119
129
|
# }.to_json
|
120
130
|
# test_schema would return the above
|
121
131
|
def test_schema
|
122
|
-
@
|
132
|
+
@query_engine.do_sync
|
123
133
|
return @s.get_value(:schema)
|
124
134
|
end
|
125
135
|
|
@@ -150,10 +160,11 @@ module Rhoconnect
|
|
150
160
|
# document (:md) should also contain the new record.
|
151
161
|
def test_create(record)
|
152
162
|
if @s.is_pass_through?
|
153
|
-
@
|
163
|
+
@cud_engine.params = {'create'=> {'temp-id' => record}}
|
164
|
+
@cud_engine.do_pass_through_cud
|
154
165
|
else
|
155
|
-
@s.
|
156
|
-
@
|
166
|
+
@s.push_queue(:create,@c.id,{'temp-id' => record},true)
|
167
|
+
@cud_engine.do_cud
|
157
168
|
links = @c.get_data(:create_links)['temp-id']
|
158
169
|
links ? links['l'] : nil
|
159
170
|
end
|
@@ -179,10 +190,11 @@ module Rhoconnect
|
|
179
190
|
# as shown above
|
180
191
|
def test_update(record)
|
181
192
|
if @s.is_pass_through?
|
182
|
-
@
|
193
|
+
@cud_engine.params = {'update'=> record }
|
194
|
+
@cud_engine.do_pass_through_cud
|
183
195
|
else
|
184
|
-
@s.
|
185
|
-
@
|
196
|
+
@s.push_queue(:update,@c.id,record,true)
|
197
|
+
@cud_engine.do_cud
|
186
198
|
end
|
187
199
|
end
|
188
200
|
|
@@ -212,10 +224,11 @@ module Rhoconnect
|
|
212
224
|
# verified as shown above.
|
213
225
|
def test_delete(record)
|
214
226
|
if @s.is_pass_through?
|
215
|
-
@
|
227
|
+
@cud_engine.params = {'delete'=> record }
|
228
|
+
@cud_engine.do_pass_through_cud
|
216
229
|
else
|
217
|
-
@s.
|
218
|
-
@
|
230
|
+
@s.push_queue(:delete,@c.id,record,true)
|
231
|
+
@cud_engine.do_cud
|
219
232
|
end
|
220
233
|
end
|
221
234
|
|
data/lib/rhoconnect/user.rb
CHANGED
@@ -3,7 +3,7 @@ require 'digest/sha1'
|
|
3
3
|
module Rhoconnect
|
4
4
|
# Inspired by sinatra-authentication
|
5
5
|
# Password uses simple sha1 digest for hashing
|
6
|
-
class User <
|
6
|
+
class User < StoreOrm
|
7
7
|
field :login,:string
|
8
8
|
field :email,:string
|
9
9
|
field :salt,:string
|
@@ -11,13 +11,14 @@ module Rhoconnect
|
|
11
11
|
set :clients, :string
|
12
12
|
field :admin, :int
|
13
13
|
field :token_id, :string
|
14
|
-
|
14
|
+
#set_all :users, :string
|
15
|
+
|
15
16
|
class << self
|
16
17
|
def create(fields={})
|
17
18
|
raise ArgumentError.new("Empty login") if (fields[:login].nil? or fields[:login].empty?)
|
18
19
|
raise ArgumentError.new("Reserved user id #{fields[:login]}") if fields[:login] && fields[:login] == '__shared__'
|
19
20
|
fields[:id] = fields[:login]
|
20
|
-
user = super(fields)
|
21
|
+
user = super(fields)
|
21
22
|
if Rhoconnect.stats
|
22
23
|
Rhoconnect::Stats::Record.set('users') { Store.incr('user:count') }
|
23
24
|
else
|
@@ -25,14 +26,19 @@ module Rhoconnect
|
|
25
26
|
end
|
26
27
|
user
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
def authenticate(login,password)
|
30
31
|
return unless is_exist?(login)
|
31
32
|
current_user = load(login)
|
32
33
|
return if current_user.nil?
|
33
34
|
return current_user if User.encrypt(password, current_user.salt) == current_user.hashed_password
|
34
35
|
end
|
35
|
-
|
36
|
+
|
37
|
+
# Rails like methods
|
38
|
+
def all
|
39
|
+
App.load(APP_NAME).users.members
|
40
|
+
end
|
41
|
+
|
36
42
|
def ping(params)
|
37
43
|
if params['async']
|
38
44
|
PingJob.enqueue(params)
|
@@ -41,17 +47,17 @@ module Rhoconnect
|
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
44
|
-
|
50
|
+
|
45
51
|
def new_password=(pass)
|
46
52
|
self.password=(pass)
|
47
53
|
end
|
48
|
-
|
54
|
+
|
49
55
|
def password=(pass)
|
50
56
|
@password = pass
|
51
57
|
self.salt = User.random_string(10) if !self.salt
|
52
58
|
self.hashed_password = User.encrypt(@password, self.salt)
|
53
59
|
end
|
54
|
-
|
60
|
+
|
55
61
|
def delete
|
56
62
|
clients.members.each do |client_id|
|
57
63
|
Client.load(client_id,{:source_name => '*'}).delete
|
@@ -64,31 +70,43 @@ module Rhoconnect
|
|
64
70
|
end
|
65
71
|
super
|
66
72
|
end
|
67
|
-
|
73
|
+
|
68
74
|
def create_token
|
69
75
|
if self.token_id && ApiToken.is_exist?(self.token_id)
|
70
|
-
self.token.delete
|
76
|
+
self.token.delete
|
71
77
|
end
|
72
|
-
|
78
|
+
fields = {:user_id => self.login}
|
79
|
+
if self.login == 'rhoadmin'
|
80
|
+
fields[:value] = Rhoconnect.api_token
|
81
|
+
end
|
82
|
+
self.token_id = ApiToken.create(fields).id
|
73
83
|
end
|
74
|
-
|
84
|
+
|
75
85
|
def token
|
76
86
|
ApiToken.load(self.token_id)
|
77
87
|
end
|
78
|
-
|
88
|
+
|
79
89
|
def token=(value)
|
80
90
|
if self.token_id && ApiToken.is_exist?(self.token_id)
|
81
|
-
self.token.delete
|
91
|
+
self.token.delete
|
82
92
|
end
|
83
93
|
self.token_id = ApiToken.create(:user_id => self.login, :value => value).id
|
84
94
|
end
|
85
|
-
|
95
|
+
|
86
96
|
def update(fields)
|
87
97
|
fields.each do |key,value|
|
88
98
|
self.send("#{key.to_sym}=", value) unless key == 'login'
|
89
|
-
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def to_hash
|
103
|
+
res = {}
|
104
|
+
self.class.fields.each do |field|
|
105
|
+
res[field[:name].to_sym] = send(field[:name].to_sym) if field[:name] == 'login'
|
106
|
+
end
|
107
|
+
res
|
90
108
|
end
|
91
|
-
|
109
|
+
|
92
110
|
protected
|
93
111
|
def self.encrypt(pass, salt)
|
94
112
|
Digest::SHA1.hexdigest(pass+salt)
|
data/lib/rhoconnect/utilities.rb
CHANGED
data/lib/rhoconnect/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Rhoconnect
|
2
|
-
VERSION = '
|
3
|
-
end
|
2
|
+
VERSION = '4.0.0.beta.10'
|
3
|
+
end
|