o
    "`^h+                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZmZmZ e dZ!G dd deZ"G dd dZ#G dd deZ$G dd deZ%dS )    N)CursorResultMetaData)DialectExecutionContext)Row)ClauseElement)
DDLElement)Recordr   create_column_maps)PGCompiler_psycopg)PGDialect_psycopg)	LOG_EXTRADatabaseURL)ConnectionBackendDatabaseBackendr   TransactionBackend	databasesc                   @   sh   e Zd Zdejeef dejddfddZde	fddZ
defd	d
ZdddZdddZdddZdS )AiopgBackenddatabase_urloptionsreturnNc                 K   s$   t || _|| _|  | _d | _d S N)r   _database_url_options_get_dialect_dialect_pool)selfr   r    r   V/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/databases/backends/aiopg.py__init__   s   


zAiopgBackend.__init__c                 C   sF   t tjdd d}t|_d|_d|_d|_d|_d|_	d|_
d|_|S )Nc                 S   s   | S r   r   )xr   r   r   <lambda>'   s    z+AiopgBackend._get_dialect.<locals>.<lambda>)json_serializerjson_deserializerTF)r   jsondumpsr
   statement_compilerimplicit_returningsupports_native_enumsupports_smallserial_backslash_escapessupports_sane_multi_rowcount_has_native_hstoresupports_native_decimal)r   dialectr   r   r   r   %   s   
zAiopgBackend._get_dialectc                 C   s   | j j}i }|d}|d}|d}|d urt||d< |d ur)t||d< |d ur8ddd|  |d< | j D ]\}}|dkrHd}n|dkrNd}|||< q=|S )	Nmin_sizemax_sizesslminsizemaxsizeTF)truefalse)r   r   getintlowerr   items)r   url_optionskwargsr/   r0   r1   keyvaluer   r   r   _get_connection_kwargs4   s$   



z#AiopgBackend._get_connection_kwargsc                    s`   | j d u s
J d|  }tjd| jj| jj| jjpt	 | jj
| jjd|I d H | _ d S )Nz"DatabaseBackend is already running)hostportuserpassworddatabaser   )r   r>   aiopgcreate_poolr   hostnamer@   usernamegetpassgetuserrB   rC   )r   r;   r   r   r   connectM   s   zAiopgBackend.connectc                    s8   | j d us
J d| j   | j  I d H  d | _ d S )NDatabaseBackend is not running)r   closewait_closedr   r   r   r   
disconnectY   s
   

zAiopgBackend.disconnectAiopgConnectionc                 C   s   t | | jS r   )rP   r   rN   r   r   r   
connection_   s   zAiopgBackend.connectionr   N)r   rP   )__name__
__module____qualname__typingUnionr   strAnyr   r   r   dictr>   rJ   rO   rQ   r   r   r   r   r      s    


r   c                   @   s   e Zd ZdefddZdS )CompilationContextcontextc                 C   s
   || _ d S r   )r\   )r   r\   r   r   r   r   d   s   
