import basura import simplejson, uuid from simplejson import dumps as tojson, loads as fromjson def request(environ, response): path = environ['PATH_INFO'].split('/',2) # /dbname or /dbname/ if len(path) == 2 or not path[2]: # create a database basura.dbopen(path[1], 'n') response('201 Created') return tojson({"ok":True}) # if the database doesn't exist, fail the request db = basura.dbexists(path[1]) if db == False: response('404 Not Found') return tojson({"error":{"id":"not_found","reason":"missing"}}) # parse the input stream data = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH'])) doc = fromjson(data.decode('utf-8')) doc["_id"] = path[2] # check for conflict if conflict(db, doc): response('409 Conflict') return tojson({"error":{"id":"conflict","reason":"conflict"}}) # determine status doc["_rev"] = str(uuid.uuid1()) stat = basura.doccheck(db, path[2], environ, '201 Created') etag, lmod = basura.docstat(doc) # update and reply response(stat, [('Etag', '"%s"' % etag), ('Last-Modified', lmod)]) if stat == '201 Created': db[path[2]] = doc return tojson({"ok":True, "_id":doc["_id"], "_rev":doc["_rev"]}) return '' def conflict(db, doc): if not db.has_key(doc['_id']): return False # what if doc.has_key('_rev')? if db[doc['_id']]['_rev'] == doc.get("_rev",''): return False return True