Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / config.py @ 9d4502a8

History | View | Annotate | Download (3 kB)

1 1af183f2 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 1af183f2 Sofia Papagiannaki
#
3 1af183f2 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 1af183f2 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 1af183f2 Sofia Papagiannaki
# conditions are met:
6 1af183f2 Sofia Papagiannaki
#
7 1af183f2 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 1af183f2 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 1af183f2 Sofia Papagiannaki
#      disclaimer.
10 1af183f2 Sofia Papagiannaki
#
11 1af183f2 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 1af183f2 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 1af183f2 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 1af183f2 Sofia Papagiannaki
#      provided with the distribution.
15 1af183f2 Sofia Papagiannaki
#
16 1af183f2 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 1af183f2 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1af183f2 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1af183f2 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 1af183f2 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 1af183f2 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 1af183f2 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 1af183f2 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 1af183f2 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1af183f2 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 1af183f2 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 1af183f2 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 1af183f2 Sofia Papagiannaki
#
29 1af183f2 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 1af183f2 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 1af183f2 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 1af183f2 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 1af183f2 Sofia Papagiannaki
34 1af183f2 Sofia Papagiannaki
from sqlalchemy import Table, Column, String, MetaData
35 1af183f2 Sofia Papagiannaki
from sqlalchemy.sql import select
36 1af183f2 Sofia Papagiannaki
from sqlalchemy.exc import NoSuchTableError
37 1af183f2 Sofia Papagiannaki
38 1af183f2 Sofia Papagiannaki
from dbworker import DBWorker
39 1af183f2 Sofia Papagiannaki
40 1af183f2 Sofia Papagiannaki
def create_tables(engine):
41 1af183f2 Sofia Papagiannaki
    metadata = MetaData()
42 1af183f2 Sofia Papagiannaki
    columns = []
43 1af183f2 Sofia Papagiannaki
    columns.append(Column('key', String(256), primary_key=True))
44 1af183f2 Sofia Papagiannaki
    columns.append(Column('value', String(256)))
45 1af183f2 Sofia Papagiannaki
    config = Table('config', metadata, *columns, mysql_engine='InnoDB')
46 1af183f2 Sofia Papagiannaki
    
47 1af183f2 Sofia Papagiannaki
    metadata.create_all(engine)
48 1af183f2 Sofia Papagiannaki
    return metadata.sorted_tables
49 1af183f2 Sofia Papagiannaki
50 1af183f2 Sofia Papagiannaki
class Config(DBWorker):
51 1af183f2 Sofia Papagiannaki
    """Config are properties holding persistent information about system state.
52 1af183f2 Sofia Papagiannaki
    """
53 1af183f2 Sofia Papagiannaki
54 1af183f2 Sofia Papagiannaki
    def __init__(self, **params):
55 1af183f2 Sofia Papagiannaki
        DBWorker.__init__(self, **params)
56 1af183f2 Sofia Papagiannaki
        try:
57 1af183f2 Sofia Papagiannaki
            metadata = MetaData(self.engine)
58 1af183f2 Sofia Papagiannaki
            self.config = Table('config', metadata, autoload=True)
59 1af183f2 Sofia Papagiannaki
        except NoSuchTableError:
60 1af183f2 Sofia Papagiannaki
            tables = create_tables(self.engine)
61 1af183f2 Sofia Papagiannaki
            map(lambda t: self.__setattr__(t.name, t), tables)
62 1af183f2 Sofia Papagiannaki
63 1af183f2 Sofia Papagiannaki
    def get_value(self, key):
64 1af183f2 Sofia Papagiannaki
        """Return configuration value for key."""
65 1af183f2 Sofia Papagiannaki
66 1af183f2 Sofia Papagiannaki
        s = select([self.config.c.value])
67 1af183f2 Sofia Papagiannaki
        s = s.where(self.config.c.key == key)
68 1af183f2 Sofia Papagiannaki
        r = self.conn.execute(s)
69 1af183f2 Sofia Papagiannaki
        row = r.fetchone()
70 1af183f2 Sofia Papagiannaki
        r.close()
71 1af183f2 Sofia Papagiannaki
        if row:
72 1af183f2 Sofia Papagiannaki
            return row[0]
73 1af183f2 Sofia Papagiannaki
        return None
74 1af183f2 Sofia Papagiannaki
    
75 1af183f2 Sofia Papagiannaki
    def set_value(self, key, value):
76 1af183f2 Sofia Papagiannaki
        """Set a configuration entry.
77 1af183f2 Sofia Papagiannaki
        """
78 1af183f2 Sofia Papagiannaki
79 1af183f2 Sofia Papagiannaki
        s = self.config.insert()
80 1af183f2 Sofia Papagiannaki
        r = self.conn.execute(s, key=key, value=value)
81 1af183f2 Sofia Papagiannaki
        inserted_primary_key = r.inserted_primary_key[0]
82 1af183f2 Sofia Papagiannaki
        r.close()
83 1af183f2 Sofia Papagiannaki
        return inserted_primary_key