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
@@ -0,0 +1,270 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
# implementation classes
|
3
|
+
module Handler
|
4
|
+
module Query
|
5
|
+
class Runner
|
6
|
+
attr_accessor :source,:client,:p_size,:engine,:params
|
7
|
+
|
8
|
+
def initialize(model,client,route_handler, params = {})
|
9
|
+
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
10
|
+
raise ArgumentError.new(UNKNOWN_SOURCE) unless (model and model.source)
|
11
|
+
raise ArgumentError.new('Invalid app for source') unless model.source.app
|
12
|
+
|
13
|
+
@source,@client,@p_size = model.source,client,params[:p_size] ? params[:p_size].to_i : 500
|
14
|
+
@client.last_sync = Time.now if @client
|
15
|
+
@params = params
|
16
|
+
@engine = Rhoconnect::Handler::Query::Engine.new(model, route_handler, @params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
res = []
|
21
|
+
token = params[:token]
|
22
|
+
if not ack_token(token)
|
23
|
+
res = resend_page(token)
|
24
|
+
else
|
25
|
+
query_result = @engine.do_sync
|
26
|
+
res = send_new_page
|
27
|
+
end
|
28
|
+
format_result(res[0],res[1],res[2],res[3])
|
29
|
+
end
|
30
|
+
|
31
|
+
# Resend token for a client, also sends exceptions
|
32
|
+
def resend_page(token=nil)
|
33
|
+
token,progress_count,total_count,res = '',0,0,{}
|
34
|
+
schema_page = @client.get_value(:schema_page)
|
35
|
+
if schema_page
|
36
|
+
res = {'schema-changed' => 'true'}
|
37
|
+
else
|
38
|
+
res = build_page do |r|
|
39
|
+
r['insert'] = @client.get_data(:page)
|
40
|
+
r['delete'] = @client.get_data(:delete_page)
|
41
|
+
r['links'] = @client.get_data(:create_links_page)
|
42
|
+
r['metadata'] = @client.get_value(:metadata_page)
|
43
|
+
progress_count = 0
|
44
|
+
total_count = @client.get_value(:total_count_page).to_i
|
45
|
+
end
|
46
|
+
end
|
47
|
+
token = @client.get_value(:page_token)
|
48
|
+
[token,progress_count,total_count,res]
|
49
|
+
end
|
50
|
+
|
51
|
+
def ack_token(token)
|
52
|
+
stored_token = @client.get_value(:page_token)
|
53
|
+
if stored_token
|
54
|
+
if token and stored_token == token
|
55
|
+
@client.put_value(:page_token,nil)
|
56
|
+
@client.flush_data(:schema_page)
|
57
|
+
@client.flush_data(:metadata_page)
|
58
|
+
@client.flush_data(:create_links_page)
|
59
|
+
@client.flush_data(:page)
|
60
|
+
@client.flush_data(:delete_page)
|
61
|
+
_delete_errors_page
|
62
|
+
return true
|
63
|
+
end
|
64
|
+
else
|
65
|
+
return true
|
66
|
+
end
|
67
|
+
false
|
68
|
+
end
|
69
|
+
|
70
|
+
def format_result(token,progress_count,total_count,res)
|
71
|
+
count = 0
|
72
|
+
count += res['insert'].length if res['insert']
|
73
|
+
count += res['delete'].length if res['delete']
|
74
|
+
[ {'version'=>Rhoconnect::SYNC_VERSION},
|
75
|
+
{'token'=>(token ? token : '')},
|
76
|
+
{'count'=>count},
|
77
|
+
{'progress_count'=>progress_count},
|
78
|
+
{'total_count'=>total_count},
|
79
|
+
res ]
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_page
|
83
|
+
res = {}
|
84
|
+
yield res
|
85
|
+
res.reject! {|key,value| value.nil? or value.empty?}
|
86
|
+
res.merge!(_send_errors)
|
87
|
+
res
|
88
|
+
end
|
89
|
+
|
90
|
+
def send_new_page
|
91
|
+
token,progress_count,total_count,res = '',0,0,{}
|
92
|
+
if schema_changed?
|
93
|
+
_expire_bulk_data
|
94
|
+
token = @client.compute_token(:page_token)
|
95
|
+
res = {'schema-changed' => 'true'}
|
96
|
+
else
|
97
|
+
compute_errors_page
|
98
|
+
res = build_page do |r|
|
99
|
+
total_count,r['insert'],r['delete'] = compute_page
|
100
|
+
r['links'] = compute_links_page
|
101
|
+
r['metadata'] = compute_metadata
|
102
|
+
end
|
103
|
+
if res['insert'] or res['delete'] or res['links']
|
104
|
+
token = @client.compute_token(:page_token)
|
105
|
+
else
|
106
|
+
_delete_errors_page
|
107
|
+
end
|
108
|
+
end
|
109
|
+
# TODO: progress count can not be computed properly
|
110
|
+
# without comparing what has actually changes
|
111
|
+
# so we need to obsolete it in the future versions
|
112
|
+
progress_count = 0
|
113
|
+
[token,progress_count,total_count,res]
|
114
|
+
end
|
115
|
+
|
116
|
+
def send_new_page_bruteforce
|
117
|
+
token,progress_count,total_count,res = '',0,0,{}
|
118
|
+
if schema_changed?
|
119
|
+
_expire_bulk_data
|
120
|
+
token = @client.compute_token(:page_token)
|
121
|
+
res = {'schema-changed' => 'true'}
|
122
|
+
else
|
123
|
+
compute_errors_page
|
124
|
+
res = build_page do |r|
|
125
|
+
total_count,r['insert'],r['delete'] = compute_page_bruteforce
|
126
|
+
r['links'] = compute_links_page
|
127
|
+
r['metadata'] = compute_metadata
|
128
|
+
end
|
129
|
+
if res['insert'] or res['delete'] or res['links']
|
130
|
+
token = @client.compute_token(:page_token)
|
131
|
+
else
|
132
|
+
_delete_errors_page
|
133
|
+
end
|
134
|
+
end
|
135
|
+
# TODO: progress count can not be computed properly
|
136
|
+
# without comparing what has actually changes
|
137
|
+
# so we need to obsolete it in the future versions
|
138
|
+
progress_count = 0
|
139
|
+
[token,progress_count,total_count,res]
|
140
|
+
end
|
141
|
+
|
142
|
+
# Checks if schema changed
|
143
|
+
def schema_changed?
|
144
|
+
if engine.model.respond_to?(:schema)
|
145
|
+
schema_sha1 = @source.get_value(:schema_sha1)
|
146
|
+
if @client.get_value(:schema_sha1).nil?
|
147
|
+
@client.put_value(:schema_sha1,schema_sha1)
|
148
|
+
return false
|
149
|
+
elsif @client.get_value(:schema_sha1) == schema_sha1
|
150
|
+
return false
|
151
|
+
end
|
152
|
+
@client.put_value(:schema_sha1,schema_sha1)
|
153
|
+
@client.put_value(:schema_page,schema_sha1)
|
154
|
+
return true
|
155
|
+
else
|
156
|
+
return false
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Computes the metadata sha1 and returns metadata if client's sha1 doesn't
|
161
|
+
# match source's sha1
|
162
|
+
def compute_metadata
|
163
|
+
metadata_sha1,metadata = @source.lock(:metadata) do |s|
|
164
|
+
[s.get_value(:metadata_sha1),s.get_value(:metadata)]
|
165
|
+
end
|
166
|
+
return if @client.get_value(:metadata_sha1) == metadata_sha1
|
167
|
+
@client.put_value(:metadata_sha1,metadata_sha1)
|
168
|
+
@client.put_value(:metadata_page,metadata)
|
169
|
+
metadata
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
# Computes diffs between master doc and client doc, trims it to page size,
|
174
|
+
# stores page, and returns page as hash
|
175
|
+
def compute_page
|
176
|
+
inserts_elements_map,deletes_elements_map,total_count = @source.lock(:md) do |s|
|
177
|
+
inserts_elements_map = @client.get_diff_data(:cd,s.docname(:md),@p_size)
|
178
|
+
total_count = s.get_value(:md_size).to_i
|
179
|
+
deletes_elements_map = s.get_diff_data(:md,@client.docname(:cd),@p_size)
|
180
|
+
[inserts_elements_map,deletes_elements_map,total_count]
|
181
|
+
end
|
182
|
+
# until sync is not done - set cd_size to 0
|
183
|
+
# once there are no changes, then, set cd_size to md_size
|
184
|
+
cd_size = inserts_elements_map.size > 0 ? 0 : total_count
|
185
|
+
@client.put_value(:cd_size, cd_size)
|
186
|
+
|
187
|
+
# now, find the exact changes
|
188
|
+
inserts,deletes = Store.get_inserts_deletes(inserts_elements_map,deletes_elements_map)
|
189
|
+
|
190
|
+
@client.put_data(:page,inserts)
|
191
|
+
@client.put_data(:delete_page,deletes,true)
|
192
|
+
@client.put_value(:total_count_page,total_count)
|
193
|
+
@client.update_elements(:cd,inserts_elements_map,deletes_elements_map)
|
194
|
+
|
195
|
+
[total_count,inserts,deletes]
|
196
|
+
end
|
197
|
+
|
198
|
+
# Computes diffs between master doc and client doc, trims it to page size,
|
199
|
+
# stores page, and returns page as hash
|
200
|
+
def compute_page_bruteforce
|
201
|
+
inserts_elements_map,deletes_elements_map,total_count = @source.lock(:md) do |s|
|
202
|
+
inserts_elements_map,deletes_elements_map = @client.get_diff_data_bruteforce(:cd,s.docname(:md),@p_size)
|
203
|
+
total_count = s.get_value(:md_size).to_i
|
204
|
+
[inserts_elements_map,deletes_elements_map,total_count]
|
205
|
+
end
|
206
|
+
# until sync is not done - set cd_size to 0
|
207
|
+
# once there are no changes, then, set cd_size to md_size
|
208
|
+
cd_size = inserts_elements_map.size > 0 ? 0 : total_count
|
209
|
+
@client.put_value(:cd_size, cd_size)
|
210
|
+
|
211
|
+
# now, find the exact changes
|
212
|
+
inserts,deletes = Store.get_inserts_deletes(inserts_elements_map,deletes_elements_map)
|
213
|
+
|
214
|
+
@client.put_data(:page,inserts)
|
215
|
+
@client.put_data(:delete_page,deletes,true)
|
216
|
+
@client.put_value(:total_count_page,total_count)
|
217
|
+
@client.update_elements(:cd,inserts_elements_map,deletes_elements_map)
|
218
|
+
|
219
|
+
[total_count,inserts,deletes]
|
220
|
+
end
|
221
|
+
|
222
|
+
# Computes errors for client and stores a copy as errors page
|
223
|
+
def compute_errors_page
|
224
|
+
['create','update','delete'].each do |operation|
|
225
|
+
@client.lock("#{operation}_errors") do |c|
|
226
|
+
c.rename("#{operation}_errors","#{operation}_errors_page")
|
227
|
+
end
|
228
|
+
end
|
229
|
+
@client.lock("update_rollback") do |c|
|
230
|
+
c.rename("update_rollback","update_rollback_page")
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Computes create links for a client and stores a copy as links page
|
235
|
+
def compute_links_page
|
236
|
+
@client.lock(:create_links) do |c|
|
237
|
+
c.rename(:create_links,:create_links_page)
|
238
|
+
c.get_data(:create_links_page)
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
private
|
243
|
+
def _delete_errors_page
|
244
|
+
['create','update','delete'].each do |operation|
|
245
|
+
@client.flush_data("#{operation}_errors_page")
|
246
|
+
end
|
247
|
+
@client.flush_data("update_rollback_page")
|
248
|
+
end
|
249
|
+
|
250
|
+
def _send_errors
|
251
|
+
res = {}
|
252
|
+
['create','update','delete'].each do |operation|
|
253
|
+
res["#{operation}-error"] = @client.get_data("#{operation}_errors_page")
|
254
|
+
end
|
255
|
+
res["source-error"] = @source.lock(:errors) { |s| s.get_data(:errors) }
|
256
|
+
res["update-rollback"] = @client.get_data(:update_rollback_page)
|
257
|
+
res.reject! {|key,value| value.nil? or value.empty?}
|
258
|
+
res
|
259
|
+
end
|
260
|
+
|
261
|
+
# expires the bulk data for the client
|
262
|
+
def _expire_bulk_data
|
263
|
+
[:user,:app].each do |partition|
|
264
|
+
Rhoconnect.expire_bulk_data(@client.user_id,partition)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rhoconnect/handler/helpers.rb'
|
2
|
+
require 'rhoconnect/handler/query/execute_methods.rb'
|
3
|
+
require 'rhoconnect/handler/query/runner.rb'
|
4
|
+
require 'rhoconnect/handler/query/pass_through_runner.rb'
|
5
|
+
require 'rhoconnect/handler/query/engine.rb'
|
6
|
+
|
7
|
+
module Rhoconnect
|
8
|
+
module Handler
|
9
|
+
module Query
|
10
|
+
def self.registered(app)
|
11
|
+
app.get "/", :rc_handler => :query, :login_required => true, :admin_required => false,
|
12
|
+
:source_required => true, :client_required => true,
|
13
|
+
:deprecated_route => {:verb => :get, :url => ['/api/application', '/application', '/api/application/query']} do
|
14
|
+
@model.query(params[:query])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Handler
|
3
|
+
module Search
|
4
|
+
class Engine
|
5
|
+
attr_accessor :source, :client, :model, :route_handler, :params
|
6
|
+
|
7
|
+
include Rhoconnect::Handler::Helpers::AuthMethod
|
8
|
+
include Rhoconnect::Handler::Helpers::Binding
|
9
|
+
|
10
|
+
def initialize(model, client, route_handler, params = {})
|
11
|
+
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
12
|
+
raise ArgumentError.new(UNKNOWN_SOURCE) unless (model and model.source)
|
13
|
+
raise ArgumentError.new('Invalid app for source') unless model.source.app
|
14
|
+
raise ArgumentError.new('Invalid sync handler') unless route_handler
|
15
|
+
|
16
|
+
@client = client
|
17
|
+
@source = model.source
|
18
|
+
@model = model
|
19
|
+
# if handler is not bound - bind it to self
|
20
|
+
# normally it should be bound to a Controller's instance
|
21
|
+
@route_handler = bind_handler(:search_handler_method, route_handler)
|
22
|
+
@params = params
|
23
|
+
end
|
24
|
+
|
25
|
+
def do_search
|
26
|
+
return if auth_method('login',client.id) == false
|
27
|
+
res = run_search
|
28
|
+
auth_method('logoff',client.id)
|
29
|
+
res
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_search
|
33
|
+
errordoc = nil
|
34
|
+
docobj = nil
|
35
|
+
result = nil
|
36
|
+
begin
|
37
|
+
errordoc = :search_errors
|
38
|
+
docobj = client
|
39
|
+
client.compute_token(:search_token)
|
40
|
+
result = @route_handler.call
|
41
|
+
client.put_data(:search,result) unless @source.is_pass_through?
|
42
|
+
# operation,sync succeeded, remove errors
|
43
|
+
docobj.lock(errordoc) do
|
44
|
+
docobj.flush_data(errordoc)
|
45
|
+
end
|
46
|
+
rescue Exception => e
|
47
|
+
# store sync,operation exceptions to be sent to all clients for this source/user
|
48
|
+
log "Model raised search exception: #{e}"
|
49
|
+
log e.backtrace.join("\n")
|
50
|
+
docobj.lock(errordoc) do
|
51
|
+
docobj.put_data(errordoc,{"search-error"=>{'message'=>e.message}},true)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
# pass through expects result hash
|
55
|
+
@source.is_pass_through? ? result : true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Handler
|
3
|
+
module Search
|
4
|
+
module ExecuteMethods
|
5
|
+
def execute_search_handler(route_handler)
|
6
|
+
content_type :json
|
7
|
+
return [].to_json unless params[:sources]
|
8
|
+
res = []
|
9
|
+
params[:sources].each do |source_params|
|
10
|
+
s = Source.load(source_params['name'],{:app_id => current_client.app_id,
|
11
|
+
:user_id => current_client.user_id})
|
12
|
+
current_client.source_name = source_params['name']
|
13
|
+
@model = Rhoconnect::Model::Base.create(s)
|
14
|
+
|
15
|
+
params[:token] = source_params['token'] if source_params['token']
|
16
|
+
if not s.is_pass_through?
|
17
|
+
@handler = Rhoconnect::Handler::Search::Runner.new(@model, current_client, route_handler, params)
|
18
|
+
else
|
19
|
+
@handler = Rhoconnect::Handler::Search::PassThroughRunner.new(@model, current_client, route_handler, params)
|
20
|
+
end
|
21
|
+
@model = @handler.engine.model
|
22
|
+
search_res = @handler.run
|
23
|
+
res << search_res if search_res
|
24
|
+
end
|
25
|
+
response.headers[Rhoconnect::PAGE_TOKEN_HEADER] = res[0][1]['token'] if res[0][1] and res[0][1]['token']
|
26
|
+
response.headers[Rhoconnect::PAGE_OBJECT_COUNT_HEADER] = res[0][3]['count'].to_s if res[0][3] and res[0][3]['count']
|
27
|
+
res.to_json
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Handler
|
3
|
+
module Search
|
4
|
+
# this class just overrides one method
|
5
|
+
class PassThroughRunner < Rhoconnect::Handler::Search::Runner
|
6
|
+
private
|
7
|
+
def _do_search
|
8
|
+
# call model search unless client is sending token for ack
|
9
|
+
res = @engine.do_search if params.nil? or !params[:token]
|
10
|
+
res,diffsize = [res,res.size]
|
11
|
+
formatted_res = _format_search_result(res,diffsize)
|
12
|
+
_delete_search if diffsize == 0
|
13
|
+
formatted_res
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
# implementation classes
|
3
|
+
module Handler
|
4
|
+
module Search
|
5
|
+
class Runner
|
6
|
+
attr_accessor :source,:client,:p_size,:model,:engine,:params
|
7
|
+
|
8
|
+
def initialize(model,client,route_handler, params = {})
|
9
|
+
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
10
|
+
raise ArgumentError.new(UNKNOWN_SOURCE) unless (model and model.source)
|
11
|
+
raise ArgumentError.new('Invalid app for source') unless model.source.app
|
12
|
+
|
13
|
+
@source,@client,@p_size = model.source,client,params[:p_size] ? params[:p_size].to_i : 500
|
14
|
+
@model = model
|
15
|
+
@client.last_sync = Time.now if @client
|
16
|
+
@params = params
|
17
|
+
@engine = Rhoconnect::Handler::Search::Engine.new(@model, @client, route_handler, @params)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
if params
|
22
|
+
return _resend_search_result if params[:token] and params[:resend]
|
23
|
+
if params[:token] and !_ack_search(params[:token])
|
24
|
+
formatted_result = _format_search_result
|
25
|
+
_delete_search
|
26
|
+
return formatted_result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
_do_search
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def _do_search
|
34
|
+
# call model search unless client is sending token for ack
|
35
|
+
res = @engine.do_search if params.nil? or !params[:token]
|
36
|
+
res,diffsize = _compute_search
|
37
|
+
formatted_res = _format_search_result(res,diffsize)
|
38
|
+
_delete_search if diffsize == 0
|
39
|
+
formatted_res
|
40
|
+
end
|
41
|
+
|
42
|
+
# Computes search result, updates md for source and cd for client with the result
|
43
|
+
def _compute_search
|
44
|
+
cd_inserts_elements_map = @client.get_diff_data(:cd,@client.docname(:search),@p_size)
|
45
|
+
|
46
|
+
@client.update_elements(:cd, cd_inserts_elements_map, {})
|
47
|
+
@client.update_count(:cd_size,cd_inserts_elements_map.size)
|
48
|
+
# remove previous search page and build new one
|
49
|
+
@client.flush_data(:search_page)
|
50
|
+
@client.update_elements(:search_page,cd_inserts_elements_map,{})
|
51
|
+
client_res = @client.get_data(:search_page)
|
52
|
+
|
53
|
+
@source.lock(:md) do |s|
|
54
|
+
md_inserts_elements_map = s.get_diff_data(:md,@client.docname(:cd))
|
55
|
+
s.update_elements(:md, md_inserts_elements_map, {})
|
56
|
+
s.update_count(:md_size,md_inserts_elements_map.size)
|
57
|
+
end
|
58
|
+
|
59
|
+
[client_res,client_res.size]
|
60
|
+
end
|
61
|
+
|
62
|
+
def _resend_search_result
|
63
|
+
res = @client.get_data(:search_page)
|
64
|
+
_format_search_result(res,res.size)
|
65
|
+
end
|
66
|
+
|
67
|
+
def _ack_search(search_token)
|
68
|
+
if @client.get_value(:search_token) != search_token
|
69
|
+
_delete_search
|
70
|
+
@client.put_data(:search_errors,
|
71
|
+
{'search-error'=>{'message'=>'Search error - invalid token'}}
|
72
|
+
)
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
def _delete_search
|
79
|
+
[:search, :search_page, :search_token, :search_errors].each do |search_doc|
|
80
|
+
@client.flush_data(search_doc)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def _format_search_result(res={},diffsize=nil)
|
85
|
+
error = @client.get_data(:search_errors)
|
86
|
+
if not error.empty?
|
87
|
+
[ {'version'=>Rhoconnect::SYNC_VERSION},
|
88
|
+
{'source'=>@source.name},
|
89
|
+
{'search-error'=>error} ]
|
90
|
+
else
|
91
|
+
search_token = @client.get_value(:search_token)
|
92
|
+
search_token ||= ''
|
93
|
+
return [] if res.empty?
|
94
|
+
[ {'version'=>Rhoconnect::SYNC_VERSION},
|
95
|
+
{'token' => search_token},
|
96
|
+
{'source'=>@source.name},
|
97
|
+
{'count'=>res.size},
|
98
|
+
{'insert'=>res} ]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rhoconnect/handler/helpers'
|
2
|
+
require 'rhoconnect/handler/search/execute_methods'
|
3
|
+
require 'rhoconnect/handler/search/runner'
|
4
|
+
require 'rhoconnect/handler/search/pass_through_runner'
|
5
|
+
require 'rhoconnect/handler/search/engine'
|
6
|
+
|
7
|
+
module Rhoconnect
|
8
|
+
module Handler
|
9
|
+
module Search
|
10
|
+
def self.registered(app)
|
11
|
+
# search request
|
12
|
+
app.post "/search", \
|
13
|
+
{ :login_required => true,
|
14
|
+
:client_required => true,
|
15
|
+
:source_required => false,
|
16
|
+
:admin_required => false,
|
17
|
+
:rc_handler => :search,
|
18
|
+
:deprecated_route => {:verb => :get, :url => ['/application/search', '/api/application/search']}
|
19
|
+
} do
|
20
|
+
search_params = params[:search]
|
21
|
+
@model.search(search_params)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rhoconnect/handler/query'
|
2
|
+
require 'rhoconnect/handler/changes'
|
3
|
+
require 'rhoconnect/handler/plugin_callbacks'
|
4
|
+
|
5
|
+
module Rhoconnect
|
6
|
+
module Handler
|
7
|
+
module Sync
|
8
|
+
def self.registered(app)
|
9
|
+
app.set_default :admin_required, false
|
10
|
+
app.set_default :login_required, true
|
11
|
+
app.set_default :source_required, true
|
12
|
+
app.set_default :client_required, true
|
13
|
+
|
14
|
+
app.register Rhoconnect::Handler::Query
|
15
|
+
app.register Rhoconnect::Handler::Changes
|
16
|
+
app.register Rhoconnect::Handler::PluginCallbacks
|
17
|
+
|
18
|
+
# source name is available inherently from controller
|
19
|
+
app.before do
|
20
|
+
params[:source_name] = app._rest_name
|
21
|
+
params[:source_id] = app._rest_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
@@ -3,13 +3,22 @@ module Rhoconnect
|
|
3
3
|
class << self
|
4
4
|
attr_accessor :queue
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
def self.perform(job_type,source_id,app_id,user_id,params)
|
8
8
|
source = Source.load(source_id,{:app_id => app_id,:user_id => user_id})
|
9
|
-
|
9
|
+
params ||= {}
|
10
|
+
|
10
11
|
case job_type.to_sym
|
11
|
-
when :query
|
12
|
-
|
12
|
+
when :query
|
13
|
+
handler_sync = lambda { @model.query(params[:query])}
|
14
|
+
@model = Rhoconnect::Model::Base.create(source)
|
15
|
+
source_sync = Rhoconnect::Handler::Query::Engine.new(@model, handler_sync, params)
|
16
|
+
source_sync.do_sync
|
17
|
+
when :cud
|
18
|
+
handler_cud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
|
19
|
+
@model = Rhoconnect::Model::Base.create(source)
|
20
|
+
source_cud = Rhoconnect::Handler::Changes::Engine.new(['create', 'update', 'delete'], @model, handler_cud, params)
|
21
|
+
source_cud.do_cud
|
13
22
|
end
|
14
23
|
end
|
15
24
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# module Rhoconnect
|
2
|
+
# class JsAdapter < SourceAdapter
|
3
|
+
# attr_accessor :name
|
4
|
+
#
|
5
|
+
# def initialize(source)
|
6
|
+
# @source = source
|
7
|
+
# @name = source.name
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# def self.method_missing method_name, *args
|
11
|
+
# #grab function and args and publish to channel
|
12
|
+
# begin
|
13
|
+
# json = create_json_hash(method_name,args)
|
14
|
+
# NodeChannel.publish_channel_and_wait(json)
|
15
|
+
# rescue Exception => e
|
16
|
+
# puts "#{method_name error} - #{e.message}"
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# def login(params=nil)
|
21
|
+
# begin
|
22
|
+
# json = create_json_hash('get',params)
|
23
|
+
# NodeChannel.publish_channel_and_wait(json)
|
24
|
+
# rescue Exception=>e
|
25
|
+
# puts "error login #{e.message}\n #{e.backtrace}"
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# def query(params=nil)
|
30
|
+
# begin
|
31
|
+
# json = create_json_hash('get',params)
|
32
|
+
# @result = NodeChannel.publish_channel_and_wait(json)
|
33
|
+
# puts "res is ******* #{@result}"
|
34
|
+
# @result
|
35
|
+
# rescue Exception=>e
|
36
|
+
# puts "error query #{e.message}\n#{e.backtrace}"
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# # def search(params=nil)
|
41
|
+
# # json = create_json_hash('search',params)
|
42
|
+
# # NodeChannel.publish_channel_and_wait(json)
|
43
|
+
# # end
|
44
|
+
#
|
45
|
+
# # def sync
|
46
|
+
# # @result
|
47
|
+
# # super
|
48
|
+
# # end
|
49
|
+
#
|
50
|
+
# def create(create_hash)
|
51
|
+
# json = create_json_hash('post',create_hash)
|
52
|
+
# NodeChannel.publish_channel_and_wait(json)
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def update(update_hash)
|
56
|
+
# puts "update hash is #{update_hash}"
|
57
|
+
# json = create_json_hash('put',update_hash)
|
58
|
+
# NodeChannel.publish_channel_and_wait(json)
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# def delete(delete_hash)
|
62
|
+
# puts "create hash is #{delete_hash}"
|
63
|
+
# json = create_json_hash('delete',delete_hash)
|
64
|
+
# NodeChannel.publish_channel_and_wait(json)
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
#
|
68
|
+
# private
|
69
|
+
#
|
70
|
+
# def create_json_hash(operation,params)
|
71
|
+
# json = {
|
72
|
+
# :url => "#{operation}-/#{@name}",
|
73
|
+
# :args => params,
|
74
|
+
# :route => 'request'
|
75
|
+
# }
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# end
|