Exemplo n.º 1
0
 def __init__ (self, typ, query):
     """Creates Query object: only typ == 'CCL' currently supported.
     See ccl module documentation for details."""
     if typ == 'CCL':
        self.typ = 'RPN'
        try:
            self.query = ccl.mk_rpn_query (query)
        except ccl.QuerySyntaxError, err:
            raise QuerySyntaxError
        except z3950.ConnectionError, val:
            raise ConnectionError (val)
Exemplo n.º 2
0
    def __init__(self, typ, query):
        """Creates Query object.
Supported query types:  CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE
"""
        typ = typ.upper()
        # XXX maybe replace if ... elif ...  with dict mapping querytype to func
        if typ == 'CCL':
            self.typ = 'RPN'
            try:
                self.query = ccl.mk_rpn_query(query)
            except ccl.QuerySyntaxError, err:
                raise QuerySyntaxError(str(err))
Exemplo n.º 3
0
    def __init__ (self, typ, query):
        """Creates Query object.
Supported query types:  CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE
"""
        typ = typ.upper()
# XXX maybe replace if ... elif ...  with dict mapping querytype to func
        if typ == 'CCL':
           self.typ = 'RPN'
           try:
               self.query = ccl.mk_rpn_query (query)
           except ccl.QuerySyntaxError, err:
               raise QuerySyntaxError (str(err))
Exemplo n.º 4
0
    def handleSearch(self, session, data):
        # Must return a response no matter what
        resp = SearchResponse()
        resp.resultCount = 0
        resp.numberOfRecordsReturned = 0
        resp.nextResultSetPosition = 1
        resp.searchStatus = 1
        resp.resultSetStatus = 1
        resp.presentStatus = PresentStatus.get_num_from_name('failure')

        try:
            queryType = data.query[0]
            query = ["", ""]
            if (queryType in ['type_1', 'type_101']):
                zQuery = data.query[1]
                attrset = zQuery.attributeSet
                query = ['rpn', zQuery.rpn]
            elif (queryType == 'type_0'):
                # A Priori external. We assume CQL
                query = ['cql', data.query[1]]
            elif (queryType == 'type_2'):
                # ISO8777  (CCL)
                rpn = ccl.mk_rpn_query(data.query[1])
                query = ['rpn', rpn]
            elif (queryType == 'type_104'):
                # Look for CQL or SQL
                type104 = data.query[1].direct_reference
                if (type104 == Z3950_QUERY_CQL_ov):
                    query = ['cql', data.query[1].encoding[1]]
                elif (type104 == Z3950_QUERY_SQL_ov):
                    query = ['sql', data.query[1].encoding[1].queryExpression]
                    # XXX Implement direct to postgres
                    raise NotImplementedError
                else:
                    # Undefined query type
                    raise NotImplementedError
            elif (queryType in ['type_102', 'type_100']):
                # 102: Ranked List, not yet /defined/ let alone implemented
                # 100: Z39.58 query (Standard was withdrawn)
                raise NotImplementedError

            rsetname = data.resultSetName
            dbs = data.databaseNames
            resultSets = []
            if query[0] == 'cql':
                q = CQLParser.parse(query[1])
            for dbname in dbs:
                cfg = self.session.configs.get(dbname, None)
                if cfg is not None:
                    db = cfg.parent
                    if query[0] == 'rpn':
                        self.log("Trying to convert: %s" % (repr(query[1])))
                        q = CQLUtils.rpn2cql(query[1], cfg)
                        self.log("--> " + q.toCQL())
                    session.database = db.id
                    q = cqlParser.parse(q.toCQL())
                    resultSets.append(db.search(session, q))
                else:
                    raise ValueError("%s not in %r" %
                                     (dbname, self.session.configs.keys()))
            if len(resultSets) > 1:
                rs = resultSets[0]
                for r in resultSets[1:]:
                    rs.combine(r)
            elif len(resultSets) == 1:
                rs = resultSets[0]
            else:
                # No resultset.
                return self.encode(('searchResponse', resp))

            resp.resultCount = len(rs)
            # Maybe put it into our DB
            if session.resultSets.has_key(rsetname):
                rsid = session.resultSets[rsetname]
                rs.id = rsid
                session.resultSetStore.store_resultSet(session, rs)
            else:
                rsid = session.resultSetStore.create_resultSet(session, rs)
                session.resultSets[rsetname] = rsid
            # only keep 4 at once
            keys = session.resultSetCache.keys()
            if len(keys) > 3:
                # delete one at random
                r = rand.randint(0, 3)
                del session.resultSetCache[keys[r]]
            session.resultSetCache[rsid] = rs

        except Exception, err:
            # XXX add -correct- diagnostic
            resp.numberOfRecordsReturned = 1
            resp.nextResultSetPosition = 0
            resp.resultSetStatus = 3
            d = self.generate_diagnostic(err)
            diag = ('nonSurrogateDiagnostic', d)
            resp.records = diag
Exemplo n.º 5
0
    def __init__ (self, typ, query):
        """Creates Query object.
Supported query types:  CCL, S-CCL, CQL, S-CQL, PQF, C2, ZSQL, CQL-TREE
"""
        typ = typ.upper()
