rhoconnect 3.0.0.beta1

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 (361) hide show
  1. data/CHANGELOG +208 -0
  2. data/CREDITS +38 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +97 -0
  5. data/LICENSE +75 -0
  6. data/README.md +10 -0
  7. data/Rakefile +82 -0
  8. data/bench/bench +7 -0
  9. data/bench/bench_runner.rb +112 -0
  10. data/bench/benchapp/Gemfile +21 -0
  11. data/bench/benchapp/Gemfile.lock +76 -0
  12. data/bench/benchapp/Rakefile +22 -0
  13. data/bench/benchapp/application.rb +39 -0
  14. data/bench/benchapp/config.ru +36 -0
  15. data/bench/benchapp/settings/license.key +1 -0
  16. data/bench/benchapp/settings/settings.yml +20 -0
  17. data/bench/benchapp/sources/mock_adapter.rb +55 -0
  18. data/bench/benchapp/sources/queue_mock_adapter.rb +2 -0
  19. data/bench/benchapp/spec/sources/mock_adapter_spec.rb +25 -0
  20. data/bench/benchapp/spec/sources/queue_mock_adapter_spec.rb +25 -0
  21. data/bench/benchapp/spec/spec_helper.rb +42 -0
  22. data/bench/blobapp/Gemfile +31 -0
  23. data/bench/blobapp/Gemfile.lock +103 -0
  24. data/bench/blobapp/Rakefile +25 -0
  25. data/bench/blobapp/application.rb +44 -0
  26. data/bench/blobapp/config.ru +36 -0
  27. data/bench/blobapp/settings/license.key +1 -0
  28. data/bench/blobapp/settings/settings.yml +16 -0
  29. data/bench/blobapp/sources/blob_adapter.rb +71 -0
  30. data/bench/blobapp/spec/sources/blob_adapter_spec.rb +25 -0
  31. data/bench/blobapp/spec/spec_helper.rb +42 -0
  32. data/bench/lib/bench/cli.rb +16 -0
  33. data/bench/lib/bench/logging.rb +13 -0
  34. data/bench/lib/bench/mock_client.rb +41 -0
  35. data/bench/lib/bench/result.rb +50 -0
  36. data/bench/lib/bench/runner.rb +107 -0
  37. data/bench/lib/bench/session.rb +67 -0
  38. data/bench/lib/bench/statistics.rb +56 -0
  39. data/bench/lib/bench/test_data.rb +98 -0
  40. data/bench/lib/bench/timer.rb +10 -0
  41. data/bench/lib/bench/utils.rb +49 -0
  42. data/bench/lib/bench.rb +129 -0
  43. data/bench/lib/testdata/100-data.txt +148 -0
  44. data/bench/lib/testdata/5-data.txt +9 -0
  45. data/bench/lib/testdata/images/icon.ico +0 -0
  46. data/bench/lib/testdata/images/icon.png +0 -0
  47. data/bench/lib/testdata/images/loading-Landscape.png +0 -0
  48. data/bench/lib/testdata/images/loading-LandscapeLeft.png +0 -0
  49. data/bench/lib/testdata/images/loading-LandscapeRight.png +0 -0
  50. data/bench/lib/testdata/images/loading-Portrait.png +0 -0
  51. data/bench/lib/testdata/images/loading-PortraitUpsideDown.png +0 -0
  52. data/bench/lib/testdata/images/loading.png +0 -0
  53. data/bench/lib/testdata/images/loading@2x.png +0 -0
  54. data/bench/run_bench.sh +42 -0
  55. data/bench/run_blob_script.sh +3 -0
  56. data/bench/run_cud_script.sh +3 -0
  57. data/bench/run_query_md_script.sh +3 -0
  58. data/bench/run_query_only_script.sh +3 -0
  59. data/bench/run_query_script.sh +3 -0
  60. data/bench/scripts/blob_cud_script.rb +98 -0
  61. data/bench/scripts/cud_script.rb +92 -0
  62. data/bench/scripts/helpers.rb +101 -0
  63. data/bench/scripts/query_md_script.rb +45 -0
  64. data/bench/scripts/query_only_script.rb +51 -0
  65. data/bench/scripts/query_script.rb +45 -0
  66. data/bench/spec/bench_spec_helper.rb +33 -0
  67. data/bench/spec/logging_spec.rb +15 -0
  68. data/bench/spec/mock_adapter_spec.rb +61 -0
  69. data/bench/spec/mock_client_spec.rb +65 -0
  70. data/bench/spec/result_spec.rb +61 -0
  71. data/bench/spec/utils_spec.rb +36 -0
  72. data/bin/rhoconnect +34 -0
  73. data/bin/rhoconnect-setup +84 -0
  74. data/doc/async-jobs.txt +69 -0
  75. data/doc/authentication.txt +76 -0
  76. data/doc/benchmarks.txt +168 -0
  77. data/doc/blob-sync.txt +130 -0
  78. data/doc/bulk-sync.txt +102 -0
  79. data/doc/client.txt +432 -0
  80. data/doc/command-line.txt +210 -0
  81. data/doc/contributing.txt +60 -0
  82. data/doc/deploying.txt +82 -0
  83. data/doc/install.txt +28 -0
  84. data/doc/introduction.txt +20 -0
  85. data/doc/licensing.txt +18 -0
  86. data/doc/metadata.txt +458 -0
  87. data/doc/migration.txt +182 -0
  88. data/doc/public/css/print.css +29 -0
  89. data/doc/public/css/screen.css +257 -0
  90. data/doc/public/css/style.css +20 -0
  91. data/doc/push.txt +135 -0
  92. data/doc/release.txt +41 -0
  93. data/doc/rest-api.txt +367 -0
  94. data/doc/source-adapters.txt +325 -0
  95. data/doc/stats-middleware.txt +69 -0
  96. data/doc/testing.txt +222 -0
  97. data/doc/tutorial.txt +315 -0
  98. data/doc/web-console.txt +35 -0
  99. data/examples/simple/Rakefile +14 -0
  100. data/examples/simple/application.rb +27 -0
  101. data/examples/simple/config.ru +49 -0
  102. data/examples/simple/settings/license.key +1 -0
  103. data/examples/simple/settings/settings.yml +23 -0
  104. data/examples/simple/sources/sample_adapter.rb +5 -0
  105. data/examples/simple/sources/simple_adapter.rb +5 -0
  106. data/generators/rhoconnect.rb +119 -0
  107. data/generators/templates/application/Gemfile +21 -0
  108. data/generators/templates/application/Rakefile +22 -0
  109. data/generators/templates/application/application.rb +39 -0
  110. data/generators/templates/application/config.ru +36 -0
  111. data/generators/templates/application/settings/license.key +1 -0
  112. data/generators/templates/application/settings/settings.yml +14 -0
  113. data/generators/templates/application/spec/spec_helper.rb +42 -0
  114. data/generators/templates/source/source_adapter.rb +47 -0
  115. data/generators/templates/source/source_spec.rb +25 -0
  116. data/install.sh +408 -0
  117. data/installer/unix-like/rho_connect_install_checkers.rb +140 -0
  118. data/installer/unix-like/rho_connect_install_constants.rb +51 -0
  119. data/installer/unix-like/rho_connect_install_debian.rb +63 -0
  120. data/installer/unix-like/rho_connect_install_dnd.rb +58 -0
  121. data/installer/unix-like/rho_connect_install_get_params.rb +30 -0
  122. data/installer/unix-like/rho_connect_install_installers.rb +142 -0
  123. data/installer/unix-like/rho_connect_install_utilities.rb +85 -0
  124. data/installer/unix-like/rho_connect_install_yum.rb +63 -0
  125. data/installer/unix-like/rhoinstaller.rb +89 -0
  126. data/installer/utils/create_texts.rb +366 -0
  127. data/installer/utils/install_test.rb +140 -0
  128. data/installer/windows/EnvVarUpdate.nsh +328 -0
  129. data/installer/windows/ServiceLib.nsh +369 -0
  130. data/installer/windows/configUi.ini +44 -0
  131. data/installer/windows/icon.ico +0 -0
  132. data/installer/windows/rhosync.nsi +418 -0
  133. data/installer/windows/uninstall.bat +7 -0
  134. data/lib/rhoconnect/api/admin/get_api_token.rb +14 -0
  135. data/lib/rhoconnect/api/admin/get_license_info.rb +8 -0
  136. data/lib/rhoconnect/api/admin/login.rb +6 -0
  137. data/lib/rhoconnect/api/admin/reset.rb +10 -0
  138. data/lib/rhoconnect/api/admin/stats.rb +21 -0
  139. data/lib/rhoconnect/api/application/bulk_data.rb +7 -0
  140. data/lib/rhoconnect/api/application/clientcreate.rb +8 -0
  141. data/lib/rhoconnect/api/application/clientlogin.rb +6 -0
  142. data/lib/rhoconnect/api/application/clientregister.rb +6 -0
  143. data/lib/rhoconnect/api/application/clientreset.rb +6 -0
  144. data/lib/rhoconnect/api/application/query.rb +7 -0
  145. data/lib/rhoconnect/api/application/queue_updates.rb +6 -0
  146. data/lib/rhoconnect/api/application/search.rb +6 -0
  147. data/lib/rhoconnect/api/client/create_client.rb +3 -0
  148. data/lib/rhoconnect/api/client/delete_client.rb +5 -0
  149. data/lib/rhoconnect/api/client/get_client_params.rb +3 -0
  150. data/lib/rhoconnect/api/client/list_client_docs.rb +12 -0
  151. data/lib/rhoconnect/api/client/list_clients.rb +3 -0
  152. data/lib/rhoconnect/api/client/ping.rb +7 -0
  153. data/lib/rhoconnect/api/source/get_adapter.rb +3 -0
  154. data/lib/rhoconnect/api/source/get_db_doc.rb +7 -0
  155. data/lib/rhoconnect/api/source/get_source_params.rb +3 -0
  156. data/lib/rhoconnect/api/source/list_source_docs.rb +10 -0
  157. data/lib/rhoconnect/api/source/list_sources.rb +15 -0
  158. data/lib/rhoconnect/api/source/push_deletes.rb +8 -0
  159. data/lib/rhoconnect/api/source/push_objects.rb +8 -0
  160. data/lib/rhoconnect/api/source/save_adapter.rb +3 -0
  161. data/lib/rhoconnect/api/source/set_db_doc.rb +8 -0
  162. data/lib/rhoconnect/api/source/set_refresh_time.rb +8 -0
  163. data/lib/rhoconnect/api/source/upload_file.rb +4 -0
  164. data/lib/rhoconnect/api/user/create_user.rb +7 -0
  165. data/lib/rhoconnect/api/user/delete_user.rb +9 -0
  166. data/lib/rhoconnect/api/user/list_users.rb +3 -0
  167. data/lib/rhoconnect/api/user/update_user.rb +4 -0
  168. data/lib/rhoconnect/api_token.rb +19 -0
  169. data/lib/rhoconnect/app.rb +76 -0
  170. data/lib/rhoconnect/bulk_data/bulk_data.rb +88 -0
  171. data/lib/rhoconnect/bulk_data/syncdb.index.schema +4 -0
  172. data/lib/rhoconnect/bulk_data/syncdb.schema +41 -0
  173. data/lib/rhoconnect/bulk_data.rb +2 -0
  174. data/lib/rhoconnect/client.rb +96 -0
  175. data/lib/rhoconnect/client_sync.rb +412 -0
  176. data/lib/rhoconnect/console/app/helpers/auth_helper.rb +22 -0
  177. data/lib/rhoconnect/console/app/helpers/extensions.rb +19 -0
  178. data/lib/rhoconnect/console/app/helpers/helpers.rb +57 -0
  179. data/lib/rhoconnect/console/app/public/ThickBox.css +649 -0
  180. data/lib/rhoconnect/console/app/public/home.css +438 -0
  181. data/lib/rhoconnect/console/app/public/images/foot_logo_rhoconnect.png +0 -0
  182. data/lib/rhoconnect/console/app/public/images/header_halo.jpg +0 -0
  183. data/lib/rhoconnect/console/app/public/images/land_separator.gif +0 -0
  184. data/lib/rhoconnect/console/app/public/images/landing_header.jpg +0 -0
  185. data/lib/rhoconnect/console/app/public/images/logo_rhoconnect.png +0 -0
  186. data/lib/rhoconnect/console/app/public/images/rhomobile_rhohub_logo.png +0 -0
  187. data/lib/rhoconnect/console/app/public/images/tabs_separator.png +0 -0
  188. data/lib/rhoconnect/console/app/public/jqplot/excanvas.min.js +35 -0
  189. data/lib/rhoconnect/console/app/public/jqplot/jqplot.barRenderer.min.js +34 -0
  190. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisLabelRenderer.js +187 -0
  191. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisTickRenderer.js +226 -0
  192. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasTextRenderer.js +408 -0
  193. data/lib/rhoconnect/console/app/public/jqplot/jqplot.categoryAxisRenderer.min.js +34 -0
  194. data/lib/rhoconnect/console/app/public/jqplot/jqplot.cursor.js +952 -0
  195. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.js +313 -0
  196. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.min.js +34 -0
  197. data/lib/rhoconnect/console/app/public/jqplot/jqplot.pointLabels.min.js +34 -0
  198. data/lib/rhoconnect/console/app/public/jqplot/jquery-1.4.2.min.js +154 -0
  199. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.css +1 -0
  200. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.js +34 -0
  201. data/lib/rhoconnect/console/app/public/main.css +7 -0
  202. data/lib/rhoconnect/console/app/public/reset.css +76 -0
  203. data/lib/rhoconnect/console/app/public/style.css +2201 -0
  204. data/lib/rhoconnect/console/app/public/text.txt +0 -0
  205. data/lib/rhoconnect/console/app/routes/adapter.rb +28 -0
  206. data/lib/rhoconnect/console/app/routes/auth.rb +29 -0
  207. data/lib/rhoconnect/console/app/routes/client.rb +31 -0
  208. data/lib/rhoconnect/console/app/routes/docs.rb +145 -0
  209. data/lib/rhoconnect/console/app/routes/heroku.rb +19 -0
  210. data/lib/rhoconnect/console/app/routes/home.rb +63 -0
  211. data/lib/rhoconnect/console/app/routes/timing.rb +242 -0
  212. data/lib/rhoconnect/console/app/routes/user.rb +117 -0
  213. data/lib/rhoconnect/console/app/views/adapter.erb +16 -0
  214. data/lib/rhoconnect/console/app/views/client.erb +30 -0
  215. data/lib/rhoconnect/console/app/views/content.erb +14 -0
  216. data/lib/rhoconnect/console/app/views/doc.erb +8 -0
  217. data/lib/rhoconnect/console/app/views/docdata.erb +28 -0
  218. data/lib/rhoconnect/console/app/views/docs.erb +30 -0
  219. data/lib/rhoconnect/console/app/views/edituser.erb +13 -0
  220. data/lib/rhoconnect/console/app/views/headermenu.erb +40 -0
  221. data/lib/rhoconnect/console/app/views/home.erb +24 -0
  222. data/lib/rhoconnect/console/app/views/index.erb +58 -0
  223. data/lib/rhoconnect/console/app/views/jqplot.erb +52 -0
  224. data/lib/rhoconnect/console/app/views/layout.erb +165 -0
  225. data/lib/rhoconnect/console/app/views/login.erb +26 -0
  226. data/lib/rhoconnect/console/app/views/newuser.erb +17 -0
  227. data/lib/rhoconnect/console/app/views/ping.erb +28 -0
  228. data/lib/rhoconnect/console/app/views/result.erb +11 -0
  229. data/lib/rhoconnect/console/app/views/rightboxlinks.erb +15 -0
  230. data/lib/rhoconnect/console/app/views/select_doc.erb +17 -0
  231. data/lib/rhoconnect/console/app/views/upload_doc.erb +23 -0
  232. data/lib/rhoconnect/console/app/views/user.erb +29 -0
  233. data/lib/rhoconnect/console/app/views/users.erb +12 -0
  234. data/lib/rhoconnect/console/rhoconnect_api.rb +245 -0
  235. data/lib/rhoconnect/console/server.rb +32 -0
  236. data/lib/rhoconnect/console.rb +3 -0
  237. data/lib/rhoconnect/cors.rb +229 -0
  238. data/lib/rhoconnect/credential.rb +9 -0
  239. data/lib/rhoconnect/db_adapter.rb +46 -0
  240. data/lib/rhoconnect/document.rb +49 -0
  241. data/lib/rhoconnect/dynamic_adapter.rb +91 -0
  242. data/lib/rhoconnect/generator.rb +1 -0
  243. data/lib/rhoconnect/jobs/bulk_data_job.rb +203 -0
  244. data/lib/rhoconnect/jobs/ping_job.rb +46 -0
  245. data/lib/rhoconnect/jobs/source_job.rb +16 -0
  246. data/lib/rhoconnect/license.rb +86 -0
  247. data/lib/rhoconnect/lock_ops.rb +11 -0
  248. data/lib/rhoconnect/model.rb +414 -0
  249. data/lib/rhoconnect/ping/android.rb +56 -0
  250. data/lib/rhoconnect/ping/apple.rb +52 -0
  251. data/lib/rhoconnect/ping/blackberry.rb +56 -0
  252. data/lib/rhoconnect/ping.rb +3 -0
  253. data/lib/rhoconnect/read_state.rb +31 -0
  254. data/lib/rhoconnect/rho_indifferent_access.rb +88 -0
  255. data/lib/rhoconnect/server/views/index.erb +13 -0
  256. data/lib/rhoconnect/server.rb +286 -0
  257. data/lib/rhoconnect/source.rb +289 -0
  258. data/lib/rhoconnect/source_adapter.rb +123 -0
  259. data/lib/rhoconnect/source_sync.rb +302 -0
  260. data/lib/rhoconnect/stats/middleware.rb +20 -0
  261. data/lib/rhoconnect/stats/record.rb +108 -0
  262. data/lib/rhoconnect/store.rb +232 -0
  263. data/lib/rhoconnect/tasks.rb +350 -0
  264. data/lib/rhoconnect/test_methods.rb +220 -0
  265. data/lib/rhoconnect/user.rb +95 -0
  266. data/lib/rhoconnect/version.rb +3 -0
  267. data/lib/rhoconnect/x_domain_session_wrapper.rb +53 -0
  268. data/lib/rhoconnect.rb +285 -0
  269. data/rhoconnect.gemspec +67 -0
  270. data/spec/api/admin/api_token_spec.rb +14 -0
  271. data/spec/api/admin/get_api_token_spec.rb +36 -0
  272. data/spec/api/admin/get_license_info_spec.rb +38 -0
  273. data/spec/api/admin/reset_spec.rb +22 -0
  274. data/spec/api/admin/stats_spec.rb +66 -0
  275. data/spec/api/api_helper.rb +21 -0
  276. data/spec/api/application/rhoconnect_api_spec.rb +548 -0
  277. data/spec/api/client/create_client_spec.rb +13 -0
  278. data/spec/api/client/delete_client_spec.rb +13 -0
  279. data/spec/api/client/get_client_params_spec.rb +18 -0
  280. data/spec/api/client/list_client_docs_spec.rb +32 -0
  281. data/spec/api/client/list_clients_spec.rb +22 -0
  282. data/spec/api/client/ping_spec.rb +23 -0
  283. data/spec/api/rhosync_api_spec.rb.orig +606 -0
  284. data/spec/api/source/adapter_spec.rb +29 -0
  285. data/spec/api/source/get_db_doc_spec.rb +21 -0
  286. data/spec/api/source/get_source_params_spec.rb +32 -0
  287. data/spec/api/source/list_source_docs_spec.rb +25 -0
  288. data/spec/api/source/list_sources_spec.rb +26 -0
  289. data/spec/api/source/push_deletes_spec.rb +18 -0
  290. data/spec/api/source/push_objects_spec.rb +27 -0
  291. data/spec/api/source/set_db_doc_spec.rb +19 -0
  292. data/spec/api/source/set_refresh_time_spec.rb +43 -0
  293. data/spec/api/source/upload_file_spec.rb +26 -0
  294. data/spec/api/user/create_user_spec.rb +16 -0
  295. data/spec/api/user/delete_user_spec.rb +36 -0
  296. data/spec/api/user/list_users_spec.rb +30 -0
  297. data/spec/api/user/update_user_spec.rb +31 -0
  298. data/spec/api_token_spec.rb +14 -0
  299. data/spec/app_spec.rb +18 -0
  300. data/spec/apps/emptyapp/application.rb +27 -0
  301. data/spec/apps/emptyapp/settings/license.key +1 -0
  302. data/spec/apps/emptyapp/settings/settings.yml +14 -0
  303. data/spec/apps/rhotestapp/Rakefile +1 -0
  304. data/spec/apps/rhotestapp/application.rb +19 -0
  305. data/spec/apps/rhotestapp/config.ru +1 -0
  306. data/spec/apps/rhotestapp/settings/apple_fake_cert.pem +1 -0
  307. data/spec/apps/rhotestapp/settings/license.key +1 -0
  308. data/spec/apps/rhotestapp/settings/settings.yml +36 -0
  309. data/spec/apps/rhotestapp/sources/base_adapter.rb +9 -0
  310. data/spec/apps/rhotestapp/sources/fixed_schema_adapter.rb +28 -0
  311. data/spec/apps/rhotestapp/sources/sample_adapter.rb +71 -0
  312. data/spec/apps/rhotestapp/sources/simple_adapter.rb +41 -0
  313. data/spec/apps/rhotestapp/sources/sub_adapter.rb +7 -0
  314. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +8 -0
  315. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +1 -0
  316. data/spec/bulk_data/bulk_data_spec.rb +97 -0
  317. data/spec/client_spec.rb +124 -0
  318. data/spec/client_sync_spec.rb +774 -0
  319. data/spec/doc/base.html +72 -0
  320. data/spec/doc/doc_spec.rb +376 -0
  321. data/spec/doc/footer.html +4 -0
  322. data/spec/doc/header.html +30 -0
  323. data/spec/document_spec.rb +31 -0
  324. data/spec/dynamic_adapter_spec.rb +43 -0
  325. data/spec/factories/factories.rb +17 -0
  326. data/spec/generator/generator_spec.rb +58 -0
  327. data/spec/generator/generator_spec_helper.rb +9 -0
  328. data/spec/jobs/bulk_data_job_spec.rb +125 -0
  329. data/spec/jobs/ping_job_spec.rb +102 -0
  330. data/spec/jobs/source_job_spec.rb +29 -0
  331. data/spec/license_spec.rb +66 -0
  332. data/spec/model_spec.rb +273 -0
  333. data/spec/perf/bulk_data_perf_spec.rb +32 -0
  334. data/spec/perf/perf_spec_helper.rb +50 -0
  335. data/spec/perf/store_perf_spec.rb +27 -0
  336. data/spec/ping/android_spec.rb +91 -0
  337. data/spec/ping/apple_spec.rb +70 -0
  338. data/spec/ping/blackberry_spec.rb +62 -0
  339. data/spec/read_state_spec.rb +35 -0
  340. data/spec/rhosync_spec.rb +75 -0
  341. data/spec/server/cors_spec.rb +287 -0
  342. data/spec/server/server_spec.rb +470 -0
  343. data/spec/server/x_domain_session_wrapper_spec.rb +150 -0
  344. data/spec/source_adapter_spec.rb +125 -0
  345. data/spec/source_spec.rb +114 -0
  346. data/spec/source_sync_spec.rb +328 -0
  347. data/spec/spec.opts +4 -0
  348. data/spec/spec_helper.rb +231 -0
  349. data/spec/stats/middleware_spec.rb +53 -0
  350. data/spec/stats/record_spec.rb +92 -0
  351. data/spec/store_spec.rb +251 -0
  352. data/spec/support/shared_examples.rb +168 -0
  353. data/spec/sync_states_spec.rb +72 -0
  354. data/spec/test_methods_spec.rb +134 -0
  355. data/spec/testdata/1000-data.txt +1414 -0
  356. data/spec/testdata/compressed/compress-data.txt +1 -0
  357. data/spec/testdata/upload1.txt +1 -0
  358. data/spec/testdata/upload2.txt +1 -0
  359. data/spec/user_spec.rb +139 -0
  360. data/tasks/redis.rake +206 -0
  361. metadata +706 -0
