#!/usr/bin/env python ''' This program will clean the sqlite database every now and then to keep it from exploding. ''' import time import sqlite3 import random from cosmicpi.config import Config as config import logging as log log.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=log.INFO) def _initilize_DB(_sqlite_location): _db_conn = sqlite3.connect(_sqlite_location, timeout=60.0) cursor = _db_conn.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='Events'") if cursor.fetchone() == None: cursor.execute('''CREATE TABLE Events (UTCUnixTime INTEGER, SubSeconds REAL, TemperatureC REAL, Humidity REAL, AccelX REAL, AccelY REAL, AccelZ REAL, MagX REAL, MagY REAL, MagZ REAL, Pressure REAL, Longitude REAL, Latitude REAL, DetectorName TEXT, DetectorVersion TEXT);''') _db_conn.commit() # read configuration # Todo: Put the config parser into a propper class # Todo: Implement proper error catching for configparser (e.g. non existent keys or file) # read configuration sqlite_location = config.get("Storage", "sqlite_location") max_event_age = config.getint("Storage", "sqlite_max_event_age") * 60. * 60. # here used in seconds # setup the program _initilize_DB(sqlite_location) # start the cleaning loop while(True): # establish a connection db_conn = sqlite3.connect(sqlite_location, timeout=60.0) cursor = db_conn.cursor() # delete old events # get the most recent time cursor.execute("SELECT * FROM Events ORDER BY UTCUnixTime DESC, SubSeconds DESC;") latest_time = cursor.fetchone()[0] limit_time = int(latest_time - max_event_age) log.info("Deleting entries older than: {} [s]".format(limit_time)) # delete old entries and close the connection cursor.execute("DELETE FROM Events WHERE UTCUnixTime < ?;", (limit_time,)) db_conn.commit() db_conn.close() # sleep for a semi random time time_to_wait = int(random.randrange(5*60, 10*60)) log.info("Sleeping for: {} [s]".format(time_to_wait)) time.sleep(time_to_wait)