Revision 585b75e7 snf-pithos-backend/pithos/backends/lib/sqlalchemy/node.py
b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/node.py | ||
---|---|---|
122 | 122 |
ondelete='CASCADE', |
123 | 123 |
onupdate='CASCADE'), |
124 | 124 |
autoincrement=False)) |
125 |
columns.append(Column('latest_version', Integer)) |
|
125 | 126 |
columns.append(Column('path', String(2048), default='', nullable=False)) |
126 | 127 |
self.nodes = Table('nodes', metadata, *columns, mysql_engine='InnoDB') |
127 | 128 |
Index('idx_nodes_path', self.nodes.c.path, unique=True) |
129 |
Index('idx_nodes_parent', self.nodes.c.parent) |
|
128 | 130 |
|
129 | 131 |
#create policy table |
130 | 132 |
columns=[] |
... | ... | |
170 | 172 |
self.versions = Table('versions', metadata, *columns, mysql_engine='InnoDB') |
171 | 173 |
Index('idx_versions_node_mtime', self.versions.c.node, self.versions.c.mtime) |
172 | 174 |
Index('idx_versions_node_uuid', self.versions.c.uuid) |
175 |
Index('idx_versions_serial_cluster', self.versions.c.serial, self.versions.c.cluster) |
|
173 | 176 |
|
174 | 177 |
#create attributes table |
175 | 178 |
columns = [] |
... | ... | |
514 | 517 |
self.versions.c.uuid, |
515 | 518 |
self.versions.c.checksum, |
516 | 519 |
self.versions.c.cluster]) |
517 |
filtered = select([func.max(self.versions.c.serial)], |
|
518 |
self.versions.c.node == node) |
|
519 | 520 |
if before != inf: |
521 |
filtered = select([func.max(self.versions.c.serial)], |
|
522 |
self.versions.c.node == node) |
|
520 | 523 |
filtered = filtered.where(self.versions.c.mtime < before) |
524 |
else: |
|
525 |
filtered = select([self.nodes.c.latest_version], |
|
526 |
self.versions.c.node == node) |
|
521 | 527 |
s = s.where(and_(self.versions.c.cluster != except_cluster, |
522 | 528 |
self.versions.c.serial == filtered)) |
523 | 529 |
r = self.conn.execute(s) |
... | ... | |
532 | 538 |
s = select([func.count(v.c.serial), |
533 | 539 |
func.sum(v.c.size), |
534 | 540 |
func.max(v.c.mtime)]) |
535 |
c1 = select([func.max(self.versions.c.serial)]) |
|
536 | 541 |
if before != inf: |
542 |
c1 = select([func.max(self.versions.c.serial)]) |
|
537 | 543 |
c1 = c1.where(self.versions.c.mtime < before) |
544 |
c1.where(self.versions.c.node == v.c.node) |
|
545 |
else: |
|
546 |
c1 = select([self.nodes.c.latest_version]) |
|
547 |
c1.where(self.nodes.c.node == v.c.node) |
|
538 | 548 |
c2 = select([self.nodes.c.node], self.nodes.c.parent == node) |
539 |
s = s.where(and_(v.c.serial == c1.where(self.versions.c.node == v.c.node),
|
|
549 |
s = s.where(and_(v.c.serial == c1, |
|
540 | 550 |
v.c.cluster != except_cluster, |
541 | 551 |
v.c.node.in_(c2))) |
542 | 552 |
rp = self.conn.execute(s) |
... | ... | |
554 | 564 |
s = select([func.count(v.c.serial), |
555 | 565 |
func.sum(v.c.size), |
556 | 566 |
func.max(v.c.mtime)]) |
557 |
c1 = select([func.max(self.versions.c.serial)], |
|
558 |
self.versions.c.node == v.c.node) |
|
559 | 567 |
if before != inf: |
568 |
c1 = select([func.max(self.versions.c.serial)], |
|
569 |
self.versions.c.node == v.c.node) |
|
560 | 570 |
c1 = c1.where(self.versions.c.mtime < before) |
571 |
else: |
|
572 |
c1 = select([self.nodes.c.serial], |
|
573 |
self.nodes.c.node == v.c.node) |
|
561 | 574 |
c2 = select([self.nodes.c.node], self.nodes.c.path.like(self.escape_like(path) + '%', escape='\\')) |
562 | 575 |
s = s.where(and_(v.c.serial == c1, |
563 | 576 |
v.c.cluster != except_cluster, |
... | ... | |
571 | 584 |
mtime = max(mtime, r[2]) |
572 | 585 |
return (count, size, mtime) |
573 | 586 |
|
587 |
def nodes_set_latest_version(self, node, serial): |
|
588 |
s = self.nodes.update().where(self.nodes.c.node == node) |
|
589 |
s = s.values(latest_version = serial) |
|
590 |
self.conn.execute(s).close() |
|
591 |
|
|
574 | 592 |
def version_create(self, node, hash, size, type, source, muser, uuid, checksum, cluster=0): |
575 | 593 |
"""Create a new version from the given properties. |
576 | 594 |
Return the (serial, mtime) of the new version. |
... | ... | |
581 | 599 |
mtime=mtime, muser=muser, uuid=uuid, checksum=checksum, cluster=cluster) |
582 | 600 |
serial = self.conn.execute(s).inserted_primary_key[0] |
583 | 601 |
self.statistics_update_ancestors(node, 1, size, mtime, cluster) |
602 |
|
|
603 |
self.nodes_set_latest_version(node, serial) |
|
604 |
|
|
584 | 605 |
return serial, mtime |
585 | 606 |
|
586 | 607 |
def version_lookup(self, node, before=inf, cluster=0, all_props=True): |
... | ... | |
598 | 619 |
v.c.size, v.c.type, v.c.source, |
599 | 620 |
v.c.mtime, v.c.muser, v.c.uuid, |
600 | 621 |
v.c.checksum, v.c.cluster]) |
601 |
c = select([func.max(self.versions.c.serial)], |
|
602 |
self.versions.c.node == node) |
|
603 | 622 |
if before != inf: |
623 |
c = select([func.max(self.versions.c.serial)], |
|
624 |
self.versions.c.node == node) |
|
604 | 625 |
c = c.where(self.versions.c.mtime < before) |
626 |
else: |
|
627 |
c = select([self.nodes.c.latest_version], |
|
628 |
self.nodes.c.node == node) |
|
605 | 629 |
s = s.where(and_(v.c.serial == c, |
606 | 630 |
v.c.cluster == cluster)) |
607 | 631 |
r = self.conn.execute(s) |
... | ... | |
616 | 640 |
Return a list with their properties: |
617 | 641 |
(serial, node, hash, size, type, source, mtime, muser, uuid, checksum, cluster). |
618 | 642 |
""" |
619 |
|
|
643 |
if not nodes: |
|
644 |
return () |
|
620 | 645 |
v = self.versions.alias('v') |
621 | 646 |
if not all_props: |
622 | 647 |
s = select([v.c.serial]) |
... | ... | |
625 | 650 |
v.c.size, v.c.type, v.c.source, |
626 | 651 |
v.c.mtime, v.c.muser, v.c.uuid, |
627 | 652 |
v.c.checksum, v.c.cluster]) |
628 |
c = select([func.max(self.versions.c.serial)], |
|
629 |
self.versions.c.node.in_(nodes)).group_by(self.versions.c.node) |
|
630 | 653 |
if before != inf: |
654 |
c = select([func.max(self.versions.c.serial)], |
|
655 |
self.versions.c.node.in_(nodes)) |
|
631 | 656 |
c = c.where(self.versions.c.mtime < before) |
657 |
c = c.group_by(self.versions.c.node) |
|
658 |
else: |
|
659 |
c = select([self.nodes.c.latest_version], |
|
660 |
self.nodes.c.node.in_(nodes)) |
|
632 | 661 |
s = s.where(and_(v.c.serial.in_(c), |
633 | 662 |
v.c.cluster == cluster)) |
634 | 663 |
s = s.order_by(v.c.node) |
... | ... | |
706 | 735 |
|
707 | 736 |
s = self.versions.delete().where(self.versions.c.serial == serial) |
708 | 737 |
self.conn.execute(s).close() |
738 |
|
|
739 |
props = self.version_lookup(node, cluster=cluster, all_props=False) |
|
740 |
if props: |
|
741 |
self.nodes_set_latest_version(v.node, serial) |
|
742 |
|
|
709 | 743 |
return hash, size |
710 | 744 |
|
711 | 745 |
def attribute_get(self, serial, domain, keys=()): |
... | ... | |
799 | 833 |
v = self.versions.alias('v') |
800 | 834 |
n = self.nodes.alias('n') |
801 | 835 |
s = select([a.c.key]).distinct() |
802 |
filtered = select([func.max(self.versions.c.serial)]) |
|
803 | 836 |
if before != inf: |
837 |
filtered = select([func.max(self.versions.c.serial)]) |
|
804 | 838 |
filtered = filtered.where(self.versions.c.mtime < before) |
805 |
s = s.where(v.c.serial == filtered.where(self.versions.c.node == v.c.node)) |
|
839 |
filtered = filtered.where(self.versions.c.node == v.c.node) |
|
840 |
else: |
|
841 |
filtered = select([self.nodes.c.latest_version]) |
|
842 |
filtered = filtered.where(self.nodes.c.node == v.c.node) |
|
843 |
s = s.where(v.c.serial == filtered) |
|
806 | 844 |
s = s.where(v.c.cluster != except_cluster) |
807 | 845 |
s = s.where(v.c.node.in_(select([self.nodes.c.node], |
808 | 846 |
self.nodes.c.parent == parent))) |
... | ... | |
890 | 928 |
v.c.size, v.c.type, v.c.source, |
891 | 929 |
v.c.mtime, v.c.muser, v.c.uuid, |
892 | 930 |
v.c.checksum, v.c.cluster]).distinct() |
893 |
filtered = select([func.max(self.versions.c.serial)]) |
|
894 | 931 |
if before != inf: |
932 |
filtered = select([func.max(self.versions.c.serial)]) |
|
895 | 933 |
filtered = filtered.where(self.versions.c.mtime < before) |
896 |
s = s.where(v.c.serial == filtered.where(self.versions.c.node == v.c.node)) |
|
934 |
else: |
|
935 |
filtered = select([self.nodes.c.latest_version]) |
|
936 |
s = s.where(v.c.serial == filtered.where(self.nodes.c.node == v.c.node)) |
|
897 | 937 |
s = s.where(v.c.cluster != except_cluster) |
898 | 938 |
s = s.where(v.c.node.in_(select([self.nodes.c.node], |
899 | 939 |
self.nodes.c.parent == parent))) |
Also available in: Unified diff