Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / public.py @ 8221c89d

History | View | Annotate | Download (4.2 kB)

1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
# 
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
# 
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
# 
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
# 
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
# 
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from dbworker import DBWorker
35
from sqlalchemy import Table, Column, String, Integer, Boolean, MetaData
36
from sqlalchemy.sql import and_, select
37
from sqlalchemy.schema import Index
38

    
39

    
40
class Public(DBWorker):
41
    """Paths can be marked as public."""
42
    
43
    def __init__(self, **params):
44
        DBWorker.__init__(self, **params)
45
        metadata = MetaData()
46
        columns=[]
47
        columns.append(Column('public_id', Integer, primary_key=True))
48
        columns.append(Column('path', String(2048), nullable=False))
49
        columns.append(Column('active', Boolean, nullable=False, default=True))
50
        self.public = Table('public', metadata, *columns, mysql_engine='InnoDB', sqlite_autoincrement=True)
51
        # place an index on path
52
        Index('idx_public_path', self.public.c.path, unique=True)
53
        metadata.create_all(self.engine)
54
    
55
    def public_set(self, path):
56
        s = select([self.public.c.public_id])
57
        s = s.where(self.public.c.path == path)
58
        r = self.conn.execute(s)
59
        row = r.fetchone()
60
        r.close()
61
        if row:
62
            s = self.public.update().where(self.public.c.public_id == row[0])
63
            s = s.values(active=True)
64
        else:
65
            s = self.public.insert()
66
            s = s.values(path=path, active=True)
67
        r = self.conn.execute(s)
68
        r.close()
69
    
70
    def public_unset(self, path):
71
        s = self.public.update()
72
        s = s.where(self.public.c.path == path)
73
        s = s.values(active=False)
74
        r = self.conn.execute(s)
75
        r.close()
76
    
77
    def public_unset_bulk(self, paths):
78
        s = self.public.update()
79
        s = s.where(self.public.c.path.in_(paths))
80
        s = s.values(active=False)
81
        r = self.conn.execute(s)
82
        r.close()
83
    
84
    def public_get(self, path):
85
        s = select([self.public.c.public_id])
86
        s = s.where(and_(self.public.c.path == path,
87
                         self.public.c.active == True))
88
        r = self.conn.execute(s)
89
        row = r.fetchone()
90
        r.close()
91
        if row:
92
            return row[0]
93
        return None
94
    
95
    def public_list(self, prefix):
96
        s = select([self.public.c.path, self.public.c.public_id])
97
        s = s.where(self.public.c.path.like(self.escape_like(prefix) + '%', escape='\\'))
98
        s = s.where(self.public.c.active == True)
99
        r = self.conn.execute(s)
100
        rows = r.fetchall()
101
        r.close()
102
        return rows
103
    
104
    def public_path(self, public):
105
        s = select([self.public.c.path])
106
        s = s.where(and_(self.public.c.public_id == public,
107
                         self.public.c.active == True))
108
        r = self.conn.execute(s)
109
        row = r.fetchone()
110
        r.close()
111
        if row:
112
            return row[0]
113
        return None