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,26 +1,25 @@
1
1
  module Rhoconnect
2
- # Taken from http://github.com/voloko/redis-model
2
+ # Taken from http://github.com/voloko/store-model
3
3
  #
4
- # Simple models for redis-rb.
5
-
6
- class Model
4
+ # Simple ORM for store-rb.
5
+ class StoreOrm
7
6
  attr_accessor :id
8
7
 
9
8
  def initialize(id=nil)
10
9
  self.id = id
11
10
  end
12
11
 
13
- def redis #:nodoc:
14
- self.class.redis
12
+ def store #:nodoc:
13
+ self.class.store
15
14
  end
16
15
 
17
16
  # Issues delete commands for all defined fields
18
17
  def delete(name = nil)
19
18
  if name
20
- redis.del field_key(name.to_s)
19
+ store.delete_value(field_key(name.to_s))
21
20
  else
22
21
  self.class.fields.each do |field|
23
- redis.del field_key(field[:name])
22
+ store.delete_value(field_key(field[:name]))
24
23
  end
25
24
  end
26
25
  end
@@ -33,22 +32,22 @@ module Rhoconnect
33
32
  # specified amount.
34
33
  def increment!(name,amount=1)
35
34
  raise ArgumentError, "Only integer fields can be incremented." unless self.class.fields.include?({:name => name.to_s, :type => :integer})
36
- redis.incrby(field_key(name), amount)
35
+ store.update_count(field_key(name), amount)
37
36
  end
38
37
 
39
38
  # Decrement the specified integer field by 1 or the
40
39
  # specified amount.
41
40
  def decrement!(name,amount=1)
42
41
  raise ArgumentError, "Only integer fields can be decremented." unless self.class.fields.include?({:name => name.to_s, :type => :integer})
43
- redis.decrby(field_key(name), amount)
42
+ store.update_count(field_key(name), -amount)
44
43
  end
45
44
 
46
45
  def next_id #:nodoc:
47
- redis.incr "sequence:#{self.prefix}:id"
46
+ store.incr "sequence:#{self.prefix}:id"
48
47
  end
49
48
 
50
49
  def self.is_exist?(id)
51
- !redis.get(self._field_key(self._prefix,id,'rho__id')).nil?
50
+ !store.get_value(self._field_key(self._prefix,id,'rho__id')).nil?
52
51
  end
53
52
 
54
53
  def to_array
@@ -59,16 +58,6 @@ module Rhoconnect
59
58
  res
60
59
  end
61
60
 
62
- # TODO: not used anymore
63
- # def update(attribs)
64
- # self.class.fields.each do |field|
65
- # if field[:name] != 'name' and field[:name] != 'rho__id'
66
- # redis.del field_key(field[:name])
67
- # end
68
- # end
69
- # self.class.populate_attributes(self,attribs)
70
- # end
71
-
72
61
  protected
73
62
  def prefix #:nodoc:
74
63
  @prefix ||= self.class.prefix || self.class.class_prefix(self.class)
@@ -132,8 +121,8 @@ module Rhoconnect
132
121
  # Creates new model instance with given id
133
122
  alias_method :with_key, :new
134
123
  alias_method :with_next_key, :create
135
-
136
- # Defines marshaled rw accessor for redis string value
124
+
125
+ # Defines marshaled rw accessor for store string value
137
126
  def field(name, type = :string)
138
127
  if @fields.nil?
139
128
  @fields = []
@@ -146,30 +135,30 @@ module Rhoconnect
146
135
 
147
136
  fields << {:name => name.to_s, :type => type}
148
137
  if type == :string
149
- class_eval "def #{name}; @#{name} ||= redis[field_key('#{name}')]; end"
150
- class_eval "def #{name}=(value); @#{name} = redis[field_key('#{name}')] = value; end"
138
+ class_eval "def #{name}; @#{name} ||= store.get_value(field_key('#{name}')); end"
139
+ class_eval "def #{name}=(value); @#{name} = value.to_s; store.put_value(field_key('#{name}'), value.to_s); end"
151
140
  else
