Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlite / public.py @ 4a105ce2

History | View | Annotate | Download (4.1 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 a9b3f29d Antony Chazapis
class Public(DBWorker):
43 a9b3f29d Antony Chazapis
    """Paths can be marked as public."""
44 2715ade4 Sofia Papagiannaki
45 a9b3f29d Antony Chazapis
    def __init__(self, **params):
46 a9b3f29d Antony Chazapis
        DBWorker.__init__(self, **params)
47 a9b3f29d Antony Chazapis
        execute = self.execute
48 2715ade4 Sofia Papagiannaki
49 a9b3f29d Antony Chazapis
        execute(""" create table if not exists public
50 bb4eafc6 Antony Chazapis
                          ( public_id integer primary key autoincrement,
51 af75e8a5 Antony Chazapis
                            path      text not null,
52 56f3c759 Sofia Papagiannaki
                            active    boolean not null default 1,
53 56f3c759 Sofia Papagiannaki
                            url       text) """)
54 bb4eafc6 Antony Chazapis
        execute(""" create unique index if not exists idx_public_path
55 bb4eafc6 Antony Chazapis
                    on public(path) """)
56 56f3c759 Sofia Papagiannaki
        execute(""" create unique index if not exists idx_public_url
57 56f3c759 Sofia Papagiannaki
                    on public(url) """)
58 2715ade4 Sofia Papagiannaki
59 4a105ce2 Sofia Papagiannaki
    def get_unique_url(self, public_url_security, public_url_alphabet):
60 4a105ce2 Sofia Papagiannaki
        l = public_url_security
61 56f3c759 Sofia Papagiannaki
        while 1:
62 4a105ce2 Sofia Papagiannaki
            candidate = get_random_word(length=l, alphabet=public_url_alphabet)
63 56f3c759 Sofia Papagiannaki
            if self.public_path(candidate) is None:
64 56f3c759 Sofia Papagiannaki
                return candidate
65 56f3c759 Sofia Papagiannaki
            l +=1
66 56f3c759 Sofia Papagiannaki
67 4a105ce2 Sofia Papagiannaki
    def public_set(self, path, public_url_security, public_url_alphabet):
68 56f3c759 Sofia Papagiannaki
        q = "select public_id from public where path = ?"
69 af75e8a5 Antony Chazapis
        self.execute(q, (path,))
70 56f3c759 Sofia Papagiannaki
        row = self.fetchone()
71 56f3c759 Sofia Papagiannaki
72 56f3c759 Sofia Papagiannaki
        if not row:
73 56f3c759 Sofia Papagiannaki
            url = self.get_unique_url(
74 4a105ce2 Sofia Papagiannaki
                public_url_security, public_url_alphabet
75 56f3c759 Sofia Papagiannaki
            )
76 4a105ce2 Sofia Papagiannaki
            q = "insert into public(path, active, url) values(?, 1, ?)"
77 4a105ce2 Sofia Papagiannaki
            self.execute(q, (path, url))
78 4a105ce2 Sofia Papagiannaki
            logger.info('Public url: %s set for path: %s' % (url, path))
79 2715ade4 Sofia Papagiannaki
80 a9b3f29d Antony Chazapis
    def public_unset(self, path):
81 56f3c759 Sofia Papagiannaki
        q = "delete from public where path = ?"
82 a9b3f29d Antony Chazapis
        self.execute(q, (path,))
83 4a105ce2 Sofia Papagiannaki
        logger.info('Public url unset for path: %s' % (path))
84 2715ade4 Sofia Papagiannaki
85 4d15c94e Sofia Papagiannaki
    def public_unset_bulk(self, paths):
86 4d15c94e Sofia Papagiannaki
        placeholders = ','.join('?' for path in paths)
87 4a105ce2 Sofia Papagiannaki
        q = "delete from public where path in (%s)" % placeholders
88 4d15c94e Sofia Papagiannaki
        self.execute(q, paths)
89 2715ade4 Sofia Papagiannaki
90 bb4eafc6 Antony Chazapis
    def public_get(self, path):
91 56f3c759 Sofia Papagiannaki
        q = "select url from public where path = ? and active = 1"
92 a9b3f29d Antony Chazapis
        self.execute(q, (path,))
93 bb4eafc6 Antony Chazapis
        row = self.fetchone()
94 bb4eafc6 Antony Chazapis
        if row:
95 bb4eafc6 Antony Chazapis
            return row[0]
96 bb4eafc6 Antony Chazapis
        return None
97 2715ade4 Sofia Papagiannaki
98 15a96c3e Antony Chazapis
    def public_list(self, prefix):
99 56f3c759 Sofia Papagiannaki
        q = "select path, url from public where path like ? escape '\\' and active = 1"
100 15a96c3e Antony Chazapis
        self.execute(q, (self.escape_like(prefix) + '%',))
101 15a96c3e Antony Chazapis
        return self.fetchall()
102 2715ade4 Sofia Papagiannaki
103 bb4eafc6 Antony Chazapis
    def public_path(self, public):
104 56f3c759 Sofia Papagiannaki
        q = "select path from public where url = ? and active = 1"
105 bb4eafc6 Antony Chazapis
        self.execute(q, (public,))
106 bb4eafc6 Antony Chazapis
        row = self.fetchone()
107 bb4eafc6 Antony Chazapis
        if row:
108 bb4eafc6 Antony Chazapis
            return row[0]
109 bb4eafc6 Antony Chazapis
        return None