rhodes 2.2.6 → 2.3.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (486) hide show
  1. data/CHANGELOG +20 -0
  2. data/README.md +46 -0
  3. data/Rakefile +85 -80
  4. data/bin/rhodes +2 -2
  5. data/bin/rhogen +1 -1
  6. data/doc/application.txt +277 -0
  7. data/doc/bb-css.txt +209 -0
  8. data/doc/build.txt +785 -0
  9. data/doc/configuration.txt +236 -0
  10. data/doc/connect-to-web-services.txt +282 -0
  11. data/doc/contributing.txt +64 -0
  12. data/doc/css-framework.txt +144 -0
  13. data/doc/device-caps.txt +1152 -0
  14. data/doc/extensions.txt +528 -0
  15. data/doc/files.txt +4 -0
  16. data/doc/generator.txt +141 -0
  17. data/doc/install.txt +35 -0
  18. data/doc/introduction.txt +88 -0
  19. data/doc/rhom.txt +826 -0
  20. data/doc/standard-css.txt +392 -0
  21. data/doc/synchronization.txt +542 -0
  22. data/doc/test-log-debug.txt +148 -0
  23. data/doc/tutorial.txt +136 -0
  24. data/doc/ui.txt +766 -0
  25. data/installer/EnvVarUpdate.nsh +328 -0
  26. data/installer/README.html +81 -0
  27. data/installer/RHOSYNC-LICENSE.txt +675 -0
  28. data/installer/icon.ico +0 -0
  29. data/installer/instant-rhodes.nsi +427 -0
  30. data/lib/build/jake.rb +15 -1
  31. data/lib/extensions/barcode/ext/barcode/platform/android/jni/src/imageprovider.cpp +1 -1
  32. data/lib/extensions/barcode/ext/barcode/platform/bb/Barcode6.files +45 -0
  33. data/lib/extensions/barcode/ext/barcode/platform/bb/Rakefile +6 -0
  34. data/lib/extensions/barcode/ext/barcode/platform/bb/barcode6.jdp +92 -0
  35. data/lib/extensions/barcode/ext/barcode/platform/iphone/Barcode.xcodeproj/project.pbxproj +7 -4
  36. data/lib/extensions/barcode/ext/barcode/platform/iphone/Rakefile +2 -1
  37. data/lib/extensions/barcode/ext/barcode/platform/wm/src/wm_imageprovider.cpp +1 -1
  38. data/lib/extensions/digest-sha1/ext/build.bat +1 -0
  39. data/lib/extensions/digest-sha1/ext/digest-sha1.vcproj +335 -0
  40. data/lib/extensions/esri/ext/build +17 -0
  41. data/lib/extensions/esri/ext/build.bat +29 -0
  42. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/ESRIViewFactory.h +7 -0
  43. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/ESRIViewFactory.mm +58 -0
  44. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/ESRIViewFactoryRegister.mm +22 -0
  45. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/ESRIViewManager.h +21 -0
  46. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/ESRIViewManager.mm +32 -0
  47. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/InitESRI.c +5 -0
  48. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/MapViewControllerESRI.h +143 -0
  49. data/lib/extensions/esri/ext/esri/platform/iphone/Classes/MapViewControllerESRI.m +919 -0
  50. data/lib/extensions/esri/ext/esri/platform/iphone/ESRI.xcodeproj/project.pbxproj +320 -0
  51. data/lib/extensions/esri/ext/esri/platform/iphone/ESRI_Prefix.pch +7 -0
  52. data/lib/extensions/esri/ext/esri/platform/iphone/Rakefile +76 -0
  53. data/lib/extensions/esri/ext.yml +3 -0
  54. data/lib/extensions/net-http/monitor.rb +265 -0
  55. data/lib/extensions/net-http/net/ftp.rb +981 -0
  56. data/lib/extensions/net-http/thread.rb +367 -0
  57. data/lib/extensions/rhocgi/cgi.rb +16 -0
  58. data/lib/extensions/rhospec/rhospec.rb +118 -0
  59. data/lib/framework/base64.rb +91 -0
  60. data/lib/framework/builtinME.rb +13 -10
  61. data/lib/framework/ostruct.rb +145 -0
  62. data/lib/framework/res/back_btn.wm.png +0 -0
  63. data/lib/framework/res/blue_pushpin.wm.png +0 -0
  64. data/lib/framework/res/blue_pushpin_small.wm.png +0 -0
  65. data/lib/framework/res/callout.wm.png +0 -0
  66. data/lib/framework/res/callout_link.wm.png +0 -0
  67. data/lib/framework/res/forward_btn.wm.png +0 -0
  68. data/lib/framework/res/home_btn.wm.png +0 -0
  69. data/lib/framework/res/options_btn.wm.png +0 -0
  70. data/lib/framework/res/refresh_btn.wm.png +0 -0
  71. data/lib/framework/rho/render.rb +5 -2
  72. data/lib/framework/rho/rho.rb +320 -50
  73. data/lib/framework/rho/rhoapplication.rb +48 -10
  74. data/lib/framework/rho/rhonativeviewmanager.rb +73 -0
  75. data/lib/framework/rho/rhosupport.rb +15 -1
  76. data/lib/framework/rho/rhotabbar.rb +29 -0
  77. data/lib/framework/rho/rhotoolbar.rb +17 -0
  78. data/lib/framework/rho/rhoutils.rb +22 -6
  79. data/lib/framework/rhodes.rb +1 -1
  80. data/lib/framework/rholang/rhomsg_de.rb +4 -3
  81. data/lib/framework/rholang/rhomsg_en.rb +1 -0
  82. data/lib/framework/rholang/rhomsg_es.rb +1 -0
  83. data/lib/framework/rholang/rhomsg_it.rb +1 -0
  84. data/lib/framework/rhom/rhom.rb +31 -10
  85. data/lib/framework/rhom/rhom_db_adapter.rb +33 -23
  86. data/lib/framework/rhom/rhom_object_factory.rb +465 -249
  87. data/lib/framework/rhom/rhom_source.rb +22 -7
  88. data/lib/framework/version.rb +1 -1
  89. data/lib/rhodes.rb +1 -1
  90. data/platform/android/Rhodes/AndroidManifest.xml +83 -20
  91. data/platform/android/Rhodes/gen/com/rhomobile/rhodes/R.java +5 -0
  92. data/platform/android/Rhodes/jni/include/rhodes/RhoClassFactory.h +2 -0
  93. data/platform/android/Rhodes/jni/include/rhodes/details/rhojava.inc +9 -5
  94. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesAppOptions.h +53 -0
  95. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +46 -56
  96. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_SplashScreen.h +10 -0
  97. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_mapview_MapView.h +93 -0
  98. data/platform/android/Rhodes/jni/include/rhodes/rhocryptimpl.h +38 -0
  99. data/platform/android/Rhodes/jni/include/rhodes.h +64 -8
  100. data/platform/android/Rhodes/jni/src/RhoClassFactory.cpp +6 -0
  101. data/platform/android/Rhodes/jni/src/alert.cpp +5 -11
  102. data/platform/android/Rhodes/jni/src/bluetooth.cpp +66 -29
  103. data/platform/android/Rhodes/jni/src/callbacks.cpp +24 -21
  104. data/platform/android/Rhodes/jni/src/camera.cpp +2 -6
  105. data/platform/android/Rhodes/jni/src/datetimepicker.cpp +13 -11
  106. data/platform/android/Rhodes/jni/src/event.cpp +9 -15
  107. data/platform/android/Rhodes/jni/src/fileapi.cpp +13 -27
  108. data/platform/android/Rhodes/jni/src/logconf.cpp +3 -3
  109. data/platform/android/Rhodes/jni/src/mapview.cpp +696 -16
  110. data/platform/android/Rhodes/jni/src/menu.cpp +3 -3
  111. data/platform/android/Rhodes/jni/src/nativebar.cpp +55 -4
  112. data/platform/android/Rhodes/jni/src/nativeview.cpp +33 -0
  113. data/platform/android/Rhodes/jni/src/phonebook.cpp +6 -11
  114. data/platform/android/Rhodes/jni/src/rhoconf.cpp +4 -4
  115. data/platform/android/Rhodes/jni/src/rhocryptimpl.cpp +87 -0
  116. data/platform/android/Rhodes/jni/src/rhodes.cpp +55 -34
  117. data/platform/android/Rhodes/jni/src/ringtones.cpp +2 -3
  118. data/platform/android/Rhodes/jni/src/signature.cpp +3 -5
  119. data/platform/android/Rhodes/jni/src/splashscreen.cpp +7 -0
  120. data/platform/android/Rhodes/jni/src/sslimpl.cpp +17 -20
  121. data/platform/android/Rhodes/jni/src/webview.cpp +13 -12
  122. data/platform/android/Rhodes/res/drawable/callout.png +0 -0
  123. data/platform/android/Rhodes/res/drawable/callout_link.png +0 -0
  124. data/platform/android/Rhodes/res/drawable/signature_cancel.png +0 -0
  125. data/platform/android/Rhodes/res/drawable/signature_clear.png +0 -0
  126. data/platform/android/Rhodes/res/drawable/signature_ok.png +0 -0
  127. data/platform/android/Rhodes/res/layout/datetime.xml +4 -0
  128. data/platform/android/Rhodes/res/layout/signature.xml +24 -17
  129. data/platform/android/Rhodes/res/layout/status_bar_ongoing_event_progress_bar.xml +102 -0
  130. data/platform/android/Rhodes/res/values/strings.xml +1 -1
  131. data/platform/android/Rhodes/src/com/rhomobile/rhodes/AndroidR.java +6 -0
  132. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Base64.java +575 -0
  133. data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +83 -0
  134. data/platform/android/Rhodes/src/com/rhomobile/rhodes/NativeBar.java +21 -3
  135. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +23 -15
  136. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushService.java +2 -2
  137. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoCryptImpl.java +151 -0
  138. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoMenu.java +2 -2
  139. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +372 -0
  140. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesAppOptions.java +11 -0
  141. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +58 -0
  142. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +705 -523
  143. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RingtoneManager.java +1 -1
  144. data/platform/android/Rhodes/src/com/rhomobile/rhodes/SplashScreen.java +167 -85
  145. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Utils.java +36 -1
  146. data/platform/android/Rhodes/src/com/rhomobile/rhodes/WebView.java +4 -2
  147. data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java +33 -20
  148. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/IRhoBluetoothManager.java +2 -6
  149. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManager.java +2 -24
  150. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerNew.java +106 -36
  151. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothManagerOld.java +15 -58
  152. data/platform/android/Rhodes/src/com/rhomobile/rhodes/bluetooth/RhoBluetoothSession.java +0 -7
  153. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/Camera.java +6 -4
  154. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/FileList.java +4 -3
  155. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +91 -27
  156. data/platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePicker.java +6 -3
  157. data/platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePickerScreen.java +275 -42
  158. data/platform/android/Rhodes/src/com/rhomobile/rhodes/event/EventStore.java +1 -1
  159. data/platform/android/Rhodes/src/com/rhomobile/rhodes/file/RhoFileApi.java +1 -3
  160. data/platform/android/Rhodes/src/com/rhomobile/rhodes/geolocation/GeoLocationImpl.java +1 -1
  161. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/MainView.java +1 -0
  162. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +120 -43
  163. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/TabbedMainView.java +518 -28
  164. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/AnnotationsOverlay.java +2 -2
  165. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/GoogleMapView.java +434 -0
  166. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapTouch.java +20 -0
  167. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MapView.java +296 -336
  168. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/MultiTouchHandler.java +111 -0
  169. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/OneTouchHandler.java +77 -0
  170. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mapview/TouchHandler.java +10 -0
  171. data/platform/android/Rhodes/src/com/rhomobile/rhodes/nativeview/RhoNativeViewManager.java +0 -1
  172. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/Contact.java +5 -1
  173. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorNew.java +1 -1
  174. data/platform/android/Rhodes/src/com/rhomobile/rhodes/phonebook/ContactAccessorOld.java +1 -1
  175. data/platform/android/Rhodes/src/com/rhomobile/rhodes/signature/ImageCapture.java +6 -11
  176. data/platform/android/Rhodes/src/com/rhomobile/rhodes/signature/Signature.java +6 -4
  177. data/platform/android/Rhodes/src/com/rhomobile/rhodes/signature/SignatureView.java +0 -7
  178. data/platform/android/Rhodes/src/com/rhomobile/rhodes/ui/LogViewDialog.java +9 -4
  179. data/platform/android/Rhodes/src/com/rhomobile/rhodes/util/PerformOnUiThread.java +8 -8
  180. data/platform/android/Rhodes/src/com/rhomobile/rhodes/webview/ChromeClientNew.java +5 -1
  181. data/platform/android/Rhodes/src/com/rhomobile/rhodes/webview/ChromeClientOld.java +11 -7
  182. data/platform/android/Rhodes/src/com/rhomobile/rhodes/webview/RhoWebSettingsNew.java +3 -5
  183. data/platform/android/build/RhodesSRC_build.files +32 -23
  184. data/platform/android/build/android.rake +28 -11
  185. data/platform/android/build/androidcommon.rb +2 -0
  186. data/platform/android/build/librhocommon_build.files +9 -5
  187. data/platform/android/build/librhodes_build.files +1 -0
  188. data/platform/android/build/libruby_build.files +1 -0
  189. data/platform/bb/Hsqldb/Hsqldb.jdp +0 -2
  190. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBResult.java +10 -2
  191. data/platform/bb/Hsqldb/src/com/rho/db/HsqlDBStorage.java +37 -5
  192. data/platform/bb/Hsqldb/src/org/hsqldb/Column.java +5 -5
  193. data/platform/bb/Hsqldb/src/org/hsqldb/Expression.java +1 -1
  194. data/platform/bb/Hsqldb/src/org/hsqldb/Function.java +73 -78
  195. data/platform/bb/Hsqldb/src/org/hsqldb/Library.java +288 -8
  196. data/platform/bb/RubyVM/RubyVM.jdp +3 -0
  197. data/platform/bb/RubyVM/src/com/rho/FilePath.java +13 -1
  198. data/platform/bb/RubyVM/src/com/rho/IRhoRubyHelper.java +2 -2
  199. data/platform/bb/RubyVM/src/com/rho/RhoAppAdapter.java +12 -0
  200. data/platform/bb/RubyVM/src/com/rho/RhoClassFactory.java +18 -1
  201. data/platform/bb/RubyVM/src/com/rho/RhoConf.java +128 -108
  202. data/platform/bb/RubyVM/src/com/rho/RhoLogConf.java +9 -10
  203. data/platform/bb/RubyVM/src/com/rho/RhoLogger.java +16 -1
  204. data/platform/bb/RubyVM/src/com/rho/RhoProfiler.java +1 -1
  205. data/platform/bb/RubyVM/src/com/rho/RhoRuby.java +20 -0
  206. data/platform/bb/RubyVM/src/com/rho/RhodesApp.java +5 -2
  207. data/platform/bb/RubyVM/src/com/rho/ThreadQueue.java +65 -46
  208. data/platform/bb/RubyVM/src/com/rho/db/DBAdapter.java +192 -50
  209. data/platform/bb/RubyVM/src/com/rho/db/DBAttrManager.java +8 -114
  210. data/platform/bb/RubyVM/src/com/rho/db/DBException.java +1 -1
  211. data/platform/bb/RubyVM/src/com/rho/db/IDBCallback.java +1 -1
  212. data/platform/bb/RubyVM/src/com/rho/db/IDBResult.java +5 -3
  213. data/platform/bb/RubyVM/src/com/rho/db/IDBStorage.java +5 -1
  214. data/platform/bb/RubyVM/src/com/rho/file/FileAccessBB.java +109 -0
  215. data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +85 -0
  216. data/platform/bb/RubyVM/src/com/rho/net/NetRequest.java +12 -4
  217. data/platform/bb/RubyVM/src/com/rho/net/NetResponse.java +5 -0
  218. data/platform/bb/RubyVM/src/com/rho/net/RhoConnection.java +37 -23
  219. data/platform/bb/RubyVM/src/com/rho/net/URI.java +84 -0
  220. data/platform/bb/RubyVM/src/com/rho/sync/ClientRegister.java +1 -1
  221. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +119 -61
  222. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +61 -24
  223. data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +108 -54
  224. data/platform/bb/RubyVM/src/com/rho/sync/SyncThread.java +121 -163
  225. data/platform/bb/RubyVM/src/com/xruby/GeneratedMethods/RubyString_Methods.java +23 -0
  226. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyMutex.java +1 -1
  227. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyRange.java +3 -1
  228. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyRegexp.java +3 -1
  229. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyString.java +208 -25
  230. data/platform/bb/RubyVM/src/com/xruby/runtime/builtin/RubyTime.java +3 -1
  231. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RhoSupport.java +5 -1
  232. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyAPI.java +12 -5
  233. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyID.java +1 -0
  234. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyKernelModule.java +16 -0
  235. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyKernelModule_Methods.java +5 -0
  236. data/platform/bb/RubyVM/src/com/xruby/runtime/lang/RubyValue.java +1 -1
  237. data/platform/bb/RubyVM/src/com/xruby/runtime/stdlib/RubyStringIO.java +4 -1
  238. data/platform/bb/{Hsqldb → RubyVM}/src/j2me/math/Number.java +33 -0
  239. data/platform/bb/build/RubyVM_build.files +3 -0
  240. data/platform/bb/build/bb.rake +140 -62
  241. data/platform/bb/build/hsqldb_build.files +0 -2
  242. data/platform/bb/build/rhodes_build.files +5 -0
  243. data/platform/bb/rhodes/platform/4.7/com/rho/RhoMainScreen.java +43 -7
  244. data/platform/bb/rhodes/platform/5.0/com/rho/BrowserAdapter5.java +23 -2
  245. data/platform/bb/rhodes/platform/5.0/com/rho/RhodesApplicationPlatform.java +5 -0
  246. data/platform/bb/rhodes/platform/5.0/com/rho/db/SqliteCopyResult.java +143 -0
  247. data/platform/bb/rhodes/platform/5.0/com/rho/db/SqliteResult.java +269 -0
  248. data/platform/bb/rhodes/platform/5.0/com/rho/db/SqliteStorage.java +446 -0
  249. data/platform/bb/rhodes/platform/common/com/rho/BrowserAdapter5.java +3 -0
  250. data/platform/bb/rhodes/platform/common/com/rho/RhoMainScreen.java +12 -2
  251. data/platform/bb/rhodes/platform/common/com/rho/db/SqliteCopyResult.java +2 -0
  252. data/platform/bb/rhodes/platform/common/com/rho/db/SqliteResult.java +2 -0
  253. data/platform/bb/rhodes/platform/common/com/rho/db/SqliteStorage.java +2 -0
  254. data/platform/bb/rhodes/resources/mappin.png +0 -0
  255. data/platform/bb/rhodes/rhodes.jdp +3 -0
  256. data/platform/bb/rhodes/src/com/rho/BrowserAdapter.java +21 -18
  257. data/platform/bb/rhodes/src/com/rho/BrowserAdapter5.java +150 -0
  258. data/platform/bb/rhodes/src/com/rho/IBrowserAdapter.java +1 -0
  259. data/platform/bb/rhodes/src/com/rho/RhoMainScreen.java +63 -4
  260. data/platform/bb/rhodes/src/com/rho/RhoRubyHelper.java +6 -5
  261. data/platform/bb/rhodes/src/com/rho/RhodesApplicationPlatform.java +242 -2
  262. data/platform/bb/rhodes/src/com/rho/db/SqliteCopyResult.java +143 -0
  263. data/platform/bb/rhodes/src/com/rho/db/SqliteResult.java +269 -0
  264. data/platform/bb/rhodes/src/com/rho/db/SqliteStorage.java +446 -0
  265. data/platform/bb/rhodes/src/com/rho/file/Jsr75File.java +1 -1
  266. data/platform/bb/rhodes/src/com/rho/net/NetworkAccess.java +71 -14
  267. data/platform/bb/rhodes/src/com/rho/net/bb/BBHttpConnection.java +4 -2
  268. data/platform/bb/rhodes/src/com/rho/rubyext/Alert.java +28 -12
  269. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +100 -4
  270. data/platform/bb/rhodes/src/com/rho/rubyext/WebView.java +3 -2
  271. data/platform/bb/rhodes/src/com/rho/rubyext/XMLParser.java +1 -1
  272. data/platform/bb/rhodes/src/rhomobile/NativeBar.java +32 -0
  273. data/platform/bb/rhodes/src/rhomobile/PushListeningThread.java +9 -2
  274. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +174 -41
  275. data/platform/bb/rhodes/src/rhomobile/datetime/DateTimePicker.java +52 -3
  276. data/platform/bb/rhodes/src/rhomobile/datetime/DateTimeScreen.java +33 -1
  277. data/platform/bb/rhodes/src/rhomobile/mapview/Annotation.java +2 -14
  278. data/platform/bb/rhodes/src/rhomobile/mapview/ESRIMapField.java +686 -0
  279. data/platform/bb/rhodes/src/rhomobile/mapview/ESRIMapProvider.java +14 -0
  280. data/platform/bb/rhodes/src/rhomobile/mapview/GeoCoding.java +13 -0
  281. data/platform/bb/rhodes/src/rhomobile/mapview/GoogleGeoCoding.java +174 -0
  282. data/platform/bb/rhodes/src/rhomobile/mapview/GoogleMapField.java +104 -330
  283. data/platform/bb/rhodes/src/rhomobile/mapview/MapTools.java +79 -0
  284. data/platform/bb/rhodes/src/rhomobile/mapview/MapView.java +35 -12
  285. data/platform/bb/rhodes/src/rhomobile/mapview/MapViewParent.java +2 -1
  286. data/platform/bb/rhodes/src/rhomobile/mapview/MapViewScreen.java +336 -44
  287. data/platform/bb/rhodes/src/rhomobile/mapview/RhoMapField.java +3 -6
  288. data/platform/iphone/Classes/AppManager/AppManager.m +19 -4
  289. data/platform/iphone/Classes/DateTime.h +4 -0
  290. data/platform/iphone/Classes/DateTime.m +1 -1
  291. data/platform/iphone/Classes/DateTimePicker.m +8 -1
  292. data/platform/iphone/Classes/DateTimePickerDelegate.m +7 -1
  293. data/platform/iphone/Classes/Event/Event.m +2 -2
  294. data/platform/iphone/Classes/MapView/MapViewController.h +4 -1
  295. data/platform/iphone/Classes/MapView/MapViewController.m +6 -46
  296. data/platform/iphone/Classes/MapView/MapViewManager.h +26 -0
  297. data/platform/iphone/Classes/MapView/MapViewManager.m +172 -0
  298. data/platform/iphone/Classes/NativeBar.h +34 -0
  299. data/platform/iphone/Classes/NativeBar.m +131 -26
  300. data/platform/iphone/Classes/NativeView/NVDelegate.h +26 -0
  301. data/platform/iphone/Classes/NativeView/NVDelegate.m +40 -0
  302. data/platform/iphone/Classes/NativeView/NVViewController.h +24 -0
  303. data/platform/iphone/Classes/NativeView/NVViewController.m +90 -0
  304. data/platform/iphone/Classes/NativeView/RhoNativeViewManager.mm +449 -0
  305. data/platform/iphone/Classes/{RhoNativeViewManagerOC.h → NativeView/RhoNativeViewManagerOC.h} +15 -0
  306. data/platform/iphone/Classes/RhoAlert.m +3 -3
  307. data/platform/iphone/Classes/RhoMainView.h +3 -0
  308. data/platform/iphone/Classes/Rhodes.h +6 -2
  309. data/platform/iphone/Classes/Rhodes.m +47 -79
  310. data/platform/iphone/Classes/Signature/SignatureViewController.m +1 -0
  311. data/platform/iphone/Classes/SimpleMainView.h +18 -1
  312. data/platform/iphone/Classes/SimpleMainView.m +180 -35
  313. data/platform/iphone/Classes/SplitView/LeftViewController.h +1 -1
  314. data/platform/iphone/Classes/SplitView/LeftViewController.m +13 -7
  315. data/platform/iphone/Classes/SplitView/RightViewController.h +1 -1
  316. data/platform/iphone/Classes/SplitView/RightViewController.m +26 -11
  317. data/platform/iphone/Classes/SplitView/SplittedMainView.h +1 -6
  318. data/platform/iphone/Classes/SplitView/SplittedMainView.m +14 -52
  319. data/platform/iphone/Classes/TabbedMainView.h +25 -3
  320. data/platform/iphone/Classes/TabbedMainView.m +340 -14
  321. data/platform/iphone/ESRI/BluePushpin.png +0 -0
  322. data/platform/iphone/ESRI/BluePushpin@2x.png +0 -0
  323. data/platform/iphone/ESRI/esri.png +0 -0
  324. data/platform/iphone/ESRI/esri@2x.png +0 -0
  325. data/platform/iphone/Info.plist +1 -1
  326. data/platform/iphone/RhoLib/RhoLib.xcodeproj/project.pbxproj +26 -3
  327. data/platform/iphone/rbuild/iphone.rake +100 -4
  328. data/platform/iphone/rhorubylib/rhorubylib.xcodeproj/project.pbxproj +12 -0
  329. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +116 -12
  330. data/platform/shared/SyncClient/SyncClient.cpp +29 -3
  331. data/platform/shared/SyncClient/SyncClient.h +2 -1
  332. data/platform/shared/common/IRhoClassFactory.h +3 -0
  333. data/platform/shared/common/IRhoCrypt.h +16 -0
  334. data/platform/shared/common/IRhoThreadImpl.h +1 -0
  335. data/platform/shared/common/RhoAppAdapter.h +2 -0
  336. data/platform/shared/common/RhoConf.cpp +97 -46
  337. data/platform/shared/common/RhoConf.h +14 -13
  338. data/platform/shared/common/RhoFile.cpp +10 -0
  339. data/platform/shared/common/RhoFile.h +1 -0
  340. data/platform/shared/common/RhoMath.cpp +43 -0
  341. data/platform/shared/common/RhoMath.h +27 -0
  342. data/platform/shared/common/RhoNativeViewManager.h +27 -1
  343. data/platform/shared/common/RhoPort.h +11 -0
  344. data/platform/shared/common/RhoStd.h +5 -0
  345. data/platform/shared/common/RhoThread.cpp +1 -1
  346. data/platform/shared/common/RhoThread.h +1 -1
  347. data/platform/shared/common/RhodesApp.cpp +381 -139
  348. data/platform/shared/common/RhodesApp.h +24 -10
  349. data/platform/shared/common/RhodesAppBase.cpp +72 -1
  350. data/platform/shared/common/RhodesAppBase.h +5 -1
  351. data/platform/shared/common/SplashScreen.h +4 -4
  352. data/platform/shared/common/ThreadQueue.cpp +44 -17
  353. data/platform/shared/common/ThreadQueue.h +4 -0
  354. data/platform/shared/common/app_build_configs.c +0 -1
  355. data/platform/shared/common/iphone/RhoClassfactory.h +6 -0
  356. data/platform/shared/common/iphone/RhoCryptImpl.h +47 -0
  357. data/platform/shared/common/iphone/RhoCryptImpl.mm +286 -0
  358. data/platform/shared/common/map/ESRIMapEngine.cpp +921 -0
  359. data/platform/shared/common/map/ESRIMapEngine.h +255 -0
  360. data/platform/shared/common/map/GoogleMapEngine.cpp +160 -0
  361. data/platform/shared/common/map/GoogleMapEngine.h +52 -0
  362. data/platform/shared/common/map/MapEngine.cpp +304 -0
  363. data/platform/shared/common/map/MapEngine.h +214 -0
  364. data/platform/shared/db/DBAdapter.cpp +147 -18
  365. data/platform/shared/db/DBAdapter.h +38 -12
  366. data/platform/shared/db/DBAttrManager.cpp +4 -3
  367. data/platform/shared/db/DBAttrManager.h +7 -7
  368. data/platform/shared/db/res/db/syncdb.triggers +0 -5
  369. data/platform/shared/db/res/db/syncdb_java.triggers +21 -0
  370. data/platform/shared/json/JSONIterator.cpp +11 -1
  371. data/platform/shared/json/JSONIterator.h +1 -0
  372. data/platform/shared/logging/RhoLogConf.cpp +29 -12
  373. data/platform/shared/net/CURLNetRequest.cpp +80 -25
  374. data/platform/shared/net/CURLNetRequest.h +6 -2
  375. data/platform/shared/net/HttpServer.cpp +12 -6
  376. data/platform/shared/net/HttpServer.h +2 -1
  377. data/platform/shared/net/INetRequest.h +1 -0
  378. data/platform/shared/ruby/ext/alert/alert.i +5 -0
  379. data/platform/shared/ruby/ext/alert/alert_wrap.c +439 -108
  380. data/platform/shared/ruby/ext/datetimepicker/datetimepicker.i +42 -0
  381. data/platform/shared/ruby/ext/datetimepicker/datetimepicker_wrap.c +521 -120
  382. data/platform/shared/ruby/ext/nativebar/nativebar.i +16 -0
  383. data/platform/shared/ruby/ext/nativebar/nativebar_wrap.c +623 -128
  384. data/platform/shared/ruby/ext/nativeviewmanager/nativeviewmanager.i +18 -0
  385. data/platform/shared/ruby/ext/nativeviewmanager/nativeviewmanager_wrap.c +2321 -0
  386. data/platform/shared/ruby/ext/rho/extensions.c +0 -1
  387. data/platform/shared/ruby/ext/rho/rhoruby.c +53 -0
  388. data/platform/shared/ruby/ext/rho/rhoruby.h +6 -0
  389. data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +6 -3
  390. data/platform/shared/ruby/ext/syncengine/syncengine.i +9 -1
  391. data/platform/shared/ruby/ext/syncengine/syncengine_wrap.c +61 -0
  392. data/platform/shared/ruby/ext/system/system.i +4 -0
  393. data/platform/shared/ruby/ext/system/system_wrap.c +33 -5
  394. data/platform/shared/rubyext/RhoAppAdapter.cpp +11 -1
  395. data/platform/shared/rubyext/System.cpp +9 -0
  396. data/platform/shared/rubyext/WebView.h +1 -0
  397. data/platform/shared/sqlite/crypto.c +907 -0
  398. data/platform/shared/sqlite/sqlite3.c +6 -0
  399. data/platform/shared/sync/SyncEngine.cpp +49 -19
  400. data/platform/shared/sync/SyncEngine.h +0 -1
  401. data/platform/shared/sync/SyncNotify.cpp +14 -5
  402. data/platform/shared/sync/SyncNotify.h +2 -2
  403. data/platform/shared/sync/SyncSource.cpp +79 -33
  404. data/platform/shared/sync/SyncSource.h +1 -0
  405. data/platform/shared/sync/SyncThread.cpp +26 -11
  406. data/platform/shared/xruby/src/com/xruby/compiler/codedom/StringExpression.java +4 -2
  407. data/platform/wm/RhoLib/RhoLib.vcproj +108 -72
  408. data/platform/wm/build/wm.rake +6 -0
  409. data/platform/wm/rhodes/Alert.cpp +4 -3
  410. data/platform/wm/rhodes/Alert.h +1 -1
  411. data/platform/wm/rhodes/DateTimePicker.cpp +30 -3
  412. data/platform/wm/rhodes/DateTimePicker.h +9 -1
  413. data/platform/wm/rhodes/MainWindow.cpp +121 -61
  414. data/platform/wm/rhodes/MainWindow.h +29 -4
  415. data/platform/wm/rhodes/MapView/Graphics.cpp +547 -0
  416. data/platform/wm/rhodes/MapView/Graphics.h +136 -0
  417. data/platform/wm/rhodes/MapView/MapViewManager.cpp +391 -0
  418. data/platform/wm/rhodes/MapView/MapViewManager.h +158 -0
  419. data/platform/wm/rhodes/RhoCryptImpl.cpp +248 -0
  420. data/platform/wm/rhodes/RhoCryptImpl.h +51 -0
  421. data/platform/wm/rhodes/RhoNativeViewManager.cpp +208 -0
  422. data/platform/wm/rhodes/Rhodes.cpp +94 -102
  423. data/platform/wm/rhodes/Rhodes.rc +27 -0
  424. data/platform/wm/rhodes/SyncStatusDlg.cpp +1 -0
  425. data/platform/wm/rhodes/SyncStatusDlg.h +2 -1
  426. data/platform/wm/rhodes/bluetooth/Bluetooth.cpp +7 -4
  427. data/platform/wm/rhodes/camera/Camera.cpp +36 -15
  428. data/platform/wm/rhodes/camera/Camera.h +0 -4
  429. data/platform/wm/rhodes/resource.h +10 -2
  430. data/platform/wm/rhodes/rho/common/RhoClassFactory.cpp +7 -0
  431. data/platform/wm/rhodes/rho/common/RhoClassFactory.h +1 -0
  432. data/platform/wm/rhodes/rho/net/NetRequestImpl.cpp +10 -2
  433. data/platform/wm/rhodes/rho/net/NetRequestImpl.h +10 -0
  434. data/platform/wm/rhodes/rho/rubyext/NativeToolbar.cpp +513 -0
  435. data/platform/wm/rhodes/rho/rubyext/NativeToolbar.h +74 -0
  436. data/platform/wm/rhodes/rho/rubyext/SystemImpl.cpp +22 -10
  437. data/platform/wm/rhodes/rho/rubyext/WebView.cpp +5 -0
  438. data/platform/wm/rhodes/rhodes.vcproj +38 -2
  439. data/platform/wm/rhodes/stdafx.h +2 -1
  440. data/platform/wm/rubylib/rubylib.vcproj +12 -0
  441. data/rakefile.rb +85 -80
  442. data/res/build-tools/iphonesim/Source/iPhoneSimulator.m +14 -3
  443. data/res/build-tools/iphonesim/build/Release/iphonesim +0 -0
  444. data/res/build-tools/iphonesim/iphonesim.xcodeproj/project.pbxproj +2 -0
  445. data/res/build-tools/xruby-0.3.3.jar +0 -0
  446. data/res/generators/templates/application/app/application.rb +2 -2
  447. data/res/generators/templates/application/app/helpers/application_helper.rb +1 -1
  448. data/res/generators/templates/application/public/css/android.css +1 -0
  449. data/res/generators/templates/application/public/jqtouch/jquery.1.3.2.min.js +1 -1
  450. data/res/generators/templates/application/rhoconfig.txt +66 -14
  451. data/rhodes.gemspec +3 -3
  452. data/spec/framework_spec/app/spec/core/file/expand_path_spec.rb +7 -3
  453. data/spec/framework_spec/build.yml +1 -1
  454. data/spec/phone_spec/Rakefile +1 -0
  455. data/spec/phone_spec/app/Account/account.rb +2 -0
  456. data/spec/phone_spec/app/Account_s/account_s.rb +7 -0
  457. data/spec/phone_spec/app/spec/{fixtures → array/fixtures}/classes.rb +0 -0
  458. data/spec/phone_spec/app/spec/{array_pack_spec.rb → array/pack_spec.rb} +2 -1
  459. data/spec/phone_spec/app/spec/bulksync_spec.rb +1 -0
  460. data/spec/phone_spec/app/spec/contacts_spec.rb +2 -0
  461. data/spec/phone_spec/app/spec/rho_spec.rb +34 -233
  462. data/spec/phone_spec/app/spec/rhom_object_spec.rb +396 -87
  463. data/spec/phone_spec/app/spec/string/element_set_spec.rb +251 -0
  464. data/spec/phone_spec/app/spec/string/end_with_spec.rb +49 -0
  465. data/spec/phone_spec/app/spec/string/fixtures/classes.rb +27 -0
  466. data/spec/phone_spec/app/spec/{lstrip_spec.rb → string/lstrip_spec.rb} +0 -0
  467. data/spec/phone_spec/app/spec/string/replace_spec.rb +52 -0
  468. data/spec/phone_spec/app/spec/{rstrip_spec.rb → string/rstrip_spec.rb} +0 -0
  469. data/spec/phone_spec/app/spec/string/slice_spec.rb +473 -0
  470. data/spec/phone_spec/app/spec/string/split_spec.rb +302 -0
  471. data/spec/phone_spec/app/spec/string/start_with_spec.rb +48 -0
  472. data/spec/phone_spec/app/spec/{strip_spec.rb → string/strip_spec.rb} +0 -0
  473. data/spec/phone_spec/app/spec/syncengine_spec.rb +30 -1
  474. data/spec/phone_spec/app/spec_runner.rb +15 -7
  475. data/spec/phone_spec/build.yml +2 -2
  476. metadata +154 -25
  477. data/README.textile +0 -45
  478. data/platform/android/Rhodes/AndroidManifest.full.xml +0 -62
  479. data/platform/android/Rhodes/gen/com/rhomobile/rhodes/Manifest.java +0 -14
  480. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoActivity.java +0 -20
  481. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Rhodes.java +0 -193
  482. data/platform/bb/Hsqldb/src/com/rho/file/FileAccessBB.java +0 -25
  483. data/platform/bb/RubyVM/src/com/rho/AppBuildConfig.java +0 -22
  484. data/platform/bb/RubyVM/src/com/rho/Capabilities.java +0 -6
  485. data/platform/bb/RubyVM/src/com/rho/Extensions.java +0 -11
  486. data/platform/iphone/Classes/RhoNativeViewManager.mm +0 -226
