shoesgem 0.1480.0 → 0.1514.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (447) hide show
  1. data/LICENSE +30 -30
  2. data/README.rdoc +34 -34
  3. data/lib/shoes.rb +4 -4
  4. data/shoes/CHANGELOG.txt +29 -21
  5. data/shoes/COPYING.txt +30 -30
  6. data/shoes/README.txt +117 -117
  7. data/shoes/VERSION.txt +1 -1
  8. data/shoes/freetype6.dll +0 -0
  9. data/shoes/lib/shoes.rb +547 -524
  10. data/shoes/lib/shoes/cache.rb +54 -54
  11. data/shoes/lib/shoes/chipmunk.rb +35 -35
  12. data/shoes/lib/shoes/data.rb +39 -39
  13. data/shoes/lib/shoes/help.rb +468 -468
  14. data/shoes/lib/shoes/image.rb +25 -25
  15. data/shoes/lib/shoes/inspect.rb +128 -128
  16. data/shoes/lib/shoes/log.rb +48 -48
  17. data/shoes/lib/shoes/minitar.rb +986 -986
  18. data/shoes/lib/shoes/override.rb +38 -38
  19. data/shoes/lib/shoes/pack.rb +505 -503
  20. data/shoes/lib/shoes/search.rb +46 -46
  21. data/shoes/lib/shoes/setup.rb +329 -329
  22. data/shoes/lib/shoes/shy.rb +131 -131
  23. data/shoes/lib/shoes/shybuilder.rb +44 -44
  24. data/shoes/libcairo-2.dll +0 -0
  25. data/shoes/libeay32.dll +0 -0
  26. data/shoes/libexpat-1.dll +0 -0
  27. data/shoes/libfontconfig-1.dll +0 -0
  28. data/shoes/libgio-2.0-0.dll +0 -0
  29. data/shoes/libglib-2.0-0.dll +0 -0
  30. data/shoes/libgmodule-2.0-0.dll +0 -0
  31. data/shoes/libgobject-2.0-0.dll +0 -0
  32. data/shoes/libgthread-2.0-0.dll +0 -0
  33. data/shoes/libiconv2.dll +0 -0
  34. data/shoes/libjpeg-8.dll +0 -0
  35. data/shoes/libpango-1.0-0.dll +0 -0
  36. data/shoes/libpangocairo-1.0-0.dll +0 -0
  37. data/shoes/libpangoft2-1.0-0.dll +0 -0
  38. data/shoes/libpangowin32-1.0-0.dll +0 -0
  39. data/shoes/libpng14-14.dll +0 -0
  40. data/shoes/libportaudio-2.dll +0 -0
  41. data/shoes/libshoes.dll +0 -0
  42. data/shoes/libssl32.dll +0 -0
  43. data/shoes/libungif4.dll +0 -0
  44. data/shoes/libvlc.dll +0 -0
  45. data/shoes/msvcrt-ruby191.dll +0 -0
  46. data/shoes/plugins/liba52_plugin.dll +0 -0
  47. data/shoes/plugins/liba52sys_plugin.dll +0 -0
  48. data/shoes/plugins/liba52tofloat32_plugin.dll +0 -0
  49. data/shoes/plugins/liba52tospdif_plugin.dll +0 -0
  50. data/shoes/plugins/libaccess_directory_plugin.dll +0 -0
  51. data/shoes/plugins/libaccess_fake_plugin.dll +0 -0
  52. data/shoes/plugins/libaccess_file_plugin.dll +0 -0
  53. data/shoes/plugins/libaccess_filter_dump_plugin.dll +0 -0
  54. data/shoes/plugins/libaccess_filter_record_plugin.dll +0 -0
  55. data/shoes/plugins/libaccess_filter_timeshift_plugin.dll +0 -0
  56. data/shoes/plugins/libaccess_ftp_plugin.dll +0 -0
  57. data/shoes/plugins/libaccess_http_plugin.dll +0 -0
  58. data/shoes/plugins/libaccess_mms_plugin.dll +0 -0
  59. data/shoes/plugins/libaccess_output_dummy_plugin.dll +0 -0
  60. data/shoes/plugins/libaccess_output_file_plugin.dll +0 -0
  61. data/shoes/plugins/libaccess_output_http_plugin.dll +0 -0
  62. data/shoes/plugins/libaccess_output_shout_plugin.dll +0 -0
  63. data/shoes/plugins/libaccess_output_udp_plugin.dll +0 -0
  64. data/shoes/plugins/libaccess_realrtsp_plugin.dll +0 -0
  65. data/shoes/plugins/libaccess_smb_plugin.dll +0 -0
  66. data/shoes/plugins/libaccess_tcp_plugin.dll +0 -0
  67. data/shoes/plugins/libaccess_udp_plugin.dll +0 -0
  68. data/shoes/plugins/libadjust_plugin.dll +0 -0
  69. data/shoes/plugins/libadpcm_plugin.dll +0 -0
  70. data/shoes/plugins/libaiff_plugin.dll +0 -0
  71. data/shoes/plugins/libaout_directx_plugin.dll +0 -0
  72. data/shoes/plugins/libaout_file_plugin.dll +0 -0
  73. data/shoes/plugins/libaraw_plugin.dll +0 -0
  74. data/shoes/plugins/libasf_plugin.dll +0 -0
  75. data/shoes/plugins/libau_plugin.dll +0 -0
  76. data/shoes/plugins/libaudio_format_plugin.dll +0 -0
  77. data/shoes/plugins/libavi_plugin.dll +0 -0
  78. data/shoes/plugins/libbandlimited_resampler_plugin.dll +0 -0
  79. data/shoes/plugins/libblend_plugin.dll +0 -0
  80. data/shoes/plugins/libcaca_plugin.dll +0 -0
  81. data/shoes/plugins/libcdda_plugin.dll +0 -0
  82. data/shoes/plugins/libcinepak_plugin.dll +0 -0
  83. data/shoes/plugins/libclone_plugin.dll +0 -0
  84. data/shoes/plugins/libcmml_plugin.dll +0 -0
  85. data/shoes/plugins/libcrop_plugin.dll +0 -0
  86. data/shoes/plugins/libcvdsub_plugin.dll +0 -0
  87. data/shoes/plugins/libdeinterlace_plugin.dll +0 -0
  88. data/shoes/plugins/libdemuxdump_plugin.dll +0 -0
  89. data/shoes/plugins/libdirect3d_plugin.dll +0 -0
  90. data/shoes/plugins/libdistort_plugin.dll +0 -0
  91. data/shoes/plugins/libdmo_plugin.dll +0 -0
  92. data/shoes/plugins/libdolby_surround_decoder_plugin.dll +0 -0
  93. data/shoes/plugins/libdshow_plugin.dll +0 -0
  94. data/shoes/plugins/libdts_plugin.dll +0 -0
  95. data/shoes/plugins/libdtssys_plugin.dll +0 -0
  96. data/shoes/plugins/libdtstofloat32_plugin.dll +0 -0
  97. data/shoes/plugins/libdtstospdif_plugin.dll +0 -0
  98. data/shoes/plugins/libdummy_plugin.dll +0 -0
  99. data/shoes/plugins/libdvbsub_plugin.dll +0 -0
  100. data/shoes/plugins/libdvdnav_plugin.dll +0 -0
  101. data/shoes/plugins/libdvdread_plugin.dll +0 -0
  102. data/shoes/plugins/libequalizer_plugin.dll +0 -0
  103. data/shoes/plugins/libexport_plugin.dll +0 -0
  104. data/shoes/plugins/libfaad_plugin.dll +0 -0
  105. data/shoes/plugins/libfake_plugin.dll +0 -0
  106. data/shoes/plugins/libffmpeg_plugin.dll +0 -0
  107. data/shoes/plugins/libfixed32tofloat32_plugin.dll +0 -0
  108. data/shoes/plugins/libfixed32tos16_plugin.dll +0 -0
  109. data/shoes/plugins/libflac_plugin.dll +0 -0
  110. data/shoes/plugins/libflacdec_plugin.dll +0 -0
  111. data/shoes/plugins/libfloat32_mixer_plugin.dll +0 -0
  112. data/shoes/plugins/libfloat32tos16_plugin.dll +0 -0
  113. data/shoes/plugins/libfloat32tos8_plugin.dll +0 -0
  114. data/shoes/plugins/libfloat32tou16_plugin.dll +0 -0
  115. data/shoes/plugins/libfloat32tou8_plugin.dll +0 -0
  116. data/shoes/plugins/libfreetype_plugin.dll +0 -0
  117. data/shoes/plugins/libgestures_plugin.dll +0 -0
  118. data/shoes/plugins/libglwin32_plugin.dll +0 -0
  119. data/shoes/plugins/libgoom_plugin.dll +0 -0
  120. data/shoes/plugins/libgrowl_plugin.dll +0 -0
  121. data/shoes/plugins/libh264_plugin.dll +0 -0
  122. data/shoes/plugins/libheadphone_channel_mixer_plugin.dll +0 -0
  123. data/shoes/plugins/libhotkeys_plugin.dll +0 -0
  124. data/shoes/plugins/libhttp_plugin.dll +0 -0
  125. data/shoes/plugins/libi420_rgb_plugin.dll +0 -0
  126. data/shoes/plugins/libi420_ymga_plugin.dll +0 -0
  127. data/shoes/plugins/libi420_yuy2_plugin.dll +0 -0
  128. data/shoes/plugins/libi422_yuy2_plugin.dll +0 -0
  129. data/shoes/plugins/libid3tag_plugin.dll +0 -0
  130. data/shoes/plugins/libimage_plugin.dll +0 -0
  131. data/shoes/plugins/libinvert_plugin.dll +0 -0
  132. data/shoes/plugins/libipv4_plugin.dll +0 -0
  133. data/shoes/plugins/libipv6_plugin.dll +0 -0
  134. data/shoes/plugins/liblibmpeg2_plugin.dll +0 -0
  135. data/shoes/plugins/liblinear_resampler_plugin.dll +0 -0
  136. data/shoes/plugins/liblogger_plugin.dll +0 -0
  137. data/shoes/plugins/liblogo_plugin.dll +0 -0
  138. data/shoes/plugins/liblpcm_plugin.dll +0 -0
  139. data/shoes/plugins/libm3u_plugin.dll +0 -0
  140. data/shoes/plugins/libm4a_plugin.dll +0 -0
  141. data/shoes/plugins/libm4v_plugin.dll +0 -0
  142. data/shoes/plugins/libmagnify_plugin.dll +0 -0
  143. data/shoes/plugins/libmarq_plugin.dll +0 -0
  144. data/shoes/plugins/libmemcpy_plugin.dll +0 -0
  145. data/shoes/plugins/libmjpeg_plugin.dll +0 -0
  146. data/shoes/plugins/libmkv_plugin.dll +0 -0
  147. data/shoes/plugins/libmod_plugin.dll +0 -0
  148. data/shoes/plugins/libmosaic_plugin.dll +0 -0
  149. data/shoes/plugins/libmotionblur_plugin.dll +0 -0
  150. data/shoes/plugins/libmotiondetect_plugin.dll +0 -0
  151. data/shoes/plugins/libmp4_plugin.dll +0 -0
  152. data/shoes/plugins/libmpc_plugin.dll +0 -0
  153. data/shoes/plugins/libmpeg_audio_plugin.dll +0 -0
  154. data/shoes/plugins/libmpga_plugin.dll +0 -0
  155. data/shoes/plugins/libmpgatofixed32_plugin.dll +0 -0
  156. data/shoes/plugins/libmpgv_plugin.dll +0 -0
  157. data/shoes/plugins/libmsn_plugin.dll +0 -0
  158. data/shoes/plugins/libmux_asf_plugin.dll +0 -0
  159. data/shoes/plugins/libmux_avi_plugin.dll +0 -0
  160. data/shoes/plugins/libmux_dummy_plugin.dll +0 -0
  161. data/shoes/plugins/libmux_mp4_plugin.dll +0 -0
  162. data/shoes/plugins/libmux_mpjpeg_plugin.dll +0 -0
  163. data/shoes/plugins/libmux_ogg_plugin.dll +0 -0
  164. data/shoes/plugins/libmux_ps_plugin.dll +0 -0
  165. data/shoes/plugins/libmux_wav_plugin.dll +0 -0
  166. data/shoes/plugins/libnetsync_plugin.dll +0 -0
  167. data/shoes/plugins/libnormvol_plugin.dll +0 -0
  168. data/shoes/plugins/libnsc_plugin.dll +0 -0
  169. data/shoes/plugins/libnsv_plugin.dll +0 -0
  170. data/shoes/plugins/libntservice_plugin.dll +0 -0
  171. data/shoes/plugins/libnuv_plugin.dll +0 -0
  172. data/shoes/plugins/libogg_plugin.dll +0 -0
  173. data/shoes/plugins/libopengl_plugin.dll +0 -0
  174. data/shoes/plugins/libosdmenu_plugin.dll +0 -0
  175. data/shoes/plugins/libpacketizer_copy_plugin.dll +0 -0
  176. data/shoes/plugins/libpacketizer_h264_plugin.dll +0 -0
  177. data/shoes/plugins/libpacketizer_mpeg4audio_plugin.dll +0 -0
  178. data/shoes/plugins/libpacketizer_mpeg4video_plugin.dll +0 -0
  179. data/shoes/plugins/libpacketizer_mpegvideo_plugin.dll +0 -0
  180. data/shoes/plugins/libparam_eq_plugin.dll +0 -0
  181. data/shoes/plugins/libplaylist_plugin.dll +0 -0
  182. data/shoes/plugins/libpng_plugin.dll +0 -0
  183. data/shoes/plugins/libpodcast_plugin.dll +0 -0
  184. data/shoes/plugins/libportaudio_plugin.dll +0 -0
  185. data/shoes/plugins/libps_plugin.dll +0 -0
  186. data/shoes/plugins/libpva_plugin.dll +0 -0
  187. data/shoes/plugins/librawdv_plugin.dll +0 -0
  188. data/shoes/plugins/librawvideo_plugin.dll +0 -0
  189. data/shoes/plugins/librc_plugin.dll +0 -0
  190. data/shoes/plugins/libreal_plugin.dll +0 -0
  191. data/shoes/plugins/librealaudio_plugin.dll +0 -0
  192. data/shoes/plugins/librss_plugin.dll +0 -0
  193. data/shoes/plugins/librv32_plugin.dll +0 -0
  194. data/shoes/plugins/libs16tofixed32_plugin.dll +0 -0
  195. data/shoes/plugins/libs16tofloat32_plugin.dll +0 -0
  196. data/shoes/plugins/libs16tofloat32swab_plugin.dll +0 -0
  197. data/shoes/plugins/libs8tofloat32_plugin.dll +0 -0
  198. data/shoes/plugins/libsap_plugin.dll +0 -0
  199. data/shoes/plugins/libscale_plugin.dll +0 -0
  200. data/shoes/plugins/libscreen_plugin.dll +0 -0
  201. data/shoes/plugins/libsdl_image_plugin.dll +0 -0
  202. data/shoes/plugins/libsgimb_plugin.dll +0 -0
  203. data/shoes/plugins/libshout_plugin.dll +0 -0
  204. data/shoes/plugins/libshowintf_plugin.dll +0 -0
  205. data/shoes/plugins/libsimple_channel_mixer_plugin.dll +0 -0
  206. data/shoes/plugins/libspdif_mixer_plugin.dll +0 -0
  207. data/shoes/plugins/libspeex_plugin.dll +0 -0
  208. data/shoes/plugins/libspudec_plugin.dll +0 -0
  209. data/shoes/plugins/libstream_out_bridge_plugin.dll +0 -0
  210. data/shoes/plugins/libstream_out_description_plugin.dll +0 -0
  211. data/shoes/plugins/libstream_out_display_plugin.dll +0 -0
  212. data/shoes/plugins/libstream_out_dummy_plugin.dll +0 -0
  213. data/shoes/plugins/libstream_out_duplicate_plugin.dll +0 -0
  214. data/shoes/plugins/libstream_out_es_plugin.dll +0 -0
  215. data/shoes/plugins/libstream_out_gather_plugin.dll +0 -0
  216. data/shoes/plugins/libstream_out_mosaic_bridge_plugin.dll +0 -0
  217. data/shoes/plugins/libstream_out_rtp_plugin.dll +0 -0
  218. data/shoes/plugins/libstream_out_standard_plugin.dll +0 -0
  219. data/shoes/plugins/libstream_out_transcode_plugin.dll +0 -0
  220. data/shoes/plugins/libsubsdec_plugin.dll +0 -0
  221. data/shoes/plugins/libsubtitle_plugin.dll +0 -0
  222. data/shoes/plugins/libsvcdsub_plugin.dll +0 -0
  223. data/shoes/plugins/libtelnet_plugin.dll +0 -0
  224. data/shoes/plugins/libtelx_plugin.dll +0 -0
  225. data/shoes/plugins/libtheora_plugin.dll +0 -0
  226. data/shoes/plugins/libtime_plugin.dll +0 -0
  227. data/shoes/plugins/libtransform_plugin.dll +0 -0
  228. data/shoes/plugins/libtrivial_channel_mixer_plugin.dll +0 -0
  229. data/shoes/plugins/libtrivial_mixer_plugin.dll +0 -0
  230. data/shoes/plugins/libtrivial_resampler_plugin.dll +0 -0
  231. data/shoes/plugins/libts_plugin.dll +0 -0
  232. data/shoes/plugins/libtta_plugin.dll +0 -0
  233. data/shoes/plugins/libtwolame_plugin.dll +0 -0
  234. data/shoes/plugins/libty_plugin.dll +0 -0
  235. data/shoes/plugins/libu8tofixed32_plugin.dll +0 -0
  236. data/shoes/plugins/libu8tofloat32_plugin.dll +0 -0
  237. data/shoes/plugins/libugly_resampler_plugin.dll +0 -0
  238. data/shoes/plugins/libvcd_plugin.dll +0 -0
  239. data/shoes/plugins/libvisual_plugin.dll +0 -0
  240. data/shoes/plugins/libvobsub_plugin.dll +0 -0
  241. data/shoes/plugins/libvoc_plugin.dll +0 -0
  242. data/shoes/plugins/libvod_rtsp_plugin.dll +0 -0
  243. data/shoes/plugins/libvorbis_plugin.dll +0 -0
  244. data/shoes/plugins/libvout_directx_plugin.dll +0 -0
  245. data/shoes/plugins/libwall_plugin.dll +0 -0
  246. data/shoes/plugins/libwav_plugin.dll +0 -0
  247. data/shoes/plugins/libwaveout_plugin.dll +0 -0
  248. data/shoes/plugins/libwingdi_plugin.dll +0 -0
  249. data/shoes/plugins/libx264_plugin.dll +0 -0
  250. data/shoes/plugins/libxa_plugin.dll +0 -0
  251. data/shoes/plugins/libxtag_plugin.dll +0 -0
  252. data/shoes/readline5.dll +0 -0
  253. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/fast_xs.so +0 -0
  254. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot.rb +26 -26
  255. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/blankslate.rb +63 -63
  256. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/builder.rb +216 -216
  257. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/elements.rb +510 -510
  258. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/htmlinfo.rb +691 -691
  259. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/inspect.rb +103 -103
  260. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/modules.rb +40 -40
  261. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/parse.rb +38 -38
  262. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tag.rb +202 -202
  263. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tags.rb +164 -164
  264. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/traverse.rb +838 -838
  265. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/xchar.rb +94 -94
  266. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot_scan.so +0 -0
  267. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json.rb +8 -8
  268. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/core.rb +135 -135
  269. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/rails.rb +58 -58
  270. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/common.rb +354 -354
  271. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext.rb +13 -13
  272. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/generator.so +0 -0
  273. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/parser.so +0 -0
  274. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/version.rb +9 -9
  275. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3.rb +11 -11
  276. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/constants.rb +49 -49
  277. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/database.rb +568 -568
  278. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/errors.rb +44 -44
  279. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/pragmas.rb +280 -280
  280. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/resultset.rb +126 -126
  281. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/statement.rb +146 -146
  282. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/translator.rb +114 -114
  283. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/value.rb +57 -57
  284. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3/version.rb +16 -16
  285. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.3.0/lib/sqlite3_native.so +0 -0
  286. data/shoes/ruby/gems/1.9.1/specifications/hpricot-0.8.1.gemspec +32 -32
  287. data/shoes/ruby/gems/1.9.1/specifications/json-shoes-1.1.3.gemspec +34 -34
  288. data/shoes/ruby/gems/1.9.1/specifications/sqlite3-ruby-1.3.0.gemspec +48 -48
  289. data/shoes/ruby/lib/ftsearch/analysis/analyzer.rb +16 -16
  290. data/shoes/ruby/lib/ftsearch/analysis/simple_identifier_analyzer.rb +23 -23
  291. data/shoes/ruby/lib/ftsearch/analysis/whitespace_analyzer.rb +22 -22
  292. data/shoes/ruby/lib/ftsearch/document_map_reader.rb +106 -106
  293. data/shoes/ruby/lib/ftsearch/document_map_writer.rb +46 -46
  294. data/shoes/ruby/lib/ftsearch/field_infos.rb +46 -46
  295. data/shoes/ruby/lib/ftsearch/fragment_writer.rb +114 -114
  296. data/shoes/ruby/lib/ftsearch/fulltext_reader.rb +52 -52
  297. data/shoes/ruby/lib/ftsearch/fulltext_writer.rb +75 -75
  298. data/shoes/ruby/lib/ftsearch/suffix_array_reader.rb +277 -277
  299. data/shoes/ruby/lib/ftsearch/suffix_array_writer.rb +99 -99
  300. data/shoes/ruby/lib/ftsearch/util.rb +21 -21
  301. data/shoes/ruby/lib/i386-mingw32/bigdecimal.so +0 -0
  302. data/shoes/ruby/lib/i386-mingw32/binject.so +0 -0
  303. data/shoes/ruby/lib/i386-mingw32/bloops.so +0 -0
  304. data/shoes/ruby/lib/i386-mingw32/chipmunk.so +0 -0
  305. data/shoes/ruby/lib/i386-mingw32/continuation.so +0 -0
  306. data/shoes/ruby/lib/i386-mingw32/coverage.so +0 -0
  307. data/shoes/ruby/lib/i386-mingw32/curses.so +0 -0
  308. data/shoes/ruby/lib/i386-mingw32/digest.so +0 -0
  309. data/shoes/ruby/lib/i386-mingw32/digest/bubblebabble.so +0 -0
  310. data/shoes/ruby/lib/i386-mingw32/digest/md5.so +0 -0
  311. data/shoes/ruby/lib/i386-mingw32/digest/rmd160.so +0 -0
  312. data/shoes/ruby/lib/i386-mingw32/digest/sha1.so +0 -0
  313. data/shoes/ruby/lib/i386-mingw32/digest/sha2.so +0 -0
  314. data/shoes/ruby/lib/i386-mingw32/dl.so +0 -0
  315. data/shoes/ruby/lib/i386-mingw32/enc/big5.so +0 -0
  316. data/shoes/ruby/lib/i386-mingw32/enc/cp949.so +0 -0
  317. data/shoes/ruby/lib/i386-mingw32/enc/emacs_mule.so +0 -0
  318. data/shoes/ruby/lib/i386-mingw32/enc/encdb.so +0 -0
  319. data/shoes/ruby/lib/i386-mingw32/enc/euc_jp.so +0 -0
  320. data/shoes/ruby/lib/i386-mingw32/enc/euc_kr.so +0 -0
  321. data/shoes/ruby/lib/i386-mingw32/enc/euc_tw.so +0 -0
  322. data/shoes/ruby/lib/i386-mingw32/enc/gb18030.so +0 -0
  323. data/shoes/ruby/lib/i386-mingw32/enc/gb2312.so +0 -0
  324. data/shoes/ruby/lib/i386-mingw32/enc/gbk.so +0 -0
  325. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_1.so +0 -0
  326. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_10.so +0 -0
  327. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_11.so +0 -0
  328. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_13.so +0 -0
  329. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_14.so +0 -0
  330. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_15.so +0 -0
  331. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_16.so +0 -0
  332. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_2.so +0 -0
  333. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_3.so +0 -0
  334. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_4.so +0 -0
  335. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_5.so +0 -0
  336. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_6.so +0 -0
  337. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_7.so +0 -0
  338. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_8.so +0 -0
  339. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_9.so +0 -0
  340. data/shoes/ruby/lib/i386-mingw32/enc/koi8_r.so +0 -0
  341. data/shoes/ruby/lib/i386-mingw32/enc/koi8_u.so +0 -0
  342. data/shoes/ruby/lib/i386-mingw32/enc/shift_jis.so +0 -0
  343. data/shoes/ruby/lib/i386-mingw32/enc/trans/big5.so +0 -0
  344. data/shoes/ruby/lib/i386-mingw32/enc/trans/chinese.so +0 -0
  345. data/shoes/ruby/lib/i386-mingw32/enc/trans/escape.so +0 -0
  346. data/shoes/ruby/lib/i386-mingw32/enc/trans/gb18030.so +0 -0
  347. data/shoes/ruby/lib/i386-mingw32/enc/trans/gbk.so +0 -0
  348. data/shoes/ruby/lib/i386-mingw32/enc/trans/iso2022.so +0 -0
  349. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese.so +0 -0
  350. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_euc.so +0 -0
  351. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_sjis.so +0 -0
  352. data/shoes/ruby/lib/i386-mingw32/enc/trans/korean.so +0 -0
  353. data/shoes/ruby/lib/i386-mingw32/enc/trans/single_byte.so +0 -0
  354. data/shoes/ruby/lib/i386-mingw32/enc/trans/transdb.so +0 -0
  355. data/shoes/ruby/lib/i386-mingw32/enc/trans/utf_16_32.so +0 -0
  356. data/shoes/ruby/lib/i386-mingw32/enc/utf_16be.so +0 -0
  357. data/shoes/ruby/lib/i386-mingw32/enc/utf_16le.so +0 -0
  358. data/shoes/ruby/lib/i386-mingw32/enc/utf_32be.so +0 -0
  359. data/shoes/ruby/lib/i386-mingw32/enc/utf_32le.so +0 -0
  360. data/shoes/ruby/lib/i386-mingw32/enc/windows_1251.so +0 -0
  361. data/shoes/ruby/lib/i386-mingw32/etc.so +0 -0
  362. data/shoes/ruby/lib/i386-mingw32/fcntl.so +0 -0
  363. data/shoes/ruby/lib/i386-mingw32/fiber.so +0 -0
  364. data/shoes/ruby/lib/i386-mingw32/ftsearchrt.so +0 -0
  365. data/shoes/ruby/lib/i386-mingw32/gdbm.so +0 -0
  366. data/shoes/ruby/lib/i386-mingw32/iconv.so +0 -0
  367. data/shoes/ruby/lib/i386-mingw32/io/wait.so +0 -0
  368. data/shoes/ruby/lib/i386-mingw32/json/ext/generator.so +0 -0
  369. data/shoes/ruby/lib/i386-mingw32/json/ext/parser.so +0 -0
  370. data/shoes/ruby/lib/i386-mingw32/mathn/complex.so +0 -0
  371. data/shoes/ruby/lib/i386-mingw32/mathn/rational.so +0 -0
  372. data/shoes/ruby/lib/i386-mingw32/nkf.so +0 -0
  373. data/shoes/ruby/lib/i386-mingw32/openssl.so +0 -0
  374. data/shoes/ruby/lib/i386-mingw32/racc/cparse.so +0 -0
  375. data/shoes/ruby/lib/i386-mingw32/rbconfig.rb +4 -4
  376. data/shoes/ruby/lib/i386-mingw32/readline.so +0 -0
  377. data/shoes/ruby/lib/i386-mingw32/ripper.so +0 -0
  378. data/shoes/ruby/lib/i386-mingw32/sdbm.so +0 -0
  379. data/shoes/ruby/lib/i386-mingw32/socket.so +0 -0
  380. data/shoes/ruby/lib/i386-mingw32/stringio.so +0 -0
  381. data/shoes/ruby/lib/i386-mingw32/strscan.so +0 -0
  382. data/shoes/ruby/lib/i386-mingw32/syck.so +0 -0
  383. data/shoes/ruby/lib/i386-mingw32/win32ole.so +0 -0
  384. data/shoes/ruby/lib/i386-mingw32/zlib.so +0 -0
  385. data/shoes/samples/class-book.rb +43 -43
  386. data/shoes/samples/class-book.yaml +387 -387
  387. data/shoes/samples/expert-definr.rb +23 -23
  388. data/shoes/samples/expert-funnies.rb +51 -51
  389. data/shoes/samples/expert-irb.rb +112 -112
  390. data/shoes/samples/expert-minesweeper.rb +267 -267
  391. data/shoes/samples/expert-othello.rb +319 -319
  392. data/shoes/samples/expert-pong.rb +62 -62
  393. data/shoes/samples/expert-tankspank.rb +385 -385
  394. data/shoes/samples/good-arc.rb +37 -37
  395. data/shoes/samples/good-clock.rb +51 -51
  396. data/shoes/samples/good-follow.rb +26 -26
  397. data/shoes/samples/good-reminder.rb +174 -174
  398. data/shoes/samples/good-vjot.rb +56 -56
  399. data/shoes/samples/simple-accordion.rb +75 -75
  400. data/shoes/samples/simple-anim-shapes.rb +17 -17
  401. data/shoes/samples/simple-anim-text.rb +13 -13
  402. data/shoes/samples/simple-arc.rb +23 -23
  403. data/shoes/samples/simple-bounce.rb +24 -24
  404. data/shoes/samples/simple-calc.rb +70 -70
  405. data/shoes/samples/simple-chipmunk.rb +26 -26
  406. data/shoes/samples/simple-control-sizes.rb +24 -24
  407. data/shoes/samples/simple-curve.rb +26 -26
  408. data/shoes/samples/simple-dialogs.rb +29 -29
  409. data/shoes/samples/simple-downloader.rb +27 -27
  410. data/shoes/samples/simple-draw.rb +13 -13
  411. data/shoes/samples/simple-editor.rb +28 -28
  412. data/shoes/samples/simple-form.rb +28 -28
  413. data/shoes/samples/simple-mask.rb +21 -21
  414. data/shoes/samples/simple-menu.rb +31 -31
  415. data/shoes/samples/simple-menu1.rb +35 -35
  416. data/shoes/samples/simple-rubygems.rb +29 -29
  417. data/shoes/samples/simple-slide.rb +45 -45
  418. data/shoes/samples/simple-sphere.rb +28 -28
  419. data/shoes/samples/simple-sqlite3.rb +13 -13
  420. data/shoes/samples/simple-timer.rb +13 -13
  421. data/shoes/samples/simple-video.rb +13 -13
  422. data/shoes/shoes.exe +0 -0
  423. data/shoes/shoes.exe.manifest +17 -17
  424. data/shoes/sqlite3.dll +0 -0
  425. data/shoes/static/code_highlighter.js +188 -188
  426. data/shoes/static/code_highlighter_ruby.js +26 -26
  427. data/shoes/static/manual-en.txt +2825 -2825
  428. data/shoes/static/manual-ja.txt +2825 -2780
  429. data/shoes/static/manual.css +167 -167
  430. data/shoes/static/stubs/blank.run +375 -375
  431. data/shoes/static/stubs/sh-install +48 -48
  432. data/shoes/static/stubs/shoes-stub-inject.exe +0 -0
  433. data/shoes/static/stubs/shoes-stub.exe +0 -0
  434. data/shoes/zlib.dll +0 -0
  435. data/shoes/zlib1.dll +0 -0
  436. metadata +213 -15
  437. data/shoes/nsis/base.nsi +0 -644
  438. data/shoes/nsis/installer-1.bmp +0 -0
  439. data/shoes/nsis/installer-2.bmp +0 -0
  440. data/shoes/nsis/setup.ico +0 -0
  441. data/shoes/nsis/shoes.exe.manifest +0 -17
  442. data/shoes/nsis/shoes.ico +0 -0
  443. data/shoes/nsis/shoes.nsi +0 -644
  444. data/shoes/nsis/stub-inject.c +0 -59
  445. data/shoes/nsis/stub.c +0 -271
  446. data/shoes/nsis/stub32.h +0 -14
  447. data/shoes/nsis/stub32.rc +0 -16
