spiderfw 0.5

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 (638) hide show
  1. data/README +4 -0
  2. data/Rakefile +74 -0
  3. data/apps/cas_server/_init.rb +23 -0
  4. data/apps/cas_server/config/options.rb +9 -0
  5. data/apps/cas_server/controllers/mixins/cas_login_mixin.rb +353 -0
  6. data/apps/cas_server/lib/cas.rb +329 -0
  7. data/apps/cas_server/lib/utils.rb +30 -0
  8. data/apps/cas_server/models/login_ticket.rb +11 -0
  9. data/apps/cas_server/models/mixins/consumable.rb +10 -0
  10. data/apps/cas_server/models/proxy_granting_ticket.rb +12 -0
  11. data/apps/cas_server/models/proxy_ticket.rb +12 -0
  12. data/apps/cas_server/models/service_ticket.rb +22 -0
  13. data/apps/cas_server/models/ticket.rb +20 -0
  14. data/apps/cas_server/models/ticket_granting_ticket.rb +15 -0
  15. data/apps/cas_server/views/logout.shtml +3 -0
  16. data/apps/core/admin/_init.rb +23 -0
  17. data/apps/core/admin/admin.rb +17 -0
  18. data/apps/core/admin/controllers/admin_controller.rb +15 -0
  19. data/apps/core/admin/views/index.shtml +1 -0
  20. data/apps/core/admin/views/spider_admin.layout.shtml +23 -0
  21. data/apps/core/admin/widgets/admin_menu/admin_menu.rb +17 -0
  22. data/apps/core/auth/_init.rb +42 -0
  23. data/apps/core/auth/controllers/login_controller.rb +94 -0
  24. data/apps/core/auth/controllers/mixins/auth_helper.rb +114 -0
  25. data/apps/core/auth/controllers/mixins/http_basic_auth.rb +24 -0
  26. data/apps/core/auth/controllers/mixins/http_digest_auth.rb +26 -0
  27. data/apps/core/auth/lib/authenticable.rb +86 -0
  28. data/apps/core/auth/lib/authenticator.rb +11 -0
  29. data/apps/core/auth/lib/digest_authenticator.rb +44 -0
  30. data/apps/core/auth/lib/login_authenticator.rb +27 -0
  31. data/apps/core/auth/models/digest_user.rb +34 -0
  32. data/apps/core/auth/models/group.rb +22 -0
  33. data/apps/core/auth/models/login_user.rb +15 -0
  34. data/apps/core/auth/models/mixins/access_control.rb +71 -0
  35. data/apps/core/auth/models/mixins/authentication_tracking.rb +19 -0
  36. data/apps/core/auth/models/super_user.rb +8 -0
  37. data/apps/core/auth/models/user.rb +15 -0
  38. data/apps/core/auth/po/it/spider_auth.po +33 -0
  39. data/apps/core/auth/po/spider_auth.pot +31 -0
  40. data/apps/core/auth/views/login.shtml +25 -0
  41. data/apps/core/components/_init.rb +21 -0
  42. data/apps/core/components/po/it/spider_components.po +52 -0
  43. data/apps/core/components/po/spider_components.pot +53 -0
  44. data/apps/core/components/public/css/admin.css +73 -0
  45. data/apps/core/components/public/css/crud.css +58 -0
  46. data/apps/core/components/public/css/img/add.gif +0 -0
  47. data/apps/core/components/public/css/img/ajax-loader.gif +0 -0
  48. data/apps/core/components/public/css/img/back.gif +0 -0
  49. data/apps/core/components/public/css/img/bg_header.png +0 -0
  50. data/apps/core/components/public/css/img/body_bg.jpg +0 -0
  51. data/apps/core/components/public/css/img/gray_gradient.gif +0 -0
  52. data/apps/core/components/public/css/img/li_bg.png +0 -0
  53. data/apps/core/components/public/css/img/li_bg_active.png +0 -0
  54. data/apps/core/components/public/css/img/li_bg_hover.png +0 -0
  55. data/apps/core/components/public/css/img/logo.png +0 -0
  56. data/apps/core/components/public/css/img/menu_bg.png +0 -0
  57. data/apps/core/components/public/css/img/menu_bottom.png +0 -0
  58. data/apps/core/components/public/css/img/menu_top.png +0 -0
  59. data/apps/core/components/public/css/img/section-bottom.jpg +0 -0
  60. data/apps/core/components/public/css/list.css +7 -0
  61. data/apps/core/components/public/css/menu.css +47 -0
  62. data/apps/core/components/public/css/spider.css +9 -0
  63. data/apps/core/components/public/css/switcher.css +13 -0
  64. data/apps/core/components/public/css/table.css +99 -0
  65. data/apps/core/components/public/js/inheritance.js +71 -0
  66. data/apps/core/components/public/js/jquery/jquery-1.3.2.js +4376 -0
  67. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  68. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  70. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  71. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  72. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  73. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  74. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  75. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  76. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  77. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  78. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  79. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  80. data/apps/core/components/public/js/jquery/jquery-ui/css/smoothness/jquery-ui-1.7.2.custom.css +406 -0
  81. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  82. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  83. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  84. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  85. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  86. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  87. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  88. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  89. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  90. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  91. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  92. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  93. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  94. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  95. data/apps/core/components/public/js/jquery/jquery-ui/css/ui-lightness/jquery-ui-1.7.2.custom.css +406 -0
  96. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/AUTHORS.txt +30 -0
  97. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/GPL-LICENSE.txt +278 -0
  98. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/MIT-LICENSE.txt +25 -0
  99. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/ChangeLog.txt +20 -0
  100. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/META.json +32 -0
  101. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.js +100 -0
  102. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.min.js +10 -0
  103. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/jquery.bgiframe.pack.js +10 -0
  104. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/bgiframe/test/index.html +197 -0
  105. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.js +97 -0
  106. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.min.js +10 -0
  107. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.pack.js +10 -0
  108. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/cookie/jquery.cookie.zip +0 -0
  109. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/jsdiff/jsdiff.js +159 -0
  110. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/qunit/testrunner.js +780 -0
  111. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/qunit/testsuite.css +120 -0
  112. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/external/simulate/jquery.simulate.js +152 -0
  113. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/jquery-1.3.2.js +4376 -0
  114. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  115. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  116. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  117. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  118. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  119. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  120. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  121. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  122. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_222222_256x240.png +0 -0
  123. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png +0 -0
  124. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_454545_256x240.png +0 -0
  125. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_888888_256x240.png +0 -0
  126. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  127. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.accordion.css +9 -0
  128. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.all.css +2 -0
  129. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.base.css +8 -0
  130. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.core.css +37 -0
  131. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.datepicker.css +62 -0
  132. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.dialog.css +13 -0
  133. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.progressbar.css +4 -0
  134. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.resizable.css +13 -0
  135. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.slider.css +17 -0
  136. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.tabs.css +11 -0
  137. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/base/ui.theme.css +245 -0
  138. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  139. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  140. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  141. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  142. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  143. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  144. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  145. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  146. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  147. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  148. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  149. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  150. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  151. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  152. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/jquery-ui-1.7.2.custom.css +406 -0
  153. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.accordion.css +9 -0
  154. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.all.css +2 -0
  155. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.base.css +8 -0
  156. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.core.css +37 -0
  157. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.datepicker.css +62 -0
  158. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.dialog.css +13 -0
  159. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.progressbar.css +4 -0
  160. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.resizable.css +13 -0
  161. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.slider.css +17 -0
  162. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.tabs.css +11 -0
  163. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/themes/ui-lightness/ui.theme.css +247 -0
  164. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.blind.js +49 -0
  165. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.bounce.js +78 -0
  166. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.clip.js +54 -0
  167. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.core.js +545 -0
  168. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.drop.js +50 -0
  169. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.explode.js +79 -0
  170. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.fold.js +56 -0
  171. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.highlight.js +48 -0
  172. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.pulsate.js +56 -0
  173. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.scale.js +180 -0
  174. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.shake.js +57 -0
  175. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.slide.js +50 -0
  176. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/effects.transfer.js +45 -0
  177. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/jquery-ui-i18n.js +771 -0
  178. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ar.js +20 -0
  179. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-bg.js +20 -0
  180. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ca.js +19 -0
  181. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-cs.js +19 -0
  182. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-da.js +19 -0
  183. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-de.js +19 -0
  184. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-el.js +19 -0
  185. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-eo.js +19 -0
  186. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-es.js +19 -0
  187. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fa.js +19 -0
  188. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fi.js +19 -0
  189. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-fr.js +19 -0
  190. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-he.js +19 -0
  191. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hr.js +19 -0
  192. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hu.js +19 -0
  193. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-hy.js +19 -0
  194. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-id.js +19 -0
  195. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-is.js +19 -0
  196. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-it.js +19 -0
  197. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ja.js +20 -0
  198. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ko.js +19 -0
  199. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lt.js +19 -0
  200. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-lv.js +19 -0
  201. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ms.js +19 -0
  202. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-nl.js +19 -0
  203. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-no.js +19 -0
  204. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pl.js +19 -0
  205. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-pt-BR.js +19 -0
  206. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ro.js +22 -0
  207. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-ru.js +19 -0
  208. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sk.js +19 -0
  209. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sl.js +20 -0
  210. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sq.js +19 -0
  211. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sr-SR.js +19 -0
  212. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sr.js +19 -0
  213. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-sv.js +19 -0
  214. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-th.js +19 -0
  215. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-tr.js +19 -0
  216. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-uk.js +25 -0
  217. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-CN.js +19 -0
  218. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/i18n/ui.datepicker-zh-TW.js +19 -0
  219. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/jquery-ui-1.7.2.custom.js +9133 -0
  220. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.accordion.js +477 -0
  221. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.core.js +519 -0
  222. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.datepicker.js +1636 -0
  223. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.dialog.js +671 -0
  224. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.draggable.js +766 -0
  225. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.droppable.js +282 -0
  226. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.progressbar.js +116 -0
  227. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.resizable.js +800 -0
  228. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.selectable.js +257 -0
  229. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.slider.js +558 -0
  230. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.sortable.js +1019 -0
  231. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/ui/ui.tabs.js +685 -0
  232. data/apps/core/components/public/js/jquery/jquery-ui/development-bundle/version.txt +1 -0
  233. data/apps/core/components/public/js/jquery/jquery-ui/index.html +367 -0
  234. data/apps/core/components/public/js/jquery/jquery-ui/js/jquery-1.3.2.min.js +19 -0
  235. data/apps/core/components/public/js/jquery/jquery-ui/js/jquery-ui-1.7.2.custom.min.js +298 -0
  236. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/changelog.txt +27 -0
  237. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.css +48 -0
  238. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.js +808 -0
  239. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.min.js +13 -0
  240. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/jquery.autocomplete.pack.js +12 -0
  241. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.ajaxQueue.js +116 -0
  242. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.bgiframe.min.js +10 -0
  243. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/jquery.js +3558 -0
  244. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/thickbox-compressed.js +10 -0
  245. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/lib/thickbox.css +163 -0
  246. data/apps/core/components/public/js/jquery/plugins/jquery-autocomplete/todo +166 -0
  247. data/apps/core/components/public/js/jquery/plugins/jquery.form.js +653 -0
  248. data/apps/core/components/public/js/jquery/plugins/jquery.query-2.1.6.js +224 -0
  249. data/apps/core/components/public/js/jquery/plugins/jquery.url.js +214 -0
  250. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.js +187 -0
  251. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.1.0.min.js +1 -0
  252. data/apps/core/components/public/js/jquery/plugins/jtree/jquery.jtree.spider.1.0.js +193 -0
  253. data/apps/core/components/public/js/jquery/plugins/treeview/changelog.txt +35 -0
  254. data/apps/core/components/public/js/jquery/plugins/treeview/images/ajax-loader.gif +0 -0
  255. data/apps/core/components/public/js/jquery/plugins/treeview/images/file.gif +0 -0
  256. data/apps/core/components/public/js/jquery/plugins/treeview/images/folder-closed.gif +0 -0
  257. data/apps/core/components/public/js/jquery/plugins/treeview/images/folder.gif +0 -0
  258. data/apps/core/components/public/js/jquery/plugins/treeview/images/minus.gif +0 -0
  259. data/apps/core/components/public/js/jquery/plugins/treeview/images/plus.gif +0 -0
  260. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-black-line.gif +0 -0
  261. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-black.gif +0 -0
  262. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-default-line.gif +0 -0
  263. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-default.gif +0 -0
  264. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-famfamfam-line.gif +0 -0
  265. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-famfamfam.gif +0 -0
  266. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-gray-line.gif +0 -0
  267. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-gray.gif +0 -0
  268. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-red-line.gif +0 -0
  269. data/apps/core/components/public/js/jquery/plugins/treeview/images/treeview-red.gif +0 -0
  270. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.async.js +110 -0
  271. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.css +74 -0
  272. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.edit.js +37 -0
  273. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.js +256 -0
  274. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.min.js +15 -0
  275. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.pack.js +16 -0
  276. data/apps/core/components/public/js/jquery/plugins/treeview/jquery.treeview.sortable.js +386 -0
  277. data/apps/core/components/public/js/jquery/plugins/treeview/lib/jquery.cookie.js +92 -0
  278. data/apps/core/components/public/js/jquery/plugins/treeview/lib/jquery.js +3534 -0
  279. data/apps/core/components/public/js/jquery/plugins/treeview/todo +8 -0
  280. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/LICENSE +0 -0
  281. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/README +0 -0
  282. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.css +34 -0
  283. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.js +1413 -0
  284. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/jquery.timepickr.min.js +10 -0
  285. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/222222_256x240_icons_icons.png +0 -0
  286. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/2e83ff_256x240_icons_icons.png +0 -0
  287. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/454545_256x240_icons_icons.png +0 -0
  288. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/888888_256x240_icons_icons.png +0 -0
  289. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/aaaaaa_40x100_textures_01_flat_0.png +0 -0
  290. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/cccccc_40x100_textures_03_highlight_soft_75.png +0 -0
  291. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/cd0a0a_256x240_icons_icons.png +0 -0
  292. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/dadada_40x100_textures_02_glass_75.png +0 -0
  293. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/e6e6e6_40x100_textures_02_glass_75.png +0 -0
  294. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/fbf9ee_40x100_textures_02_glass_55.png +0 -0
  295. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/fef1ec_40x100_textures_05_inset_soft_95.png +0 -0
  296. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/ffffff_40x100_textures_02_glass_65.png +0 -0
  297. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/images/ffffff_40x100_textures_02_glass_75.png +0 -0
  298. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.accordion.css +9 -0
  299. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.all.css +4 -0
  300. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.allplugins.css +7 -0
  301. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.core.css +37 -0
  302. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.datepicker.css +60 -0
  303. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.dialog.css +13 -0
  304. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.progressbar.css +4 -0
  305. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.resizable.css +13 -0
  306. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.slider.css +13 -0
  307. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.tabs.css +9 -0
  308. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.theme.css +238 -0
  309. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/themes/default/ui.timepickr.css +44 -0
  310. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/ui.timepickr.js +2307 -0
  311. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/dist/ui.timepickr.min.js +10 -0
  312. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/body-bg.png +0 -0
  313. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/btn-hover.png +0 -0
  314. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/btn.png +0 -0
  315. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/buttons.psd +0 -0
  316. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/index.html +326 -0
  317. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.anchorHandler.js +44 -0
  318. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.strings.js +290 -0
  319. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.ui.all.js +518 -0
  320. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.utils.js +255 -0
  321. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/jquery.utils.ui.min.js +26 -0
  322. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo-ff.png +0 -0
  323. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo-ie.png +0 -0
  324. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo.png +0 -0
  325. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/logo.psd +0 -0
  326. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/package.png +0 -0
  327. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/reset.css +48 -0
  328. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/script_code.png +0 -0
  329. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/styles.css +308 -0
  330. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/themeroller_ready_black_200px.gif +0 -0
  331. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/page/weather_sun.png +0 -0
  332. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/css/ui.dropslide.css +26 -0
  333. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/css/ui.timepickr.css +18 -0
  334. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/ui.dropslide.js +132 -0
  335. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/src/ui.timepickr.js +217 -0
  336. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/data/testrunner.js +1 -0
  337. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/index.html +34 -0
  338. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/otherlibs/jquery/1.2.1/jquery.js +11 -0
  339. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/otherlibs/jquery/1.2.3/jquery.js +11 -0
  340. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/qunit/testrunner.js +780 -0
  341. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/qunit/testsuite.css +120 -0
  342. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/styles.css +201 -0
  343. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/test.js +41 -0
  344. data/apps/core/components/public/js/jquery/plugins/ui-timepickr/test/unit/ui.timepickr.js +154 -0
  345. data/apps/core/components/public/js/list.js +234 -0
  346. data/apps/core/components/public/js/spider.js +484 -0
  347. data/apps/core/components/public/widgets/search_table.js +10 -0
  348. data/apps/core/components/public/widgets/table.js +9 -0
  349. data/apps/core/components/widgets/admin/admin.rb +75 -0
  350. data/apps/core/components/widgets/admin/admin.shtml +16 -0
  351. data/apps/core/components/widgets/confirm/confirm.rb +37 -0
  352. data/apps/core/components/widgets/confirm/confirm.shtml +9 -0
  353. data/apps/core/components/widgets/crud/crud.rb +119 -0
  354. data/apps/core/components/widgets/crud/crud.shtml +59 -0
  355. data/apps/core/components/widgets/crud/form_table/form_table.rb +13 -0
  356. data/apps/core/components/widgets/crud/form_table/form_table.shtml +3 -0
  357. data/apps/core/components/widgets/list/list.rb +294 -0
  358. data/apps/core/components/widgets/list/list.shtml +38 -0
  359. data/apps/core/components/widgets/list/plugins/exportable/exportable_list.rb +19 -0
  360. data/apps/core/components/widgets/list/plugins/exportable/exportable_list.shtml +5 -0
  361. data/apps/core/components/widgets/menu/menu.rb +20 -0
  362. data/apps/core/components/widgets/menu/menu.shtml +13 -0
  363. data/apps/core/components/widgets/search_table/search_table.rb +22 -0
  364. data/apps/core/components/widgets/search_table/search_table.shtml +11 -0
  365. data/apps/core/components/widgets/switcher/switcher.rb +68 -0
  366. data/apps/core/components/widgets/switcher/switcher.shtml +17 -0
  367. data/apps/core/components/widgets/table/table.rb +153 -0
  368. data/apps/core/components/widgets/table/table.shtml +41 -0
  369. data/apps/core/components/widgets/tabs/tabs.rb +38 -0
  370. data/apps/core/components/widgets/tabs/tabs.shtml +2 -0
  371. data/apps/core/forms/_init.rb +22 -0
  372. data/apps/core/forms/po/it/spider_forms.po +36 -0
  373. data/apps/core/forms/po/spider_forms.pot +37 -0
  374. data/apps/core/forms/public/date_time.js +23 -0
  375. data/apps/core/forms/public/form.css +81 -0
  376. data/apps/core/forms/public/form.js +19 -0
  377. data/apps/core/forms/public/input.js +30 -0
  378. data/apps/core/forms/public/search_select.js +123 -0
  379. data/apps/core/forms/public/select.js +11 -0
  380. data/apps/core/forms/tags/element_label.erb +1 -0
  381. data/apps/core/forms/tags/element_row.erb +4 -0
  382. data/apps/core/forms/tags/row.erb +4 -0
  383. data/apps/core/forms/widgets/form/form.rb +430 -0
  384. data/apps/core/forms/widgets/form/form.shtml +47 -0
  385. data/apps/core/forms/widgets/inputs/checkbox/checkbox.rb +13 -0
  386. data/apps/core/forms/widgets/inputs/checkbox/checkbox.shtml +3 -0
  387. data/apps/core/forms/widgets/inputs/date_time/date_time.rb +48 -0
  388. data/apps/core/forms/widgets/inputs/date_time/date_time.shtml +4 -0
  389. data/apps/core/forms/widgets/inputs/hidden/hidden.rb +8 -0
  390. data/apps/core/forms/widgets/inputs/hidden/hidden.shtml +3 -0
  391. data/apps/core/forms/widgets/inputs/input/input.rb +105 -0
  392. data/apps/core/forms/widgets/inputs/input/input.shtml +3 -0
  393. data/apps/core/forms/widgets/inputs/input/readonly.shtml +6 -0
  394. data/apps/core/forms/widgets/inputs/password/password.rb +24 -0
  395. data/apps/core/forms/widgets/inputs/password/password.shtml +5 -0
  396. data/apps/core/forms/widgets/inputs/search_select/search_select.rb +168 -0
  397. data/apps/core/forms/widgets/inputs/search_select/search_select.shtml +42 -0
  398. data/apps/core/forms/widgets/inputs/select/select.rb +126 -0
  399. data/apps/core/forms/widgets/inputs/select/select.shtml +8 -0
  400. data/apps/core/forms/widgets/inputs/subform/subform.rb +10 -0
  401. data/apps/core/forms/widgets/inputs/subform/subform.shtml +5 -0
  402. data/apps/core/forms/widgets/inputs/text/text.rb +9 -0
  403. data/apps/core/forms/widgets/inputs/text/text.shtml +3 -0
  404. data/apps/core/forms/widgets/inputs/text_area/text_area.rb +10 -0
  405. data/apps/core/forms/widgets/inputs/text_area/text_area.shtml +1 -0
  406. data/apps/drb_server/_init.rb +8 -0
  407. data/apps/drb_server/lib/model_server.rb +41 -0
  408. data/apps/drb_server/script/start_server.rb +19 -0
  409. data/apps/hippo/_init.rb +10 -0
  410. data/apps/hippo/models/mixins/hippo_struct.rb +210 -0
  411. data/apps/hippo/models/security_group.rb +21 -0
  412. data/apps/hippo/models/security_user.rb +29 -0
  413. data/apps/messenger/_init.rb +24 -0
  414. data/apps/messenger/config/options.rb +15 -0
  415. data/apps/messenger/config/worker.rb +3 -0
  416. data/apps/messenger/controllers/messenger_controller.rb +80 -0
  417. data/apps/messenger/controllers/mixins/messenger_controller_mixin.rb +54 -0
  418. data/apps/messenger/lib/backends/email/smtp.rb +0 -0
  419. data/apps/messenger/messenger.rb +94 -0
  420. data/apps/messenger/models/email.rb +22 -0
  421. data/apps/messenger/models/message.rb +44 -0
  422. data/apps/messenger/po/it/spider_messenger.po +77 -0
  423. data/apps/messenger/po/spider_messenger.pot +77 -0
  424. data/apps/messenger/views/index.shtml +13 -0
  425. data/apps/messenger/views/list.shtml +5 -0
  426. data/apps/messenger/views/messenger.layout.shtml +4 -0
  427. data/apps/messenger/views/queue.shtml +8 -0
  428. data/apps/messenger/views/tags/sent_messages.shtml +1 -0
  429. data/apps/soap/_init.rb +16 -0
  430. data/apps/soap/controllers/soap_controller.rb +334 -0
  431. data/apps/soap/doc/examples/example.rb +28 -0
  432. data/apps/soap/lib/soap.rb +217 -0
  433. data/apps/sso/_init.rb +16 -0
  434. data/apps/sso/config/options.rb +13 -0
  435. data/apps/sso/controllers/mixins/saml2_mixin.rb +149 -0
  436. data/apps/sso/lib/saml2/backend.rb +16 -0
  437. data/apps/sso/lib/saml2/lasso_backend.rb +88 -0
  438. data/apps/sso/lib/saml2.rb +112 -0
  439. data/apps/sso/views/saml2_post.shtml +19 -0
  440. data/apps/webdav/_init.rb +15 -0
  441. data/apps/webdav/controllers/webdav_controller.rb +862 -0
  442. data/apps/webdav/lib/locking.rb +193 -0
  443. data/apps/webdav/lib/vfs/abstract.rb +78 -0
  444. data/apps/webdav/lib/vfs/local.rb +126 -0
  445. data/apps/webdav/lib/vfs/mapped.rb +235 -0
  446. data/apps/webdav/lib/vfs/properties.rb +41 -0
  447. data/apps/worker/_init.rb +13 -0
  448. data/apps/worker/cmd.rb +65 -0
  449. data/apps/worker/config/options.rb +9 -0
  450. data/apps/worker/lib/runner.rb +43 -0
  451. data/apps/worker/lib/task.rb +9 -0
  452. data/apps/worker/models/job.rb +20 -0
  453. data/apps/worker/worker.rb +168 -0
  454. data/bin/spider +9 -0
  455. data/blueprints/app/_init.rb +10 -0
  456. data/blueprints/app/controllers/__APP___controller.rb +14 -0
  457. data/blueprints/app/views/__APP__.layout.shtml +8 -0
  458. data/blueprints/app/views/index.shtml +3 -0
  459. data/blueprints/install/config/config.yml +14 -0
  460. data/blueprints/install/init.rb +3 -0
  461. data/data/locale/it/LC_MESSAGES/spider.mo +0 -0
  462. data/data/locale/it/LC_MESSAGES/spider_auth.mo +0 -0
  463. data/data/locale/it/LC_MESSAGES/spider_components.mo +0 -0
  464. data/data/locale/it/LC_MESSAGES/spider_forms.mo +0 -0
  465. data/data/locale/it/LC_MESSAGES/spider_messenger.mo +0 -0
  466. data/lib/spiderfw/app.rb +186 -0
  467. data/lib/spiderfw/autoload.rb +12 -0
  468. data/lib/spiderfw/cache/template_cache.rb +136 -0
  469. data/lib/spiderfw/cmd/cmd.rb +72 -0
  470. data/lib/spiderfw/cmd/commands/cert.rb +427 -0
  471. data/lib/spiderfw/cmd/commands/console.rb +27 -0
  472. data/lib/spiderfw/cmd/commands/init.rb +52 -0
  473. data/lib/spiderfw/cmd/commands/model.rb +131 -0
  474. data/lib/spiderfw/cmd/commands/setup.rb +54 -0
  475. data/lib/spiderfw/cmd/commands/test.rb +61 -0
  476. data/lib/spiderfw/cmd/commands/webserver.rb +93 -0
  477. data/lib/spiderfw/config/configurable.rb +38 -0
  478. data/lib/spiderfw/config/configuration.rb +281 -0
  479. data/lib/spiderfw/config/options/spider.rb +122 -0
  480. data/lib/spiderfw/controller/app_controller.rb +14 -0
  481. data/lib/spiderfw/controller/controller.rb +321 -0
  482. data/lib/spiderfw/controller/controller_exceptions.rb +27 -0
  483. data/lib/spiderfw/controller/controller_io.rb +26 -0
  484. data/lib/spiderfw/controller/controller_mixin.rb +12 -0
  485. data/lib/spiderfw/controller/cookie.rb +20 -0
  486. data/lib/spiderfw/controller/cookies.rb +17 -0
  487. data/lib/spiderfw/controller/dispatcher.rb +269 -0
  488. data/lib/spiderfw/controller/first_responder.rb +59 -0
  489. data/lib/spiderfw/controller/formats/html.rb +90 -0
  490. data/lib/spiderfw/controller/helpers/widget_helper.rb +73 -0
  491. data/lib/spiderfw/controller/home_controller.rb +26 -0
  492. data/lib/spiderfw/controller/http_controller.rb +112 -0
  493. data/lib/spiderfw/controller/mixins/http_mixin.rb +228 -0
  494. data/lib/spiderfw/controller/mixins/static_content.rb +90 -0
  495. data/lib/spiderfw/controller/mixins/visual.rb +489 -0
  496. data/lib/spiderfw/controller/page_controller.rb +39 -0
  497. data/lib/spiderfw/controller/request.rb +48 -0
  498. data/lib/spiderfw/controller/response.rb +50 -0
  499. data/lib/spiderfw/controller/router.rb +9 -0
  500. data/lib/spiderfw/controller/scene.rb +27 -0
  501. data/lib/spiderfw/controller/session/file_session.rb +83 -0
  502. data/lib/spiderfw/controller/session/flash_hash.rb +56 -0
  503. data/lib/spiderfw/controller/session/memory_session.rb +62 -0
  504. data/lib/spiderfw/controller/session/transient_hash.rb +18 -0
  505. data/lib/spiderfw/controller/session.rb +106 -0
  506. data/lib/spiderfw/controller/spider_controller.rb +20 -0
  507. data/lib/spiderfw/create.rb +64 -0
  508. data/lib/spiderfw/env.rb +17 -0
  509. data/lib/spiderfw/exceptions.rb +2 -0
  510. data/lib/spiderfw/home.rb +26 -0
  511. data/lib/spiderfw/http/adapters/cgi.rb +62 -0
  512. data/lib/spiderfw/http/adapters/cgi_io.rb +27 -0
  513. data/lib/spiderfw/http/adapters/fcgi.rb +62 -0
  514. data/lib/spiderfw/http/adapters/mongrel.rb +207 -0
  515. data/lib/spiderfw/http/adapters/rack.rb +152 -0
  516. data/lib/spiderfw/http/adapters/thin.rb +38 -0
  517. data/lib/spiderfw/http/adapters/webrick.rb +176 -0
  518. data/lib/spiderfw/http/http.rb +297 -0
  519. data/lib/spiderfw/http/server.rb +40 -0
  520. data/lib/spiderfw/i18n/cldr.rb +114 -0
  521. data/lib/spiderfw/i18n/gettext.rb +8 -0
  522. data/lib/spiderfw/i18n/i18n.rb +120 -0
  523. data/lib/spiderfw/i18n/provider.rb +12 -0
  524. data/lib/spiderfw/i18n/rails.rb +89 -0
  525. data/lib/spiderfw/i18n/shtml_parser.rb +41 -0
  526. data/lib/spiderfw/model/active_record.rb +335 -0
  527. data/lib/spiderfw/model/base_model.rb +2068 -0
  528. data/lib/spiderfw/model/condition.rb +416 -0
  529. data/lib/spiderfw/model/data_type.rb +75 -0
  530. data/lib/spiderfw/model/datatypes/binary.rb +10 -0
  531. data/lib/spiderfw/model/datatypes/bool.rb +10 -0
  532. data/lib/spiderfw/model/datatypes/decimal.rb +22 -0
  533. data/lib/spiderfw/model/datatypes/email.rb +13 -0
  534. data/lib/spiderfw/model/datatypes/password.rb +63 -0
  535. data/lib/spiderfw/model/datatypes/serialized_object.rb +32 -0
  536. data/lib/spiderfw/model/datatypes/text.rb +10 -0
  537. data/lib/spiderfw/model/datatypes/uuid.rb +29 -0
  538. data/lib/spiderfw/model/datatypes.rb +19 -0
  539. data/lib/spiderfw/model/element.rb +250 -0
  540. data/lib/spiderfw/model/extended_models/managed.rb +43 -0
  541. data/lib/spiderfw/model/identity_mapper.rb +89 -0
  542. data/lib/spiderfw/model/inline_model.rb +37 -0
  543. data/lib/spiderfw/model/mappers/db_mapper.rb +1126 -0
  544. data/lib/spiderfw/model/mappers/hash_mapper.rb +114 -0
  545. data/lib/spiderfw/model/mappers/mapper.rb +926 -0
  546. data/lib/spiderfw/model/mappers/mappers.rb +7 -0
  547. data/lib/spiderfw/model/mappers/proxy_mapper.rb +25 -0
  548. data/lib/spiderfw/model/mappers/vfs/flat_file.rb +31 -0
  549. data/lib/spiderfw/model/mixins/converted.rb +110 -0
  550. data/lib/spiderfw/model/mixins/list.rb +135 -0
  551. data/lib/spiderfw/model/mixins/mixins.rb +7 -0
  552. data/lib/spiderfw/model/mixins/state_machine.rb +81 -0
  553. data/lib/spiderfw/model/mixins/synchronized.rb +88 -0
  554. data/lib/spiderfw/model/mixins/tree.rb +296 -0
  555. data/lib/spiderfw/model/mixins/versioned.rb +147 -0
  556. data/lib/spiderfw/model/model.rb +226 -0
  557. data/lib/spiderfw/model/model_hash.rb +50 -0
  558. data/lib/spiderfw/model/proxy_model.rb +37 -0
  559. data/lib/spiderfw/model/query.rb +147 -0
  560. data/lib/spiderfw/model/query_funcs.rb +99 -0
  561. data/lib/spiderfw/model/query_set.rb +700 -0
  562. data/lib/spiderfw/model/request.rb +80 -0
  563. data/lib/spiderfw/model/storage/base_storage.rb +110 -0
  564. data/lib/spiderfw/model/storage/db/adapters/mssql.rb +129 -0
  565. data/lib/spiderfw/model/storage/db/adapters/mysql.rb +436 -0
  566. data/lib/spiderfw/model/storage/db/adapters/oci8.rb +533 -0
  567. data/lib/spiderfw/model/storage/db/adapters/sqlite.rb +163 -0
  568. data/lib/spiderfw/model/storage/db/connectors/odbc.rb +213 -0
  569. data/lib/spiderfw/model/storage/db/db.rb +13 -0
  570. data/lib/spiderfw/model/storage/db/db_connection_pool.rb +126 -0
  571. data/lib/spiderfw/model/storage/db/db_connector.rb +9 -0
  572. data/lib/spiderfw/model/storage/db/db_schema.rb +233 -0
  573. data/lib/spiderfw/model/storage/db/db_storage.rb +872 -0
  574. data/lib/spiderfw/model/storage/db/dialects/no_total_rows.rb +18 -0
  575. data/lib/spiderfw/model/storage/db/reflector.rb +36 -0
  576. data/lib/spiderfw/model/storage/null_storage.rb +18 -0
  577. data/lib/spiderfw/model/storage/schema.rb +19 -0
  578. data/lib/spiderfw/model/storage.rb +72 -0
  579. data/lib/spiderfw/model/sync.rb +94 -0
  580. data/lib/spiderfw/model/type.rb +13 -0
  581. data/lib/spiderfw/model/unit_of_work.rb +75 -0
  582. data/lib/spiderfw/requires.rb +21 -0
  583. data/lib/spiderfw/resource.rb +18 -0
  584. data/lib/spiderfw/setup/setup_task.rb +44 -0
  585. data/lib/spiderfw/tag/tag.rb +28 -0
  586. data/lib/spiderfw/templates/blocks/attr_if.rb +32 -0
  587. data/lib/spiderfw/templates/blocks/comment.rb +38 -0
  588. data/lib/spiderfw/templates/blocks/debugger.rb +16 -0
  589. data/lib/spiderfw/templates/blocks/each.rb +51 -0
  590. data/lib/spiderfw/templates/blocks/html.rb +70 -0
  591. data/lib/spiderfw/templates/blocks/if.rb +35 -0
  592. data/lib/spiderfw/templates/blocks/pass.rb +16 -0
  593. data/lib/spiderfw/templates/blocks/render.rb +23 -0
  594. data/lib/spiderfw/templates/blocks/run.rb +30 -0
  595. data/lib/spiderfw/templates/blocks/tag.rb +21 -0
  596. data/lib/spiderfw/templates/blocks/tag_if.rb +29 -0
  597. data/lib/spiderfw/templates/blocks/text.rb +43 -0
  598. data/lib/spiderfw/templates/blocks/widget.rb +58 -0
  599. data/lib/spiderfw/templates/blocks/yield.rb +18 -0
  600. data/lib/spiderfw/templates/layout.rb +44 -0
  601. data/lib/spiderfw/templates/resources/less.rb +14 -0
  602. data/lib/spiderfw/templates/template.rb +625 -0
  603. data/lib/spiderfw/templates/template_blocks.rb +185 -0
  604. data/lib/spiderfw/utils/annotations.rb +201 -0
  605. data/lib/spiderfw/utils/fork.rb +75 -0
  606. data/lib/spiderfw/utils/hash_comparison.rb +8 -0
  607. data/lib/spiderfw/utils/inflector.rb +42 -0
  608. data/lib/spiderfw/utils/logger.rb +92 -0
  609. data/lib/spiderfw/utils/monkey/class.rb +59 -0
  610. data/lib/spiderfw/utils/monkey/date_time.rb +34 -0
  611. data/lib/spiderfw/utils/monkey/debugger.rb +25 -0
  612. data/lib/spiderfw/utils/monkey/exception.rb +23 -0
  613. data/lib/spiderfw/utils/monkey/kernel.rb +12 -0
  614. data/lib/spiderfw/utils/monkey/module.rb +12 -0
  615. data/lib/spiderfw/utils/monkey/symbol.rb +7 -0
  616. data/lib/spiderfw/utils/monkey/time.rb +17 -0
  617. data/lib/spiderfw/utils/multi_level_hash.rb +33 -0
  618. data/lib/spiderfw/utils/periodic_runner.rb +50 -0
  619. data/lib/spiderfw/utils/rails.rb +78 -0
  620. data/lib/spiderfw/utils/rails_app.rb +53 -0
  621. data/lib/spiderfw/utils/sanitizer.rb +178 -0
  622. data/lib/spiderfw/utils/setup_task.rb +35 -0
  623. data/lib/spiderfw/utils/shared_store/file_shared_store.rb +73 -0
  624. data/lib/spiderfw/utils/shared_store/memory_shared_store.rb +46 -0
  625. data/lib/spiderfw/utils/shared_store.rb +47 -0
  626. data/lib/spiderfw/utils/test_case.rb +24 -0
  627. data/lib/spiderfw/utils/thread_out.rb +24 -0
  628. data/lib/spiderfw/version.rb +3 -0
  629. data/lib/spiderfw/widget/rest_model.rb +20 -0
  630. data/lib/spiderfw/widget/widget.rb +671 -0
  631. data/lib/spiderfw/widget/widget_attributes.rb +54 -0
  632. data/lib/spiderfw/widget/widget_plugin.rb +37 -0
  633. data/lib/spiderfw.rb +509 -0
  634. data/spider.gemspec +43 -0
  635. data/views/errors/404.shtml +6 -0
  636. data/views/errors/error.layout.shtml +70 -0
  637. data/views/errors/error_generic.shtml +6 -0
  638. metadata +800 -0
