Dnsruby 0.5.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 (419) hide show
  1. data/README +34 -0
  2. data/doc/classes/Dnsruby/Classes.html +197 -0
  3. data/doc/classes/Dnsruby/Classes.src/M000157.html +23 -0
  4. data/doc/classes/Dnsruby/Classes.src/M000158.html +19 -0
  5. data/doc/classes/Dnsruby/CodeMapper.html +370 -0
  6. data/doc/classes/Dnsruby/CodeMapper.src/M000130.html +18 -0
  7. data/doc/classes/Dnsruby/CodeMapper.src/M000131.html +33 -0
  8. data/doc/classes/Dnsruby/CodeMapper.src/M000132.html +21 -0
  9. data/doc/classes/Dnsruby/CodeMapper.src/M000133.html +19 -0
  10. data/doc/classes/Dnsruby/CodeMapper.src/M000134.html +19 -0
  11. data/doc/classes/Dnsruby/CodeMapper.src/M000135.html +18 -0
  12. data/doc/classes/Dnsruby/CodeMapper.src/M000136.html +22 -0
  13. data/doc/classes/Dnsruby/CodeMapper.src/M000137.html +22 -0
  14. data/doc/classes/Dnsruby/CodeMapper.src/M000138.html +22 -0
  15. data/doc/classes/Dnsruby/CodeMapper.src/M000139.html +31 -0
  16. data/doc/classes/Dnsruby/CodeMapper.src/M000140.html +19 -0
  17. data/doc/classes/Dnsruby/Config.html +410 -0
  18. data/doc/classes/Dnsruby/Config.src/M000098.html +18 -0
  19. data/doc/classes/Dnsruby/Config.src/M000099.html +19 -0
  20. data/doc/classes/Dnsruby/Config.src/M000100.html +19 -0
  21. data/doc/classes/Dnsruby/Config.src/M000101.html +21 -0
  22. data/doc/classes/Dnsruby/Config.src/M000102.html +21 -0
  23. data/doc/classes/Dnsruby/Config.src/M000103.html +38 -0
  24. data/doc/classes/Dnsruby/Config.src/M000104.html +26 -0
  25. data/doc/classes/Dnsruby/Config.src/M000105.html +22 -0
  26. data/doc/classes/Dnsruby/Config.src/M000106.html +23 -0
  27. data/doc/classes/Dnsruby/Config.src/M000107.html +22 -0
  28. data/doc/classes/Dnsruby/Config.src/M000108.html +18 -0
  29. data/doc/classes/Dnsruby/DNS/DecodeError.html +111 -0
  30. data/doc/classes/Dnsruby/DNS/EncodeError.html +111 -0
  31. data/doc/classes/Dnsruby/DNS.html +469 -0
  32. data/doc/classes/Dnsruby/DNS.src/M000196.html +24 -0
  33. data/doc/classes/Dnsruby/DNS.src/M000197.html +18 -0
  34. data/doc/classes/Dnsruby/DNS.src/M000198.html +18 -0
  35. data/doc/classes/Dnsruby/DNS.src/M000199.html +20 -0
  36. data/doc/classes/Dnsruby/DNS.src/M000200.html +19 -0
  37. data/doc/classes/Dnsruby/DNS.src/M000201.html +20 -0
  38. data/doc/classes/Dnsruby/DNS.src/M000202.html +18 -0
  39. data/doc/classes/Dnsruby/DNS.src/M000203.html +19 -0
  40. data/doc/classes/Dnsruby/DNS.src/M000204.html +20 -0
  41. data/doc/classes/Dnsruby/DNS.src/M000205.html +28 -0
  42. data/doc/classes/Dnsruby/DNS.src/M000206.html +19 -0
  43. data/doc/classes/Dnsruby/DNS.src/M000207.html +20 -0
  44. data/doc/classes/Dnsruby/DNS.src/M000208.html +41 -0
  45. data/doc/classes/Dnsruby/DNS.src/M000209.html +32 -0
  46. data/doc/classes/Dnsruby/DNS.src/M000210.html +50 -0
  47. data/doc/classes/Dnsruby/DNSSEC/Algorithms.html +154 -0
  48. data/doc/classes/Dnsruby/DNSSEC.html +111 -0
  49. data/doc/classes/Dnsruby/DecodeError.html +111 -0
  50. data/doc/classes/Dnsruby/EncodeError.html +111 -0
  51. data/doc/classes/Dnsruby/FormErr.html +113 -0
  52. data/doc/classes/Dnsruby/Header.html +516 -0
  53. data/doc/classes/Dnsruby/Header.src/M000168.html +35 -0
  54. data/doc/classes/Dnsruby/Header.src/M000169.html +18 -0
  55. data/doc/classes/Dnsruby/Header.src/M000170.html +18 -0
  56. data/doc/classes/Dnsruby/Header.src/M000171.html +21 -0
  57. data/doc/classes/Dnsruby/Header.src/M000172.html +20 -0
  58. data/doc/classes/Dnsruby/Header.src/M000173.html +32 -0
  59. data/doc/classes/Dnsruby/Header.src/M000174.html +26 -0
  60. data/doc/classes/Dnsruby/Header.src/M000175.html +47 -0
  61. data/doc/classes/Dnsruby/Header.src/M000176.html +28 -0
  62. data/doc/classes/Dnsruby/Header.src/M000177.html +18 -0
  63. data/doc/classes/Dnsruby/Header.src/M000178.html +18 -0
  64. data/doc/classes/Dnsruby/Header.src/M000179.html +30 -0
  65. data/doc/classes/Dnsruby/Hosts.html +305 -0
  66. data/doc/classes/Dnsruby/Hosts.src/M000141.html +20 -0
  67. data/doc/classes/Dnsruby/Hosts.src/M000142.html +49 -0
  68. data/doc/classes/Dnsruby/Hosts.src/M000143.html +19 -0
  69. data/doc/classes/Dnsruby/Hosts.src/M000144.html +20 -0
  70. data/doc/classes/Dnsruby/Hosts.src/M000145.html +21 -0
  71. data/doc/classes/Dnsruby/Hosts.src/M000146.html +19 -0
  72. data/doc/classes/Dnsruby/Hosts.src/M000147.html +20 -0
  73. data/doc/classes/Dnsruby/Hosts.src/M000148.html +21 -0
  74. data/doc/classes/Dnsruby/IPv4.html +298 -0
  75. data/doc/classes/Dnsruby/IPv4.src/M000149.html +32 -0
  76. data/doc/classes/Dnsruby/IPv4.src/M000150.html +21 -0
  77. data/doc/classes/Dnsruby/IPv4.src/M000151.html +18 -0
  78. data/doc/classes/Dnsruby/IPv4.src/M000152.html +18 -0
  79. data/doc/classes/Dnsruby/IPv4.src/M000153.html +19 -0
  80. data/doc/classes/Dnsruby/IPv4.src/M000154.html +18 -0
  81. data/doc/classes/Dnsruby/IPv4.src/M000155.html +18 -0
  82. data/doc/classes/Dnsruby/IPv4.src/M000156.html +18 -0
  83. data/doc/classes/Dnsruby/IPv6.html +318 -0
  84. data/doc/classes/Dnsruby/IPv6.src/M000180.html +60 -0
  85. data/doc/classes/Dnsruby/IPv6.src/M000181.html +21 -0
  86. data/doc/classes/Dnsruby/IPv6.src/M000182.html +22 -0
  87. data/doc/classes/Dnsruby/IPv6.src/M000183.html +18 -0
  88. data/doc/classes/Dnsruby/IPv6.src/M000184.html +21 -0
  89. data/doc/classes/Dnsruby/IPv6.src/M000185.html +18 -0
  90. data/doc/classes/Dnsruby/IPv6.src/M000186.html +18 -0
  91. data/doc/classes/Dnsruby/IPv6.src/M000187.html +18 -0
  92. data/doc/classes/Dnsruby/Message.html +689 -0
  93. data/doc/classes/Dnsruby/Message.src/M000076.html +34 -0
  94. data/doc/classes/Dnsruby/Message.src/M000077.html +26 -0
  95. data/doc/classes/Dnsruby/Message.src/M000078.html +22 -0
  96. data/doc/classes/Dnsruby/Message.src/M000079.html +20 -0
  97. data/doc/classes/Dnsruby/Message.src/M000080.html +20 -0
  98. data/doc/classes/Dnsruby/Message.src/M000081.html +20 -0
  99. data/doc/classes/Dnsruby/Message.src/M000082.html +20 -0
  100. data/doc/classes/Dnsruby/Message.src/M000083.html +20 -0
  101. data/doc/classes/Dnsruby/Message.src/M000084.html +21 -0
  102. data/doc/classes/Dnsruby/Message.src/M000085.html +20 -0
  103. data/doc/classes/Dnsruby/Message.src/M000086.html +18 -0
  104. data/doc/classes/Dnsruby/Message.src/M000087.html +54 -0
  105. data/doc/classes/Dnsruby/Message.src/M000088.html +42 -0
  106. data/doc/classes/Dnsruby/Message.src/M000089.html +45 -0
  107. data/doc/classes/Dnsruby/MetaTypes.html +136 -0
  108. data/doc/classes/Dnsruby/Modes.html +171 -0
  109. data/doc/classes/Dnsruby/NXDomain.html +113 -0
  110. data/doc/classes/Dnsruby/Name/Label.html +300 -0
  111. data/doc/classes/Dnsruby/Name/Label.src/M000067.html +21 -0
  112. data/doc/classes/Dnsruby/Name/Label.src/M000068.html +18 -0
  113. data/doc/classes/Dnsruby/Name/Label.src/M000069.html +22 -0
  114. data/doc/classes/Dnsruby/Name/Label.src/M000070.html +18 -0
  115. data/doc/classes/Dnsruby/Name/Label.src/M000071.html +18 -0
  116. data/doc/classes/Dnsruby/Name/Label.src/M000072.html +18 -0
  117. data/doc/classes/Dnsruby/Name/Label.src/M000073.html +18 -0
  118. data/doc/classes/Dnsruby/Name/Label.src/M000074.html +18 -0
  119. data/doc/classes/Dnsruby/Name/Label.src/M000075.html +18 -0
  120. data/doc/classes/Dnsruby/Name.html +357 -0
  121. data/doc/classes/Dnsruby/Name.src/M000057.html +28 -0
  122. data/doc/classes/Dnsruby/Name.src/M000058.html +20 -0
  123. data/doc/classes/Dnsruby/Name.src/M000059.html +18 -0
  124. data/doc/classes/Dnsruby/Name.src/M000060.html +18 -0
  125. data/doc/classes/Dnsruby/Name.src/M000061.html +21 -0
  126. data/doc/classes/Dnsruby/Name.src/M000062.html +19 -0
  127. data/doc/classes/Dnsruby/Name.src/M000064.html +22 -0
  128. data/doc/classes/Dnsruby/Name.src/M000065.html +18 -0
  129. data/doc/classes/Dnsruby/Name.src/M000066.html +20 -0
  130. data/doc/classes/Dnsruby/NotImp.html +113 -0
  131. data/doc/classes/Dnsruby/OpCode.html +146 -0
  132. data/doc/classes/Dnsruby/OtherResolvError.html +113 -0
  133. data/doc/classes/Dnsruby/QTypes.html +146 -0
  134. data/doc/classes/Dnsruby/Question.html +256 -0
  135. data/doc/classes/Dnsruby/Question.src/M000166.html +47 -0
  136. data/doc/classes/Dnsruby/Question.src/M000167.html +18 -0
  137. data/doc/classes/Dnsruby/RCode.html +211 -0
  138. data/doc/classes/Dnsruby/RR/ANY.html +133 -0
  139. data/doc/classes/Dnsruby/RR/CERT/CertificateTypes.html +169 -0
  140. data/doc/classes/Dnsruby/RR/CERT.html +180 -0
  141. data/doc/classes/Dnsruby/RR/CNAME.html +150 -0
  142. data/doc/classes/Dnsruby/RR/DNAME.html +150 -0
  143. data/doc/classes/Dnsruby/RR/DomainName.html +175 -0
  144. data/doc/classes/Dnsruby/RR/DomainName.src/M000051.html +22 -0
  145. data/doc/classes/Dnsruby/RR/Generic.html +156 -0
  146. data/doc/classes/Dnsruby/RR/Generic.src/M000041.html +25 -0
  147. data/doc/classes/Dnsruby/RR/HINFO.html +155 -0
  148. data/doc/classes/Dnsruby/RR/IN/A.html +199 -0
  149. data/doc/classes/Dnsruby/RR/IN/A.src/M000018.html +18 -0
  150. data/doc/classes/Dnsruby/RR/IN/A.src/M000019.html +18 -0
  151. data/doc/classes/Dnsruby/RR/IN/A.src/M000020.html +18 -0
  152. data/doc/classes/Dnsruby/RR/IN/AAAA.html +138 -0
  153. data/doc/classes/Dnsruby/RR/IN/AFSDB.html +145 -0
  154. data/doc/classes/Dnsruby/RR/IN/PX.html +143 -0
  155. data/doc/classes/Dnsruby/RR/IN/SRV.html +243 -0
  156. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000015.html +29 -0
  157. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000016.html +26 -0
  158. data/doc/classes/Dnsruby/RR/IN/SRV.src/M000017.html +22 -0
  159. data/doc/classes/Dnsruby/RR/IN/WKS.html +166 -0
  160. data/doc/classes/Dnsruby/RR/IN/WKS.src/M000021.html +20 -0
  161. data/doc/classes/Dnsruby/RR/IN.html +155 -0
  162. data/doc/classes/Dnsruby/RR/ISDN.html +155 -0
  163. data/doc/classes/Dnsruby/RR/LOC.html +395 -0
  164. data/doc/classes/Dnsruby/RR/LOC.src/M000025.html +32 -0
  165. data/doc/classes/Dnsruby/RR/LOC.src/M000026.html +23 -0
  166. data/doc/classes/Dnsruby/RR/LOC.src/M000027.html +25 -0
  167. data/doc/classes/Dnsruby/RR/LOC.src/M000028.html +21 -0
  168. data/doc/classes/Dnsruby/RR/LOC.src/M000029.html +20 -0
  169. data/doc/classes/Dnsruby/RR/LOC.src/M000030.html +23 -0
  170. data/doc/classes/Dnsruby/RR/MB.html +150 -0
  171. data/doc/classes/Dnsruby/RR/MG.html +150 -0
  172. data/doc/classes/Dnsruby/RR/MINFO.html +156 -0
  173. data/doc/classes/Dnsruby/RR/MR.html +150 -0
  174. data/doc/classes/Dnsruby/RR/MX.html +155 -0
  175. data/doc/classes/Dnsruby/RR/NAPTR.html +190 -0
  176. data/doc/classes/Dnsruby/RR/NS.html +150 -0
  177. data/doc/classes/Dnsruby/RR/NSAP.html +293 -0
  178. data/doc/classes/Dnsruby/RR/NSAP.src/M000053.html +19 -0
  179. data/doc/classes/Dnsruby/RR/NSAP.src/M000054.html +19 -0
  180. data/doc/classes/Dnsruby/RR/NSAP.src/M000055.html +22 -0
  181. data/doc/classes/Dnsruby/RR/NSAP.src/M000056.html +31 -0
  182. data/doc/classes/Dnsruby/RR/PTR.html +132 -0
  183. data/doc/classes/Dnsruby/RR/RP.html +183 -0
  184. data/doc/classes/Dnsruby/RR/RP.src/M000050.html +19 -0
  185. data/doc/classes/Dnsruby/RR/RT.html +155 -0
  186. data/doc/classes/Dnsruby/RR/SOA.html +230 -0
  187. data/doc/classes/Dnsruby/RR/SOA.src/M000039.html +24 -0
  188. data/doc/classes/Dnsruby/RR/SOA.src/M000040.html +27 -0
  189. data/doc/classes/Dnsruby/RR/SPF.html +138 -0
  190. data/doc/classes/Dnsruby/RR/TKEY.html +285 -0
  191. data/doc/classes/Dnsruby/RR/TKEY.src/M000022.html +19 -0
  192. data/doc/classes/Dnsruby/RR/TKEY.src/M000023.html +29 -0
  193. data/doc/classes/Dnsruby/RR/TKEY.src/M000024.html +30 -0
  194. data/doc/classes/Dnsruby/RR/TSIG.html +416 -0
  195. data/doc/classes/Dnsruby/RR/TSIG.src/M000042.html +22 -0
  196. data/doc/classes/Dnsruby/RR/TSIG.src/M000043.html +71 -0
  197. data/doc/classes/Dnsruby/RR/TSIG.src/M000044.html +34 -0
  198. data/doc/classes/Dnsruby/RR/TSIG.src/M000045.html +37 -0
  199. data/doc/classes/Dnsruby/RR/TSIG.src/M000046.html +31 -0
  200. data/doc/classes/Dnsruby/RR/TSIG.src/M000047.html +34 -0
  201. data/doc/classes/Dnsruby/RR/TSIG.src/M000048.html +22 -0
  202. data/doc/classes/Dnsruby/RR/TSIG.src/M000049.html +29 -0
  203. data/doc/classes/Dnsruby/RR/TXT.html +233 -0
  204. data/doc/classes/Dnsruby/RR/TXT.src/M000034.html +18 -0
  205. data/doc/classes/Dnsruby/RR/TXT.src/M000035.html +18 -0
  206. data/doc/classes/Dnsruby/RR/TXT.src/M000036.html +20 -0
  207. data/doc/classes/Dnsruby/RR/TXT.src/M000037.html +27 -0
  208. data/doc/classes/Dnsruby/RR/TXT.src/M000038.html +25 -0
  209. data/doc/classes/Dnsruby/RR/X25.html +203 -0
  210. data/doc/classes/Dnsruby/RR/X25.src/M000031.html +18 -0
  211. data/doc/classes/Dnsruby/RR/X25.src/M000032.html +18 -0
  212. data/doc/classes/Dnsruby/RR/X25.src/M000033.html +22 -0
  213. data/doc/classes/Dnsruby/RR.html +620 -0
  214. data/doc/classes/Dnsruby/RR.src/M000001.html +18 -0
  215. data/doc/classes/Dnsruby/RR.src/M000002.html +22 -0
  216. data/doc/classes/Dnsruby/RR.src/M000003.html +18 -0
  217. data/doc/classes/Dnsruby/RR.src/M000004.html +18 -0
  218. data/doc/classes/Dnsruby/RR.src/M000005.html +18 -0
  219. data/doc/classes/Dnsruby/RR.src/M000006.html +36 -0
  220. data/doc/classes/Dnsruby/RR.src/M000007.html +100 -0
  221. data/doc/classes/Dnsruby/RR.src/M000008.html +18 -0
  222. data/doc/classes/Dnsruby/RR.src/M000009.html +18 -0
  223. data/doc/classes/Dnsruby/RR.src/M000010.html +22 -0
  224. data/doc/classes/Dnsruby/RR.src/M000011.html +22 -0
  225. data/doc/classes/Dnsruby/RR.src/M000012.html +18 -0
  226. data/doc/classes/Dnsruby/RR.src/M000013.html +22 -0
  227. data/doc/classes/Dnsruby/RR.src/M000014.html +24 -0
  228. data/doc/classes/Dnsruby/RRSet.html +257 -0
  229. data/doc/classes/Dnsruby/RRSet.src/M000159.html +18 -0
  230. data/doc/classes/Dnsruby/RRSet.src/M000160.html +44 -0
  231. data/doc/classes/Dnsruby/RRSet.src/M000161.html +18 -0
  232. data/doc/classes/Dnsruby/RRSet.src/M000162.html +20 -0
  233. data/doc/classes/Dnsruby/RRSet.src/M000163.html +18 -0
  234. data/doc/classes/Dnsruby/RRSet.src/M000164.html +18 -0
  235. data/doc/classes/Dnsruby/RRSet.src/M000165.html +18 -0
  236. data/doc/classes/Dnsruby/Refused.html +113 -0
  237. data/doc/classes/Dnsruby/Resolv.html +400 -0
  238. data/doc/classes/Dnsruby/Resolv.src/M000109.html +18 -0
  239. data/doc/classes/Dnsruby/Resolv.src/M000110.html +18 -0
  240. data/doc/classes/Dnsruby/Resolv.src/M000111.html +18 -0
  241. data/doc/classes/Dnsruby/Resolv.src/M000112.html +18 -0
  242. data/doc/classes/Dnsruby/Resolv.src/M000113.html +18 -0
  243. data/doc/classes/Dnsruby/Resolv.src/M000114.html +18 -0
  244. data/doc/classes/Dnsruby/Resolv.src/M000115.html +18 -0
  245. data/doc/classes/Dnsruby/Resolv.src/M000116.html +19 -0
  246. data/doc/classes/Dnsruby/Resolv.src/M000117.html +20 -0
  247. data/doc/classes/Dnsruby/Resolv.src/M000118.html +29 -0
  248. data/doc/classes/Dnsruby/Resolv.src/M000119.html +19 -0
  249. data/doc/classes/Dnsruby/Resolv.src/M000120.html +20 -0
  250. data/doc/classes/Dnsruby/Resolv.src/M000121.html +25 -0
  251. data/doc/classes/Dnsruby/ResolvError.html +111 -0
  252. data/doc/classes/Dnsruby/ResolvTimeout.html +111 -0
  253. data/doc/classes/Dnsruby/Resolver.html +807 -0
  254. data/doc/classes/Dnsruby/Resolver.src/M000211.html +21 -0
  255. data/doc/classes/Dnsruby/Resolver.src/M000212.html +37 -0
  256. data/doc/classes/Dnsruby/Resolver.src/M000213.html +64 -0
  257. data/doc/classes/Dnsruby/Resolver.src/M000214.html +23 -0
  258. data/doc/classes/Dnsruby/Resolver.src/M000215.html +46 -0
  259. data/doc/classes/Dnsruby/Resolver.src/M000216.html +21 -0
  260. data/doc/classes/Dnsruby/Resolver.src/M000217.html +22 -0
  261. data/doc/classes/Dnsruby/Resolver.src/M000218.html +18 -0
  262. data/doc/classes/Dnsruby/Resolver.src/M000219.html +20 -0
  263. data/doc/classes/Dnsruby/Resolver.src/M000220.html +19 -0
  264. data/doc/classes/Dnsruby/Resolver.src/M000221.html +19 -0
  265. data/doc/classes/Dnsruby/Resolver.src/M000222.html +19 -0
  266. data/doc/classes/Dnsruby/Resolver.src/M000223.html +19 -0
  267. data/doc/classes/Dnsruby/Resolver.src/M000224.html +19 -0
  268. data/doc/classes/Dnsruby/Resolver.src/M000225.html +19 -0
  269. data/doc/classes/Dnsruby/Resolver.src/M000226.html +19 -0
  270. data/doc/classes/Dnsruby/Resolver.src/M000227.html +19 -0
  271. data/doc/classes/Dnsruby/Resolver.src/M000228.html +19 -0
  272. data/doc/classes/Dnsruby/Resolver.src/M000229.html +19 -0
  273. data/doc/classes/Dnsruby/Resolver.src/M000230.html +19 -0
  274. data/doc/classes/Dnsruby/ServFail.html +113 -0
  275. data/doc/classes/Dnsruby/SingleResolver.html +496 -0
  276. data/doc/classes/Dnsruby/SingleResolver.src/M000122.html +18 -0
  277. data/doc/classes/Dnsruby/SingleResolver.src/M000123.html +19 -0
  278. data/doc/classes/Dnsruby/SingleResolver.src/M000124.html +49 -0
  279. data/doc/classes/Dnsruby/SingleResolver.src/M000125.html +18 -0
  280. data/doc/classes/Dnsruby/SingleResolver.src/M000126.html +21 -0
  281. data/doc/classes/Dnsruby/SingleResolver.src/M000127.html +25 -0
  282. data/doc/classes/Dnsruby/SingleResolver.src/M000128.html +78 -0
  283. data/doc/classes/Dnsruby/SingleResolver.src/M000129.html +21 -0
  284. data/doc/classes/Dnsruby/TheLog.html +196 -0
  285. data/doc/classes/Dnsruby/TheLog.src/M000188.html +20 -0
  286. data/doc/classes/Dnsruby/TheLog.src/M000189.html +20 -0
  287. data/doc/classes/Dnsruby/TheLog.src/M000190.html +20 -0
  288. data/doc/classes/Dnsruby/Types.html +426 -0
  289. data/doc/classes/Dnsruby/Update.html +368 -0
  290. data/doc/classes/Dnsruby/Update.src/M000191.html +32 -0
  291. data/doc/classes/Dnsruby/Update.src/M000192.html +37 -0
  292. data/doc/classes/Dnsruby/Update.src/M000193.html +32 -0
  293. data/doc/classes/Dnsruby/Update.src/M000194.html +41 -0
  294. data/doc/classes/Dnsruby/Update.src/M000195.html +34 -0
  295. data/doc/classes/Dnsruby/ZoneTransfer/Delta.html +183 -0
  296. data/doc/classes/Dnsruby/ZoneTransfer/Delta.src/M000097.html +19 -0
  297. data/doc/classes/Dnsruby/ZoneTransfer.html +248 -0
  298. data/doc/classes/Dnsruby/ZoneTransfer.src/M000095.html +22 -0
  299. data/doc/classes/Dnsruby/ZoneTransfer.src/M000096.html +35 -0
  300. data/doc/classes/Dnsruby.html +388 -0
  301. data/doc/created.rid +1 -0
  302. data/doc/files/lib/Dnsruby/Config_rb.html +101 -0
  303. data/doc/files/lib/Dnsruby/DNSSEC_rb.html +101 -0
  304. data/doc/files/lib/Dnsruby/DNS_rb.html +110 -0
  305. data/doc/files/lib/Dnsruby/Hosts_rb.html +108 -0
  306. data/doc/files/lib/Dnsruby/Resolver_rb.html +108 -0
  307. data/doc/files/lib/Dnsruby/SingleResolver_rb.html +108 -0
  308. data/doc/files/lib/Dnsruby/TheLog_rb.html +110 -0
  309. data/doc/files/lib/Dnsruby/code_mapper_rb.html +101 -0
  310. data/doc/files/lib/Dnsruby/ipv4_rb.html +101 -0
  311. data/doc/files/lib/Dnsruby/ipv6_rb.html +101 -0
  312. data/doc/files/lib/Dnsruby/message_rb.html +109 -0
  313. data/doc/files/lib/Dnsruby/name_rb.html +101 -0
  314. data/doc/files/lib/Dnsruby/resource/AAAA_rb.html +101 -0
  315. data/doc/files/lib/Dnsruby/resource/AFSDB_rb.html +101 -0
  316. data/doc/files/lib/Dnsruby/resource/A_rb.html +101 -0
  317. data/doc/files/lib/Dnsruby/resource/CERT_rb.html +101 -0
  318. data/doc/files/lib/Dnsruby/resource/HINFO_rb.html +101 -0
  319. data/doc/files/lib/Dnsruby/resource/IN_rb.html +112 -0
  320. data/doc/files/lib/Dnsruby/resource/ISDN_rb.html +101 -0
  321. data/doc/files/lib/Dnsruby/resource/LOC_rb.html +101 -0
  322. data/doc/files/lib/Dnsruby/resource/MINFO_rb.html +101 -0
  323. data/doc/files/lib/Dnsruby/resource/MX_rb.html +101 -0
  324. data/doc/files/lib/Dnsruby/resource/NAPTR_rb.html +101 -0
  325. data/doc/files/lib/Dnsruby/resource/NSAP_rb.html +101 -0
  326. data/doc/files/lib/Dnsruby/resource/OPT_rb.html +101 -0
  327. data/doc/files/lib/Dnsruby/resource/PX_rb.html +101 -0
  328. data/doc/files/lib/Dnsruby/resource/RP_rb.html +101 -0
  329. data/doc/files/lib/Dnsruby/resource/RT_rb.html +101 -0
  330. data/doc/files/lib/Dnsruby/resource/SOA_rb.html +101 -0
  331. data/doc/files/lib/Dnsruby/resource/SPF_rb.html +101 -0
  332. data/doc/files/lib/Dnsruby/resource/SRV_rb.html +101 -0
  333. data/doc/files/lib/Dnsruby/resource/TKEY_rb.html +101 -0
  334. data/doc/files/lib/Dnsruby/resource/TSIG_rb.html +110 -0
  335. data/doc/files/lib/Dnsruby/resource/TXT_rb.html +108 -0
  336. data/doc/files/lib/Dnsruby/resource/X25_rb.html +101 -0
  337. data/doc/files/lib/Dnsruby/resource/domain_name_rb.html +101 -0
  338. data/doc/files/lib/Dnsruby/resource/generic_rb.html +125 -0
  339. data/doc/files/lib/Dnsruby/resource/resource_rb.html +110 -0
  340. data/doc/files/lib/Dnsruby/select_thread_rb.html +111 -0
  341. data/doc/files/lib/Dnsruby/update_rb.html +101 -0
  342. data/doc/files/lib/Dnsruby/zone_transfer_rb.html +101 -0
  343. data/doc/files/lib/dnsruby_rb.html +118 -0
  344. data/doc/fr_class_index.html +102 -0
  345. data/doc/fr_file_index.html +68 -0
  346. data/doc/fr_method_index.html +256 -0
  347. data/doc/index.html +24 -0
  348. data/lib/Dnsruby/Config.rb +350 -0
  349. data/lib/Dnsruby/DNS.rb +253 -0
  350. data/lib/Dnsruby/DNSSEC.rb +29 -0
  351. data/lib/Dnsruby/Hosts.rb +119 -0
  352. data/lib/Dnsruby/Resolver.rb +618 -0
  353. data/lib/Dnsruby/SingleResolver.rb +312 -0
  354. data/lib/Dnsruby/TheLog.rb +61 -0
  355. data/lib/Dnsruby/code_mapper.rb +164 -0
  356. data/lib/Dnsruby/ipv4.rb +83 -0
  357. data/lib/Dnsruby/ipv6.rb +142 -0
  358. data/lib/Dnsruby/message.rb +819 -0
  359. data/lib/Dnsruby/name.rb +325 -0
  360. data/lib/Dnsruby/resource/A.rb +56 -0
  361. data/lib/Dnsruby/resource/AAAA.rb +54 -0
  362. data/lib/Dnsruby/resource/AFSDB.rb +68 -0
  363. data/lib/Dnsruby/resource/CERT.rb +89 -0
  364. data/lib/Dnsruby/resource/HINFO.rb +52 -0
  365. data/lib/Dnsruby/resource/IN.rb +69 -0
  366. data/lib/Dnsruby/resource/ISDN.rb +54 -0
  367. data/lib/Dnsruby/resource/LOC.rb +255 -0
  368. data/lib/Dnsruby/resource/MINFO.rb +66 -0
  369. data/lib/Dnsruby/resource/MX.rb +66 -0
  370. data/lib/Dnsruby/resource/NAPTR.rb +90 -0
  371. data/lib/Dnsruby/resource/NSAP.rb +172 -0
  372. data/lib/Dnsruby/resource/OPT.rb +153 -0
  373. data/lib/Dnsruby/resource/PX.rb +71 -0
  374. data/lib/Dnsruby/resource/RP.rb +67 -0
  375. data/lib/Dnsruby/resource/RT.rb +67 -0
  376. data/lib/Dnsruby/resource/SOA.rb +89 -0
  377. data/lib/Dnsruby/resource/SPF.rb +29 -0
  378. data/lib/Dnsruby/resource/SRV.rb +108 -0
  379. data/lib/Dnsruby/resource/TKEY.rb +160 -0
  380. data/lib/Dnsruby/resource/TSIG.rb +328 -0
  381. data/lib/Dnsruby/resource/TXT.rb +76 -0
  382. data/lib/Dnsruby/resource/X25.rb +53 -0
  383. data/lib/Dnsruby/resource/domain_name.rb +58 -0
  384. data/lib/Dnsruby/resource/generic.rb +142 -0
  385. data/lib/Dnsruby/resource/resource.rb +444 -0
  386. data/lib/Dnsruby/select_thread.rb +474 -0
  387. data/lib/Dnsruby/update.rb +263 -0
  388. data/lib/Dnsruby/zone_transfer.rb +296 -0
  389. data/lib/dnsruby.rb +468 -0
  390. data/test/custom.txt +4 -0
  391. data/test/resolv.conf +4 -0
  392. data/test/tc_axfr.rb +42 -0
  393. data/test/tc_dns.rb +231 -0
  394. data/test/tc_dnsruby.rb +42 -0
  395. data/test/tc_escapedchars.rb +510 -0
  396. data/test/tc_header.rb +104 -0
  397. data/test/tc_misc.rb +139 -0
  398. data/test/tc_name.rb +53 -0
  399. data/test/tc_packet.rb +158 -0
  400. data/test/tc_packet_unique_push.rb +102 -0
  401. data/test/tc_question.rb +52 -0
  402. data/test/tc_res_config.rb +92 -0
  403. data/test/tc_res_env.rb +62 -0
  404. data/test/tc_res_file.rb +42 -0
  405. data/test/tc_res_opt.rb +185 -0
  406. data/test/tc_resolver.rb +177 -0
  407. data/test/tc_rr-opt.rb +42 -0
  408. data/test/tc_rr-txt.rb +137 -0
  409. data/test/tc_rr-unknown.rb +99 -0
  410. data/test/tc_rr.rb +259 -0
  411. data/test/tc_single_resolver.rb +153 -0
  412. data/test/tc_soak.rb +310 -0
  413. data/test/tc_tcp.rb +35 -0
  414. data/test/tc_tkey.rb +106 -0
  415. data/test/tc_update.rb +215 -0
  416. data/test/ts_dnsruby.rb +17 -0
  417. data/test/ts_offline.rb +35 -0
  418. data/test/ts_online.rb +40 -0
  419. metadata +512 -0