@@ -1,13 +1,13 @@
1
- require 'json/common'
2
-
3
- module JSON
4
- # This module holds all the modules/classes that implement JSON's
5
- # functionality as C extensions.
6
- module Ext
7
- require 'json/ext/parser'
8
- require 'json/ext/generator'
9
- $DEBUG and warn "Using c extension for JSON."
10
- JSON.parser = Parser
11
- JSON.generator = Generator
12
- end
13
- end
1
+ require 'json/common'
2
+
3
+ module JSON
4
+ # This module holds all the modules/classes that implement JSON's
5
+ # functionality as C extensions.
6
+ module Ext
7
+ require 'json/ext/parser'
8
+ require 'json/ext/generator'
9
+ $DEBUG and warn "Using c extension for JSON."
10
+ JSON.parser = Parser
11
+ JSON.generator = Generator
12
+ end
13
+ end
@@ -1,9 +1,9 @@
1
- module JSON
2
- # JSON version
3
- VERSION = '1.1.3'
4
- VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
- VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
- VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
- VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
- VARIANT_BINARY = false
9
- end
1
+ module JSON
2
+ # JSON version
3
+ VERSION = '1.1.3'
4
+ VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ VARIANT_BINARY = false
9
+ end
@@ -1,11 +1,11 @@
1
- # support multiple ruby version (fat binaries under windows)
2
- begin
3
- RUBY_VERSION =~ /(\d+.\d+)/
4
- require "sqlite3/#{$1}/sqlite3_native"
5
- rescue LoadError
6
- #require 'sqlite3/sqlite3_native'
7
- require 'sqlite3_native'
8
- end
9
-
10
- require 'sqlite3/database'
11
- require 'sqlite3/version'
1
+ # support multiple ruby version (fat binaries under windows)
2
+ begin
3
+ RUBY_VERSION =~ /(\d+.\d+)/
4
+ require "sqlite3/#{$1}/sqlite3_native"
5
+ rescue LoadError
6
+ #require 'sqlite3/sqlite3_native'
7
+ require 'sqlite3_native'
8
+ end
9
+
10
+ require 'sqlite3/database'
11
+ require 'sqlite3/version'
@@ -1,49 +1,49 @@
1
- module SQLite3 ; module Constants
2
-
3
- module TextRep
4
- UTF8 = 1
5
- UTF16LE = 2
6
- UTF16BE = 3
7
- UTF16 = 4
8
- ANY = 5
9
- end
10
-
11
- module ColumnType
12
- INTEGER = 1
13
- FLOAT = 2
14
- TEXT = 3
15
- BLOB = 4
16
- NULL = 5
17
- end
18
-
19
- module ErrorCode
20
- OK = 0 # Successful result
21
- ERROR = 1 # SQL error or missing database
22
- INTERNAL = 2 # An internal logic error in SQLite
23
- PERM = 3 # Access permission denied
24
- ABORT = 4 # Callback routine requested an abort
25
- BUSY = 5 # The database file is locked
26
- LOCKED = 6 # A table in the database is locked
27
- NOMEM = 7 # A malloc() failed
28
- READONLY = 8 # Attempt to write a readonly database
29
- INTERRUPT = 9 # Operation terminated by sqlite_interrupt()
30
- IOERR = 10 # Some kind of disk I/O error occurred
31
- CORRUPT = 11 # The database disk image is malformed
32
- NOTFOUND = 12 # (Internal Only) Table or record not found
33
- FULL = 13 # Insertion failed because database is full
34
- CANTOPEN = 14 # Unable to open the database file
35
- PROTOCOL = 15 # Database lock protocol error
36
- EMPTY = 16 # (Internal Only) Database table is empty
37
- SCHEMA = 17 # The database schema changed
38
- TOOBIG = 18 # Too much data for one row of a table
39
- CONSTRAINT = 19 # Abort due to contraint violation
40
- MISMATCH = 20 # Data type mismatch
41
- MISUSE = 21 # Library used incorrectly
42
- NOLFS = 22 # Uses OS features not supported on host
43
- AUTH = 23 # Authorization denied
44
-
45
- ROW = 100 # sqlite_step() has another row ready
46
- DONE = 101 # sqlite_step() has finished executing
47
- end
48
-
49
- end ; end
1
+ module SQLite3 ; module Constants
2
+
3
+ module TextRep
4
+ UTF8 = 1
5
+ UTF16LE = 2
6
+ UTF16BE = 3
7
+ UTF16 = 4
8
+ ANY = 5
9
+ end
10
+
11
+ module ColumnType
12
+ INTEGER = 1
13
+ FLOAT = 2
14
+ TEXT = 3
15
+ BLOB = 4
16
+ NULL = 5
17
+ end
18
+
19
+ module ErrorCode
20
+ OK = 0 # Successful result
21
+ ERROR = 1 # SQL error or missing database
22
+ INTERNAL = 2 # An internal logic error in SQLite
23
+ PERM = 3 # Access permission denied
24
+ ABORT = 4 # Callback routine requested an abort
25
+ BUSY = 5 # The database file is locked
26
+ LOCKED = 6 # A table in the database is locked
27
+ NOMEM = 7 # A malloc() failed
28
+ READONLY = 8 # Attempt to write a readonly database
29
+ INTERRUPT = 9 # Operation terminated by sqlite_interrupt()
30
+ IOERR = 10 # Some kind of disk I/O error occurred
31
+ CORRUPT = 11 # The database disk image is malformed
32
+ NOTFOUND = 12 # (Internal Only) Table or record not found
33
+ FULL = 13 # Insertion failed because database is full
34
+ CANTOPEN = 14 # Unable to open the database file
35
+ PROTOCOL = 15 # Database lock protocol error
36
+ EMPTY = 16 # (Internal Only) Database table is empty
37
+ SCHEMA = 17 # The database schema changed
38
+ TOOBIG = 18 # Too much data for one row of a table
39
+ CONSTRAINT = 19 # Abort due to contraint violation
40
+ MISMATCH = 20 # Data type mismatch
41
+ MISUSE = 21 # Library used incorrectly
42
+ NOLFS = 22 # Uses OS features not supported on host
43
+ AUTH = 23 # Authorization denied
44
+
45
+ ROW = 100 # sqlite_step() has another row ready
46
+ DONE = 101 # sqlite_step() has finished executing
47
+ end
48
+
49
+ end ; end
@@ -1,568 +1,568 @@
1
- require 'sqlite3/constants'
2
- require 'sqlite3/errors'
3
- require 'sqlite3/pragmas'
4
- require 'sqlite3/statement'
5
- require 'sqlite3/translator'
6
- require 'sqlite3/value'
7
-
8
- module SQLite3
9
-
10
- # The Database class encapsulates a single connection to a SQLite3 database.
11
- # Its usage is very straightforward:
12
- #
13
- # require 'sqlite3'
14
- #
15
- # SQLite3::Database.new( "data.db" ) do |db|
16
- # db.execute( "select * from table" ) do |row|
17
- # p row
18
- # end
19
- # end
20
- #
21
- # It wraps the lower-level methods provides by the selected driver, and
22
- # includes the Pragmas module for access to various pragma convenience
23
- # methods.
24
- #
25
- # The Database class provides type translation services as well, by which
26
- # the SQLite3 data types (which are all represented as strings) may be
27
- # converted into their corresponding types (as defined in the schemas
28
- # for their tables). This translation only occurs when querying data from
29
- # the database--insertions and updates are all still typeless.
30
- #
31
- # Furthermore, the Database class has been designed to work well with the
32
- # ArrayFields module from Ara Howard. If you require the ArrayFields
33
- # module before performing a query, and if you have not enabled results as
34
- # hashes, then the results will all be indexible by field name.
35
- class Database
36
- include Pragmas
37
-
38
- class << self
39
-
40
- alias :open :new
41
-
42
- # Quotes the given string, making it safe to use in an SQL statement.
43
- # It replaces all instances of the single-quote character with two
44
- # single-quote characters. The modified string is returned.
45
- def quote( string )
46
- string.gsub( /'/, "''" )
47
- end
48
-
49
- end
50
-
51
- # A boolean that indicates whether rows in result sets should be returned
52
- # as hashes or not. By default, rows are returned as arrays.
53
- attr_accessor :results_as_hash
54
-
55
- # A boolean indicating whether or not type translation is enabled for this
56
- # database.
57
- attr_accessor :type_translation
58
-
59
- # Return the type translator employed by this database instance. Each
60
- # database instance has its own type translator; this allows for different
61
- # type handlers to be installed in each instance without affecting other
62
- # instances. Furthermore, the translators are instantiated lazily, so that
63
- # if a database does not use type translation, it will not be burdened by
64
- # the overhead of a useless type translator. (See the Translator class.)
65
- def translator
66
- @translator ||= Translator.new
67
- end
68
-
69
- # Installs (or removes) a block that will be invoked for every access
70
- # to the database. If the block returns 0 (or +nil+), the statement
71
- # is allowed to proceed. Returning 1 causes an authorization error to
72
- # occur, and returning 2 causes the access to be silently denied.
73
- def authorizer( &block )
74
- self.authorizer = block
75
- end
76
-
77
- # Returns a Statement object representing the given SQL. This does not
78
- # execute the statement; it merely prepares the statement for execution.
79
- #
80
- # The Statement can then be executed using Statement#execute.
81
- #
82
- def prepare sql
83
- stmt = SQLite3::Statement.new( self, sql )
84
- return stmt unless block_given?
85
-
86
- begin
87
- yield stmt
88
- ensure
89
- stmt.close
90
- end
91
- end
92
-
93
- # Executes the given SQL statement. If additional parameters are given,
94
- # they are treated as bind variables, and are bound to the placeholders in
95
- # the query.
96
- #
97
- # Note that if any of the values passed to this are hashes, then the
98
- # key/value pairs are each bound separately, with the key being used as
99
- # the name of the placeholder to bind the value to.
100
- #
101
- # The block is optional. If given, it will be invoked for each row returned
102
- # by the query. Otherwise, any results are accumulated into an array and
103
- # returned wholesale.
104
- #
105
- # See also #execute2, #query, and #execute_batch for additional ways of
106
- # executing statements.
107
- def execute sql, bind_vars = [], *args, &block
108
- # FIXME: This is a terrible hack and should be removed but is required
109
- # for older versions of rails
110
- hack = Object.const_defined?(:ActiveRecord) && sql =~ /^PRAGMA index_list/
111
-
112
- if bind_vars.nil? || !args.empty?
113
- if args.empty?
114
- bind_vars = []
115
- else
116
- bind_vars = [nil] + args
117
- end
118
-
119
- warn(<<-eowarn) if $VERBOSE
120
- #{caller[0]} is calling SQLite3::Database#execute with nil or multiple bind params
121
- without using an array. Please switch to passing bind parameters as an array.
122
- eowarn
123
- end
124
-
125
- prepare( sql ) do |stmt|
126
- stmt.bind_params(bind_vars)
127
- if type_translation
128
- stmt = ResultSet.new(self, stmt).to_a
129
- end
130
-
131
- if block_given?
132
- stmt.each do |row|
133
- if @results_as_hash
134
- h = Hash[*stmt.columns.zip(row).flatten]
135
- row.each_with_index { |r, i| h[i] = r }
136
-
137
- yield h
138
- else
139
- yield row
140
- end
141
- end
142
- else
143
- if @results_as_hash
144
- stmt.map { |row|
145
- h = Hash[*stmt.columns.zip(row).flatten]
146
- row.each_with_index { |r, i| h[i] = r }
147
-
148
- # FIXME UGH TERRIBLE HACK!
149
- h['unique'] = h['unique'].to_s if hack
150
-
151
- h
152
- }
153
- else
154
- stmt.to_a
155
- end
156
- end
157
- end
158
- end
159
-
160
- # Executes the given SQL statement, exactly as with #execute. However, the
161
- # first row returned (either via the block, or in the returned array) is
162
- # always the names of the columns. Subsequent rows correspond to the data
163
- # from the result set.
164
- #
165
- # Thus, even if the query itself returns no rows, this method will always
166
- # return at least one row--the names of the columns.
167
- #
168
- # See also #execute, #query, and #execute_batch for additional ways of
169
- # executing statements.
170
- def execute2( sql, *bind_vars )
171
- prepare( sql ) do |stmt|
172
- result = stmt.execute( *bind_vars )
173
- if block_given?
174
- yield stmt.columns
175
- result.each { |row| yield row }
176
- else
177
- return result.inject( [ stmt.columns ] ) { |arr,row|
178
- arr << row; arr }
179
- end
180
- end
181
- end
182
-
183
- # Executes all SQL statements in the given string. By contrast, the other
184
- # means of executing queries will only execute the first statement in the
185
- # string, ignoring all subsequent statements. This will execute each one
186
- # in turn. The same bind parameters, if given, will be applied to each
187
- # statement.
188
- #
189
- # This always returns +nil+, making it unsuitable for queries that return
190
- # rows.
191
- def execute_batch( sql, bind_vars = [], *args )
192
- # FIXME: remove this stuff later
193
- unless [Array, Hash].include?(bind_vars.class)
194
- bind_vars = [bind_vars]
195
- warn(<<-eowarn) if $VERBOSE
196
- #{caller[0]} is calling SQLite3::Database#execute_batch with bind parameters
197
- that are not a list of a hash. Please switch to passing bind parameters as an
198
- array or hash.
199
- eowarn
200
- end
201
-
202
- # FIXME: remove this stuff later
203
- if bind_vars.nil? || !args.empty?
204
- if args.empty?
205
- bind_vars = []
206
- else
207
- bind_vars = [nil] + args
208
- end
209
-
210
- warn(<<-eowarn) if $VERBOSE
211
- #{caller[0]} is calling SQLite3::Database#execute_batch with nil or multiple bind params
212
- without using an array. Please switch to passing bind parameters as an array.
213
- eowarn
214
- end
215
-
216
- sql = sql.strip
217
- until sql.empty? do
218
- prepare( sql ) do |stmt|
219
- # FIXME: this should probably use sqlite3's api for batch execution
220
- # This implementation requires stepping over the results.
221
- if bind_vars.length == stmt.bind_parameter_count
222
- stmt.bind_params(bind_vars)
223
- end
224
- stmt.step
225
- sql = stmt.remainder.strip
226
- end
227
- end
228
- nil
229
- end
230
-
231
- # This is a convenience method for creating a statement, binding
232
- # paramters to it, and calling execute:
233
- #
234
- # result = db.query( "select * from foo where a=?", 5 )
235
- # # is the same as
236
- # result = db.prepare( "select * from foo where a=?" ).execute( 5 )
237
- #
238
- # You must be sure to call +close+ on the ResultSet instance that is
239
- # returned, or you could have problems with locks on the table. If called
240
- # with a block, +close+ will be invoked implicitly when the block
241
- # terminates.
242
- def query( sql, bind_vars = [], *args )
243
-
244
- if bind_vars.nil? || !args.empty?
245
- if args.empty?
246
- bind_vars = []
247
- else
248
- bind_vars = [nil] + args
249
- end
250
-
251
- warn(<<-eowarn) if $VERBOSE
252
- #{caller[0]} is calling SQLite3::Database#query with nil or multiple bind params
253
- without using an array. Please switch to passing bind parameters as an array.
254
- eowarn
255
- end
256
-
257
- result = prepare( sql ).execute( bind_vars )
258
- if block_given?
259
- begin
260
- yield result
261
- ensure
262
- result.close
263
- end
264
- else
265
- return result
266
- end
267
- end
268
-
269
- # A convenience method for obtaining the first row of a result set, and
270
- # discarding all others. It is otherwise identical to #execute.
271
- #
272
- # See also #get_first_value.
273
- def get_first_row( sql, *bind_vars )
274
- execute( sql, *bind_vars ) { |row| return row }
275
- nil
276
- end
277
-
278
- # A convenience method for obtaining the first value of the first row of a
279
- # result set, and discarding all other values and rows. It is otherwise
280
- # identical to #execute.
281
- #
282
- # See also #get_first_row.
283
- def get_first_value( sql, *bind_vars )
284
- execute( sql, *bind_vars ) { |row| return row[0] }
285
- nil
286
- end
287
-
288
- alias :busy_timeout :busy_timeout=
289
-
290
- # Creates a new function for use in SQL statements. It will be added as
291
- # +name+, with the given +arity+. (For variable arity functions, use
292
- # -1 for the arity.)
293
- #
294
- # The block should accept at least one parameter--the FunctionProxy
295
- # instance that wraps this function invocation--and any other
296
- # arguments it needs (up to its arity).
297
- #
298
- # The block does not return a value directly. Instead, it will invoke
299
- # the FunctionProxy#set_result method on the +func+ parameter and
300
- # indicate the return value that way.
301
- #
302
- # Example:
303
- #
304
- # db.create_function( "maim", 1 ) do |func, value|
305
- # if value.nil?
306
- # func.result = nil
307
- # else
308
- # func.result = value.split(//).sort.join
309
- # end
310
- # end
311
- #
312
- # puts db.get_first_value( "select maim(name) from table" )
313
- def create_function name, arity, text_rep=Constants::TextRep::ANY, &block
314
- define_function(name) do |*args|
315
- fp = FunctionProxy.new
316
- block.call(fp, *args)
317
- fp.result
318
- end
319
- self
320
- end
321
-
322
- # Creates a new aggregate function for use in SQL statements. Aggregate
323
- # functions are functions that apply over every row in the result set,
324
- # instead of over just a single row. (A very common aggregate function
325
- # is the "count" function, for determining the number of rows that match
326
- # a query.)
327
- #
328
- # The new function will be added as +name+, with the given +arity+. (For
329
- # variable arity functions, use -1 for the arity.)
330
- #
331
- # The +step+ parameter must be a proc object that accepts as its first
332
- # parameter a FunctionProxy instance (representing the function
333
- # invocation), with any subsequent parameters (up to the function's arity).
334
- # The +step+ callback will be invoked once for each row of the result set.
335
- #
336
- # The +finalize+ parameter must be a +proc+ object that accepts only a
337
- # single parameter, the FunctionProxy instance representing the current
338
- # function invocation. It should invoke FunctionProxy#set_result to
339
- # store the result of the function.
340
- #
341
- # Example:
342
- #
343
- # db.create_aggregate( "lengths", 1 ) do
344
- # step do |func, value|
345
- # func[ :total ] ||= 0
346
- # func[ :total ] += ( value ? value.length : 0 )
347
- # end
348
- #
349
- # finalize do |func|
350
- # func.set_result( func[ :total ] || 0 )
351
- # end
352
- # end
353
- #
354
- # puts db.get_first_value( "select lengths(name) from table" )
355
- #
356
- # See also #create_aggregate_handler for a more object-oriented approach to
357
- # aggregate functions.
358
- def create_aggregate( name, arity, step=nil, finalize=nil,
359
- text_rep=Constants::TextRep::ANY, &block )
360
-
361
- factory = Class.new do
362
- def self.step( &block )
363
- define_method(:step, &block)
364
- end
365
-
366
- def self.finalize( &block )
367
- define_method(:finalize, &block)
368
- end
369
- end
370
-
371
- if block_given?
372
- factory.instance_eval(&block)
373
- else
374
- factory.class_eval do
375
- define_method(:step, step)
376
- define_method(:finalize, finalize)
377
- end
378
- end
379
-
380
- proxy = factory.new
381
- proxy.extend(Module.new {
382
- attr_accessor :ctx
383
-
384
- def step( *args )
385
- super(@ctx, *args)
386
- end
387
-
388
- def finalize
389
- super(@ctx)
390
- end
391
- })
392
- proxy.ctx = FunctionProxy.new
393
- define_aggregator(name, proxy)
394
- end
395
-
396
- # This is another approach to creating an aggregate function (see
397
- # #create_aggregate). Instead of explicitly specifying the name,
398
- # callbacks, arity, and type, you specify a factory object
399
- # (the "handler") that knows how to obtain all of that information. The
400
- # handler should respond to the following messages:
401
- #
402
- # +arity+:: corresponds to the +arity+ parameter of #create_aggregate. This
403
- # message is optional, and if the handler does not respond to it,
404
- # the function will have an arity of -1.
405
- # +name+:: this is the name of the function. The handler _must_ implement
406
- # this message.
407
- # +new+:: this must be implemented by the handler. It should return a new
408
- # instance of the object that will handle a specific invocation of
409
- # the function.
410
- #
411
- # The handler instance (the object returned by the +new+ message, described
412
- # above), must respond to the following messages:
413
- #
414
- # +step+:: this is the method that will be called for each step of the
415
- # aggregate function's evaluation. It should implement the same
416
- # signature as the +step+ callback for #create_aggregate.
417
- # +finalize+:: this is the method that will be called to finalize the
418
- # aggregate function's evaluation. It should implement the
419
- # same signature as the +finalize+ callback for
420
- # #create_aggregate.
421
- #
422
- # Example:
423
- #
424
- # class LengthsAggregateHandler
425
- # def self.arity; 1; end
426
- #
427
- # def initialize
428
- # @total = 0
429
- # end
430
- #
431
- # def step( ctx, name )
432
- # @total += ( name ? name.length : 0 )
433
- # end
434
- #
435
- # def finalize( ctx )
436
- # ctx.set_result( @total )
437
- # end
438
- # end
439
- #
440
- # db.create_aggregate_handler( LengthsAggregateHandler )
441
- # puts db.get_first_value( "select lengths(name) from A" )
442
- def create_aggregate_handler( handler )
443
- proxy = Class.new do
444
- def initialize handler
445
- @handler = handler
446
- @fp = FunctionProxy.new
447
- end
448
-
449
- def step( *args )
450
- @handler.step(@fp, *args)
451
- end
452
-
453
- def finalize
454
- @handler.finalize @fp
455
- @fp.result
456
- end
457
- end
458
- define_aggregator(handler.name, proxy.new(handler.new))
459
- self
460
- end
461
-
462
- # Begins a new transaction. Note that nested transactions are not allowed
463
- # by SQLite, so attempting to nest a transaction will result in a runtime
464
- # exception.
465
- #
466
- # The +mode+ parameter may be either <tt>:deferred</tt> (the default),
467
- # <tt>:immediate</tt>, or <tt>:exclusive</tt>.
468
- #
469
- # If a block is given, the database instance is yielded to it, and the
470
- # transaction is committed when the block terminates. If the block
471
- # raises an exception, a rollback will be performed instead. Note that if
472
- # a block is given, #commit and #rollback should never be called
473
- # explicitly or you'll get an error when the block terminates.
474
- #
475
- # If a block is not given, it is the caller's responsibility to end the
476
- # transaction explicitly, either by calling #commit, or by calling
477
- # #rollback.
478
- def transaction( mode = :deferred )
479
- execute "begin #{mode.to_s} transaction"
480
- @transaction_active = true
481
-
482
- if block_given?
483
- abort = false
484
- begin
485
- yield self
486
- rescue ::Object
487
- abort = true
488
- raise
489
- ensure
490
- abort and rollback or commit
491
- end
492
- end
493
-
494
- true
495
- end
496
-
497
- # Commits the current transaction. If there is no current transaction,
498
- # this will cause an error to be raised. This returns +true+, in order
499
- # to allow it to be used in idioms like
500
- # <tt>abort? and rollback or commit</tt>.
501
- def commit
502
- execute "commit transaction"
503
- @transaction_active = false
504
- true
505
- end
506
-
507
- # Rolls the current transaction back. If there is no current transaction,
508
- # this will cause an error to be raised. This returns +true+, in order
509
- # to allow it to be used in idioms like
510
- # <tt>abort? and rollback or commit</tt>.
511
- def rollback
512
- execute "rollback transaction"
513
- @transaction_active = false
514
- true
515
- end
516
-
517
- # Returns +true+ if there is a transaction active, and +false+ otherwise.
518
- def transaction_active?
519
- @transaction_active
520
- end
521
-
522
- # A helper class for dealing with custom functions (see #create_function,
523
- # #create_aggregate, and #create_aggregate_handler). It encapsulates the
524
- # opaque function object that represents the current invocation. It also
525
- # provides more convenient access to the API functions that operate on
526
- # the function object.
527
- #
528
- # This class will almost _always_ be instantiated indirectly, by working
529
- # with the create methods mentioned above.
530
- class FunctionProxy
531
- attr_accessor :result
532
-
533
- # Create a new FunctionProxy that encapsulates the given +func+ object.
534
- # If context is non-nil, the functions context will be set to that. If
535
- # it is non-nil, it must quack like a Hash. If it is nil, then none of
536
- # the context functions will be available.
537
- def initialize
538
- @result = nil
539
- @context = {}
540
- end
541
-
542
- # Set the result of the function to the given error message.
543
- # The function will then return that error.
544
- def set_error( error )
545
- @driver.result_error( @func, error.to_s, -1 )
546
- end
547
-
548
- # (Only available to aggregate functions.) Returns the number of rows
549
- # that the aggregate has processed so far. This will include the current
550
- # row, and so will always return at least 1.
551
- def count
552
- @driver.aggregate_count( @func )
553
- end
554
-
555
- # Returns the value with the given key from the context. This is only
556
- # available to aggregate functions.
557
- def []( key )
558
- @context[ key ]
559
- end
560
-
561
- # Sets the value with the given key in the context. This is only
562
- # available to aggregate functions.
563
- def []=( key, value )
564
- @context[ key ] = value
565
- end
566
- end
567
- end
568
- end
1
+ require 'sqlite3/constants'
2
+ require 'sqlite3/errors'
3
+ require 'sqlite3/pragmas'
4
+ require 'sqlite3/statement'
5
+ require 'sqlite3/translator'
6
+ require 'sqlite3/value'
7
+
8
+ module SQLite3
9
+
10
+ # The Database class encapsulates a single connection to a SQLite3 database.
11
+ # Its usage is very straightforward:
12
+ #
13
+ # require 'sqlite3'
14
+ #
15
+ # SQLite3::Database.new( "data.db" ) do |db|
16
+ # db.execute( "select * from table" ) do |row|
17
+ # p row
18
+ # end
19
+ # end
20
+ #
21
+ # It wraps the lower-level methods provides by the selected driver, and
22
+ # includes the Pragmas module for access to various pragma convenience
23
+ # methods.
24
+ #
25
+ # The Database class provides type translation services as well, by which
26
+ # the SQLite3 data types (which are all represented as strings) may be
27
+ # converted into their corresponding types (as defined in the schemas
28
+ # for their tables). This translation only occurs when querying data from
29
+ # the database--insertions and updates are all still typeless.
30
+ #
31
+ # Furthermore, the Database class has been designed to work well with the
32
+ # ArrayFields module from Ara Howard. If you require the ArrayFields
33
+ # module before performing a query, and if you have not enabled results as
34
+ # hashes, then the results will all be indexible by field name.
35
+ class Database
36
+ include Pragmas
37
+
38
+ class << self
39
+
40
+ alias :open :new
41
+
42
+ # Quotes the given string, making it safe to use in an SQL statement.
43
+ # It replaces all instances of the single-quote character with two
44
+ # single-quote characters. The modified string is returned.
45
+ def quote( string )
46
+ string.gsub( /'/, "''" )
47
+ end
48
+
49
+ end
50
+
51
+ # A boolean that indicates whether rows in result sets should be returned
52
+ # as hashes or not. By default, rows are returned as arrays.
53
+ attr_accessor :results_as_hash
54
+
55
+ # A boolean indicating whether or not type translation is enabled for this
56
+ # database.
57
+ attr_accessor :type_translation
58
+
59
+ # Return the type translator employed by this database instance. Each
60
+ # database instance has its own type translator; this allows for different
61
+ # type handlers to be installed in each instance without affecting other
62
+ # instances. Furthermore, the translators are instantiated lazily, so that
63
+ # if a database does not use type translation, it will not be burdened by
64
+ # the overhead of a useless type translator. (See the Translator class.)
65
+ def translator
66
+ @translator ||= Translator.new
67
+ end
68
+
69
+ # Installs (or removes) a block that will be invoked for every access
70
+ # to the database. If the block returns 0 (or +nil+), the statement
71
+ # is allowed to proceed. Returning 1 causes an authorization error to
72
+ # occur, and returning 2 causes the access to be silently denied.
73
+ def authorizer( &block )
74
+ self.authorizer = block
75
+ end
76
+
77
+ # Returns a Statement object representing the given SQL. This does not
78
+ # execute the statement; it merely prepares the statement for execution.
79
+ #
80
+ # The Statement can then be executed using Statement#execute.
81
+ #
82
+ def prepare sql
83
+ stmt = SQLite3::Statement.new( self, sql )
84
+ return stmt unless block_given?
85
+
86
+ begin
87
+ yield stmt
88
+ ensure
89
+ stmt.close
90
+ end
91
+ end
92
+
93
+ # Executes the given SQL statement. If additional parameters are given,
94
+ # they are treated as bind variables, and are bound to the placeholders in
95
+ # the query.
96
+ #
97
+ # Note that if any of the values passed to this are hashes, then the
98
+ # key/value pairs are each bound separately, with the key being used as
99
+ # the name of the placeholder to bind the value to.
100
+ #
101
+ # The block is optional. If given, it will be invoked for each row returned
102
+ # by the query. Otherwise, any results are accumulated into an array and
103
+ # returned wholesale.
104
+ #
105
+ # See also #execute2, #query, and #execute_batch for additional ways of
106
+ # executing statements.
107
+ def execute sql, bind_vars = [], *args, &block
108
+ # FIXME: This is a terrible hack and should be removed but is required
109
+ # for older versions of rails
110
+ hack = Object.const_defined?(:ActiveRecord) && sql =~ /^PRAGMA index_list/
111
+
112
+ if bind_vars.nil? || !args.empty?
113
+ if args.empty?
114
+ bind_vars = []
115
+ else
116
+ bind_vars = [nil] + args
117
+ end
118
+
119
+ warn(<<-eowarn) if $VERBOSE
120
+ #{caller[0]} is calling SQLite3::Database#execute with nil or multiple bind params
121
+ without using an array. Please switch to passing bind parameters as an array.
122
+ eowarn
123
+ end
124
+
125
+ prepare( sql ) do |stmt|
126
+ stmt.bind_params(bind_vars)
127
+ if type_translation
128
+ stmt = ResultSet.new(self, stmt).to_a
129
+ end
130
+
131
+ if block_given?
132
+ stmt.each do |row|
133
+ if @results_as_hash
134
+ h = Hash[*stmt.columns.zip(row).flatten]
135
+ row.each_with_index { |r, i| h[i] = r }
136
+
137
+ yield h
138
+ else
139
+ yield row
140
+ end
141
+ end
142
+ else
143
+ if @results_as_hash
144
+ stmt.map { |row|
145
+ h = Hash[*stmt.columns.zip(row).flatten]
146
+ row.each_with_index { |r, i| h[i] = r }
147
+
148
+ # FIXME UGH TERRIBLE HACK!
149
+ h['unique'] = h['unique'].to_s if hack
150
+
151
+ h
152
+ }
153
+ else
154
+ stmt.to_a
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ # Executes the given SQL statement, exactly as with #execute. However, the
161
+ # first row returned (either via the block, or in the returned array) is
162
+ # always the names of the columns. Subsequent rows correspond to the data
163
+ # from the result set.
164
+ #
165
+ # Thus, even if the query itself returns no rows, this method will always
166
+ # return at least one row--the names of the columns.
167
+ #
168
+ # See also #execute, #query, and #execute_batch for additional ways of
169
+ # executing statements.
170
+ def execute2( sql, *bind_vars )
171
+ prepare( sql ) do |stmt|
172
+ result = stmt.execute( *bind_vars )
173
+ if block_given?
174
+ yield stmt.columns
175
+ result.each { |row| yield row }
176
+ else
177
+ return result.inject( [ stmt.columns ] ) { |arr,row|
178
+ arr << row; arr }
179
+ end
180
+ end
181
+ end
182
+
183
+ # Executes all SQL statements in the given string. By contrast, the other
184
+ # means of executing queries will only execute the first statement in the
185
+ # string, ignoring all subsequent statements. This will execute each one
186
+ # in turn. The same bind parameters, if given, will be applied to each
187
+ # statement.
188
+ #
189
+ # This always returns +nil+, making it unsuitable for queries that return
190
+ # rows.
191
+ def execute_batch( sql, bind_vars = [], *args )
192
+ # FIXME: remove this stuff later
193
+ unless [Array, Hash].include?(bind_vars.class)
194
+ bind_vars = [bind_vars]
195
+ warn(<<-eowarn) if $VERBOSE
196
+ #{caller[0]} is calling SQLite3::Database#execute_batch with bind parameters
197
+ that are not a list of a hash. Please switch to passing bind parameters as an
198
+ array or hash.
199
+ eowarn
200
+ end
201
+
202
+ # FIXME: remove this stuff later
203
+ if bind_vars.nil? || !args.empty?
204
+ if args.empty?
205
+ bind_vars = []
206
+ else
207
+ bind_vars = [nil] + args
208
+ end
209
+
210
+ warn(<<-eowarn) if $VERBOSE
211
+ #{caller[0]} is calling SQLite3::Database#execute_batch with nil or multiple bind params
212
+ without using an array. Please switch to passing bind parameters as an array.
213
+ eowarn
214
+ end
215
+
216
+ sql = sql.strip
217
+ until sql.empty? do
218
+ prepare( sql ) do |stmt|
219
+ # FIXME: this should probably use sqlite3's api for batch execution
220
+ # This implementation requires stepping over the results.
221
+ if bind_vars.length == stmt.bind_parameter_count
222
+ stmt.bind_params(bind_vars)
223
+ end
224
+ stmt.step
225
+ sql = stmt.remainder.strip
226
+ end
227
+ end
228
+ nil
229
+ end
230
+
231
+ # This is a convenience method for creating a statement, binding
232
+ # paramters to it, and calling execute:
233
+ #
234
+ # result = db.query( "select * from foo where a=?", 5 )
235
+ # # is the same as
236
+ # result = db.prepare( "select * from foo where a=?" ).execute( 5 )
237
+ #
238
+ # You must be sure to call +close+ on the ResultSet instance that is
239
+ # returned, or you could have problems with locks on the table. If called
240
+ # with a block, +close+ will be invoked implicitly when the block
241
+ # terminates.
242
+ def query( sql, bind_vars = [], *args )
243
+
244
+ if bind_vars.nil? || !args.empty?
245
+ if args.empty?
246
+ bind_vars = []
247
+ else
248
+ bind_vars = [nil] + args
249
+ end
250
+
251
+ warn(<<-eowarn) if $VERBOSE
252
+ #{caller[0]} is calling SQLite3::Database#query with nil or multiple bind params
253
+ without using an array. Please switch to passing bind parameters as an array.
254
+ eowarn
255
+ end
256
+
257
+ result = prepare( sql ).execute( bind_vars )
258
+ if block_given?
259
+ begin
260
+ yield result
261
+ ensure
262
+ result.close
263
+ end
264
+ else
265
+ return result
266
+ end
267
+ end
268
+
269
+ # A convenience method for obtaining the first row of a result set, and
270
+ # discarding all others. It is otherwise identical to #execute.
271
+ #
272
+ # See also #get_first_value.
273
+ def get_first_row( sql, *bind_vars )
274
+ execute( sql, *bind_vars ) { |row| return row }
275
+ nil
276
+ end
277
+
278
+ # A convenience method for obtaining the first value of the first row of a
279
+ # result set, and discarding all other values and rows. It is otherwise
280
+ # identical to #execute.
281
+ #
282
+ # See also #get_first_row.
283
+ def get_first_value( sql, *bind_vars )
284
+ execute( sql, *bind_vars ) { |row| return row[0] }
285
+ nil
286
+ end
287
+
288
+ alias :busy_timeout :busy_timeout=
289
+
290
+ # Creates a new function for use in SQL statements. It will be added as
291
+ # +name+, with the given +arity+. (For variable arity functions, use
292
+ # -1 for the arity.)
293
+ #
294
+ # The block should accept at least one parameter--the FunctionProxy
295
+ # instance that wraps this function invocation--and any other
296
+ # arguments it needs (up to its arity).
297
+ #
298
+ # The block does not return a value directly. Instead, it will invoke
299
+ # the FunctionProxy#set_result method on the +func+ parameter and
300
+ # indicate the return value that way.
301
+ #
302
+ # Example:
303
+ #
304
+ # db.create_function( "maim", 1 ) do |func, value|
305
+ # if value.nil?
306
+ # func.result = nil
307
+ # else
308
+ # func.result = value.split(//).sort.join
309
+ # end
310
+ # end
311
+ #
312
+ # puts db.get_first_value( "select maim(name) from table" )
313
+ def create_function name, arity, text_rep=Constants::TextRep::ANY, &block
314
+ define_function(name) do |*args|
315
+ fp = FunctionProxy.new
316
+ block.call(fp, *args)
317
+ fp.result
318
+ end
319
+ self
320
+ end
321
+
322
+ # Creates a new aggregate function for use in SQL statements. Aggregate
323
+ # functions are functions that apply over every row in the result set,
324
+ # instead of over just a single row. (A very common aggregate function
325
+ # is the "count" function, for determining the number of rows that match
326
+ # a query.)
327
+ #
328
+ # The new function will be added as +name+, with the given +arity+. (For
329
+ # variable arity functions, use -1 for the arity.)
330
+ #
331
+ # The +step+ parameter must be a proc object that accepts as its first
332
+ # parameter a FunctionProxy instance (representing the function
333
+ # invocation), with any subsequent parameters (up to the function's arity).
334
+ # The +step+ callback will be invoked once for each row of the result set.
335
+ #
336
+ # The +finalize+ parameter must be a +proc+ object that accepts only a
337
+ # single parameter, the FunctionProxy instance representing the current
338
+ # function invocation. It should invoke FunctionProxy#set_result to
339
+ # store the result of the function.
340
+ #
341
+ # Example:
342
+ #
343
+ # db.create_aggregate( "lengths", 1 ) do
344
+ # step do |func, value|
345
+ # func[ :total ] ||= 0
346
+ # func[ :total ] += ( value ? value.length : 0 )
347
+ # end
348
+ #
349
+ # finalize do |func|
350
+ # func.set_result( func[ :total ] || 0 )
351
+ # end
352
+ # end
353
+ #
354
+ # puts db.get_first_value( "select lengths(name) from table" )
355
+ #
356
+ # See also #create_aggregate_handler for a more object-oriented approach to
357
+ # aggregate functions.
358
+ def create_aggregate( name, arity, step=nil, finalize=nil,
359
+ text_rep=Constants::TextRep::ANY, &block )
360
+
361
+ factory = Class.new do
362
+ def self.step( &block )
363
+ define_method(:step, &block)
364
+ end
365
+
366
+ def self.finalize( &block )
367
+ define_method(:finalize, &block)
368
+ end
369
+ end
370
+
371
+ if block_given?
372
+ factory.instance_eval(&block)
373
+ else
374
+ factory.class_eval do
375
+ define_method(:step, step)
376
+ define_method(:finalize, finalize)
377
+ end
378
+ end
379
+
380
+ proxy = factory.new
381
+ proxy.extend(Module.new {
382
+ attr_accessor :ctx
383
+
384
+ def step( *args )
385
+ super(@ctx, *args)
386
+ end
387
+
388
+ def finalize
389
+ super(@ctx)
390
+ end
391
+ })
392
+ proxy.ctx = FunctionProxy.new
393
+ define_aggregator(name, proxy)
394
+ end
395
+
396
+ # This is another approach to creating an aggregate function (see
397
+ # #create_aggregate). Instead of explicitly specifying the name,
398
+ # callbacks, arity, and type, you specify a factory object
399
+ # (the "handler") that knows how to obtain all of that information. The
400
+ # handler should respond to the following messages:
401
+ #
402
+ # +arity+:: corresponds to the +arity+ parameter of #create_aggregate. This
403
+ # message is optional, and if the handler does not respond to it,
404
+ # the function will have an arity of -1.
405
+ # +name+:: this is the name of the function. The handler _must_ implement
406
+ # this message.
407
+ # +new+:: this must be implemented by the handler. It should return a new
408
+ # instance of the object that will handle a specific invocation of
409
+ # the function.
410
+ #
411
+ # The handler instance (the object returned by the +new+ message, described
412
+ # above), must respond to the following messages:
413
+ #
414
+ # +step+:: this is the method that will be called for each step of the
415
+ # aggregate function's evaluation. It should implement the same
416
+ # signature as the +step+ callback for #create_aggregate.
417
+ # +finalize+:: this is the method that will be called to finalize the
418
+ # aggregate function's evaluation. It should implement the
419
+ # same signature as the +finalize+ callback for
420
+ # #create_aggregate.
421
+ #
422
+ # Example:
423
+ #
424
+ # class LengthsAggregateHandler
425
+ # def self.arity; 1; end
426
+ #
427
+ # def initialize
428
+ # @total = 0
429
+ # end
430
+ #
431
+ # def step( ctx, name )
432
+ # @total += ( name ? name.length : 0 )
433
+ # end
434
+ #
435
+ # def finalize( ctx )
436
+ # ctx.set_result( @total )
437
+ # end
438
+ # end
439
+ #
440
+ # db.create_aggregate_handler( LengthsAggregateHandler )
441
+ # puts db.get_first_value( "select lengths(name) from A" )
442
+ def create_aggregate_handler( handler )
443
+ proxy = Class.new do
444
+ def initialize handler
445
+ @handler = handler
446
+ @fp = FunctionProxy.new
447
+ end
448
+
449
+ def step( *args )
450
+ @handler.step(@fp, *args)
451
+ end
452
+
453
+ def finalize
454
+ @handler.finalize @fp
455
+ @fp.result
456
+ end
457
+ end
458
+ define_aggregator(handler.name, proxy.new(handler.new))
459
+ self
460
+ end
461
+
462
+ # Begins a new transaction. Note that nested transactions are not allowed
463
+ # by SQLite, so attempting to nest a transaction will result in a runtime
464
+ # exception.
465
+ #
466
+ # The +mode+ parameter may be either <tt>:deferred</tt> (the default),
467
+ # <tt>:immediate</tt>, or <tt>:exclusive</tt>.
468
+ #
469
+ # If a block is given, the database instance is yielded to it, and the
470
+ # transaction is committed when the block terminates. If the block
471
+ # raises an exception, a rollback will be performed instead. Note that if
472
+ # a block is given, #commit and #rollback should never be called
473
+ # explicitly or you'll get an error when the block terminates.
474
+ #
475
+ # If a block is not given, it is the caller's responsibility to end the
476
+ # transaction explicitly, either by calling #commit, or by calling
477
+ # #rollback.
478
+ def transaction( mode = :deferred )
479
+ execute "begin #{mode.to_s} transaction"
480
+ @transaction_active = true
481
+
482
+ if block_given?
483
+ abort = false
484
+ begin
485
+ yield self
486
+ rescue ::Object
487
+ abort = true
488
+ raise
489
+ ensure
490
+ abort and rollback or commit
491
+ end
492
+ end
493
+
494
+ true
495
+ end
496
+
497
+ # Commits the current transaction. If there is no current transaction,
498
+ # this will cause an error to be raised. This returns +true+, in order
499
+ # to allow it to be used in idioms like
500
+ # <tt>abort? and rollback or commit</tt>.
501
+ def commit
502
+ execute "commit transaction"
503
+ @transaction_active = false
504
+ true
505
+ end
506
+
507
+ # Rolls the current transaction back. If there is no current transaction,
508
+ # this will cause an error to be raised. This returns +true+, in order
509
+ # to allow it to be used in idioms like
510
+ # <tt>abort? and rollback or commit</tt>.
511
+ def rollback
512
+ execute "rollback transaction"
513
+ @transaction_active = false
514
+ true
515
+ end
516
+
517
+ # Returns +true+ if there is a transaction active, and +false+ otherwise.
518
+ def transaction_active?
519
+ @transaction_active
520
+ end
521
+
522
+ # A helper class for dealing with custom functions (see #create_function,
523
+ # #create_aggregate, and #create_aggregate_handler). It encapsulates the
524
+ # opaque function object that represents the current invocation. It also
525
+ # provides more convenient access to the API functions that operate on
526
+ # the function object.
527
+ #
528
+ # This class will almost _always_ be instantiated indirectly, by working
529
+ # with the create methods mentioned above.
530
+ class FunctionProxy
531
+ attr_accessor :result
532
+
533
+ # Create a new FunctionProxy that encapsulates the given +func+ object.
534
+ # If context is non-nil, the functions context will be set to that. If
535
+ # it is non-nil, it must quack like a Hash. If it is nil, then none of
536
+ # the context functions will be available.
537
+ def initialize
538
+ @result = nil
539
+ @context = {}
540
+ end
541
+
542
+ # Set the result of the function to the given error message.
543
+ # The function will then return that error.
544
+ def set_error( error )
545
+ @driver.result_error( @func, error.to_s, -1 )
546
+ end
547
+
548
+ # (Only available to aggregate functions.) Returns the number of rows
549
+ # that the aggregate has processed so far. This will include the current
550
+ # row, and so will always return at least 1.
551
+ def count
552
+ @driver.aggregate_count( @func )
553
+ end
554
+
555
+ # Returns the value with the given key from the context. This is only
556
+ # available to aggregate functions.
557
+ def []( key )
558
+ @context[ key ]
559
+ end
560
+
561
+ # Sets the value with the given key in the context. This is only
562
+ # available to aggregate functions.
563
+ def []=( key, value )
564
+ @context[ key ] = value
565
+ end
566
+ end
567
+ end
568
+ end