Exemplo n.º 1
0
class Collection(object):
    
    def __init__(self, dbcon, cname):
        self.dbcon = dbcon
        self.queries = CollectionQueries(self.dbcon, cname)
        self.cname = cname
        
        self.__init_table()
    
        self.indexed_fields = set()
        self.indexes = dict()
    
    
    def add_index(self, field):
        self.indexed_fields.add(field)
        self.index.__dict__[field] = self.index(field)
        
        
    def name(self):
        return self.cname
        
    
    def save(self, doc):
        
        is_new = False        
        
        if not doc.has_key('uuid'):
            is_new = True
            doc['uuid'] = uuid.uuid1().hex
        
        doc_json = json.dumps(doc)
        
        pk = doc['uuid']
        
        if is_new:
            self.queries.insert_doc(pk, doc_json)
        
        else:
            self.queries.update_doc(pk, doc_json)
        
                
        self.update_indexes(doc)        
        
        return pk
        
    
    def update_indexes(self, doc):
        uuid = doc.get('uuid')

        if uuid is None:
            raise ValueError("Expected key 'uuid' in document")
    
        for field in self.indexed_fields:
            i = self.index(field)
            i.unlink(uuid)
            if doc.has_key(field):
                i.link(doc[field], uuid)
    
    def delete_indexes(self, uuid):
        for field in self.indexed_fields:
            i = self.index(field)
            i.unlink(uuid)
            

    def load(self, uuid):
        
        body = self.queries.get_doc(uuid)
        
        if body is None:
            return None
            
        doc = json.loads(body)
        
        return doc


    def delete(self, uuid):
        
        if type(uuid) == dict:
            uuid = uuid['uuid']
        
        res = self.queries.delete_doc(uuid)
        
        self.delete_indexes(uuid)
        
        return res
    
    
    def index(self, field):
        index = self.indexes.get(field, None)
        
        if index is None:
            index = Index(self.dbcon, self, field)
            self.indexes[field] = index
            
        return index
        
    
    def __init_table(self):

        if not self.queries.table_exists():
            self.queries.create_table()