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