@@ -0,0 +1,8 @@
1
+ Server.api :push_deletes, :source do |params,user|
2
+ source = Source.load(params[:source_id],{:app_id=>APP_NAME,:user_id=>params[:user_id]})
3
+ # if source does not exist create one for dynamic adapter
4
+ source = Source.create({:name => params[:source_id]},{:app_id => APP_NAME,:user_id=>params[:user_id]}) unless source
5
+ source_sync = SourceSync.new(source)
6
+ source_sync.push_deletes(params[:objects])
7
+ 'done'
8
+ end
@@ -0,0 +1,8 @@
1
+ Server.api :push_objects, :source do |params,user|
2
+ source = Source.load(params[:source_id],{:app_id=>APP_NAME,:user_id=>params[:user_id]})
3
+ # if source does not exist create one for dynamic adapter
4
+ source = Source.create({:name => params[:source_id]},{:app_id => APP_NAME,:user_id=>params[:user_id]}) unless source
5
+ source_sync = SourceSync.new(source)
6
+ source_sync.push_objects(params[:objects])
7
+ 'done'
8
+ end
@@ -0,0 +1,3 @@
1
+ Server.api :save_adapter, :source do |params,user|
2
+ Rhoconnect.appserver = params[:attributes]['adapter_url']
3
+ end
@@ -0,0 +1,8 @@
1
+ Server.api :set_db_doc, :source do |params,user|
2
+ if params[:data_type] and params[:data_type] == 'string'
3
+ Store.put_value(params[:doc],params[:data])
4
+ else
5
+ Store.put_data(params[:doc],params[:data])
6
+ end
7
+ ''
8
+ end
@@ -0,0 +1,8 @@
1
+ Server.api :set_refresh_time, :source do |params,user|
2
+ source = Source.load(params[:source_name],
3
+ {:app_id => APP_NAME, :user_id => params[:user_name]})
4
+ source.poll_interval = params[:poll_interval] if params[:poll_interval]
5
+ params[:refresh_time] ||= 0
6
+ source.read_state.refresh_time = Time.now.to_i + params[:refresh_time].to_i
7
+ ''
8
+ end
@@ -0,0 +1,4 @@
1
+ Server.api :upload_file, :source do |params,user|
2
+ unzip_file(Rhoconnect.app_directory,params[:upload_file]) if File.exists?(Rhoconnect.app_directory)
3
+ "File uploaded"
4
+ end
@@ -0,0 +1,7 @@
1
+ Server.api :create_user, :user do |params,user|
2
+ app = App.load(APP_NAME)
3
+ u = User.create({:login => params[:attributes]['login']})
4
+ u.password = params[:attributes]['password']
5
+ app.users << u.login
6
+ "User created"
7
+ end
@@ -0,0 +1,9 @@
1
+ Server.api :delete_user, :user do |params,user|
2
+ User.load(params[:user_id]).delete
3
+ App.load(APP_NAME).users.delete(params[:user_id])
4
+ params = {:app_id => APP_NAME,:user_id => params[:user_id]}
5
+ App.load(APP_NAME).sources.each{ |source|
6
+ Source.load(source, params).flash_store_data
7
+ }
8
+ "User deleted"
9
+ end
@@ -0,0 +1,3 @@
1
+ Server.api :list_users, :user do |params,user|
2
+ App.load(APP_NAME).users.members.to_json
3
+ end
@@ -0,0 +1,4 @@
1
+ Server.api :update_user, :user do |params,user|
2
+ user.update(params[:attributes])
3
+ "User updated"
4
+ end
@@ -0,0 +1,19 @@
1
+ require 'uuidtools'
2
+ module Rhoconnect
3
+ class ApiToken < Model
4
+ field :value,:string
5
+ field :user_id,:string
6
+ validates_presence_of :user_id
7
+
8
+ def self.create(fields)
9
+ fields[:value] = fields[:value] || Rhoconnect.api_token || get_random_uuid
10
+ fields[:id] = fields[:value]
11
+ object = super(fields)
12
+ end
13
+
14
+ def user
15
+ User.load(self.user_id)
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,76 @@
1
+ module Rhoconnect
2
+ class App < Model
3
+ field :name, :string
4
+ set :users, :string
5
+ attr_reader :delegate
6
+ validates_presence_of :name
7
+
8
+ @@sources = []
9
+
10
+ class << self
11
+ def create(fields={})
12
+ fields[:id] = fields[:name]
13
+ begin
14
+ require under_score(fields[:name])
15
+ rescue Exception; end
16
+ super(fields)
17
+ end
18
+ end
19
+
20
+ def can_authenticate?
21
+ # TODO: optimize it!
22
+ self.delegate && self.delegate.singleton_methods.map(&:to_sym).include?(:authenticate)
23
+ end
24
+
25
+ def authenticate(login, password, session)
26
+ if Rhoconnect.appserver
27
+ auth_result = DynamicAdapter.authenticate(login,password)
28
+ elsif self.delegate
29
+ auth_result = self.delegate.authenticate(login, password, session)
30
+ end
31
+
32
+ if auth_result
33
+ login = auth_result if auth_result.is_a? String
34
+ user = User.load(login) if User.is_exist?(login)
35
+ if not user
36
+ user = User.create(:login => login)
37
+ users << user.id
38
+ end
39
+ return user
40
+ end
41
+ end
42
+
43
+ def delegate
44
+ @delegate.nil? ? Object.const_get(camelize(self.name)) : @delegate
45
+ end
46
+
47
+ def delete
48
+ @@sources = []
49
+ super
50
+ end
51
+
52
+ def delete_sources
53
+ @@sources = []
54
+ end
55
+
56
+ def partition_sources(partition,user_id)
57
+ names = []
58
+ @@sources.each do |source|
59
+ s = Source.load(source,{:app_id => self.name,
60
+ :user_id => user_id})
61
+ if s.partition == partition
62
+ names << s.name
63
+ end
64
+ end
65
+ names
66
+ end
67
+
68
+ def store_blob(obj,field_name,blob)
69
+ self.delegate.send :store_blob, obj,field_name,blob
70
+ end
71
+
72
+ def sources
73
+ @@sources.uniq! || @@sources
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,88 @@
1
+ require 'resque'
2
+ require 'rhoconnect/jobs/bulk_data_job'
3
+
4
+ module Rhoconnect
5
+ class BulkData < Model
6
+ field :name, :string
7
+ field :state, :string
8
+ field :app_id, :string
9
+ field :user_id, :string
10
+ field :refresh_time, :integer
11
+ field :dbfile,:string
12
+ set :sources, :string
13
+ validates_presence_of :app_id, :user_id, :sources
14
+
15
+ def completed?
16
+ if state.to_sym == :completed
17
+ return true
18
+ end
19
+ false
20
+ end
21
+
22
+ def delete
23
+ sources.members.each do |source|
24
+ s = Source.load(source,{:app_id => app_id, :user_id => user_id})
25
+ Store.flash_data(s.docname(:md_copy)) if s
26
+ end
27
+ super
28
+ end
29
+
30
+ def process_sources
31
+ sources.members.each do |source|
32
+ s = Source.load(source,{:app_id => app_id, :user_id => user_id})
33
+ if s
34
+ SourceSync.new(s).process_query(nil)
35
+ s.clone(:md,:md_copy) unless s.sync_type.to_sym == :bulk_sync_only
36
+ end
37
+ end
38
+ end
39
+
40
+ def url
41
+ zippath = dbfile.gsub(Regexp.compile(Regexp.escape(Rhoconnect.data_directory)), "")
42
+ URI.escape(File.join('/data',zippath))
43
+ end
44
+
45
+ def dbfiles_exist?
46
+ files = [dbfile,dbfile+'.rzip']
47
+ if Rhoconnect.blackberry_bulk_sync
48
+ files << dbfile+'.hsqldb.data'
49
+ files << dbfile+'.hsqldb.script'
50
+ files << dbfile+'.hsqldb.properties'
51
+ end
52
+ files.each do |file|
53
+ return false unless File.exist?(file)
54
+ end
55
+ true
56
+ end
57
+
58
+ class << self
59
+ def create(fields={})
60
+ fields[:id] = fields[:name]
61
+ fields[:state] ||= :inprogress
62
+ fields[:sources] ||= []
63
+ super(fields)
64
+ end
65
+
66
+ def enqueue(params={})
67
+ Resque.enqueue(BulkDataJob,params)
68
+ end
69
+
70
+ def get_name(partition,user_id)
71
+ if partition == :user
72
+ File.join(APP_NAME,user_id,user_id)
73
+ else
74
+ File.join(APP_NAME,APP_NAME)
75
+ end
76
+ end
77
+
78
+ def schema_file
79
+ File.join(File.dirname(__FILE__),'syncdb.schema')
80
+ end
81
+
82
+ def index_file
83
+ File.join(File.dirname(__FILE__),'syncdb.index.schema')
84
+ end
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,4 @@
1
+ CREATE INDEX by_src_id on object_values ("source_id");
2
+ CREATE UNIQUE INDEX by_src_object ON object_values ("object", "attrib", "source_id");
3
+ CREATE INDEX by_src_value ON object_values ("attrib", "source_id", "value");
4
+
@@ -0,0 +1,41 @@
1
+ CREATE TABLE client_info (
2
+ "client_id" VARCHAR(255) default NULL,
3
+ "session" VARCHAR(255) default NULL,
4
+ "token" VARCHAR(255) default NULL,
5
+ "token_sent" BIGINT default 0,
6
+ "reset" BIGINT default 0,
7
+ "port" VARCHAR(10) default NULL,
8
+ "last_sync_success" VARCHAR(100) default NULL);
9
+ CREATE TABLE object_values (
10
+ "source_id" BIGINT default NULL,
11
+ "attrib" varchar(255) default NULL,
12
+ "object" varchar(255) default NULL,
13
+ "value" varchar default NULL);
14
+ CREATE TABLE changed_values (
15
+ "source_id" BIGINT default NULL,
16
+ "attrib" varchar(255) default NULL,
17
+ "object" varchar(255) default NULL,
18
+ "value" varchar default NULL,
19
+ "attrib_type" varchar(255) default NULL,
20
+ "update_type" varchar(255) default NULL,
21
+ "sent" BIGINT default 0);
22
+ CREATE TABLE sources (
23
+ "source_id" BIGINT PRIMARY KEY,
24
+ "name" VARCHAR(255) default NULL,
25
+ "token" BIGINT default NULL,
26
+ "sync_priority" BIGINT,
27
+ "partition" VARCHAR(255),
28
+ "sync_type" VARCHAR(255),
29
+ "metadata" varchar default NULL,
30
+ "last_updated" BIGINT default 0,
31
+ "last_inserted_size" BIGINT default 0,
32
+ "last_deleted_size" BIGINT default 0,
33
+ "last_sync_duration" BIGINT default 0,
34
+ "last_sync_success" BIGINT default 0,
35
+ "backend_refresh_time" BIGINT default 0,
36
+ "source_attribs" varchar default NULL,
37
+ "schema" varchar default NULL,
38
+ "schema_version" varchar default NULL,
39
+ "associations" varchar default NULL,
40
+ "blob_attribs" varchar default NULL);
41
+
@@ -0,0 +1,2 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'bulk_data/bulk_data'
@@ -0,0 +1,96 @@
1
+ module Rhoconnect
2
+ class InvalidSourceNameError < RuntimeError; end
3
+
4
+ class Client < Model
5
+ field :device_type, :string
6
+ field :device_pin, :string
7
+ field :device_port, :string
8
+ field :phone_id, :string
9
+ field :user_id, :string
10
+ field :last_sync, :datetime
11
+ field :app_id, :string
12
+ attr_accessor :source_name
13
+ validates_presence_of :app_id, :user_id
14
+
15
+ include Document
16
+ include LockOps
17
+
18
+ def self.create(fields,params={})
19
+ Rhoconnect.license.check_and_use_seat
20
+ fields[:id] = get_random_uuid
21
+ res = super(fields,params)
22
+ user = User.load(fields[:user_id])
23
+ user.clients << res.id
24
+ if Rhoconnect.stats
25
+ Rhoconnect::Stats::Record.set('clients') { Store.incr('client:count') }
26
+ else
27
+ Store.incr('client:count')
28
+ end
29
+ res
30
+ end
31
+
32
+ def self.load(id,params)
33
+ params.merge!(:last_sync => Time.now)
34
+ validate_attributes(params)
35
+ super(id,params)
36
+ end
37
+
38
+ def app
39
+ @app ||= App.load(app_id)
40
+ end
41
+
42
+ def doc_suffix(doctype)
43
+ doctype = doctype.to_s
44
+ if doctype == '*'
45
+ "#{self.user_id}:#{self.id}:*"
46
+ elsif self.source_name
47
+ "#{self.user_id}:#{self.id}:#{self.source_name}:#{doctype}"
48
+ else
49
+ raise InvalidSourceNameError.new('Invalid Source Name For Client')
50
+ end
51
+ end
52
+
53
+ def delete
54
+ flash_data('*')
55
+ Rhoconnect.license.free_seat
56
+ if Rhoconnect.stats
57
+ Rhoconnect::Stats::Record.set('clients') { Store.decr('client:count') }
58
+ else
59
+ Store.decr('client:count')
60
+ end
61
+ super
62
+ end
63
+
64
+ def switch_user(new_user_id)
65
+ flash_data('*')
66
+ User.load(self.user_id).clients.delete(self.id)
67
+ User.load(new_user_id).clients << self.id
68
+ self.user_id = new_user_id
69
+ end
70
+
71
+ def update_clientdoc(sources)
72
+ # TODO: We need to store schema info and data info in bulk data
73
+ # source masterdoc and source schema might have changed!
74
+ sources.each do |source|
75
+ s = Source.load(source,{:app_id => app_id,:user_id => user_id})
76
+ unless s.sync_type.to_sym == :bulk_sync_only
77
+ self.source_name = source
78
+ Store.clone(s.docname(:md_copy),self.docname(:cd))
79
+ end
80
+ self.put_value(:schema_sha1,s.get_value(:schema_sha1))
81
+ end
82
+ end
83
+
84
+ def update_fields(params)
85
+ [:device_type,:device_pin,:device_port,:phone_id].each do |setting|
86
+ self.send "#{setting}=".to_sym, params[setting].to_s if params[setting]
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ def self.validate_attributes(params)
93
+ raise ArgumentError.new('Missing required attribute source_name') unless params[:source_name]
94
+ end
95
+ end
96
+ end