import sqlite3 from v2realbot.config import DATA_DIR from v2realbot.utils.utils import json_serial from uuid import UUID, uuid4 import orjson from datetime import datetime from v2realbot.enums.enums import RecordType, StartBarAlign, Mode, Account from v2realbot.common.model import RunArchiveDetail from tinydb import TinyDB, Query, where sqlite_db_file = DATA_DIR + "/v2trading.db" conn = sqlite3.connect(sqlite_db_file) #standardne vraci pole tuplů, kde clen tuplu jsou sloupce #conn.row_factory = lambda c, r: orjson.loads(r[0]) #conn.row_factory = lambda c, r: r[0] #conn.row_factory = sqlite3.Row #CREATE TABLE # c = conn.cursor() # createTable= "CREATE TABLE runner_logs (runner_id varchar(32) NOT NULL, time real NOT NULL, data json NOT NULL);" # print(c.execute(createTable)) # sql = ("CREATE INDEX index_runner_logs ON runner_logs (runner_id, time);") # print(c.execute(sql)) #testovaci objekty insert = dict(time=datetime.now(), side="ddd", rectype=RecordType.BAR, id=uuid4()) insert_list = [dict(time=datetime.now().timestamp(), side="ddd", rectype=RecordType.BAR, id=uuid4()),dict(time=datetime.now().timestamp(), side="ddd", rectype=RecordType.BAR, id=uuid4()),dict(time=datetime.now().timestamp(), side="ddd", rectype=RecordType.BAR, id=uuid4()),dict(time=datetime.now().timestamp(), side="ddd", rectype=RecordType.BAR, id=uuid4())] def insert_log(runner_id: UUID, time: float, logdict: dict): c = conn.cursor() json_string = orjson.dumps(logdict, default=json_serial, option=orjson.OPT_PASSTHROUGH_DATETIME) res = c.execute("INSERT INTO runner_logs VALUES (?,?,?)",[str(runner_id), time, json_string]) conn.commit() return res.rowcount def insert_log_multiple(runner_id: UUID, loglist: list): c = conn.cursor() insert_data = [] for i in loglist: row = (str(runner_id), i["time"], orjson.dumps(i, default=json_serial, option=orjson.OPT_PASSTHROUGH_DATETIME)) insert_data.append(row) c.executemany("INSERT INTO runner_logs VALUES (?,?,?)", insert_data) conn.commit() return c.rowcount # c = conn.cursor() # json_string = orjson.dumps(logdict, default=json_serial, option=orjson.OPT_PASSTHROUGH_DATETIME) # res = c.execute("INSERT INTO runner_logs VALUES (?,?,?)",[str(runner_id), time, json_string]) # print(res) # conn.commit() # return res #returns list of ilog jsons def read_log_window(runner_id: UUID, timestamp_from: float, timestamp_to: float): conn.row_factory = lambda c, r: orjson.loads(r[0]) c = conn.cursor() res = c.execute(f"SELECT data FROM runner_logs WHERE runner_id='{str(runner_id)}' AND time >={ts_from} AND time <={ts_to}") return res.fetchall() #returns number of deleted elements def delete_logs(runner_id: UUID): c = conn.cursor() res = c.execute(f"DELETE from runner_logs WHERE runner_id='{str(runner_id)}';") print(res.rowcount) conn.commit() return res.rowcount # print(insert_log(str(uuid4()), datetime.now().timestamp(), insert)) # c = conn.cursor() # ts_from = 1683108821.08872 # ts_to = 1683108821.08874 # # res = c.execute(f"SELECT runner_id, time, data FROM runner_logs where time > {ts_from} and time <{ts_to}") # # result = res.fetchall() # # res= delete_logs("7f9866ac-c742-47f4-a329-1d2b6721e781") # # print(res) # # res = read_log_window(runner_id="33", timestamp_from=11 , timestamp_to=22) # # print(res) # res = insert_log_multiple(uuid4(), insert_list) # print(res) # res = read_log_window("3340e257-d19a-4179-baf3-3b39190acde3", ts_from, ts_to) # print(res) # for r in res.fetchall(): # print(dict(r)) #print(res.description) #print(result) def insert_archive_detail(archdetail: RunArchiveDetail): c = conn.cursor() json_string = orjson.dumps(archdetail, default=json_serial, option=orjson.OPT_PASSTHROUGH_DATETIME) res = c.execute("INSERT INTO runner_detail VALUES (?,?)",[str(archdetail["id"]), json_string]) conn.commit() return res.rowcount #returns list of details def get_all_archive_detail(): conn.row_factory = lambda c, r: orjson.loads(r[0]) c = conn.cursor() res = c.execute(f"SELECT data FROM runner_detail") return res.fetchall() #vrátí konkrétní def get_archive_detail_byID(runner_id: UUID): conn.row_factory = lambda c, r: orjson.loads(r[0]) c = conn.cursor() res = c.execute(f"SELECT data FROM runner_detail WHERE runner_id='{str(runner_id)}'") return res.fetchone() #returns number of deleted elements def delete_archive_detail(runner_id: UUID): c = conn.cursor() res = c.execute(f"DELETE from runner_detail WHERE runner_id='{str(runner_id)}';") print(res.rowcount) conn.commit() return res.rowcount def get_all_archived_runners_detail(): arch_detail_file = DATA_DIR + "/arch_detail.json" db_arch_d = TinyDB(arch_detail_file, default=json_serial, option=orjson.OPT_PASSTHROUGH_DATETIME) res = db_arch_d.all() return 0, res def migrate(): set = list[RunArchiveDetail] res, set = get_all_archived_runners_detail() print(f"fetched {len(set)}") for row in set: #insert_archive_detail(row) print(f"inserted {row['id']}") bars = {'high': [], 'low': [], 'volume': [], 'close': [], 'hlcc4': [], 'open': [], 'time': [], 'trades':[], 'resolution':[], 'confirmed': [], 'vwap': [], 'updated': [], 'index': []} idecko = uuid4() runArchiveDetail: RunArchiveDetail = RunArchiveDetail(id = idecko, name="nazev runneru", bars=bars, indicators=[dict(time=[])], statinds=dict(neco=233,zase=333), trades=list(dict())) # insert_archive_detail(runArchiveDetail) migrate() # res = get_archive_detail_byID(idecko) # print("byID",res) res = get_all_archive_detail() print("finished: all",len(res)) # delete_archive_detail(idecko) # res = get_archive_detail_byID(idecko) # print("byID",res) # res = get_all_archive_detail() # print("all",res)