U
    ˱}j                     @   s   d dl Z d dlZd dlZd dlmZ ejejedZ	ejejedZ
G dd dZdadd Zd	d
 Zdd Zedd ZdS )    N)contextmanagerz../../database/app.dbz../../database/schema.sqlc                       sT   e Zd ZdZe Z fddZdd Zdd Z	dd	 Z
d
d Zedd Z  ZS )ConnectionPoolNc              	      sB   | j d kr<| j& | j d kr2t | | _ d| j _W 5 Q R X | j S )NF)	_instance_locksuper__new___initialized)cls	__class__ <D:\Project\Python Project\BangBang\backend\utils\database.pyr      s    

zConnectionPool.__new__c                 C   s   | j s|   d| _ d S )NT)r   
_init_poolselfr   r   r   _ensure_initialized   s    z"ConnectionPool._ensure_initializedc                 C   s   t | _|   d S N)DATABASE_PATH_db_path_init_databaser   r   r   r   r      s    zConnectionPool._init_poolc              	   C   s   t j| j}t j|s2t | td|  t j| jstd |  }tt	ddd}|
 }W 5 Q R X || |  |  td ntd |  }|d |d	 |d
 |d |  |  td d S )NzCreated directory: u'   数据库不存在，创建新数据库rzutf-8)encodingu   数据库初始化成功u$   数据库已存在，跳过初始化zPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzPRAGMA busy_timeout=30000zPRAGMA cache_size=-64000u*   数据库优化完成（启用WAL模式）)ospathdirnamer   existsmakedirsprint_create_connectionopenSCHEMA_PATHreadZexecutescriptcommitcloseexecute)r   Zdb_dirconnfZschemar   r   r   r      s,    






zConnectionPool._init_databasec                 C   s    t j| jddd d}t j|_|S )Ng      >@F)timeoutZcheck_same_threadZisolation_level)sqlite3connectr   ZRowZrow_factoryr   r%   r   r   r   r   9   s    z!ConnectionPool._create_connectionc                 c   s"   |   }z
|V  W 5 |  X d S r   )r   r#   r*   r   r   r   get_connectionC   s    
zConnectionPool.get_connection)__name__
__module____qualname__r   	threadingLockr   r   r   r   r   r   r   r+   __classcell__r   r   r
   r   r   	   s   
r   c                   C   s   t d krt a t   t S r   )_pool_instancer   r   r   r   r   r   	_get_poolM   s    r3   c                  C   s   t  } |  }|S r   )r3   r   )poolr%   r   r   r   get_dbT   s    r5   c                  C   s2   t   t } z| d |   W 5 |   X d S )Nz
            CREATE TABLE IF NOT EXISTS sensitive_words (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                word TEXT UNIQUE NOT NULL,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        )r3   r5   r#   r$   r"   )r%   r   r   r   init_dbY   s    
r6   c               
   c   sd   t  } |  }zFz|V  |  W n. tk
rP } z|  |W 5 d }~X Y nX W 5 |  X d S r   )r3   r   r#   r"   	ExceptionZrollback)r4   r%   er   r   r   db_transactioni   s    r9   )r(   r   r/   
contextlibr   r   joinr   __file__r   r    r   r2   r3   r5   r6   r9   r   r   r   r   <module>   s   B