rq 0.1.7 → 3.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 (723) hide show
  1. data/INSTALL +21 -0
  2. data/README +752 -190
  3. data/TODO +18 -11
  4. data/TUTORIAL +230 -0
  5. data/all/install.rb +127 -0
  6. data/all/install.sh +165 -0
  7. data/all/packages/INSTALL +5 -0
  8. data/all/packages/arrayfields-3.6.0.tgz +0 -0
  9. data/all/packages/lockfile-1.4.1.tgz +0 -0
  10. data/all/packages/posixlock-0.0.1.tgz +0 -0
  11. data/all/packages/ruby-1.8.6.tgz +0 -0
  12. data/all/packages/rubygems-0.9.2.tgz +0 -0
  13. data/all/packages/sqlite-2.8.15.tar.gz +0 -0
  14. data/all/packages/sqlite-ruby-1.3.1.tar.gz +0 -0
  15. data/bin/rq +830 -361
  16. data/bin/rq-3.0.0 +860 -0
  17. data/doc/classes/ARGV.html +134 -0
  18. data/doc/classes/ARGV.src/M000036.html +36 -0
  19. data/doc/classes/ARGV.src/M000037.html +25 -0
  20. data/doc/classes/OrderedHash.html +1043 -0
  21. data/doc/classes/OrderedHash.src/M000003.html +26 -0
  22. data/doc/classes/OrderedHash.src/M000004.html +31 -0
  23. data/doc/classes/OrderedHash.src/M000005.html +23 -0
  24. data/doc/classes/OrderedHash.src/M000006.html +23 -0
  25. data/doc/classes/OrderedHash.src/M000007.html +24 -0
  26. data/doc/classes/OrderedHash.src/M000009.html +24 -0
  27. data/doc/classes/OrderedHash.src/M000010.html +24 -0
  28. data/doc/classes/OrderedHash.src/M000011.html +24 -0
  29. data/doc/classes/OrderedHash.src/M000012.html +24 -0
  30. data/doc/classes/OrderedHash.src/M000013.html +24 -0
  31. data/doc/classes/OrderedHash.src/M000014.html +24 -0
  32. data/doc/classes/OrderedHash.src/M000016.html +26 -0
  33. data/doc/classes/OrderedHash.src/M000017.html +25 -0
  34. data/doc/classes/OrderedHash.src/M000018.html +23 -0
  35. data/doc/classes/OrderedHash.src/M000019.html +25 -0
  36. data/doc/classes/OrderedHash.src/M000020.html +23 -0
  37. data/doc/classes/OrderedHash.src/M000021.html +24 -0
  38. data/doc/classes/OrderedHash.src/M000022.html +24 -0
  39. data/doc/classes/OrderedHash.src/M000023.html +24 -0
  40. data/doc/classes/OrderedHash.src/M000024.html +29 -0
  41. data/doc/classes/OrderedHash.src/M000025.html +29 -0
  42. data/doc/classes/OrderedHash.src/M000026.html +24 -0
  43. data/doc/classes/OrderedHash.src/M000027.html +25 -0
  44. data/doc/classes/OrderedHash.src/M000028.html +23 -0
  45. data/doc/classes/OrderedHash.src/M000029.html +25 -0
  46. data/doc/classes/OrderedHash.src/M000030.html +24 -0
  47. data/doc/classes/OrderedHash.src/M000032.html +23 -0
  48. data/doc/classes/OrderedHash.src/M000033.html +25 -0
  49. data/doc/classes/OrderedHash.src/M000034.html +36 -0
  50. data/doc/classes/OrderedHash.src/M000035.html +23 -0
  51. data/doc/classes/RQ.html +647 -0
  52. data/doc/classes/RQ/Backer.html +240 -0
  53. data/doc/classes/RQ/Backer.src/M000121.html +31 -0
  54. data/doc/classes/RQ/ConfigFile.html +416 -0
  55. data/doc/classes/RQ/ConfigFile.src/M000100.html +34 -0
  56. data/doc/classes/RQ/ConfigFile.src/M000101.html +26 -0
  57. data/doc/classes/RQ/ConfigFile.src/M000102.html +33 -0
  58. data/doc/classes/RQ/ConfigFile.src/M000103.html +25 -0
  59. data/doc/classes/RQ/ConfigFile.src/M000104.html +34 -0
  60. data/doc/classes/RQ/ConfigFile.src/M000105.html +25 -0
  61. data/doc/classes/RQ/Configurator.html +249 -0
  62. data/doc/classes/RQ/Configurator.src/M000122.html +40 -0
  63. data/doc/classes/RQ/Creator.html +264 -0
  64. data/doc/classes/RQ/Creator.src/M000157.html +32 -0
  65. data/doc/classes/RQ/Cron.html +461 -0
  66. data/doc/classes/RQ/Deleter.html +259 -0
  67. data/doc/classes/RQ/Deleter.src/M000078.html +52 -0
  68. data/doc/classes/RQ/Executor.html +249 -0
  69. data/doc/classes/RQ/Executor.src/M000099.html +45 -0
  70. data/doc/classes/RQ/Feeder.html +1131 -0
  71. data/doc/classes/RQ/Feeder.src/M000079.html +67 -0
  72. data/doc/classes/RQ/Feeder.src/M000080.html +47 -0
  73. data/doc/classes/RQ/Feeder.src/M000081.html +98 -0
  74. data/doc/classes/RQ/Feeder.src/M000082.html +25 -0
  75. data/doc/classes/RQ/Feeder.src/M000083.html +30 -0
  76. data/doc/classes/RQ/Feeder.src/M000084.html +58 -0
  77. data/doc/classes/RQ/Feeder.src/M000085.html +37 -0
  78. data/doc/classes/RQ/Feeder.src/M000086.html +40 -0
  79. data/doc/classes/RQ/Feeder.src/M000087.html +37 -0
  80. data/doc/classes/RQ/Feeder.src/M000088.html +35 -0
  81. data/doc/classes/RQ/Feeder.src/M000089.html +47 -0
  82. data/doc/classes/RQ/Feeder.src/M000090.html +25 -0
  83. data/doc/classes/RQ/Feeder.src/M000091.html +78 -0
  84. data/doc/classes/RQ/Feeder.src/M000092.html +34 -0
  85. data/doc/classes/RQ/Feeder.src/M000093.html +36 -0
  86. data/doc/classes/RQ/Feeder.src/M000094.html +25 -0
  87. data/doc/classes/RQ/Feeder.src/M000095.html +27 -0
  88. data/doc/classes/RQ/IOViewer.html +256 -0
  89. data/doc/classes/RQ/Job.html +304 -0
  90. data/doc/classes/RQ/Job.src/M000168.html +26 -0
  91. data/doc/classes/RQ/Job.src/M000169.html +37 -0
  92. data/doc/classes/RQ/Job.src/M000170.html +23 -0
  93. data/doc/classes/RQ/Job/Methods.html +210 -0
  94. data/doc/classes/RQ/JobQueue.html +1780 -0
  95. data/doc/classes/RQ/JobQueue.src/M000176.html +31 -0
  96. data/doc/classes/RQ/JobQueue.src/M000177.html +34 -0
  97. data/doc/classes/RQ/JobQueue.src/M000178.html +60 -0
  98. data/doc/classes/RQ/JobQueue.src/M000179.html +63 -0
  99. data/doc/classes/RQ/JobQueue.src/M000180.html +73 -0
  100. data/doc/classes/RQ/JobQueue.src/M000181.html +217 -0
  101. data/doc/classes/RQ/JobQueue.src/M000182.html +50 -0
  102. data/doc/classes/RQ/JobQueue.src/M000183.html +83 -0
  103. data/doc/classes/RQ/JobQueue.src/M000184.html +25 -0
  104. data/doc/classes/RQ/JobQueue.src/M000185.html +83 -0
  105. data/doc/classes/RQ/JobQueue.src/M000186.html +28 -0
  106. data/doc/classes/RQ/JobQueue.src/M000187.html +26 -0
  107. data/doc/classes/RQ/JobQueue.src/M000188.html +26 -0
  108. data/doc/classes/RQ/JobQueue.src/M000189.html +32 -0
  109. data/doc/classes/RQ/JobQueue.src/M000190.html +30 -0
  110. data/doc/classes/RQ/JobQueue.src/M000191.html +37 -0
  111. data/doc/classes/RQ/JobQueue.src/M000192.html +36 -0
  112. data/doc/classes/RQ/JobQueue.src/M000193.html +25 -0
  113. data/doc/classes/RQ/JobQueue.src/M000194.html +25 -0
  114. data/doc/classes/RQ/JobQueue.src/M000195.html +25 -0
  115. data/doc/classes/RQ/JobQueue.src/M000196.html +25 -0
  116. data/doc/classes/RQ/JobQueue.src/M000197.html +25 -0
  117. data/doc/classes/RQ/JobQueue.src/M000198.html +73 -0
  118. data/doc/classes/RQ/JobQueue.src/M000199.html +25 -0
  119. data/doc/classes/RQ/JobQueue.src/M000200.html +38 -0
  120. data/doc/classes/RQ/JobQueue.src/M000201.html +28 -0
  121. data/doc/classes/RQ/JobQueue/Error.html +187 -0
  122. data/doc/classes/RQ/JobRunner.html +386 -0
  123. data/doc/classes/RQ/JobRunner.src/M000117.html +53 -0
  124. data/doc/classes/RQ/JobRunner.src/M000118.html +26 -0
  125. data/doc/classes/RQ/JobRunnerDaemon.html +590 -0
  126. data/doc/classes/RQ/JobRunnerDaemon.src/M000159.html +94 -0
  127. data/doc/classes/RQ/JobRunnerDaemon.src/M000160.html +27 -0
  128. data/doc/classes/RQ/JobRunnerDaemon.src/M000161.html +39 -0
  129. data/doc/classes/RQ/JobRunnerDaemon.src/M000162.html +27 -0
  130. data/doc/classes/RQ/JobRunnerDaemon.src/M000163.html +27 -0
  131. data/doc/classes/RQ/JobRunnerDaemon.src/M000164.html +28 -0
  132. data/doc/classes/RQ/JobRunnerDaemon.src/M000165.html +28 -0
  133. data/doc/classes/RQ/JobRunnerDaemon.src/M000166.html +37 -0
  134. data/doc/classes/RQ/JobRunnerDaemon.src/M000167.html +25 -0
  135. data/doc/classes/RQ/Lister.html +256 -0
  136. data/doc/classes/RQ/Lister.src/M000156.html +52 -0
  137. data/doc/classes/RQ/Locker.html +250 -0
  138. data/doc/classes/RQ/Locker.src/M000120.html +40 -0
  139. data/doc/classes/RQ/Logging.html +296 -0
  140. data/doc/classes/RQ/Logging.src/M000067.html +28 -0
  141. data/doc/classes/RQ/Logging/LogClassMethods.html +254 -0
  142. data/doc/classes/RQ/Logging/LogClassMethods.src/M000068.html +32 -0
  143. data/doc/classes/RQ/Logging/LogClassMethods.src/M000069.html +28 -0
  144. data/doc/classes/RQ/Logging/LogMethods.html +404 -0
  145. data/doc/classes/RQ/Logging/LogMethods.src/M000070.html +35 -0
  146. data/doc/classes/RQ/Logging/LogMethods.src/M000071.html +28 -0
  147. data/doc/classes/RQ/Logging/LogMethods.src/M000072.html +21 -0
  148. data/doc/classes/RQ/Logging/LogMethods.src/M000073.html +21 -0
  149. data/doc/classes/RQ/Logging/LogMethods.src/M000074.html +21 -0
  150. data/doc/classes/RQ/Logging/LogMethods.src/M000075.html +21 -0
  151. data/doc/classes/RQ/Logging/LogMethods.src/M000076.html +21 -0
  152. data/doc/classes/RQ/Logging/LogMethods.src/M000077.html +29 -0
  153. data/doc/classes/RQ/Logging/LoggerExt.html +194 -0
  154. data/doc/classes/RQ/Main.html +2110 -0
  155. data/doc/classes/RQ/MainHelper.html +607 -0
  156. data/doc/classes/RQ/MainHelper.src/M000171.html +33 -0
  157. data/doc/classes/RQ/MainHelper.src/M000172.html +32 -0
  158. data/doc/classes/RQ/MainHelper.src/M000173.html +44 -0
  159. data/doc/classes/RQ/OrderedAutoHash.html +258 -0
  160. data/doc/classes/RQ/OrderedAutoHash.src/M000205.html +25 -0
  161. data/doc/classes/RQ/OrderedAutoHash.src/M000206.html +25 -0
  162. data/doc/classes/RQ/QDB.html +1653 -0
  163. data/doc/classes/RQ/QDB.src/M000126.html +25 -0
  164. data/doc/classes/RQ/QDB.src/M000127.html +37 -0
  165. data/doc/classes/RQ/QDB.src/M000128.html +27 -0
  166. data/doc/classes/RQ/QDB.src/M000129.html +27 -0
  167. data/doc/classes/RQ/QDB.src/M000130.html +27 -0
  168. data/doc/classes/RQ/QDB.src/M000131.html +31 -0
  169. data/doc/classes/RQ/QDB.src/M000132.html +32 -0
  170. data/doc/classes/RQ/QDB.src/M000133.html +30 -0
  171. data/doc/classes/RQ/QDB.src/M000134.html +91 -0
  172. data/doc/classes/RQ/QDB.src/M000135.html +26 -0
  173. data/doc/classes/RQ/QDB.src/M000136.html +46 -0
  174. data/doc/classes/RQ/QDB.src/M000137.html +26 -0
  175. data/doc/classes/RQ/QDB.src/M000138.html +51 -0
  176. data/doc/classes/RQ/QDB.src/M000139.html +61 -0
  177. data/doc/classes/RQ/QDB.src/M000140.html +57 -0
  178. data/doc/classes/RQ/QDB.src/M000141.html +25 -0
  179. data/doc/classes/RQ/QDB.src/M000142.html +25 -0
  180. data/doc/classes/RQ/QDB.src/M000143.html +37 -0
  181. data/doc/classes/RQ/QDB.src/M000144.html +107 -0
  182. data/doc/classes/RQ/QDB.src/M000145.html +40 -0
  183. data/doc/classes/RQ/QDB.src/M000146.html +34 -0
  184. data/doc/classes/RQ/QDB.src/M000147.html +33 -0
  185. data/doc/classes/RQ/QDB.src/M000148.html +32 -0
  186. data/doc/classes/RQ/QDB.src/M000149.html +98 -0
  187. data/doc/classes/RQ/QDB.src/M000150.html +26 -0
  188. data/doc/classes/RQ/QDB.src/M000151.html +31 -0
  189. data/doc/classes/RQ/QDB.src/M000154.html +26 -0
  190. data/doc/classes/RQ/QDB/AbortedTransactionError.html +187 -0
  191. data/doc/classes/RQ/QDB/RollbackTransactionError.html +187 -0
  192. data/doc/classes/RQ/Querier.html +328 -0
  193. data/doc/classes/RQ/Querier.src/M000203.html +45 -0
  194. data/doc/classes/RQ/Querier.src/M000204.html +78 -0
  195. data/doc/classes/RQ/ReSubmitter.html +307 -0
  196. data/doc/classes/RQ/ReSubmitter.src/M000098.html +111 -0
  197. data/doc/classes/RQ/Recoverer.html +247 -0
  198. data/doc/classes/RQ/Refresher.html +346 -0
  199. data/doc/classes/RQ/Refresher.src/M000174.html +51 -0
  200. data/doc/classes/RQ/Refresher.src/M000175.html +44 -0
  201. data/doc/classes/RQ/Relayer.html +723 -0
  202. data/doc/classes/RQ/Relayer.src/M000106.html +91 -0
  203. data/doc/classes/RQ/Relayer.src/M000107.html +47 -0
  204. data/doc/classes/RQ/Relayer.src/M000108.html +46 -0
  205. data/doc/classes/RQ/Relayer.src/M000109.html +26 -0
  206. data/doc/classes/RQ/Relayer.src/M000110.html +46 -0
  207. data/doc/classes/RQ/Relayer.src/M000111.html +40 -0
  208. data/doc/classes/RQ/Relayer.src/M000112.html +37 -0
  209. data/doc/classes/RQ/Relayer.src/M000113.html +40 -0
  210. data/doc/classes/RQ/Relayer.src/M000114.html +27 -0
  211. data/doc/classes/RQ/Relayer.src/M000115.html +25 -0
  212. data/doc/classes/RQ/Relayer.src/M000116.html +38 -0
  213. data/doc/classes/RQ/Resource.html +187 -0
  214. data/doc/classes/RQ/ResourceManager.html +276 -0
  215. data/doc/classes/RQ/Rotater.html +324 -0
  216. data/doc/classes/RQ/Rotater.src/M000158.html +71 -0
  217. data/doc/classes/RQ/SleepCycle.html +322 -0
  218. data/doc/classes/RQ/SleepCycle.src/M000123.html +32 -0
  219. data/doc/classes/RQ/SleepCycle.src/M000124.html +27 -0
  220. data/doc/classes/RQ/SleepCycle.src/M000125.html +25 -0
  221. data/doc/classes/RQ/Snapshotter.html +250 -0
  222. data/doc/classes/RQ/Snapshotter.src/M000097.html +35 -0
  223. data/doc/classes/RQ/StatusLister.html +289 -0
  224. data/doc/classes/RQ/StatusLister.src/M000096.html +26 -0
  225. data/doc/classes/RQ/Submitter.html +319 -0
  226. data/doc/classes/RQ/Submitter.src/M000119.html +92 -0
  227. data/doc/classes/RQ/Toucher.html +384 -0
  228. data/doc/classes/RQ/Updater.html +304 -0
  229. data/doc/classes/RQ/Updater.src/M000202.html +97 -0
  230. data/doc/classes/RQ/Usage.html +346 -0
  231. data/doc/classes/RQ/Usage.src/M000038.html +29 -0
  232. data/doc/classes/RQ/Usage.src/M000039.html +72 -0
  233. data/doc/classes/RQ/Util.html +1043 -0
  234. data/doc/classes/RQ/Util.src/M000040.html +27 -0
  235. data/doc/classes/RQ/Util.src/M000041.html +26 -0
  236. data/doc/classes/RQ/Util.src/M000042.html +25 -0
  237. data/doc/classes/RQ/Util.src/M000043.html +25 -0
  238. data/doc/classes/RQ/Util.src/M000044.html +30 -0
  239. data/doc/classes/RQ/Util.src/M000045.html +25 -0
  240. data/doc/classes/RQ/Util.src/M000046.html +34 -0
  241. data/doc/classes/RQ/Util.src/M000047.html +31 -0
  242. data/doc/classes/RQ/Util.src/M000048.html +41 -0
  243. data/doc/classes/RQ/Util.src/M000049.html +27 -0
  244. data/doc/classes/RQ/Util.src/M000050.html +34 -0
  245. data/doc/classes/RQ/Util.src/M000051.html +28 -0
  246. data/doc/classes/RQ/Util.src/M000052.html +27 -0
  247. data/doc/classes/RQ/Util.src/M000053.html +31 -0
  248. data/doc/classes/RQ/Util.src/M000054.html +31 -0
  249. data/doc/classes/RQ/Util.src/M000055.html +31 -0
  250. data/doc/classes/RQ/Util.src/M000056.html +25 -0
  251. data/doc/classes/RQ/Util.src/M000057.html +25 -0
  252. data/doc/classes/RQ/Util.src/M000058.html +25 -0
  253. data/doc/classes/RQ/Util.src/M000059.html +25 -0
  254. data/doc/classes/RQ/Util.src/M000060.html +25 -0
  255. data/doc/classes/RQ/Util.src/M000061.html +27 -0
  256. data/doc/classes/RQ/Util.src/M000062.html +28 -0
  257. data/doc/classes/RQ/Util.src/M000063.html +39 -0
  258. data/doc/classes/RQ/Util.src/M000064.html +39 -0
  259. data/doc/classes/RQ/Util.src/M000065.html +31 -0
  260. data/doc/classes/RQ/Util.src/M000066.html +29 -0
  261. data/doc/classes/SQLite.html +120 -0
  262. data/doc/classes/SQLite/Database.html +546 -0
  263. data/doc/classes/SQLite/TypeTranslator.html +221 -0
  264. data/doc/created.rid +1 -0
  265. data/doc/dot/f_0.dot +14 -0
  266. data/doc/dot/f_0.jpg +0 -0
  267. data/doc/dot/f_1.dot +14 -0
  268. data/doc/dot/f_1.jpg +0 -0
  269. data/doc/dot/f_10.dot +802 -0
  270. data/doc/dot/f_10.jpg +0 -0
  271. data/doc/dot/f_11.dot +14 -0
  272. data/doc/dot/f_11.jpg +0 -0
  273. data/doc/dot/f_12.dot +802 -0
  274. data/doc/dot/f_12.jpg +0 -0
  275. data/doc/dot/f_13.dot +802 -0
  276. data/doc/dot/f_13.jpg +0 -0
  277. data/doc/dot/f_14.dot +802 -0
  278. data/doc/dot/f_14.jpg +0 -0
  279. data/doc/dot/f_15.dot +802 -0
  280. data/doc/dot/f_15.jpg +0 -0
  281. data/doc/dot/f_16.dot +802 -0
  282. data/doc/dot/f_16.jpg +0 -0
  283. data/doc/dot/f_17.dot +802 -0
  284. data/doc/dot/f_17.jpg +0 -0
  285. data/doc/dot/f_18.dot +14 -0
  286. data/doc/dot/f_18.jpg +0 -0
  287. data/doc/dot/f_19.dot +802 -0
  288. data/doc/dot/f_19.jpg +0 -0
  289. data/doc/dot/f_2.dot +14 -0
  290. data/doc/dot/f_2.jpg +0 -0
  291. data/doc/dot/f_20.dot +802 -0
  292. data/doc/dot/f_20.jpg +0 -0
  293. data/doc/dot/f_21.dot +802 -0
  294. data/doc/dot/f_21.jpg +0 -0
  295. data/doc/dot/f_22.dot +802 -0
  296. data/doc/dot/f_22.jpg +0 -0
  297. data/doc/dot/f_23.dot +802 -0
  298. data/doc/dot/f_23.jpg +0 -0
  299. data/doc/dot/f_24.dot +802 -0
  300. data/doc/dot/f_24.jpg +0 -0
  301. data/doc/dot/f_25.dot +817 -0
  302. data/doc/dot/f_25.jpg +0 -0
  303. data/doc/dot/f_26.dot +29 -0
  304. data/doc/dot/f_26.jpg +0 -0
  305. data/doc/dot/f_27.dot +802 -0
  306. data/doc/dot/f_27.jpg +0 -0
  307. data/doc/dot/f_28.dot +802 -0
  308. data/doc/dot/f_28.jpg +0 -0
  309. data/doc/dot/f_29.dot +802 -0
  310. data/doc/dot/f_29.jpg +0 -0
  311. data/doc/dot/f_3.dot +14 -0
  312. data/doc/dot/f_3.jpg +0 -0
  313. data/doc/dot/f_30.dot +802 -0
  314. data/doc/dot/f_30.jpg +0 -0
  315. data/doc/dot/f_31.dot +802 -0
  316. data/doc/dot/f_31.jpg +0 -0
  317. data/doc/dot/f_32.dot +802 -0
  318. data/doc/dot/f_32.jpg +0 -0
  319. data/doc/dot/f_33.dot +802 -0
  320. data/doc/dot/f_33.jpg +0 -0
  321. data/doc/dot/f_34.dot +802 -0
  322. data/doc/dot/f_34.jpg +0 -0
  323. data/doc/dot/f_35.dot +802 -0
  324. data/doc/dot/f_35.jpg +0 -0
  325. data/doc/dot/f_36.dot +802 -0
  326. data/doc/dot/f_36.jpg +0 -0
  327. data/doc/dot/f_37.dot +802 -0
  328. data/doc/dot/f_37.jpg +0 -0
  329. data/doc/dot/f_38.dot +54 -0
  330. data/doc/dot/f_38.jpg +0 -0
  331. data/doc/dot/f_39.dot +802 -0
  332. data/doc/dot/f_39.jpg +0 -0
  333. data/doc/dot/f_4.dot +802 -0
  334. data/doc/dot/f_4.jpg +0 -0
  335. data/doc/dot/f_40.dot +802 -0
  336. data/doc/dot/f_40.jpg +0 -0
  337. data/doc/dot/f_41.dot +802 -0
  338. data/doc/dot/f_41.jpg +0 -0
  339. data/doc/dot/f_42.dot +802 -0
  340. data/doc/dot/f_42.jpg +0 -0
  341. data/doc/dot/f_43.dot +802 -0
  342. data/doc/dot/f_43.jpg +0 -0
  343. data/doc/dot/f_44.dot +802 -0
  344. data/doc/dot/f_44.jpg +0 -0
  345. data/doc/dot/f_5.dot +802 -0
  346. data/doc/dot/f_5.jpg +0 -0
  347. data/doc/dot/f_6.dot +802 -0
  348. data/doc/dot/f_6.jpg +0 -0
  349. data/doc/dot/f_7.dot +802 -0
  350. data/doc/dot/f_7.jpg +0 -0
  351. data/doc/dot/f_8.dot +802 -0
  352. data/doc/dot/f_8.jpg +0 -0
  353. data/doc/dot/f_9.dot +802 -0
  354. data/doc/dot/f_9.jpg +0 -0
  355. data/doc/dot/m_10_0.dot +802 -0
  356. data/doc/dot/m_10_0.jpg +0 -0
  357. data/doc/dot/m_11_0.dot +734 -0
  358. data/doc/dot/m_11_0.jpg +0 -0
  359. data/doc/dot/m_12_0.dot +802 -0
  360. data/doc/dot/m_12_0.jpg +0 -0
  361. data/doc/dot/m_13_0.dot +802 -0
  362. data/doc/dot/m_13_0.jpg +0 -0
  363. data/doc/dot/m_14_0.dot +802 -0
  364. data/doc/dot/m_14_0.jpg +0 -0
  365. data/doc/dot/m_15_0.dot +802 -0
  366. data/doc/dot/m_15_0.jpg +0 -0
  367. data/doc/dot/m_16_0.dot +802 -0
  368. data/doc/dot/m_16_0.jpg +0 -0
  369. data/doc/dot/m_17_0.dot +802 -0
  370. data/doc/dot/m_17_0.jpg +0 -0
  371. data/doc/dot/m_18_0.dot +734 -0
  372. data/doc/dot/m_18_0.jpg +0 -0
  373. data/doc/dot/m_19_0.dot +802 -0
  374. data/doc/dot/m_19_0.jpg +0 -0
  375. data/doc/dot/m_20_0.dot +802 -0
  376. data/doc/dot/m_20_0.jpg +0 -0
  377. data/doc/dot/m_21_0.dot +802 -0
  378. data/doc/dot/m_21_0.jpg +0 -0
  379. data/doc/dot/m_22_0.dot +802 -0
  380. data/doc/dot/m_22_0.jpg +0 -0
  381. data/doc/dot/m_23_0.dot +802 -0
  382. data/doc/dot/m_23_0.jpg +0 -0
  383. data/doc/dot/m_24_0.dot +802 -0
  384. data/doc/dot/m_24_0.jpg +0 -0
  385. data/doc/dot/m_25_0.dot +802 -0
  386. data/doc/dot/m_25_0.jpg +0 -0
  387. data/doc/dot/m_26_0.dot +734 -0
  388. data/doc/dot/m_26_0.jpg +0 -0
  389. data/doc/dot/m_27_0.dot +802 -0
  390. data/doc/dot/m_27_0.jpg +0 -0
  391. data/doc/dot/m_28_0.dot +802 -0
  392. data/doc/dot/m_28_0.jpg +0 -0
  393. data/doc/dot/m_29_0.dot +802 -0
  394. data/doc/dot/m_29_0.jpg +0 -0
  395. data/doc/dot/m_30_0.dot +802 -0
  396. data/doc/dot/m_30_0.jpg +0 -0
  397. data/doc/dot/m_31_0.dot +802 -0
  398. data/doc/dot/m_31_0.jpg +0 -0
  399. data/doc/dot/m_32_0.dot +802 -0
  400. data/doc/dot/m_32_0.jpg +0 -0
  401. data/doc/dot/m_33_0.dot +802 -0
  402. data/doc/dot/m_33_0.jpg +0 -0
  403. data/doc/dot/m_34_0.dot +802 -0
  404. data/doc/dot/m_34_0.jpg +0 -0
  405. data/doc/dot/m_35_0.dot +802 -0
  406. data/doc/dot/m_35_0.jpg +0 -0
  407. data/doc/dot/m_36_0.dot +802 -0
  408. data/doc/dot/m_36_0.jpg +0 -0
  409. data/doc/dot/m_37_0.dot +802 -0
  410. data/doc/dot/m_37_0.jpg +0 -0
  411. data/doc/dot/m_38_0.dot +54 -0
  412. data/doc/dot/m_38_0.jpg +0 -0
  413. data/doc/dot/m_39_0.dot +802 -0
  414. data/doc/dot/m_39_0.jpg +0 -0
  415. data/doc/dot/m_40_0.dot +802 -0
  416. data/doc/dot/m_40_0.jpg +0 -0
  417. data/doc/dot/m_41_0.dot +802 -0
  418. data/doc/dot/m_41_0.jpg +0 -0
  419. data/doc/dot/m_42_0.dot +802 -0
  420. data/doc/dot/m_42_0.jpg +0 -0
  421. data/doc/dot/m_43_0.dot +802 -0
  422. data/doc/dot/m_43_0.jpg +0 -0
  423. data/doc/dot/m_44_0.dot +802 -0
  424. data/doc/dot/m_44_0.jpg +0 -0
  425. data/doc/dot/m_4_0.dot +802 -0
  426. data/doc/dot/m_4_0.jpg +0 -0
  427. data/doc/dot/m_5_0.dot +802 -0
  428. data/doc/dot/m_5_0.jpg +0 -0
  429. data/doc/dot/m_6_0.dot +802 -0
  430. data/doc/dot/m_6_0.jpg +0 -0
  431. data/doc/dot/m_7_0.dot +802 -0
  432. data/doc/dot/m_7_0.jpg +0 -0
  433. data/doc/dot/m_8_0.dot +802 -0
  434. data/doc/dot/m_8_0.jpg +0 -0
  435. data/doc/dot/m_9_0.dot +802 -0
  436. data/doc/dot/m_9_0.jpg +0 -0
  437. data/doc/files/DEPENDS.html +107 -0
  438. data/doc/files/HISTORY.html +316 -0
  439. data/doc/files/INSTALL.html +126 -0
  440. data/doc/files/README.html +1223 -0
  441. data/doc/files/TODO.html +148 -0
  442. data/doc/files/TUTORIAL.html +392 -0
  443. data/doc/files/VERSION.html +107 -0
  444. data/doc/files/bin/rq_rb.html +231 -0
  445. data/doc/files/install_rb.html +188 -0
  446. data/doc/files/install_rb.src/M000001.html +53 -0
  447. data/doc/files/install_rb.src/M000002.html +43 -0
  448. data/doc/files/lib/rq-1_0_0/backer_rb.html +174 -0
  449. data/doc/files/lib/rq-1_0_0/configfile_rb.html +174 -0
  450. data/doc/files/lib/rq-1_0_0/configurator_rb.html +174 -0
  451. data/doc/files/lib/rq-1_0_0/creator_rb.html +174 -0
  452. data/doc/files/lib/rq-1_0_0/defaultconfig_txt.html +110 -0
  453. data/doc/files/lib/rq-1_0_0/deleter_rb.html +174 -0
  454. data/doc/files/lib/rq-1_0_0/executor_rb.html +174 -0
  455. data/doc/files/lib/rq-1_0_0/feeder_rb.html +178 -0
  456. data/doc/files/lib/rq-1_0_0/job_rb.html +176 -0
  457. data/doc/files/lib/rq-1_0_0/jobqueue_rb.html +177 -0
  458. data/doc/files/lib/rq-1_0_0/jobrunner_rb.html +175 -0
  459. data/doc/files/lib/rq-1_0_0/jobrunnerdaemon_rb.html +179 -0
  460. data/doc/files/lib/rq-1_0_0/lister_rb.html +174 -0
  461. data/doc/files/lib/rq-1_0_0/locker_rb.html +175 -0
  462. data/doc/files/lib/rq-1_0_0/logging_rb.html +178 -0
  463. data/doc/files/lib/rq-1_0_0/mainhelper_rb.html +175 -0
  464. data/doc/files/lib/rq-1_0_0/qdb_rb.html +177 -0
  465. data/doc/files/lib/rq-1_0_0/querier_rb.html +174 -0
  466. data/doc/files/lib/rq-1_0_0/refresher_rb.html +167 -0
  467. data/doc/files/lib/rq-1_0_0/relayer_rb.html +178 -0
  468. data/doc/files/lib/rq-1_0_0/sleepcycle_rb.html +167 -0
  469. data/doc/files/lib/rq-1_0_0/snapshotter_rb.html +174 -0
  470. data/doc/files/lib/rq-1_0_0/statuslister_rb.html +174 -0
  471. data/doc/files/lib/rq-1_0_0/submitter_rb.html +174 -0
  472. data/doc/files/lib/rq-1_0_0/updater_rb.html +174 -0
  473. data/doc/files/lib/rq-1_0_0/usage_rb.html +174 -0
  474. data/doc/files/lib/rq-1_0_0/util_rb.html +176 -0
  475. data/doc/files/lib/rq-2_0_0/backer_rb.html +180 -0
  476. data/doc/files/lib/rq-2_0_0/configfile_rb.html +180 -0
  477. data/doc/files/lib/rq-2_0_0/configurator_rb.html +180 -0
  478. data/doc/files/lib/rq-2_0_0/creator_rb.html +180 -0
  479. data/doc/files/lib/rq-2_0_0/defaultconfig_txt.html +110 -0
  480. data/doc/files/lib/rq-2_0_0/deleter_rb.html +180 -0
  481. data/doc/files/lib/rq-2_0_0/executor_rb.html +180 -0
  482. data/doc/files/lib/rq-2_0_0/feeder_rb.html +184 -0
  483. data/doc/files/lib/rq-2_0_0/job_rb.html +182 -0
  484. data/doc/files/lib/rq-2_0_0/jobqueue_rb.html +185 -0
  485. data/doc/files/lib/rq-2_0_0/jobrunner_rb.html +181 -0
  486. data/doc/files/lib/rq-2_0_0/jobrunnerdaemon_rb.html +185 -0
  487. data/doc/files/lib/rq-2_0_0/lister_rb.html +180 -0
  488. data/doc/files/lib/rq-2_0_0/locker_rb.html +181 -0
  489. data/doc/files/lib/rq-2_0_0/logging_rb.html +184 -0
  490. data/doc/files/lib/rq-2_0_0/mainhelper_rb.html +181 -0
  491. data/doc/files/lib/rq-2_0_0/orderedautohash_rb.html +182 -0
  492. data/doc/files/lib/rq-2_0_0/orderedhash_rb.html +138 -0
  493. data/doc/files/lib/rq-2_0_0/qdb_rb.html +184 -0
  494. data/doc/files/lib/rq-2_0_0/querier_rb.html +180 -0
  495. data/doc/files/lib/rq-2_0_0/refresher_rb.html +173 -0
  496. data/doc/files/lib/rq-2_0_0/relayer_rb.html +184 -0
  497. data/doc/files/lib/rq-2_0_0/rotater_rb.html +180 -0
  498. data/doc/files/lib/rq-2_0_0/sleepcycle_rb.html +173 -0
  499. data/doc/files/lib/rq-2_0_0/snapshotter_rb.html +180 -0
  500. data/doc/files/lib/rq-2_0_0/statuslister_rb.html +180 -0
  501. data/doc/files/lib/rq-2_0_0/submitter_rb.html +181 -0
  502. data/doc/files/lib/rq-2_0_0/updater_rb.html +180 -0
  503. data/doc/files/lib/rq-2_0_0/usage_rb.html +180 -0
  504. data/doc/files/lib/rq-2_0_0/util_rb.html +182 -0
  505. data/doc/files/lib/rq-2_3_1/backer_rb.html +182 -0
  506. data/doc/files/lib/rq-2_3_1/configfile_rb.html +182 -0
  507. data/doc/files/lib/rq-2_3_1/configurator_rb.html +182 -0
  508. data/doc/files/lib/rq-2_3_1/creator_rb.html +182 -0
  509. data/doc/files/lib/rq-2_3_1/defaultconfig_txt.html +110 -0
  510. data/doc/files/lib/rq-2_3_1/deleter_rb.html +182 -0
  511. data/doc/files/lib/rq-2_3_1/executor_rb.html +182 -0
  512. data/doc/files/lib/rq-2_3_1/feeder_rb.html +187 -0
  513. data/doc/files/lib/rq-2_3_1/job_rb.html +185 -0
  514. data/doc/files/lib/rq-2_3_1/jobqueue_rb.html +187 -0
  515. data/doc/files/lib/rq-2_3_1/jobrunner_rb.html +184 -0
  516. data/doc/files/lib/rq-2_3_1/jobrunnerdaemon_rb.html +187 -0
  517. data/doc/files/lib/rq-2_3_1/lister_rb.html +182 -0
  518. data/doc/files/lib/rq-2_3_1/locker_rb.html +183 -0
  519. data/doc/files/lib/rq-2_3_1/logging_rb.html +186 -0
  520. data/doc/files/lib/rq-2_3_1/mainhelper_rb.html +183 -0
  521. data/doc/files/lib/rq-2_3_1/orderedautohash_rb.html +184 -0
  522. data/doc/files/lib/rq-2_3_1/orderedhash_rb.html +138 -0
  523. data/doc/files/lib/rq-2_3_1/qdb_rb.html +188 -0
  524. data/doc/files/lib/rq-2_3_1/querier_rb.html +182 -0
  525. data/doc/files/lib/rq-2_3_1/refresher_rb.html +175 -0
  526. data/doc/files/lib/rq-2_3_1/relayer_rb.html +186 -0
  527. data/doc/files/lib/rq-2_3_1/resubmitter_rb.html +183 -0
  528. data/doc/files/lib/rq-2_3_1/rotater_rb.html +182 -0
  529. data/doc/files/lib/rq-2_3_1/sleepcycle_rb.html +175 -0
  530. data/doc/files/lib/rq-2_3_1/snapshotter_rb.html +182 -0
  531. data/doc/files/lib/rq-2_3_1/statuslister_rb.html +182 -0
  532. data/doc/files/lib/rq-2_3_1/submitter_rb.html +183 -0
  533. data/doc/files/lib/rq-2_3_1/updater_rb.html +182 -0
  534. data/doc/files/lib/rq-2_3_1/usage_rb.html +182 -0
  535. data/doc/files/lib/rq-2_3_1/util_rb.html +184 -0
  536. data/doc/files/lib/rq-2_3_1_rb.html +153 -0
  537. data/doc/files/lib/rq-2_3_2/backer_rb.html +186 -0
  538. data/doc/files/lib/rq-2_3_2/configfile_rb.html +186 -0
  539. data/doc/files/lib/rq-2_3_2/configurator_rb.html +186 -0
  540. data/doc/files/lib/rq-2_3_2/creator_rb.html +186 -0
  541. data/doc/files/lib/rq-2_3_2/defaultconfig_txt.html +110 -0
  542. data/doc/files/lib/rq-2_3_2/deleter_rb.html +186 -0
  543. data/doc/files/lib/rq-2_3_2/executor_rb.html +186 -0
  544. data/doc/files/lib/rq-2_3_2/feeder_rb.html +191 -0
  545. data/doc/files/lib/rq-2_3_2/ioviewer_rb.html +186 -0
  546. data/doc/files/lib/rq-2_3_2/job_rb.html +189 -0
  547. data/doc/files/lib/rq-2_3_2/jobqueue_rb.html +192 -0
  548. data/doc/files/lib/rq-2_3_2/jobrunner_rb.html +188 -0
  549. data/doc/files/lib/rq-2_3_2/jobrunnerdaemon_rb.html +191 -0
  550. data/doc/files/lib/rq-2_3_2/lister_rb.html +186 -0
  551. data/doc/files/lib/rq-2_3_2/locker_rb.html +187 -0
  552. data/doc/files/lib/rq-2_3_2/logging_rb.html +190 -0
  553. data/doc/files/lib/rq-2_3_2/mainhelper_rb.html +188 -0
  554. data/doc/files/lib/rq-2_3_2/orderedautohash_rb.html +188 -0
  555. data/doc/files/lib/rq-2_3_2/orderedhash_rb.html +138 -0
  556. data/doc/files/lib/rq-2_3_2/qdb_rb.html +193 -0
  557. data/doc/files/lib/rq-2_3_2/querier_rb.html +186 -0
  558. data/doc/files/lib/rq-2_3_2/recoverer_rb.html +186 -0
  559. data/doc/files/lib/rq-2_3_2/refresher_rb.html +179 -0
  560. data/doc/files/lib/rq-2_3_2/relayer_rb.html +190 -0
  561. data/doc/files/lib/rq-2_3_2/resubmitter_rb.html +187 -0
  562. data/doc/files/lib/rq-2_3_2/rotater_rb.html +186 -0
  563. data/doc/files/lib/rq-2_3_2/sleepcycle_rb.html +179 -0
  564. data/doc/files/lib/rq-2_3_2/snapshotter_rb.html +186 -0
  565. data/doc/files/lib/rq-2_3_2/statuslister_rb.html +186 -0
  566. data/doc/files/lib/rq-2_3_2/submitter_rb.html +187 -0
  567. data/doc/files/lib/rq-2_3_2/updater_rb.html +186 -0
  568. data/doc/files/lib/rq-2_3_2/usage_rb.html +186 -0
  569. data/doc/files/lib/rq-2_3_2/util_rb.html +188 -0
  570. data/doc/files/lib/rq-2_3_3/backer_rb.html +186 -0
  571. data/doc/files/lib/rq-2_3_3/configfile_rb.html +186 -0
  572. data/doc/files/lib/rq-2_3_3/configurator_rb.html +186 -0
  573. data/doc/files/lib/rq-2_3_3/creator_rb.html +186 -0
  574. data/doc/files/lib/rq-2_3_3/defaultconfig_txt.html +110 -0
  575. data/doc/files/lib/rq-2_3_3/deleter_rb.html +186 -0
  576. data/doc/files/lib/rq-2_3_3/executor_rb.html +186 -0
  577. data/doc/files/lib/rq-2_3_3/feeder_rb.html +191 -0
  578. data/doc/files/lib/rq-2_3_3/ioviewer_rb.html +186 -0
  579. data/doc/files/lib/rq-2_3_3/job_rb.html +189 -0
  580. data/doc/files/lib/rq-2_3_3/jobqueue_rb.html +192 -0
  581. data/doc/files/lib/rq-2_3_3/jobrunner_rb.html +188 -0
  582. data/doc/files/lib/rq-2_3_3/jobrunnerdaemon_rb.html +191 -0
  583. data/doc/files/lib/rq-2_3_3/lister_rb.html +186 -0
  584. data/doc/files/lib/rq-2_3_3/locker_rb.html +187 -0
  585. data/doc/files/lib/rq-2_3_3/logging_rb.html +190 -0
  586. data/doc/files/lib/rq-2_3_3/mainhelper_rb.html +188 -0
  587. data/doc/files/lib/rq-2_3_3/orderedautohash_rb.html +188 -0
  588. data/doc/files/lib/rq-2_3_3/orderedhash_rb.html +138 -0
  589. data/doc/files/lib/rq-2_3_3/qdb_rb.html +193 -0
  590. data/doc/files/lib/rq-2_3_3/querier_rb.html +186 -0
  591. data/doc/files/lib/rq-2_3_3/recoverer_rb.html +186 -0
  592. data/doc/files/lib/rq-2_3_3/refresher_rb.html +179 -0
  593. data/doc/files/lib/rq-2_3_3/relayer_rb.html +190 -0
  594. data/doc/files/lib/rq-2_3_3/resubmitter_rb.html +187 -0
  595. data/doc/files/lib/rq-2_3_3/rotater_rb.html +187 -0
  596. data/doc/files/lib/rq-2_3_3/sleepcycle_rb.html +179 -0
  597. data/doc/files/lib/rq-2_3_3/snapshotter_rb.html +186 -0
  598. data/doc/files/lib/rq-2_3_3/statuslister_rb.html +186 -0
  599. data/doc/files/lib/rq-2_3_3/submitter_rb.html +187 -0
  600. data/doc/files/lib/rq-2_3_3/updater_rb.html +186 -0
  601. data/doc/files/lib/rq-2_3_3/usage_rb.html +186 -0
  602. data/doc/files/lib/rq-2_3_3/util_rb.html +188 -0
  603. data/doc/files/lib/rq-3_0_0/backer_rb.html +194 -0
  604. data/doc/files/lib/rq-3_0_0/configfile_rb.html +194 -0
  605. data/doc/files/lib/rq-3_0_0/configurator_rb.html +194 -0
  606. data/doc/files/lib/rq-3_0_0/creator_rb.html +194 -0
  607. data/doc/files/lib/rq-3_0_0/cron_rb.html +194 -0
  608. data/doc/files/lib/rq-3_0_0/defaultconfig_txt.html +110 -0
  609. data/doc/files/lib/rq-3_0_0/deleter_rb.html +194 -0
  610. data/doc/files/lib/rq-3_0_0/executor_rb.html +194 -0
  611. data/doc/files/lib/rq-3_0_0/feeder_rb.html +199 -0
  612. data/doc/files/lib/rq-3_0_0/ioviewer_rb.html +194 -0
  613. data/doc/files/lib/rq-3_0_0/job_rb.html +197 -0
  614. data/doc/files/lib/rq-3_0_0/jobqueue_rb.html +200 -0
  615. data/doc/files/lib/rq-3_0_0/jobrunner_rb.html +196 -0
  616. data/doc/files/lib/rq-3_0_0/jobrunnerdaemon_rb.html +199 -0
  617. data/doc/files/lib/rq-3_0_0/lister_rb.html +194 -0
  618. data/doc/files/lib/rq-3_0_0/locker_rb.html +195 -0
  619. data/doc/files/lib/rq-3_0_0/logging_rb.html +198 -0
  620. data/doc/files/lib/rq-3_0_0/mainhelper_rb.html +196 -0
  621. data/doc/files/lib/rq-3_0_0/orderedautohash_rb.html +196 -0
  622. data/doc/files/lib/rq-3_0_0/orderedhash_rb.html +138 -0
  623. data/doc/files/lib/rq-3_0_0/qdb_rb.html +201 -0
  624. data/doc/files/lib/rq-3_0_0/querier_rb.html +194 -0
  625. data/doc/files/lib/rq-3_0_0/recoverer_rb.html +194 -0
  626. data/doc/files/lib/rq-3_0_0/refresher_rb.html +187 -0
  627. data/doc/files/lib/rq-3_0_0/relayer_rb.html +198 -0
  628. data/doc/files/lib/rq-3_0_0/resource_rb.html +194 -0
  629. data/doc/files/lib/rq-3_0_0/resourcemanager_rb.html +187 -0
  630. data/doc/files/lib/rq-3_0_0/resubmitter_rb.html +195 -0
  631. data/doc/files/lib/rq-3_0_0/rotater_rb.html +195 -0
  632. data/doc/files/lib/rq-3_0_0/sleepcycle_rb.html +187 -0
  633. data/doc/files/lib/rq-3_0_0/snapshotter_rb.html +194 -0
  634. data/doc/files/lib/rq-3_0_0/sqlite_rb.html +160 -0
  635. data/doc/files/lib/rq-3_0_0/statuslister_rb.html +194 -0
  636. data/doc/files/lib/rq-3_0_0/submitter_rb.html +195 -0
  637. data/doc/files/lib/rq-3_0_0/toucher_rb.html +195 -0
  638. data/doc/files/lib/rq-3_0_0/updater_rb.html +194 -0
  639. data/doc/files/lib/rq-3_0_0/usage_rb.html +194 -0
  640. data/doc/files/lib/rq-3_0_0/util_rb.html +196 -0
  641. data/doc/files/lib/rq_rb.html +244 -0
  642. data/doc/fr_class_index.html +73 -0
  643. data/doc/fr_file_index.html +71 -0
  644. data/doc/fr_method_index.html +323 -0
  645. data/doc/index.html +24 -0
  646. data/doc/rdoc-style.css +172 -0
  647. data/extconf.rb +150 -0
  648. data/gemspec.rb +32 -0
  649. data/install.rb +75 -8
  650. data/lib/{rq-0.1.7.rb → rq-3.0.0.rb} +52 -10
  651. data/lib/{rq-0.1.7 → rq-3.0.0}/backer.rb +11 -7
  652. data/lib/{rq-0.1.7 → rq-3.0.0}/configfile.rb +21 -17
  653. data/lib/{rq-0.1.7 → rq-3.0.0}/configurator.rb +10 -6
  654. data/lib/rq-3.0.0/creator.rb +46 -0
  655. data/lib/rq-3.0.0/cron.rb +125 -0
  656. data/lib/{rq-0.1.7 → rq-3.0.0}/defaultconfig.txt +0 -0
  657. data/lib/rq-3.0.0/deleter.rb +51 -0
  658. data/lib/rq-3.0.0/executor.rb +40 -0
  659. data/lib/{rq-0.1.7 → rq-3.0.0}/feeder.rb +245 -91
  660. data/lib/rq-3.0.0/i686-linux/_sqlite.so +0 -0
  661. data/lib/rq-3.0.0/ioviewer.rb +48 -0
  662. data/lib/rq-3.0.0/job.rb +51 -0
  663. data/lib/rq-3.0.0/jobqueue.rb +899 -0
  664. data/lib/rq-3.0.0/jobrunner.rb +104 -0
  665. data/lib/{rq-0.1.7 → rq-3.0.0}/jobrunnerdaemon.rb +41 -27
  666. data/lib/rq-3.0.0/lister.rb +47 -0
  667. data/lib/rq-3.0.0/local/bin/sqlite +0 -0
  668. data/lib/rq-3.0.0/local/include/sqlite.h +868 -0
  669. data/lib/rq-3.0.0/local/lib/libsqlite.a +0 -0
  670. data/lib/rq-3.0.0/local/lib/libsqlite.la +35 -0
  671. data/lib/rq-3.0.0/local/lib/libsqlite.so +0 -0
  672. data/lib/rq-3.0.0/local/lib/libsqlite.so.0 +0 -0
  673. data/lib/rq-3.0.0/local/lib/libsqlite.so.0.8.6 +0 -0
  674. data/lib/rq-3.0.0/local/lib/pkgconfig/sqlite.pc +12 -0
  675. data/lib/{rq-0.1.7 → rq-3.0.0}/locker.rb +12 -6
  676. data/lib/{rq-0.1.7 → rq-3.0.0}/logging.rb +49 -42
  677. data/lib/rq-3.0.0/mainhelper.rb +184 -0
  678. data/lib/rq-3.0.0/orderedautohash.rb +39 -0
  679. data/lib/rq-3.0.0/orderedhash.rb +240 -0
  680. data/lib/{rq-0.1.7 → rq-3.0.0}/qdb.rb +183 -84
  681. data/lib/rq-3.0.0/querier.rb +98 -0
  682. data/lib/rq-3.0.0/recoverer.rb +28 -0
  683. data/lib/{rq-0.1.7 → rq-3.0.0}/refresher.rb +16 -8
  684. data/lib/rq-3.0.0/relayer.rb +283 -0
  685. data/lib/rq-3.0.0/resource.rb +22 -0
  686. data/lib/rq-3.0.0/resourcemanager.rb +40 -0
  687. data/lib/rq-3.0.0/resubmitter.rb +96 -0
  688. data/lib/rq-3.0.0/rotater.rb +98 -0
  689. data/lib/{rq-0.1.7 → rq-3.0.0}/sleepcycle.rb +14 -14
  690. data/lib/rq-3.0.0/snapshotter.rb +40 -0
  691. data/lib/rq-3.0.0/sqlite.rb +293 -0
  692. data/lib/rq-3.0.0/statuslister.rb +48 -0
  693. data/lib/rq-3.0.0/submitter.rb +109 -0
  694. data/lib/rq-3.0.0/toucher.rb +177 -0
  695. data/lib/rq-3.0.0/updater.rb +95 -0
  696. data/lib/rq-3.0.0/usage.rb +1157 -0
  697. data/lib/{rq-0.1.7 → rq-3.0.0}/util.rb +74 -56
  698. data/lib/rq.rb +52 -12
  699. data/rdoc.sh +17 -0
  700. data/rq +3 -1
  701. data/white_box/joblist +8 -0
  702. metadata +779 -96
  703. data/DEPENDS +0 -5
  704. data/HISTORY +0 -26
  705. data/VERSION +0 -1
  706. data/bin/rq-0.1.7 +0 -410
  707. data/lib/rq-0.1.7/creator.rb +0 -23
  708. data/lib/rq-0.1.7/deleter.rb +0 -39
  709. data/lib/rq-0.1.7/executor.rb +0 -41
  710. data/lib/rq-0.1.7/job.rb +0 -51
  711. data/lib/rq-0.1.7/jobqueue.rb +0 -432
  712. data/lib/rq-0.1.7/jobrunner.rb +0 -63
  713. data/lib/rq-0.1.7/lister.rb +0 -22
  714. data/lib/rq-0.1.7/mainhelper.rb +0 -53
  715. data/lib/rq-0.1.7/querier.rb +0 -33
  716. data/lib/rq-0.1.7/snapshotter.rb +0 -25
  717. data/lib/rq-0.1.7/statuslister.rb +0 -22
  718. data/lib/rq-0.1.7/submitter.rb +0 -90
  719. data/lib/rq-0.1.7/updater.rb +0 -95
  720. data/lib/rq-0.1.7/usage.rb +0 -609
  721. data/rdoc.cmd +0 -2
  722. data/rq.gemspec +0 -36
  723. data/rq.help +0 -552
