Source code for linesman.backends.sqlite
# This file is part of linesman.
#
# linesman is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# linesman is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with linesman. If not, see <http://www.gnu.org/licenses/>.
#
import cPickle
import logging
import sqlite3
import time
from linesman.backends.base import Backend
try:
# Python 2.7+
from collections import OrderedDict
except ImportError:
# Python 2.4+
from ordereddict import OrderedDict
sqlite3.register_converter("pickle", cPickle.loads)
log = logging.getLogger(__name__)
[docs]class SqliteBackend(Backend):
"""
Stores sessions in a SQLite database.
"""
def __init__(self, filename="sessions.db"):
"""
Opens up a connection to a sqlite3 database.
``filename``:
filename of the sqlite database. If this file does not exist, it
will be created automatically.
This can also be set to `:memory:` to store the database in
memory; however, this will not persist across runs.
"""
self.filename = filename
@property
[docs] def conn(self):
return sqlite3.connect(self.filename, isolation_level=None,
detect_types=(sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES))
[docs] def setup(self):
"""
Creates table for Linesman, if it doesn't already exist.
"""
query = """
CREATE TABLE sessions (
uuid PRIMARY KEY,
timestamp FLOAT,
session PICKLE
);
"""
try:
c = self.conn.cursor()
c.execute(query)
except sqlite3.OperationalError:
log.debug("Table already exists.")
[docs] def add(self, session):
"""
Insert a new session into the database.
"""
uuid = session.uuid
if session.timestamp:
timestamp = time.mktime(session.timestamp.timetuple())
else:
timestamp = None
pickled_session = sqlite3.Binary(cPickle.dumps(session, -1))
query = "INSERT INTO sessions VALUES (?, ?, ?);"
params = (uuid, timestamp, pickled_session)
c = self.conn.cursor()
c.execute(query, params)
[docs] def delete(self, session_uuid):
"""
Remove the session.
"""
query = "DELETE FROM sessions WHERE uuid = ?;"
params = (session_uuid,)
conn = self.conn
curs = conn.cursor()
curs.execute(query, params)
return conn.total_changes
[docs] def delete_many(self, session_uuids):
"""
Remove the sessions.
"""
query = "DELETE FROM sessions WHERE uuid IN (%s);" % ", ".join('?' * len(session_uuids))
params = session_uuids
conn = self.conn
curs = conn.cursor()
curs.execute(query, params)
return conn.total_changes
[docs] def delete_all(self):
"""
Truncate the database.
"""
query = "DELETE FROM sessions;"
conn = self.conn
curs = conn.cursor()
curs.execute(query)
return conn.total_changes
[docs] def get(self, session_uuid):
"""
Retrieves the session from the database.
"""
query = "SELECT session FROM sessions WHERE uuid = ?;"
params = (session_uuid,)
c = self.conn.cursor()
c.execute(query, params)
result = c.fetchone()
return result[0] if result else None
[docs] def get_all(self):
"""
Generates a dictionary of the data based on the contents of the DB.
"""
query = "SELECT uuid, session FROM sessions ORDER BY timestamp;"
c = self.conn.cursor()
c.execute(query)
return OrderedDict(c.fetchall())