62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
import os
|
|
import psycopg2
|
|
from psycopg2.extras import RealDictCursor
|
|
from urllib.parse import urlparse
|
|
|
|
|
|
class DataBase():
|
|
def __init__(self, app):
|
|
db_url = urlparse(os.environ['DATABASE_URL'])
|
|
|
|
self.conn = psycopg2.connect(
|
|
database=db_url.path[1:],
|
|
user=db_url.username,
|
|
password=db_url.password,
|
|
host=db_url.hostname,
|
|
port=db_url.port
|
|
)
|
|
|
|
def execute(self, query, args=(), one=False, commit=False):
|
|
cur = self.conn.cursor(cursor_factory=RealDictCursor)
|
|
try:
|
|
cur.execute(query, args)
|
|
except:
|
|
self.conn.rollback()
|
|
raise Exception('Rolling back transaction...')
|
|
|
|
rv = None
|
|
if cur.description is not None:
|
|
rv = cur.fetchall()
|
|
if commit:
|
|
try:
|
|
self.conn.commit()
|
|
except:
|
|
self.conn.rollback()
|
|
cur.close()
|
|
|
|
return (rv[0] if rv else None) if one else rv
|
|
|
|
def insert_cadence(self, rpm, device_id):
|
|
self.execute('INSERT INTO cadence (rpm, device_id) VALUES (%s, %s)',
|
|
[rpm, device_id], commit=True)
|
|
|
|
def get_all_cadences(self, device_id):
|
|
return self.execute("""SELECT LOGGED_AT, RPM FROM cadence WHERE device_id = %s AND (NOW() < (LOGGED_AT + (INTERVAL '12 hour')))""", [device_id])
|
|
|
|
def get_devices(self):
|
|
return self.execute("""
|
|
SELECT DEVICE.ID,
|
|
DEVICE.NAME,
|
|
MAX(CADENCE.LOGGED_AT) AS LAST_LOGGED_AT,
|
|
CASE WHEN(NOW() < (MAX(CADENCE.LOGGED_AT) + (INTERVAL '5 min'))) THEN 'yes'
|
|
ELSE 'no'
|
|
END AS IS_ACTIVE
|
|
FROM DEVICE
|
|
LEFT JOIN CADENCE ON DEVICE.ID = CADENCE.DEVICE_ID
|
|
GROUP BY DEVICE.ID
|
|
ORDER BY LAST_LOGGED_AT
|
|
""")
|
|
|
|
def get_device(self, device_id):
|
|
return self.execute('SELECT * FROM device WHERE id = %s', [device_id], one=True)
|