class SrwDocumentStream(HttpDocumentStream): # same as Sru, but use request object and ZSI to fetch namespaces = {} def __init__(self, session, stream, format, tagName=None, codec=None, factory=None): self.namespaces = SRW.protocolNamespaces HttpDocumentStream.__init__(self, session, stream, format, tagName, codec, factory) def open_stream(self, stream): # stream is SRU style URL to be opened as SRW (transport, user, passwd, host, port, dirname, filename, args, anchor) = self._parse_url(stream) if not port: port = 80 database = os.path.join(dirname, filename) self.binding = Binding(host=host, port=port, url=database, nsdict=self.namespaces) return SRW.types.SearchRetrieveRequest('searchRetrieveRequest', opts=args) def find_documents(self, session, cache=0): docs = [] curr = 1 while True: self.stream.startRecord = curr resp = self.binding.RPC( self.binding.url, "searchRetrieveRequest", self.stream, requestclass=SRW.types.SearchRetrieveRequest, replytype=SRW.types.SearchRetrieveResponse.typecode, readerclass=reader) total = resp.numberOfRecords curr += len(resp.records) for d in resp.records: doc = StringDocument(d.recordData, mimeType='text/xml') doc.recordSchema = d.recordSchema if cache == 0: yield doc elif cache == 2: docs.append(doc) else: raise NotImplementedError if curr > total: if cache == 0: raise StopIteration else: break self.documents = docs
def listMembers(url): Binding.defaultHttpsTransport = HTTPSConnection2 fp = open('soap_trace', 'w') b = Binding(url=url, tracefile=fp) reply = b.RPC(None, 'listMembers', [], encodingStyle="http://schemas.xmlsoap.org/soap/encoding/", replytype=TC.Any("listMembersResponse", nillable=True)) return reply['listMembersReturn']