import sqlite3 import os import sys from colorama import Fore, Style, init # 初始化colorama init() # 定义emoji和颜色常量 EMOJI = { 'DB': '🗄️', 'UPDATE': '🔄', 'SUCCESS': '✅', 'ERROR': '❌', 'WARN': '⚠️', 'INFO': 'ℹ️', 'KEY': '🔑' } class CursorAuth: def __init__(self): # 判断操作系统 if os.name == "nt": # Windows self.db_path = os.path.join( os.getenv("APPDATA"), "Cursor", "User", "globalStorage", "state.vscdb" ) else: # macOS self.db_path = os.path.expanduser( "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb" ) def update_auth(self, email=None, access_token=None, refresh_token=None): conn = None try: # 确保目录存在并设置正确权限 db_dir = os.path.dirname(self.db_path) if not os.path.exists(db_dir): os.makedirs(db_dir, mode=0o755, exist_ok=True) # 如果数据库文件不存在,创建一个新的 if not os.path.exists(self.db_path): conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS ItemTable ( key TEXT PRIMARY KEY, value TEXT ) ''') conn.commit() if sys.platform != "win32": os.chmod(self.db_path, 0o644) conn.close() # 重新连接数据库 conn = sqlite3.connect(self.db_path) print(f"{EMOJI['INFO']} {Fore.GREEN}Successfully connected to database | 成功连接到数据库{Style.RESET_ALL}") cursor = conn.cursor() # 增加超时和其他优化设置 conn.execute("PRAGMA busy_timeout = 5000") conn.execute("PRAGMA journal_mode = WAL") conn.execute("PRAGMA synchronous = NORMAL") # 设置要更新的键值对 updates = [] if email is not None: updates.append(("cursorAuth/cachedEmail", email)) if access_token is not None: updates.append(("cursorAuth/accessToken", access_token)) if refresh_token is not None: updates.append(("cursorAuth/refreshToken", refresh_token)) updates.append(("cursorAuth/cachedSignUpType", "Auth_0")) # 使用事务来确保数据完整性 cursor.execute("BEGIN TRANSACTION") try: for key, value in updates: # 检查键是否存在 cursor.execute("SELECT COUNT(*) FROM ItemTable WHERE key = ?", (key,)) if cursor.fetchone()[0] == 0: cursor.execute(""" INSERT INTO ItemTable (key, value) VALUES (?, ?) """, (key, value)) else: cursor.execute(""" UPDATE ItemTable SET value = ? WHERE key = ? """, (value, key)) print(f"{EMOJI['INFO']} {Fore.CYAN}Updating {key.split('/')[-1]}...{Style.RESET_ALL}") cursor.execute("COMMIT") print(f"{EMOJI['SUCCESS']} {Fore.GREEN}Database updated successfully | 数据库更新成功{Style.RESET_ALL}") return True except Exception as e: cursor.execute("ROLLBACK") raise e except sqlite3.Error as e: print(f"\n{EMOJI['ERROR']} {Fore.RED}Database error | 数据库错误: {str(e)}{Style.RESET_ALL}") return False except Exception as e: print(f"\n{EMOJI['ERROR']} {Fore.RED}An error occurred | 发生错误: {str(e)}{Style.RESET_ALL}") return False finally: if conn: conn.close() print(f"{EMOJI['DB']} {Fore.CYAN}Database connection closed | 数据库连接已关闭{Style.RESET_ALL}")