152
- class_eval "def #{name}; @#{name} ||= Marshal::#{class_name}.load(redis[field_key('#{name}')]); end"
153
- class_eval "def #{name}=(value); @#{name} = value; redis[field_key('#{name}')] = Marshal::#{class_name}.dump(value); end"
141
+ class_eval "def #{name}; @#{name} ||= Marshal::#{class_name}.load(store.get_value(field_key('#{name}'))); end"
142
+ class_eval "def #{name}=(value); @#{name} = value; store.put_value(field_key('#{name}'), Marshal::#{class_name}.dump(value)); end"
154
143
  end
155
144
  end
156
145
  alias_method :value, :field
157
146
 
158
- # Defines accessor for redis list
147
+ # Defines accessor for store list
159
148
  def list(name, type = :string)
160
149
  class_name = marshal_class_name(name, type)
161
150
 
162
151
  fields << {:name => name.to_s, :type => :list}
163
- class_eval "def #{name}; @#{name} ||= ListProxy.new(self.redis, field_key('#{name}'), Marshal::#{class_name}); end"
152
+ class_eval "def #{name}; @#{name} ||= ListProxy.new(self.store, field_key('#{name}'), Marshal::#{class_name}); end"
164
153
  eval_writer(name)
165
154
  end
166
155
 
167
- # Defines accessor for redis set
156
+ # Defines accessor for store set
168
157
  def set(name, type = :string)
169
158
  class_name = marshal_class_name(name, type)
170
159
 
171
160
  fields << {:name => name.to_s, :type => :set}
172
- class_eval "def #{name}; @#{name} ||= SetProxy.new(self.redis, field_key('#{name}'), Marshal::#{class_name}); end"
161
+ class_eval "def #{name}; @#{name} ||= SetProxy.new(self.store, field_key('#{name}'), Marshal::#{class_name}); end"
173
162
  eval_writer(name)
174
163
  end
175
164
 
@@ -178,8 +167,8 @@ module Rhoconnect
178
167
  end
179
168
 
180
169
  # Redefine this to change connection options
181
- def redis
182
- @@redis ||= Store.db
170
+ def store
171
+ @@store ||= Store.get_store(0)
183
172
  end
184
173
 
185
174
  def fields #:nodoc:
@@ -197,6 +186,19 @@ module Rhoconnect
197
186
  field << v
198
187
  end
199
188
  end
189
+ END
190
+ end
191
+
192
+ def instance_eval_writer(name) #:nodoc:
193
+ instance_eval <<-END
194
+ def #{name}=(value)
195
+ field = self.#{name};
196
+ if value.respond_to?(:each)
197
+ value.each {|v| field << v}
198
+ else
199
+ field << v
200
+ end
201
+ end
200
202
  END
201
203
  end
202
204
 
@@ -269,146 +271,82 @@ module Rhoconnect
269
271
  end
270
272
  end
271
273
 
272
-
273
-
274
+ # PROXY implementations
274
275
  class FieldProxy #:nodoc
275
- def initialize(redis, name, marshal)
276
- @redis = redis
276
+ def initialize(store_inst, name, marshal)
277
+ # TODO: this low-level access should be removed in 4.0
278
+ @store_db = store_inst.send(:db)
277
279
  @name = name
278
280
  @marshal = marshal
279
281
  end
280
-
281
- # def method_missing(method, *argv)
282
- # translated_method = translate_method_name(method)
283
- # raise NoMethodError.new("Method '#{method}' is not defined") unless translated_method
284
- # @redis.send translated_method, @name, *argv
285
- # end
286
- #
287
- # protected
288
- # def translate_method_name(m)
289
- # m
290
- # end
291
282
  end
292
283
 
293
-
294
-
295
284
  class ListProxy < FieldProxy #:nodoc:
296
285
  def <<(v)
297
- @redis.rpush @name, @marshal.dump(v)
286
+ @store_db.rpush @name, @marshal.dump(v)
298
287
  end
299
288
  alias_method :push_tail, :<<
300
289
 
301
290
  def push_head(v)
302
- @redis.lpush @name, @marshal.dump(v)
291
+ @store_db.lpush @name, @marshal.dump(v)
303
292
  end
304
293
 
