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.
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