@@ -55,86 +55,81 @@ def add(self, *, provider: str, credential_data: dict, nickname: str = "",
5555 added_by : str = "" , now : int | None = None ) -> str :
5656 credential_id = _new_id ("cred" )
5757 payload = json .dumps (credential_data , ensure_ascii = False ).encode ("utf-8" )
58- self ._db .connect (). execute (
59- "INSERT INTO credentials (id, provider, nickname, data_enc, created_at, added_by) "
60- "VALUES (?,?,?,?,?,?)" ,
61- ( credential_id , provider , nickname , self . _cipher . encrypt ( payload ) ,
62- int ( now if now is not None else time . time ()), added_by ),
63- )
64- self . _db . connect (). commit ( )
58+ with self ._db .transaction () as conn :
59+ conn . execute (
60+ "INSERT INTO credentials (id, provider, nickname, data_enc, created_at, added_by) "
61+ "VALUES (?,?,?,?,?,?)" ,
62+ ( credential_id , provider , nickname , self . _cipher . encrypt ( payload ),
63+ int ( now if now is not None else time . time ()), added_by ),
64+ )
6565 return credential_id
6666
6767 def delete (self , credential_id : str ) -> bool :
68- cursor = self ._db .connect ().execute ("DELETE FROM credentials WHERE id = ?" ,
69- (credential_id ,))
70- self ._db .connect ().commit ()
68+ with self ._db .transaction () as conn :
69+ cursor = conn .execute ("DELETE FROM credentials WHERE id = ?" , (credential_id ,))
7170 return cursor .rowcount > 0
7271
7372 def set_enabled (self , credential_id : str , enabled : bool ) -> bool :
74- cursor = self ._db .connect ().execute (
75- "UPDATE credentials SET enabled = ? WHERE id = ?" , (1 if enabled else 0 , credential_id ))
76- self ._db .connect ().commit ()
73+ with self ._db .transaction () as conn :
74+ cursor = conn .execute (
75+ "UPDATE credentials SET enabled = ? WHERE id = ?" ,
76+ (1 if enabled else 0 , credential_id ))
7777 return cursor .rowcount > 0
7878
7979 def set_pinned (self , credential_id : str | None ) -> None :
80- conn = self ._db .connect ()
81- conn .execute ("UPDATE credentials SET pinned = 0" )
82- if credential_id is not None :
83- conn .execute ("UPDATE credentials SET pinned = 1 WHERE id = ?" , (credential_id ,))
84- conn .commit ()
80+ with self ._db .transaction () as conn :
81+ conn .execute ("UPDATE credentials SET pinned = 0" )
82+ if credential_id is not None :
83+ conn .execute ("UPDATE credentials SET pinned = 1 WHERE id = ?" , (credential_id ,))
8584
8685 def revive (self , credential_id : str ) -> bool :
8786 """解除硬禁用(session 死亡)与冷却,允许凭证重新参与调度。
8887
8988 没有这个入口时,凭证一旦因 session 失效被硬禁用就只能删除重建,
9089 重新登录后也无法复用同一条记录。
9190 """
92- cursor = self ._db .connect (). execute (
93- "UPDATE credentials SET disabled = 0, disabled_reason = NULL, cooling_until = NULL, "
94- "err_count = 0 WHERE id = ?" , ( credential_id ,))
95- self . _db . connect (). commit ( )
91+ with self ._db .transaction () as conn :
92+ cursor = conn . execute (
93+ "UPDATE credentials SET disabled = 0, disabled_reason = NULL, "
94+ "cooling_until = NULL, err_count = 0 WHERE id = ?" , ( credential_id ,) )
9695 return cursor .rowcount > 0
9796
9897 def save_error (self , credential_id : str , outcome : ErrorOutcome ) -> None :
99- conn = self ._db .connect ()
100- if outcome .disabled :
101- conn .execute (
102- "UPDATE credentials SET disabled = 1, disabled_reason = ?, err_count = 0, "
103- "cooling_until = NULL WHERE id = ?" , ("session dead" , credential_id ))
104- else :
105- conn .execute (
106- "UPDATE credentials SET cooling_until = ?, err_count = ? WHERE id = ?" ,
107- (outcome .cooling_until , outcome .err_count , credential_id ))
108- conn .commit ()
98+ with self ._db .transaction () as conn :
99+ if outcome .disabled :
100+ conn .execute (
101+ "UPDATE credentials SET disabled = 1, disabled_reason = ?, err_count = 0, "
102+ "cooling_until = NULL WHERE id = ?" , ("session dead" , credential_id ))
103+ else :
104+ conn .execute (
105+ "UPDATE credentials SET cooling_until = ?, err_count = ? WHERE id = ?" ,
106+ (outcome .cooling_until , outcome .err_count , credential_id ))
109107
110108 def save_success (self , credential_id : str ) -> None :
111- conn = self ._db .connect ()
112- conn .execute ("UPDATE credentials SET err_count = 0 WHERE id = ?" , (credential_id ,))
113- conn .commit ()
109+ with self ._db .transaction () as conn :
110+ conn .execute ("UPDATE credentials SET err_count = 0 WHERE id = ?" , (credential_id ,))
114111
115112 def save_credential_data (self , credential_id : str , credential_data : dict ) -> None :
116113 payload = json .dumps (credential_data , ensure_ascii = False ).encode ("utf-8" )
117- conn = self ._db .connect ()
118- conn .execute ("UPDATE credentials SET data_enc = ? WHERE id = ?" ,
119- (self ._cipher .encrypt (payload ), credential_id ))
120- conn .commit ()
114+ with self ._db .transaction () as conn :
115+ conn .execute ("UPDATE credentials SET data_enc = ? WHERE id = ?" ,
116+ (self ._cipher .encrypt (payload ), credential_id ))
121117
122118 def save_quota (self , credential_id : str , quota : Quota ) -> None :
123- conn = self ._db .connect ()
124- conn .execute (
125- "UPDATE credentials SET quota_remaining = ?, quota_total = ?, quota_cycle_end = ?, "
126- "quota_expiry_ladder = ?, quota_probed_at = ?, health = ? WHERE id = ?" ,
127- ( quota . remaining , quota . total , quota . cycle_end ,
128- _ladder_text (quota .expiry_ladder ) , quota .probed_at ,
129- health_score (quota ), credential_id ) ,
130- )
131- conn . commit ( )
119+ with self ._db .transaction () as conn :
120+ conn .execute (
121+ "UPDATE credentials SET quota_remaining = ?, quota_total = ?, "
122+ "quota_cycle_end = ?, quota_expiry_ladder = ?, quota_probed_at = ?, health = ? "
123+ "WHERE id = ?" ,
124+ (quota .remaining , quota .total , quota . cycle_end ,
125+ _ladder_text (quota . expiry_ladder ), quota . probed_at ,
126+ health_score ( quota ), credential_id ),
127+ )
132128
133129 def mark_probe_failed (self , credential_id : str , now : int | None = None ) -> None :
134- conn = self ._db .connect ()
135- conn .execute ("UPDATE credentials SET quota_probed_at = ?, health = NULL WHERE id = ?" ,
136- (int (now if now is not None else time .time ()), credential_id ))
137- conn .commit ()
130+ with self ._db .transaction () as conn :
131+ conn .execute ("UPDATE credentials SET quota_probed_at = ?, health = NULL WHERE id = ?" ,
132+ (int (now if now is not None else time .time ()), credential_id ))
138133
139134 # ------------------------------------------------------------- 读取
140135
@@ -210,13 +205,13 @@ def create(self, username: str, name: str = "", now: int | None = None) -> dict[
210205 plaintext = generate_api_key ()
211206 key_id = _new_id ("key" )
212207 created_at = int (now if now is not None else time .time ())
213- self ._db .connect (). execute (
214- "INSERT INTO api_keys (id, username, name, key_digest, preview, created_at) "
215- "VALUES (?,?,?,?,?,?)" ,
216- ( key_id , username , name , digest_api_key ( plaintext ), preview_api_key ( plaintext ) ,
217- created_at ),
218- )
219- self . _db . connect (). commit ( )
208+ with self ._db .transaction () as conn :
209+ conn . execute (
210+ "INSERT INTO api_keys (id, username, name, key_digest, preview, created_at) "
211+ "VALUES (?,?,?,?,?,?)" ,
212+ ( key_id , username , name , digest_api_key ( plaintext ), preview_api_key ( plaintext ),
213+ created_at ),
214+ )
220215 return {"id" : key_id , "username" : username , "name" : name , "api_key" : plaintext ,
221216 "preview" : preview_api_key (plaintext ), "created_at" : created_at }
222217
@@ -226,9 +221,9 @@ def verify(self, api_key: str) -> str | None:
226221 "SELECT id, username FROM api_keys WHERE key_digest = ?" , (digest ,)).fetchone ()
227222 if row is None :
228223 return None
229- self ._db .connect (). execute ( "UPDATE api_keys SET last_used_at = ? WHERE id = ?" ,
230- ( int ( time . time ()), row [ "id" ]))
231- self . _db . connect (). commit ( )
224+ with self ._db .transaction () as conn :
225+ conn . execute ( "UPDATE api_keys SET last_used_at = ? WHERE id = ?" ,
226+ ( int ( time . time ()), row [ "id" ]) )
232227 return row ["username" ]
233228
234229 def list_for (self , username : str ) -> list [dict [str , Any ]]:
@@ -238,7 +233,7 @@ def list_for(self, username: str) -> list[dict[str, Any]]:
238233 return [dict (row ) for row in rows ]
239234
240235 def delete (self , key_id : str , username : str ) -> bool :
241- cursor = self ._db .connect (). execute (
242- "DELETE FROM api_keys WHERE id = ? AND username = ?" , ( key_id , username ))
243- self . _db . connect (). commit ( )
236+ with self ._db .transaction () as conn :
237+ cursor = conn . execute (
238+ "DELETE FROM api_keys WHERE id = ? AND username = ?" , ( key_id , username ) )
244239 return cursor .rowcount > 0
0 commit comments