-
Notifications
You must be signed in to change notification settings - Fork 1
/
simplecouch.py
103 lines (78 loc) · 3 KB
/
simplecouch.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import httplib, json
def prettyPrint(s):
"""Prettyprints the json response of an HTTPResponse object"""
# HTTPResponse instance -> Python object -> str
print simplejson.dumps(json.loads(s.read()), sort_keys=True, indent=4)
class simplecouch:
"""
Basic wrapper class for operations on a couchDB
http://wiki.apache.org/couchdb/Getting_started_with_Python
"""
def __init__(self, host, port=5984, options=None):
self.host = host
self.port = port
def connect(self):
return httplib.HTTPConnection(self.host, self.port) # No close()
# Database operations
def createDb(self, dbName):
"""Creates a new database on the server"""
r = self.put(''.join(['/',dbName,'/']), "")
prettyPrint(r)
def deleteDb(self, dbName):
"""Deletes the database on the server"""
r = self.delete(''.join(['/',dbName,'/']))
prettyPrint(r)
def listDb(self):
"""List the databases on the server"""
prettyPrint(self.get('/_all_dbs'))
def infoDb(self, dbName):
"""Returns info about the couchDB"""
r = self.get(''.join(['/', dbName, '/']))
prettyPrint(r)
# Document operations
def listDoc(self, dbName):
"""List all documents in a given database"""
r = self.get(''.join(['/', dbName, '/', '_all_docs']))
prettyPrint(r)
def openDoc(self, dbName, docId):
"""Open a document in a given database"""
r = self.get(''.join(['/', dbName, '/', docId,]))
prettyPrint(r)
def saveDoc(self, dbName, body, docId=None):
"""Save/create a document to/in a given database"""
if docId:
r = self.put(''.join(['/', dbName, '/', docId]), body)
else:
r = self.post(''.join(['/', dbName, '/']), body)
prettyPrint(r)
def deleteDoc(self, dbName, docId):
# XXX Crashed if resource is non-existent; not so for DELETE on db. Bug?
# XXX Does not work any more, on has to specify an revid
# Either do html head to get the recten revid or provide it as parameter
r = self.delete(''.join(['/', dbName, '/', docId, '?revid=', rev_id]))
prettyPrint(r)
# Basic http methods
def get(self, uri):
c = self.connect()
headers = {"Accept": "application/json"}
c.request("GET", uri, None, headers)
return c.getresponse()
def post(self, uri, body):
c = self.connect()
headers = {"Content-type": "application/json"}
c.request('POST', uri, body, headers)
return c.getresponse()
def put(self, uri, body):
c = self.connect()
if len(body) > 0:
headers = {"Content-type": "application/json"}
c.request("PUT", uri, body, headers)
else:
c.request("PUT", uri, body)
return c.getresponse()
def delete(self, uri):
c = self.connect()
c.request("DELETE", uri)
return c.getresponse()