source: TI02-CSML/trunk/csml/API/existDB.py @ 2432

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/API/existDB.py@2432
Revision 2432, 5.8 KB checked in by domlowe, 14 years ago (diff)

removing print statement

Line 
1# Code inspired by example on eXist website.
2import urllib2, base64, urllib, urlparse, httplib, xmlrpclib, types
3
4class   InstanceObject(object):
5    def __init__(self, **kw):
6        self.dict={}
7        self.dict.update(kw)
8    def __getattr__(self,arg):
9        return self.dict[arg]
10
11class  eXist_Connector(object):
12    """Access class for eXist"""
13    def __init__(self,constants=None):
14        ''' Instantiates the eXist connector using supplied constants '''
15        if constants is None: raise 'NoExistConstants'
16        authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm()
17        authinfo.add_password(None,
18                                  constants.host,
19                                  constants.userid,
20                                  constants.password)
21        authHandler = urllib2.HTTPBasicAuthHandler(authinfo)
22        opener = urllib2.build_opener(authHandler)
23        s = constants.userid+':'+constants.password
24        z = base64.encodestring(s)[:-1] # strip trailing 12
25        opener.addheaders.append(('Authorization', 'Basic %s' % z))
26        self.http_headers = {'Authorization':'Basic %s' % z}
27        self.opener = opener
28        # also create an xmlrpc Server object
29       
30        xmlrpc_uri = '%s%s:%s@%s:%d%s' % ( 
31                                            'http://',
32                                            constants.userid,
33                                            constants.password,
34                                            constants.host,
35                                            constants.port,
36                                            constants.xmlrpc_base_path
37                                        )
38        self.xmlrpc = xmlrpclib.Server(xmlrpc_uri)
39
40    def executeQuery(self, xquery, params={}):
41        '''Execute an xquery string, return session and summary information'''
42        xquery=xmlrpclib.Binary(xquery)
43        id = self.xmlrpc.executeQuery(xquery, params)
44        summary = self.xmlrpc.querySummary(id)
45        return id,summary
46
47    def release(self,id):
48        ''' Release an executeQuery session '''
49        self.xmlrpc.releaseQueryResult(id)
50       
51    def retrieve(self,id,pos,params={}):
52        ''' Retrieve a specific document from an executeQuery result set '''
53        return self.xmlrpc.retrieve(id,pos,params).data
54 
55       
56class ndg_eXist(eXist_Connector):
57    ''' Adds ndg methods to a "standard" exist Connector '''
58    def __init__(self,db='glue.badc.rl.ac.uk', passwordFile='passwords.txt'):
59        f=file(passwordFile,'r')
60        pw={}
61        for line in f.readlines():
62            host,userid,password=line.strip().split(' ')
63            pw[host]=(userid,password)
64        eXistConstants = InstanceObject(host=db,
65                                userid=pw[db][0],
66                                password=pw[db][1],
67                                base_path="/exist/servlet",
68                                xmlrpc_base_path="/exist/xmlrpc",
69                                port=8080)
70       
71        eXist_Connector.__init__(self,eXistConstants)
72        self.ids={}
73       
74    def __buildquery(self,query,target):
75        '''Create an NDG full text query '''
76        s="//%s[. &='%s']"%(target,query)
77        return s#xmlrpclib.Binary(s)
78
79    def __buildParamSearch(self,param,value,target):
80        s="for $x in document()//%s where $x[.%s &= '%s'] return $x"%(target,param,value)
81        return s
82
83    def full_text(self,query,target='DIF'):
84        ''' Carry out a full text search within the "target" collection '''
85        id,summary=self.executeQuery(self.__buildquery(query,target))
86        self.ids[id]=0
87        return id,summary
88
89    def retrieveNext(self,id):
90        ''' Takes a sessionID from an existing query and gets the next document '''
91        try:
92            r=self.retrieve(id, self.ids[id])
93            self.ids[id]+=1
94            return r
95        except xmlrpclib.Fault:
96            return None
97        except KeyError:
98            return None
99   
100    def sessionRelease(self,id):
101        ''' Releases a session and removes the position counter '''
102        try:
103            self.release(id)
104            del self.ids[id]
105            return 1
106        except:
107            return 0
108   
109    def chunkedFullText(self,query,target='DIF',start=1,number=10):
110        ''' Execute a chunked full text query and return the result
111        set '''
112        return self.executeChunkedQuery(self.__buildquery(query,target),start,number,params={})
113   
114   
115       
116    #getXMLRecord gets any XML record including ns:id as attribute
117    def getXMLRecord(self,collID,IDdefinition,itemID,att=None,namespaceLong=None,namespaceShort=None):
118        ''' Get a specific document from a collection in a repository by using the collection name and ID and ID element name '''
119        if att: # ID is stored in an attribute
120            if namespaceLong and namespaceShort: #if attribute has namespace e.g. gml:id
121                xq='''declare namespace %s="%s"; for $DE in collection('%s')/*[@%s='%s'] return $DE'''%(namespaceShort,namespaceLong,collID,IDdefinition,itemID)
122            else: xq='''for $DE in collection('%s')/*[@%s='%s'] return $DE'''%(collID,IDdefinition,itemID)
123        else:
124            xq='''for $DE in collection('%s')/*[%s='%s'] return $DE'''%(collID,IDdefinition,itemID)
125        id,summary=self.executeQuery(xq)
126        if summary['hits']==1:
127            r=self.retrieve(id,0,{})
128            self.sessionRelease(id)
129        else:
130            r='none'
131        return r
132   
133if __name__=="__main__":
134    existDB=ndg_eXist(db='glue.badc.rl.ac.uk') 
135    COLLECTION='/db/ndg_A_metadata'
136    ID_FIELD='id'
137    DOC_ID='J2qIJh1w'
138    NSLONG='http://ndg.nerc.ac.uk/csml'
139    NSSHORT='csml'
140    print existDB.getXMLRecord(COLLECTION,ID_FIELD,DOC_ID,att=1,namespaceLong=NSLONG, namespaceShort=NSSHORT)
141    print 'done getXMLRecord from %s with %s attribute: %s'%(COLLECTION, ID_FIELD, DOC_ID)
142   
Note: See TracBrowser for help on using the repository browser.