@@ -23,7 +23,17 @@
23
23
  #require 'rho/rhosupport'
24
24
 
25
25
  module Rhom
26
-
26
+
27
+ def self.any_model_changed?
28
+ ::Rho::RHO.get_db_partitions.each_value do |db|
29
+ result = db.execute_sql("SELECT object FROM changed_values LIMIT 1 OFFSET 0" )
30
+
31
+ return true if result && result.length > 0
32
+ end
33
+
34
+ false
35
+ end
36
+
27
37
  class RhomObjectFactory
28
38
 
29
39
  def initialize
@@ -121,7 +131,7 @@ module Rhom
121
131
  res = db.select_from_table('object_values','object', {"source_id"=>get_source_id}, {"distinct"=>true}).length
122
132
  end
123
133
 
124
- res
134
+ res.to_i()
125
135
  end
126
136
 
127
137
  def backend_refresh_time
@@ -157,6 +167,104 @@ module Rhom
157
167
  Rho::RhoConfig.sources[get_source_name]['source_id'].to_s
158
168
  end
159
169
 
170
+ def convertOpToStr(val_op, value)
171
+ res = ""
172
+ if val_op == 'IN' or val_op == 'in'
173
+
174
+ if value.is_a?(String)
175
+ value = value.split(",")
176
+ value.each do |item|
177
+ item.strip!
178
+ if (item.start_with?("\"") && item.end_with?("\"")) ||
179
+ (item.start_with?("\'") && item.end_with?("\'"))
180
+ item.slice!(0)
181
+ item.chop!
182
+ end
183
+ end
184
+
185
+ end
186
+
187
+ if value.is_a?(Array)
188
+ svalue = ""
189
+ value.each do |item|
190
+ svalue += ',' if svalue.length() > 0
191
+ svalue += "\'#{item}\'"
192
+ end
193
+ res += val_op + ' ( ' + svalue + ' )'
194
+ else
195
+ raise ArgumentError, 'IN parameters should be String or Array'
196
+ end
197
+ else
198
+ res += val_op + ' ' + ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(value, false)
199
+ end
200
+
201
+ res
202
+ end
203
+
204
+ def convertSqlConditionToStr(cond, op)
205
+ if cond.is_a?(String)
206
+ return cond
207
+ end
208
+
209
+ if cond.is_a?(Array) && !op
210
+ condition_str = cond[0].split(/\?/).each_with_index { |param,i|
211
+ param << cond[i+1].to_s
212
+ }.join(' ').to_s
213
+
214
+ puts "condition_str : #{condition_str}"
215
+ return condition_str
216
+ end
217
+
218
+ nil
219
+ end
220
+
221
+ def convertConditionToStatement(cond, op, sql, vals)
222
+ if cond.is_a?(Array)
223
+
224
+ return unless op
225
+
226
+ sqlRes = ""
227
+ valsRes = []
228
+ cond.each do |item|
229
+ sqlRes += ' ' + op + ' ' if sqlRes.length() > 0
230
+
231
+ sqlCond = ""
232
+ valsCond = []
233
+ convertConditionToStatement(item[:conditions], item[:op], sqlCond, valsCond )
234
+
235
+ sqlRes << "(" + sqlCond + ")"
236
+ valsRes.concat(valsCond)
237
+ end
238
+
239
+ sql << sqlRes
240
+ vals.concat(valsRes)
241
+
242
+ return
243
+ end
244
+
245
+ return if !cond.is_a?(Hash)
246
+
247
+ bSimpleHash = true
248
+ op = "AND" unless op
249
+ cond.each do |key, value|
250
+ if key.is_a?(Hash)
251
+ sqlCond, valsCond = makeCondWhereEx(key, value, nil)
252
+
253
+ sql << ' ' + op + ' ' if !bSimpleHash
254
+ sql << sqlCond
255
+ vals.concat(valsCond)
256
+
257
+ bSimpleHash = false
258
+ end
259
+ end
260
+
261
+ if bSimpleHash
262
+ sqlCond, valsCond = ::Rhom::RhomDbAdapter.make_where_params(cond,'AND')
263
+ sql << sqlCond
264
+ vals.concat(valsCond)
265
+ end
266
+ end
267
+ =begin
160
268
  def convertConditionToStr(cond, op, condition_hash)
