@@ -87,3 +87,104 @@ async def expire(self, id: str) -> bool:
8787 logger .error (f'failed to save cookies, error: { e } ' )
8888 await conn .rollback ()
8989 return False
90+
91+ class Proxies (SqliteStore ):
92+ def __init__ (self , store_path ):
93+ super ().__init__ (store_path )
94+ self .primary_key = 'id'
95+ self .table_name = 'proxies'
96+ self ._create_table ()
97+
98+ def _create_table (self ):
99+ with closing (self ._get_sync_connection ()) as conn , closing (conn .cursor ()) as cursor :
100+ try :
101+ sql = f'''
102+ CREATE TABLE IF NOT EXISTS { self .table_name } (
103+ { self .primary_key } INTEGER PRIMARY KEY AUTOINCREMENT,
104+ url VARCHAR(512) NOT NULL,
105+ enable INTEGER NOT NULL,
106+ ct INTEGER NOT NULL,
107+ ut INTEGER NOT NULL
108+ )
109+ '''
110+ cursor .execute (sql )
111+ conn .commit ()
112+ except Exception as e :
113+ logger .error (f'failed to create table, error: { e } ' )
114+
115+ async def save (self , url : str = '' , enable : int = 1 , id : int = 0 ) -> bool :
116+ ct = ut = int (time .time ())
117+ async with self ._get_connection () as conn :
118+ try :
119+ sql = f'UPDATE { self .table_name } SET url = ?, enable = ?, ut = ? WHERE id = ?'
120+ await conn .execute (sql , (url , enable , ut , id ))
121+ if conn .total_changes == 0 :
122+ sql = f'INSERT INTO { self .table_name } (url, enable, ct, ut) VALUES (?, ?, ?, ?)'
123+ await conn .execute (sql , (url , enable , ct , ut ))
124+ await conn .commit ()
125+ return True
126+ except Exception as e :
127+ logger .error (f'failed to save proxy, error: { e } ' )
128+ await conn .rollback ()
129+ return False
130+
131+ async def remove (self , id : int ) -> bool :
132+ async with self ._get_connection () as conn :
133+ try :
134+ sql = f'DELETE FROM { self .table_name } WHERE id = ?'
135+ await conn .execute (sql , (id ,))
136+ await conn .commit ()
137+ return True
138+ except Exception as e :
139+ logger .error (f'failed to remove proxy, error: { e } ' )
140+ await conn .rollback ()
141+ return False
142+
143+ async def load (self , enable : int = - 1 , offset : int = 0 , limit : int = 0 ) -> list :
144+ async with self ._get_connection () as conn :
145+ try :
146+ base_sql = f'SELECT * FROM { self .table_name } '
147+ params = []
148+
149+ if enable != - 1 :
150+ base_sql += ' WHERE enable = ?'
151+ params .append (enable )
152+
153+ if limit > 0 :
154+ base_sql += ' LIMIT ? OFFSET ?'
155+ params .extend ([limit , offset ])
156+
157+ cursor = await conn .execute (base_sql , params )
158+ results = await cursor .fetchall ()
159+ return [dict (row ) for row in results ]
160+ except Exception as e :
161+ logger .error (f'failed to load proxies, error: { e } ' )
162+ await conn .rollback ()
163+ return []
164+
165+
166+ async def enable (self , id : int ) -> bool :
167+ ut = int (time .time ())
168+ async with self ._get_connection () as conn :
169+ try :
170+ sql = f'UPDATE { self .table_name } SET enable = ?, ut = ? WHERE id = ?'
171+ await conn .execute (sql , (1 , ut , id ))
172+ await conn .commit ()
173+ return True
174+ except Exception as e :
175+ logger .error (f'failed to save proxies, error: { e } ' )
176+ await conn .rollback ()
177+ return False
178+
179+ async def disable (self , id : int ) -> bool :
180+ ut = int (time .time ())
181+ async with self ._get_connection () as conn :
182+ try :
183+ sql = f'UPDATE { self .table_name } SET enable = ?, ut = ? WHERE id = ?'
184+ await conn .execute (sql , (0 , ut , id ))
185+ await conn .commit ()
186+ return True
187+ except Exception as e :
188+ logger .error (f'failed to save proxies, error: { e } ' )
189+ await conn .rollback ()
190+ return False
0 commit comments