Skip to content

Commit

Permalink
Serialize state as ints with automatic migration
Browse files Browse the repository at this point in the history
  • Loading branch information
daoo committed Jan 10, 2024
1 parent d4a1a54 commit 8fa5a84
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 16 deletions.
36 changes: 20 additions & 16 deletions autodesk/sqlitedatastore.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,23 @@ def convert_timestamp(val):
sqlite3.register_converter("timestamp", convert_datetime)
sqlite3.register_converter("unix_timestamp", convert_timestamp)

sqlite3.register_adapter(states.Down, lambda _: "down")
sqlite3.register_adapter(states.Up, lambda _: "up")
sqlite3.register_adapter(states.Inactive, lambda _: "inactive")
sqlite3.register_adapter(states.Active, lambda _: "active")
sqlite3.register_adapter(states.Down, lambda _: 0)
sqlite3.register_adapter(states.Up, lambda _: 1)
sqlite3.register_adapter(states.Inactive, lambda _: 0)
sqlite3.register_adapter(states.Active, lambda _: 1)
sqlite3.register_converter("desk", states.deserialize_desk)
sqlite3.register_converter("session", states.deserialize_session)
sqlite3.register_converter("desk_int", states.deserialize_desk_int)
sqlite3.register_converter("session_int", states.deserialize_session_int)


def _migrate(logger, connection, old_table, new_table):
def _migrate(logger, connection, old_table, new_table, order_by):
tables = connection.execute(
f"SELECT name FROM sqlite_master WHERE type='table' AND name='{old_table}'"
)
name = tables.fetchone()
if name:
rows = connection.execute(f"SELECT * FROM {old_table} ORDER BY date ASC")
rows = connection.execute(f"SELECT * FROM {old_table} ORDER BY {order_by} ASC")
data = rows.fetchall()
logger.info(
"migrating table %s with %d row(s) to %s", old_table, len(data), new_table
Expand All @@ -50,18 +52,20 @@ def __init__(self, logger, connection):
self.logger = logger
self.connection = connection
self.connection.execute(
"CREATE TABLE IF NOT EXISTS session2("
"CREATE TABLE IF NOT EXISTS session3("
"timestamp UNIX_TIMESTAMP NOT NULL,"
"state SESSION NOT NULL)"
"state SESSION_INT NOT NULL)"
)
self.connection.execute(
"CREATE TABLE IF NOT EXISTS desk2("
"CREATE TABLE IF NOT EXISTS desk3("
"timestamp UNIX_TIMESTAMP NOT NULL,"
"state DESK NOT NULL)"
"state DESK_INT NOT NULL)"
)

_migrate(self.logger, self.connection, "desk", "desk2")
_migrate(self.logger, self.connection, "session", "session2")
_migrate(self.logger, self.connection, "desk", "desk3", "date")
_migrate(self.logger, self.connection, "session", "session3", "date")
_migrate(self.logger, self.connection, "desk2", "desk3", "timestamp")
_migrate(self.logger, self.connection, "session2", "session3", "timestamp")

@staticmethod
def open(path):
Expand All @@ -77,19 +81,19 @@ def _get(self, query):
return pd.read_sql_query(query, self.connection)

def get_desk_events(self):
return self._get("SELECT * FROM desk2 ORDER BY timestamp ASC")
return self._get("SELECT * FROM desk3 ORDER BY timestamp ASC")

def get_session_events(self):
return self._get("SELECT * FROM session2 ORDER BY timestamp ASC")
return self._get("SELECT * FROM session3 ORDER BY timestamp ASC")

def set_desk(self, at, state):
self.logger.debug("set desk %s %s", at, state.test("down", "up"))
values = (at.to_pydatetime(), state)
self.connection.execute("INSERT INTO desk2 values(?, ?)", values)
self.connection.execute("INSERT INTO desk3 values(?, ?)", values)
self.connection.commit()

def set_session(self, at, state):
self.logger.debug("set session %s %s", at, state.test("inactive", "active"))
values = (at.to_pydatetime(), state)
self.connection.execute("INSERT INTO session2 values(?, ?)", values)
self.connection.execute("INSERT INTO session3 values(?, ?)", values)
self.connection.commit()
18 changes: 18 additions & 0 deletions autodesk/states.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,21 @@ def deserialize_desk(value):
return UP

raise ValueError('Incorrect desk state "{0}".'.format(value))


def deserialize_session_int(value):
if value == b'0':
return INACTIVE
if value == b'1':
return ACTIVE

raise ValueError('Incorrect session state "{0}".'.format(value))


def deserialize_desk_int(value):
if value == b'0':
return DOWN
if value == b'1':
return UP

raise ValueError('Incorrect desk state "{0}".'.format(value))

0 comments on commit 8fa5a84

Please sign in to comment.