Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / quotaholder_serials.py @ 4a7b190f

History | View | Annotate | Download (3.7 kB)

1 6540c590 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 6540c590 Sofia Papagiannaki
#
3 6540c590 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 6540c590 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 6540c590 Sofia Papagiannaki
# conditions are met:
6 6540c590 Sofia Papagiannaki
#
7 6540c590 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 6540c590 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 6540c590 Sofia Papagiannaki
#      disclaimer.
10 6540c590 Sofia Papagiannaki
#
11 6540c590 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 6540c590 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 6540c590 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 6540c590 Sofia Papagiannaki
#      provided with the distribution.
15 6540c590 Sofia Papagiannaki
#
16 6540c590 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 6540c590 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 6540c590 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 6540c590 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 6540c590 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 6540c590 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 6540c590 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 6540c590 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 6540c590 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 6540c590 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 6540c590 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 6540c590 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 6540c590 Sofia Papagiannaki
#
29 6540c590 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 6540c590 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 6540c590 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 6540c590 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 6540c590 Sofia Papagiannaki
34 6540c590 Sofia Papagiannaki
from sqlalchemy import Table, Column, MetaData
35 6540c590 Sofia Papagiannaki
from sqlalchemy.types import BigInteger
36 6540c590 Sofia Papagiannaki
from sqlalchemy.sql import select
37 6540c590 Sofia Papagiannaki
from sqlalchemy.exc import NoSuchTableError
38 6540c590 Sofia Papagiannaki
39 6540c590 Sofia Papagiannaki
from dbworker import DBWorker
40 6540c590 Sofia Papagiannaki
41 29148653 Sofia Papagiannaki
42 6540c590 Sofia Papagiannaki
def create_tables(engine):
43 6540c590 Sofia Papagiannaki
    metadata = MetaData()
44 6540c590 Sofia Papagiannaki
    columns = []
45 6540c590 Sofia Papagiannaki
    columns.append(Column('serial', BigInteger, primary_key=True))
46 613659fc Sofia Papagiannaki
    Table('qh_serials', metadata, *columns, mysql_engine='InnoDB')
47 613659fc Sofia Papagiannaki
48 6540c590 Sofia Papagiannaki
    metadata.create_all(engine)
49 6540c590 Sofia Papagiannaki
    return metadata.sorted_tables
50 6540c590 Sofia Papagiannaki
51 29148653 Sofia Papagiannaki
52 cb787cc4 Sofia Papagiannaki
class QuotaholderSerial(DBWorker):
53 cb787cc4 Sofia Papagiannaki
    """QuotaholderSerial keeps track of quota holder serials.
54 6540c590 Sofia Papagiannaki
    """
55 6540c590 Sofia Papagiannaki
56 6540c590 Sofia Papagiannaki
    def __init__(self, **params):
57 6540c590 Sofia Papagiannaki
        DBWorker.__init__(self, **params)
58 6540c590 Sofia Papagiannaki
        try:
59 6540c590 Sofia Papagiannaki
            metadata = MetaData(self.engine)
60 6a5ca445 Sofia Papagiannaki
            self.qh_serials = Table('qh_serials', metadata, autoload=True)
61 6540c590 Sofia Papagiannaki
        except NoSuchTableError:
62 6540c590 Sofia Papagiannaki
            tables = create_tables(self.engine)
63 6540c590 Sofia Papagiannaki
            map(lambda t: self.__setattr__(t.name, t), tables)
64 6540c590 Sofia Papagiannaki
65 6540c590 Sofia Papagiannaki
    def get_lower(self, serial):
66 6540c590 Sofia Papagiannaki
        """Return entries lower than serial."""
67 6540c590 Sofia Papagiannaki
68 6a5ca445 Sofia Papagiannaki
        s = select([self.qh_serials.c.serial])
69 6a5ca445 Sofia Papagiannaki
        s = s.where(self.qh_serials.c.serial < serial)
70 6540c590 Sofia Papagiannaki
        r = self.conn.execute(s)
71 6540c590 Sofia Papagiannaki
        rows = r.fetchall()
72 6540c590 Sofia Papagiannaki
        r.close()
73 6540c590 Sofia Papagiannaki
        return rows
74 613659fc Sofia Papagiannaki
75 613659fc Sofia Papagiannaki
    def lookup(self, serials):
76 e1e37cf9 Sofia Papagiannaki
        """Return the registered serials."""
77 613659fc Sofia Papagiannaki
78 613659fc Sofia Papagiannaki
        if not serials:
79 613659fc Sofia Papagiannaki
            return []
80 613659fc Sofia Papagiannaki
        s = select([self.qh_serials.c.serial])
81 613659fc Sofia Papagiannaki
        s = s.where(self.qh_serials.c.serial.in_(serials))
82 613659fc Sofia Papagiannaki
        r = self.conn.execute(s)
83 613659fc Sofia Papagiannaki
        rows = r.fetchall()
84 613659fc Sofia Papagiannaki
        r.close()
85 613659fc Sofia Papagiannaki
        return [row[0] for row in rows]
86 613659fc Sofia Papagiannaki
87 6540c590 Sofia Papagiannaki
    def insert_serial(self, serial):
88 6540c590 Sofia Papagiannaki
        """Insert a serial.
89 6540c590 Sofia Papagiannaki
        """
90 6540c590 Sofia Papagiannaki
91 6a5ca445 Sofia Papagiannaki
        s = self.qh_serials.insert()
92 6540c590 Sofia Papagiannaki
        r = self.conn.execute(s, serial=serial)
93 6540c590 Sofia Papagiannaki
        r.close()
94 613659fc Sofia Papagiannaki
95 613659fc Sofia Papagiannaki
    def insert_many(self, serials):
96 613659fc Sofia Papagiannaki
        """Insert multiple serials.
97 613659fc Sofia Papagiannaki
        """
98 613659fc Sofia Papagiannaki
99 613659fc Sofia Papagiannaki
        r = self.conn.execute(
100 613659fc Sofia Papagiannaki
            self.qh_serials.insert(),
101 29148653 Sofia Papagiannaki
            list({'serial': s} for s in serials)
102 613659fc Sofia Papagiannaki
        )
103 613659fc Sofia Papagiannaki
        r.close()
104 613659fc Sofia Papagiannaki
105 613659fc Sofia Papagiannaki
    def delete_many(self, serials):
106 613659fc Sofia Papagiannaki
        if not serials:
107 613659fc Sofia Papagiannaki
            return
108 613659fc Sofia Papagiannaki
        st = self.qh_serials.delete().where(
109 613659fc Sofia Papagiannaki
            self.qh_serials.c.serial.in_(serials)
110 613659fc Sofia Papagiannaki
        )
111 613659fc Sofia Papagiannaki
        self.conn.execute(st).close()