161
269
  if cond.is_a?(String)
162
270
  return cond
@@ -199,15 +307,8 @@ module Rhom
199
307
  else
200
308
  condition_str += "\"" + attrib_name + "\""
201
309
  end
202
- condition_str += ' '
203
-
204
- if val_op == 'IN' or val_op == 'in'
205
- svalue = ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(value)
206
- condition_str += val_op + ' ( ' + svalue[1,svalue.length()-2] + ' )'
207
- else
208
- condition_str += val_op + ' ' + ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(value)
209
- end
210
310
 
311
+ condition_str += ' ' + convertOpToStr(val_op, value)
211
312
  end
212
313
 
213
314
  end
@@ -219,7 +320,7 @@ module Rhom
219
320
 
220
321
  condition_str
221
322
  end
222
-
323
+ =end
223
324
  def makeCondWhere(key,value,srcid_value)
224
325
  sql = ""
225
326
  val_op = '='
@@ -237,12 +338,7 @@ module Rhom
237
338
  sql << " AND source_id=" + srcid_value
238
339
  sql << " AND " + (val_func.length > 0 ? val_func + "(value)" : "value") + ' '
239
340
 
240
- if val_op == 'IN' or val_op == 'in'
241
- svalue = ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(value)
242
- sql << val_op + ' ( ' + svalue[1,svalue.length()-2] + ' )'
243
- else
244
- sql << val_op + ' ' + ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(value)
245
- end
341
+ sql << convertOpToStr(val_op, value)
246
342
 
