IOWA 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +14 -0
  3. data/README.md +23 -0
  4. data/RELEASE_NOTES +77 -0
  5. data/ToDo +21 -0
  6. data/components/CRUDList/CRUDList.html +13 -0
  7. data/components/CRUDList/CRUDList.iwa +136 -0
  8. data/components/Content/Content.html +0 -0
  9. data/components/Content/Content.iwa +143 -0
  10. data/components/Content/example/README +9 -0
  11. data/components/Content/example/cgi/iowa.cgi +10 -0
  12. data/components/Content/example/demo.rb +30 -0
  13. data/components/Content/example/doc/index.html +7 -0
  14. data/components/Content/example/iowa/Content.html +1 -0
  15. data/components/Content/example/iowa/Content.iwa +1 -0
  16. data/components/Content/example/iowa/Main.html +6 -0
  17. data/components/Content/example/iowa/Main.iwa +3 -0
  18. data/components/Content/example/iowa/_content/body +7 -0
  19. data/components/Content/example/iowa/_content/body2 +3 -0
  20. data/components/Content/example/iowa/_content/title +2 -0
  21. data/components/Content/example/iowa/app.cnf +8 -0
  22. data/components/Content/example/iowa/app.rb +8 -0
  23. data/components/Content/example/webrick.rb +38 -0
  24. data/components/Include/Include.html +1 -0
  25. data/components/Include/Include.iwa +30 -0
  26. data/components/Include/readme +5 -0
  27. data/components/JumpTo/JumpTo.html +8 -0
  28. data/components/JumpTo/JumpTo.iwa +8 -0
  29. data/components/JumpTo/readme +6 -0
  30. data/doc/Architecture.txt +6 -0
  31. data/doc/History.txt +33 -0
  32. data/doc/StandardDispatcher.txt +19 -0
  33. data/examples/blog/README +1 -0
  34. data/examples/hello_world/README +17 -0
  35. data/examples/hello_world/htdocs/hello_world_html.html +24 -0
  36. data/examples/hello_world/htdocs/hello_world_ruby.html +41 -0
  37. data/examples/hello_world/iowa/HelloWorld.html +14 -0
  38. data/examples/hello_world/iowa/HelloWorld.iwa +31 -0
  39. data/examples/hello_world/iowa/Index.html +16 -0
  40. data/examples/hello_world/iowa/Index.iwa +5 -0
  41. data/examples/hello_world/iowa/iowa_hello_world.cnf +19 -0
  42. data/examples/hello_world/iowa/iowa_hello_world.rb +5 -0
  43. data/examples/hello_world/iowa/mapfile.cnf +6 -0
  44. data/examples/hw1/iowa/Main.html +1 -0
  45. data/examples/hw1/iowa/README +9 -0
  46. data/examples/hw1/iowa/hw.rb +4 -0
  47. data/examples/hw2/iowa/Main.html +10 -0
  48. data/examples/hw2/iowa/Main.iwa +7 -0
  49. data/examples/hw2/iowa/README +16 -0
  50. data/examples/hw2/iowa/hw.rb +4 -0
  51. data/examples/hw3/iowa/Main.html +11 -0
  52. data/examples/hw3/iowa/Main.iwa +7 -0
  53. data/examples/hw3/iowa/README +22 -0
  54. data/examples/hw3/iowa/hw.rb +4 -0
  55. data/examples/hw4/iowa/Greetings.html +10 -0
  56. data/examples/hw4/iowa/Greetings.iwa +9 -0
  57. data/examples/hw4/iowa/Main.html +12 -0
  58. data/examples/hw4/iowa/Main.iwa +10 -0
  59. data/examples/hw4/iowa/README +28 -0
  60. data/examples/hw4/iowa/hw.rb +4 -0
  61. data/examples/hw5/iowa/Footer.html +2 -0
  62. data/examples/hw5/iowa/Greetings.html +4 -0
  63. data/examples/hw5/iowa/Greetings.iwa +12 -0
  64. data/examples/hw5/iowa/Header.html +6 -0
  65. data/examples/hw5/iowa/Main.html +12 -0
  66. data/examples/hw5/iowa/Main.iwa +13 -0
  67. data/examples/hw5/iowa/README +16 -0
  68. data/examples/hw5/iowa/hw.rb +4 -0
  69. data/examples/template_server/iowa/Content.iwa +121 -0
  70. data/examples/template_server/iowa/Content.view +0 -0
  71. data/examples/template_server/iowa/DBContentDispatcher.rb +112 -0
  72. data/examples/template_server/iowa/DBContentPage.html +3 -0
  73. data/examples/template_server/iowa/DBContentPage.iwa +85 -0
  74. data/examples/template_server/iowa/app.cnf +13 -0
  75. data/examples/template_server/iowa/app.rb +5 -0
  76. data/ext/Classifier/classifier.c +256 -0
  77. data/ext/Classifier/ext_help.h +14 -0
  78. data/ext/Classifier/extconf.rb +5 -0
  79. data/ext/Classifier/tst.h +40 -0
  80. data/ext/Classifier/tst_cleanup.c +24 -0
  81. data/ext/Classifier/tst_delete.c +146 -0
  82. data/ext/Classifier/tst_grow_node_free_list.c +38 -0
  83. data/ext/Classifier/tst_init.c +41 -0
  84. data/ext/Classifier/tst_insert.c +192 -0
  85. data/ext/Classifier/tst_search.c +68 -0
  86. data/ext/http11/README +11 -0
  87. data/ext/http11/ext_help.h +15 -0
  88. data/ext/http11/extconf.rb +5 -0
  89. data/ext/http11/http11.c +534 -0
  90. data/ext/http11/http11.c.dif +422 -0
  91. data/ext/http11/http11_parser.c +1243 -0
  92. data/ext/http11/http11_parser.c.dif +193 -0
  93. data/ext/http11/http11_parser.h +49 -0
  94. data/ext/http11/http11_parser.h.dif +20 -0
  95. data/ext/http11/http11_parser.rl +192 -0
  96. data/ext/httpmachine/Makefile +149 -0
  97. data/ext/httpmachine/extconf.rb +33 -0
  98. data/ext/httpmachine/http.cpp +430 -0
  99. data/ext/httpmachine/http.h +156 -0
  100. data/ext/httpmachine/rubyhttp.cpp +165 -0
  101. data/external/mime-types/LICENCE +18 -0
  102. data/external/mime-types/README +46 -0
  103. data/external/mime-types/doc/classes/MIME.html +120 -0
  104. data/external/mime-types/doc/classes/MIME/InvalidContentType.html +119 -0
  105. data/external/mime-types/doc/classes/MIME/Type.html +866 -0
  106. data/external/mime-types/doc/classes/MIME/Type.src/M000010.html +22 -0
  107. data/external/mime-types/doc/classes/MIME/Type.src/M000011.html +18 -0
  108. data/external/mime-types/doc/classes/MIME/Type.src/M000012.html +19 -0
  109. data/external/mime-types/doc/classes/MIME/Type.src/M000013.html +18 -0
  110. data/external/mime-types/doc/classes/MIME/Type.src/M000014.html +26 -0
  111. data/external/mime-types/doc/classes/MIME/Type.src/M000015.html +33 -0
  112. data/external/mime-types/doc/classes/MIME/Type.src/M000016.html +27 -0
  113. data/external/mime-types/doc/classes/MIME/Type.src/M000017.html +35 -0
  114. data/external/mime-types/doc/classes/MIME/Type.src/M000018.html +34 -0
  115. data/external/mime-types/doc/classes/MIME/Type.src/M000019.html +24 -0
  116. data/external/mime-types/doc/classes/MIME/Type.src/M000020.html +38 -0
  117. data/external/mime-types/doc/classes/MIME/Type.src/M000021.html +22 -0
  118. data/external/mime-types/doc/classes/MIME/Type.src/M000022.html +18 -0
  119. data/external/mime-types/doc/classes/MIME/Type.src/M000023.html +18 -0
  120. data/external/mime-types/doc/classes/MIME/Type.src/M000024.html +18 -0
  121. data/external/mime-types/doc/classes/MIME/Type.src/M000025.html +18 -0
  122. data/external/mime-types/doc/classes/MIME/Type.src/M000026.html +18 -0
  123. data/external/mime-types/doc/classes/MIME/Type.src/M000027.html +18 -0
  124. data/external/mime-types/doc/classes/MIME/Type.src/M000028.html +18 -0
  125. data/external/mime-types/doc/classes/MIME/Type.src/M000029.html +18 -0
  126. data/external/mime-types/doc/classes/MIME/Type.src/M000030.html +19 -0
  127. data/external/mime-types/doc/classes/MIME/Type.src/M000031.html +26 -0
  128. data/external/mime-types/doc/classes/MIME/Types.html +459 -0
  129. data/external/mime-types/doc/classes/MIME/Types.src/M000001.html +19 -0
  130. data/external/mime-types/doc/classes/MIME/Types.src/M000002.html +32 -0
  131. data/external/mime-types/doc/classes/MIME/Types.src/M000003.html +21 -0
  132. data/external/mime-types/doc/classes/MIME/Types.src/M000004.html +18 -0
  133. data/external/mime-types/doc/classes/MIME/Types.src/M000005.html +26 -0
  134. data/external/mime-types/doc/classes/MIME/Types.src/M000006.html +18 -0
  135. data/external/mime-types/doc/classes/MIME/Types.src/M000007.html +18 -0
  136. data/external/mime-types/doc/classes/MIME/Types.src/M000008.html +18 -0
  137. data/external/mime-types/doc/classes/MIME/Types.src/M000009.html +18 -0
  138. data/external/mime-types/doc/created.rid +1 -0
  139. data/external/mime-types/doc/files/ChangeLog.html +320 -0
  140. data/external/mime-types/doc/files/README.html +145 -0
  141. data/external/mime-types/doc/files/lib/mime/types_rb.html +101 -0
  142. data/external/mime-types/doc/fr_class_index.html +30 -0
  143. data/external/mime-types/doc/fr_file_index.html +29 -0
  144. data/external/mime-types/doc/fr_method_index.html +57 -0
  145. data/external/mime-types/doc/index.html +24 -0
  146. data/external/mime-types/doc/rdoc-style.css +208 -0
  147. data/external/mime-types/lib/mime/types.rb +1558 -0
  148. data/external/package.rb +672 -0
  149. data/external/test_support.rb +95 -0
  150. data/external/tmail/README +7 -0
  151. data/external/tmail/tmail.rb +4 -0
  152. data/external/tmail/tmail/address.rb +222 -0
  153. data/external/tmail/tmail/base64.rb +52 -0
  154. data/external/tmail/tmail/compat.rb +39 -0
  155. data/external/tmail/tmail/config.rb +50 -0
  156. data/external/tmail/tmail/encode.rb +447 -0
  157. data/external/tmail/tmail/header.rb +895 -0
  158. data/external/tmail/tmail/info.rb +14 -0
  159. data/external/tmail/tmail/loader.rb +1 -0
  160. data/external/tmail/tmail/mail.rb +869 -0
  161. data/external/tmail/tmail/mailbox.rb +386 -0
  162. data/external/tmail/tmail/mbox.rb +1 -0
  163. data/external/tmail/tmail/net.rb +260 -0
  164. data/external/tmail/tmail/obsolete.rb +123 -0
  165. data/external/tmail/tmail/parser.rb +1475 -0
  166. data/external/tmail/tmail/parser.y +372 -0
  167. data/external/tmail/tmail/port.rb +356 -0
  168. data/external/tmail/tmail/scanner.rb +17 -0
  169. data/external/tmail/tmail/scanner_r.rb +243 -0
  170. data/external/tmail/tmail/stringio.rb +256 -0
  171. data/external/tmail/tmail/textutils.rb +197 -0
  172. data/external/tmail/tmail/tmail.rb +1 -0
  173. data/external/tmail/tmail/utils.rb +23 -0
  174. data/external/win32-process/README +133 -0
  175. data/external/win32-process/lib/win32/process.rb +561 -0
  176. data/external/windows-pr/README +145 -0
  177. data/external/windows-pr/doc/conversion_guide.txt +25 -0
  178. data/external/windows-pr/lib/windows/clipboard.rb +72 -0
  179. data/external/windows-pr/lib/windows/console.rb +323 -0
  180. data/external/windows-pr/lib/windows/device_io.rb +88 -0
  181. data/external/windows-pr/lib/windows/directory.rb +80 -0
  182. data/external/windows-pr/lib/windows/error.rb +313 -0
  183. data/external/windows-pr/lib/windows/eventlog.rb +120 -0
  184. data/external/windows-pr/lib/windows/file.rb +349 -0
  185. data/external/windows-pr/lib/windows/filesystem.rb +16 -0
  186. data/external/windows-pr/lib/windows/handle.rb +31 -0
  187. data/external/windows-pr/lib/windows/library.rb +76 -0
  188. data/external/windows-pr/lib/windows/limits.rb +13 -0
  189. data/external/windows-pr/lib/windows/memory.rb +117 -0
  190. data/external/windows-pr/lib/windows/msvcrt/buffer.rb +48 -0
  191. data/external/windows-pr/lib/windows/msvcrt/file.rb +18 -0
  192. data/external/windows-pr/lib/windows/msvcrt/string.rb +46 -0
  193. data/external/windows-pr/lib/windows/national.rb +557 -0
  194. data/external/windows-pr/lib/windows/path.rb +296 -0
  195. data/external/windows-pr/lib/windows/pipe.rb +77 -0
  196. data/external/windows-pr/lib/windows/process.rb +171 -0
  197. data/external/windows-pr/lib/windows/registry.rb +238 -0
  198. data/external/windows-pr/lib/windows/security.rb +89 -0
  199. data/external/windows-pr/lib/windows/service.rb +183 -0
  200. data/external/windows-pr/lib/windows/shell.rb +88 -0
  201. data/external/windows-pr/lib/windows/sound.rb +52 -0
  202. data/external/windows-pr/lib/windows/synchronize.rb +161 -0
  203. data/external/windows-pr/lib/windows/system_info.rb +70 -0
  204. data/external/windows-pr/lib/windows/unicode.rb +138 -0
  205. data/external/windows-pr/lib/windows/window.rb +22 -0
  206. data/iowa.gemspec +45 -0
  207. data/microprojects/DiskCache/LICENSE +28 -0
  208. data/microprojects/DiskCache/README +17 -0
  209. data/microprojects/DiskCache/external/package.rb +608 -0
  210. data/microprojects/DiskCache/external/test_support.rb +8 -0
  211. data/microprojects/DiskCache/setup.rb +22 -0
  212. data/microprojects/DiskCache/src/iowa/Association.rb +67 -0
  213. data/microprojects/DiskCache/src/iowa/Constants.rb +159 -0
  214. data/microprojects/DiskCache/src/iowa/DiskStore.rb +377 -0
  215. data/microprojects/DiskCache/src/iowa/Hash.rb +63 -0
  216. data/microprojects/DiskCache/src/iowa/Lockfile.rb +575 -0
  217. data/microprojects/DiskCache/src/iowa/Mutex.rb +142 -0
  218. data/microprojects/DiskCache/src/iowa/caches/DiskCache.rb +605 -0
  219. data/microprojects/DiskCache/src/iowa/caches/LRUCache.rb +287 -0
  220. data/microprojects/DiskCache/test/TC_DiskCache.rb +218 -0
  221. data/microprojects/LRUCache/LICENSE +28 -0
  222. data/microprojects/LRUCache/README +13 -0
  223. data/microprojects/LRUCache/external/package.rb +608 -0
  224. data/microprojects/LRUCache/external/test_support.rb +8 -0
  225. data/microprojects/LRUCache/setup.rb +22 -0
  226. data/microprojects/LRUCache/src/iowa/Association.rb +57 -0
  227. data/microprojects/LRUCache/src/iowa/Constants.rb +159 -0
  228. data/microprojects/LRUCache/src/iowa/Hash.rb +63 -0
  229. data/microprojects/LRUCache/src/iowa/Mutex.rb +129 -0
  230. data/microprojects/LRUCache/src/iowa/caches/LRUCache.rb +287 -0
  231. data/microprojects/LRUCache/test/TC_LRUCache.rb +65 -0
  232. data/microprojects/LinkedList/LICENSE +28 -0
  233. data/microprojects/LinkedList/README +13 -0
  234. data/microprojects/LinkedList/external/package.rb +608 -0
  235. data/microprojects/LinkedList/external/test_support.rb +8 -0
  236. data/microprojects/LinkedList/setup.rb +22 -0
  237. data/microprojects/LinkedList/src/iowa/LinkedList.rb +165 -0
  238. data/microprojects/LinkedList/test/TC_LinkedList.rb +42 -0
  239. data/microprojects/README +8 -0
  240. data/setup.rb +116 -0
  241. data/share/iowa/app_skeleton/Main.html +8 -0
  242. data/share/iowa/app_skeleton/Main.iwa +15 -0
  243. data/share/iowa/app_skeleton/app.cnf +48 -0
  244. data/share/iowa/app_skeleton/app.rb +58 -0
  245. data/share/iowa/app_skeleton/models/model.rb +49 -0
  246. data/src/ihc.rb +223 -0
  247. data/src/iowa.cgi +29 -0
  248. data/src/iowa.rb +637 -0
  249. data/src/iowa/AbstractCache.rb +96 -0
  250. data/src/iowa/AcceptLanguage.rb +76 -0
  251. data/src/iowa/Application.rb +928 -0
  252. data/src/iowa/ApplicationStats.rb +72 -0
  253. data/src/iowa/Association.rb +67 -0
  254. data/src/iowa/BindingsParser.rb +62 -0
  255. data/src/iowa/Breakpoint.rb +273 -0
  256. data/src/iowa/CSS.rb +564 -0
  257. data/src/iowa/Client.rb +192 -0
  258. data/src/iowa/Component.rb +405 -0
  259. data/src/iowa/ComponentProxy.rb +26 -0
  260. data/src/iowa/Config.rb +21 -0
  261. data/src/iowa/Constants.rb +226 -0
  262. data/src/iowa/Context.rb +218 -0
  263. data/src/iowa/ContextLogger.rb +16 -0
  264. data/src/iowa/DbPool.rb +222 -0
  265. data/src/iowa/DetachedComponent.rb +18 -0
  266. data/src/iowa/Dispatcher.rb +27 -0
  267. data/src/iowa/DynamicElements.rb +471 -0
  268. data/src/iowa/Element.rb +100 -0
  269. data/src/iowa/Email.rb +287 -0
  270. data/src/iowa/Extensions/AllExtensions.rb +4 -0
  271. data/src/iowa/Extensions/Class.rb +94 -0
  272. data/src/iowa/Extensions/Date.rb +88 -0
  273. data/src/iowa/Extensions/DateTime.rb +88 -0
  274. data/src/iowa/Extensions/Hash.rb +22 -0
  275. data/src/iowa/Extensions/Kernel.rb +6 -0
  276. data/src/iowa/Extensions/Numeric.rb +47 -0
  277. data/src/iowa/Extensions/Object.rb +11 -0
  278. data/src/iowa/Extensions/String.rb +60 -0
  279. data/src/iowa/Extensions/Time.rb +89 -0
  280. data/src/iowa/Extensions/TimeExtensions.rb +6 -0
  281. data/src/iowa/Form.rb +368 -0
  282. data/src/iowa/Hash.rb +85 -0
  283. data/src/iowa/ISAAC.rb +175 -0
  284. data/src/iowa/ImageSize.rb +279 -0
  285. data/src/iowa/IowaComponentMixins.rb +7 -0
  286. data/src/iowa/JSON-lexer.rb +296 -0
  287. data/src/iowa/JSON-objects.rb +201 -0
  288. data/src/iowa/KeyValueCoding.rb +91 -0
  289. data/src/iowa/LinkedList.rb +175 -0
  290. data/src/iowa/Loader.rb +22 -0
  291. data/src/iowa/Lockfile.rb +575 -0
  292. data/src/iowa/Logger.rb +74 -0
  293. data/src/iowa/Monkey.rb +20 -0
  294. data/src/iowa/Mutex.rb +142 -0
  295. data/src/iowa/Policy.rb +70 -0
  296. data/src/iowa/Pool.rb +243 -0
  297. data/src/iowa/PrettyException.rb +1091 -0
  298. data/src/iowa/Request.rb +244 -0
  299. data/src/iowa/Response.rb +133 -0
  300. data/src/iowa/Session.rb +354 -0
  301. data/src/iowa/SessionStats.rb +78 -0
  302. data/src/iowa/String.rb +65 -0
  303. data/src/iowa/Tag.rb +101 -0
  304. data/src/iowa/TemplateParser.rb +236 -0
  305. data/src/iowa/Util.rb +314 -0
  306. data/src/iowa/Webcache.rb +122 -0
  307. data/src/iowa/caches/BiLevelCache.rb +65 -0
  308. data/src/iowa/caches/ClassLimitedCache.rb +67 -0
  309. data/src/iowa/caches/DiskCache.rb +609 -0
  310. data/src/iowa/caches/DiskStore.rb +380 -0
  311. data/src/iowa/caches/LRUCache-alternative.rb +155 -0
  312. data/src/iowa/caches/LRUCache.rb +290 -0
  313. data/src/iowa/caches/SimpleLRUCache.rb +112 -0
  314. data/src/iowa/dispatchers/StandardDispatcher.rb +396 -0
  315. data/src/iowa/dispatchers/StandardDispatcherWithClassifier.rb +93 -0
  316. data/src/iowa/js/iowa_jsonrpc.js +381 -0
  317. data/src/iowa/js/jsonrpc.js +187 -0
  318. data/src/iowa/js/jsonrpc_async.js +261 -0
  319. data/src/iowa/loaders/DiskLoader.rb +50 -0
  320. data/src/iowa/loggers/Analogger.rb +54 -0
  321. data/src/iowa/loggers/AsyncLogger.rb +54 -0
  322. data/src/iowa/loggers/BitBucket.rb +38 -0
  323. data/src/iowa/loggers/Log4R.rb +13 -0
  324. data/src/iowa/loggers/Log4rLogger.rb +48 -0
  325. data/src/iowa/loggers/Logger.rb +29 -0
  326. data/src/iowa/loggers/RubyLogger.rb +9 -0
  327. data/src/iowa/pools/DBConnectionPool.rb +53 -0
  328. data/src/iowa/request/Apache.rb +90 -0
  329. data/src/iowa/request/EMHybrid.rb +59 -0
  330. data/src/iowa/request/ENV.rb +80 -0
  331. data/src/iowa/request/FCGI.rb +68 -0
  332. data/src/iowa/request/HTTPMachine.rb +75 -0
  333. data/src/iowa/request/Mongrel.rb +68 -0
  334. data/src/iowa/request/WEBrick.rb +48 -0
  335. data/src/iowa/version.rb +3 -0
  336. data/src/iowa/webrick/HTTPServer.rb +43 -0
  337. data/src/iowa/webrick/WEBrickServlet.rb +28 -0
  338. data/src/iowa_fcgi_handler.rb +101 -0
  339. data/src/iowa_httpmachine.rb +141 -0
  340. data/src/iowa_hybrid.rb +193 -0
  341. data/src/iowa_hybrid_cluster.rb +231 -0
  342. data/src/iowa_mongrel.rb +136 -0
  343. data/src/iowa_webrick.rb +194 -0
  344. data/src/iowa_webrick_legacy.rb +104 -0
  345. data/src/mod_iowa.rb +104 -0
  346. data/tcss.rb +61 -0
  347. data/test/README.windows +12 -0
  348. data/test/TC_AcceptLanguage.rb +61 -0
  349. data/test/TC_AppConfig.rb +43 -0
  350. data/test/TC_AppConfig/cgi/iowa.cgi +7 -0
  351. data/test/TC_AppConfig/doc/index.html +1 -0
  352. data/test/TC_AppConfig/iowa/Main.html +4 -0
  353. data/test/TC_AppConfig/iowa/Main.iwa +17 -0
  354. data/test/TC_AppConfig/iowa/README +1 -0
  355. data/test/TC_AppConfig/iowa/app.cnf +19 -0
  356. data/test/TC_AppConfig/iowa/app.rb +8 -0
  357. data/test/TC_AppConfig/webrick.rb +38 -0
  358. data/test/TC_Association.rb +29 -0
  359. data/test/TC_BiLevelCache.rb +71 -0
  360. data/test/TC_CGI_Adaptor.rb +55 -0
  361. data/test/TC_CGI_Adaptor/cgi/iowa.cgi +7 -0
  362. data/test/TC_CGI_Adaptor/doc/index.html +1 -0
  363. data/test/TC_CGI_Adaptor/iowa/Main.html +8 -0
  364. data/test/TC_CGI_Adaptor/iowa/Main.iwa +14 -0
  365. data/test/TC_CGI_Adaptor/iowa/README +1 -0
  366. data/test/TC_CGI_Adaptor/iowa/app.cnf +8 -0
  367. data/test/TC_CGI_Adaptor/iowa/app.rb +8 -0
  368. data/test/TC_CGI_Adaptor/webrick.rb +38 -0
  369. data/test/TC_CSS.rb +660 -0
  370. data/test/TC_ClassLimitedCache.rb +89 -0
  371. data/test/TC_Classifier.rb +80 -0
  372. data/test/TC_DbPool.rb +127 -0
  373. data/test/TC_DiskCache.rb +218 -0
  374. data/test/TC_Hybrid.rb +58 -0
  375. data/test/TC_Hybrid/doc/thing.txt +1 -0
  376. data/test/TC_Hybrid/iowa/Main.html +3 -0
  377. data/test/TC_Hybrid/iowa/Main.iwa +7 -0
  378. data/test/TC_Hybrid/iowa/NewPage.html +1 -0
  379. data/test/TC_Hybrid/iowa/NewPage.iwa +5 -0
  380. data/test/TC_Hybrid/iowa/app.cnf +10 -0
  381. data/test/TC_Hybrid/iowa/app.rb +5 -0
  382. data/test/TC_IOWAFunctions/doc/Ajax1.html +1 -0
  383. data/test/TC_IOWAFunctions/doc/Ajax1.iwa +1 -0
  384. data/test/TC_IOWAFunctions/doc/index.html +1 -0
  385. data/test/TC_IOWAFunctions/doc/js/dojo.js +9686 -0
  386. data/test/TC_IOWAFunctions/iowa/Ajax1.html +40 -0
  387. data/test/TC_IOWAFunctions/iowa/Ajax1.iwa +23 -0
  388. data/test/TC_IOWAFunctions/iowa/AjaxWidget.iwa +19 -0
  389. data/test/TC_IOWAFunctions/iowa/AjaxWidget.view +22 -0
  390. data/test/TC_IOWAFunctions/iowa/DanielTest.html +9 -0
  391. data/test/TC_IOWAFunctions/iowa/DanielTest.iwa +10 -0
  392. data/test/TC_IOWAFunctions/iowa/IntervalWidget.html +1 -0
  393. data/test/TC_IOWAFunctions/iowa/IntervalWidget.iwa +14 -0
  394. data/test/TC_IOWAFunctions/iowa/Main.html +1 -0
  395. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.html +12 -0
  396. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.iwa +24 -0
  397. data/test/TC_IOWAFunctions/iowa/RPCResponse.iwa +7 -0
  398. data/test/TC_IOWAFunctions/iowa/RPCResponse.view +1 -0
  399. data/test/TC_IOWAFunctions/iowa/Repeat1.iwa +31 -0
  400. data/test/TC_IOWAFunctions/iowa/Repeat1.view +9 -0
  401. data/test/TC_IOWAFunctions/iowa/Repeat2.iwa +32 -0
  402. data/test/TC_IOWAFunctions/iowa/Repeat2.view +11 -0
  403. data/test/TC_IOWAFunctions/iowa/Repeat3.iwa +44 -0
  404. data/test/TC_IOWAFunctions/iowa/Repeat3.view +18 -0
  405. data/test/TC_IOWAFunctions/iowa/TesCon.html +1 -0
  406. data/test/TC_IOWAFunctions/iowa/TesCon.iwa +5 -0
  407. data/test/TC_IOWAFunctions/iowa/app.cnf +19 -0
  408. data/test/TC_IOWAFunctions/iowa/app.rb +9 -0
  409. data/test/TC_IOWAFunctions/iowa/mapfile.cnf +8 -0
  410. data/test/TC_ISAAC.rb +52 -0
  411. data/test/TC_ImageSize.rb +84 -0
  412. data/test/TC_ImageSize/img.bmp +0 -0
  413. data/test/TC_ImageSize/img.gif +0 -0
  414. data/test/TC_ImageSize/img.jpg +0 -0
  415. data/test/TC_ImageSize/img.pcx +0 -0
  416. data/test/TC_ImageSize/img.pgm +7144 -0
  417. data/test/TC_ImageSize/img.png +0 -0
  418. data/test/TC_ImageSize/img.ppm +0 -0
  419. data/test/TC_ImageSize/img.psd +0 -0
  420. data/test/TC_ImageSize/img.tiff +0 -0
  421. data/test/TC_ImageSize/img.xbm +22 -0
  422. data/test/TC_KeyValueCoding.rb +35 -0
  423. data/test/TC_LRUCache.rb +296 -0
  424. data/test/TC_LinkedList.rb +46 -0
  425. data/test/TC_Lockfile.rb +106 -0
  426. data/test/TC_Minimal.rb +45 -0
  427. data/test/TC_Minimal/app.cnf +8 -0
  428. data/test/TC_Minimal/cgi-bin/iowa.cgi +11 -0
  429. data/test/TC_Minimal/doc/index.html +1 -0
  430. data/test/TC_Minimal/iowa/Main.html +1 -0
  431. data/test/TC_Minimal/iowa/README +1 -0
  432. data/test/TC_Minimal/iowa/app.rb +3 -0
  433. data/test/TC_Minimal/webrick.rb +38 -0
  434. data/test/TC_Mongrel.rb +58 -0
  435. data/test/TC_Mongrel/doc/thing.txt +1 -0
  436. data/test/TC_Mongrel/iowa/Main.html +3 -0
  437. data/test/TC_Mongrel/iowa/Main.iwa +7 -0
  438. data/test/TC_Mongrel/iowa/NewPage.html +1 -0
  439. data/test/TC_Mongrel/iowa/NewPage.iwa +5 -0
  440. data/test/TC_Mongrel/iowa/app.cnf +10 -0
  441. data/test/TC_Mongrel/iowa/app.rb +5 -0
  442. data/test/TC_NoSubclass.rb +56 -0
  443. data/test/TC_NoSubclass/cgi/iowa.cgi +7 -0
  444. data/test/TC_NoSubclass/doc/index.html +1 -0
  445. data/test/TC_NoSubclass/iowa/Main.html +8 -0
  446. data/test/TC_NoSubclass/iowa/Main.iwa +14 -0
  447. data/test/TC_NoSubclass/iowa/README +1 -0
  448. data/test/TC_NoSubclass/iowa/app.cnf +8 -0
  449. data/test/TC_NoSubclass/iowa/app.rb +5 -0
  450. data/test/TC_NoSubclass/webrick.rb +38 -0
  451. data/test/TC_Pool.rb +139 -0
  452. data/test/TC_RenderedCache/doc/thing.txt +1 -0
  453. data/test/TC_RenderedCache/iowa/BigPage.html +1 -0
  454. data/test/TC_RenderedCache/iowa/BigPage.iwa +12 -0
  455. data/test/TC_RenderedCache/iowa/Main.html +3 -0
  456. data/test/TC_RenderedCache/iowa/Main.iwa +7 -0
  457. data/test/TC_RenderedCache/iowa/NewPage.html +1 -0
  458. data/test/TC_RenderedCache/iowa/NewPage.iwa +11 -0
  459. data/test/TC_RenderedCache/iowa/app.cnf +13 -0
  460. data/test/TC_RenderedCache/iowa/app.rb +5 -0
  461. data/test/TC_RenderedCache/iowa/mapfile.map +4 -0
  462. data/test/TC_ResourceURL.rb +73 -0
  463. data/test/TC_ResourceURL/iowa/Main.html +2 -0
  464. data/test/TC_ResourceURL/iowa/Main.iwa +10 -0
  465. data/test/TC_ResourceURL/iowa/app.cnf +10 -0
  466. data/test/TC_ResourceURL/iowa/app.rb +5 -0
  467. data/test/TC_SimpleDetached.rb +41 -0
  468. data/test/TC_StandardDispatcher.rb +362 -0
  469. data/test/TC_StandardDispatcherWithClassifier.rb +358 -0
  470. data/test/TC_String.rb +24 -0
  471. data/test/TC_Tag.rb +41 -0
  472. data/test/TC_Webrick.rb +56 -0
  473. data/test/TC_Webrick/doc/thing.txt +1 -0
  474. data/test/TC_Webrick/iowa/Main.html +3 -0
  475. data/test/TC_Webrick/iowa/Main.iwa +7 -0
  476. data/test/TC_Webrick/iowa/NewPage.html +1 -0
  477. data/test/TC_Webrick/iowa/NewPage.iwa +5 -0
  478. data/test/TC_Webrick/iowa/app.cnf +10 -0
  479. data/test/TC_Webrick/iowa/app.rb +5 -0
  480. data/test/tc_template.rb +15 -0
  481. data/test/tests.conf +19 -0
  482. data/utils/CVS/Entries +3 -0
  483. data/utils/CVS/Repository +1 -0
  484. data/utils/CVS/Root +1 -0
  485. data/utils/QuickCert-1.0.2.tar.gz +0 -0
  486. data/utils/QuickCert-1.0.2/InstalledFiles +7 -0
  487. data/utils/QuickCert-1.0.2/MANIFEST +10 -0
  488. data/utils/QuickCert-1.0.2/Makefile +15 -0
  489. data/utils/QuickCert-1.0.2/README +56 -0
  490. data/utils/QuickCert-1.0.2/bin/QuickCert +355 -0
  491. data/utils/QuickCert-1.0.2/config.save +12 -0
  492. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/README +60 -0
  493. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_c.rb +26 -0
  494. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_s.rb +35 -0
  495. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/qc_config +21 -0
  496. data/utils/QuickCert-1.0.2/lib/QuickCert/defaults.rb +28 -0
  497. data/utils/QuickCert-1.0.2/setup.rb +1312 -0
  498. data/utils/iowa_apps +422 -0
  499. data/utils/smtp_sink.rb +9 -0
  500. data/utils/startup_template.cnf +27 -0
  501. data/utils/startup_template.rb +73 -0
  502. metadata +551 -0
