spiderfw 0.5

Sign up to get free protection for your applications and to get access to all the features.
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