Revision 6a82f89f snf-pithos-backend/pithos/backends/lib/sqlalchemy/xfeatures.py

b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/xfeatures.py
36 36
from sqlalchemy.sql import select, and_
37 37
from sqlalchemy.schema import Index
38 38
from sqlalchemy.sql.expression import desc
39
from sqlalchemy.exc import NoSuchTableError
39 40

  
40 41
from dbworker import DBWorker
41 42

  
43
def create_tables(engine):
44
    metadata = MetaData()
45
    columns=[]
46
    columns.append(Column('feature_id', Integer, primary_key=True))
47
    columns.append(Column('path', String(2048)))
48
    xfeatures = Table('xfeatures', metadata, *columns, mysql_engine='InnoDB')
49
    # place an index on path
50
    Index('idx_features_path', xfeatures.c.path, unique=True)
51
    
52
    columns=[]
53
    columns.append(Column('feature_id', Integer,
54
                          ForeignKey('xfeatures.feature_id',
55
                                     ondelete='CASCADE'),
56
                          primary_key=True))
57
    columns.append(Column('key', Integer, primary_key=True,
58
                          autoincrement=False))
59
    columns.append(Column('value', String(256), primary_key=True))
60
    xfeaturevals = Table('xfeaturevals', metadata, *columns, mysql_engine='InnoDB')
61
    
62
    metadata.create_all(engine)
63
    return metadata.sorted_tables
42 64

  
43 65
class XFeatures(DBWorker):
44 66
    """XFeatures are path properties that allow non-nested
......
47 69
    
48 70
    def __init__(self, **params):
49 71
        DBWorker.__init__(self, **params)
50
        metadata = MetaData()
51
        columns=[]
52
        columns.append(Column('feature_id', Integer, primary_key=True))
53
        columns.append(Column('path', String(2048)))
54
        self.xfeatures = Table('xfeatures', metadata, *columns, mysql_engine='InnoDB')
55
        # place an index on path
56
        Index('idx_features_path', self.xfeatures.c.path, unique=True)
57
        
58
        columns=[]
59
        columns.append(Column('feature_id', Integer,
60
                              ForeignKey('xfeatures.feature_id',
61
                                         ondelete='CASCADE'),
62
                              primary_key=True))
63
        columns.append(Column('key', Integer, primary_key=True,
64
                              autoincrement=False))
65
        columns.append(Column('value', String(256), primary_key=True))
66
        self.xfeaturevals = Table('xfeaturevals', metadata, *columns, mysql_engine='InnoDB')
67
        
68
        metadata.create_all(self.engine)
72
        try:
73
            metadata = MetaData(self.engine)
74
            self.xfeatures = Table('xfeatures', metadata, autoload=True)
75
            self.xfeaturevals = Table('xfeaturevals', metadata, autoload=True)
76
        except NoSuchTableError:
77
            tables = create_tables(self.engine)
78
            map(lambda t: self.__setattr__(t.name, t), tables)
69 79
    
70 80
#     def xfeature_inherit(self, path):
71 81
#         """Return the (path, feature) inherited by the path, or None."""

Also available in: Unified diff