예제 #1
0
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
예제 #2
0
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']