from .database import * def get_scada_data_schema(name: str) -> dict[str, dict[str, Any]]: return { 'device_id' : {'type': 'str' , 'optional': False , 'readonly': True }, 'data' : {'type': 'list' , 'optional': False , 'readonly': False, 'element': { 'time' : {'type': 'str' , 'optional': False , 'readonly': False }, 'value' : {'type': 'float' , 'optional': False , 'readonly': False } }}} def get_scada_data(name: str, device_id: str) -> dict[str, Any]: sds = read_all(name, f"select * from scada_data where device_id = '{device_id}' order by time") ds = [] for r in sds: ds.append({ 'time': str(r['time']), 'value': float(r['value']) }) return { 'device_id': device_id, 'data': ds } def set_scada_data_cmd(name: str, cs: ChangeSet) -> DbChangeSet: device_id = cs.operations[0]['device_id'] old = get_scada_data(name, device_id) new = { 'device_id': device_id, 'data': [] } f_device_id = f"'{device_id}'" # TODO: transaction ? redo_sql = f"delete from scada_data where device_id = {f_device_id};" for tv in cs.operations[0]['data']: time, value = str(tv['time']), float(tv['value']) f_time, f_value = f"'{time}'", value redo_sql += f"\ninsert into scada_data (device_id, time, value) values ({f_device_id}, {f_time}, {f_value});" new['data'].append({ 'time': time, 'value': value }) undo_sql = f"delete from scada_data where device_id = {f_device_id};" for tv in old['data']: time, value = str(tv['time']), float(tv['value']) f_time, f_value = f"'{time}'", value undo_sql += f"\ninsert into scada_data (device_id, time, value) values ({f_device_id}, {f_time}, {f_value});" redo_cs = { 'type': 'scada_data' } | new undo_cs = { 'type': 'scada_data' } | old return DbChangeSet(redo_sql, undo_sql, [redo_cs], [undo_cs]) def set_scada_data(name: str, cs: ChangeSet) -> ChangeSet: result = set_scada_data_cmd(name, cs) result.redo_cs[0] |= g_update_prefix result.undo_cs[0] |= g_update_prefix return execute_command(name, result)