Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlite / public.py @ 3759eddb

History | View | Annotate | Download (4.2 kB)

1 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 2715ade4 Sofia Papagiannaki
#
3 a9b3f29d Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 a9b3f29d Antony Chazapis
# without modification, are permitted provided that the following
5 a9b3f29d Antony Chazapis
# conditions are met:
6 2715ade4 Sofia Papagiannaki
#
7 a9b3f29d Antony Chazapis
#   1. Redistributions of source code must retain the above
8 a9b3f29d Antony Chazapis
#      copyright notice, this list of conditions and the following
9 a9b3f29d Antony Chazapis
#      disclaimer.
10 2715ade4 Sofia Papagiannaki
#
11 a9b3f29d Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 a9b3f29d Antony Chazapis
#      copyright notice, this list of conditions and the following
13 a9b3f29d Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 a9b3f29d Antony Chazapis
#      provided with the distribution.
15 2715ade4 Sofia Papagiannaki
#
16 a9b3f29d Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a9b3f29d Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a9b3f29d Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a9b3f29d Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a9b3f29d Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a9b3f29d Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a9b3f29d Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a9b3f29d Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a9b3f29d Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a9b3f29d Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a9b3f29d Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a9b3f29d Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 2715ade4 Sofia Papagiannaki
#
29 a9b3f29d Antony Chazapis
# The views and conclusions contained in the software and
30 a9b3f29d Antony Chazapis
# documentation are those of the authors and should not be
31 a9b3f29d Antony Chazapis
# interpreted as representing official policies, either expressed
32 a9b3f29d Antony Chazapis
# or implied, of GRNET S.A.
33 a9b3f29d Antony Chazapis
34 a9b3f29d Antony Chazapis
from dbworker import DBWorker
35 a9b3f29d Antony Chazapis
36 4a105ce2 Sofia Papagiannaki
from pithos.backends.random_word import get_random_word
37 4a105ce2 Sofia Papagiannaki
38 4a105ce2 Sofia Papagiannaki
import logging
39 4a105ce2 Sofia Papagiannaki
40 4a105ce2 Sofia Papagiannaki
logger = logging.getLogger(__name__)
41 a9b3f29d Antony Chazapis
42 29148653 Sofia Papagiannaki
43 a9b3f29d Antony Chazapis
class Public(DBWorker):
44 a9b3f29d Antony Chazapis
    """Paths can be marked as public."""
45 2715ade4 Sofia Papagiannaki
46 a9b3f29d Antony Chazapis
    def __init__(self, **params):
47 a9b3f29d Antony Chazapis
        DBWorker.__init__(self, **params)
48 a9b3f29d Antony Chazapis
        execute = self.execute
49 2715ade4 Sofia Papagiannaki
50 a9b3f29d Antony Chazapis
        execute(""" create table if not exists public
51 bb4eafc6 Antony Chazapis
                          ( public_id integer primary key autoincrement,
52 af75e8a5 Antony Chazapis
                            path      text not null,
53 56f3c759 Sofia Papagiannaki
                            active    boolean not null default 1,
54 56f3c759 Sofia Papagiannaki
                            url       text) """)
55 bb4eafc6 Antony Chazapis
        execute(""" create unique index if not exists idx_public_path
56 bb4eafc6 Antony Chazapis
                    on public(path) """)
57 56f3c759 Sofia Papagiannaki
        execute(""" create unique index if not exists idx_public_url
58 56f3c759 Sofia Papagiannaki
                    on public(url) """)
59 2715ade4 Sofia Papagiannaki
60 4a105ce2 Sofia Papagiannaki
    def get_unique_url(self, public_url_security, public_url_alphabet):
61 4a105ce2 Sofia Papagiannaki
        l = public_url_security
62 56f3c759 Sofia Papagiannaki
        while 1:
63 4a105ce2 Sofia Papagiannaki
            candidate = get_random_word(length=l, alphabet=public_url_alphabet)