zCompilationContext.__init__N)rS   rT   rU   r   r   r   r   r   r   r[   c   s    r[   c                   @   s   e Zd ZdedefddZdddZdd	d
Zdede	j
e fddZdede	je fddZdede	jfddZde	j
e ddfddZdede	je	jdf fddZdefddZdede	jeeef fddZedejjfddZdS )rP   rC   r.   c                 C   s   || _ || _d | _d S r   )	_databaser   _connection)r   rC   r.   r   r   r   r   i      
zAiopgConnection.__init__r   Nc                    s@   | j d u s
J d| jjd usJ d| jj I d H | _ d S )NzConnection is already acquiredrK   )r^   r]   r   acquirerN   r   r   r   r`   n   s   zAiopgConnection.acquirec                    sH   | j d us
J d| jjd usJ d| jj| j I d H  d | _ d S )NConnection is not acquiredrK   )r^   r]   r   releaserN   r   r   r   rb   s   s
   
zAiopgConnection.releasequeryc                    s   | j d us
J d| |\}}}t | j| j  I d H }z/|||I d H  | I d H }t||jfdd|D } fdd|D W |	  S |	  w )Nra   c                    s   g | ]}t   j j|qS r   )r   _processors_keymap.0row)metadatar   r   
<listcomp>   s    z-AiopgConnection.fetch_all.<locals>.<listcomp>c                    s   g | ]	}t | qS r   )r   rf   )column_mapsr.   result_columnsr   r   rj      s    )
r^   _compiler	   r   cursorexecutefetchallr   descriptionrL   )r   rc   	query_strargsr\   rn   rowsr   )rk   r.   ri   rl   r   	fetch_ally   s   
	zAiopgConnection.fetch_allc                    s   | j d us
J d| |\}}}}t|}| j}| j  I d H }z6|||I d H  | I d H }	|	d u r>W |  d S t||j	}
t
|
|
j|
j|	}	t|	|||W |  S |  w Nra   )r^   rm   r	   r   rn   ro   fetchonerL   r   rq   r   rd   re   r   )r   rc   rr   rs   rl   r\   rk   r.   rn   rh   ri   r   r   r   	fetch_one   s*   
zAiopgConnection.fetch_onec                    sd   | j d us
J d| |\}}}}| j  I d H }z|||I d H  |jW |  S |  w rv   )r^   rm   rn   ro   	lastrowidrL   )r   rc   rr   rs   _rn   r   r   r   ro      s   zAiopgConnection.executequeriesc                    sl   | j d us
J d| j  I d H }z|D ]}| |\}}}}|||I d H  qW |  d S |  w rv   )r^   rn   rm   ro   rL   )r   r{   rn   single_queryrs   rz   r   r   r   execute_many   s   zAiopgConnection.execute_manyc                 C  s   | j d us
J d| |\}}}}t|}| j}| j  I d H }z1|||I d H  t||j}	|2 z3 d H W }
t|	|	j	|	j
|
}t||||V  q46 W |  d S |  w rv   )r^   rm   r	   r   rn   ro   r   rq   r   rd   re   r   rL   )r   rc   rr   rs   rl   r\   rk   r.   rn   ri   rh   recordr   r   r   iterate   s&   	zAiopgConnection.iteratec                 C   s   t | S r   )AiopgTransactionrN   r   r   r   transaction   s   zAiopgConnection.transactionc                 C   s  |j | jddid}| j }| j|_t|ts[t|j }|	 }| D ]\}}||j
v r9|j
| |||< q'|j|j|j|j|jf|_dd t|ddD }|j| }	|j}
ni }d }
|j}	|	dd	d
d	}tjd|tt|td |j||
t|fS )Nrender_postcompileT)r.   compile_kwargsc                 S   s"   i | ]\}\}}|d t | qS )$)rX   )rg   ir<   rz   r   r   r   
<dictcomp>   s    z,AiopgConnection._compile.<locals>.<dictcomp>   )startz 
 
zQuery: %s Args: %s)extra)compiler   execution_ctx_clsr.   
isinstancer   sortedparamsr9   construct_params_bind_processors_result_columns_ordered_columns_textual_ordered_columns_ad_hoc_textual_loose_column_name_matchingresult_column_struct	enumeratestringreplaceloggerdebugreprtupler   r[   )r   rc   compiledexecution_contextcompiled_paramsrs   r<   valmappingcompiled_query
result_mapquery_messager   r   r   rm      s>   





zAiopgConnection._compilec                 C   s   | j d us	J d| j S rv   )r^   rN   r   r   r   raw_connection   s   zAiopgConnection.raw_connectionrR   ) rS   rT   rU   r   r   r   r`   rb   r   rV   ListRecordInterfaceru   Optionalrx   rY   ro   r}   AsyncGeneratorr   r   r   TuplerX   listr   rm   propertyrD   rQ   
Connectionr   r   r   r   r   rP   h   s"    




(rP   c                   @   sR   e Zd ZdefddZdedejejejf ddfdd	Z	dd
dZ
dddZdS )r   rQ   c                 C   s   || _ d| _d| _d S )NF )r^   _is_root_savepoint_name)r   rQ   r   r   r   r     r_   zAiopgTransaction.__init__is_rootextra_optionsr   Nc                    s   | j j d usJ d|| _| j j  I d H }| jr$|dI d H  d S tt dd}d| | _z|d| j I d H  W |	  d S |	  w )Nra   BEGIN-rz   STARLETTE_SAVEPOINT_z
SAVEPOINT )
r^   r   rn   ro   rX   uuiduuid4r   r   rL   )r   r   r   rn   idr   r   r   r     s   zAiopgTransaction.startc                    t   | j j d usJ d| j j  I d H }| jr!|dI d H  d S z|d| j I d H  W |  d S |  w )Nra   COMMITzRELEASE SAVEPOINT r^   rn   r   ro   r   rL   r   rn   r   r   r   commit     zAiopgTransaction.commitc                    r   )Nra   ROLLBACKzROLLBACK TO SAVEPOINT r   r   r   r   r   rollback#  r   zAiopgTransaction.rollbackrR   )rS   rT   rU   rP   r   boolrV   DictrY   r   r   r   r   r   r   r   r     s    

r   )&rH   r$   loggingrV   r   rD   sqlalchemy.engine.cursorr   sqlalchemy.engine.interfacesr   r   sqlalchemy.engine.rowr   sqlalchemy.sqlr   sqlalchemy.sql.ddlr   !databases.backends.common.recordsr   r	   $databases.backends.compilers.psycopgr
   #databases.backends.dialects.psycopgr   databases.corer   r   databases.interfacesr   r   r   r   	getLoggerr   r   r[   rP   r   r   r   r   r   <module>   s,    
G 