@@ -0,0 +1,872 @@
1
+ require 'spiderfw/model/storage/base_storage'
2
+ require 'spiderfw/model/mappers/db_mapper'
3
+ require 'spiderfw/model/storage/db/db_connection_pool'
4
+ require 'iconv'
5
+
6
+ module Spider; module Model; module Storage; module Db
7
+
8
+ # Represents a DB connection, and provides methods to execute structured queries on it.
9
+ # This is the class that generates the actual SQL; vendor specific extensions may override the
10
+ # generic SQL methods.
11
+
12
+ class DbStorage < Storage::BaseStorage
13
+ @reserved_keywords = ['from', 'order', 'where', 'to']
14
+ @type_synonyms = {}
15
+ @safe_conversions = {
16
+ 'TEXT' => ['LONGTEXT'],
17
+ 'INT' => ['TEXT', 'LONGTEXT', 'REAL'],
18
+ 'REAL' => ['TEXT']
19
+ }
20
+ @capabilities = {
21
+ :autoincrement => false,
22
+ :sequences => true,
23
+ :transactions => true
24
+ }
25
+
26
+ class << self
27
+ # An Array of keywords that can not be used in schema names.
28
+ attr_reader :reserved_keywords
29
+ # An Hash of DB type equivalents.
30
+ attr_reader :type_synonyms
31
+ # Type conversions which do not lose data. See also #safe_schema_conversion?
32
+ attr_reader :safe_conversions
33
+ # An Hash of DB capabilities. The default is
34
+ # {:autoincrement => false, :sequences => true, :transactions => true}
35
+ # (The BaseStorage class provides file sequences in case the subclass does not support them.)
36
+ attr_reader :capabilities
37
+
38
+ # Returns a new connection. Must be implemented by the subclasses; args are implementation specific.
39
+ def new_connection(*args)
40
+ raise "Unimplemented"
41
+ end
42
+
43
+ def max_connections
44
+ nil
45
+ end
46
+
47
+ def connection_pools
48
+ @pools ||= {}
49
+ end
50
+
51
+ def get_connection(*args)
52
+ @pools ||= {}
53
+ @pools[args] ||= DbConnectionPool.new(args, self)
54
+ @pools[args].get_connection
55
+ end
56
+
57
+ # Frees a connection, relasing it to the pool
58
+ def release_connection(conn, conn_params)
59
+ return unless conn
60
+ return unless @pools && @pools[conn_params]
61
+ @pools[conn_params].release(conn)
62
+ end
63
+
64
+ # Removes a connection from the pool.
65
+ def remove_connection(conn, conn_params)
66
+ return unless conn
67
+ return unless @pools && @pools[conn_params]
68
+ @pools[conn_params].remove(conn)
69
+ end
70
+
71
+ def disconnect(conn)
72
+ raise "Virtual"
73
+ end
74
+
75
+ # Checks whether a connection is still alive. Must be implemented by subclasses.
76
+ def connection_alive?(conn)
77
+ raise "Virtual"
78
+ end
79
+
80
+ end
81
+
82
+ def curr
83
+ Thread.current[:db_storages] ||= {}
84
+ Thread.current[:db_storages][@connection_params] ||= {
85
+ :transaction_nesting => 0, :savepoints => []
86
+ }
87
+ end
88
+
89
+ def connection_pool
90
+ self.class.connection_pools[@connection_params]
91
+ end
92
+
93
+ # The constructor takes the connection URL, which will be parsed into connection params.
94
+ def initialize(url)
95
+ super
96
+ end
97
+
98
+ # Instantiates a new connection with current connection params.
99
+ def connect()
100
+ return self.class.get_connection(*@connection_params)
101
+ #Spider::Logger.debug("#{self.class.name} in thread #{Thread.current} acquired connection #{@conn}")
102
+ end
103
+
104
+ # True if currently connected.
105
+ def connected?
106
+ curr[:conn] != nil
107
+ end
108
+
109
+
110
+ # Returns the current connection, or creates a new one.
111
+ # If a block is given, will release the connection after yielding.
112
+ def connection
113
+ # is_connected = connected?
114
+ # Spider.logger.debug("#{self} already connected with conn #{@conn}") if is_connected
115
+ # connect unless is_connected
116
+ curr[:conn] = connect
117
+ if block_given?
118
+ yield curr[:conn]
119
+ release # unless is_connected
120
+ return true
121
+ else
122
+ #debugger unless @conn
123
+ return curr[:conn]
124
+ end
125
+ end
126
+
127
+ def self.connection_attributes
128
+ @connection_attributes ||= {}
129
+ end
130
+
131
+ def connection_attributes
132
+ self.class.connection_attributes[connection] ||= {}
133
+ end
134
+
135
+ # Releases the current connection to the pool.
136
+ def release
137
+ # The subclass should check if the connection is alive, and if it is not call remove_connection instead
138
+ c = curr[:conn]
139
+ #Spider.logger.debug("#{self} in thread #{Thread.current} releasing #{curr[:conn]}")
140
+ curr[:conn] = nil
141
+ self.class.release_connection(c, @connection_params)
142
+ #Spider.logger.debug("#{self} in thread #{Thread.current} released #{curr[:conn]}")
143
+ return nil
144
+ #@conn = nil
145
+ end
146
+
147
+ # Returns the default mapper for the storage.
148
+ # If the storage subclass contains a MapperExtension module, it will be mixed-in with the mapper.
149
+ def get_mapper(model)
150
+ mapper = Spider::Model::Mappers::DbMapper.new(model, self)
151
+ if (self.class.const_defined?(:MapperExtension))
152
+ mapper.extend(self.class.const_get(:MapperExtension))
153
+ end
154
+ return mapper
155
+ end
156
+
157
+ # True if given named capability is supported by the DB.
158
+ def supports?(capability)
159
+ self.class.capabilities[capability]
160
+ end
161
+
162
+ def supports_transactions?
163
+ return self.class.capabilities[:transactions]
164
+ end
165
+
166
+ def start_transaction
167
+ return savepoint("point#{curr[:savepoints].length}") if in_transaction?
168
+ curr[:transaction_nesting] += 1
169
+ Spider.logger.debug("#{self.class.name} starting transaction for connection #{connection.object_id}")
170
+ do_start_transaction
171
+ return true
172
+ end
173
+
174
+ # May be implemented by subclasses.
175
+ def do_start_transaction
176
+ raise StorageException, "The current storage does not support transactions"
177
+ end
178
+
179
+ def in_transaction
180
+ if in_transaction?
181
+ curr[:transaction_nesting] += 1
182
+ return true
183
+ else
184
+ start_transaction
185
+ return false
186
+ end
187
+ end
188
+
189
+ def in_transaction?
190
+ return false
191
+ end
192
+
193
+ def commit
194
+ raise StorageException, "Commit without a transaction" unless in_transaction?
195
+ return curr[:savepoints].pop unless curr[:savepoints].empty?
196
+ commit!
197
+ end
198
+
199
+ def commit_or_continue
200
+ raise StorageException, "Commit without a transaction" unless in_transaction?
201
+ if curr[:transaction_nesting] == 1
202
+ commit
203
+ return true
204
+ else
205
+ curr[:transaction_nesting] -= 1
206
+ end
207
+ end
208
+
209
+ def commit!
210
+ Spider.logger.debug("#{self.class.name} commit connection #{curr[:conn].object_id}")
211
+ curr[:transaction_nesting] = 0
212
+ do_commit
213
+ release
214
+ end
215
+
216
+ def do_commit
217
+ raise StorageException, "The current storage does not support transactions"
218
+ end
219
+
220
+ def rollback
221
+ raise "Can't rollback in a nested transaction" if curr[:transaction_nesting] > 1
222
+ return rollback_savepoint(curr[:savepoints].last) unless curr[:savepoints].empty?
223
+ rollback!
224
+ end
225
+
226
+ def rollback!
227
+ curr[:transaction_nesting] = 0
228
+ Spider.logger.debug("#{self.class.name} rollback")
229
+ do_rollback
230
+ curr[:savepoints] = []
231
+ release
232
+ end
233
+
234
+ def do_rollback
235
+ raise StorageException, "The current storage does not support transactions"
236
+ end
237
+
238
+ def savepoint(name)
239
+ curr[:savepoints] << name
240
+ end
241
+
242
+ def rollback_savepoint(name=nil)
243
+ if name
244
+ curr[:savepoints] = curr[:savepoints][0,(curr[:savepoints].index(name))]
245
+ name
246
+ else
247
+ curr[:savepoints].pop
248
+ end
249
+ end
250
+
251
+ def lock(table, mode=:exclusive)
252
+ lockmode = case(mode)
253
+ when :shared
254
+ 'SHARE'
255
+ when :row_exclusive
256
+ 'ROW EXCLUSIVE'
257
+ else
258
+ 'EXCLUSIVE'
259
+ end
260
+ execute("LOCK TABLE #{table} IN #{lockmode} MODE")
261
+ end
262
+
263
+ ##############################################################
264
+ # Methods used to generate a schema #
265
+ ##############################################################
266
+
267
+ # Fixes a string to be used as a table name.
268
+ def table_name(name)
269
+ return name.to_s.gsub(':', '_')
270
+ end
271
+
272
+ # Fixes a string to be used as a sequence name.
273
+ def sequence_name(name)
274
+ return name.to_s.gsub(':', '_')
275
+ end
276
+
277
+ # Fixes a string to be used as a column name.
278
+ def column_name(name)
279
+ name = name.to_s
280
+ name += '_field' if (self.class.reserved_keywords.include?(name.downcase))
281
+ return name
282
+ end
283
+
284
+ def foreign_key_name(name)
285
+ name
286
+ end
287
+
288
+
289
+ # Returns the db type corresponding to an element type.
290
+ def column_type(type, attributes)
291
+ case type.name
292
+ when 'String'
293
+ 'TEXT'
294
+ when 'Text'
295
+ 'LONGTEXT'
296
+ when 'Fixnum'
297
+ 'INT'
298
+ when 'Float'
299
+ 'REAL'
300
+ when 'BigDecimal', 'Spider::DataTypes::Decimal'
301
+ 'DECIMAL'
302
+ when 'Date', 'DateTime'
303
+ 'DATE'
304
+ when 'Spider::DataTypes::Binary'
305
+ 'BLOB'
306
+ when 'Spider::DataTypes::Bool'
307
+ 'INT'
308
+ end
309
+ end
310
+
311
+ # Returns the attributes corresponding to element type and attributes
312
+ def column_attributes(type, attributes)
313
+ db_attributes = {}
314
+ case type.name
315
+ when 'String', 'Spider::DataTypes::Text'
316
+ db_attributes[:length] = attributes[:length] if (attributes[:length])
317
+ when 'Float'
318
+ db_attributes[:length] = attributes[:length] if (attributes[:length])
319
+ db_attributes[:precision] = attributes[:precision] if (attributes[:precision])
320
+ when 'BigDecimal'
321
+ db_attributes[:precision] = attributes[:precision] || 65
322
+ db_attributes[:scale] = attributes[:scale] || 2
323
+ when 'Spider::DataTypes::Binary'
324
+ db_attributes[:length] = attributes[:length] if (attributes[:length])
325
+ when 'Spider::DataTypes::Bool'
326
+ db_attributes[:length] = 1
327
+ end
328
+ db_attributes[:autoincrement] = attributes[:autoincrement] if supports?(:autoincrement)
329
+ return db_attributes
330
+ end
331
+
332
+ # Returns the SQL for a QueryFuncs::Function
333
+ def function(func)
334
+ fields = func.elements.map{ |func_el|
335
+ if (func_el.is_a?(Spider::QueryFuncs::Function))
336
+ function(func_el)
337
+ else
338
+ func.mapper_fields[func_el]
339
+ end
340
+ }.join(', ')
341
+ case func.func_name
342
+ when :length
343
+ return "LENGTH(#{fields})"
344
+ when :trim
345
+ return "TRIM(#{fields})"
346
+ end
347
+ raise NotImplementedError, "#{self.class} does not support function #{type}"
348
+ end
349
+
350
+ ##################################################################
351
+ # Preparing values #
352
+ ##################################################################
353
+
354
+ # Prepares a value for saving.
355
+ def value_for_save(type, value, save_mode)
356
+ return prepare_value(type, value)
357
+ end
358
+
359
+ # Prepares a value that will be used in a condition.
360
+ def value_for_condition(type, value)
361
+ return prepare_value(type, value)
362
+ end
363
+
364
+ # Converts a value loaded from the DB to return it to the mapper.
365
+ def value_to_mapper(type, value)
366
+ if (type.name == 'String' || type.name == 'Spider::DataTypes::Text')
367
+ enc = @configuration['encoding']
368
+ if (enc && enc.downcase != 'utf-8')
369
+ begin
370
+ value = Iconv.conv('utf-8//IGNORE', enc, value.to_s+' ')[0..-2] if value
371
+ rescue Iconv::InvalidCharacter
372
+ value = ''
373
+ end
374
+ end
375
+ end
376
+ return value
377
+ end
378
+
379
+ # Prepares a value that will be used on the DB.
380
+ def prepare_value(type, value)
381
+ case type.name
382
+ when 'String', 'Spider::DataTypes::Text'
383
+ enc = @configuration['encoding']
384
+ if (enc && enc.downcase != 'utf-8')
385
+ begin
386
+ value = Iconv.conv(enc+'//IGNORE', 'utf-8', value.to_s+' ')[0..-2]
387
+ rescue Iconv::InvalidCharacter
388
+ value = ''
389
+ end
390
+ end
391
+ when 'BigDecimal'
392
+ value = value.to_f
393
+ end
394
+ return value
395
+ end
396
+
397
+ # Executes a select query (given in struct form).
398
+ def query(query)
399
+ curr[:last_query] = query
400
+ case query[:query_type]
401
+ when :select
402
+ sql, bind_vars = sql_select(query)
403
+ execute(sql, *bind_vars)
404
+ when :count
405
+ query[:keys] = ['COUNT(*) AS N']
406
+ sql, bind_vars = sql_select(query)
407
+ return execute(sql, *bind_vars)[0]['N'].to_i
408
+ end
409
+ end
410
+
411
+ # Returns a two element array, containing the SQL for given select query, and the variables to bind.
412
+ def sql_select(query)
413
+ curr[:last_query_type] = :select
414
+ bind_vars = query[:bind_vars] || []
415
+ tables_sql, tables_values = sql_tables(query)
416
+ sql = "SELECT #{sql_keys(query)} FROM #{tables_sql} "
417
+ bind_vars += tables_values
418
+ where, vals = sql_condition(query)
419
+ bind_vars += vals
420
+ sql += "WHERE #{where} " if where && !where.empty?
421
+ order = sql_order(query)
422
+ sql += "ORDER BY #{order} " if order && !order.empty?
423
+ limit = sql_limit(query)
424
+ sql += limit if limit
425
+ return sql, bind_vars
426
+ end
427
+
428
+ def total_rows
429
+ curr[:total_rows]
430
+ end
431
+
432
+ # Returns the SQL for select keys.
433
+ def sql_keys(query)
434
+ query[:keys].join(',')
435
+ end
436
+
437
+ # Returns an array containing the 'FROM' part of an SQL query (including joins),
438
+ # and the bound variables, if any.
439
+ def sql_tables(query)
440
+ values = []
441
+ sql = query[:tables].map{ |table|
442
+ str = table.name
443
+ if (query[:joins] && query[:joins][table])
444
+ join_str, join_values = sql_tables_join(query, table)
445
+ str += " "+join_str
446
+ values += join_values
447
+ end
448
+ str
449
+ }.join(', ')
450
+ return [sql, values]
451
+ end
452
+
453
+ # Returns SQL and bound variables for joins.
454
+ def sql_tables_join(query, table)
455
+ str = ""
456
+ values = []
457
+ query[:joins][table].each_key do |to_table|
458
+ join, join_values = sql_joins(query[:joins][table][to_table])
459
+ str += " "+join
460
+ values += join_values
461
+ if (query[:joins][to_table])
462
+ query[:joins][to_table].delete(table) # avoid endless loop
463
+ sub_str, sub_values = sql_tables_join(query, to_table)
464
+ str += " "+sub_str
465
+ values += sub_values
466
+ end
467
+ end
468
+ return str, values
469
+ end
470
+
471
+ # Returns SQL and bound variables for a condition.
472
+ def sql_condition(query)
473
+ condition = query[:condition]
474
+ return ['', []] unless (condition && condition[:values])
475
+ bind_vars = []
476
+ mapped = condition[:values].map do |v|
477
+ if (v.is_a? Hash) # subconditions
478
+ # FIXME: optimize removing recursion
479
+ sql, vals = sql_condition({:condition => v})
480
+ bind_vars += vals
481
+ !sql.empty? ? "(#{sql})" : nil
482
+ elsif (v[2].is_a? Spider::QueryFuncs::Expression)
483
+ sql_condition_value(v[0], v[1], v[2].to_s, false)
484
+ else
485
+ v[1] = 'between' if (v[2].is_a?(Range))
486
+ v[2].upcase! if (v[1].to_s.downcase == 'ilike')
487
+ if (v[1].to_s.downcase == 'between')
488
+ bind_vars << v[2].first
489
+ bind_vars << v[2].last
490
+ else
491
+ bind_vars << v[2] unless v[2].nil?
492
+ end
493
+ sql_condition_value(v[0], v[1], v[2])
494
+ end
495
+ end
496
+ return mapped.select{ |p| p != nil}.join(' '+condition[:conj]+' '), bind_vars
497
+ end
498
+
499
+ # Returns the SQL for a condition comparison.
500
+ def sql_condition_value(key, comp, value, bound_vars=true)
501
+ if (comp.to_s.downcase == 'ilike')
502
+ comp = 'like'
503
+ key = "UPPER(#{key})"
504
+ end
505
+ if (value.nil?)
506
+ comp = comp == '=' ? "IS" : "IS NOT"
507
+ sql = "#{key} #{comp} NULL"
508
+ else
509
+ if (comp.to_s.downcase == 'between')
510
+ if (bound_vars)
511
+ val0, val1 = value
512
+ else
513
+ val0 = val1 = '?'
514
+ end
515
+ sql = "#{key} #{comp} #{val0} AND #{val1}"
516
+ else
517
+ val = bound_vars ? '?' : value
518
+ sql = "#{key} #{comp} #{val}"
519
+ end
520
+ end
521
+ return sql
522
+ end
523
+
524
+ # def sql_join(joins)
525
+ # sql = ""
526
+ # joins.each_key do |from_table|
527
+ # joins[from_table].each do |to_table, conditions|
528
+ # conditions.each do |from_key, to_key|
529
+ # sql += " AND " unless sql.empty?
530
+ # sql += "#{from_table}.#{from_key} = #{to_table}.#{to_key}"
531
+ # end
532
+ # end
533
+ # end
534
+ # return sql
535
+ # end
536
+
537
+ # Returns SQL and values for DB joins.
538
+ def sql_joins(joins)
539
+ types = {
540
+ :inner => 'INNER', :outer => 'OUTER', :left => 'LEFT OUTER', :right => 'RIGHT OUTER'
541
+ }
542
+ values = []
543
+ sql = joins.map{ |join|
544
+ sql_on = join[:keys].map{ |from_f, to_f| "#{from_f} = #{to_f}"}.join(' AND ')
545
+ if (join[:condition])
546
+ condition_sql, condition_values = sql_condition({:condition => join[:condition]})
547
+ sql_on += " and #{condition_sql}"
548
+ values += condition_values
549
+ end
550
+ j = "#{types[join[:type]]} JOIN #{join[:to]}"
551
+ j += " #{join[:as]}" if join[:as]
552
+ j += " ON (#{sql_on})"
553
+ j
554
+ }.join(" ")
555
+ return [sql, values]
556
+ end
557
+
558
+ # Returns SQL for the ORDER part.
559
+ def sql_order(query)
560
+ return '' unless query[:order]
561
+ return query[:order].map{|o| "#{o[0]} #{o[1]}"}.join(' ,')
562
+ end
563
+
564
+ # Returns the LIMIT and OFFSET SQL.
565
+ def sql_limit(query)
566
+ sql = ""
567
+ sql += "LIMIT #{query[:limit]} " if query[:limit]
568
+ sql += "OFFSET #{query[:offset]} " if query[:offset]
569
+ return sql
570
+ end
571
+
572
+ # Returns SQL and values for an insert statement.
573
+ def sql_insert(insert)
574
+ curr[:last_query_type] = :insert
575
+ sql = "INSERT INTO #{insert[:table]} (#{insert[:values].keys.join(', ')}) " +
576
+ "VALUES (#{insert[:values].values.map{'?'}.join(', ')})"
577
+ return [sql, insert[:values].values]
578
+ end
579
+
580
+ # Returns SQL and values for an update statement.
581
+ def sql_update(update)
582
+ curr[:last_query_type] = :update
583
+ values = []
584
+ tables = update[:table]
585
+ if (update[:joins] && update[:joins][update[:table]])
586
+ join_str, join_values = sql_tables_join(update, update[:table])
587
+ tables += " "+join_str
588
+ values += join_values
589
+ end
590
+ values += update[:values].values.reject{ |v| v.is_a?(Spider::QueryFuncs::Expression) }
591
+ sql = "UPDATE #{tables} SET "
592
+ sql += sql_update_values(update)
593
+ where, bind_vars = sql_condition(update)
594
+ values += bind_vars
595
+ sql += " WHERE #{where}"
596
+ return [sql, values]
597
+ end
598
+
599
+ # Returns the COLUMN = val, ... part of an update statement.
600
+ def sql_update_values(update)
601
+ update[:values].map{ |k, v|
602
+ v.is_a?(Spider::QueryFuncs::Expression) ? "#{k} = #{v}" : "#{k} = ?"
603
+ }.join(', ')
604
+ end
605
+
606
+ # Returns SQL and bound values for a DELETE statement.
607
+ def sql_delete(delete, force=false)
608
+ curr[:last_query_type] = :delete
609
+ where, bind_vars = sql_condition(delete)
610
+ where = "1=0" if !force && (!where || where.empty?)
611
+ sql = "DELETE FROM #{delete[:table]}"
612
+ sql += " WHERE #{where}" if where && !where.empty?
613
+ return [sql, bind_vars]
614
+ end
615
+
616
+ # Returns an array of SQL statements for a create structured description.
617
+ def sql_create_table(create)
618
+ name = create[:table]
619
+ fields = create[:fields]
620
+ sql_fields = ''
621
+ fields.each do |field|
622
+ attributes = field[:attributes]
623
+ attributes ||= {}
624
+ length = attributes[:length]
625
+ sql_fields += ', ' unless sql_fields.empty?
626
+ sql_fields += sql_table_field(field[:name], field[:type], attributes)
627
+ end
628
+ if (create[:attributes][:primary_keys] && !create[:attributes][:primary_keys].empty?)
629
+ primary_key_fields = create[:attributes][:primary_keys].join(', ')
630
+ sql_fields += ", PRIMARY KEY (#{primary_key_fields})"
631
+ end
632
+ ["CREATE TABLE #{name} (#{sql_fields})"]
633
+ end
634
+
635
+ # Returns an array of SQL statements for an alter structured description.
636
+ def sql_alter_table(alter)
637
+ current = alter[:current]
638
+ table_name = alter[:table]
639
+ add_fields = alter[:add_fields]
640
+ alter_fields = alter[:alter_fields]
641
+ alter_attributes = alter[:attributes]
642
+ sqls = []
643
+
644
+ add_fields.each do |field|
645
+ name, type, attributes = field
646
+ sqls += sql_add_field(table_name, field[:name], field[:type], field[:attributes])
647
+ end
648
+ alter_fields.each do |field|
649
+ name, type, attributes = field
650
+ sqls += sql_alter_field(table_name, field[:name], field[:type], field[:attributes])
651
+ end
652
+ if (alter_attributes[:primary_keys] && !alter_attributes[:primary_keys].empty?)
653
+ sqls << sql_drop_primary_key(table_name) if (!current[:primary_keys].empty? && current[:primary_keys] != alter_attributes[:primary_keys])
654
+ sqls << sql_create_primary_key(table_name, alter_attributes[:primary_keys])
655
+ end
656
+ if (alter_attributes[:foreign_key_constraints])
657
+ cur_fkc = current && current[:foreign_key_constraints] ? current[:foreign_key_constraints] : []
658
+ cur_fkc.each do |fkc|
659
+ next if alter_attributes[:foreign_key_constraints].include?(fkc)
660
+ sqls << sql_drop_foreign_key(table_name, foreign_key_name(fkc.name))
661
+ end
662
+ if (alter_attributes[:foreign_key_constraints])
663
+ alter_attributes[:foreign_key_constraints].each do |fkc|
664
+ next if cur_fkc.include?(fkc)
665
+ sql = "ALTER TABLE #{table_name} ADD CONSTRAINT #{foreign_key_name(fkc.name)} FOREIGN KEY (#{fkc.fields.keys.join(',')}) "
666
+ sql += "REFERENCES #{fkc.table} (#{fkc.fields.values.join(',')})"
667
+ sqls << sql
668
+ end
669
+ end
670
+ end
671
+ return sqls
672
+ end
673
+
674
+
675
+ # Executes a create table structured description.
676
+ def create_table(create)
677
+ sqls = sql_create_table(create)
678
+ sqls.each do |sql|
679
+ execute(sql)
680
+ end
681
+ end
682
+
683
+ # Executes an alter table structured description.
684
+ def alter_table(alter)
685
+ sqls = sql_alter_table(alter)
686
+ sqls.each do |sql|
687
+ execute(sql)
688
+ end
689
+ end
690
+
691
+ # Drops a field from the DB.
692
+ def drop_field(table_name, field_name)
693
+ sqls = sql_drop_field(table_name, field_name)
694
+ sqls.each{ |sql| execute(sql) }
695
+ end
696
+
697
+ # Drops a table from the DB.
698
+ def drop_table(table_name)
699
+ sqls = sql_drop_table(table_name)
700
+ sqls.each{ |sql| execute(sql) }
701
+ end
702
+
703
+ def sql_drop_primary_key(table_name)
704
+ "ALTER TABLE #{table_name} DROP PRIMARY KEY"
705
+ end
706
+
707
+ def sql_drop_foreign_key(table_name, key_name)
708
+ "ALTER TABLE #{table_name} DROP FOREIGN KEY #{key_name}"
709
+ end
710
+
711
+ def sql_create_primary_key(table_name, fields)
712
+ "ALTER TABLE #{table_name} ADD PRIMARY KEY ("+fields.join(', ')+")"
713
+ end
714
+
715
+ # Returns the SQL for a field definition (used in create and alter table)
716
+ def sql_table_field(name, type, attributes)
717
+ f = "#{name} #{type}"
718
+ if (type == 'DECIMAL')
719
+ f += "(#{attributes[:precision]}, #{attributes[:scale]})"
720
+ else
721
+ if attributes[:length] && attributes[:length] != 0
722
+ f += "(#{attributes[:length]})"
723
+ elsif attributes[:precision]
724
+ f += "(#{attributes[:precision]}"
725
+ f += "#{attributes[:scale]}" if attributes[:scale]
726
+ f += ")"
727
+ end
728
+ end
729
+ return f
730
+ end
731
+
732
+ # Returns an array of SQL statements to add a field.
733
+ def sql_add_field(table_name, name, type, attributes)
734
+ ["ALTER TABLE #{table_name} ADD #{sql_table_field(name, type, attributes)}"]
735
+ end
736
+
737
+ # Returns an array of SQL statements to alter a field.
738
+ def sql_alter_field(table_name, name, type, attributes)
739
+ ["ALTER TABLE #{table_name} MODIFY #{sql_table_field(name, type, attributes)}"]
740
+ end
741
+
742
+ # Returns an array of SQL statements to drop a field.
743
+ def sql_drop_field(table_name, field_name)
744
+ ["ALTER TABLE #{table_name} DROP COLUMN #{field_name}"]
745
+ end
746
+
747
+ # Returns an array of SQL statements needed to drop a table.
748
+ def sql_drop_table(table_name)
749
+ ["DROP TABLE #{table_name}"]
750
+ end
751
+
752
+ # Checks if a DB field is equal to a schema field.
753
+ def schema_field_equal?(current, field)
754
+ attributes = field[:attributes]
755
+ return false unless current[:type] == field[:type] ||
756
+ (self.class.type_synonyms && self.class.type_synonyms[current[:type]] && self.class.type_synonyms[current[:type]].include?(field[:type]))
757
+ try_method = :"schema_field_#{field[:type].downcase}_equal?"
758
+ return send(try_method, current, field) if (respond_to?(try_method))
759
+ current[:length] ||= 0; attributes[:length] ||= 0; current[:precision] ||= 0; attributes[:precision] ||= 0
760
+ return false unless current[:length] == attributes[:length]
761
+ return false unless current[:precision] == attributes[:precision]
762
+ return true
763
+ end
764
+
765
+
766
+ # Checks if the conversion from a current DB field to a schema field is safe, i.e. can
767
+ # be done without loss of data.
768
+ def safe_schema_conversion?(current, field)
769
+ attributes = field[:attributes]
770
+ safe = self.class.safe_conversions
771
+ if (current[:type] != field[:type])
772
+ if safe[current[:type]] && safe[current[:type]].include?(field[:type])
773
+ return true
774
+ else
775
+ return false
776
+ end
777
+ end
778
+ return true if ((!current[:length] || current[:length] == 0) \
779
+ || (attributes[:length] && current[:length] <= attributes[:length])) && \
780
+ ((!current[:precision] || current[:precision] == 0) \
781
+ || (attributes[:precision] && current[:precision] <= attributes[:precision]))
782
+ return false
783
+ end
784
+
785
+ # Shortens a DB name up to length.
786
+ def shorten_identifier(name, length)
787
+ while (name.length > length)
788
+ parts = name.split('_')
789
+ max = 0
790
+ max_i = nil
791
+ parts.each_index do |i|
792
+ if (parts[i].length > max)
793
+ max = parts[i].length
794
+ max_i = i
795
+ end
796
+ end
797
+ parts[max_i] = parts[max_i][0..-2]
798
+ name = parts.join('_')
799
+ name.gsub!('_+', '_')
800
+ end
801
+ return name
802
+ end
803
+
804
+ # Returns an array of the table names currently in the DB.
805
+ def list_tables
806
+ raise "Unimplemented"
807
+ end
808
+
809
+ # Returns a description of the table as currently present in the DB.
810
+ def describe_table(table)
811
+ raise "Unimplemented"
812
+ end
813
+
814
+ # Post processes column information retrieved from current DB.
815
+ def parse_db_column(col)
816
+ col
817
+ end
818
+
819
+ ##############################################################
820
+ # Aggregates #
821
+ ##############################################################
822
+
823
+ def sql_max(max)
824
+ values = []
825
+ from_sql, from_values = sql_tables(max)
826
+ values += from_values
827
+ sql = "SELECT MAX(#{max[:field]}) AS M FROM #{from_sql}"
828
+ if (max[:condition])
829
+ condition_sql, condition_values = sql_condition(max)
830
+ sql += " WHERE #{condition_sql}"
831
+ values += condition_values
832
+ end
833
+ return sql, values
834
+ end
835
+
836
+ ##############################################################
837
+ # Reflection #
838
+ ##############################################################
839
+
840
+
841
+ def reflect_column(table, column_name, column_attributes)
842
+ column_type = column_attributes[:type]
843
+ el_type = nil
844
+ el_attributes = {}
845
+ case column_type
846
+ when 'TEXT'
847
+ el_type = String
848
+ when 'LONGTEXT'
849
+ el_type = Text
850
+ when 'INT'
851
+ if (column_attributes[:length] == 1)
852
+ el_type = Spider::DataTypes::Bool
853
+ else
854
+ el_type = Fixnum
855
+ end
856
+ when 'REAL'
857
+ el_type = Float
858
+ when 'DECIMAL'
859
+ el_type = BigDecimal
860
+ when 'DATE'
861
+ el_type = DateTime
862
+ when 'BLOB'
863
+ el_type = Spider::DataTypes::Binary
864
+ end
865
+ return el_type, el_attributes
866
+
867
+ end
868
+
869
+
870
+ end
871
+
872
+ end; end; end; end