7802dfba4dd173615eec3f142708e1b2265572f0
[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     conn = sqlite3.connect(_gen_filename())
44     conn.text_factory = str
45     cursor = conn.cursor()
46     names = [row[0] for row in cursor.execute("SELECT DISTINCT session_id FROM value").fetchall()]
47     conn.close()
48     return names
49
50
51 def delete_session(session_id, session):
52     conn = sqlite3.connect(_gen_filename())
53     conn.text_factory = str
54     cursor = conn.cursor()
55     cursor.execute("DELETE FROM property WHERE session_id = ?",
56                           (session_id,))
57     cursor.execute("DELETE FROM permissive WHERE session_id = ?",
58                           (session_id,))
59     cursor.execute("DELETE FROM value WHERE session_id = ?",
60                           (session_id,))
61     cursor.execute("DELETE FROM information WHERE session_id = ?",
62                           (session_id,))
63     conn.commit()
64     conn.close()
65
66
67 class Storage(object):
68     __slots__ = ('_conn', '_cursor', 'persistent', 'session_id', 'serializable')
69     storage = 'sqlite3'
70
71     def __init__(self, session_id, persistent, test=False):
72         self.persistent = persistent
73         self.serializable = self.persistent
74         self.session_id = session_id
75         self._conn = sqlite3.connect(_gen_filename())
76         self._conn.text_factory = str
77         self._cursor = self._conn.cursor()
78
79     def execute(self, sql, params=None, commit=True):
80         if params is None:
81             params = tuple()
82         self._cursor.execute(sql, params)
83         if commit:
84             self._conn.commit()
85
86     def select(self, sql, params=None, only_one=True):
87         self.execute(sql, params=params, commit=False)
88         if only_one:
89             return self._cursor.fetchone()
90         else:
91             return self._cursor.fetchall()
92
93     def __del__(self):
94         self._cursor.close()
95         self._conn.close()
96         if not self.persistent:
97             session = None
98             if delete_session is not None:
99                 delete_session(self.session_id, session)
100
101
102 def getsession():
103     pass