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.
Files changed (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. data/spec/apps/rhotestapp/application.rb +0 -23
@@ -1,43 +0,0 @@
1
- class Application < Rhoconnect::Base
2
- class << self
3
- def authenticate(username,password,session)
4
- true # do some interesting authentication here...
5
- end
6
-
7
- def ans_authenticate(username,password)
8
- true # optionally handle rhoconnect push authentication...
9
- end
10
-
11
- # Add hooks for application startup here
12
- # Don't forget to call super at the end!
13
- def initializer(path)
14
- super
15
- end
16
-
17
- # Calling super here returns rack tempfile path:
18
- # i.e. /var/folders/J4/J4wGJ-r6H7S313GEZ-Xx5E+++TI
19
- # Note: This tempfile is removed when server stops or crashes...
20
- # See http://rack.rubyforge.org/doc/Multipart.html for more info
21
- #
22
- # Override this by creating a copy of the file somewhere
23
- # and returning the path to that file (then don't call super!):
24
- # i.e. /mnt/myimages/soccer.png
25
- def store_blob(object,field_name,blob)
26
- super #=> returns blob[:tempfile]
27
- end
28
- end
29
- end
30
-
31
- Application.initializer(ROOT_PATH)
32
-
33
- # Support passenger smart spawning/fork mode:
34
- if defined?(PhusionPassenger)
35
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
36
- if forked
37
- # We're in smart spawning mode.
38
- Store.db.client.reconnect
39
- else
40
- # We're in conservative spawning mode. We don't need to do anything.
41
- end
42
- end
43
- end
@@ -1,434 +0,0 @@
1
- module Rhoconnect
2
- class ClientSync
3
- attr_accessor :source,:client,:p_size,:source_sync
4
-
5
- UNKNOWN_CLIENT = "Unknown client"
6
- UNKNOWN_SOURCE = "Unknown source"
7
-
8
- # TODO : Remove in Rhoconnect 4.0
9
- SYNC_VERSION = 3
10
-
11
- def initialize(source,client,p_size=nil)
12
- raise ArgumentError.new(UNKNOWN_CLIENT) unless client
13
- raise ArgumentError.new(UNKNOWN_SOURCE) unless source
14
- @source,@client,@p_size = source,client,p_size ? p_size.to_i : 500
15
- @client.last_sync = Time.now if @client
16
- @source_sync = SourceSync.new(@source)
17
- end
18
-
19
- def receive_cud(cud_params={},query_params=nil)
20
- if @source.is_pass_through?
21
- @source_sync.pass_through_cud(cud_params,query_params)
22
- else
23
- _process_blobs(cud_params)
24
- processed = 0
25
- ['create','update','delete'].each do |op|
26
- key,value = op,cud_params[op]
27
- processed += _receive_cud(key,value) if value
28
- end
29
- @source_sync.process_cud
30
- end
31
- end
32
-
33
- def send_cud(token=nil,query_params=nil)
34
- res = []
35
- if not _ack_token(token) and not @source.is_pass_through?
36
- res = resend_page(token)
37
- else
38
- query_result = @source_sync.process_query(query_params)
39
- if @source.is_pass_through?
40
- res = send_pass_through_data(query_result)
41
- else
42
- res = send_new_page
43
- end
44
- end
45
- _format_result(res[0],res[1],res[2],res[3])
46
- end
47
-
48
- def search(params)
49
- if params
50
- return _resend_search_result if params[:token] and params[:resend]
51
- if params[:token] and !_ack_search(params[:token])
52
- formatted_result = _format_search_result
53
- _delete_search
54
- return formatted_result
55
- end
56
- end
57
- _do_search(params)
58
- end
59
-
60
- def build_page
61
- res = {}
62
- yield res
63
- res.reject! {|key,value| value.nil? or value.empty?}
64
- res.merge!(_send_errors)
65
- res
66
- end
67
-
68
- def send_new_page
69
- token,progress_count,total_count,res = '',0,0,{}
70
- if schema_changed?
71
- _expire_bulk_data
72
- token = compute_token(@client.docname(:page_token))
73
- res = {'schema-changed' => 'true'}
74
- else
75
- compute_errors_page
76
- res = build_page do |r|
77
- total_count,r['insert'],r['delete'] = compute_page
78
- r['links'] = compute_links_page
79
- r['metadata'] = compute_metadata
80
- end
81
- if res['insert'] or res['delete'] or res['links']
82
- token = compute_token(@client.docname(:page_token))
83
- else
84
- _delete_errors_page
85
- end
86
- end
87
- # TODO: progress count can not be computed properly
88
- # without comparing what has actually changes
89
- # so we need to obsolete it in the future versions
90
- progress_count = 0
91
- [token,progress_count,total_count,res]
92
- end
93
-
94
- def send_pass_through_data(data)
95
- data ||= {}
96
- data.each_key do |object_id|
97
- data[object_id].each { |attrib,value| data[object_id][attrib] = '' if value.nil? }
98
- end
99
- token = ''
100
- compute_errors_page
101
- res = build_page do |r|
102
- r['insert'] = data
103
- r['metadata'] = compute_metadata
104
- end
105
- if res['insert']
106
- token = compute_token(@client.docname(:page_token))
107
- else
108
- _delete_errors_page
109
- end
110
- [token,0,data.size,res]
111
- end
112
-
113
- # Resend token for a client, also sends exceptions
114
- def resend_page(token=nil)
115
- token,progress_count,total_count,res = '',0,0,{}
116
- schema_page = @client.get_value(:schema_page)
117
- if schema_page
118
- res = {'schema-changed' => 'true'}
119
- else
120
- res = build_page do |r|
121
- r['insert'] = @client.get_data(:page)
122
- r['delete'] = @client.get_data(:delete_page)
123
- r['links'] = @client.get_data(:create_links_page)
124
- r['metadata'] = @client.get_value(:metadata_page)
125
- progress_count = 0
126
- total_count = @client.get_value(:total_count_page).to_i
127
- end
128
- end
129
- token = @client.get_value(:page_token)
130
- [token,progress_count,total_count,res]
131
- end
132
-
133
- # Checks if schema changed
134
- def schema_changed?
135
- if @source_sync.adapter.respond_to?(:schema)
136
- schema_sha1 = @source.get_value(:schema_sha1)
137
- if @client.get_value(:schema_sha1).nil?
138
- @client.put_value(:schema_sha1,schema_sha1)
139
- return false
140
- elsif @client.get_value(:schema_sha1) == schema_sha1
141
- return false
142
- end
143
- @client.put_value(:schema_sha1,schema_sha1)
144
- @client.put_value(:schema_page,schema_sha1)
145
- return true
146
- else
147
- return false
148
- end
149
- end
150
-
151
- # Computes the metadata sha1 and returns metadata if client's sha1 doesn't
152
- # match source's sha1
153
- def compute_metadata
154
- metadata_sha1,metadata = @source.lock(:metadata) do |s|
155
- [s.get_value(:metadata_sha1),s.get_value(:metadata)]
156
- end
157
- return if @client.get_value(:metadata_sha1) == metadata_sha1
158
- @client.put_value(:metadata_sha1,metadata_sha1)
159
- @client.put_value(:metadata_page,metadata)
160
- metadata
161
- end
162
-
163
-
164
- # Computes diffs between master doc and client doc, trims it to page size,
165
- # stores page, and returns page as hash
166
- def compute_page
167
- inserts_elements_map,deletes_elements_map,total_count = @source.lock(:md) do |s|
168
- inserts_elements_map = Store.get_diff_data(@client.docname(:cd),s.docname(:md),@p_size)
169
- total_count = s.get_value(:md_size).to_i
170
- deletes_elements_map = Store.get_diff_data(s.docname(:md),@client.docname(:cd),@p_size)
171
- [inserts_elements_map,deletes_elements_map,total_count]
172
- end
173
- # until sync is not done - set cd_size to 0
174
- # once there are no changes, then, set cd_size to md_size
175
- cd_size = inserts_elements_map.size > 0 ? 0 : total_count
176
- @client.put_value(:cd_size, cd_size)
177
-
178
- # now, find the exact changes
179
- inserts,deletes = Store.get_inserts_deletes(inserts_elements_map,deletes_elements_map)
180
-
181
- @client.put_data(:page,inserts)
182
- @client.put_data(:delete_page,deletes,true)
183
- @client.put_value(:total_count_page,total_count)
184
- Store.update_elements(@client.docname(:cd),inserts_elements_map,deletes_elements_map)
185
-
186
- [total_count,inserts,deletes]
187
- end
188
-
189
- # Computes search result, updates md for source and cd for client with the result
190
- def compute_search
191
- cd_inserts_elements_map = Store.get_diff_data(@client.docname(:cd),@client.docname(:search),@p_size)
192
-
193
- Store.update_elements(@client.docname(:cd), cd_inserts_elements_map, {})
194
- @client.update_count(:cd_size,cd_inserts_elements_map.size)
195
- # remove previous search page and build new one
196
- @client.flash_data(:search_page)
197
- Store.update_elements(@client.docname(:search_page),cd_inserts_elements_map,{})
198
- client_res = @client.get_data(:search_page)
199
-
200
- @source.lock(:md) do |s|
201
- md_inserts_elements_map = Store.get_diff_data(s.docname(:md),@client.docname(:cd))
202
- Store.update_elements(s.docname(:md), md_inserts_elements_map, {})
203
- s.update_count(:md_size,md_inserts_elements_map.size)
204
- end
205
-
206
- [client_res,client_res.size]
207
- end
208
-
209
- # Computes errors for client and stores a copy as errors page
210
- def compute_errors_page
211
- ['create','update','delete'].each do |operation|
212
- @client.lock("#{operation}_errors") do |c|
213
- c.rename("#{operation}_errors","#{operation}_errors_page")
214
- end
215
- end
216
- @client.lock("update_rollback") do |c|
217
- c.rename("update_rollback","update_rollback_page")
218
- end
219
- end
220
-
221
- # Computes create links for a client and stores a copy as links page
222
- def compute_links_page
223
- @client.lock(:create_links) do |c|
224
- c.rename(:create_links,:create_links_page)
225
- c.get_data(:create_links_page)
226
- end
227
- end
228
-
229
- class << self
230
- # Resets the store for a given app,client
231
- def reset(client, params=nil)
232
- return unless client
233
- if params == nil or params[:sources] == nil
234
- client.flash_data('*')
235
- else
236
- params[:sources].each do |source|
237
- client.flash_source_data('*', source['name'])
238
- end
239
- end
240
- end
241
-
242
- def search_all(client,params=nil)
243
- raise ArgumentError.new(UNKNOWN_CLIENT) unless client
244
- return [] unless params[:sources]
245
- res = []
246
- params[:sources].each do |source|
247
- s = Source.load(source['name'],{:app_id => client.app_id,
248
- :user_id => client.user_id})
249
- client.source_name = source['name']
250
- cs = ClientSync.new(s,client,params[:p_size])
251
- params[:token] = source['token'] if source['token']
252
- search_res = cs.search(params)
253
- res << search_res if search_res
254
- end
255
- res
256
- end
257
-
258
- def bulk_data(partition,client,sources=nil)
259
- raise ArgumentError.new(UNKNOWN_CLIENT) unless client
260
- name = BulkData.get_name(partition,client.user_id)
261
- data = BulkData.load(name)
262
-
263
- partition_sources = client.app.partition_sources(partition,client.user_id)
264
- sources ||= partition_sources
265
- return {:result => :nop} if sources.length <= 0
266
-
267
- do_bd_sync = data.nil?
268
- do_bd_sync = (data.completed? and
269
- (data.refresh_time <= Time.now.to_i or !data.dbfiles_exist?)) unless do_bd_sync
270
-
271
- if do_bd_sync
272
- data.delete if data
273
- data = BulkData.create(:name => name,
274
- :app_id => client.app_id,
275
- :user_id => client.user_id,
276
- :partition_sources => partition_sources,
277
- :sources => sources,
278
- :refresh_time => Time.now.to_i + Rhoconnect.bulk_sync_poll_interval)
279
- BulkData.enqueue("data_name" => name)
280
- end
281
-
282
- if data and data.completed? and data.dbfiles_exist?
283
- client.update_clientdoc(sources)
284
- sources.each do |src|
285
- s = Source.load(src, {:user_id => client.user_id, :app_id => client.app_id})
286
- errordoc = s.docname(:errors)
287
- errors = {}
288
- Store.lock(errordoc) do
289
- errors = Store.get_data(errordoc)
290
- end
291
- unless errors.empty?
292
- # FIXME: :result => :bulk_sync_error, :errors => "#{errors}"
293
- log "Bulk sync errors are found in #{src}: #{errors}"
294
- # Delete all related bulk files
295
- data.delete_files
296
- return {:result => :url, :url => ''}
297
- end
298
- end
299
- {:result => :url, :url => data.url}
300
- elsif data
301
- {:result => :wait}
302
- end
303
- end
304
- end
305
-
306
- private
307
-
308
- # expires the bulk data for the client
309
- def _expire_bulk_data
310
- [:user,:app].each do |partition|
311
- Rhoconnect.expire_bulk_data(@client.user_id,partition)
312
- end
313
- end
314
-
315
- def _resend_search_result
316
- res = @client.get_data(:search_page)
317
- _format_search_result(res,res.size)
318
- end
319
-
320
- def _ack_search(search_token)
321
- if @client.get_value(:search_token) != search_token
322
- _delete_search
323
- @client.put_data(:search_errors,
324
- {'search-error'=>{'message'=>'Search error - invalid token'}}
325
- )
326
- return false
327
- end
328
- true
329
- end
330
-
331
- def _delete_search
332
- [:search, :search_page, :search_token, :search_errors].each do |search_doc|
333
- @client.flash_data(search_doc)
334
- end
335
- end
336
-
337
- def _do_search(params={})
338
- # call source adapter search unless client is sending token for ack
339
- search_params = params[:search] if params
340
- res = @source_sync.search(@client.id,search_params) if params.nil? or !params[:token]
341
- res,diffsize = @source.is_pass_through? ? [res,res.size] : compute_search
342
- formatted_res = _format_search_result(res,diffsize)
343
- _delete_search if diffsize == 0
344
- formatted_res
345
- end
346
-
347
- def _format_search_result(res={},diffsize=nil)
348
- error = @client.get_data(:search_errors)
349
- if not error.empty?
350
- [ {'version'=>SYNC_VERSION},
351
- {'source'=>@source.name},
352
- {'search-error'=>error} ]
353
- else
354
- search_token = @client.get_value(:search_token)
355
- search_token ||= ''
356
- return [] if res.empty?
357
- [ {'version'=>SYNC_VERSION},
358
- {'token' => search_token},
359
- {'source'=>@source.name},
360
- {'count'=>res.size},
361
- {'insert'=>res} ]
362
- end
363
- end
364
-
365
- def _receive_cud(operation,params)
366
- return 0 if not ['create','update','delete'].include?(operation)
367
- @source.lock(operation) { |s| s.put_zdata(operation,@client.id,params,true) }
368
- return 1
369
- end
370
-
371
- def _process_blobs(params)
372
- unless params[:blob_fields].nil?
373
- [:create,:update].each do |utype|
374
- objects = params[utype] || {}
375
- objects.each do |id,obj|
376
- params[:blob_fields].each do |field|
377
- blob = params["#{field}-#{id}"]
378
- obj[field] = @client.app.store_blob(obj,field,blob)
379
- end
380
- end
381
- end
382
- end
383
- end
384
-
385
- def _ack_token(token)
386
- stored_token = @client.get_value(:page_token)
387
- if stored_token
388
- if token and stored_token == token
389
- @client.put_value(:page_token,nil)
390
- @client.flash_data(:schema_page)
391
- @client.flash_data(:metadata_page)
392
- @client.flash_data(:create_links_page)
393
- @client.flash_data(:page)
394
- @client.flash_data(:delete_page)
395
- _delete_errors_page
396
- return true
397
- end
398
- else
399
- return true
400
- end
401
- false
402
- end
403
-
404
- def _delete_errors_page
405
- ['create','update','delete'].each do |operation|
406
- @client.flash_data("#{operation}_errors_page")
407
- end
408
- @client.flash_data("update_rollback_page")
409
- end
410
-
411
- def _send_errors
412
- res = {}
413
- ['create','update','delete'].each do |operation|
414
- res["#{operation}-error"] = @client.get_data("#{operation}_errors_page")
415
- end
416
- res["source-error"] = @source.lock(:errors) { |s| s.get_data(:errors) }
417
- res["update-rollback"] = @client.get_data(:update_rollback_page)
418
- res.reject! {|key,value| value.nil? or value.empty?}
419
- res
420
- end
421
-
422
- def _format_result(token,progress_count,total_count,res)
423
- count = 0
424
- count += res['insert'].length if res['insert']
425
- count += res['delete'].length if res['delete']
426
- [ {'version'=>SYNC_VERSION},
427
- {'token'=>(token ? token : '')},
428
- {'count'=>count},
429
- {'progress_count'=>progress_count},
430
- {'total_count'=>total_count},
431
- res ]
432
- end
433
- end
434
- end
@@ -1,91 +0,0 @@
1
- require 'json'
2
- require 'rest_client'
3
- require 'uri'
4
-
5
- module Rhoconnect
6
-
7
- class DynamicAdapter < SourceAdapter
8
- attr_accessor :uri, :partition
9
-
10
- def initialize(source, partition=nil, uri=nil)
11
- @source = source
12
- @uri = uri || Rhoconnect.appserver
13
- @partition = partition || @source.user_id
14
-
15
- if @uri
16
- @uri = URI.parse(@uri)
17
- user = @uri.user
18
- @uri.user = nil
19
- @uri = @uri.to_s
20
- end
21
-
22
- @token = Rhoconnect.api_token || user
23
- raise Exception.new("Please provide a :token or set it in uri") unless @token
24
- super(source)
25
- end
26
-
27
- def self.authenticate(login,password)
28
- hsh = {:login => login, :password => password, :api_token => Rhoconnect.api_token}.to_json
29
- headers = {:content_type => :json, :accept => :json}
30
- RestClient.post "#{Rhoconnect.appserver}/rhoconnect/authenticate", hsh, headers
31
- end
32
-
33
- def query(params=nil)
34
- @result={}
35
- @result = JSON.parse(send_objects('query',@source.name, @partition, params))
36
- end
37
-
38
- def create(create_hash)
39
- send_objects('create',@source.name, @partition, create_hash)
40
- end
41
-
42
- def update(update_hash)
43
- send_objects('update',@source.name, @partition, update_hash)
44
- end
45
-
46
- def delete(delete_hash)
47
- send_objects('delete',@source.name, @partition, delete_hash)
48
- end
49
-
50
- #protected
51
-
52
- def validate_args(action, source_name, partition, obj = {}) # :nodoc:
53
- raise Exception.new("Please set uri in your settings or through console") unless @uri
54
- raise ArgumentError.new("Missing object id for #{obj.inspect}") if ['update','delete'].include? action and not obj.has_key?('id')
55
- raise ArgumentError.new("Missing source_name.") if source_name.empty?
56
- #raise ArgumentError.new("Missing partition for #{model}.") unless partition or partition.blank?
57
- end
58
-
59
- def send_objects(action, source_name, partition, obj = {}) # :nodoc:
60
- validate_args(action, source_name, partition, obj)
61
- process(:post, "/rhoconnect/#{action}",
62
- {
63
- :resource => source_name,
64
- :partition => partition,
65
- :attributes => obj
66
- }
67
- )
68
- end
69
-
70
- def resource(path) # :nodoc:
71
- RestClient::Resource.new(@uri)[path]
72
- end
73
-
74
- def process(method, path, payload = nil) # :nodoc:
75
- headers = api_headers
76
- payload = payload.merge!(:api_token => @token).to_json
77
- args = [method, payload, headers].compact
78
- response = resource(path).send(*args)
79
- response
80
- end
81
-
82
- def api_headers # :nodoc:
83
- {
84
- :content_type => :json,
85
- :accept => :json
86
- }
87
- end
88
-
89
- end
90
-
91
- end
@@ -1,23 +0,0 @@
1
- require 'rhoconnect/middleware/helpers'
2
-
3
- module Rhoconnect
4
- module Middleware
5
- class AdminUser
6
- def initialize(app, opts={})
7
- @app = app
8
- yield self if block_given?
9
- end
10
-
11
- def call(env)
12
- begin
13
- if Rhoconnect.is_admin_route(env)
14
- env[Rhoconnect::CURRENT_USER] = Rhoconnect.extract_api_user(env)
15
- end
16
- rescue Rhoconnect::ApiException => ae
17
- return [422, {'Content-Type' => 'text/plain'}, [ae.message]]
18
- end
19
- @app.call(env)
20
- end
21
- end
22
- end
23
- end
@@ -1,16 +0,0 @@
1
- require 'rhoconnect/middleware/helpers'
2
-
3
- module Rhoconnect
4
- module Middleware
5
- class CurrentRequest
6
- def initialize(app)
7
- @app = app
8
- end
9
-
10
- def call(env)
11
- env[Rhoconnect::CURRENT_REQUEST] = Rack::Request.new(env)
12
- @app.call(env)
13
- end
14
- end
15
- end
16
- end
@@ -1,22 +0,0 @@
1
- require 'rhoconnect/middleware/helpers'
2
-
3
- module Rhoconnect
4
- module Middleware
5
- class LoginRequired
6
- def initialize(app)
7
- @app = app
8
- end
9
-
10
- def call(env)
11
- begin
12
- if Rhoconnect.is_login_required(env)
13
- raise LoginException.new("Not authenticated") if env[Rhoconnect::CURRENT_USER].nil?
14
- end
15
- @app.call(env)
16
- rescue LoginException => le
17
- return [401, {'Content-Type' => 'text/plain'}, le.message]
18
- end
19
- end
20
- end
21
- end
22
- end