@@ -0,0 +1,380 @@
1
+ require 'thread'
2
+ require 'iowa/AbstractCache'
3
+ require 'iowa/Lockfile'
4
+ require 'digest/sha2'
5
+ require 'fileutils'
6
+ require 'find'
7
+ require 'tmpdir'
8
+ require 'iowa/caches/LRUCache'
9
+
10
+ class Mutex
11
+ def synchronize_unless(cnd)
12
+ unless cnd
13
+ synchronize {yield}
14
+ else
15
+ yield
16
+ end
17
+ end
18
+ end
19
+
20
+ module Iowa
21
+
22
+ module Caches
23
+
24
+ # DiskStore is an alternative version of DiskCache that eliminates all
25
+ # of the LRU aspects from the code, leaving just the basic persistence
26
+ # structure.
27
+
28
+ class DiskStore < Iowa::AbstractCache
29
+
30
+ DEFAULT_BUCKET_WIDTH = 2
31
+ DEFAULT_BUCKET_DEPTH = 2
32
+
33
+ class NoCacheDir < Exception
34
+ def initialize(*args)
35
+ @bad_dir = args[0]
36
+ end
37
+
38
+ def to_s
39
+ "The cache directory (#{@bad_dir}) does not exist."
40
+ end
41
+ end
42
+
43
+ class DirNotEmpty < Exception
44
+ def initialize(*args)
45
+ @bad_dir = args[0]
46
+ end
47
+
48
+ def to_s
49
+ "The cache directory (#{@bad_dir}) is not empty."
50
+ end
51
+ end
52
+
53
+ class DeletedValue
54
+ attr_accessor :val
55
+ def initialize(v)
56
+ @val = v
57
+ end
58
+ end
59
+
60
+ def initialize(arg1 = {}, force = nil, width = DEFAULT_BUCKET_WIDTH, depth = DEFAULT_BUCKET_DEPTH, use_lockfile = false)
61
+ @transaction_cache = []
62
+ @transaction_lock = [nil,Iowa::Mutex.new]
63
+ @cache_dir = nil
64
+ if arg1.respond_to?(:keys)
65
+ oargs = arg1
66
+ arg1 = Iowa::Hash.new
67
+ arg1.step_merge!(oargs)
68
+ arg1.stringify_keys!
69
+ if arg1[Cdirectory]
70
+ @cache_dir = arg1[Cdirectory]
71
+ else
72
+ @cache_dir = File.join(Dir::tmpdir,"tmp#{Time.now.to_f}")
73
+ FileUtils.mkdir(@cache_dir)
74
+ end
75
+ set_cachefile_paths
76
+ force = arg1[Cforce] || force
77
+ @bucket_depth = arg1[Cdepth] || depth
78
+ @bucket_width = arg1[Cwidth] || width
79
+ @use_lockfile = arg1[Cuse_lockfile] || use_lockfile
80
+ else
81
+ @cache_dir = arg1
82
+ set_cachefile_paths
83
+ arg1 = {}
84
+ @bucket_depth = depth
85
+ @bucket_width = width
86
+ @use_lockfile = use_lockfile
87
+ end
88
+
89
+ super(arg1)
90
+
91
+ @bucket_depth_array = (0..(@bucket_depth - 1)).to_a
92
+ @locked = false
93
+
94
+ unless @use_lockfile
95
+ @mutex = Iowa::Mutex.new
96
+ else
97
+ @lockfile = Iowa::Lockfile.new(File::join(@cache_dir,'cachelock.lck'))
98
+ end
99
+
100
+ if !FileTest.exist?(@cache_dir)
101
+ if force
102
+ FileUtils.mkdir_p(@cache_dir)
103
+ else
104
+ raise Iowa::Caches::DiskCache::NoCacheDir.new(@cache_dir)
105
+ end
106
+ end
107
+ end
108
+
109
+ # Check to see if the cache contains the given key.
110
+
111
+ def include?(key)
112
+ if !@bypass_transactions and transaction_cache_include?(key)
113
+ if transaction_cache_get(key).is_a?(DeletedValue)
114
+ false
115
+ else
116
+ true
117
+ end
118
+ else
119
+ FileTest.exist?(datafile_for_key(key))
120
+ end
121
+ end
122
+
123
+ # Remove a key/value pair from the cache, by key.
124
+
125
+ def delete(key)
126
+ lock_cache do
127
+ if !@bypass_transactions and transaction_cache_include?(key)
128
+ tcg = transaction_cache_get(key)
129
+ unless tcg.is_a?(DeletedValue)
130
+ @transaction_cache.last[key] = DeletedValue.new(tcg)
131
+ end
132
+ elsif FileTest.exist?(datafile_for_key(key))
133
+ if @transaction_lock[0] and @transaction_cache.length > 0
134
+ @transaction_cache.last[key] = DeletedValue.new(self[key])
135
+ else
136
+ File::unlink(datafile_for_key(key))
137
+
138
+ #new_count = getdata(@cache_count,false) - 1
139
+ #putdata(new_count,@cache_count)
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ # Return the element identified by the given key.
146
+
147
+ def [](key)
148
+ r = nil
149
+ lock_cache do
150
+ if !@bypass_transactions and transaction_cache_include?(key)
151
+ transaction_cache_get(key)
152
+ else
153
+ datafile = datafile_for_key(key)
154
+ if FileTest.exist?(datafile)
155
+ FileUtils::touch(datafile)
156
+ r = getdata(datafile,false)
157
+ end
158
+ end
159
+ end
160
+ r
161
+ end
162
+
163
+ def prune
164
+ tail = getdata(@cache_tail)
165
+ delete(getdata(File.join(path_for_hash(tail),"#{tail}.key"))) if tail
166
+ end
167
+
168
+ def attach(key, val)
169
+ lock_cache do
170
+ already_in_cache = include?(key)
171
+
172
+ #putdata((getdata(@cache_count) + 1),@cache_count,false) unless already_in_cache
173
+ # Write the data file.
174
+ putdata(val,datafile_for_key(key))
175
+ end
176
+ end
177
+
178
+ # Set the element of the cache identified by the given key.
179
+
180
+ def []=(key, val)
181
+ lock_cache do
182
+ if !@bypass_transactions and @transaction_cache.length > 0
183
+ @transaction_cache.last[key] = val
184
+ else
185
+ attach(key, val)
186
+ end
187
+ end
188
+ end
189
+
190
+ # Allows one to set the maximum size of the cache queue. If the queue
191
+ # is currently larger than the size that it is being set to, elements
192
+ # will be expired until the queue is at the maximum size.
193
+
194
+ def size=(max)
195
+ end
196
+ alias maxsize= size=
197
+
198
+ # Return the maximum size of the cache.
199
+ def maxsize
200
+ end
201
+
202
+ # Return the current size of the cache.
203
+ def size
204
+ #getdata(@cache_count)
205
+ end
206
+
207
+ def ttl=(newttl)
208
+ end
209
+ alias maxttl= ttl=
210
+
211
+ def ttl
212
+ getdata(@maxttl)
213
+ end
214
+
215
+ # Return a copy of current set of keys to cache elements.
216
+ def queue
217
+ r = []
218
+ Find::find(@cache_dir) do |p|
219
+ if p =~ /#{File::SEPARATOR}[^#{File::SEPARATOR}]+.key$/
220
+ r.push getdata(p)
221
+ end
222
+ end
223
+ r
224
+ end
225
+
226
+ def transaction(&b)
227
+ Thread.critical = true
228
+ if @transaction_lock[0] and @transaction_cache.length > 0
229
+ if Thread.current == @transaction_lock[0]
230
+ Thread.critical = false
231
+ inner_transaction(b)
232
+ return true
233
+ end
234
+ else
235
+ @transaction_lock[0] = Thread.current
236
+ end
237
+ Thread.critical = false
238
+ @transaction_lock[1].synchronize {inner_transaction(b)}
239
+ @transaction_lock[0] = nil
240
+ end
241
+
242
+ def commit(final = false)
243
+ Thread.critical = true
244
+ transactions = @transaction_cache.pop
245
+ q = transactions.queue
246
+ (q.length - 1).downto(0) do |x|
247
+ k = q[x]
248
+ v = transactions[k]
249
+ if v.is_a?(DeletedValue)
250
+ @bypass_transactions = true
251
+ self.delete(k)
252
+ @bypass_transactions = false
253
+ else
254
+ @bypass_transactions = true
255
+ self[k] = transactions[k]
256
+ @bypass_transactions = false
257
+ end
258
+ end
259
+ unless final
260
+ @transaction_cache.push Iowa::Caches::LRUCache.new({:maxsize => 4294967296})
261
+ end
262
+ Thread.critical = false
263
+ end
264
+
265
+ def rollback
266
+ Thread.critical = true
267
+ @transaction_cache.pop
268
+ @transaction_cache.push Iowa::Caches::LRUCache.new({:maxsize => 4294967296})
269
+ Thread.critical = true
270
+ end
271
+
272
+ private
273
+
274
+ def inner_transaction(blk)
275
+ @transaction_cache.push Iowa::Caches::LRUCache.new({:maxsize => 4294967296})
276
+ blk.call
277
+ Thread.critical = true
278
+ commit(true)
279
+ Thread.critical = false
280
+ end
281
+
282
+ def transaction_cache_include?(key)
283
+ @transaction_cache.each do |tc|
284
+ return true if tc.include? key
285
+ end
286
+ false
287
+ end
288
+
289
+ def transaction_cache_get(key)
290
+ (@transaction_cache.length - 1).downto(0) do |x|
291
+ return @transaction_cache[x][key] if @transaction_cache[x].include?(key)
292
+ end
293
+ nil
294
+ end
295
+
296
+ def lock_cache
297
+ Thread.critical = true
298
+ transaction_in_progress = (@transaction_lock[0] and @transaction_cache.length > 0) ? true : false
299
+ @transaction_lock[0] = Thread.current unless transaction_in_progress
300
+ Thread.critical = false if transaction_in_progress
301
+ @transaction_lock[1].synchronize_unless(@transaction_lock[0] == Thread.current) do
302
+ Thread.critical = false unless transaction_in_progress
303
+ unless @locked
304
+ begin
305
+ if @use_lockfile
306
+ @lockfile.lock {@locked = true; yield}
307
+ else
308
+ @mutex.synchronize {@locked = true; yield}
309
+ end
310
+ ensure
311
+ @locked = false
312
+ end
313
+ else
314
+ yield
315
+ end
316
+ end
317
+ @transaction_lock[0] = nil unless transaction_in_progress
318
+ end
319
+
320
+ def hash_for_key(key)
321
+ Digest::SHA512.hexdigest(Marshal.dump(key))
322
+ end
323
+
324
+ def path_for_hash(hash)
325
+ # Take the hash key and break it apart by bucket_depth and bucket_width
326
+ # to return the path to the directory that should contain the
327
+ # cache element.
328
+ File.join(@cache_dir,@bucket_depth_array.collect {|d| hash[(d * @bucket_width),@bucket_width]})
329
+ end
330
+
331
+ def datafile_for_key(key)
332
+ h = hash_for_key(key)
333
+ File.join(path_for_hash(h),"#{h}.dat")
334
+ end
335
+
336
+ def getdata(filename,do_lock = true)
337
+ r = nil
338
+ if do_lock
339
+ lock_cache do
340
+ if FileTest::exist?(filename)
341
+ File.open(filename) {|fh| r = Marshal.load(fh)}
342
+ end
343
+ end
344
+ else
345
+ if FileTest::exist?(filename)
346
+ File.open(filename) {|fh| r = Marshal.load(fh)}
347
+ end
348
+ end
349
+ r
350
+ end
351
+
352
+ def getdata_worker(filename)
353
+ if FileTest::exist?(filename)
354
+ File.open(filename) {|fh| Marshal.load(fh)}
355
+ else
356
+ nil
357
+ end
358
+ end
359
+
360
+ def putdata(value,filename,do_lock = true)
361
+ if do_lock
362
+ lock_cache do
363
+ putdata_worker(value,filename)
364
+ end
365
+ else
366
+ putdata_worker(value,filename)
367
+ end
368
+ end
369
+
370
+ def putdata_worker(value,filename)
371
+ FileUtils.mkdir_p(File::dirname(filename)) unless FileTest.exist?(File::dirname(filename))
372
+ File.open(filename,'w') {|fh| Marshal.dump(value,fh)}
373
+ end
374
+
375
+ def set_cachefile_paths
376
+ #@cache_count = File.join(@cache_dir,'cache_count.inf')
377
+ end
378
+ end
379
+ end
380
+ end
@@ -0,0 +1,155 @@
1
+ require 'thread'
2
+ require 'iowa/AbstractCache'
3
+
4
+ module Iowa
5
+ module Caches
6
+
7
+ # Simple LRU cache for caching pages. This cache is thread safe.
8
+
9
+ class LRUCache < Iowa::AbstractCache
10
+
11
+ def initialize(args)
12
+ @cache = {}
13
+ @queue = []
14
+ @ttl_cache = {}
15
+ @finalizers = []
16
+ super(args)
17
+ end
18
+
19
+ # Check to see if the cache contains the given key.
20
+
21
+ def include?(key)
22
+ @cache.include?(key)
23
+ end
24
+
25
+ # Remove a key/value pair from the cache, by key.
26
+
27
+ def delete(key)
28
+ do_finalization(key,@cache[key])
29
+ @cache.delete key
30
+ @ttl_cache.delete key
31
+ end
32
+
33
+ # Return the element identified by the given key.
34
+
35
+ def [](key)
36
+ r = nil
37
+ lock_cache do
38
+ if @cache.has_key? key
39
+ r = @cache[key]
40
+ @queue.push @queue.delete(key)
41
+ @ttl_cache[key] = Time.now.to_i
42
+ end
43
+ end
44
+ r
45
+ end
46
+
47
+ def prune
48
+ obj = @queue.shift
49
+ delete obj
50
+ end
51
+
52
+ def attach(key, val)
53
+ already_in_cache = include?(key)
54
+ @cache[key] = val
55
+ @ttl_cache[key] = Time.now.to_i
56
+ if already_in_cache
57
+ @queue.push @queue.delete(key)
58
+ else
59
+ @queue.push key
60
+ end
61
+ end
62
+
63
+ # Set the element of the cache identified by the given key.
64
+
65
+ def []=(key, val)
66
+ lock_cache do
67
+ if @maxttl
68
+ expiration = Time.now.to_i - @maxttl
69
+ prune while !@queue.empty? && (@ttl_cache[@queue.first].to_i < expiration)
70
+ end
71
+ attach(key, val)
72
+ prune if @queue.length > @max
73
+ end
74
+ @queue
75
+ end
76
+
77
+ # Allows one to set the maximum size of the cache queue. If the queue
78
+ # is currently larger than the size that it is being set to, elements
79
+ # will be expired until the queue is at the maximum size.
80
+
81
+ def size=(max)
82
+ lock_cache do
83
+ prune while @queue.length > max
84
+ @max = max
85
+ end
86
+ end
87
+ alias maxsize= size=
88
+
89
+ # Return the maximum size of the cache.
90
+ def maxsize
91
+ @max
92
+ end
93
+
94
+ # Return the current size of the cache.
95
+ def size
96
+ @queue.length
97
+ end
98
+
99
+ # Allows one to set the maximum ttl. If set to nil, there is no
100
+ # TTL. Setting the ttl will force a check against the new ttl,
101
+ # expiring anything that it too old.
102
+
103
+ def ttl=(newttl)
104
+ @maxttl = newttl ? newttl.to_i : nil
105
+ if @maxttl
106
+ expiration = Time.now.to_i - @maxttl
107
+ prune while !@queue.empty? && (@ttl_cache[@queue.first].to_i < expiration)
108
+ end
109
+ end
110
+
111
+ # Returns the maximum TTL.
112
+
113
+ def ttl
114
+ @maxttl
115
+ end
116
+
117
+ # Return a copy of current set of keys to cache elements.
118
+ def queue
119
+ @queue.dup
120
+ end
121
+
122
+ # Adds a finalization method to the cache that will be called before
123
+ # the object in the cache is expired.
124
+ def add_finalizer(*args,&block)
125
+ @finalizers.push [block,args]
126
+ end
127
+
128
+ # Is called when an object in the cache is expired. Iterates through
129
+ # the defined finalization methods, if any.
130
+ def do_finalization(key,obj)
131
+ begin
132
+ @finalizers.each do |f|
133
+ f[0].call(key,obj,*f[1])
134
+ end
135
+ rescue Exception => e
136
+ puts e, e.backtrace
137
+ raise e
138
+ end
139
+ end
140
+
141
+ def lock_cache
142
+ unless @locked
143
+ begin
144
+ @locked = true
145
+ @mutex.synchronize {yield}
146
+ ensure
147
+ @locked = false
148
+ end
149
+ else
150
+ yield
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end