
    i}                    n    d Z ddlmZ ddlmZ 	 ddlZn# e$ r dZY nw xY wddlmZ  G d d          Z	dS )zSMySQL async client wrapper for persistent research session storage and convert log.    )annotations)AnyN)settingsc                  b    e Zd ZdZddZedd            Zdd	Zdd
ZddZ		 dddZ
	 dddZdS )MySQLClientz6Thin async wrapper around an aiomysql connection pool.poolr   returnNonec                    || _         d S N)_pool)selfr   s     9D:\work\zm-rag\backend\app\infrastructure\mysql_client.py__init__zMySQLClient.__init__   s    


    'MySQLClient'c                D  K   t           t          d          t          j        t          j        t          j        t          j        t          j        t          j        t          j	        dt          j
        t          j        t          j        
  
         d {V } | |          S )Naiomysql is not installedT)
hostportuserpassworddbcharset
autocommitconnect_timeoutminsizemaxsize)aiomysqlRuntimeErrorcreate_poolr   
mysql_host
mysql_port
mysql_usermysql_passwordmysql_databasemysql_charsetmysql_connect_timeoutmysql_pool_minsizemysql_pool_maxsize)clsr   s     r   from_settingszMySQLClient.from_settings   s      :;;;)$$$,&*$://
 
 
 
 
 
 
 
 
 s4yyr   c                z   K   | j                                          | j                                          d {V  d S r   )r   closewait_closedr   s    r   r.   zMySQLClient.close'   sF      
j$$&&&&&&&&&&&r   c                @   K   |                      d           d {V  d S )Na  
            CREATE TABLE IF NOT EXISTS research_sessions (
                session_id VARCHAR(128) NOT NULL,
                user_id VARCHAR(128) NOT NULL,
                history JSON NOT NULL,
                created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                expires_at DATETIME NULL,
                PRIMARY KEY (session_id, user_id),
                KEY idx_research_sessions_expires_at (expires_at),
                KEY idx_research_sessions_updated_at (updated_at)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
            executer0   s    r   ensure_research_sessions_tablez*MySQLClient.ensure_research_sessions_table+   sI      ll
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r   c                @   K   |                      d           d {V  d S )Nu|  
            CREATE TABLE IF NOT EXISTS convert_log (
                id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
                doc_id VARCHAR(256) NOT NULL COMMENT '文档 ID',
                task_id VARCHAR(128) DEFAULT NULL COMMENT 'Celery 任务 ID',
                source_format VARCHAR(32) NOT NULL COMMENT '源文件格式 (doc/xls/ppt/wps/et/ofd)',
                target_format VARCHAR(32) NOT NULL COMMENT '目标格式 (docx/xlsx/pptx/pdf)',
                source_path VARCHAR(1024) DEFAULT NULL COMMENT '源文件路径',
                output_path VARCHAR(1024) DEFAULT NULL COMMENT '转换后文件路径',
                success TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否成功 (0=失败 1=成功)',
                duration_ms INT DEFAULT NULL COMMENT '转换耗时(毫秒)',
                file_size BIGINT DEFAULT NULL COMMENT '源文件大小(字节)',
                error_message TEXT DEFAULT NULL COMMENT '失败时的错误信息',
                created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                PRIMARY KEY (id),
                KEY idx_convert_log_doc_id (doc_id),
                KEY idx_convert_log_task_id (task_id),
                KEY idx_convert_log_created_at (created_at)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
              COMMENT='文档格式转换日志'
            r2   r0   s    r   ensure_convert_log_tablez$MySQLClient.ensure_convert_log_table<   sI      ll
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r   Nquerystrparamstuple[Any, ...] | Nonedict[str, Any] | Nonec                  K   t           t          d          | j                                        4 d {V }|                    t           j                  4 d {V }|                    ||pd           d {V  |                                 d {V }d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   |rt          |          nd S )Nr    )	r   r    r   acquirecursor
DictCursorr3   fetchonedict)r   r7   r9   connr?   rows         r   	fetch_onezMySQLClient.fetch_oneU   s      
 :;;;:%%'' 	. 	. 	. 	. 	. 	. 	.4{{8#677 . . . . . . .6nnUFLb999999999"OO--------. . . . . . . . . . . . . . . . . . . . . . . . . . .	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.  )tCyyyT)s5   &C9B)C)
B3	3C6B3	7C
CCintc                f  K   | j                                         4 d {V }|                                4 d {V }|                    ||pd           d {V }d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   t	          |pd          S )Nr=   r   )r   r>   r?   r3   rF   )r   r7   r9   rC   r?   affecteds         r   r3   zMySQLClient.executeb   s     
 :%%'' 	E 	E 	E 	E 	E 	E 	E4{{}} E E E E E E E!'v|!D!DDDDDDDE E E E E E E E E E E E E E E E E E E E E E E E E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 8=q!!!s4   BA.B.
A8	8B;A8	<B
BB)r   r   r	   r
   )r	   r   )r	   r
   r   )r7   r8   r9   r:   r	   r;   )r7   r8   r9   r:   r	   rF   )__name__
__module____qualname____doc__r   classmethodr,   r.   r4   r6   rE   r3   r=   r   r   r   r      s        @@       ["' ' ' '
 
 
 
"
 
 
 
8 *.* * * * *  *." " " " " " "r   r   )
rL   
__future__r   typingr   r   ModuleNotFoundError
app.configr   r   r=   r   r   <module>rR      s    Y Y " " " " " "      OOOO   HHH       [" [" [" [" [" [" [" [" [" ["s    