Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.2 kB)

1 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 2715ade4 Sofia Papagiannaki
#
3 4f917833 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 4f917833 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 4f917833 Sofia Papagiannaki
# conditions are met:
6 2715ade4 Sofia Papagiannaki
#
7 4f917833 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 4f917833 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 4f917833 Sofia Papagiannaki
#      disclaimer.
10 2715ade4 Sofia Papagiannaki
#
11 4f917833 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 4f917833 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 4f917833 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 4f917833 Sofia Papagiannaki
#      provided with the distribution.
15 2715ade4 Sofia Papagiannaki
#
16 4f917833 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 4f917833 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 4f917833 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 4f917833 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 4f917833 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 4f917833 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 4f917833 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 4f917833 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 4f917833 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 4f917833 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 4f917833 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 4f917833 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 2715ade4 Sofia Papagiannaki
#
29 4f917833 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 4f917833 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 4f917833 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 4f917833 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 4f917833 Sofia Papagiannaki
34 4f917833 Sofia Papagiannaki
from dbworker import DBWorker
35 af75e8a5 Antony Chazapis
from sqlalchemy import Table, Column, String, Integer, Boolean, MetaData
36 af75e8a5 Antony Chazapis
from sqlalchemy.sql import and_, select
37 bb4eafc6 Antony Chazapis
from sqlalchemy.schema import Index
38 6a82f89f Sofia Papagiannaki
from sqlalchemy.exc import NoSuchTableError
39 bb4eafc6 Antony Chazapis
40 4a105ce2 Sofia Papagiannaki
from pithos.backends.random_word import get_random_word
41 4a105ce2 Sofia Papagiannaki
42 235a4227 Sofia Papagiannaki
from dbworker import ESCAPE_CHAR
43 235a4227 Sofia Papagiannaki
44 4a105ce2 Sofia Papagiannaki
import logging
45 4a105ce2 Sofia Papagiannaki
46 4a105ce2 Sofia Papagiannaki
logger = logging.getLogger(__name__)
47 2715ade4 Sofia Papagiannaki
48 29148653 Sofia Papagiannaki
49 6a82f89f Sofia Papagiannaki
def create_tables(engine):
50 6a82f89f Sofia Papagiannaki
    metadata = MetaData()
51 2715ade4 Sofia Papagiannaki
    columns = []
52 6a82f89f Sofia Papagiannaki
    columns.append(Column('public_id', Integer, primary_key=True))
53 6a82f89f Sofia Papagiannaki
    columns.append(Column('path', String(2048), nullable=False))
54 6a82f89f Sofia Papagiannaki
    columns.append(Column('active', Boolean, nullable=False, default=True))
55 56f3c759 Sofia Papagiannaki
    columns.append(Column('url', String(2048), nullable=True))
56 2715ade4 Sofia Papagiannaki
    public = Table('public', metadata, *columns, mysql_engine='InnoDB',
57 2715ade4 Sofia Papagiannaki
                   sqlite_autoincrement=True)
58 6a82f89f Sofia Papagiannaki
    # place an index on path
59 6a82f89f Sofia Papagiannaki
    Index('idx_public_path', public.c.path, unique=True)
60 56f3c759 Sofia Papagiannaki
    # place an index on url
61 56f3c759 Sofia Papagiannaki
    Index('idx_public_url', public.c.url, unique=True)
62 6a82f89f Sofia Papagiannaki
    metadata.create_all(engine)
63 6a82f89f Sofia Papagiannaki
    return metadata.sorted_tables
64 4f917833 Sofia Papagiannaki
65 2715ade4 Sofia Papagiannaki
66 4f917833 Sofia Papagiannaki
class Public(DBWorker):
67 4f917833 Sofia Papagiannaki
    """Paths can be marked as public."""
68 2715ade4 Sofia Papagiannaki
69 4f917833 Sofia Papagiannaki
    def __init__(self, **params):
70 4f917833 Sofia Papagiannaki
        DBWorker.__init__(self, **params)
71 6a82f89f Sofia Papagiannaki
        try:
72 6a82f89f Sofia Papagiannaki
            metadata = MetaData(self.engine)
73 6a82f89f Sofia Papagiannaki
            self.public = Table('public', metadata, autoload=True)
74 6a82f89f Sofia Papagiannaki
        except NoSuchTableError:
75 6a82f89f Sofia Papagiannaki
            tables = create_tables(self.engine)
76 6a82f89f Sofia Papagiannaki
            map(lambda t: self.__setattr__(t.name, t), tables)
77 2715ade4 Sofia Papagiannaki
78 4a105ce2 Sofia Papagiannaki
    def get_unique_url(self, public_security, public_url_alphabet):
79 4a105ce2 Sofia Papagiannaki
        l = public_security
80 56f3c759 Sofia Papagiannaki
        while 1:
81 4a105ce2 Sofia Papagiannaki
            candidate = get_random_word(length=l, alphabet=public_url_alphabet)
82 56f3c759 Sofia Papagiannaki
            if self.public_path(candidate) is None:
