Merge branch 'next'
[pithos] / snf-pithos-backend / pithos / backends / lib / sqlalchemy / public.py
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