Revision 70516d86 pithos/backends/lib_alchemy/node.py

b/pithos/backends/lib_alchemy/node.py
240 240
           Clears out nodes with no remaining versions.
241 241
        """
242 242
        #update statistics
243
        #TODO handle before=inf
244 243
        c1 = select([self.nodes.c.node],
245 244
            self.nodes.c.parent == parent)
246 245
        where_clause = and_(self.versions.c.node.in_(c1),
......
275 274
            and_(self.nodes.c.parent == parent,
276 275
                 select([func.count(self.versions.c.serial)],
277 276
                    self.versions.c.node == self.nodes.c.node).as_scalar() == 0))
278
        r = self.conn.execute(s)
279
        nodes = r.fetchall()
280
        r.close()
277
        rp = self.conn.execute(s)
278
        nodes = [r[0] for r in rp.fetchall()]
279
        rp.close()
281 280
        s = self.nodes.delete().where(self.nodes.c.node.in_(nodes))
282 281
        self.conn.execute(s).close()
283 282
        
......
388 387
        size += presize
389 388
        
390 389
        #insert or replace
390
        #TODO better upsert
391 391
        u = self.statistics.update().where(and_(self.statistics.c.node==node,
392 392
                                           self.statistics.c.cluster==cluster))
393 393
        u = u.values(population=population, size=size, mtime=mtime)
......
522 522
        r = self.conn.execute(s)
523 523
        props = r.fetchone()
524 524
        r.close()
525
        if not props:
525
        if props:
526 526
            return props
527 527
        return None
528 528
    
......
590 590
           Othwerise, return only those specified.
591 591
        """
592 592
        
593
        execute = self.execute
594 593
        if keys:
595 594
            attrs = self.attributes.alias()
596 595
            s = select([attrs.c.key, attrs.c.value])
......
609 608
        """Set the attributes of the version specified by serial.
610 609
           Receive attributes as an iterable of (key, value) pairs.
611 610
        """
612
        values = [{'serial':serial, 'key':k, 'value':v} for k, v in items]
613
        self.conn.execute(self.attributes.insert(), values).close()
611
        #insert or replace
612
        #TODO better upsert
613
        for k, v in items:
614
            s = self.attributes.update()
615
            s = s.where(and_(self.attributes.c.serial == serial,
616
                             self.attributes.c.key == k))
617
            s = s.values(value = v)
618
            rp = self.conn.execute(s)
619
            rp.close()
620
            if rp.rowcount == 0:
621
                s = self.attributes.insert()
622
                s = s.values(serial=serial, key=k, value=v)
623
                self.conn.execute(s).close()
614 624
    
615 625
    def attribute_del(self, serial, keys=()):
616 626
        """Delete attributes of the version specified by serial.
......
676 686
        if conj:
677 687
            s = s.where(or_(*conj))
678 688
        rp = self.conn.execute(s)
679
        r = rp.fetchall()
689
        rows = rp.fetchall()
680 690
        rp.close()
681
        return [r[0] for r in self.fetchall()]
691
        return [r[0] for r in rows]
682 692
    
683 693
    def latest_version_list(self, parent, prefix='', delimiter=None,
684 694
                            start='', limit=10000, before=inf,

Also available in: Unified diff