83 56f3c759 Sofia Papagiannaki
                return candidate
84 29148653 Sofia Papagiannaki
            l += 1
85 56f3c759 Sofia Papagiannaki
86 4a105ce2 Sofia Papagiannaki
    def public_set(self, path, public_security, public_url_alphabet):
87 af75e8a5 Antony Chazapis
        s = select([self.public.c.public_id])
88 a68d51a4 Sofia Papagiannaki
        s = s.where(self.public.c.path == path)
89 2ce96391 Sofia Papagiannaki
        r = self.conn.execute(s)
90 af75e8a5 Antony Chazapis
        row = r.fetchone()
91 4f917833 Sofia Papagiannaki
        r.close()
92 56f3c759 Sofia Papagiannaki
93 56f3c759 Sofia Papagiannaki
        if not row:
94 4a105ce2 Sofia Papagiannaki
            url = self.get_unique_url(
95 4a105ce2 Sofia Papagiannaki
                public_security, public_url_alphabet
96 4a105ce2 Sofia Papagiannaki
            )
97 2ce96391 Sofia Papagiannaki
            s = self.public.insert()
98 4a105ce2 Sofia Papagiannaki
            s = s.values(path=path, active=True, url=url)
99 56f3c759 Sofia Papagiannaki
            r = self.conn.execute(s)
100 56f3c759 Sofia Papagiannaki
            r.close()
101 7a65e284 Sofia Papagiannaki
            logger.info('Public url set for path: %s' % path)
102 2715ade4 Sofia Papagiannaki
103 4f917833 Sofia Papagiannaki
    def public_unset(self, path):
104 56f3c759 Sofia Papagiannaki
        s = self.public.delete()
105 af75e8a5 Antony Chazapis
        s = s.where(self.public.c.path == path)
106 7a65e284 Sofia Papagiannaki
        r = self.conn.execute(s)
107 7a65e284 Sofia Papagiannaki
        if r.rowcount != 0:
108 7a65e284 Sofia Papagiannaki
            logger.info('Public url unset for path: %s' % path)
109 7a65e284 Sofia Papagiannaki
        r.close()
110 2715ade4 Sofia Papagiannaki
111 8221c89d Sofia Papagiannaki
    def public_unset_bulk(self, paths):
112 c53502b1 Sofia Papagiannaki
        if not paths:
113 c53502b1 Sofia Papagiannaki
            return
114 56f3c759 Sofia Papagiannaki
        s = self.public.delete()
115 8221c89d Sofia Papagiannaki
        s = s.where(self.public.c.path.in_(paths))
116 56f3c759 Sofia Papagiannaki
        self.conn.execute(s).close()
117 2715ade4 Sofia Papagiannaki
118 bb4eafc6 Antony Chazapis
    def public_get(self, path):
119 56f3c759 Sofia Papagiannaki
        s = select([self.public.c.url])
120 af75e8a5 Antony Chazapis
        s = s.where(and_(self.public.c.path == path,
121 fbafd482 Sofia Papagiannaki
                         self.public.c.active == True))
122 bb4eafc6 Antony Chazapis
        r = self.conn.execute(s)
123 bb4eafc6 Antony Chazapis
        row = r.fetchone()
124 bb4eafc6 Antony Chazapis
        r.close()
125 bb4eafc6 Antony Chazapis
        if row:
126 bb4eafc6 Antony Chazapis
            return row[0]
127 bb4eafc6 Antony Chazapis
        return None
128 2715ade4 Sofia Papagiannaki
129 15a96c3e Antony Chazapis
    def public_list(self, prefix):
130 56f3c759 Sofia Papagiannaki
        s = select([self.public.c.path, self.public.c.url])
131 2715ade4 Sofia Papagiannaki
        s = s.where(self.public.c.path.like(
132 235a4227 Sofia Papagiannaki
            self.escape_like(prefix) + '%', escape=ESCAPE_CHAR))
133 fbafd482 Sofia Papagiannaki
        s = s.where(self.public.c.active == True)
134 15a96c3e Antony Chazapis
        r = self.conn.execute(s)
135 15a96c3e Antony Chazapis
        rows = r.fetchall()
136 15a96c3e Antony Chazapis
        r.close()
137 15a96c3e Antony Chazapis
        return rows
138 2715ade4 Sofia Papagiannaki
139 bb4eafc6 Antony Chazapis
    def public_path(self, public):
140 af75e8a5 Antony Chazapis
        s = select([self.public.c.path])
141 56f3c759 Sofia Papagiannaki
        s = s.where(and_(self.public.c.url == public,
142 fbafd482 Sofia Papagiannaki
                         self.public.c.active == True))
143 4f917833 Sofia Papagiannaki
        r = self.conn.execute(s)
144 bb4eafc6 Antony Chazapis
        row = r.fetchone()
145 4f917833 Sofia Papagiannaki
        r.close()
146 bb4eafc6 Antony Chazapis
        if row:
147 bb4eafc6 Antony Chazapis
            return row[0]
148 bb4eafc6 Antony Chazapis
        return None