Source code for egegrouper.sme_sqlite3

# EGEGrouper - Software for grouping electrogastroenterography examinations.

# Copyright (C) 2017-2018 Aleksandr Popov

# This program 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.

# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

"""Mapping examinations to and from sqlite3 SME database."""

import sqlite3
from . import sme
import numpy as np

[docs]def get_exam(conn, exam_id, only_meta=False): """Get examination object from database. Parameters ---------- conn : sqlite3.Connection Opened connection to sqlite3 database. exam_id : str Examination ID. only_meta : bool Get only meta data of examination if True. Return ------ : sme.Examination Examination instance. """ # TODO: rename only_meta to meta_only e = sme.Examination() cursor = conn.cursor() cursor.execute(""" SELECT E.name, E.diagnosis, E.age, E.gender FROM examination AS E WHERE exam_id = ? """, [exam_id, ]) result = cursor.fetchone() if not result: return None e.name, e.diagnosis, e.age, e.gender = result if only_meta: return e e.ms = [] cursor.execute(""" SELECT M.meas_id, M.time FROM measurement AS M WHERE exam_id = ? ORDER BY meas_id """, [exam_id, ]) for m_sql in cursor.fetchall(): m = sme.Measurement() m_id, m.time = m_sql m.ss = [] cursor.execute(""" SELECT S.dt, S.data FROM signal AS S WHERE meas_id = ? """, [m_id, ]) for s_sql in cursor.fetchall(): s = sme.Signal() s.dt = s_sql[0] s.x = np.array(np.frombuffer(s_sql[1])) m.ss.append(s) e.ms.append(m) return e
[docs]def put_exam(conn, exam): """Put examination to database. Parameters ---------- conn : sqlite3.Connection Opened connection with database. exam : sme.Examination Examination instance. """ cursor = conn.cursor() cursor.execute(""" SELECT max(exam_id) FROM examination """) exam_id = cursor.fetchone()[0] if not exam_id: exam_id = 0 cursor.execute(""" SELECT max(meas_id) FROM measurement """) meas_id = cursor.fetchone()[0] if not meas_id: meas_id = 0 cursor.execute(""" INSERT INTO examination (name, diagnosis, age, gender) VALUES (?,?,?,?) """, (exam.name, exam.diagnosis, exam.age, exam.gender) ) exam_id += 1 for m in exam.ms: cursor.execute(""" INSERT INTO measurement (time, exam_id) VALUES (?,?) """, (m.time, exam_id) ) meas_id += 1 for s in m.ss: cursor.execute(""" INSERT INTO signal (data, dt, meas_id) VALUES (?,?,?) """, (s.x.tobytes(), s.dt, meas_id) ) conn.commit()