Beispiel #1
0
    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="%"))
Beispiel #2
0
    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']
Beispiel #3
0
    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']
Beispiel #4
0
    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']
Beispiel #5
0
    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)
Beispiel #6
0
 def __delitem__(self, dbname):
     return self.res.delete('/%s/' % resource.url_quote(dbname, safe=":"))