305
294
  def pop_tail
306
- @marshal.load(@redis.rpop(@name))
295
+ @marshal.load(@store_db.rpop(@name))
307
296
  end
308
297
 
309
298
  def pop_head
310
- @marshal.load(@redis.lpop(@name))
299
+ @marshal.load(@store_db.lpop(@name))
311
300
  end
312
301
 
313
302
  def [](from, to = nil)
314
303
  if to.nil?
315
- @marshal.load(@redis.lindex(@name, from))
304
+ @marshal.load(@store_db.lindex(@name, from))
316
305
  else
317
- @redis.lrange(@name, from, to).map! { |v| @marshal.load(v) }
306
+ @store_db.lrange(@name, from, to).map! { |v| @marshal.load(v) }
318
307
  end
319
308
  end
320
309
  alias_method :range, :[]
321
310
 
322
311
  def []=(index, v)
323
- @redis.lset(@name, index, @marshal.dump(v))
312
+ @store_db.lset(@name, index, @marshal.dump(v))
324
313
  end
325
314
  alias_method :set, :[]=
326
315
 
327
316
  def include?(v)
328
- @redis.exists(@name, @marshal.dump(v))
317
+ @store_db.exists(@name, @marshal.dump(v))
329
318
  end
330
319
 
331
320
  def remove(count, v)
332
- @redis.lrem(@name, count, @marshal.dump(v))
321
+ @store_db.lrem(@name, count, @marshal.dump(v))
333
322
  end
334
-
335
- # def length
336
- # @redis.llen(@name)
337
- # end
338
- #
339
- # def trim(from, to)
340
- # @redis.ltrim(@name, from, to)
341
- # end
342
- #
343
- # def to_s
344
- # range(0, 100).join(', ')
345
- # end
346
- #
347
- # protected
348
- # def translate_method_name(m)
349
- # COMMANDS[m]
350
- # end
351
323
  end
352
324
 
353
-
354
-
355
325
  class SetProxy < FieldProxy #:nodoc:
356
- # COMMANDS = {
357
- # :intersect_store => "sinterstore",
358
- # :union_store => "sunionstore",
359
- # :diff_store => "sdiffstore",
360
- # :move => "smove",
361
- # }
362
-
363
326
  def <<(v)
364
- @redis.sadd @name, @marshal.dump(v)
327
+ @store_db.sadd @name, @marshal.dump(v)
365
328
  end
366
329
  alias_method :add, :<<
367
330
 
368
331
  def delete(v)
369
- @redis.srem @name, @marshal.dump(v)
332
+ @store_db.srem @name, @marshal.dump(v)
370
333
  end
371
334
  alias_method :remove, :delete
372
335
 
373
336
  def include?(v)
374
- @redis.sismember @name, @marshal.dump(v)
337
+ @store_db.sismember @name, @marshal.dump(v)
375
338
  end
376
339
  alias_method :has_key?, :include?
377
340
  alias_method :member?, :include?
378
341
 
379
342
  def members
380
- members = @redis.smembers(@name)
343
+ members = @store_db.smembers(@name)
381
344
  if members
382
345
  members.map { |v| @marshal.load(v) }
383
346
  else
384
347
  []
385
348
  end
386
349
  end
387
-
388
- def intersect(*keys)
389
- @redis.sinter(@name, *keys).map { |v| @marshal.load(v) }
390
- end
391
-
392
- def union(*keys)
393
- @redis.sunion(@name, *keys).map { |v| @marshal.load(v) }
394
- end
395
-
396
- def diff(*keys)
397
- @redis.sdiff(@name, *keys).map { |v| @marshal.load(v) }
398
- end
399
-
400
- # def length
401
- # @redis.llen(@name)
402
- # end
403
- #
404
- # def to_s
405
- # members.join(', ')
406
- # end
407
- #
408
- # protected
409
- # def translate_method_name(m)
410
- # COMMANDS[m]
411
- # end
412
350
  end
413
351
  end
414
352
  end
@@ -141,6 +141,7 @@ namespace :rhoconnect do
141
141
  desc "Run source adapter specs"
142
142
  task :spec do
