qwikdoc 0.0.1

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 (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
@@ -0,0 +1,305 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/util-pathname'
7
+
8
+ module Qwik
9
+ class FileSystemDB
10
+ def initialize(path, spath)
11
+ @path = path
12
+ @path_h = {}
13
+ @spath = spath
14
+ @spath_h = {}
15
+
16
+ @observer = []
17
+ end
18
+
19
+ # FIXME: Obsolete this method.
20
+ def backupdb
21
+ # FIXME: Check if it is the backupdb.
22
+ return @observer[0]
23
+ end
24
+
25
+ def check_integrity(ob)
26
+ self.each {|k|
27
+ v = self.get(k)
28
+ ob.check(k, v)
29
+ }
30
+ end
31
+
32
+ def register_observer(ob)
33
+ check_integrity(ob)
34
+ @observer << ob
35
+ end
36
+
37
+ def close
38
+ # do nothing
39
+ end
40
+
41
+ def exist?(k)
42
+ begin
43
+ return true if baseexist?(k)
44
+ return true if spath(k).exist?
45
+ rescue
46
+ return false
47
+ end
48
+ return false
49
+ end
50
+
51
+ def baseexist?(k)
52
+ begin
53
+ return true if path(k).exist?
54
+ rescue
55
+ return false
56
+ end
57
+ return false
58
+ end
59
+
60
+ def create(k)
61
+ touch(k) unless exist?(k)
62
+ end
63
+
64
+ def get(k)
65
+ if path(k).exist?
66
+ return path(k).read
67
+ end
68
+ return spath(k).read if spath(k).exist?
69
+ return '' # Not nil.
70
+ end
71
+
72
+ def size(k)
73
+ return path(k).size if path(k).exist?
74
+ return 0
75
+ end
76
+
77
+ def mtime(k)
78
+ return path(k).mtime if path(k).exist?
79
+ return spath(k).mtime if spath(k).exist?
80
+ return Time.at(0) # Not nil. The file is already deleted.
81
+ end
82
+
83
+ def add(k, v)
84
+ put(k, get(k)+v)
85
+ end
86
+
87
+ def put(k, v, time=nil)
88
+ # FIXME: Should make it atomic. Use mutex.
89
+ path(k).put(v)
90
+ if time
91
+ time = Time.at(time) if time.is_a?(Integer)
92
+ path(k).utime(time, time)
93
+ else
94
+ time = Time.now
95
+ end
96
+
97
+ # @backupdb.put(k, time, v)
98
+ @observer.each {|ob|
99
+ ob.put(k, v, time)
100
+ }
101
+ end
102
+ alias set put
103
+
104
+ def touch(k)
105
+ add(k, '') # add null String
106
+ end
107
+
108
+ def delete(k)
109
+ path(k).unlink if path(k).exist?
110
+ end
111
+
112
+ def list(with_super = false)
113
+ ar = get_dir_list(@path.to_s)
114
+ ar += get_dir_list(@spath.to_s) if with_super
115
+ return ar.sort
116
+ end
117
+
118
+ def each(with_super = false)
119
+ list(with_super).each {|b|
120
+ yield(b)
121
+ }
122
+ end
123
+
124
+ def each_all(&b)
125
+ each(true, &b)
126
+ end
127
+
128
+ def nu_last_page_time # mtime of the newest page
129
+ t = map {|k| mtime(k) }.max
130
+ t = Time.at(0) if t.nil?
131
+ return t
132
+ end
133
+
134
+ def last_page_time # mtime of the newest page
135
+ max = 0
136
+ list().each {|pagename|
137
+ t = mtime(pagename).to_i
138
+ max = t if max < t
139
+ }
140
+ return Time.at(max)
141
+ end
142
+
143
+ # QuickML support
144
+ def last_article_time # mtime of the newest file
145
+ max = maxfile = nil
146
+ @path.each_entry {|file|
147
+ f = @path+file
148
+ next unless f.file?
149
+ base = file.to_s
150
+ next if ignore_on_last_article_time?(base)
151
+
152
+ mt = f.mtime
153
+ if max.nil? || max < mt
154
+ max = mt
155
+ maxfile = f
156
+ end
157
+ }
158
+ return max # return nil if there is no file.
159
+ end
160
+
161
+ private
162
+
163
+ IGNORE_ON_LAST_ARTICLE_TIME =
164
+ [
165
+ ',config', '_GroupConfig.txt',
166
+ ',charset', '_GroupCharset.txt',
167
+ ',alerted', '_GroupAlerted.txt',
168
+ /\A\./,
169
+ /\A_counter_[a-zA-Z0-9_]+\.txt\z/,
170
+ ]
171
+ def ignore_on_last_article_time?(base)
172
+ IGNORE_ON_LAST_ARTICLE_TIME.detect { |entry| entry === base }
173
+ end
174
+
175
+ def path(k)
176
+ return gen_path(@path, @path_h, k)
177
+ end
178
+
179
+ def spath(k)
180
+ return gen_path(@spath, @spath_h, k)
181
+ end
182
+
183
+ def gen_path(path, h, k)
184
+ pa = h[k]
185
+ return pa if pa
186
+ raise 'Character type error '+k unless /\A([_A-Za-z0-9]+)\z/ =~ k
187
+ h[k] = path+(k+'.txt')
188
+ return h[k]
189
+ end
190
+
191
+ # FIXME: I don't know why this method doesn't use Pathname.
192
+ def get_dir_list(dir)
193
+ ar = []
194
+ Dir.foreach(dir) {|file|
195
+ f = dir+'/'+file
196
+ next unless FileTest.file?(f)
197
+ base = file.to_s
198
+ if /\A([_A-Za-z0-9]+)\.txt\z/ =~ base
199
+ b = $1
200
+ ar << b
201
+ end
202
+ }
203
+ return ar
204
+ end
205
+ end
206
+ end
207
+
208
+ if $0 == __FILE__
209
+ require 'test/unit'
210
+ require 'qwik/config'
211
+ require 'qwik/test-module-path'
212
+ $test = true
213
+ end
214
+
215
+ if defined?($test) && $test
216
+ class TestFileSystemDB < Test::Unit::TestCase
217
+ def test_fsdb
218
+ # setup
219
+ config = Qwik::Config.new
220
+ config.update Qwik::Config::DebugConfig
221
+ config.update Qwik::Config::TestConfig
222
+ spath = config.super_dir.path
223
+ path = '.test/'.path
224
+ path.setup
225
+ db = Qwik::FileSystemDB.new(path, spath)
226
+
227
+ # test_exist?
228
+ assert_equal false, db.exist?('1')
229
+
230
+ # test_create
231
+ db.create('1')
232
+ assert_equal true, db.exist?('1')
233
+ assert_equal '', db.get('1')
234
+
235
+ # test_put
236
+ db.put('1', 't')
237
+ assert_equal 't', db.get('1')
238
+
239
+ # test_size
240
+ assert_equal 1, db.size('1')
241
+
242
+ # test_put_with_time
243
+ db.put('1', 't', Time.at(0))
244
+ assert_equal 0, db.mtime('1').to_i # test_mtime
245
+ # test_put_with_time_num
246
+ db.put('1', 't', 1)
247
+ assert_equal 1, db.mtime('1').to_i
248
+
249
+ # test_last_page_time
250
+ assert_equal Time.at(1), db.last_page_time
251
+ # test_last_article_time
252
+ assert_equal Time.at(1), db.last_article_time
253
+
254
+ # test_add
255
+ db.add('1', 's')
256
+ assert_equal 'ts', db.get('1')
257
+
258
+ # test_get_dir_list
259
+ ar = []
260
+ db.instance_eval {
261
+ dir = @path.to_s
262
+ ar += get_dir_list(dir)
263
+ }
264
+ assert_equal ['1'], ar
265
+
266
+ # test_get_dir_list_spath
267
+ ar = []
268
+ db.instance_eval {
269
+ dir = @spath.to_s
270
+ ar += get_dir_list(dir)
271
+ }
272
+ assert_equal true, ar.include?('FrontPage')
273
+
274
+ # test_each
275
+ db.each {|f|
276
+ assert_instance_of(String, f)
277
+ }
278
+
279
+ # test_each_all
280
+ db.each(true) {|f|
281
+ assert_instance_of(String, f)
282
+ }
283
+ db.each_all {|f|
284
+ assert_instance_of(String, f)
285
+ }
286
+
287
+ # test_backup_db
288
+ #assert_instance_of(Qwik::BackupDB, db.backup_db('1'))
289
+
290
+ # test_touch
291
+ db.touch('1')
292
+
293
+ # test_delete
294
+ db.delete('1')
295
+ assert_equal false, db.exist?('1')
296
+
297
+ # test_super_pages
298
+ assert_equal true, db.exist?('_SideMenu')
299
+ assert_equal false, db.baseexist?('_SideMenu')
300
+
301
+ # teardown
302
+ path.teardown
303
+ end
304
+ end
305
+ end
@@ -0,0 +1,154 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ begin
6
+ # require 'senna'
7
+ # $have_senna_so = true
8
+ rescue LoadError
9
+ $have_senna_so = false
10
+ end
11
+ $have_senna_so = false
12
+
13
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
14
+ require 'qwik/util-pathname'
15
+
16
+ module Qwik
17
+ class DBIndexer
18
+ def initialize(path)
19
+ @path = path
20
+
21
+ @index = nil
22
+ return if ! $have_senna_so
23
+
24
+ @cache_path = @path+'.cache'
25
+ @index_path = @cache_path+'index'
26
+ check_directory
27
+
28
+ @index = Senna::Index.new((@cache_path+'index').to_s)
29
+ end
30
+
31
+ def check(k, v)
32
+ return update(k, v)
33
+ end
34
+
35
+ def put(k, v, time=nil)
36
+ return update(k, v)
37
+ end
38
+
39
+ def update(k, v)
40
+ return if @index.nil?
41
+
42
+ # Try to read old content.
43
+ pa = path(k)
44
+ old = nil
45
+ old = pa.get if pa.exist?
46
+
47
+ # Avoid \0 from its contents.
48
+ v = v.gsub("\0", '')if v.include?("\0") # FIXME: Too ad hoc.
49
+
50
+ return false if v == old # Not necessary to update.
51
+
52
+ result = @index.upd(k, old, v) # FIXME: Take care of result?
53
+
54
+ # Store new value to cached content.
55
+ check_directory
56
+ pa.open('wb') {|f| f.print(v) }
57
+
58
+ return result
59
+ end
60
+
61
+ def search(key)
62
+ return nil if @index.nil?
63
+
64
+ records = @index.sel(key)
65
+ return [] if records.nil? || records.nhits == 0
66
+
67
+ ar = []
68
+ while res = records.next
69
+ ar << res
70
+ end
71
+ return ar
72
+ end
73
+
74
+ private
75
+
76
+ def check_directory
77
+ @cache_path.check_directory
78
+ @index_path.check_directory
79
+ end
80
+
81
+ def path(k)
82
+ return @index_path+(k+'.txt')
83
+ end
84
+ end
85
+ end
86
+
87
+ if $0 == __FILE__
88
+ require 'qwik/testunit'
89
+ require 'qwik/config'
90
+ require 'qwik/test-module-path'
91
+ require 'qwik/db-filesystem'
92
+ $test = true
93
+ end
94
+
95
+ if defined?($test) && $test
96
+ class TestDBIndexer < Test::Unit::TestCase
97
+ def setup_db
98
+ config = Qwik::Config.new
99
+ spath = config.super_dir.path
100
+ path = './.test/'.path
101
+ path.setup
102
+ db = Qwik::FileSystemDB.new(path, spath)
103
+ return path, db
104
+ end
105
+
106
+ def teardown_db(path)
107
+ path.teardown
108
+ end
109
+
110
+ def test_all
111
+ # setup
112
+ path, db = setup_db
113
+
114
+ # Initialize DBIndexer.
115
+ indexer = Qwik::DBIndexer.new(path)
116
+ db.register_observer(indexer) # Regist to the DB.
117
+
118
+ # Put test contents.
119
+ db.put('a', 'This is a test.')
120
+ db.put('b', 'This is a test, too.')
121
+
122
+ # test_search
123
+ if $have_senna_so
124
+ ok_eq(['a', 'b'], indexer.search('test'))
125
+ ok_eq(['b'], indexer.search('too'))
126
+ ok_eq([], indexer.search('nosuch'))
127
+ end
128
+
129
+ teardown_db(path)
130
+ end
131
+
132
+ def test_pre_content
133
+ # Setup db
134
+ path, db = setup_db
135
+
136
+ # Put test contents before to setup indexer.
137
+ db.put('a', 'This is a test.')
138
+ db.put('b', 'This is a test, too.')
139
+
140
+ # Initialize DBIndexer.
141
+ indexer = Qwik::DBIndexer.new(path)
142
+ db.register_observer(indexer) # Regist to the DB.
143
+
144
+ # test_search
145
+ if $have_senna_so
146
+ ok_eq(['a', 'b'], indexer.search('test'))
147
+ ok_eq(['b'], indexer.search('too'))
148
+ ok_eq([], indexer.search('nosuch'))
149
+ end
150
+
151
+ teardown_db(path)
152
+ end
153
+ end
154
+ end