247
343
  sql
248
344
  end
@@ -263,18 +359,39 @@ module Rhom
263
359
  attrib_name = key
264
360
  end
265
361
 
266
- sql << "attrib=?"
267
- vals << attrib_name
268
- sql << " AND source_id=?"
269
- vals << srcid_value
270
- sql << " AND " + (val_func.length > 0 ? val_func + "(value)" : "value") + ' '
362
+ if srcid_value.nil?
363
+ sql << (val_func.length > 0 ? val_func + "(#{attrib_name})" : "#{attrib_name}") + ' '
364
+ else
365
+ sql << "attrib=?"
366
+ vals << attrib_name
367
+ sql << " AND source_id=?"
368
+ vals << srcid_value
369
+ sql << " AND " + (val_func.length > 0 ? val_func + "(value)" : "value") + ' '
370
+ end
271
371
 
272
372
  if val_op == 'IN' or val_op == 'in'
273
- sql << val_op + " ( ? )"
274
- vals << value.to_s
373
+
374
+ if value.is_a?(String)
375
+ value = value.split(",")
376
+ value.each do |item|
377
+ item.strip!
378
+ if item.start_with?("\"") && item.end_with?("\"")
379
+ item.slice!(0)
380
+ item.chop!
381
+ end
382
+ end
383
+
384
+ end
385
+
386
+ if value.is_a?(Array)
387
+ sql << val_op + " ( #{Array.new( value.length(), '?').join(',')} )"
388
+ vals.concat( value )
389
+ else
390
+ raise ArgumentError, 'IN parameters should be String or Array'
391
+ end
275
392
  else
