1+ import logging
12import sqlite3
23import threading
34import time
45
5- from third_lib .sqlmap .lib .core .data import logger
6+ from third_lib .sqlmap .lib .core .data import logger as sqlmap_logger
7+
8+ logger = logging .getLogger (__name__ )
69from third_lib .sqlmap .lib .core .common import getSafeExString
710
811
@@ -33,6 +36,8 @@ def commit(self):
3336 self .connection .commit ()
3437
3538 def execute (self , statement , arguments = None ):
39+ max_retries = 5
40+ retry_count = 0
3641 with self .lock :
3742 while True :
3843 try :
@@ -44,14 +49,22 @@ def execute(self, statement, arguments=None):
4449 if "locked" not in getSafeExString (ex ):
4550 raise
4651 else :
47- time .sleep (1 )
52+ retry_count += 1
53+ if retry_count > max_retries :
54+ logger .error (f"Database locked after { max_retries } retries, giving up" )
55+ raise sqlite3 .OperationalError (f"Database locked after { max_retries } retries" )
56+ wait_time = min (0.05 * (2 ** retry_count ), 1.0 )
57+ logger .warning (f"Database locked, retry { retry_count } /{ max_retries } after { wait_time :.2f} s" )
58+ time .sleep (wait_time )
4859 else :
4960 break
5061
5162 if statement .lstrip ().upper ().startswith ("SELECT" ):
5263 return self .cursor .fetchall ()
5364
5465 def only_execute (self , statement , arguments = None ):
66+ max_retries = 5
67+ retry_count = 0
5568 with self .lock :
5669 while True :
5770 try :
@@ -63,19 +76,30 @@ def only_execute(self, statement, arguments=None):
6376 if "locked" not in getSafeExString (ex ):
6477 raise
6578 else :
66- time .sleep (1 )
79+ retry_count += 1
80+ if retry_count > max_retries :
81+ logger .error (f"Database locked after { max_retries } retries, giving up" )
82+ raise sqlite3 .OperationalError (f"Database locked after { max_retries } retries" )
83+ wait_time = min (0.05 * (2 ** retry_count ), 1.0 )
84+ logger .warning (f"Database locked, retry { retry_count } /{ max_retries } after { wait_time :.2f} s" )
85+ time .sleep (wait_time )
6786 else :
6887 break
6988
7089 return self .cursor
7190
7291 def init (self ):
7392 self .execute (
74- "CREATE TABLE logs(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, datetime TEXT, level TEXT, message TEXT)" )
93+ "CREATE TABLE IF NOT EXISTS logs(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, datetime TEXT, level TEXT, message TEXT)" )
7594 self .execute (
76- "CREATE TABLE data(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, status INTEGER, content_type INTEGER, value TEXT)" )
95+ "CREATE TABLE IF NOT EXISTS data(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, status INTEGER, content_type INTEGER, value TEXT)" )
7796 self .execute (
78- "CREATE TABLE errors(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, error TEXT)" )
97+ "CREATE TABLE IF NOT EXISTS errors(id INTEGER PRIMARY KEY AUTOINCREMENT, taskid INTEGER, error TEXT)" )
98+
99+ # IPC 表是进程间临时通信数据,每次启动时清空旧数据,避免无限增长
100+ self .execute ("DELETE FROM logs" )
101+ self .execute ("DELETE FROM data" )
102+ self .execute ("DELETE FROM errors" )
79103
80104 # 创建持久化请求头规则表
81105 self .execute ("""
0 commit comments