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,79 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class ClientsController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
post "/", :admin_required => false, :login_required => true, \
|
12
|
+
:deprecated_route => {:verb => :get, :url => ['/application/clientcreate', '/api/application/clientcreate']} do
|
13
|
+
content_type :json
|
14
|
+
client = Client.create(:user_id => current_user.id,:app_id => current_app.id)
|
15
|
+
client.update_fields(params)
|
16
|
+
{ "client" => { "client_id" => client.id.to_s } }.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
post "/:client_id/register", :admin_required => false, :login_required => true, \
|
20
|
+
:deprecated_route => {:verb => :post, :url => ['/application/clientregister', '/api/application/clientregister'] } do
|
21
|
+
cur_client = extract_current_client
|
22
|
+
if cur_client.nil? and current_user and current_app
|
23
|
+
fields = {:user_id => current_user.id}
|
24
|
+
fields[:id] = params[:client_id].to_s
|
25
|
+
fields[:app_id] = current_app.id
|
26
|
+
cur_client = Client.create(fields)
|
27
|
+
end
|
28
|
+
cur_client.update_fields(params)
|
29
|
+
status 200
|
30
|
+
end
|
31
|
+
|
32
|
+
post "/:client_id/reset", :admin_required => false, :login_required => true, :client_required => true, \
|
33
|
+
:deprecated_route => {:verb => :get, :url => ['/application/clientreset', '/api/application/clientreset']} do
|
34
|
+
# Resets the store for a given app,client
|
35
|
+
if params == nil or params[:sources] == nil
|
36
|
+
current_client.flush_all_documents
|
37
|
+
else
|
38
|
+
params[:sources].each do |source|
|
39
|
+
current_client.flush_source_documents(source['name'])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
status 200
|
43
|
+
end
|
44
|
+
|
45
|
+
get "/:client_id/sources/:source_id/docs/:doc" do
|
46
|
+
c = Client.load(params[:client_id],{:source_name => params[:source_id]})
|
47
|
+
c.get_db_doc(params[:doc])
|
48
|
+
end
|
49
|
+
|
50
|
+
post "/:client_id/sources/:source_id/docs/:doc" do
|
51
|
+
c = Client.load(params[:client_id],{:source_name => params[:source_id]})
|
52
|
+
append_to_doc = params[:append]
|
53
|
+
append_to_doc ||= false
|
54
|
+
c.set_db_doc(params[:doc], params[:data],append_to_doc)
|
55
|
+
''
|
56
|
+
end
|
57
|
+
|
58
|
+
get "/:client_id", \
|
59
|
+
:deprecated_route => {:verb => :post, :url => ['/api/get_client_params', '/api/client/get_client_params']} do
|
60
|
+
Client.load(params[:client_id],{:source_name => '*'}).to_array.to_json
|
61
|
+
end
|
62
|
+
|
63
|
+
get "/:client_id/sources/:source_id/docnames", \
|
64
|
+
:deprecated_route => {:verb => :post, :url => ['/api/list_client_docs', '/api/client/list_client_docs']} do
|
65
|
+
result = ""
|
66
|
+
Rhoconnect::Stats::Record.update('clientdocs') do
|
67
|
+
c = Client.load(params[:client_id],{:source_name => params[:source_id]})
|
68
|
+
res = {}
|
69
|
+
Client.valid_doctypes.each do |doc|
|
70
|
+
db_key = c.docname(doc)
|
71
|
+
res.merge!(doc => db_key)
|
72
|
+
end
|
73
|
+
result = res.to_json
|
74
|
+
end
|
75
|
+
result
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class DynamicAdapterController < Rhoconnect::Controller::Base
|
4
|
+
set_default :admin_required, false
|
5
|
+
set_default :login_required, true
|
6
|
+
set_default :source_required, true
|
7
|
+
set_default :client_required, true
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
# QUERY
|
12
|
+
get "/:source_name", :rc_handler => :query do
|
13
|
+
@model.query(params[:query])
|
14
|
+
end
|
15
|
+
|
16
|
+
# CUD
|
17
|
+
post "/:source_name", :rc_handler => :cud do
|
18
|
+
operation = params[:operation]
|
19
|
+
@model.send operation.to_sym, params["#{operation}_object".to_sym]
|
20
|
+
end
|
21
|
+
|
22
|
+
put "/:source_name/:id", :rc_handler => :update do
|
23
|
+
@model.update(params[:update_object])
|
24
|
+
end
|
25
|
+
|
26
|
+
delete "/:source_name/:id", :rc_handler => :delete do
|
27
|
+
@model.delete(params[:delete_object])
|
28
|
+
end
|
29
|
+
|
30
|
+
# push objects
|
31
|
+
post "/:source_id/push_objects", \
|
32
|
+
{ :rc_handler => :push_objects,
|
33
|
+
:admin_required => true,
|
34
|
+
:login_required => false,
|
35
|
+
:source_required => false,
|
36
|
+
:client_required => false,
|
37
|
+
:deprecated_route => {:verb => :post, :url => ['/api/push_objects', '/api/source/push_objects']}
|
38
|
+
} do
|
39
|
+
@model.push_objects(params)
|
40
|
+
end
|
41
|
+
|
42
|
+
# push_deletes
|
43
|
+
post "/:source_id/push_deletes", \
|
44
|
+
{ :rc_handler => :push_deletes,
|
45
|
+
:admin_required => true,
|
46
|
+
:login_required => false,
|
47
|
+
:source_required => false,
|
48
|
+
:client_required => false,
|
49
|
+
:deprecated_route => {:verb => :post, :url => ['/api/push_deletes', '/api/source/push_deletes']}
|
50
|
+
} do
|
51
|
+
@model.push_deletes(params)
|
52
|
+
end
|
53
|
+
|
54
|
+
# fast insert
|
55
|
+
post "/:source_id/fast_insert", \
|
56
|
+
{ :admin_required => true,
|
57
|
+
:login_required => false,
|
58
|
+
:source_required => false,
|
59
|
+
:client_required => false,
|
60
|
+
:deprecated_route => {:verb => :post, :url => ['/api/fast_insert', '/api/source/fast_insert']}
|
61
|
+
} do
|
62
|
+
do_fast_insert
|
63
|
+
end
|
64
|
+
|
65
|
+
# fast update
|
66
|
+
post "/:source_id/fast_update", \
|
67
|
+
{ :admin_required => true,
|
68
|
+
:login_required => false,
|
69
|
+
:source_required => false,
|
70
|
+
:client_required => false,
|
71
|
+
:deprecated_route => {:verb => :post, :url => ['/api/fast_update', '/api/source/fast_update']}
|
72
|
+
} do
|
73
|
+
do_fast_update
|
74
|
+
end
|
75
|
+
|
76
|
+
# fast object delete
|
77
|
+
post "/:source_id/fast_delete", \
|
78
|
+
{ :admin_required => true,
|
79
|
+
:login_required => false,
|
80
|
+
:source_required => false,
|
81
|
+
:client_required => false,
|
82
|
+
:deprecated_route => {:verb => :post, :url => ['/api/fast_delete', '/api/source/fast_delete']}
|
83
|
+
} do
|
84
|
+
do_fast_delete
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
def self.rest_path
|
89
|
+
"/app/#{Rhoconnect::API_VERSION}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
module JsBaseHelpers
|
4
|
+
def query_finish(return_value)
|
5
|
+
@model.result = return_value
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class JsBase < Rhoconnect::Controller::Base
|
10
|
+
|
11
|
+
# Add helpers for deprecated routes
|
12
|
+
Rhoconnect::DefaultServer.helpers Rhoconnect::Controller::JsBaseHelpers
|
13
|
+
|
14
|
+
helpers Rhoconnect::Controller::JsBaseHelpers
|
15
|
+
|
16
|
+
# source name is available inherently from controller
|
17
|
+
before do
|
18
|
+
params[:source_name] = self.class._rest_name
|
19
|
+
params[:source_id] = self.class._rest_name
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.register_routes(json)
|
23
|
+
Rhoconnect::Model::JsBase.register_models(json['models'])
|
24
|
+
json['result'].each do |key,val|
|
25
|
+
controller_name = "#{key}Controller"
|
26
|
+
next if Object.const_defined?(controller_name)
|
27
|
+
if controller_name == 'ApplicationController'
|
28
|
+
klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsAppBase))
|
29
|
+
else
|
30
|
+
klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsBase))
|
31
|
+
end
|
32
|
+
Rhoconnect.add_to_url_map(klass)
|
33
|
+
process_defaults(klass,val['defaults'])
|
34
|
+
process_routes(klass,val['routes'])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def self.process_defaults(klass,defaults)
|
41
|
+
defaults.each do |default|
|
42
|
+
default.each do |key,val|
|
43
|
+
klass.send(:set_default,key,val)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.process_routes(klass,routes)
|
49
|
+
routes.each do |r|
|
50
|
+
opts = {}
|
51
|
+
s_route = r.split('_rjs_')
|
52
|
+
verb = s_route[0]
|
53
|
+
action = s_route[2]
|
54
|
+
opts = hshify(s_route[3]) if s_route[3]
|
55
|
+
block = js_block(r)
|
56
|
+
case opts[:rc_handler]
|
57
|
+
when 'query'
|
58
|
+
block = js_block(r,:query_finish)
|
59
|
+
end
|
60
|
+
klass.send(verb,action,opts,&block)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.hshify(str)
|
65
|
+
result = JSON.parse(str, :symbolize_names => true)
|
66
|
+
# result = str.split(",").inject({}) do |res,element|
|
67
|
+
# items = element.split(":")
|
68
|
+
# res[items[0].to_sym] = items[1]
|
69
|
+
# res
|
70
|
+
# end
|
71
|
+
result
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.js_block(key,finish_block=nil)
|
75
|
+
Proc.new do
|
76
|
+
json = {
|
77
|
+
:url => key,
|
78
|
+
:args => params,
|
79
|
+
:model => under_score(params[:source_name]),
|
80
|
+
:route => 'request'
|
81
|
+
}
|
82
|
+
return_value = NodeChannel.publish_channel_and_wait(json,@model)
|
83
|
+
if finish_block
|
84
|
+
self.send(finish_block, return_value)
|
85
|
+
else
|
86
|
+
return_value
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def self._prefix
|
92
|
+
"app/#{Rhoconnect::API_VERSION}"
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
class JsAppBase < Rhoconnect::Controller::JsBase
|
97
|
+
set_default :admin_required, false
|
98
|
+
set_default :login_required, false
|
99
|
+
set_default :source_required, false
|
100
|
+
set_default :client_required, false
|
101
|
+
|
102
|
+
def self.inherited(subclass)
|
103
|
+
subclass.set_default :admin_required, false
|
104
|
+
subclass.set_default :login_required, false
|
105
|
+
subclass.set_default :source_required, false
|
106
|
+
subclass.set_default :client_required, false
|
107
|
+
super
|
108
|
+
end
|
109
|
+
|
110
|
+
register Rhoconnect::Handler::Search
|
111
|
+
register Rhoconnect::Handler::BulkData
|
112
|
+
|
113
|
+
# main app controller
|
114
|
+
def self._rest_name
|
115
|
+
"app"
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
def self._prefix
|
120
|
+
"rc/#{Rhoconnect::API_VERSION}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class ReadStateController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
put "/users/:user_name/sources/:source_name", \
|
12
|
+
:deprecated_route => {:verb => :post, :url => ['/api/set_refresh_time', '/api/source/set_refresh_time']} do
|
13
|
+
source = Source.load(params[:source_name],
|
14
|
+
{:app_id => APP_NAME, :user_id => params[:user_name]})
|
15
|
+
source.poll_interval = params[:poll_interval] if params[:poll_interval]
|
16
|
+
params[:refresh_time] ||= 0
|
17
|
+
source.read_state.refresh_time = Time.now.to_i + params[:refresh_time].to_i
|
18
|
+
''
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class SourceAdapterBase < Rhoconnect::Controller::Base
|
4
|
+
# create SourceAdapterController class for every source
|
5
|
+
def self.register_controller(source_name)
|
6
|
+
return if Object.const_defined?("#{source_name}Controller")
|
7
|
+
# klass will be added automatically to the URL map
|
8
|
+
klass = Object.const_set("#{source_name}Controller", Class.new(Rhoconnect::Controller::SourceAdapterBase))
|
9
|
+
klass.register Rhoconnect::EndPoint
|
10
|
+
klass.register Rhoconnect::Handler::Sync
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class SourcesController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
# get source's params
|
12
|
+
get "/:source_id", \
|
13
|
+
:deprecated_route => {:verb => :post, :url => ['/api/get_source_params', '/api/source/get_source_params']} do
|
14
|
+
Source.load(params[:source_id],{:app_id => APP_NAME,:user_id => '*'}).to_array.to_json
|
15
|
+
end
|
16
|
+
|
17
|
+
# get all sources with particular partition type
|
18
|
+
get "/type/:partition_type", \
|
19
|
+
:deprecated_route => {:verb => :post, :url => ['/api/list_sources', '/api/source/list_sources']} do
|
20
|
+
sources = App.load(APP_NAME).sources
|
21
|
+
if params['partition_type'].nil? or params['partition_type'] == 'all'
|
22
|
+
sources.to_json
|
23
|
+
else
|
24
|
+
res = []
|
25
|
+
sources.each do |name|
|
26
|
+
s = Source.load(name,{:app_id => APP_NAME,:user_id => '*'})
|
27
|
+
if s and s.partition_type and s.partition_type == params['partition_type'].to_sym
|
28
|
+
res << name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
res.to_json
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# update source's params
|
36
|
+
put "/:source_id" do
|
37
|
+
source = Source.load(params[:source_id],
|
38
|
+
{:app_id => APP_NAME, :user_id => '*'})
|
39
|
+
source.update_fields(params[:data])
|
40
|
+
''
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class StoreController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
get "/:doc", \
|
12
|
+
:deprecated_route => {:verb => :post, :url => ['/api/get_db_doc', '/api/source/get_db_doc']} do
|
13
|
+
Store.get_db_doc(params[:doc])
|
14
|
+
end
|
15
|
+
|
16
|
+
post "/:doc", \
|
17
|
+
:deprecated_route => {:verb => :post, :url => ['/api/set_db_doc', '/api/source/set_db_doc'] } do
|
18
|
+
append_to_doc = params[:append]
|
19
|
+
append_to_doc ||= false
|
20
|
+
Store.set_db_doc(params[:doc],params[:data],append_to_doc)
|
21
|
+
''
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class SystemController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
get "/appserver", \
|
12
|
+
:deprecated_route => {:verb => :post, :url => ['/api/get_adapter', '/api/source/get_adapter']} do
|
13
|
+
{:adapter_url => Rhoconnect.appserver}.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
post "/appserver", \
|
17
|
+
:deprecated_route => {:verb => :post, :url => ['/api/save_adapter', '/api/source/save_adapter']} do
|
18
|
+
Rhoconnect.appserver = params['adapter_url'] || params[:attributes]['adapter_url']
|
19
|
+
end
|
20
|
+
|
21
|
+
get "/license", \
|
22
|
+
:deprecated_route => {:verb => :post, :url => ['/api/get_license_info', '/api/admin/get_license_info']} do
|
23
|
+
{:rhoconnect_version => Rhoconnect.license.rhoconnect_version,
|
24
|
+
:licensee => Rhoconnect.license.licensee,
|
25
|
+
:seats => Rhoconnect.license.seats,
|
26
|
+
:issued => Rhoconnect.license.issued,
|
27
|
+
:available => Rhoconnect.license.available }.to_json
|
28
|
+
end
|
29
|
+
|
30
|
+
post "/login", :rc_handler => :admin_authenticate, :admin_required => false, :deprecated_route => {:verb => :post, :url => ['/login', '/api/admin/login']} do
|
31
|
+
user = User.authenticate(params[:login], params[:password])
|
32
|
+
end
|
33
|
+
|
34
|
+
post "/reset", :deprecated_route => {:verb => :post, :url => ['/api/reset', '/api/admin/reset']} do
|
35
|
+
keep_token = current_user.token.value
|
36
|
+
Store.flush_all
|
37
|
+
Rhoconnect.bootstrap(Rhoconnect.base_directory)
|
38
|
+
# restoring previous token value after flushdb
|
39
|
+
current_user.token = keep_token
|
40
|
+
"DB reset"
|
41
|
+
end
|
42
|
+
|
43
|
+
get "/stats", \
|
44
|
+
:deprecated_route => {:verb => :post, :url => ['/api/stats', '/api/admin/stats']} do
|
45
|
+
if Rhoconnect.stats == true
|
46
|
+
names = params[:names]
|
47
|
+
if names
|
48
|
+
Rhoconnect::Stats::Record.keys(names).to_json
|
49
|
+
else
|
50
|
+
metric = params[:metric]
|
51
|
+
rtype = Rhoconnect::Stats::Record.rtype(metric)
|
52
|
+
if rtype == 'zset'
|
53
|
+
# returns [] if no results
|
54
|
+
Rhoconnect::Stats::Record.range(metric,params[:start],params[:finish]).to_json
|
55
|
+
elsif rtype == 'string'
|
56
|
+
Rhoconnect::Stats::Record.get_value(metric) || ''
|
57
|
+
else
|
58
|
+
raise ApiException.new(404, "Unknown metric")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
else
|
62
|
+
raise ApiException.new(500, "Stats not enabled")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Rhoconnect
|
2
|
+
module Controller
|
3
|
+
class UsersController < Rhoconnect::Controller::APIBase
|
4
|
+
set_default :admin_required, true
|
5
|
+
set_default :login_required, false
|
6
|
+
set_default :source_required, false
|
7
|
+
set_default :client_required, false
|
8
|
+
|
9
|
+
register Rhoconnect::EndPoint
|
10
|
+
|
11
|
+
# show users
|
12
|
+
get "/", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/list_users', '/api/user/list_users']} do
|
13
|
+
current_app.users.members.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
# show user
|
17
|
+
get "/:user_id" do
|
18
|
+
User.load(params[:user_id]).to_array.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
# create user
|
22
|
+
post "/", :deprecated_route => { :url => "/api/create_user", :verb => :post } do
|
23
|
+
app = current_app
|
24
|
+
u = User.create({:login => params[:attributes][:login]})
|
25
|
+
u.password = params[:attributes]['password']
|
26
|
+
app.users << u.login
|
27
|
+
"User created"
|
28
|
+
end
|
29
|
+
|
30
|
+
# update user
|
31
|
+
put "/:user_id", :deprecated_route => {:verb => :post, :url => ["/api/update_user", '/api/user/update_user']} do
|
32
|
+
User.load(params[:user_id]).update(params[:attributes])
|
33
|
+
"User updated"
|
34
|
+
end
|
35
|
+
|
36
|
+
# delete user
|
37
|
+
delete "/:user_id", :deprecated_route => {:verb => :post, :url => ['/api/delete_user', '/api/user/delete_user']} do
|
38
|
+
app = current_app
|
39
|
+
User.load(params[:user_id]).delete
|
40
|
+
app.users.delete(params[:user_id])
|
41
|
+
s_params = {:app_id => APP_NAME,:user_id => params[:user_id]}
|
42
|
+
app.sources.each{ |source|
|
43
|
+
Source.load(source, s_params).flush_store_data
|
44
|
+
}
|
45
|
+
"User deleted"
|
46
|
+
end
|
47
|
+
|
48
|
+
# get user's clients
|
49
|
+
get "/:user_id/clients", :admin_required => true, \
|
50
|
+
:deprecated_route => {:verb => :post, :url => ['/api/list_clients', '/api/client/list_clients']} do
|
51
|
+
User.load(params[:user_id]).clients.members.to_json
|
52
|
+
end
|
53
|
+
|
54
|
+
# delete user's client
|
55
|
+
delete "/:user_id/clients/:client_id", :admin_required => true, \
|
56
|
+
:deprecated_route => {:verb => :post, :url => ['/api/delete_client', '/api/client/delete_client']} do
|
57
|
+
Client.load(params[:client_id],{:source_name => '*'}).delete
|
58
|
+
User.load(params[:user_id]).clients.delete(params[:client_id])
|
59
|
+
"Client deleted"
|
60
|
+
end
|
61
|
+
|
62
|
+
# get user's docnames
|
63
|
+
get "/:user_id/sources/:source_id/docnames", :admin_required => true, \
|
64
|
+
:deprecated_route => {:verb => :post, :url => ['/api/list_source_docs', '/api/source/list_source_docs']} do
|
65
|
+
res = {}
|
66
|
+
s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
|
67
|
+
[:md,:md_size,:md_copy,:errors].each do |doc|
|
68
|
+
db_key = s.docname(doc)
|
69
|
+
res.merge!(doc => db_key)
|
70
|
+
end
|
71
|
+
res.to_json
|
72
|
+
end
|
73
|
+
|
74
|
+
# get user's DB document
|
75
|
+
get "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
|
76
|
+
s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
|
77
|
+
db_key = s.docname(params[:doc])
|
78
|
+
Store.get_db_doc(db_key)
|
79
|
+
end
|
80
|
+
|
81
|
+
# set user's DB document
|
82
|
+
post "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
|
83
|
+
throw :halt, [500, "Unknown user '#{params[:user_id]}'"] unless User.is_exist?(params[:user_id])
|
84
|
+
|
85
|
+
s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
|
86
|
+
db_key = s.docname(params[:doc])
|
87
|
+
append_to_doc = params[:append]
|
88
|
+
append_to_doc ||= false
|
89
|
+
Store.set_db_doc(db_key,params[:data],append_to_doc)
|
90
|
+
''
|
91
|
+
end
|
92
|
+
|
93
|
+
# ping user's client
|
94
|
+
post "/ping", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/ping', '/api/client/ping']} do
|
95
|
+
User.ping(params)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -9,9 +9,7 @@ class DBAdapter
|
|
9
9
|
def get_connection(dbfile)
|
10
10
|
if defined?(JRUBY_VERSION) # JRuby
|
11
11
|
require 'dbi'
|
12
|
-
|
13
|
-
require 'jdbc/sqlite3'
|
14
|
-
|
12
|
+
|
15
13
|
db = DBI.connect("DBI:Jdbc:SQLite:#{dbfile}", nil, nil, 'driver' => 'org.sqlite.JDBC')
|
16
14
|
class << db
|
17
15
|
# jdbc/sqlite3 has no Database#execute_batch method
|