276
393
  sql << val_op + " ?"
277
- vals << value.to_s
394
+ vals << value #.to_s
278
395
  end
279
396
 
280
397
  return sql, vals
@@ -495,31 +612,31 @@ module Rhom
495
612
  sql = ""
496
613
  values = []
497
614
 
498
- if attribs
499
- nonExistAttrs = attribs.dup
500
- nonExistAttrs.delete(obj['attrib']) if obj['attrib']
501
-
502
- if nonExistAttrs.length > 0
503
- sql << "SELECT attrib,value FROM object_values WHERE object=? AND source_id=?"
504
- values << obj['object']
505
- values << get_source_id
506
-
507
- quests = ""
508
- nonExistAttrs.each do |attr|
509
- quests << ',' if quests.length() > 0
510
- quests << '?'
511
- values << attr
512
- end
513
-
514
- sql << " AND attrib IN (#{quests})"
515
- end
516
- else
615
+ #if attribs
616
+ # nonExistAttrs = attribs.dup
617
+ # nonExistAttrs.delete(obj['attrib']) if obj['attrib']
618
+
619
+ # if nonExistAttrs.length > 0
620
+ # sql << "SELECT attrib,value FROM object_values WHERE object=? AND source_id=?"
621
+ # values << obj['object']
622
+ # values << get_source_id
623
+ #
624
+ # quests = ""
625
+ # nonExistAttrs.each do |attr|
626
+ # quests << ',' if quests.length() > 0
627
+ # quests << '?'
628
+ # values << attr
629
+ # end
630
+ #
631
+ # sql << " AND attrib IN (#{quests})"
632
+ # end
633
+ #else
517
634
  sql << "SELECT attrib,value FROM object_values WHERE \n"
518
635
  sql << "object=? AND source_id=?"
519
636
 
520
637
  values << obj['object']
521
638
  values << get_source_id
522
- end
639
+ #end
523
640
 
524
641
  #puts "get attribs: #{sql}"
525
642
  listAttrs = sql.length > 0 ? db.execute_sql(sql,values) : []
@@ -527,15 +644,20 @@ module Rhom
527
644
  new_obj = self.new({:object=>"#{obj['object']}"})
528
645
  #new_obj.vars.merge!({:object=>"#{obj['object']}"})
529
646
 
530
- if attribs && obj['attrib']
647
+ #if attribs && obj['attrib']
531
648
  #new_obj.vars.merge!( {obj['attrib'].to_sym()=>obj['value'] }) if obj['value']
532
- new_obj.vars[obj['attrib'].to_sym()] = obj['value'] if obj['value']
533
- end
649
+ # new_obj.vars[obj['attrib'].to_sym()] = obj['value'] if obj['value']
650
+ #end
534
651
 
535
652
  listAttrs.each do |attrValHash|
536
653
  attrName = attrValHash['attrib']
537
654
  attrVal = attrValHash['value']
538
655
  #new_obj.vars.merge!( { attrName.to_sym()=>attrVal } ) if attrVal
656
+
657
+ if attribs && attribs != '*'
658
+ next unless attribs.include? (attrName)
659
+ end
660
+
539
661
  new_obj.vars[attrName.to_sym()] = attrVal if attrVal
540
662
 
541
663
  #nonExistAttrs.delete(attrName) if nonExistAttrs
@@ -597,7 +719,7 @@ module Rhom
597
719
  vx = x.vars[order_attr.to_sym()]
598
720
  vy = y.vars[order_attr.to_sym()]
599
721
  res = vx && vy ? (block_given? ? yield(vx,vy): vx <=> vy) : 0
600
- res *= -1 if order_dir && order_dir == 'DESC'
722
+ res *= -1 if order_dir && order_dir.upcase() == 'DESC'
601
723
  end
602
724
 
603
725
  res
@@ -605,7 +727,7 @@ module Rhom
605
727
  elsif block_given?
606
728
  ret_list.sort! { |x,y|
607
729
  res = yield(x,y)
608
- res *= -1 if order_dir && order_dir == 'DESC'
730
+ res *= -1 if order_dir && order_dir.upcase() == 'DESC'
609
731
  res
610
732
  }
611
733
  end
@@ -681,13 +803,13 @@ module Rhom
681
803
 
682
804
  # do we have conditions?
683
805
  # if so, add them to the query
684
- condition_hash = nil
806
+ #condition_hash = nil
685
807
  select_arr = nil
686
808
  condition_str = nil
687
809
  order_dir=""
688
810
  nSrcID = get_source_id.to_i
689
811
  if args[1]
690
- condition_str = convertConditionToStr(args[1][:conditions], args[1][:op], condition_hash) if args[1][:conditions]
812
+ condition_str = convertSqlConditionToStr(args[1][:conditions], args[1][:op]) if args[1][:conditions]
691
813
 
