def __init__(self, ui, dburl, server=None, create=False): """Constructor for Database @param dburl: string, full encoded dburl @param server: Server instance """ if server is not None and not hasattr(server, 'next_uuid'): raise TypeError('%s is not a couchapp.http.Server instance' % server.__class__.__name__) if dburl.endswith("/"): dburl = dburl[:-1] self.url = dburl server_url, dbname = dburl.rsplit("/", 1) self.dbname = urllib.unquote(dbname) self.ui = ui if server is None: server = Server(ui, server_url) if create and not self.dbname in server.all_dbs(): try: res = server.res.put('/%s/' % dbname) if ui.verbose >= 1 and res['ok']: self.ui.logger.info("database %s created." % dbname) except PreconditionFailed: if self.ui.verbose >= 1: self.ui.logger.info("database %s not created, already exists" % dbname) self.server = server self.res = server.res.clone() if "/" in dbname: self.res.client.safe = ":/%" self.res.update_uri('/%s' % resource.url_quote(dbname, safe="%"))
def put_attachment(self, doc, content, name=None, content_type=None, content_length=None): """ Add attachement to a document. All attachments are streamed. @param doc: dict, document object @param content: string or :obj:`File` object. @param name: name or attachment (file name). @param content_type: string, mimetype of attachment. If you don't set it, it will be autodetected. @param content_lenght: int, size of attachment. @return: bool, True if everything was ok. Example: >>> from simplecouchdb import server >>> server = server() >>> db = server.create_db('couchapp_test') >>> doc = { 'string': 'test', 'number': 4 } >>> db.save(doc) >>> text_attachment = u'un texte attaché' >>> db.put_attachment(doc, text_attachment, "test", "text/plain") True >>> file = db.fetch_attachment(doc, 'test') >>> result = db.delete_attachment(doc, 'test') >>> result['ok'] True >>> db.fetch_attachment(doc, 'test') >>> del server['couchapp_test'] {u'ok': True} """ headers = {} if not content: content = "" content_length = 0 if name is None: if hasattr(content, "name"): name = content.name else: raise InvalidAttachment('You should provid a valid attachment name') name = resource.url_quote(name, safe="") if content_type is None: content_type = ';'.join(filter(None, mimetypes.guess_type(name))) if content_type: headers['Content-Type'] = content_type # add appropriate headers if content_length and content_length is not None: headers['Content-Length'] = content_length result = self.res(resource.escape_docid(doc['_id'])).put(name, payload=content, headers=headers, rev=doc['_rev']) if result['ok']: doc.update({ '_rev': result['rev']}) return result['ok']
def create_db(self, dbname): """ Create a database on CouchDb host @param dname: str, name of db @return: Database instance if it's ok or dict message """ _dbname = resource.url_quote(dbname, safe="") res = self.res.put('/%s/' % _dbname) if res['ok']: dburl = resource.make_uri(self.url, "/%s" % _dbname) return Database(self.ui, dburl, server=self) return res['ok']
def delete_attachment(self, doc, name): """ delete attachement to the document @param doc: dict, document object in python @param name: name of attachement @return: dict, with member ok set to True if delete was ok. """ name = resource.url_quote(name, safe="") res = self.res(resource.escape_docid(doc['_id'])).delete(name, rev=doc['_rev']) if res['ok']: doc.update({ '_rev': res['rev']}) return res['ok']
def fetch_attachment(self, id_or_doc, name, stream=False): """ get attachment in a document @param id_or_doc: str or dict, doc id or document dict @param name: name of attachment default: default result @param stream: boolean, response return a ResponseStream object @param stream_size: int, size in bytes of response stream block @return: str, attachment """ if isinstance(id_or_doc, basestring): docid = id_or_doc else: docid = id_or_doc['_id'] name = resource.url_quote(name, safe="") return self.res(resource.escape_docid(docid)).get(name, _stream=stream)
def __delitem__(self, dbname): return self.res.delete('/%s/' % resource.url_quote(dbname, safe=":"))