1"""High-level interface to adns.""" 2 3import adns 4 5class Error(Exception): pass 6 7class QueryEngine: 8 9 callback_submit = None 10 callback_submit_reverse = None 11 callback_submit_reverse_any = None 12 13 def __init__(self, s=None): 14 self._s = s or adns.init(adns.iflags.noautosys) 15 self._queries = {} 16 17 def synchronous(self, qname, rr, flags=0): 18 return self._s.synchronous(qname, rr, flags) 19 20 def submit(self, qname, rr, flags=0, callback=None, extra=None): 21 callback = callback or self.callback_submit 22 if not callback: raise Error("callback required") 23 q = self._s.submit(qname, rr, flags) 24 self._queries[q] = qname, rr, flags, callback, extra 25 26 def submit_reverse(self, qname, rr, flags=0, callback=None, extra=None): 27 callback = callback or self.callback_submit_reverse 28 if not callback: raise Error("callback required") 29 q = self._s.submit_reverse(qname, rr, flags) 30 self._queries[q] = qname, rr, flags, callback, extra 31 32 def submit_reverse_any(self, qname, rr, flags=0, 33 callback=None, extra=None): 34 callback = callback or self.callback_submit_reverse_any 35 if not callback: raise Error("callback required") 36 q = self._s.submit_reverse_any(qname, rr, flags) 37 self._queries[q] = qname, rr, flags, callback, extra 38 39 def cancel(self, query): 40 query.cancel() 41 try: del self._queries[query] 42 except KeyError: pass 43 44 def run(self, timeout=0): 45 for q in self._s.completed(timeout): 46 answer = q.check() 47 qname, rr, flags, callback, extra = self._queries[q] 48 del self._queries[q] 49 callback(*(answer, qname, rr, flags, extra)) 50 51 def finished(self): 52 return not len(self._queries) 53 54 def finish(self): 55 while not self.finished(): 56 self.run(1) 57 58 def run_max(self, max): 59 from time import time 60 quittime = time()+max 61 while not self.finished() and time()<=quittime: 62 self.run(1) 63 64 def globalsystemfailure(self): 65 self._s.globalsystemfailure() 66 self._queries.clear() 67 68init = QueryEngine 69