692
814
  if args[1][:per_page] #and args[1][:offset]
693
815
  limit = args[1][:per_page].to_i
@@ -717,11 +839,12 @@ module Rhom
717
839
  # | 3560c0a0-ef58-2f40-68a5-48f39f63741b |A.G. Parr PLC 37862 |Entertainment|
718
840
  if select_arr
719
841
  attribs = select_arr
720
- attribs = attribs | condition_hash.keys if condition_hash
842
+ #attribs = attribs | condition_hash.keys if condition_hash
721
843
  else
722
844
  attribs = '*'
723
845
  end
724
846
 
847
+ order_manually = false
725
848
  if attribs and attribs.length > 0
726
849
  sql = ""
727
850
  list = []
@@ -729,7 +852,7 @@ module Rhom
729
852
 
730
853
  if !is_schema_source()
731
854
  objects = nil
732
- if !condition_hash && !condition_str
855
+ if !condition_str
733
856
  #srcid_value = ::Rhom::RhomDbAdapter.get_value_for_sql_stmt(get_source_id)
734
857
  values = []
735
858
 
@@ -741,18 +864,28 @@ module Rhom
741
864
  if !args[1][:dont_ignore_missed_attribs]
742
865
  sql << "SELECT object FROM object_values WHERE source_id=? "
743
866
  sql << " AND attrib=? ORDER BY \"value\" " + ( order_dir ? order_dir : "")
744
- values << get_source_id
867
+ values << nSrcID
745
868
  values << order_attr
746
869
  end
747
870
  else
748
871
  #it is more effective to use old find here
749
872
  if attribs && attribs != '*' && attribs.length() != 0 && !args[1][:dont_ignore_missed_attribs]
750
- #sql << "SELECT object FROM object_values WHERE source_id=? AND attrib=?"
751
- #values << get_source_id
752
- #values << attribs[0]
873
+ sql << "SELECT object FROM object_values WHERE attrib=? AND source_id=?"
874
+ values << nSrcID
875
+ values << attribs[0]
753
876
  else
877
+ if limit == 1 && offset == 0
878
+ sql = "SELECT object FROM object_values WHERE source_id=?"
879
+ values << nSrcID
880
+ elsif strLimit
881
+ sql = "SELECT distinct(object) FROM object_values WHERE source_id=?"
882
+ values << nSrcID
883
+ end
884
+
754
885
  #sql << "SELECT distinct(object) FROM object_values WHERE source_id=" << srcid_value
755
886
  end
887
+
888
+ order_manually = !order_attr.nil?
756
889
  end
757
890
 
758
891
  if sql.length() > 0
@@ -772,23 +905,27 @@ module Rhom
772
905
  sql2 = "SELECT attrib,value FROM object_values WHERE object=? AND source_id=?"
773
906
  values2 = []
774
907
  values2 << object_id
775
- values2 << get_source_id
908
+ values2 << nSrcID
776
909
 
777
- if attribs && attribs != '*'
778
- quests = ""
779
- attribs.each do |attr|
780
- quests << ',' if quests.length() > 0
781
- quests << '?'
782
- values2 << attr
783
- end
784
-
785
- sql2 << " AND attrib IN (#{quests})"
786
- end
910
+ #if attribs && attribs != '*'
911
+ # quests = ""
912
+ # attribs.each do |attr|
913
+ # quests << ',' if quests.length() > 0
914
+ # quests << '?'
915
+ # values2 << attr
916
+ # end
917
+ #
918
+ # sql2 << " AND attrib IN (#{quests})"
919
+ #end
787
920
 
788
921
  item_attribs = db.execute_sql(sql2, values2)
789
922
  if item_attribs && item_attribs.length() > 0
790
923
  new_item = {'object'=>object_id }
791
924
  item_attribs.each do |item|
925
+ if attribs && attribs != '*'
926
+ next unless attribs.include? (item['attrib'])
927
+ end
928
+
792
929
  new_item[item['attrib']] = item['value']
793
930
  end
794
931
 
@@ -801,52 +938,79 @@ module Rhom
801
938
  end
802
939
 
803
940
  if objects.nil?
804
-
805
- if attribs == "*"
806
- attribs = SyncEngine.get_src_attrs(Rho::RhoConfig.sources[get_source_name]['partition'].to_s, nSrcID)
807
- end
808
-
809
- if attribs and attribs.length > 0
810
- sql << "SELECT * FROM (\n" if condition_hash or condition_str
811
- sql << "SELECT object, \n"
812
- #attribs.reject! {|attrib| select_arr.index(attrib).nil?} if select_arr
813
- attribs.each do |attrib|
814
- unless attrib.nil? or attrib.length == 0 or ::Rhom::RhomObject.method_name_reserved?(attrib)
815
- sql << "MAX(CASE WHEN attrib = '#{attrib}' THEN value ELSE NULL END) AS \'#{attrib}\',\n"
816
- end
817
- end
818
- sql.chomp!
819
- sql.chop!
820
- sql << " FROM object_values ov \n"
821
- sql << "where " + ::Rhom::RhomDbAdapter.where_str(where_cond) + "\n" if where_cond and where_cond.length > 0
822
- sql << "group by object\n"
823
- sql << "order by " + make_sql_order(args[1]) if !block_given? && order_attr
824
- #sql << ") WHERE " + ::Rhom::RhomDbAdapter.where_str(condition_hash) if condition_hash
825
- sql << ") WHERE " + condition_str if condition_str
826
- sql << strLimit if strLimit
827
-
828
- #puts "Database query start"
829
- list = db.execute_sql(sql)
830
- #puts "Database query end"
831
- end
832
- end
833
941
 
942
+ if !condition_str && !(args[1] && args[1][:dont_ignore_missed_attribs])
943
+ sql = "SELECT object, attrib, value FROM object_values WHERE source_id=? order by object"
944
+ values = [nSrcID]
945
+ objects = db.execute_sql(sql, values)
946
+
947
+ new_item = nil
948
+ objects.each do |item|
949
+ if ( !new_item || new_item['object'] != item['object'])
950
+ list << new_item if new_item
951
+ new_item = {'object'=>item['object'] }
952
+ end
953
+
954
+ new_item[item['attrib']] = item['value'] if item['value']
955
+ end
956
+ list << new_item if new_item
957
+
958
+ order_manually = !order_attr.nil?
959
+ else
960
+
961
+ if attribs == "*"
962
+ raise ArgumentError, "Use Rhom advanced find syntax or specify :select parameter when use sql queries!"
963
+ #attribs = SyncEngine.get_src_attrs(Rho::RhoConfig.sources[get_source_name]['partition'].to_s, nSrcID)
964
+ end
965
+
966
+ if attribs and attribs.length > 0
967
+ sql << "SELECT * FROM (\n" if condition_str
968
+ sql << "SELECT object, \n"
969
+ #attribs.reject! {|attrib| select_arr.index(attrib).nil?} if select_arr
970
+ attribs.each do |attrib|
971
+ unless attrib.nil? or attrib.length == 0 or ::Rhom::RhomObject.method_name_reserved?(attrib)
972
+ sql << "MAX(CASE WHEN attrib = '#{attrib}' THEN value ELSE NULL END) AS \'#{attrib}\',\n"
973
+ end
974
+ end
975
+ sql.chomp!
976
+ sql.chop!
977
+ sql << " FROM object_values ov \n"
978
+ sql << "where " + ::Rhom::RhomDbAdapter.where_str(where_cond) + "\n" if where_cond and where_cond.length > 0
979
+ sql << "group by object\n"
980
+ sql << "order by " + make_sql_order(args[1]) if !block_given? && order_attr
981
+ #sql << ") WHERE " + ::Rhom::RhomDbAdapter.where_str(condition_hash) if condition_hash
982
+ sql << ") WHERE " + condition_str if condition_str
983
+ sql << strLimit if strLimit
984
+
985
+ #puts "Database query start"
986
+ list = db.execute_sql(sql)
987
+ #puts "Database query end"
988
+ end
989
+ end
990
+ end
834
991
  else #schema source
835
992
  attribs = attribs.join(',') if attribs.is_a?(Array)
836
993
 
837
994
  sql << "SELECT #{attribs} FROM #{get_schema_table_name}"
995
+ vals = []
838
996
  if where_cond and where_cond.length > 0
839
997
  sql << " WHERE " + ::Rhom::RhomDbAdapter.where_str(where_cond)
840
- else
841
- sql << " WHERE " + ::Rhom::RhomDbAdapter.where_str(condition_hash) if condition_hash
842
- sql << " WHERE " + condition_str if condition_str
998
+ elsif condition_str
999
+ sql << " WHERE " + condition_str
1000
+ elsif args[1] && args[1][:conditions]
1001
+ sqlCond = ""
1002
+ convertConditionToStatement(args[1][:conditions], args[1][:op], sqlCond, vals)
1003
+ #condHash = {}
1004
+ #sqlCond = convertConditionToStr(args[1][:conditions], args[1][:op], condHash)
1005
+
1006
+ sql << " WHERE " + sqlCond if sqlCond.length() > 0
843
1007
  end
844
1008
 
845
1009
  sql << " order by " + make_sql_order(args[1]) if !block_given? && order_attr
846
1010
  sql << strLimit if strLimit
847
1011
 
848
1012
  #puts "Database query start" #: #{sql}"
849
- list = db.execute_sql(sql)
1013
+ list = db.execute_sql(sql, vals)
850
1014
  #puts "Database query end"
851
1015
 
852
1016
  end
@@ -872,7 +1036,7 @@ module Rhom
872
1036
  puts "Processing rhom objects end, no attributes found."
873
1037
  end
874
1038
 
875
- if block_given?
1039
+ if block_given? || order_manually
876
1040
  order_array(ret_list, order_attr, order_dir, &block)
877
1041
  ret_list = ret_list.slice(offset,limit) if limit
878
1042
  end