64 56f3c759 Sofia Papagiannaki
            if self.public_path(candidate) is None:
65 56f3c759 Sofia Papagiannaki
                return candidate
66 29148653 Sofia Papagiannaki
            l += 1
67 56f3c759 Sofia Papagiannaki
68 4a105ce2 Sofia Papagiannaki
    def public_set(self, path, public_url_security, public_url_alphabet):
69 56f3c759 Sofia Papagiannaki
        q = "select public_id from public where path = ?"
70 af75e8a5 Antony Chazapis
        self.execute(q, (path,))
71 56f3c759 Sofia Papagiannaki
        row = self.fetchone()
72 56f3c759 Sofia Papagiannaki
73 56f3c759 Sofia Papagiannaki
        if not row:
74 56f3c759 Sofia Papagiannaki
            url = self.get_unique_url(
75 4a105ce2 Sofia Papagiannaki
                public_url_security, public_url_alphabet
76 56f3c759 Sofia Papagiannaki
            )
77 4a105ce2 Sofia Papagiannaki
            q = "insert into public(path, active, url) values(?, 1, ?)"
78 4a105ce2 Sofia Papagiannaki
            self.execute(q, (path, url))
79 3d5906fe Giorgos Korfiatis
            logger.info('Public url set for path: %s' % path)
80 2715ade4 Sofia Papagiannaki
81 a9b3f29d Antony Chazapis
    def public_unset(self, path):
82 56f3c759 Sofia Papagiannaki
        q = "delete from public where path = ?"
83 7a65e284 Sofia Papagiannaki
        c = self.execute(q, (path,))
84 7a65e284 Sofia Papagiannaki
        if c.rowcount != 0:
85 7a65e284 Sofia Papagiannaki
            logger.info('Public url unset for path: %s' % path)
86 2715ade4 Sofia Papagiannaki
87 4d15c94e Sofia Papagiannaki
    def public_unset_bulk(self, paths):
88 4d15c94e Sofia Papagiannaki
        placeholders = ','.join('?' for path in paths)
89 4a105ce2 Sofia Papagiannaki
        q = "delete from public where path in (%s)" % placeholders
90 4d15c94e Sofia Papagiannaki
        self.execute(q, paths)
91 2715ade4 Sofia Papagiannaki
92 bb4eafc6 Antony Chazapis
    def public_get(self, path):
93 56f3c759 Sofia Papagiannaki
        q = "select url from public where path = ? and active = 1"
94 a9b3f29d Antony Chazapis
        self.execute(q, (path,))
95 bb4eafc6 Antony Chazapis
        row = self.fetchone()
96 bb4eafc6 Antony Chazapis
        if row:
97 bb4eafc6 Antony Chazapis
            return row[0]
98 bb4eafc6 Antony Chazapis
        return None
99 2715ade4 Sofia Papagiannaki
100 15a96c3e Antony Chazapis
    def public_list(self, prefix):
101 29148653 Sofia Papagiannaki
        q = ("select path, url from public where "
102 29148653 Sofia Papagiannaki
             "path like ? escape '\\' and active = 1")
103 15a96c3e Antony Chazapis
        self.execute(q, (self.escape_like(prefix) + '%',))
104 15a96c3e Antony Chazapis
        return self.fetchall()
105 2715ade4 Sofia Papagiannaki
106 bb4eafc6 Antony Chazapis
    def public_path(self, public):
107 56f3c759 Sofia Papagiannaki
        q = "select path from public where url = ? and active = 1"
108 bb4eafc6 Antony Chazapis
        self.execute(q, (public,))
109 bb4eafc6 Antony Chazapis
        row = self.fetchone()
110 bb4eafc6 Antony Chazapis
        if row:
111 bb4eafc6 Antony Chazapis
            return row[0]
112 bb4eafc6 Antony Chazapis
        return None