@@ -0,0 +1,474 @@
1
+ #--
2
+ #Copyright 2007 Nominet UK
3
+ #
4
+ #Licensed under the Apache License, Version 2.0 (the "License");
5
+ #you may not use this file except in compliance with the License.
6
+ #You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ #Unless required by applicable law or agreed to in writing, software
11
+ #distributed under the License is distributed on an "AS IS" BASIS,
12
+ #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ #See the License for the specific language governing permissions and
14
+ #limitations under the License.
15
+ #++
16
+ require 'socket'
17
+ #require 'thread'
18
+ begin
19
+ require 'fastthread'
20
+ rescue LoadError
21
+ require 'thread'
22
+ end
23
+ require 'singleton'
24
+ module Dnsruby
25
+ Thread::abort_on_exception = true
26
+ class SelectThread #:nodoc: all
27
+ class SelectWakeup < RuntimeError; end
28
+ include Singleton
29
+ # This singleton class runs a continuous select loop which
30
+ # listens for responses on all of the in-use sockets.
31
+ # When a new query is sent, the thread is woken up, and
32
+ # the socket is added to the select loop (and the new timeout
33
+ # calculated).
34
+ # Note that a combination of the socket and the packet ID is
35
+ # sufficient to uniquely identify the query to the select thread.
36
+ # But how do we identify it to the client thread?
37
+ # Push [id, response] onto the response queue?
38
+ # Or [id, timeout]
39
+ #
40
+ # But how do we find the response queue for a particular query?
41
+ # Hash of client_id->[query, client_queue, socket]
42
+ # and socket->[client_id]
43
+ #
44
+ # @todo@ should we implement some of cancel function?
45
+ #
46
+ # @todo@ How do we ensure that sockets all get closed?
47
+ #
48
+ # @todo@ Should the thread be killed when no queries are active?
49
+
50
+ # For each query to monitor, we need to know :
51
+ # |a) The socket the query was sent on
52
+ # |b) The query header ID
53
+ # c) The query response queue
54
+ # So we could have a hash which maps <socket, headerID> to <queue>
55
+ # Note that multiple values of <queue> could refer to the same Queue
56
+ def initialize
57
+ @@mutex = Mutex.new
58
+ @@mutex.synchronize {
59
+ @@in_select=false
60
+ # @@notifier,@@notified=IO.pipe
61
+ @@sockets = [] # @@notified]
62
+ @@timeouts = Hash.new
63
+ # @@mutex.synchronize do
64
+ @@query_hash = Hash.new
65
+ @@socket_hash = Hash.new
66
+ @@observers = Hash.new
67
+ @@tick_observers = []
68
+ @@queued_exceptions=[]
69
+ # end
70
+ # Now start the select thread
71
+ @@select_thread = Thread.new {
72
+ do_select
73
+ }
74
+ }
75
+ end
76
+
77
+ class QuerySettings
78
+ attr_accessor :query, :query_header_id, :tsig, :ignore_truncation, :client_queue,
79
+ :client_query_id, :socket, :dest_server, :dest_port, :endtime
80
+ # new(query, query_header_id, tsig, ignore_truncation, client_queue, client_query_id,
81
+ # socket, dest_server, dest_port, endtime)
82
+ def initialize(*args)
83
+ @query = args[0]
84
+ @query_header_id = args[1]
85
+ @tsig=args[2]
86
+ @ignore_truncation=args[3]
87
+ @client_queue = args[4]
88
+ @client_query_id = args[5]
89
+ @socket = args[6]
90
+ @dest_server = args[7]
91
+ @dest_port=args[8]
92
+ @endtime = args[9]
93
+ end
94
+ end
95
+
96
+ def add_to_select(query_settings)
97
+ # Add the query to sockets, and then wake the select thread up
98
+ @@mutex.synchronize {
99
+ check_select_thread_synchronized
100
+ @@query_hash[query_settings.client_query_id]=query_settings
101
+ @@socket_hash[query_settings.socket]=[query_settings.client_query_id] # @todo@ If we use persistent sockets then we need to update this array
102
+ @@timeouts[query_settings.client_query_id]=query_settings.endtime
103
+ @@sockets.push(query_settings.socket)
104
+
105
+ # # Only do this if we're currently in select
106
+ # if @@in_select
107
+ # @@in_select=false
108
+ # p "in_select now false - sending signal"
109
+ # @@select_thread.raise SelectWakeup # Wake up the select thread so it listens to socket too
110
+ # # # @todo@ This would probably be more elegant if we send a signal through select
111
+ # end
112
+ }
113
+ end
114
+
115
+ def check_select_thread_synchronized
116
+ if (!@@select_thread.alive?)
117
+ TheLog.debug("Restarting select thread")
118
+ @@select_thread = Thread.new {
119
+ do_select
120
+ }
121
+ end
122
+ end
123
+
124
+ def select_thread_alive?
125
+ ret=true
126
+ @@mutex.synchronize{
127
+ ret = @@select_thread.alive?
128
+ }
129
+ return ret
130
+ end
131
+
132
+ def do_select
133
+ unused_loop_count = 0
134
+ while true do
135
+ send_tick_to_observers
136
+ send_queued_exceptions
137
+ timeout = tick_time = (Time.now+0.1) - Time.now # We provide a timer service to various Dnsruby classes
138
+ sockets=[]
139
+ timeouts=[]
140
+ has_observer = false
141
+ @@mutex.synchronize {
142
+ sockets = @@sockets
143
+ timeouts = @@timeouts.values
144
+ has_observer = !@@observers.empty?
145
+ }
146
+ if (timeouts.length > 0)
147
+ timeouts.sort!
148
+ timeout = timeouts[0] - Time.now
149
+ if (timeout <= 0)
150
+ process_timeouts
151
+ timeout = 0
152
+ next
153
+ end
154
+ end
155
+ ready=nil
156
+ if (has_observer && (timeout > tick_time))
157
+ timeout = tick_time
158
+ end
159
+ begin
160
+ # @@mutex.synchronize{
161
+ # @@in_select=true
162
+ ## p "in_select now true"
163
+ # }
164
+ ready, write, errors = IO.select(sockets, nil, nil, timeout)
165
+ # @@mutex.synchronize{
166
+ # @@in_select=false
167
+ ## p "in_select now false"
168
+ # }
169
+ rescue SelectWakeup
170
+ # If SelectWakeup, then just restart this loop - the select call will be made with the new data
171
+ # p "signal received!"
172
+ next
173
+ end
174
+ # @@mutex.synchronize{
175
+ if (ready == nil)
176
+ # proces the timeouts
177
+ process_timeouts
178
+ unused_loop_count+=1
179
+ else
180
+ process_ready(ready)
181
+ unused_loop_count=0
182
+ # process_error(errors)
183
+ end
184
+ @@mutex.synchronize{
185
+ if (unused_loop_count > 10 && @@query_hash.empty? && @@observers.empty?)
186
+ TheLog.debug("Stopping select loop")
187
+ return
188
+ end
189
+ }
190
+ # }
191
+ end
192
+ end
193
+
194
+ def process_error(errors)
195
+ TheLog.debug("Error! #{errors.inspect}")
196
+ # @todo@ Process errors [can we do this in single socket environment?]
197
+ end
198
+
199
+ def process_ready(ready)
200
+ # while (ready.length > 0) do
201
+ # @@mutex.synchronize{
202
+ ready.each do |socket|
203
+ # if (socket==@@notified)
204
+ # @@notified.getc
205
+ # ## @@notified.close
206
+ # next
207
+ # end
208
+ # socket = ready.pop
209
+ packet_size = 512 # @todo@ Sort out per-query packet sizes
210
+ # @@mutex.synchronize{
211
+ msg = get_incoming_data(socket, packet_size)
212
+ if (msg!=nil)
213
+ send_response_to_client(msg, socket)
214
+ end
215
+ # }
216
+ ready.delete(socket)
217
+ end
218
+ # }
219
+ end
220
+
221
+ def send_response_to_client(msg, socket)
222
+ # Figure out which client_ids we were expecting on this socket, then see if any header ids match up
223
+ client_ids=[]
224
+ @@mutex.synchronize{
225
+ client_ids = @@socket_hash[socket]
226
+ }
227
+ # get the queries associated with them
228
+ client_ids.each do |id|
229
+ query_header_id=nil
230
+ @@mutex.synchronize{
231
+ query_header_id = @@query_hash[id].query_header_id
232
+ }
233
+ if (query_header_id == msg.header.id)
234
+ # process the response
235
+ client_queue = nil
236
+ @@mutex.synchronize{
237
+ client_queue = @@query_hash[id].client_queue
238
+ }
239
+ remove_id(id)
240
+ exception = msg.header.getException
241
+ TheLog.debug("Pushing response to client queue")
242
+ client_queue.push([id, msg, exception])
243
+ notify_queue_observers(client_queue, id)
244
+ return
245
+ end
246
+ end
247
+ # If not, then we have an error
248
+ TheLog.error("Stray packet - " + msg.inspect + "\n from " + socket.inspect)
249
+ end
250
+
251
+ def remove_id(id)
252
+ socket=nil
253
+ @@mutex.synchronize{
254
+ socket = @@query_hash[id].socket
255
+ @@timeouts.delete(id)
256
+ @@query_hash.delete(id)
257
+ @@sockets.delete(socket) # @todo@ Not if persistent!
258
+ }
259
+ TheLog.debug("Closing socket #{socket}")
260
+ socket.close # @todo@ Not if persistent!
261
+ end
262
+
263
+ def process_timeouts
264
+ time_now = Time.now
265
+ # timeouts = @@timeouts.values
266
+ # timeouts.sort!
267
+ timeouts={}
268
+ @@mutex.synchronize {
269
+ timeouts = @@timeouts
270
+ }
271
+ timeouts.each do |client_id, timeout|
272
+ if (timeout < time_now)
273
+ send_exception_to_client(ResolvTimeout.new("Query timed out"), nil, client_id)
274
+ # else
275
+ # return # @@timeouts is sorted, so all others will be later than this one
276
+ end
277
+ end
278
+ end
279
+
280
+ def tcp_read(socket, len)
281
+ buf=""
282
+ while (buf.length < len) do
283
+ buf += socket.recv(len-buf.length)
284
+ end
285
+ return buf
286
+ end
287
+
288
+ def get_incoming_data(socket, packet_size)
289
+ answerfrom,answerip,answerport,answersize=nil
290
+ ans,buf = nil
291
+ begin
292
+ if (socket.class == TCPSocket)
293
+ # @todo@ Ruby Bug #9061 stops this working right
294
+ # We'd like to do a socket.recvfrom, but that raises an Exception
295
+ # on Windows for TCPSocket for Ruby 1.8.5 (and 1.8.6).
296
+ # So, we need to do something different for TCP than UDP. *sigh*
297
+ # @todo@ This workaround will only work if there is exactly one socket per query
298
+ # - *not* ideal TCP use!
299
+ @@mutex.synchronize{
300
+ client_id = @@socket_hash[socket][0]
301
+ answerfrom = @@query_hash[client_id].dest_server
302
+ answerip = answerfrom
303
+ answerport = @@query_hash[client_id].dest_port
304
+ }
305
+ buf = tcp_read(socket, 2)
306
+ answersize = buf.unpack('n')[0]
307
+ buf = tcp_read(socket,answersize)
308
+ else
309
+ if (ret = socket.recvfrom(packet_size))
310
+ buf = ret[0]
311
+ answerport=ret[1][1]
312
+ answerfrom=ret[1][2]
313
+ answerip=ret[1][3]
314
+ answersize=(buf.length)
315
+ else
316
+ # recvfrom failed - why?
317
+ TheLog.error("Error - recvfrom failed from #{socket}")
318
+ handle_recvfrom_failure(socket)
319
+ return
320
+ end
321
+ end
322
+ rescue Exception => e
323
+ TheLog.error("Error - recvfrom failed from #{socket}, exception : #{e}")
324
+ handle_recvfrom_failure(socket)
325
+ return
326
+ end
327
+ TheLog.debug(";; answer from #{answerfrom} : #{answersize} bytes\n")
328
+
329
+ begin
330
+ ans = Message.decode(buf)
331
+ rescue Exception => e
332
+ TheLog.error("Decode error! #{e.class}, #{e}\nfor msg (length=#{buf.length}) : #{buf}")
333
+ client_id=get_client_id_from_answerfrom(socket, answerip, answerport)
334
+ if (client_id != nil)
335
+ send_exception_to_client(e, socket, client_id)
336
+ else
337
+ TheLog.error("Decode error from #{answerfrom} but can't determine packet id")
338
+ end
339
+ return
340
+ end
341
+
342
+ if (ans!= nil)
343
+ TheLog.debug("#{ans}")
344
+ ans.answerfrom=(answerfrom)
345
+ ans.answersize=(answersize)
346
+ end
347
+ return ans
348
+ end
349
+
350
+ def handle_recvfrom_failure(socket)
351
+ # @todo@ No way to notify the client about this error, unless there was only one connection on the socket
352
+ ids_for_socket = []
353
+ @@mutex.synchronize{
354
+ ids_for_socket = @@socket_hash[socket]
355
+ }
356
+ if (ids_for_socket.length == 1)
357
+ answerfrom=nil
358
+ @@mutex.synchronize{
359
+ query_settings = @@query_hash[ids_for_socket[0]]
360
+ answerfrom=query_settings.dest_server
361
+ }
362
+ send_exception_to_client(OtherResolvError.new("recvfrom failed from #{answerfrom}"), socket, ids_for_socket[0])
363
+ else
364
+ TheLog.fatal("Recvfrom failed from #{socket}, no way to tell query id")
365
+ end
366
+ end
367
+
368
+ def get_client_id_from_answerfrom(socket, answerip, answerport)
369
+ client_id=nil
370
+ # Figure out client id from answerfrom
371
+ @@mutex.synchronize{
372
+ ids = @@socket_hash[socket]
373
+ ids.each do |id|
374
+ # Does this id speak to this dest_server?
375
+ query_settings = @@query_hash[id]
376
+ if (answerip == query_settings.dest_server && answerport == query_settings.dest_port)
377
+ # We have a match
378
+ # - @todo@ as long as we're not speaking to the same server on two ports!
379
+ client_id = id
380
+ break
381
+ end
382
+ end
383
+ }
384
+ return client_id
385
+ end
386
+
387
+ def send_exception_to_client(err, socket, client_id, msg=nil)
388
+ # first ensure the error is of the right type
389
+ # @TODO@ What about FORMERR, and other RCode errors?
390
+ if ((!err.kind_of?ResolvError) && (!err.kind_of?ResolvTimeout))
391
+ TheLog.error("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
392
+ raise RuntimeError.new("INCORRECT ERROR TYPE BEING RETURNED TO CLIENT")
393
+ end
394
+ # find the client response queue
395
+ client_queue = nil
396
+ @@mutex.synchronize {
397
+ client_queue = @@query_hash[client_id].client_queue
398
+ }
399
+ remove_id(client_id)
400
+ push_exception_to_client(client_id, client_queue, err, msg)
401
+ end
402
+
403
+ def push_exception_to_select(client_id, client_queue, err, msg)
404
+ @@mutex.synchronize{
405
+ @@queued_exceptions.push([client_id, client_queue, err, msg])
406
+ }
407
+ end
408
+
409
+ def send_queued_exceptions
410
+ exceptions = []
411
+ @@mutex.synchronize{
412
+ exceptions = @@queued_exceptions
413
+ @@queued_exceptions = []
414
+ }
415
+
416
+ exceptions.each do |item|
417
+ client_id, client_queue, err, msg = item
418
+ push_exception_to_client(client_id, client_queue, err, msg)
419
+ end
420
+ end
421
+
422
+ def push_exception_to_client(client_id, client_queue, err, msg)
423
+ # Now push the exception on the queue
424
+ client_queue.push([client_id, msg, err])
425
+ notify_queue_observers(client_queue, client_id)
426
+ end
427
+
428
+ def add_observer(client_queue, observer)
429
+ @@mutex.synchronize {
430
+ @@observers[client_queue]=observer
431
+ check_select_thread_synchronized # @TODO@ Is this really necessary? The client should start the thread by sending a query, really...
432
+ if (!@@tick_observers.include?observer)
433
+ @@tick_observers.push(observer)
434
+ end
435
+ }
436
+ end
437
+
438
+ def remove_observer(client_queue, observer)
439
+ @@mutex.synchronize {
440
+ if (@@observers[client_queue]==observer)
441
+ @@observers.delete(observer)
442
+ else
443
+ TheLog.error("remove_observer called with wrong observer for queue")
444
+ raise ArgumentError.new("remove_observer called with wrong observer for queue")
445
+ end
446
+ if (!@@observers.values.include?observer)
447
+ @@tick_observers.delete(observer)
448
+ end
449
+ }
450
+ end
451
+
452
+ def notify_queue_observers(client_queue, client_query_id)
453
+ # If any observers are known for this query queue then notify them
454
+ observer=nil
455
+ @@mutex.synchronize {
456
+ observer = @@observers[client_queue]
457
+ }
458
+ if (observer)
459
+ observer.handle_queue_event(client_queue, client_query_id)
460
+ end
461
+ end
462
+
463
+ def send_tick_to_observers
464
+ # If any observers are known then send them a tick
465
+ tick_observers=nil
466
+ @@mutex.synchronize {
467
+ tick_observers = @@tick_observers
468
+ }
469
+ tick_observers.each do |observer|
470
+ observer.tick
471
+ end
472
+ end
473
+ end
474
+ end