many improvment
[tiramisu.git] / tiramisu / storage / sqlite3 / storage.py
1 # -*- coding: utf-8 -*-
2 "default plugin for cache: set it in a simple dictionary"
3 # Copyright (C) 2013-2017 Team tiramisu (see AUTHORS for all contributors)
4 #
5 # This program is free software: you can redistribute it and/or modify it
6 # under the terms of the GNU Lesser General Public License as published by the
7 # Free Software Foundation, either version 3 of the License, or (at your
8 # option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
13 # details.
14 #
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 # ____________________________________________________________
18
19 from os import unlink
20 from os.path import basename, splitext, join, isfile
21 import sqlite3
22 from glob import glob
23 from ..util import SerializeObject
24
25
26 class Setting(SerializeObject):
27     """:param extension: database file extension (by default: db)
28     :param dir_database: root database directory (by default: /tmp)
29     """
30     extension = 'db'
31     dir_database = '/tmp'
32     name = 'tiramisu'
33
34
35 SETTING = Setting()
36
37
38 def _gen_filename():
39     return join(SETTING.dir_database, '{0}.{1}'.format(SETTING.name, SETTING.extension))
40
41
42 def list_sessions():
43     cursor = CONN.cursor()
44     names = [row[0] for row in cursor.execute("SELECT DISTINCT session_id FROM value").fetchall()]
45     return names
46
47
48 def delete_session(session_id, session):
49     cursor = CONN.cursor()
50     cursor.execute("DELETE FROM property WHERE session_id = ?",
51                           (session_id,))
52     cursor.execute("DELETE FROM permissive WHERE session_id = ?",
53                           (session_id,))
54     cursor.execute("DELETE FROM value WHERE session_id = ?",
55                           (session_id,))
56     cursor.execute("DELETE FROM information WHERE session_id = ?",
57                           (session_id,))
58     CONN.commit()
59
60 global CONN
61 CONN = None
62
63 class Storage(object):
64     __slots__ = ('_conn', '_cursor', 'persistent', 'session_id', 'serializable')
65     storage = 'sqlite3'
66
67     def __init__(self, session_id, persistent, test=False):
68         self.persistent = persistent
69         self.serializable = self.persistent
70         self.session_id = session_id
71         global CONN
72         init = False
73         if CONN is None:
74             init = True
75             CONN = sqlite3.connect(_gen_filename())
76             CONN.text_factory = str
77         self._conn = CONN
78         self._cursor = self._conn.cursor()
79         if init:
80             settings_table = 'CREATE TABLE IF NOT EXISTS property(path TEXT,'
81             settings_table += 'properties text, session_id TEXT, PRIMARY KEY(path, session_id))'
82             permissives_table = 'CREATE TABLE IF NOT EXISTS permissive(path TEXT,'
83             permissives_table += 'permissives TEXT, session_id TEXT, PRIMARY KEY(path, session_id))'
84             values_table = 'CREATE TABLE IF NOT EXISTS value(path TEXT, '
85             values_table += 'value TEXT, owner TEXT, idx INTEGER, session_id TEXT NOT NULL, '\
86                             'PRIMARY KEY (path, idx, session_id))'
87             informations_table = 'CREATE TABLE IF NOT EXISTS information(key TEXT '
88             informations_table += 'KEY, value TEXT, session_id TEXT NOT NULL, '
89             informations_table += 'PRIMARY KEY (key, session_id))'
90             self.execute(values_table, commit=False)
91             self.execute(informations_table, commit=False)
92             self.execute(settings_table, commit=False)
93             self.execute(permissives_table)
94
95     def execute(self, sql, params=None, commit=True):
96         if params is None:
97             params = tuple()
98         self._cursor.execute(sql, params)
99         if commit:
100             self._conn.commit()
101
102     def select(self, sql, params=None, only_one=True):
103         self.execute(sql, params=params, commit=False)
104         if only_one:
105             return self._cursor.fetchone()
106         else:
107             return self._cursor.fetchall()
108
109     def __del__(self):
110         self._cursor.close()
111         #FIXME
112         #self._conn.close()
113         if not self.persistent:
114             session = None
115             if delete_session is not None:
116                 delete_session(self.session_id, session)
117
118
119 def getsession():
120     pass