@@ -926,40 +1090,94 @@ module Rhom
926
1090
  end
927
1091
 
928
1092
  # deletes all records matching conditions (optionally nil)
929
- def delete_all(conditions=nil)
930
-
1093
+ def delete_all(*args)
931
1094
  db = ::Rho::RHO.get_src_db(get_source_name)
932
1095
  tableName = is_schema_source() ? get_schema_table_name : 'object_values'
1096
+ op = 'AND'
1097
+ op = args[0][:op].upcase if args && args[0] && args[0][:op]
1098
+ conditions = args[0][:conditions] if args && args[0] && args[0][:conditions]
1099
+
933
1100
  begin
934
1101
  db.start_transaction
935
- if conditions
936
- # find all relevant objects, then delete them
937
- if is_schema_source()
938
- del_conditions = conditions[:conditions]
939
- del_objects = db.select_from_table(tableName, 'object', del_conditions)
940
- else
941
- del_conditions = get_conditions_hash(conditions[:conditions])
942
- del_objects = db.select_from_table(tableName, 'object', del_conditions.merge!({"source_id"=>get_source_id}), {"distinct"=>true})
943
- end
944
-
945
- puts "del_objects : #{del_objects}"
946
- del_objects.each do |obj|
947
- if is_schema_source()
948
- db.delete_from_table(tableName, {'object'=>obj['object']})
949
- else
950
- db.delete_from_table(tableName, {'object'=>obj['object'], "source_id"=>get_source_id})
951
- end
952
- db.delete_from_table('changed_values', {'object'=>obj['object'], "source_id"=>get_source_id}) if is_sync_source()
953
- end
1102
+
1103
+ if is_schema_source()
1104
+
1105
+ vals = []
1106
+ sqlCond = ""
1107
+ convertConditionToStatement(conditions, op, sqlCond, vals)
1108
+
1109
+ if is_sync_source()
1110
+ sql = "SELECT object FROM #{tableName}"
1111
+ #sql << " WHERE " + ::Rhom::RhomDbAdapter.where_str(condition_hash) if condition_hash
1112
+ #sql << " WHERE " + condition_str if condition_str
1113
+ sql << " WHERE " + sqlCond if sqlCond.length() > 0
1114
+ listObjs = db.execute_sql(sql, vals)
1115
+
1116
+ listObjs.each do |item|
1117
+
1118
+ db.delete_from_table('changed_values', {'object'=>item['object'], "source_id"=>get_source_id(), "sent"=>0})
1119
+
1120
+ attrsList = db.select_from_table(tableName, '*', {"object"=>item['object']})
1121
+ attrsList[0].each do |attrName, attrValue|
1122
+ next if attrName == 'object'
1123
+
1124
+ db.insert_into_table('changed_values',
1125
+ {"source_id"=>get_source_id(), "object"=>item['object'],
1126
+ "attrib"=> attrName, "value"=>attrValue,
1127
+ "update_type"=>'delete'})
1128
+ end
1129
+
1130
+ sql = "DELETE FROM #{tableName} WHERE object=?"
1131
+ values = [ item['object'] ]
1132
+
1133
+ db.execute_sql(sql,values)
1134
+ end
1135
+
1136
+ else #just delete objects
1137
+ sql = "DELETE FROM #{tableName}"
1138
+ #sql << " WHERE " + ::Rhom::RhomDbAdapter.where_str(condition_hash) if condition_hash
1139
+ #sql << " WHERE " + condition_str if condition_str
1140
+ sql << " WHERE " + sqlCond if sqlCond.length() > 0
1141
+ db.execute_sql(sql, vals)
1142
+ end
954
1143
  else
955
- if is_schema_source()
956
- db.delete_all_from_table(tableName)
1144
+ listObjs = []
1145
+
1146
+ if !conditions
1147
+ if is_sync_source()
1148
+ listObjs = db.execute_sql("SELECT DISTINCT(object) FROM #{tableName} WHERE source_id=?", get_source_id() )
1149
+ else
1150
+ db.delete_from_table(tableName, {"source_id"=>get_source_id()} )
1151
+ end
1152
+ elsif conditions.is_a?(Hash)
1153
+ listObjs = find_objects(conditions, op, nil, 0, nil)
957
1154
  else
958
- db.delete_from_table(tableName, {"source_id"=>get_source_id})
1155
+ listObjs = find_objects_ex(conditions, op, nil, 0, nil)
959
1156
  end
1157
+
1158
+ listObjs.each do |item|
1159
+
1160
+ if is_sync_source()
1161
+ db.delete_from_table('changed_values', {'object'=>item['object'], "source_id"=>get_source_id(), "sent"=>0})
1162
+
1163
+ attrsList = db.select_from_table(tableName, '*', {"object"=>item['object'], "source_id"=>get_source_id()})
1164
+ attrsList.each do |attrName|
1165
+ db.insert_into_table('changed_values',
1166
+ {"source_id"=>get_source_id(), "object"=>item['object'],
1167
+ "attrib"=> attrName['attrib'], "value"=>attrName['value'],
1168
+ "update_type"=>'delete'})
1169
+ end
1170
+ end
1171
+
1172
+ sql = "DELETE FROM #{tableName} WHERE \n"
1173
+ sql << "object=? AND source_id=?"
960
1174
 
961
- db.delete_from_table('changed_values', {"source_id"=>get_source_id}) if is_sync_source()
962
- #TODO: add delete all update_type
1175
+ values = []
1176
+ values << item['object']
1177
+ values << get_source_id
1178
+
1179
+ db.execute_sql(sql,values)
1180
+ end
963
1181
  end
964
1182
  db.commit
965
1183
 
@@ -976,70 +1194,11 @@ module Rhom
976
1194
  def create(obj)
977
1195
  new_obj = self.new(obj)
978
1196
 
979
- update_type = 'create'
980
- nSrcID = get_source_id
981
- obj = new_obj.object
982
- src_name = get_source_name
983
- db_partition = Rho::RhoConfig.sources[src_name]['partition'].to_s
984
- isSchemaSrc = is_schema_source()
985
- tableName = isSchemaSrc ? get_schema_table_name() : 'object_values'
986
- db = ::Rho::RHO.get_src_db(src_name)
987
- begin
988
- db.start_transaction
989
-
990
- if isSchemaSrc
991
- db.insert_into_table(tableName, new_obj.vars, {:source_id=>true})
992
- end
993
-
994
- if is_sync_source() || !isSchemaSrc
995
- new_obj.vars.each do |key_a,value|
996
- key = key_a.to_s
997
- next if ::Rhom::RhomObject.method_name_reserved?(key)
998
-
999
- val = value.to_s #self.inst_strip_braces(value.to_s)
1000
-
1001
- # add rows excluding object, source_id and update_type
1002
- fields = {"source_id"=>nSrcID,
1003
- "object"=>obj,
1004
- "attrib"=>key,
1005
- "value"=>val,
1006
- "update_type"=>update_type}
1007
- fields = new_obj.is_blob_attrib(db_partition, nSrcID, key) ? fields.merge!({"attrib_type" => "blob.file"}) : fields
1008
-
1009
- db.insert_into_table('changed_values', fields) if is_sync_source()
1010
- fields.delete("update_type")
1011
- fields.delete("attrib_type")
1012
-
1013
- db.insert_into_table(tableName, fields) if !isSchemaSrc
1014
- end
1015
- end
1016
-
1017
- db.commit
1018
- rescue Exception => e
1019
- puts 'create Exception: ' + e.inspect
1020
- db.rollback
1021
-
1022
- raise
1023
- end
1197
+ new_obj.create
1024
1198
 
1025
- new_obj
1026
- end
1199
+ new_obj
1200
+ end
1027
1201
 
1028
- private
1029
-
1030
- # get hash of conditions in sql form
1031
- def get_conditions_hash(conditions=nil)
1032
- if conditions
1033
- condition_hash = {}
1034
- conditions.each do |key,value|
1035
- condition_hash.merge!('attrib' => key.to_s, 'value' => value.to_s)
1036
- end
1037
- condition_hash
1038
- else
1039
- nil
1040
- end
1041
- end
1042
-
1043
1202
  end #class methods
1044
1203
 
1045
1204
  # if app server does not support oo in inserts.
@@ -1134,6 +1293,42 @@ module Rhom
1134
1293
  #return attrib_name == "image_uri"
1135
1294
  end
1136
1295
 
1296
+ def create
1297
+ nSrcID = self.get_inst_source_id
1298
+ obj = self.object
1299
+ src_name = get_inst_source_name
1300
+ tableName = is_inst_schema_source() ? get_inst_schema_table_name() : 'object_values'
1301
+ isSchemaSrc = is_inst_schema_source()
1302
+ db = ::Rho::RHO.get_src_db(src_name)
1303
+ begin
1304
+ db.start_transaction
1305
+
1306
+ db.insert_into_table('changed_values',
1307
+ {'update_type'=>'create', 'attrib'=>'object', "source_id"=>nSrcID,"object"=>obj} ) if is_inst_sync_source()
1308
+
1309
+ if isSchemaSrc
1310
+ db.insert_into_table(tableName, self.vars, {:source_id=>true})
1311
+ else
1312
+ self.vars.each do |key_a,value|
1313
+ key = key_a.to_s
1314
+ next if ::Rhom::RhomObject.method_name_reserved?(key)
1315
+
1316
+ val = value.to_s #self.inst_strip_braces(value.to_s)
1317
+
1318
+ db.insert_into_table(tableName, {"source_id"=>nSrcID, "object"=>obj, "attrib"=>key, "value"=>val })
1319
+ end
1320
+ end
1321
+
1322
+ db.commit
1323
+ rescue Exception => e
1324
+ puts 'create Exception: ' + e.inspect
1325
+ db.rollback
1326
+
1327
+ raise
1328
+ end
1329
+
1330
+ end
1331
+
1137
1332
  # saves the current object to the database as a create type
1138
1333
  def save
1139
1334
  # iterate over each instance variable and insert create row to table