143
143
  files = File.join('spec','**','*_spec.rb')
144
+ puts "files loaded are ****** #{files}"
144
145
  RSpec::Core::RakeTask.new('rhoconnect:spec') do |t|
145
146
  t.pattern = FileList[files]
146
147
  t.rspec_opts = %w(-fn -b --color)
@@ -158,7 +159,7 @@ namespace :rhoconnect do
158
159
  system("#{cmd} config.ru -P #{rhoconnect_pid}")
159
160
  elsif jruby?
160
161
  puts 'Starting rhoconnect in jruby environment...'
161
- system("#{cmd}")
162
+ system("#{cmd} -r config.ru")
162
163
  else
163
164
  puts 'Detach with Ctrl+\ Re-attach with rake rhoconnect:attach'
164
165
  sleep 2
@@ -177,7 +178,7 @@ namespace :rhoconnect do
177
178
  system("#{cmd} config.ru -P #{rhoconnect_pid}")
178
179
  elsif jruby?
179
180
  puts 'Starting rhoconnect in jruby environment...'
180
- system("#{cmd}")
181
+ system("#{cmd} -r config.ru")
181
182
  else
182
183
  system("bundle exec #{cmd} config.ru -P #{rhoconnect_pid}")
183
184
  end
@@ -199,7 +200,7 @@ namespace :rhoconnect do
199
200
  system("#{cmd} config.ru -P #{rhoconnect_pid}")
200
201
  elsif jruby?
201
202
  puts 'Starting rhoconnect in jruby environment...'
202
- system("#{cmd}")
203
+ system("#{cmd} -r config.ru")
203
204
  else
204
205
  system("bundle exec #{cmd} config.ru -P #{rhoconnect_pid}")
205
206
  end
@@ -228,7 +229,20 @@ namespace :rhoconnect do
228
229
  if windows?
229
230
  File.delete "#{rhoconnect_pid}" if system("FOR /F %A in (#{rhoconnect_pid}) do taskkill /F /PID %A")
230
231
  else
231
- system "cat #{rhoconnect_pid} | xargs kill -3"
232
+ if File.exist?("#{rhoconnect_pid}")
233
+ pid = `cat #{rhoconnect_pid}`
234
+ puts "Sending a QUIT signal to process #{pid}"
235
+ system "kill -3 #{pid}"
236
+ count = 0
237
+ loop do
238
+ sleep 1
239
+ count += 1
240
+ exit if !File.exist?("#{rhoconnect_pid}")
241
+ break if count >= 5
242
+ end
243
+ puts "Process #{pid} is still running. Sending a KILL signal to it ..."
244
+ system "kill -9 #{pid}"
245
+ end
232
246
  end
233
247
  end
234
248
 
@@ -1,6 +1,8 @@
1
1
  module Rhoconnect
2
- class SourceAdapter
3
- attr_accessor :result
2
+ module Model
3
+ class Base
4
+ attr_accessor :result
5
+ end
4
6
  end
5
7
 
6
8
  module TestMethods
@@ -10,7 +12,7 @@ module Rhoconnect
10
12
  app_id = 'application'
11
13
  s_fields = {
12
14
  :user_id => user_id,
13
- :app_id => app_id
15
+ :app_id => app_id,
14
16
  }
