rhoconnect 3.4.5 → 4.0.0.beta.10
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/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
data/lib/rhoconnect/server.rb
CHANGED
|
@@ -5,59 +5,79 @@ require 'json'
|
|
|
5
5
|
require 'fileutils'
|
|
6
6
|
require 'rhoconnect'
|
|
7
7
|
|
|
8
|
-
# all middlewares
|
|
8
|
+
# all middlewares, conditions, handlers - everything, that makes our product so cool!
|
|
9
|
+
Dir[File.join(File.dirname(__FILE__),'handler', '*.rb')].each { |mw| require mw }
|
|
9
10
|
Dir[File.join(File.dirname(__FILE__),'middleware','**','*.rb')].each { |mw| require mw }
|
|
11
|
+
Dir[File.join(File.dirname(__FILE__),'condition','**','*.rb')].each { |mw| require mw }
|
|
10
12
|
|
|
11
13
|
module Rhoconnect
|
|
12
|
-
|
|
14
|
+
|
|
13
15
|
class ApiException < Exception
|
|
14
16
|
attr_accessor :error_code
|
|
15
17
|
def initialize(error_code,message)
|
|
16
18
|
super(message)
|
|
17
19
|
@error_code = error_code
|
|
18
|
-
end
|
|
20
|
+
end
|
|
19
21
|
end
|
|
20
|
-
|
|
22
|
+
|
|
21
23
|
class Server < Sinatra::Base
|
|
22
24
|
set :static, true
|
|
23
25
|
set :stats, false
|
|
24
26
|
# default secret
|
|
25
27
|
@secret = '<changeme>'
|
|
26
|
-
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
def set_default(setting, value)
|
|
31
|
+
@default_settings ||= {}
|
|
32
|
+
@default_settings[setting] = value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# these methods will be called by the subclasses
|
|
36
|
+
# to prevent double inclusion
|
|
37
|
+
# of the base middleware
|
|
38
|
+
# def reset_rc_base!
|
|
39
|
+
# #@middleware_configured = true
|
|
40
|
+
# end
|
|
41
|
+
|
|
42
|
+
# def self.inherited(subclass)
|
|
43
|
+
# subclass.reset_rc_base!
|
|
44
|
+
# end
|
|
45
|
+
end
|
|
46
|
+
|
|
27
47
|
# Setup route and mimetype for bulk data downloads
|
|
28
48
|
# TODO: Figure out why "mime :data, 'application/octet-stream'" doesn't work
|
|
29
|
-
Rack::Mime::MIME_TYPES['.data'] = 'application/octet-stream'
|
|
30
|
-
|
|
49
|
+
Rack::Mime::MIME_TYPES['.data'] = 'application/octet-stream'
|
|
50
|
+
|
|
31
51
|
include Rhoconnect
|
|
52
|
+
# common conditions
|
|
53
|
+
extend Rhoconnect::Condition::AdminRequired
|
|
54
|
+
extend Rhoconnect::Condition::LoginRequired
|
|
55
|
+
extend Rhoconnect::Condition::SourceRequired
|
|
56
|
+
extend Rhoconnect::Condition::ClientRequired
|
|
57
|
+
extend Rhoconnect::Condition::Verbs
|
|
58
|
+
extend Rhoconnect::Condition::VerifySuccess
|
|
59
|
+
|
|
60
|
+
# RC Handlers
|
|
61
|
+
include Rhoconnect::Handler::Query::ExecuteMethods
|
|
62
|
+
include Rhoconnect::Handler::Changes::ExecuteMethods
|
|
63
|
+
include Rhoconnect::Handler::Search::ExecuteMethods
|
|
64
|
+
include Rhoconnect::Handler::PluginCallbacks::ExecuteMethods
|
|
65
|
+
include Rhoconnect::Handler::Authenticate::ExecuteMethods
|
|
32
66
|
|
|
33
67
|
# Set rhoconnect middleware
|
|
34
68
|
set :use_middleware, Proc.new {
|
|
35
69
|
return false if @middleware_configured # Middleware might be configured only once!
|
|
36
70
|
|
|
37
71
|
use Rhoconnect::Middleware::XDomainSessionWrapper
|
|
38
|
-
use Rack::Cors do |cfg|
|
|
39
|
-
cfg.allow do |allow|
|
|
40
|
-
allow.origins(/.*/)
|
|
41
|
-
allow.resource '/application', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
42
|
-
allow.resource '/application/*', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
43
|
-
allow.resource '/api/application', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
44
|
-
allow.resource '/api/application/*', :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
45
|
-
allow.resource "/app/#{Rhoconnect::API_VERSION}/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
46
|
-
allow.resource "/rc/#{Rhoconnect::API_VERSION}/app/*", :headers => :any, :methods => [:get, :post, :put, :delete], :credentials => true
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
72
|
use Rhoconnect::Middleware::BodyContentTypeParser
|
|
50
73
|
use Rhoconnect::Middleware::Stats
|
|
51
74
|
Rhoconnect::Server.set :secret, @secret unless settings.respond_to?(:secret)
|
|
52
75
|
use Rack::Session::Cookie,
|
|
53
76
|
:key => 'rhoconnect_session', :expire_after => Rhoconnect.cookie_expire,
|
|
54
77
|
:secret => Rhoconnect::Server.secret
|
|
55
|
-
use Rhoconnect::Middleware::CurrentRequest
|
|
56
78
|
use Rhoconnect::Middleware::CurrentApp
|
|
57
79
|
use Rhoconnect::Middleware::CurrentUser
|
|
58
|
-
|
|
59
|
-
use Rhoconnect::Middleware::LoginRequired
|
|
60
|
-
|
|
80
|
+
|
|
61
81
|
@middleware_configured ||= true
|
|
62
82
|
}
|
|
63
83
|
|
|
@@ -66,64 +86,6 @@ module Rhoconnect
|
|
|
66
86
|
request.env['PATH_INFO'].split('/').last
|
|
67
87
|
end
|
|
68
88
|
|
|
69
|
-
def check_login
|
|
70
|
-
begin
|
|
71
|
-
yield
|
|
72
|
-
rescue LoginException => le
|
|
73
|
-
throw :halt, [401, le.message]
|
|
74
|
-
rescue Exception => e
|
|
75
|
-
throw :halt, [500, e.message]
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def do_login
|
|
80
|
-
check_login do
|
|
81
|
-
if login
|
|
82
|
-
status(200)
|
|
83
|
-
else
|
|
84
|
-
raise LoginException.new("Unable to authenticate '#{params[:login]}'")
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def do_ans_login
|
|
90
|
-
check_login do
|
|
91
|
-
ans_login ? status(204) : status(401)
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def login
|
|
96
|
-
if params[:login].nil? or params[:login].empty?
|
|
97
|
-
return false
|
|
98
|
-
end
|
|
99
|
-
if params[:login] == 'rhoadmin'
|
|
100
|
-
user = User.authenticate(params[:login], params[:password])
|
|
101
|
-
elsif current_app and current_app.can_authenticate? and params[:login]
|
|
102
|
-
user = current_app.authenticate(params[:login], params[:password], session)
|
|
103
|
-
end
|
|
104
|
-
if user
|
|
105
|
-
session[:login] = user.login
|
|
106
|
-
session[:app_name] = APP_NAME
|
|
107
|
-
else
|
|
108
|
-
false
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def ans_login
|
|
113
|
-
if current_app and current_app.can_ans_authenticate?
|
|
114
|
-
auth = Rack::Auth::Basic::Request.new(request.env)
|
|
115
|
-
current_app.ans_authenticate(
|
|
116
|
-
auth.credentials.first, auth.credentials.last
|
|
117
|
-
) if auth.provided? and auth.basic? and auth.credentials
|
|
118
|
-
else
|
|
119
|
-
false
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def logout
|
|
124
|
-
session[:login] = nil
|
|
125
|
-
end
|
|
126
|
-
|
|
127
89
|
def current_user
|
|
128
90
|
@env[Rhoconnect::CURRENT_USER]
|
|
129
91
|
end
|
|
@@ -132,43 +94,16 @@ module Rhoconnect
|
|
|
132
94
|
@env[Rhoconnect::CURRENT_APP]
|
|
133
95
|
end
|
|
134
96
|
|
|
135
|
-
def
|
|
136
|
-
|
|
137
|
-
client_id = @env[Rhoconnect::CLIENT_ID_HEADER]
|
|
138
|
-
client_id = params[:client_id] unless client_id
|
|
139
|
-
if client_id
|
|
140
|
-
@client = Client.load(client_id.to_s,
|
|
141
|
-
params[:source_name] ? {:source_name => current_source.name} : {:source_name => '*'})
|
|
142
|
-
if @client and current_user and @client.user_id != current_user.login
|
|
143
|
-
@client.switch_user(current_user.login)
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
@client
|
|
97
|
+
def request_action
|
|
98
|
+
Rhoconnect.resource_action(request.env)
|
|
148
99
|
end
|
|
149
100
|
|
|
150
|
-
def
|
|
151
|
-
|
|
152
|
-
user = current_user
|
|
153
|
-
if params[:source_name] and user
|
|
154
|
-
@source = Source.load(params[:source_name],
|
|
155
|
-
{:user_id => user.login,:app_id => APP_NAME})
|
|
156
|
-
|
|
157
|
-
# if source does not exist create one for dynamic adapter
|
|
158
|
-
unless @source
|
|
159
|
-
sconfig = Rhoconnect.source_config(params[:source_name])
|
|
160
|
-
@source = Source.create(sconfig.merge!({:name => params[:source_name]}),{:user_id => user.login, :app_id => APP_NAME})
|
|
161
|
-
current_app.sources << @source.name
|
|
162
|
-
end
|
|
163
|
-
@source
|
|
164
|
-
else
|
|
165
|
-
log "ERROR: Can't load source, no source_name provided.\n"
|
|
166
|
-
nil
|
|
167
|
-
end
|
|
101
|
+
def current_client
|
|
102
|
+
@env[Rhoconnect::CURRENT_CLIENT]
|
|
168
103
|
end
|
|
169
104
|
|
|
170
|
-
def
|
|
171
|
-
|
|
105
|
+
def current_source
|
|
106
|
+
@env[Rhoconnect::CURRENT_SOURCE]
|
|
172
107
|
end
|
|
173
108
|
|
|
174
109
|
def catch_all
|
|
@@ -181,31 +116,28 @@ module Rhoconnect
|
|
|
181
116
|
throw :halt, [500, e.message]
|
|
182
117
|
end
|
|
183
118
|
end
|
|
184
|
-
|
|
185
|
-
def
|
|
186
|
-
|
|
187
|
-
http_method = request.get? ? "GET" : "POST"
|
|
188
|
-
warning_message = "Use of the #{http_method} #{request.path} is deprecated. Use #{http_method} /api/#{namespace_val}/#{name} instead."
|
|
119
|
+
|
|
120
|
+
def mark_deprecated_call_and_reroute_api4(verb, new_route, old_verb, old_route, route_handler, filter_handler=nil, klass = nil)
|
|
121
|
+
warning_message = "Use of the #{old_verb.to_s.upcase} #{old_route} is deprecated. Use Rhoconnect API #{Rhoconnect::API_VERSION} instead."
|
|
189
122
|
response.headers['Warning'] = warning_message
|
|
190
123
|
Rhoconnect.log warning_message
|
|
191
|
-
if
|
|
192
|
-
|
|
124
|
+
if klass
|
|
125
|
+
klass_instance = klass.new
|
|
126
|
+
klass_instance.helpers.call! env.merge('PATH_INFO' => new_route, 'REQUEST_METHOD' => verb.to_s.upcase)
|
|
193
127
|
else
|
|
194
|
-
|
|
128
|
+
execute_api_call(route_handler, filter_handler)
|
|
195
129
|
end
|
|
196
130
|
end
|
|
197
|
-
|
|
198
|
-
def
|
|
199
|
-
warning_message = "Use of the #{old_verb.to_s.upcase} #{old_route} is deprecated. Use Rhoconnect API #{Rhoconnect::API_VERSION} instead."
|
|
200
|
-
response.headers['Warning'] = warning_message
|
|
201
|
-
Rhoconnect.log warning_message
|
|
202
|
-
|
|
203
|
-
execute_api_call(client_call, &block)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def execute_api_call(client_call = false)
|
|
131
|
+
|
|
132
|
+
def execute_api_call(route_handler, filter_handler = nil)
|
|
207
133
|
catch_all do
|
|
208
|
-
|
|
134
|
+
proc = route_handler.bind(self)
|
|
135
|
+
res = nil
|
|
136
|
+
if filter_handler
|
|
137
|
+
res = send filter_handler, proc
|
|
138
|
+
else
|
|
139
|
+
res = proc.call
|
|
140
|
+
end
|
|
209
141
|
if params.has_key? :warning
|
|
210
142
|
Rhoconnect.log params[:warning]
|
|
211
143
|
response.headers['Warning'] = params[:warning]
|
|
@@ -214,23 +146,22 @@ module Rhoconnect
|
|
|
214
146
|
end
|
|
215
147
|
end
|
|
216
148
|
end
|
|
217
|
-
|
|
218
|
-
private
|
|
149
|
+
|
|
150
|
+
private
|
|
219
151
|
def self._use_async_framework
|
|
220
152
|
return false if settings.respond_to?(:use_async_model) and settings.use_async_model == false
|
|
221
153
|
return false if @dispatch_framework_initialized
|
|
222
|
-
|
|
154
|
+
|
|
223
155
|
@dispatch_framework_initialized ||=true
|
|
224
156
|
if RUBY_VERSION =~ /1.9/ and not defined?(JRUBY_VERSION)
|
|
225
|
-
begin
|
|
226
|
-
require 'rhoconnect/async'
|
|
157
|
+
begin
|
|
158
|
+
require 'rhoconnect/async'
|
|
227
159
|
register Rhoconnect::Synchrony
|
|
228
|
-
helpers Rhoconnect::AsyncHelpers
|
|
229
160
|
rescue LoadError => e
|
|
230
161
|
# if it fails here - Async can not be used
|
|
231
162
|
settings.use_async_model = false
|
|
232
163
|
warning_for_async_gems = <<_INSTALL_ASYNC_GEMS
|
|
233
|
-
|
|
164
|
+
|
|
234
165
|
***** WARNING *****
|
|
235
166
|
Rhoconnect has detected that Ruby 1.9.x is used and tried to initialize Async Framework, but failed:
|
|
236
167
|
|
|
@@ -253,33 +184,35 @@ _INSTALL_ASYNC_GEMS
|
|
|
253
184
|
set :use_async_model, false
|
|
254
185
|
end
|
|
255
186
|
end
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
187
|
+
|
|
188
|
+
class << self
|
|
189
|
+
def new
|
|
190
|
+
# by default, enable this feature
|
|
191
|
+
if not settings.respond_to?(:use_async_model) or settings.use_async_model != false
|
|
192
|
+
set :use_async_model, true
|
|
193
|
+
end
|
|
194
|
+
# this must be called first - because
|
|
195
|
+
# it redefines some of the middleware
|
|
196
|
+
_use_async_framework
|
|
197
|
+
|
|
198
|
+
if settings.respond_to?(:stats) and settings.send(:stats) == true
|
|
199
|
+
Rhoconnect.stats = true
|
|
200
|
+
else
|
|
201
|
+
Rhoconnect::Server.disable :stats
|
|
202
|
+
Rhoconnect.stats = false
|
|
203
|
+
end
|
|
204
|
+
Rhoconnect::Server.settings.use_middleware
|
|
205
|
+
#puts "Controller #{self.name} has been initialized with #{middleware.inspect}"
|
|
206
|
+
super
|
|
271
207
|
end
|
|
272
|
-
settings.use_middleware
|
|
273
|
-
|
|
274
|
-
super
|
|
275
208
|
end
|
|
276
|
-
|
|
209
|
+
|
|
277
210
|
def initialize
|
|
278
211
|
# Whine about default session secret
|
|
279
212
|
check_default_secret!(Rhoconnect::Server.secret)
|
|
280
213
|
super
|
|
281
214
|
end
|
|
282
|
-
|
|
215
|
+
|
|
283
216
|
Rhoconnect.log "Rhoconnect Server v#{Rhoconnect::VERSION} started..."
|
|
284
217
|
|
|
285
218
|
before do
|
|
@@ -287,46 +220,82 @@ _INSTALL_ASYNC_GEMS
|
|
|
287
220
|
headers({'pragma'=>'no-cache'})
|
|
288
221
|
end
|
|
289
222
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
#
|
|
296
|
-
#
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
_DEPRECATE_SERVER_API
|
|
302
|
-
puts warning_for_server_api
|
|
303
|
-
|
|
304
|
-
old_api_prefix = (namespace == :application) ? :application : :api
|
|
305
|
-
client_call = (namespace == :application) ? true : false
|
|
306
|
-
send verb, "/#{old_api_prefix}/#{name}" do
|
|
307
|
-
mark_deprecated_call_and_reroute(name, namespace, params, &block)
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
send verb, "/api/#{namespace}/#{name}" do
|
|
311
|
-
execute_api_call(client_call, &block)
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
def self.api4(method_name, verb, route, admin = true, deprecated_route = nil, &block)
|
|
223
|
+
def self.api4(resource, route_url, verb = :post, options = {}, &block)
|
|
224
|
+
deprecated_route = options[:deprecated_route]
|
|
225
|
+
options.delete(:deprecated_route)
|
|
226
|
+
|
|
227
|
+
# TODO: Re-work deprecation handling as soon as client is updated
|
|
228
|
+
# the only reason we do criss-cross routing is because old-style routes
|
|
229
|
+
# had one root and new-style routes now reside in separate controllers
|
|
230
|
+
rc_handler = options[:rc_handler]
|
|
231
|
+
options.delete(:rc_handler)
|
|
232
|
+
rc_handler_method = nil
|
|
233
|
+
rc_handler_method = "execute_#{rc_handler}_handler".to_sym if rc_handler
|
|
316
234
|
unless deprecated_route.nil?
|
|
317
235
|
deprecated_urls = deprecated_route[:url].is_a?(String) ? [deprecated_route[:url]] : deprecated_route[:url]
|
|
318
236
|
deprecated_urls.each do |deprecated_url|
|
|
319
|
-
|
|
320
|
-
|
|
237
|
+
d_verb = deprecated_route[:verb].to_sym
|
|
238
|
+
dep_route_handler = Rhoconnect::DefaultServer.send(:generate_method, :dep_route_handler, &block)
|
|
239
|
+
|
|
240
|
+
# build deprecation hash to be used later at run time for re-directing
|
|
241
|
+
dep_info = {}
|
|
242
|
+
dep_info[:klass] = self
|
|
243
|
+
dep_info[:route_handler] = dep_route_handler
|
|
244
|
+
dep_info[:rc_handler_method] = rc_handler_method
|
|
245
|
+
dep_info[:verb] = verb
|
|
246
|
+
dep_info[:route_url] = route_url
|
|
247
|
+
|
|
248
|
+
Rhoconnect::DefaultServer.registered_routes(d_verb)[deprecated_url] ||= {}
|
|
249
|
+
Rhoconnect::DefaultServer.registered_routes(d_verb)[deprecated_url][self.name] = dep_info
|
|
250
|
+
Rhoconnect::DefaultServer.send d_verb, deprecated_url, options do
|
|
251
|
+
klass = nil
|
|
252
|
+
req_verb = env['REQUEST_METHOD'].downcase.to_sym
|
|
253
|
+
req_path = env['PATH_INFO']
|
|
254
|
+
# retrieve controller-specific deprecation handler
|
|
255
|
+
if params[:source_name]
|
|
256
|
+
controller_name = "#{params[:source_name]}Controller"
|
|
257
|
+
dep_info = Rhoconnect::DefaultServer.registered_routes(req_verb)[req_path][controller_name]
|
|
258
|
+
if dep_info
|
|
259
|
+
klass = dep_info[:klass]
|
|
260
|
+
verb = dep_info[:verb]
|
|
261
|
+
route_url = dep_info[:route_url]
|
|
262
|
+
dep_route_handler = dep_info[:route_handler]
|
|
263
|
+
rc_handler_method = dep_info[:rc_handler_method]
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
mark_deprecated_call_and_reroute_api4(verb, route_url, req_verb, req_path, dep_route_handler, rc_handler_method, klass)
|
|
321
267
|
end
|
|
322
268
|
end
|
|
323
269
|
end
|
|
324
|
-
|
|
325
|
-
|
|
270
|
+
|
|
271
|
+
# turn block into UnboundMethod - so that we can bind it later with
|
|
272
|
+
# particular Controller instance
|
|
273
|
+
route_handler = send(:generate_method, :route_handler, &block)
|
|
274
|
+
route verb.to_s.upcase, route_url, options do
|
|
275
|
+
execute_api_call(route_handler, rc_handler_method)
|
|
326
276
|
end
|
|
327
277
|
end
|
|
328
278
|
end
|
|
279
|
+
|
|
280
|
+
# serves OBSOLETED routes and root
|
|
281
|
+
# TODO - OBSOLETED routes should be removed
|
|
282
|
+
class DefaultServer < Rhoconnect::Server
|
|
283
|
+
helpers Rhoconnect::Handler::Helpers::BulkData
|
|
284
|
+
|
|
285
|
+
# to prevent registering the same route several times
|
|
286
|
+
def self.registered_routes(verb)
|
|
287
|
+
@registered_routes ||= {}
|
|
288
|
+
@registered_routes[verb] ||= {}
|
|
289
|
+
@registered_routes[verb]
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
get '/' do
|
|
293
|
+
redirect "/console/"
|
|
294
|
+
end
|
|
295
|
+
end
|
|
329
296
|
end
|
|
330
297
|
|
|
331
298
|
include Rhoconnect
|
|
332
|
-
|
|
299
|
+
# load all controllers , starting with base
|
|
300
|
+
require 'rhoconnect/controller/base'
|
|
301
|
+
Dir[File.join(File.dirname(__FILE__),'controller','**','*.rb')].each { |api| require api }
|
data/lib/rhoconnect/source.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Rhoconnect
|
|
2
|
-
class
|
|
2
|
+
class MemoryOrm
|
|
3
3
|
@@model_data = {}
|
|
4
4
|
@@string_fields = []
|
|
5
5
|
@@integer_fields = []
|
|
@@ -85,9 +85,20 @@ module Rhoconnect
|
|
|
85
85
|
end
|
|
86
86
|
res
|
|
87
87
|
end
|
|
88
|
+
|
|
89
|
+
def to_hash
|
|
90
|
+
res = {}
|
|
91
|
+
@@string_fields.each do |field|
|
|
92
|
+
res[field] = send(field.to_sym)
|
|
93
|
+
end
|
|
94
|
+
@@integer_fields.each do |field|
|
|
95
|
+
res[field] = send(field.to_sym)
|
|
96
|
+
end
|
|
97
|
+
res
|
|
98
|
+
end
|
|
88
99
|
end
|
|
89
100
|
|
|
90
|
-
class Source <
|
|
101
|
+
class Source < MemoryOrm
|
|
91
102
|
attr_accessor :app_id, :user_id
|
|
92
103
|
|
|
93
104
|
validates_presence_of :name
|
|
@@ -99,6 +110,22 @@ module Rhoconnect
|
|
|
99
110
|
define_fields([:id, :rho__id, :name, :url, :login, :password, :callback_url, :partition_type, :sync_type,
|
|
100
111
|
:queue, :query_queue, :cud_queue, :belongs_to, :has_many, :pass_through, :push_notify], [:source_id, :priority, :retry_limit, :simulate_time])
|
|
101
112
|
|
|
113
|
+
define_valid_doctypes([:md,
|
|
114
|
+
:md_size,
|
|
115
|
+
:md_copy,
|
|
116
|
+
:errors,
|
|
117
|
+
:metadata,
|
|
118
|
+
:metadata_sha1,
|
|
119
|
+
:schema,
|
|
120
|
+
:schema_sha1,
|
|
121
|
+
:create,
|
|
122
|
+
:update,
|
|
123
|
+
:delete])
|
|
124
|
+
# we can not enforce valid doctypes at this point
|
|
125
|
+
# because QUERY creates temporary md docs
|
|
126
|
+
# TODO: re-work it to eliminate this obstacle
|
|
127
|
+
#enforce_valid_doctypes=false
|
|
128
|
+
|
|
102
129
|
def initialize(fields)
|
|
103
130
|
self.name = fields['name'] || fields[:name]
|
|
104
131
|
update_fields(fields)
|
|
@@ -121,6 +148,12 @@ module Rhoconnect
|
|
|
121
148
|
fields[:push_notify] = fields[:push_notify] ? fields[:push_notify] : 'false'
|
|
122
149
|
end
|
|
123
150
|
|
|
151
|
+
def store_index(doctype)
|
|
152
|
+
# app-partitioned sources go to 0
|
|
153
|
+
# everything else if sharded
|
|
154
|
+
compute_store_index(doctype, self, self.user_id)
|
|
155
|
+
end
|
|
156
|
+
|
|
124
157
|
def self.create(fields,params)
|
|
125
158
|
fields = fields.with_indifferent_access # so we can access hash keys as symbols
|
|
126
159
|
super(fields,params)
|
|
@@ -139,6 +172,7 @@ module Rhoconnect
|
|
|
139
172
|
Rhoconnect.create_predefined_source(obj_id,params)
|
|
140
173
|
|
|
141
174
|
model_hash = @@model_data[obj_id.to_sym]
|
|
175
|
+
|
|
142
176
|
obj = new(model_hash) if model_hash
|
|
143
177
|
if obj
|
|
144
178
|
obj = obj.dup
|
|
@@ -172,7 +206,11 @@ module Rhoconnect
|
|
|
172
206
|
|
|
173
207
|
def self.delete_all
|
|
174
208
|
params = {:app_id => APP_NAME,:user_id => '*'}
|
|
175
|
-
@@model_data.each
|
|
209
|
+
@@model_data.each do |k,v|
|
|
210
|
+
s = Source.load(k,params)
|
|
211
|
+
s.flush_store_data
|
|
212
|
+
Store.flush_data("source:#{s.name}:*")
|
|
213
|
+
end
|
|
176
214
|
@@model_data = {}
|
|
177
215
|
end
|
|
178
216
|
|
|
@@ -201,10 +239,6 @@ module Rhoconnect
|
|
|
201
239
|
self.class.set_defaults(fields)
|
|
202
240
|
end
|
|
203
241
|
|
|
204
|
-
def clone(src_doctype,dst_doctype)
|
|
205
|
-
Store.clone(docname(src_doctype),docname(dst_doctype))
|
|
206
|
-
end
|
|
207
|
-
|
|
208
242
|
def poll_interval
|
|
209
243
|
value = Store.get_value(poll_interval_key)
|
|
210
244
|
value ? value.to_i : nil
|
|
@@ -250,14 +284,69 @@ module Rhoconnect
|
|
|
250
284
|
"#{user_by_partition}:#{self.name}:#{doctype.to_s}"
|
|
251
285
|
end
|
|
252
286
|
|
|
253
|
-
def
|
|
287
|
+
def flush_store_data
|
|
254
288
|
delete_user_read_state
|
|
255
|
-
|
|
256
|
-
|
|
289
|
+
# queues should be processed separately first
|
|
290
|
+
[:create, :update, :delete].each do |doctype|
|
|
291
|
+
flush_queue(doctype)
|
|
292
|
+
end
|
|
293
|
+
# then, all other doctypes
|
|
294
|
+
self.class.valid_doctypes.each do |doctype|
|
|
295
|
+
flush_data(doctype)
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def queue_docname(dockey)
|
|
300
|
+
# currently, all queues are bound by user - not shared
|
|
301
|
+
docname(dockey)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# this data is not sharded
|
|
305
|
+
def lock_queue_doc(doctype)
|
|
306
|
+
Store.lock(queue_docname(doctype)) do
|
|
307
|
+
yield self
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
# this is an atomic operation
|
|
312
|
+
# - lock queue, get queue data, flush queue, unlock queue
|
|
313
|
+
def process_queue(doctype)
|
|
314
|
+
verify_doctype(doctype)
|
|
315
|
+
ret = []
|
|
316
|
+
keys = []
|
|
317
|
+
lock_queue_doc(doctype) do |s|
|
|
318
|
+
ret, keys = Store.get_store(0).get_zdata(s.queue_docname(doctype))
|
|
319
|
+
Store.get_store(0).flush_zdata(s.queue_docname(doctype))
|
|
320
|
+
end
|
|
321
|
+
[ret, keys]
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def get_queue(doctype)
|
|
325
|
+
verify_doctype(doctype)
|
|
326
|
+
ret = []
|
|
327
|
+
keys = []
|
|
328
|
+
lock_queue_doc(doctype) do |s|
|
|
329
|
+
ret, keys = Store.get_store(0).get_zdata(s.queue_docname(doctype))
|
|
330
|
+
end
|
|
331
|
+
[ret, keys]
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def flush_queue(doctype)
|
|
335
|
+
verify_doctype(doctype)
|
|
336
|
+
lock_queue_doc(doctype) do |s|
|
|
337
|
+
Store.get_store(0).flush_zdata(s.queue_docname(doctype))
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def push_queue(doctype,assoc_key, data={},append=false)
|
|
342
|
+
verify_doctype(doctype)
|
|
343
|
+
lock_queue_doc(doctype) do |s|
|
|
344
|
+
Store.get_store(0).put_zdata(s.queue_docname(doctype),assoc_key, data,append)
|
|
345
|
+
end
|
|
257
346
|
end
|
|
258
347
|
|
|
259
348
|
def delete
|
|
260
|
-
|
|
349
|
+
flush_store_data
|
|
261
350
|
@@model_data.delete(rho__id.to_sym) if rho__id
|
|
262
351
|
end
|
|
263
352
|
|
|
@@ -10,19 +10,19 @@ module Rhoconnect
|
|
|
10
10
|
start = (Time.now.to_i / resolution(metric)) * resolution(metric)
|
|
11
11
|
current, current_score = 0, start
|
|
12
12
|
Store.lock(key(metric)) do
|
|
13
|
-
range = Store.
|
|
13
|
+
range = Store.zrevrange(key(metric), 0, 0)
|
|
14
14
|
if !range.empty?
|
|
15
15
|
member = range[0]
|
|
16
16
|
m_current = member.split(':')[0]
|
|
17
|
-
m_current_score = Store.
|
|
17
|
+
m_current_score = Store.zscore(key(metric), member).to_i
|
|
18
18
|
if m_current_score > (start - resolution(metric))
|
|
19
|
-
Store.
|
|
19
|
+
Store.zrem(key(metric), member)
|
|
20
20
|
current, current_score = m_current, m_current_score
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
value = block_given? ? yield(current, value) : value
|
|
24
|
-
Store.
|
|
25
|
-
Store.
|
|
24
|
+
Store.zadd(key(metric), current_score, "#{value}:#{start}")
|
|
25
|
+
Store.zremrangebyscore(key(metric), 0, start - record_size(metric))
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
@@ -56,15 +56,15 @@ module Rhoconnect
|
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def keys(glob='*')
|
|
59
|
-
Store.
|
|
59
|
+
Store.keys(key(glob)).collect {|c| c[5..-1]}
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def reset(metric)
|
|
63
|
-
Store.
|
|
63
|
+
Store.flush_data(key(metric))
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def reset_all
|
|
67
|
-
Store.
|
|
67
|
+
Store.flush_data('stat:*')
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Returns simple string metric
|
|
@@ -79,7 +79,7 @@ module Rhoconnect
|
|
|
79
79
|
|
|
80
80
|
# Returns the metric data, uses array indexing
|
|
81
81
|
def range(metric, start, finish = -1)
|
|
82
|
-
Store.
|
|
82
|
+
Store.zrange(key(metric), start, finish)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
# Returns the resolution for a given metric, default 60 seconds
|
|
@@ -96,7 +96,7 @@ module Rhoconnect
|
|
|
96
96
|
|
|
97
97
|
# Returns redis object type for a record
|
|
98
98
|
def rtype(metric)
|
|
99
|
-
Store.
|
|
99
|
+
Store.doc_type(key(metric))
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
def key(metric)
|