11"""
22SQLite client for Fooocus API
33"""
4+ import logging
45import os
56import time
67import platform
78from datetime import datetime
89from typing import Optional
910import copy
1011
11- from sqlalchemy import Integer , Float , VARCHAR , Boolean , JSON , Text , create_engine
12+ from sqlalchemy import Integer , Float , VARCHAR , Boolean , JSON , Text , create_engine , text
1213from sqlalchemy .orm import declarative_base , Session , Mapped , mapped_column
1314
1415
@@ -38,6 +39,9 @@ class GenerateRecord(Base):
3839
3940 task_id : Mapped [str ] = mapped_column (VARCHAR (255 ), nullable = False , primary_key = True )
4041 task_type : Mapped [str ] = mapped_column (Text , nullable = False )
42+ task_in_queue_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
43+ task_start_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
44+ task_finish_mills : Mapped [int ] = mapped_column (Integer , nullable = False , default = 0 )
4145 result_url : Mapped [str ] = mapped_column (Text , nullable = True )
4246 finish_reason : Mapped [str ] = mapped_column (Text , nullable = True )
4347 date_time : Mapped [int ] = mapped_column (Integer , nullable = False )
@@ -75,7 +79,8 @@ class GenerateRecord(Base):
7579
7680 def __repr__ (self ) -> str :
7781 return f"GenerateRecord(task_id={ self .task_id !r} , task_type={ self .task_type !r} , \
78- result_url={ self .result_url !r} , finish_reason={ self .finish_reason !r} , date_time={ self .date_time !r} , \
82+ task_in_queue_mills={ self .task_in_queue_mills !r} , task_start_mills={ self .task_start_mills !r} , \
83+ result_url={ self .result_url !r} , finish_reason={ self .finish_reason !r} , date_time={ self .date_time !r} , task_finish_mills={ self .task_finish_mills !r} , \
7984 prompt={ self .prompt !r} , negative_prompt={ self .negative_prompt !r} , style_selections={ self .style_selections !r} , performance_selection={ self .performance_selection !r} , \
8085 aspect_ratios_selection={ self .aspect_ratios_selection !r} , base_model_name={ self .base_model_name !r} , \
8186 refiner_model_name={ self .refiner_model_name !r} , refiner_switch={ self .refiner_switch !r} , loras={ self .loras !r} , \
@@ -118,6 +123,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
118123 task_info = {
119124 "task_id" : obj .task_id ,
120125 "task_type" : obj .task_type ,
126+ "task_in_queue_mills" : obj .task_in_queue_mills ,
127+ "task_start_mills" : obj .task_start_mills ,
128+ "task_finish_mills" : obj .task_finish_mills ,
121129 "result_url" : obj .result_url ,
122130 "finish_reason" : obj .finish_reason ,
123131 "date_time" : datetime .fromtimestamp (obj .date_time ).strftime (
@@ -126,6 +134,9 @@ def convert_to_dict_list(obj_list: list[object]) -> list[dict]:
126134 }
127135 del dict_obj ["task_id" ]
128136 del dict_obj ["task_type" ]
137+ del dict_obj ['task_in_queue_mills' ]
138+ del dict_obj ['task_start_mills' ]
139+ del dict_obj ['task_finish_mills' ]
129140 del dict_obj ["result_url" ]
130141 del dict_obj ["finish_reason" ]
131142 del dict_obj ["date_time" ]
@@ -144,6 +155,30 @@ def __init__(self, uri: str):
144155 # 'mysql+pymysql://{username}:{password}@{host}:{port}/{database}'
145156 self .engine = create_engine (uri )
146157 self .session = Session (self .engine )
158+ self .add_columns_if_not_exists ()
159+
160+ def add_columns_if_not_exists (self ):
161+ """
162+ Add new columns but keep old data. This function runs automatically.
163+ """
164+ table_name = GenerateRecord .__tablename__
165+ # Check if the table exists
166+ result = self .session .execute (
167+ text (f"SELECT name FROM sqlite_master WHERE type='table' AND name='{ table_name } ';" ))
168+ if not result .fetchone ():
169+ return
170+
171+ result = self .session .execute (text (f"PRAGMA table_info({ table_name } );" ))
172+ columns = [row [1 ] for row in result .fetchall ()]
173+ try :
174+ if 'task_in_queue_mills' not in columns :
175+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_in_queue_mills INTEGER DEFAULT 0;" ))
176+ if 'task_start_mills' not in columns :
177+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_start_mills INTEGER DEFAULT 0;" ))
178+ if 'task_finish_mills' not in columns :
179+ self .session .execute (text (f"ALTER TABLE { table_name } ADD COLUMN task_finish_mills INTEGER DEFAULT 0;" ))
180+ except Exception as e :
181+ logging .error (f"add new columns failed { e } " )
147182
148183 def store_history (self , record : dict ) -> None :
149184 """
@@ -220,14 +255,13 @@ def req_to_dict(req: dict) -> dict:
220255
221256
222257def add_history (
223- params : dict , task_type : str , task_id : str , result_url : str , finish_reason : str
258+ params : dict , task_info : dict , result_url : str , finish_reason : str
224259) -> None :
225260 """
226261 Store history to database
227262 Args:
228263 params:
229- task_type:
230- task_id:
264+ task_info:
231265 result_url:
232266 finish_reason:
233267
@@ -237,8 +271,8 @@ def add_history(
237271 adv = copy .deepcopy (params ["advanced_params" ])
238272 params ["advanced_params" ] = adv .__dict__
239273 params ["date_time" ] = int (time .time ())
240- params [ "task_type" ] = task_type
241- params ["task_id" ] = task_id
274+ for k , v in task_info . items ():
275+ params [k ] = v
242276 params ["result_url" ] = result_url
243277 params ["finish_reason" ] = finish_reason
244278
0 commit comments