15
17
  c_fields = {
16
18
  :device_type => 'Apple',
@@ -22,7 +24,14 @@ module Rhoconnect
22
24
  @u = User.create(:login => user_id)
23
25
  @s = Source.load(adapter.to_s,s_fields)
24
26
  @c = Client.create(c_fields,{:source_name => adapter.to_s})
25
- @ss = SourceSync.new(@s)
27
+
28
+ @model = Rhoconnect::Model::Base.create(@s)
29
+ handler_sync = lambda { @model.query(params[:query])}
30
+ @query_engine = Rhoconnect::Handler::Query::Engine.new(@model, handler_sync, {})
31
+ handler_cud = lambda { @model.send params[:operation].to_sym, params["#{params[:operation]}_object".to_sym] }
32
+ @cud_engine = Rhoconnect::Handler::Changes::Engine.new(['create', 'update', 'delete'], @model, handler_cud, {})
33
+ handler_search = lambda { @model.search(params[:search]) }
34
+ @search_engine = Rhoconnect::Handler::Search::Engine.new(@model, @c, handler_search, {})
26
35
  end
27
36
 
28
37
  # Executes the adapter's query method and returns
@@ -41,7 +50,7 @@ module Rhoconnect
41
50
  # "2"=>{"name"=>"Best", "industry"=>"Software"}
42
51
  # }
43
52
  def test_query
44
- res = @ss.process_query
53
+ res = @query_engine.do_sync
45
54
  return @s.is_pass_through? ? res : md
46
55
  end
47
56
 
@@ -60,7 +69,8 @@ module Rhoconnect
60
69
  def test_search(search_params)
61
70
  pass_through = @s.pass_through
62
71
  @s.pass_through = 'true'
63
- res = @ss.search(@c.id, search_params)
72
+ @search_engine.params[:search] = search_params
73
+ res = @search_engine.do_search
64
74
  @s.pass_through = pass_through
65
75
  res
66
76
  end
@@ -93,7 +103,7 @@ module Rhoconnect
93
103
  # {'index' => view}.to_json
94
104
  # }
95
105
  def test_metadata
96
- @ss.process_query
106
+ @query_engine.do_sync
97
107
  return @s.get_value(:metadata)
98
108
  end
99
109
 
@@ -119,7 +129,7 @@ module Rhoconnect
119
129
  # }.to_json
120
130
  # test_schema would return the above
121
131
  def test_schema
122
- @ss.process_query
132
+ @query_engine.do_sync
123
133
  return @s.get_value(:schema)
124
134
  end
125
135
 
@@ -150,10 +160,11 @@ module Rhoconnect
150
160
  # document (:md) should also contain the new record.
151
161
  def test_create(record)
152
162
  if @s.is_pass_through?
153
- @ss.pass_through_cud({'create'=> {'temp-id' => record}},nil)
163
+ @cud_engine.params = {'create'=> {'temp-id' => record}}
164
+ @cud_engine.do_pass_through_cud
154
165
  else
155
- @s.put_zdata(:create,@c.id,{'temp-id' => record},true)
156
- @ss.process_cud
166
+ @s.push_queue(:create,@c.id,{'temp-id' => record},true)
167
+ @cud_engine.do_cud
157
168
  links = @c.get_data(:create_links)['temp-id']
158
169
  links ? links['l'] : nil
159
170
  end
@@ -179,10 +190,11 @@ module Rhoconnect
179
190
  # as shown above
180
191
  def test_update(record)
181
192
  if @s.is_pass_through?
182
- @ss.pass_through_cud({'update'=> record },nil)
193
+ @cud_engine.params = {'update'=> record }
194
+ @cud_engine.do_pass_through_cud
183
195
  else
184
- @s.put_zdata(:update,@c.id,record,true)
185
- @ss.process_cud
196
+ @s.push_queue(:update,@c.id,record,true)
197
+ @cud_engine.do_cud
186
198
  end
187
199
  end
188
200
 
@@ -212,10 +224,11 @@ module Rhoconnect
212
224
  # verified as shown above.
213
225
  def test_delete(record)
214
226
  if @s.is_pass_through?
215
- @ss.pass_through_cud({'delete'=> record },nil)
227
+ @cud_engine.params = {'delete'=> record }
228
+ @cud_engine.do_pass_through_cud
216
229
  else
217
- @s.put_zdata(:delete,@c.id,record,true)
218
- @ss.process_cud
230
+ @s.push_queue(:delete,@c.id,record,true)
231
+ @cud_engine.do_cud
219
232
  end
220
233
  end
221
234
 
@@ -3,7 +3,7 @@ require 'digest/sha1'
3
3
  module Rhoconnect
4
4
  # Inspired by sinatra-authentication
5
5
  # Password uses simple sha1 digest for hashing
6
- class User < Model
6
+ class User < StoreOrm
7
7
  field :login,:string
8
8
  field :email,:string
9
9
  field :salt,:string
@@ -11,13 +11,14 @@ module Rhoconnect
11
11
  set :clients, :string
12
12
  field :admin, :int
13
13
  field :token_id, :string
14
-
14
+ #set_all :users, :string
15
+
15
16
  class << self
16
17
  def create(fields={})
17
18
  raise ArgumentError.new("Empty login") if (fields[:login].nil? or fields[:login].empty?)
18
19
  raise ArgumentError.new("Reserved user id #{fields[:login]}") if fields[:login] && fields[:login] == '__shared__'
19
20
  fields[:id] = fields[:login]
20
- user = super(fields)
21
+ user = super(fields)
21
22
  if Rhoconnect.stats
22
23
  Rhoconnect::Stats::Record.set('users') { Store.incr('user:count') }
23
24
  else
@@ -25,14 +26,19 @@ module Rhoconnect
25
26
  end
26
27
  user
27
28
  end
28
-
29
+
29
30
  def authenticate(login,password)
30
31
  return unless is_exist?(login)
31
32
  current_user = load(login)
32
33
  return if current_user.nil?
33
34
  return current_user if User.encrypt(password, current_user.salt) == current_user.hashed_password
34
35
  end
35
-
36
+
37
+ # Rails like methods
38
+ def all
39
+ App.load(APP_NAME).users.members
40
+ end
41
+
36
42
  def ping(params)
37
43
  if params['async']
38
44
  PingJob.enqueue(params)
@@ -41,17 +47,17 @@ module Rhoconnect
41
47
  end
42
48
  end
43
49
  end
44
-
50
+
45
51
  def new_password=(pass)
46
52
  self.password=(pass)
47
53
  end
48
-
54
+
49
55
  def password=(pass)
50
56
  @password = pass
51
57
  self.salt = User.random_string(10) if !self.salt
52
58
  self.hashed_password = User.encrypt(@password, self.salt)
53
59
  end
54
-
60
+
55
61
  def delete
56
62
  clients.members.each do |client_id|
57
63
  Client.load(client_id,{:source_name => '*'}).delete
@@ -64,31 +70,43 @@ module Rhoconnect
64
70
  end
65
71
  super
66
72
  end
67
-
73
+
68
74
  def create_token
69
75
  if self.token_id && ApiToken.is_exist?(self.token_id)
70
- self.token.delete
76
+ self.token.delete
71
77
  end
72
- self.token_id = ApiToken.create(:user_id => self.login).id
78
+ fields = {:user_id => self.login}
79
+ if self.login == 'rhoadmin'
80
+ fields[:value] = Rhoconnect.api_token
81
+ end
82
+ self.token_id = ApiToken.create(fields).id
73
83
  end
74
-
84
+
75
85
  def token
76
86
  ApiToken.load(self.token_id)
77
87
  end
78
-
88
+
79
89
  def token=(value)
80
90
  if self.token_id && ApiToken.is_exist?(self.token_id)
81
- self.token.delete
91
+ self.token.delete
82
92
  end
83
93
  self.token_id = ApiToken.create(:user_id => self.login, :value => value).id
84
94
  end
85
-
95
+
86
96
  def update(fields)
87
97
  fields.each do |key,value|
88
98
  self.send("#{key.to_sym}=", value) unless key == 'login'
89
- end
99
+ end
100
+ end
101
+
102
+ def to_hash
103
+ res = {}
104
+ self.class.fields.each do |field|
105
+ res[field[:name].to_sym] = send(field[:name].to_sym) if field[:name] == 'login'
106
+ end
107
+ res
90
108
  end
91
-
109
+
92
110
  protected
93
111
  def self.encrypt(pass, salt)
94
112
  Digest::SHA1.hexdigest(pass+salt)
@@ -115,6 +115,6 @@ EOF
115
115
  # end
116
116
 
117
117
  def trinidad?
118
- 'bundle exec jruby -S trinidad -p 9292 -r config.ru'
118
+ 'bundle exec jruby -S trinidad'
119
119
  end
120
120
  end #Utilities
@@ -1,3 +1,3 @@
1
1
  module Rhoconnect
2
- VERSION = '3.4.5'
3
- end
2
+ VERSION = '4.0.0.beta.10'
3
+ end