Project

General

Profile

« Previous | Next » 

Revision 3107

Added by perry about 18 years ago

Initial import of prototype python client library to interact with metacat

View differences:

src/python/metacat.py
1
#!/usr/bin/python
2
#
3
# TODO:
4
#  validate
5
#  getNextDocid
6
#  getNextRevision(docid)
7
#  getDocids(keyword=None)
8
#  query(keyword, returnfields)
9
#  queryDict => same as above but returns python dictionary data structure
10

  
11
import httplib, urllib
12

  
13
class MetacatClient:
14

  
15
    def __init__(self, server="pmark.msi.ucsb.edu:8180", urlPath="/knb_test/metacat"):
16
        self.metacatUrlPath = urlPath
17
        self.metacatServer = server
18
        self.sessionid = None
19

  
20
    def getMetacatUrl(self):
21
        return "http://" + self.metacatServer +  self.metacatUrlPath
22

  
23
    def login(self, username, password, organization=None):
24

  
25
        if organization == 'NCEAS':
26
            uid = 'uid=%s,o=NCEAS,dc=ecoinformatics,dc=org' % username
27
        else:
28
            uid = username
29

  
30
        postdata = { 'action'   : 'login',
31
                     'qformat'  : 'xml',
32
                     'username' : uid,
33
                     'password' : password }
34

  
35
        response = self.postRequest(postdata) 
36
        if response.find("<login>") != -1:
37
            return True
38
        else:
39
            return False
40

  
41
    def logout(self):
42
        postdata = { 'action'   : 'logout',
43
                     'qformat'  : 'xml'}
44

  
45
        response = self.postRequest(postdata) 
46
        if response.find("<logout>") != -1:
47
            return True
48
        else:
49
            return False
50

  
51
    def read(self, docid, qformat="xml"):
52
        postdata = { 'action'   : 'read',
53
                     'qformat'  : qformat,
54
                     'docid'    : docid }
55
        response = self.postRequest(postdata) 
56
        # if error node returned
57
        if response.find("<error>") != -1:
58
            return False
59
        else:
60
            return response
61

  
62

  
63
    def insert(self, docid, doctext):
64
        postdata = { 'action'   : 'insert',
65
                     'doctext'  : doctext,
66
                     'docid'    : docid }
67
        response = self.postRequest(postdata) 
68
        # if error node returned
69
        if response.find("<error>") != -1:
70
            return False
71
        else:
72
            return response
73

  
74
    def update(self, docid, doctext):
75
        postdata = { 'action'   : 'update',
76
                     'doctext'  : doctext,
77
                     'docid'    : docid }
78
        response = self.postRequest(postdata) 
79
        return response
80

  
81
    def delete(self, docid):
82
        postdata = { 'action'   : 'delete',
83
                     'docid'    : docid }
84
        response = self.postRequest(postdata) 
85
        return response
86

  
87
    def squery(self, pathquery, qformat="xml"):
88
        postdata = { 'action'   : 'squery',
89
                     'qformat'  : qformat,
90
                     'query'    : pathquery }
91
        response = self.postRequest(postdata) 
92
        return response
93

  
94
    def postRequest(self, postdata):
95
        conn = httplib.HTTPConnection( self.metacatServer )
96
        params = urllib.urlencode( postdata )
97
        headers = { "Content-type" : "application/x-www-form-urlencoded", 
98
                    "Accept"       : "*/*"}
99

  
100
        # If we have an active session, set the cookie
101
        if self.sessionid is not None:
102
            headers['Cookie'] = self.sessionid
103

  
104
        conn.request( "POST", self.metacatUrlPath, params, headers )
105
        response = conn.getresponse()
106

  
107
        # If metacat responds with a new session id,
108
        # register it with the metacat client instance
109
        setcookie = response.getheader("set-cookie", None)
110
        if setcookie:
111
            jsid = setcookie.split(';')[0]
112
            if jsid[:11] == "JSESSIONID=":
113
               self.sessionid = jsid
114
            
115
        if response.status == 200:
116
           content = response.read()
117
        else:
118
           print " !!! SERVER DID NOT RETURN 'OK'.... STATUS is " + str(response.status) 
119
           content = ""
120
        conn.close()