@@ -1143,28 +1338,50 @@ module Rhom
1143
1338
  db_partition = Rho::RhoConfig.sources[get_inst_source_name]['partition'].to_s
1144
1339
  tableName = is_inst_schema_source() ? get_inst_schema_table_name() : 'object_values'
1145
1340
  isSchemaSrc = is_inst_schema_source()
1341
+
1342
+ #call create if item does not exists
1343
+ is_new_item = false
1344
+ begin
1345
+ db.lock_db()
1346
+ if isSchemaSrc
1347
+ existing_attribs = db.execute_sql("SELECT object FROM #{tableName} WHERE object=? LIMIT 1 OFFSET 0",obj)
1348
+ else
1349
+ existing_attribs = db.execute_sql("SELECT object FROM #{tableName} WHERE object=? AND source_id=? LIMIT 1 OFFSET 0",obj,nSrcID)
1350
+ end
1351
+
1352
+ unless existing_attribs && existing_attribs.length > 0
1353
+ is_new_item = true
1354
+ create();
1355
+ end
1356
+
1357
+ db.unlock_db
1358
+ rescue Exception => e
1359
+ puts 'save Exception: ' + e.inspect
1360
+ db.unlock_db
1361
+
1362
+ raise
1363
+ end
1364
+
1365
+ return if is_new_item
1366
+
1146
1367
  begin
1147
1368
  db.start_transaction
1148
1369
 
1149
- update_type = ''
1370
+ update_type = 'update'
1371
+ ignore_changed_values = true
1372
+ resUpdateType = nil
1150
1373
  if is_inst_sync_source()
1151
- if isSchemaSrc
1152
- result = db.execute_sql("SELECT object FROM #{tableName} WHERE object=? LIMIT 1 OFFSET 0",obj)
1153
- else
1154
- result = db.execute_sql("SELECT object FROM #{tableName} WHERE object=? AND source_id=? LIMIT 1 OFFSET 0",obj,nSrcID)
1374
+ resUpdateType = db.select_from_table('changed_values', 'update_type', {"object"=>obj, "source_id"=>nSrcID, 'sent'=>0})
1375
+ update_type = resUpdateType[0]['update_type'] if resUpdateType && resUpdateType.length > 0
1376
+ ignore_changed_values = update_type=='create'
1377
+
1378
+ if is_inst_full_update
1379
+ unless resUpdateType && resUpdateType.length > 0
1380
+ db.insert_into_table('changed_values', {"source_id"=>nSrcID, "object"=>obj, "attrib"=>'object', "value"=>"", "update_type"=>update_type})
1381
+ end
1382
+ ignore_changed_values = update_type=='update'
1155
1383
  end
1156
-
1157
- if result && result.length > 0
1158
- resUpdateType = is_inst_sync_source() ? db.select_from_table('changed_values', 'update_type', {"object"=>obj, "source_id"=>nSrcID, 'sent'=>0}) : nil
1159
- if resUpdateType && resUpdateType.length > 0
1160
- update_type = resUpdateType[0]['update_type']
1161
- else
1162
- update_type = 'update'
1163
- end
1164
- else
1165
- update_type = 'create'
1166
- end
1167
- end
1384
+ end
1168
1385
 
1169
1386
  self.vars.each do |key_a,value|
1170
1387
  key = key_a.to_s
@@ -1206,14 +1423,14 @@ module Rhom
1206
1423
 
1207
1424
  if isModified
1208
1425
 
1209
- if is_inst_sync_source()
1426
+ unless ignore_changed_values
1210
1427
  resUpdateType = db.select_from_table('changed_values', 'update_type', {"object"=>obj, "attrib"=>key, "source_id"=>nSrcID, 'sent'=>0})
1211
1428
  if resUpdateType && resUpdateType.length > 0
1212
- fields['update_type'] = resUpdateType[0]['update_type']
1213
- db.delete_from_table('changed_values', {"object"=>obj, "attrib"=>key, "source_id"=>nSrcID, "sent"=>0})
1429
+ db.update_into_table('changed_values', {"value"=>val}, {"object"=>obj, "attrib"=>key, "source_id"=>nSrcID})
1430
+ else
1431
+ db.insert_into_table('changed_values', fields)
1214
1432
  end
1215
-
1216
- db.insert_into_table('changed_values', fields)
1433
+
1217
1434
  end
1218
1435
 
1219
1436
  if isSchemaSrc
@@ -1223,7 +1440,7 @@ module Rhom
1223
1440
  end
1224
1441
  end
1225
1442
  else
1226
- db.insert_into_table('changed_values', fields) if is_inst_sync_source()
1443
+ db.insert_into_table('changed_values', fields) unless ignore_changed_values
1227
1444
  fields.delete("update_type")
1228
1445
  fields.delete("attrib_type")
1229
1446
 
@@ -1254,17 +1471,26 @@ module Rhom
1254
1471
  update_type='update'
1255
1472
  nSrcID = self.get_inst_source_id
1256
1473
  db = ::Rho::RHO.get_src_db(get_inst_source_name)
1474
+ db_partition = Rho::RhoConfig.sources[get_inst_source_name]['partition'].to_s
1257
1475
  tableName = is_inst_schema_source() ? get_inst_schema_table_name() : 'object_values'
1258
1476
  begin
1477
+
1259
1478
  db.start_transaction
1260
-
1261
- if is_inst_full_update
1262
- attrs.each do |attrib,val|
1263
- self.vars[attrib.to_sym()] = val
1264
- end
1265
- attrs = self.vars
1479
+
1480
+ ignore_changed_values = true
1481
+ if is_inst_sync_source()
1482
+ resUpdateType = db.select_from_table('changed_values', 'update_type', {"object"=>obj, "source_id"=>nSrcID, 'sent'=>0})
1483
+ update_type = resUpdateType[0]['update_type'] if resUpdateType && resUpdateType.length > 0
1484
+ ignore_changed_values = update_type=='create'
1485
+
1486
+ if is_inst_full_update
1487
+ unless resUpdateType && resUpdateType.length > 0
1488
+ db.insert_into_table('changed_values', {"source_id"=>nSrcID, "object"=>obj, "attrib"=>'object', "value"=>"", "update_type"=>update_type})
1489
+ end
1490
+ ignore_changed_values = update_type=='update'
1491
+ end
1266
1492
  end
1267
-
1493
+
1268
1494
  attrs.each do |attrib,val|
1269
1495
  attrib = attrib.to_s.gsub(/@/,"")
1270
1496
  next if ::Rhom::RhomObject.method_name_reserved?(attrib)
@@ -1273,32 +1499,19 @@ module Rhom
1273
1499
  new_val = val.to_s #self.inst_strip_braces(val.to_s)
1274
1500
  isModified = false
1275
1501
 
1276
- if is_inst_full_update
1277
- isModified = true
1278
- else
1279
- old_val = self.send attrib.to_sym unless ::Rhom::RhomObject.method_name_reserved?(attrib)
1280
-
1281
- isModified = old_val != new_val
1282
- if isModified && new_val && old_val.nil? && new_val.to_s().length == 0
1283
- isModified = false
1284
- end
1285
- if isModified && old_val && new_val.nil? && old_val.to_s().length == 0
1286
- isModified = false
1287
- end
1502
+ old_val = self.send attrib.to_sym unless ::Rhom::RhomObject.method_name_reserved?(attrib)
1503
+
1504
+ isModified = old_val != new_val
1505
+ if isModified && new_val && old_val.nil? && new_val.to_s().length == 0
1506
+ isModified = false
1507
+ end
1508
+ if isModified && old_val && new_val.nil? && old_val.to_s().length == 0
1509
+ isModified = false
1288
1510
  end
1289
1511
 
1290
1512
  # if the object's value doesn't match the database record
1291
1513
  # then we procede with update
1292
1514
  if isModified
1293
- # only one update at a time
1294
- resUpdateType = is_inst_sync_source() ? db.select_from_table('changed_values', 'update_type', {"object"=>obj, "source_id"=>nSrcID, 'sent'=>0}) : nil
1295
- if resUpdateType && resUpdateType.length > 0
1296
- update_type = resUpdateType[0]['update_type']
1297
- db.delete_from_table('changed_values', {"object"=>obj, "attrib"=>attrib, "source_id"=>nSrcID, "sent"=>0})
1298
- end
1299
-
1300
- # add to syncengine queue
1301
-
1302
1515
  if is_inst_schema_source()
1303
1516
  result = db.select_from_table(tableName, 'object', {"object"=>obj})
1304
1517
 
@@ -1319,16 +1532,19 @@ module Rhom
1319
1532
 
1320
1533
  end
1321
1534
 
1322
- if is_inst_sync_source()
1323
- if result && result.length > 0
1324
- db.insert_into_table('changed_values', {"source_id"=>nSrcID, "object"=>obj, "attrib"=>attrib, "value"=>new_val, "update_type"=>update_type})
1325
- else
1326
- db.insert_into_table('changed_values', {"source_id"=>nSrcID, "object"=>obj, "attrib"=>attrib, "value"=>new_val, "update_type"=>update_type})
1327
- end
1535
+ unless ignore_changed_values
1536
+
1537
+ if resUpdateType && resUpdateType.length > 0
1538
+ db.delete_from_table('changed_values', {"object"=>obj, "attrib"=>attrib, "source_id"=>nSrcID, "sent"=>0})
1539
+ end
1540
+
1541
+ attrib_type = is_blob_attrib(db_partition, nSrcID, attrib) ? "blob.file" : ""
1542
+ db.insert_into_table('changed_values', {"source_id"=>nSrcID, "object"=>obj, "attrib"=>attrib,
1543
+ "value"=>new_val, "update_type"=>update_type, "attrib_type"=>attrib_type })
1328
1544
  end
1329
1545
 
1330
1546
  # update in-memory object
1331
- self.vars[attrib.to_sym()] = new_val unless is_inst_full_update
1547
+ self.vars[attrib.to_sym()] = new_val #unless is_inst_full_update
1332
1548
  end
1333
1549
  end
1334
1550