@@ -0,0 +1,48 @@
1
+ unless defined? $__rq_ioviewer__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require LIBDIR + 'mainhelper'
8
+
9
+ #
10
+ # the IOViewer class spawns an external editor command to view the
11
+ # stdin/stdout/stderr of a jid(s)
12
+ #
13
+ class IOViewer < MainHelper
14
+ #--{{{
15
+ def ioview
16
+ #--{{{
17
+ @infile = @options['infile']
18
+ debug{ "infile <#{ @infile }>" }
19
+
20
+ jobs = []
21
+ if @infile
22
+ open(@infile) do |f|
23
+ debug{ "reading jobs from <#{ @infile }>" }
24
+ loadio f, @infile, jobs
25
+ end
26
+ end
27
+ if stdin?
28
+ debug{ "reading jobs from <stdin>" }
29
+ loadio stdin, 'stdin', jobs
30
+ end
31
+ jobs.each{|job| @argv << Integer(job['jid'])}
32
+
33
+ editor = @options['editor'] || ENV['RQ_EDITOR'] || ENV['RQ_IOVIEW'] || 'vim -R -o'
34
+ @argv.each do |jid|
35
+ jid = Integer jid
36
+ ios = %w( stdin stdout stderr ).map{|d| File.join @qpath, d, jid.to_s}
37
+ command = "#{ editor } #{ ios.join ' ' }"
38
+ system(command) #or error{ "command <#{ command }> failed with <#{ $? }>" }
39
+ end
40
+ self
41
+ #--}}}
42
+ end
43
+ #--}}}
44
+ end # class IOViewer
45
+ #--}}}
46
+ end # module RQ
47
+ $__rq_ioviewer__ = __FILE__
48
+ end
@@ -0,0 +1,51 @@
1
+ unless defined? $__rq_job__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require 'arrayfields'
8
+ require 'yaml'
9
+
10
+ require LIBDIR + 'util'
11
+ require LIBDIR + 'qdb'
12
+
13
+ #
14
+ # Job is a convenience class which stamps out a QDB::tuple and extends it
15
+ # with methods that give accessor methods for each field in the hash
16
+ #
17
+ class Job < Array
18
+ #--{{{
19
+ include ArrayFields
20
+ def initialize kvs = {}
21
+ #--{{{
22
+ self.fields = QDB::FIELDS
23
+ (kvs.keys - self.fields).each{|k| self[k] = kvs[k]}
24
+ #--}}}
25
+ end
26
+ def method_missing(meth, *args, &block)
27
+ #--{{{
28
+ setpat = %r/=$/o
29
+ meth = "#{ meth }"
30
+ setter = meth =~ setpat
31
+ meth.gsub! setpat, ''
32
+ if fields.include? "#{ meth }"
33
+ if setter
34
+ self.send('[]=', meth, *args, &block)
35
+ else
36
+ self.send('[]', meth, *args, &block)
37
+ end
38
+ else
39
+ super
40
+ end
41
+ #--}}}
42
+ end
43
+ def to_yaml
44
+ to_hash.to_yaml
45
+ end
46
+ #--}}}
47
+ end # class Job
48
+ #--}}}
49
+ end # module RQ
50
+ $__rq_job__ = __FILE__
51
+ end
@@ -0,0 +1,899 @@
1
+ unless defined? $__rq_jobqueue__
2
+ module RQ
3
+ #--{{{
4
+ LIBDIR = File::dirname(File::expand_path(__FILE__)) + File::SEPARATOR unless
5
+ defined? LIBDIR
6
+
7
+ require 'tempfile'
8
+
9
+ require LIBDIR + 'util'
10
+ require LIBDIR + 'logging'
11
+ require LIBDIR + 'qdb'
12
+ require LIBDIR + 'orderedhash'
13
+ require LIBDIR + 'orderedautohash'
14
+
15
+ #
16
+ # the JobQueue class is responsible for high level access to the job queue
17
+ #
18
+ class JobQueue
19
+ #--{{{
20
+ include Logging
21
+ include Util
22
+ class Error < StandardError; end
23
+
24
+ MAX_JID = 2 ** 20
25
+
26
+ class << self
27
+ #--{{{
28
+ def create path, opts = {}
29
+ #--{{{
30
+ FileUtils::rm_rf path
31
+ FileUtils::mkdir_p path
32
+ db = File::join path, 'db'
33
+ qdb = QDB.create db, opts
34
+ opts['qdb'] = qdb
35
+ q = new path, opts
36
+ FileUtils::mkdir_p q.bin
37
+ FileUtils::mkdir_p q.stdin
38
+ FileUtils::mkdir_p q.stdout
39
+ FileUtils::mkdir_p q.stderr
40
+ q
41
+ #--}}}
42
+ end
43
+ #--}}}
44
+ end
45
+
46
+ attr :path
47
+ attr :bin
48
+ attr :stdin
49
+ attr :stdout
50
+ attr :stderr
51
+ attr :opts
52
+ attr :qdb
53
+ alias :db :qdb
54
+
55
+ def initialize path, opts = {}
56
+ #--{{{
57
+ @path = path # do NOT expand this or it'll be fubar from misc nfs mounts!!
58
+ @bin = File::join @path, 'bin'
59
+ @stdin = File::join @path, 'stdin'
60
+ @stdout = File::join @path, 'stdout'
61
+ @stderr = File::join @path, 'stderr'
62
+ @opts = opts
63
+ raise "q <#{ @path }> does not exist" unless test ?e, @path
64
+ raise "q <#{ @path }> is not a directory" unless test ?d, @path
65
+ @basename = File::basename(@path)
66
+ @dirname = File::dirname(@path)
67
+ @logger = getopt('logger', opts) || Logger::new(STDERR)
68
+ @qdb = getopt('qdb', opts) || QDB::new(File::join(@path, 'db'), 'logger' => @logger)
69
+ @in_transaction = false
70
+ @in_ro_transaction = false
71
+ #--}}}
72
+ end
73
+ def stdin4 jid
74
+ #--{{{
75
+ "stdin/#{ jid }"
76
+ #--}}}
77
+ end
78
+ def standard_in_4 jid
79
+ #--{{{
80
+ File::expand_path(File::join(path, stdin4(jid)))
81
+ #--}}}
82
+ end
83
+ def stdout4 jid
84
+ #--{{{
85
+ "stdout/#{ jid }"
86
+ #--}}}
87
+ end
88
+ def standard_out_4 jid
89
+ #--{{{
90
+ File::expand_path(File::join(path, stdout4(jid)))
91
+ #--}}}
92
+ end
93
+ def stderr4 jid
94
+ #--{{{
95
+ "stderr/#{ jid }"
96
+ #--}}}
97
+ end
98
+ def standard_err_4 jid
99
+ #--{{{
100
+ File::expand_path(File::join(path, stderr4(jid)))
101
+ #--}}}
102
+ end
103
+ def submit(*jobs, &block)
104
+ #--{{{
105
+ now = Util::timestamp Time::now
106
+
107
+ transaction do
108
+ sql = "select max(jid) from jobs"
109
+ tuple = execute(sql).first
110
+ jid = tuple.first || 0
111
+ jid = Integer(jid) + 1
112
+
113
+ jobs.each do |job|
114
+ command = job['command']
115
+ stdin = job['stdin']
116
+
117
+ raise "no command for job <#{ job.inspect }>" unless command
118
+
119
+ tmp_stdin(stdin) do |ts|
120
+ tuple = QDB::tuple
121
+
122
+ tuple['command'] = command
123
+ tuple['priority'] = job['priority'] || 0
124
+ tuple['tag'] = job['tag']
125
+ tuple['runner'] = job['runner']
126
+ tuple['restartable'] = job['restartable']
127
+ tuple['state'] = 'pending'
128
+ tuple['submitted'] = now
129
+ tuple['submitter'] = Util::hostname
130
+ tuple['stdin'] = stdin4 jid
131
+ tuple['stdout'] = nil
132
+ tuple['stderr'] = nil
133
+
134
+ values = QDB::q tuple
135
+
136
+ sql = "insert into jobs values (#{ values.join ',' });\n"
137
+ execute(sql){}
138
+
139
+ FileUtils::rm_rf standard_in_4(jid)
140
+ FileUtils::rm_rf standard_out_4(jid)
141
+ FileUtils::rm_rf standard_err_4(jid)
142
+ FileUtils::cp ts.path, standard_in_4(jid) if ts
143
+
144
+ if block
145
+ sql = "select * from jobs where jid = '#{ jid }'"
146
+ execute(sql, &block)
147
+ end
148
+ end
149
+
150
+ jid += 1
151
+ end
152
+ end
153
+
154
+ self
155
+ #--}}}
156
+ end
157
+ def resubmit(*jobs, &block)
158
+ #--{{{
159
+ now = Util::timestamp Time::now
160
+
161
+ transaction do
162
+ jobs.each do |job|
163
+ jid = Integer job['jid']
164
+ command = job['command']
165
+ stdin = job['stdin']
166
+
167
+ raise "no jid for job <#{ job.inspect }>" unless jid
168
+ raise "no command for job <#{ job.inspect }>" unless command
169
+
170
+ tmp_stdin(stdin) do |ts|
171
+ tuple = QDB::tuple
172
+
173
+ tuple['jid'] = jid
174
+ tuple['command'] = command
175
+ tuple['priority'] = job['priority'] || 0
176
+ tuple['tag'] = job['tag']
177
+ tuple['runner'] = job['runner']
178
+ tuple['restartable'] = job['restartable']
179
+ tuple['state'] = 'pending'
180
+ tuple['submitted'] = now
181
+ tuple['submitter'] = Util::hostname
182
+ tuple['stdin'] = stdin4 jid
183
+ tuple['stdout'] = nil
184
+ tuple['stderr'] = nil
185
+
186
+ kvs = tuple.fields[1..-1].map{|f| "#{ f }=#{ QDB::q(tuple[ f ]) }"}
187
+ sql = "update jobs set #{ kvs.join ',' } where jid=#{ jid };\n"
188
+
189
+ execute(sql){}
190
+
191
+ FileUtils::rm_rf standard_in_4(jid)
192
+ FileUtils::rm_rf standard_out_4(jid)
193
+ FileUtils::rm_rf standard_err_4(jid)
194
+ FileUtils::cp ts.path, standard_in_4(jid) if ts
195
+
196
+ if block
197
+ sql = "select * from jobs where jid = '#{ jid }'"
198
+ execute(sql, &block)
199
+ end
200
+ end # tmp_stdin
201
+ end # jobs.each
202
+ end # transaction
203
+
204
+ self
205
+ #--}}}
206
+ end
207
+ def tmp_stdin stdin = nil
208
+ #--{{{
209
+ stdin = nil if stdin.to_s.empty?
210
+ stdin = STDIN if stdin == '-'
211
+
212
+ was_opened = false
213
+
214
+ begin
215
+ unless stdin.respond_to?('read') or stdin.nil?
216
+ stdin = stdin.to_s
217
+ # relative to queue
218
+ if stdin =~ %r|^@?stdin/\d+$|
219
+ stdin.gsub! %r|^@|, ''
220
+ stdin = File::join(path, stdin)
221
+ end
222
+ stdin = File.expand_path stdin
223
+ stdin = open stdin
224
+ was_opened = true
225
+ end
226
+
227
+ tmp = Tempfile::new "#{ Process::pid }_#{ rand }"
228
+ while((buf = stdin.read(8192))); tmp.write buf; end if stdin
229
+ tmp.close
230
+
231
+ if block_given?
232
+ begin
233
+ yield tmp
234
+ ensure
235
+ tmp.close!
236
+ end
237
+ else
238
+ return tmp
239
+ end
240
+ ensure
241
+ stdin.close if was_opened rescue nil
242
+ end
243
+ #--}}}
244
+ end
245
+ def list(*whats, &block)
246
+ #--{{{
247
+ ret = nil
248
+
249
+ whats.replace(%w( pending running finished dead )) if
250
+ whats.empty? or whats.include?('all')
251
+
252
+ whats.map! do |what|
253
+ case what
254
+ when %r/^\s*p/io
255
+ 'pending'
256
+ when %r/^\s*h/io
257
+ 'holding'
258
+ when %r/^\s*r/io
259
+ 'running'
260
+ when %r/^\s*f/io
261
+ 'finished'
262
+ when %r/^\s*d/io
263
+ 'dead'
264
+ else
265
+ what
266
+ end
267
+ end
268
+
269
+ where_clauses = []
270
+
271
+ whats.each do |what|
272
+ case what
273
+ when Numeric
274
+ where_clauses << "jid=#{ what }\n"
275
+ else
276
+ what = "#{ what }"
277
+ if what.to_s =~ %r/^\s*\d+\s*$/o
278
+ where_clauses << "jid=#{ QDB::q what }\n"
279
+ else
280
+ where_clauses << "state=#{ QDB::q what }\n"
281
+ end
282
+ end
283
+ end
284
+
285
+ where_clause = where_clauses.join(" or \n")
286
+
287
+ sql = <<-sql
288
+ select * from jobs
289
+ where #{ where_clause }
290
+ sql
291
+
292
+ if block
293
+ ro_transaction{ execute(sql, &block) }
294
+ else
295
+ ret = ro_transaction{ execute(sql) }
296
+ end
297
+
298
+ ret
299
+ #--}}}
300
+ end
301
+ def status options = {}
302
+ #--{{{
303
+ stats = OrderedAutoHash::new
304
+
305
+ now = Time::now
306
+
307
+ hms = lambda do |t|
308
+ elapsed =
309
+ begin
310
+ Float t
311
+ rescue
312
+ now - Util::stamptime(t, 'local' => true)
313
+ end
314
+ sh, sm, ss = Util::hms elapsed.to_f
315
+ s = "#{ '%2.2d' % sh }h#{ '%2.2d' % sm }m#{ '%05.2f' % ss }s"
316
+ end
317
+
318
+ exit_code_map =
319
+ options[:exit_code_map] || options['exit_code_map'] || {}
320
+
321
+ ro_transaction do
322
+ #
323
+ # jobs stats
324
+ #
325
+ total = 0
326
+ %w( pending holding running finished dead ).each do |state|
327
+ sql = <<-sql
328
+ select count(*) from jobs
329
+ where
330
+ state='#{ state }'
331
+ sql
332
+ tuples = execute sql
333
+ tuple = tuples.first
334
+ count = (tuple ? Integer(tuple.first || 0) : 0)
335
+ stats['jobs'][state] = count
336
+ total += count
337
+ end
338
+ stats['jobs']['total'] = total
339
+ #
340
+ # temporal stats
341
+ #
342
+ metrics = OrderedAutoHash::new
343
+ metrics['pending'] = 'submitted'
344
+ metrics['holding'] = 'submitted'
345
+ metrics['running'] = 'started'
346
+ metrics['finished'] = 'elapsed'
347
+ metrics['dead'] = 'elapsed'
348
+
349
+ metrics.each do |state, metric|
350
+ sql =
351
+ unless metric == 'elapsed'
352
+ <<-sql
353
+ select min(#{ metric }) as max, max(#{ metric }) as min
354
+ from jobs where state='#{ state }'
355
+ sql
356
+ else
357
+ <<-sql
358
+ select min(#{ metric }) as min, max(#{ metric }) as max
359
+ from jobs where state='#{ state }'
360
+ sql
361
+ end
362
+ tuple = execute(sql).first
363
+ next unless tuple
364
+
365
+ %w( min max ).each do |time|
366
+ oh = nil
367
+ t = tuple[time]
368
+ if t
369
+ sql = <<-sql
370
+ select jid from jobs where #{ metric }='#{ t }' and state='#{ state }'
371
+ sql
372
+ which = execute(sql).first
373
+ jid = (which and which['jid']).to_i
374
+ if jid
375
+ oh = OrderedAutoHash::new
376
+ oh[jid] = hms[t]
377
+ oh.yaml_inline = true
378
+ end
379
+ stats['temporal'][state][time] = oh
380
+ end
381
+ end
382
+ #stats['temporal'][state] ||= nil
383
+ end
384
+ stats['temporal'] ||= nil
385
+ #
386
+ # generate performance stats
387
+ #
388
+ sql = <<-sql
389
+ select avg(elapsed) from jobs
390
+ where
391
+ state='finished'
392
+ sql
393
+ tuples = execute sql
394
+ tuple = tuples.first
395
+ avg = (tuple ? Float(tuple.first || 0) : 0)
396
+ stats['performance']['avg_time_per_job'] = hms[avg]
397
+
398
+ list = []
399
+ 0.step(5){|i| list << (2 ** i)}
400
+ list << 24
401
+ list.sort!
402
+
403
+ list = 1, 12, 24
404
+
405
+ list.each do |n|
406
+ ago = now - (n * 3600)
407
+ ago = Util::timestamp ago
408
+ sql = <<-sql
409
+ select count(*) from jobs
410
+ where
411
+ state = 'finished' and
412
+ finished > '#{ ago }'
413
+ sql
414
+ tuples = execute sql
415
+ tuple = tuples.first
416
+ count = (tuple ? Integer(tuple.first || 0) : 0)
417
+ #stats['performance']["n_jobs_in_last_#{ n }_hrs"] = count
418
+ stats['performance']["n_jobs_in_last_hrs"][n] = count
419
+ end
420
+
421
+ #
422
+ # generate exit_status stats
423
+ #
424
+ #stats['exit_status'] = {}
425
+ sql = <<-sql
426
+ select count(*) from jobs
427
+ where
428
+ state='finished' and
429
+ exit_status=0
430
+ sql
431
+ tuples = execute sql
432
+ tuple = tuples.first
433
+ successes = (tuple ? Integer(tuple.first || 0) : 0)
434
+ stats['exit_status']['successes'] = successes
435
+
436
+ sql = <<-sql
437
+ select count(*) from jobs
438
+ where
439
+ (state='finished' and
440
+ exit_status!=0) or
441
+ state='dead'
442
+ sql
443
+ tuples = execute sql
444
+ tuple = tuples.first
445
+ failures = (tuple ? Integer(tuple.first || 0) : 0)
446
+ stats['exit_status']['failures'] = failures
447
+
448
+ exit_code_map.each do |which, codes|
449
+ exit_status_clause = codes.map{|code| "exit_status=#{ code }"}.join(' or ')
450
+ sql = <<-sql
451
+ select count(*) from jobs
452
+ where
453
+ (state='finished' and (#{ exit_status_clause }))
454
+ sql
455
+ tuples = execute sql
456
+ tuple = tuples.first
457
+ n = (tuple ? Integer(tuple.first || 0) : 0)
458
+ stats['exit_status'][which] = n
459
+ end
460
+ end
461
+
462
+ stats
463
+ #--}}}
464
+ end
465
+ def query(where_clause = nil, &block)
466
+ #--{{{
467
+ ret = nil
468
+
469
+ sql =
470
+ if where_clause
471
+
472
+ #
473
+ # turn =~ into like clauses
474
+ #
475
+ #where_clause.gsub!(/(=~\s*([^\s')(=]+))/om){q = $2.gsub(%r/'+|\s+/o,''); "like '%#{ q }%'"}
476
+ #
477
+ # quote everything on the rhs of an '=' sign - helps with shell problems...
478
+ #
479
+ #where_clause.gsub!(/(==?\s*([^\s')(=]+))/om){q = $2.gsub(%r/'+|\s+/o,''); "='#{ q }'"}
480
+
481
+ "select * from jobs where #{ where_clause };"
482
+ else
483
+ "select * from jobs;"
484
+ end
485
+
486
+ if block
487
+ ro_transaction{ execute(sql, &block) }
488
+ else
489
+ ret = ro_transaction{ execute(sql) }
490
+ end
491
+
492
+ ret
493
+ #--}}}
494
+ end
495
+ def delete(*args, &block)
496
+ #--{{{
497
+ whats, optargs = args.partition{|arg| not Hash === arg}
498
+
499
+ opts = {}
500
+ optargs.each{|oa| opts.update oa}
501
+
502
+ force = Util::getopt 'force', opts
503
+
504
+ delete_sql, select_sql = '', ''
505
+
506
+ whats << 'all' if whats.empty?
507
+
508
+ whats.each do |what|
509
+ case "#{ what }"
510
+ when %r/^\s*\d+\s*$/io # number
511
+ delete_sql << "delete from jobs where jid=#{ what } and state!='running';\n"
512
+ select_sql << "select * from jobs where jid=#{ what } and state!='running';\n"
513
+ when %r/^\s*p/io # pending
514
+ delete_sql << "delete from jobs where state='pending';\n"
515
+ select_sql << "select * from jobs where state='pending';\n"
516
+ when %r/^\s*h/io # holding
517
+ delete_sql << "delete from jobs where state='holding';\n"
518
+ select_sql << "select * from jobs where state='holding';\n"
519
+ when %r/^\s*r/io # running
520
+ delete_sql << "delete from jobs where state='running';\n" if force
521
+ select_sql << "select * from jobs where state='running';\n" if force
522
+ when %r/^\s*f/io # finished
523
+ delete_sql << "delete from jobs where state='finished';\n"
524
+ select_sql << "select * from jobs where state='finished';\n"
525
+ when %r/^\s*d/io # dead
526
+ delete_sql << "delete from jobs where state='dead';\n"
527
+ select_sql << "select * from jobs where state='dead';\n"
528
+ when %r/^\s*a/io # all
529
+ delete_sql << "delete from jobs where state!='running';\n"
530
+ select_sql << "select * from jobs where state!='running';\n"
531
+ else
532
+ raise ArgumentError, "cannot delete <#{ what.inspect }>"
533
+ end
534
+ end
535
+
536
+ scrub = lambda do |jid|
537
+ [standard_in_4(jid), standard_out_4(jid), standard_err_4(jid)].each do |path|
538
+ FileUtils::rm_f path
539
+ end
540
+ end
541
+
542
+ tuples = []
543
+
544
+ metablock =
545
+ if block
546
+ lambda do |tuple|
547
+ jid = tuple['jid']
548
+ block[tuple]
549
+ scrub[jid]
550
+ end
551
+ else
552
+ lambda do |tuple|
553
+ jid = tuple['jid']
554
+ scrub[jid]
555
+ tuples << tuple
556
+ end
557
+ end
558
+
559
+ # TODO - make file deletion transactional too
560
+
561
+ transaction do
562
+ execute(select_sql, &metablock)
563
+ execute(delete_sql){}
564
+ end
565
+
566
+ delete_sql = nil
567
+ select_sql = nil
568
+
569
+ block ? nil : tuples
570
+ #--}}}
571
+ end
572
+ def vacuum
573
+ #--{{{
574
+ @qdb.vacuum
575
+ #--}}}
576
+ end
577
+ def update(kvs, *jids, &block)
578
+ #--{{{
579
+ ret = nil
580
+ #
581
+ # yank out stdin - which we allow as a key
582
+ #
583
+ stdin = kvs.delete 'stdin'
584
+ #
585
+ # validate/munge state value iff present
586
+ #
587
+ if((state = kvs['state']))
588
+ case state
589
+ when %r/^p/io
590
+ kvs['state'] = 'pending'
591
+ when %r/^h/io
592
+ kvs['state'] = 'holding'
593
+ else
594
+ raise "update of <state> = <#{ state }> not allowed (try pending or holding)"
595
+ end
596
+ end
597
+ #
598
+ # validate kvs pairs
599
+ #
600
+ allowed = %w( priority command tag runner restartable )
601
+ kvs.each do |key, val|
602
+ raise "update of <#{ key }> = <#{ val }> not allowed" unless
603
+ (allowed.include?(key)) or (key == 'state' and %w( pending holding ).include?(val))
604
+ end
605
+ #
606
+ # ensure there are acutally some jobs to update
607
+ #
608
+ raise "no jobs to update" if jids.empty?
609
+ #
610
+ # generates sql to update jids with kvs and sql to show updated tuples
611
+ #
612
+ build_sql =
613
+ lambda do |kvs, jids|
614
+ if(jids.delete('pending'))
615
+ execute("select jid from jobs where state='pending'") do |tuple|
616
+ jids << tuple['jid']
617
+ end
618
+ end
619
+
620
+ if(jids.delete('holding'))
621
+ execute("select jid from jobs where state='holding'") do |tuple|
622
+ jids << tuple['jid']
623
+ end
624
+ end
625
+
626
+ rollback_transaction "no jobs to update" if jids.empty?
627
+
628
+ update_clause = kvs.map{|k,v| v ? "#{ k }='#{ v }'" : "#{ k }=NULL" }.join(",\n")
629
+ where_clause = jids.map{|jid| "jid=#{ jid }"}.join(" or\n")
630
+ update_sql =
631
+ "update jobs\n" <<
632
+ "set\n#{ update_clause }\n" <<
633
+ "where\n(state='pending' or state='holding') and\n(#{ where_clause })"
634
+ select_sql = "select * from jobs where (state='pending' or state='holding') and\n(#{ where_clause })"
635
+
636
+ if kvs.empty?
637
+ [ nil, select_sql ]
638
+ else
639
+ [ update_sql, select_sql ]
640
+ end
641
+ end
642
+ #
643
+ # setup stdin
644
+ #
645
+ tmp_stdin(stdin) do |ts|
646
+ clobber_stdin = lambda{|job| FileUtils::cp ts.path, standard_in_4(job['jid']) if ts}
647
+
648
+ tuples = []
649
+
650
+ metablock =
651
+ if block
652
+ lambda{|job| clobber_stdin[job]; block[job]}
653
+ else
654
+ lambda{|job| clobber_stdin[job]; tuples << job}
655
+ end
656
+
657
+ transaction do
658
+ update_sql, select_sql = build_sql[kvs, jids]
659
+ break unless select_sql
660
+ execute(update_sql){} if update_sql
661
+ execute(select_sql, &metablock)
662
+ end
663
+
664
+ block ? nil : tuples
665
+ end
666
+ #--}}}
667
+ end
668
+
669
+ def getjob
670
+ #--{{{
671
+ sql = <<-sql
672
+ select * from jobs
673
+ where
674
+ (state='pending' or (state='dead' and (not restartable isnull))) and
675
+ (runner like '%#{ Util::host }%' or runner isnull)
676
+ order by priority desc, submitted asc, jid asc
677
+ limit 1;
678
+ sql
679
+ tuples = execute sql
680
+ job = tuples.first
681
+ job
682
+ #--}}}
683
+ end
684
+ def jobisrunning job
685
+ #--{{{
686
+ sql = <<-sql
687
+ update jobs
688
+ set
689
+ pid='#{ job['pid'] }',
690
+ state='#{ job['state'] }',
691
+ started='#{ job['started'] }',
692
+ runner='#{ job['runner'] }',
693
+ stdout='#{ job['stdout'] }',
694
+ stderr='#{ job['stderr'] }'
695
+ where jid=#{ job['jid'] };
696
+ sql
697
+ execute sql
698
+ #--}}}
699
+ end
700
+ def jobisdone job
701
+ #--{{{
702
+ sql = <<-sql
703
+ update jobs
704
+ set
705
+ state = '#{ job['state'] }',
706
+ exit_status = '#{ job['exit_status'] }',
707
+ finished = '#{ job['finished'] }',
708
+ elapsed = '#{ job['elapsed'] }'
709
+ where jid = #{ job['jid'] };
710
+ sql
711
+ execute sql
712
+ #--}}}
713
+ end
714
+ def getdeadjobs(started, &block)
715
+ #--{{{
716
+ ret = nil
717
+ sql = <<-sql
718
+ select * from jobs
719
+ where
720
+ state = 'running' and
721
+ runner='#{ Util::hostname }' and
722
+ started<='#{ started }'
723
+ sql
724
+ if block
725
+ execute(sql, &block)
726
+ else
727
+ ret = execute(sql)
728
+ end
729
+ ret
730
+ #--}}}
731
+ end
732
+ def jobisdead job
733
+ #--{{{
734
+ jid = job['jid']
735
+ if jid
736
+ sql = "update jobs set state='dead' where jid='#{ jid }'"
737
+ execute(sql){}
738
+ end
739
+ job
740
+ #--}}}
741
+ end
742
+
743
+ def transaction(*args)
744
+ #--{{{
745
+ raise "cannot upgrade ro_transaction" if @in_ro_transaction
746
+ ret = nil
747
+ if @in_transaction
748
+ ret = yield
749
+ else
750
+ begin
751
+ @in_transaction = true
752
+ @qdb.transaction(*args){ ret = yield }
753
+ ensure
754
+ @in_transaction = false
755
+ end
756
+ end
757
+ ret
758
+ #--}}}
759
+ end
760
+ def ro_transaction(*args)
761
+ #--{{{
762
+ ret = nil
763
+ if @in_ro_transaction || @in_transaction
764
+ ret = yield
765
+ else
766
+ begin
767
+ @in_ro_transaction = true
768
+ @qdb.ro_transaction(*args){ ret = yield }
769
+ ensure
770
+ @in_ro_transaction = false
771
+ end
772
+ end
773
+ ret
774
+ #--}}}
775
+ end
776
+ def execute(*args, &block)
777
+ #--{{{
778
+ @qdb.execute(*args, &block)
779
+ #--}}}
780
+ end
781
+ def integrity_check(*args, &block)
782
+ #--{{{
783
+ @qdb.integrity_check(*args, &block)
784
+ #--}}}
785
+ end
786
+ def recover!(*args, &block)
787
+ #--{{{
788
+ @qdb.recover!(*args, &block)
789
+ #--}}}
790
+ end
791
+ def lock(*args, &block)
792
+ #--{{{
793
+ @qdb.lock(*args, &block)
794
+ #--}}}
795
+ end
796
+ def abort_transaction(*a,&b)
797
+ #--{{{
798
+ @qdb.abort_transaction(*a,&b)
799
+ #--}}}
800
+ end
801
+ def rollback_transaction(*a,&b)
802
+ #--{{{
803
+ @qdb.rollback_transaction(*a,&b)
804
+ #--}}}
805
+ end
806
+
807
+ def snapshot qtmp = "#{ @basename }.snapshot", retries = nil
808
+ #--{{{
809
+ qtmp ||= "#{ @basename }.snapshot"
810
+ debug{ "snapshot <#{ @path }> -> <#{ qtmp }>" }
811
+ retries = Integer(retries || 16)
812
+ debug{ "retries <#{ retries }>" }
813
+
814
+ qss = nil
815
+ loopno = 0
816
+
817
+ take_snapshot = lambda do
818
+ FileUtils::rm_rf qtmp
819
+ FileUtils::mkdir_p qtmp
820
+ %w(db db.schema lock).each do |base|
821
+ src, dest = File::join(@path, base), File::join(qtmp, base)
822
+ debug{ "cp <#{ src }> -> <#{ dest }>" }
823
+ FileUtils::cp(src, dest)
824
+ end
825
+ ss = klass::new qtmp, @opts
826
+ if ss.integrity_check
827
+ ss
828
+ else
829
+ begin; recover! unless integrity_check; rescue; nil; end
830
+ ss.recover!
831
+ end
832
+ end
833
+
834
+ loop do
835
+ break if loopno >= retries
836
+ if((ss = take_snapshot.call))
837
+ debug{ "snapshot <#{ qtmp }> created" }
838
+ qss = ss
839
+ break
840
+ else
841
+ debug{ "failure <#{ loopno + 1}> of <#{ retries }> attempts to create snapshot <#{ qtmp }> - retrying..." }
842
+ end
843
+ loopno += 1
844
+ end
845
+
846
+ unless qss
847
+ debug{ "locking <#{ @path }> as last resort" }
848
+ @qdb.write_lock do
849
+ if((ss = take_snapshot.call))
850
+ debug{ "snapshot <#{ qtmp }> created" }
851
+ qss = ss
852
+ else
853
+ raise "failed <#{ loopno }> times to create snapshot <#{ qtmp }>"
854
+ end
855
+ end
856
+ end
857
+
858
+ qss
859
+ #--}}}
860
+ end
861
+
862
+ # TODO - use mtime to optimize checks by feeder??
863
+ def mtime
864
+ #--{{{
865
+ File::stat(@path).mtime
866
+ #--}}}
867
+ end
868
+ def []= key, value
869
+ #--{{{
870
+ sql = "select count(*) from attributes where key='#{ key }';"
871
+ tuples = @qdb.execute sql
872
+ tuple = tuples.first
873
+ count = Integer tuple['count(*)']
874
+ case count
875
+ when 0
876
+ sql = "insert into attributes values('#{ key }','#{ value }');"
877
+ @qdb.execute sql
878
+ when 1
879
+ sql = "update attributes set key='#{ key }', value='#{ value }' where key='#{ key }';"
880
+ @qdb.execute sql
881
+ else
882
+ raise "key <#{ key }> has become corrupt!"
883
+ end
884
+ #--}}}
885
+ end
886
+ def attributes
887
+ #--{{{
888
+ h = {}
889
+ tuples = @qdb.execute "select * from attributes;"
890
+ tuples.map!{|t| h[t['key']] = t['value']}
891
+ h
892
+ #--}}}
893
+ end
894
+ #--}}}
895
+ end # class JobQueue
896
+ #--}}}
897
+ end # module RQ
898
+ $__rq_jobqueue__ = __FILE__
899
+ end