summaryrefslogtreecommitdiff
path: root/framework/database.py
blob: de8053ce03853a55be58fe98960b9af1928240ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#
# Copyright © 2012 Intel Corporation
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#
import apsw
import sys
import time
import os.path as path
import xdg.BaseDirectory as xdg

__all__ = ['ResultDatabase']

class ResultDatabase:
    def __init__(self, config):
        '''Load the results database, creating it if it doesn't exist.

        Will exit the program if it fails.'''
        try:
            self.connection = apsw.Connection(config['options']['database'])
            cursor = self.connection.cursor()

            cursor.execute('''CREATE TABLE IF NOT EXISTS runs
                              (name TEXT PRIMARY KEY,
                               date INTEGER,
                               driver TEXT,
                               sysinfo TEXT)''')
            cursor.execute('''CREATE TABLE IF NOT EXISTS results
                              (run_name TEXT,
                               test_name TEXT,
                               command TEXT,
                               result TEXT,
                               return_code INTEGER,
                               errors TEXT,
                               output TEXT)''')
        except OSError as e:
            print('error: could not open results database', str(e), '\n')
            sys.exit(0)

    def createRun(self, name, driver, sysinfo):
        c = self.connection.cursor()
        date = int(time.time())
        try:
            c.execute('INSERT INTO runs VALUES(?,?,?,?)',
                      (name, date, driver, sysinfo))
            return True
        except:
            return False

    def listRuns(self):
        cursor = self.connection.cursor()
        rs = cursor.execute('SELECT * FROM runs ORDER BY date DESC')
        return [{'name': r[0], 'date': r[1], 'driver': r[2], 'sysinfo': r[3]} for r in rs]

    def mostRecentRun(self):
        cursor = self.connection.cursor()
        rs = cursor.execute('SELECT name FROM runs ORDER BY date DESC LIMIT 1')
        return rs[0][0]

    def addPlaceholderResults(self, run, tests):
        rows = [(run, test) for test in tests]
        c = self.connection.cursor()
        c.execute('BEGIN IMMEDIATE TRANSACTION')
        c.executemany('INSERT INTO results(run_name, test_name) VALUES(?,?)', rows)
        c.execute('END TRANSACTION')

    def findPlaceholders(self, run):
        c = self.connection.cursor()
        xs = c.execute('SELECT test_name FROM results WHERE run_name = ? AND result IS NULL', [run])
        return [x[0] for x in xs]

    def writeResult(self, run, name, command, result):
        c = self.connection.cursor()
        c.execute('UPDATE results SET command = ?, result = ?, return_code = ?, errors = ?, output = ? WHERE run_name = ? AND test_name = ? AND result IS NULL', (' '.join(command), result['status'], result['exitcode'], result['err'], result['out'], run, name))

    def getResults(self, run):
        c = self.connection.cursor()
        query = 'SELECT test_name, result FROM results WHERE run_name = ?'
        xs = c.execute(query, [run])
        return dict(xs)