121
        return content
122

  
0 123

  
src/python/transferEml.py
1
#!/usr/bin/python
2
"""
3
 Transfers documents from one metacat server to another
4
 Author: matt perry
5
 Date: 09/28/06
6
"""
7

  
8
import metacat
9
import sys
10

  
11
try:
12
    docidlist = sys.argv[1]
13
except:
14
    print
15
    print " usage: python transferEml.py docidlist.txt "
16
    print "        where docidlist.txt is a line-delimited list of docids "
17
    print
18
    sys.exit(1)
19

  
20
print "Logging into destination server"
21
dest = metacat.MetacatClient('yourserver:8180','/knb/metacat')
22
dest.login('user','password','NCEAS')
23

  
24
print "Logging into source server"
25
src = metacat.MetacatClient('knb.ecoinformatics.org', '/knb/metacat')
26
src.login('user','password','NCEAS')
27

  
28
print "Open docid list and loop"
29
for docid in open(docidlist,'r').readlines():
30
    docid = docid.strip().replace('\n','')
31
    if docid != '' and docid is not None:
32
       print " reading docid " + docid
33
       eml = src.read(docid) 
34
       if eml:
35
           print " inserting docid " + docid
36
           response = dest.insert(docid + ".1" ,eml)
37
           if not response:
38
              print "   insert failed"
39
       else:
40
           print "   docid " + docid + " not found"
41

  
42
print "Logging out"
43
dest.logout()
44
src.logout()
45
       
46
        
47

  
48

  
0 49

  
src/python/README
1
PyMetacat 
2
Python library to work with Metacat XML Databases.
3
Author: Matthew Perry
4
Date: 12/06/2006
5

  
6
Introduction
7
-------------
8
Metacat is a flexible XML database. It can store, search and rerieve XML documents of any schema and it used primarily for storing metadata documents. This library provides a python interface to any Metacat server allowing you to add, insert, update, delete and query documents.
9

  
10

  
11
Installation
12
------------
13

  
14
To install pymetcat, copy the metacat.py file into your python site-packages directory (or anywhere in $PYTHONPATH ).
15

  
16

  
17
Examples
18
------------
19

  
20
Along with transferEml.py (a full working example of pymetacat usage), here are some basic usage examples:
21

  
22
##########################################################################################
23
import metacat
24

  
25
# Initialize
26
mc = metacat.MetacatClient('www.server.net','/context/metacat')
27

  
28
# Print the url
29
print mc.getMetacatUrl()
30
# http://www.server.net/context/metacat
31

  
32
# Login
33
response = mc.login('uid=user,o=ORG,dc=ecoinformatics,dc=org','PassW0Rd!')
34
print "login : ", response
35

  
36
# Read the eml 
37
docid = 'org.99.4.1'
38
eml = mc.read(docid)
39
#print eml
40

  
41
# Insert the read document as a new copy w/ new docid
42
newdocid = 'anotherorg.905'
43
response = mc.insert(newdocid + ".1",eml)
44
print response
45

  
46
# Make some change to the xml text and update it
47
eml.replace("Serengeti", "Some other")
48
response = mc.update(newdocid + ".2",eml)
49
print response
50

  
51
# Delete the document
52
response = mc.delete(newdocid + ".2")
53
print "DELETE"
54
print response
55

  
56

  
57
pathquery = """
58
   <pathquery version="1.0">
59
      <meta_file_id>unspecified</meta_file_id>
60
      <querytitle>unspecified</querytitle>
61
      <returnfield>dataset/title</returnfield>
62
      <returndoctype></returndoctype>
63
      <querygroup operator="UNION">
64
              <queryterm casesensitive="false" searchmode="contains">
65
                <value>%</value>
66
              </queryterm>
67
        <queryterm casesensitive="false" searchmode="contains">
68
          <value>Africa</value>
69
          <pathexpr>keyword</pathexpr>
70
        </queryterm>
71
      </querygroup>
72
    </pathquery> 
73
"""
74
response = mc.squery(pathquery)
75
print "==============="
76
print response
77
print "==============="
78

  
79

  
80
response = mc.logout()
81
print "logout : ", response
82
#########################################################################################
0 83

  

Also available in: Unified diff