# XXX maybe replace if ... elif ...  with dict mapping querytype to func
        if typ == 'CCL':
           self.typ = 'RPN'
           try:
               self.query = ccl.mk_rpn_query (query)
           except ccl.QuerySyntaxError as err:
               raise QuerySyntaxError (str(err))
        elif typ == 'S-CCL': # server-side ccl
            self.typ = typ
            self.query =  ('type-2', query)
        elif typ == 'S-CQL': # server-side cql
            self.typ = typ
            xq = asn1.EXTERNAL()
            xq.direct_reference = oids.Z3950_QUERY_CQL_ov
            xq.encoding = ('single-ASN1-type', query)
            self.query = ('type_104', xq)
        elif typ == 'CQL': # CQL to RPN transformation
            self.typ = 'RPN'
            try:
                q = CQLParser.parse(query)
                rpnq = z3950.RPNQuery()
                # XXX Allow Attribute Architecture somehow?
                rpnq.attributeSet = oids.Z3950_ATTRS_BIB1_ov
                rpnq.rpn = q.toRPN()
                self.query = ('type_1', rpnq)
            except SRWDiagnostics.SRWDiagnostic as err:
                raise err
            except:
                raise QuerySyntaxError
        elif typ == 'PQF':  # PQF to RPN transformation
            self.typ = 'RPN'
            try:
                self.query = pqf.parse(query)
            except:
                raise QuerySyntaxError

        elif typ == 'C2': # Cheshire2 Syntax
            self.typ = 'RPN'
            try:
                q = c2.parse(query)
                self.query = q[0]
            except:
                raise QuerySyntaxError
        elif typ == 'ZSQL': # External SQL
            self.typ = typ
            xq = asn1.EXTERNAL()
            xq.direct_reference = oids.Z3950_QUERY_SQL_ov
            q = z3950.SQLQuery()
            q.queryExpression = query
            xq.encoding = ('single-ASN1-type', q)
            self.query = ('type_104', xq)
        elif typ == 'CQL-TREE': # Tree to RPN
            self.typ = 'RPN'
            try:
                rpnq = z3950.RPNQuery()
                # XXX Allow Attribute Architecture
                rpnq.attributeSet = oids.Z3950_ATTRS_BIB1_ov
                rpnq.rpn = query.toRPN()
                self.query = ('type_1', rpnq)
            except SRWDiagnostics.SRWDiagnostic as err:
                raise err
            except:
                raise QuerySyntaxError
        else:
            raise ClientNotImplError ('%s queries not supported' % typ)
Exemplo n.º 6
0
    def handleSearch(self, session, data):
        # Must return a response no matter what
        resp = SearchResponse()
        resp.resultCount = 0
        resp.numberOfRecordsReturned = 0
        resp.nextResultSetPosition = 1
        resp.searchStatus = 1
        resp.resultSetStatus = 1
        resp.presentStatus = PresentStatus.get_num_from_name('failure')

        try:
            queryType = data.query[0]
            query = ["", ""]
            if (queryType in ['type_1', 'type_101']):
                zQuery = data.query[1]
                attrset = zQuery.attributeSet
                query = ['rpn', zQuery.rpn]
            elif (queryType == 'type_0'):
                # A Priori external. We assume CQL
                query = ['cql', data.query[1]]
            elif (queryType == 'type_2'):
                # ISO8777  (CCL)
                rpn = ccl.mk_rpn_query(data.query[1])
                query = ['rpn', rpn]           
            elif (queryType == 'type_104'):
                # Look for CQL or SQL
                type104 = data.query[1].direct_reference
                if (type104 == Z3950_QUERY_CQL_ov):
                    query = ['cql', data.query[1].encoding[1]]
                elif (type104 == Z3950_QUERY_SQL_ov):
                    query = ['sql', data.query[1].encoding[1].queryExpression]
                    # XXX Implement direct to postgres
                    raise NotImplementedError
                else:
                    # Undefined query type
                    raise NotImplementedError
            elif (queryType in ['type_102', 'type_100']):
                # 102: Ranked List, not yet /defined/ let alone implemented
                # 100: Z39.58 query (Standard was withdrawn)
                raise NotImplementedError

            rsetname = data.resultSetName
            dbs = data.databaseNames
            resultSets = []
            if query[0] == 'cql':
                q = CQLParser.parse(query[1])
            for dbname in dbs:
                cfg = self.session.configs.get(dbname, None)
                if cfg is not None:
                    db = cfg.parent
                    if query[0] == 'rpn':
                        self.log("Trying to convert: %s" % (repr(query[1])))
                        q = CQLUtils.rpn2cql(query[1], cfg)               
                        self.log("--> " + q.toCQL())
                    session.database = db.id
                    q = cqlParser.parse(q.toCQL())
                    resultSets.append(db.search(session, q))
                else:
                    raise ValueError("%s not in %r" % (dbname, self.session.configs.keys()))
            if len(resultSets) > 1:
                rs = resultSets[0]
                for r in resultSets[1:]:
                    rs.combine(r)
            elif len(resultSets) == 1:
                rs = resultSets[0]
            else:
                # No resultset.
                return self.encode(('searchResponse', resp))

            resp.resultCount = len(rs)
            # Maybe put it into our DB
            if session.resultSets.has_key(rsetname):
                rsid = session.resultSets[rsetname]
                rs.id = rsid
                session.resultSetStore.store_resultSet(session, rs)
            else:
                rsid = session.resultSetStore.create_resultSet(session, rs)
                session.resultSets[rsetname] = rsid
            # only keep 4 at once
            keys = session.resultSetCache.keys()
            if len(keys) > 3:
                # delete one at random
                r = rand.randint(0,3)
                del session.resultSetCache[keys[r]]
            session.resultSetCache[rsid] = rs

        except Exception, err:
            # XXX add -correct- diagnostic
            resp.numberOfRecordsReturned = 1
            resp.nextResultSetPosition = 0
            resp.resultSetStatus = 3           
            d = self.generate_diagnostic(err)
            diag = ('nonSurrogateDiagnostic', d)
            resp.records = diag