o
    y¬´\m%  ã                   @   sÎ   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ	 dd
lm
Z
 ddlmZ i ZG dd„ deƒZG dd„ deƒZG dd„ deƒZeƒ  G dd„ deƒZeƒ  G dd„ deƒZeƒ  dS )aq  Strategies for creating new instances of Engine types.

These are semi-private implementation classes which provide the
underlying behavior for the "strategy" keyword argument available on
:func:`~sqlalchemy.engine.create_engine`.  Current available options are
``plain``, ``threadlocal``, and ``mock``.

New strategies can be added via new ``EngineStrategy`` classes.
é    )Ú
attrgetteré   )Úbase)Úthreadlocal)Úurlé   )Úevent)Úpool)Úutil)Úschemac                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚEngineStrategyzÂAn adaptor that processes input arguments and produces an Engine.

    Provides a ``create`` method that receives input arguments and
    produces an instance of base.Engine or a subclass.

    c                 C   s   | t | j< d S ©N)Ú
strategiesÚname)Úself© r   úN/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/engine/strategies.pyÚ__init__(   s   zEngineStrategy.__init__c                 O   ó   t ƒ ‚)z/Given arguments, returns a new Engine instance.©ÚNotImplementedError)r   ÚargsÚkwargsr   r   r   Úcreate+   s   zEngineStrategy.createN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r       s    r   c                   @   s   e Zd ZdZdd„ ZdS )ÚDefaultEngineStrategyz#Base class for built-in strategies.c              	      s0  t  |¡}| ˆ¡}|j dd ¡ ˆ dd ¡ | ¡ }| |¡‰ˆ dd¡r/d&‡‡fdd„	}nˆj}i }t ˆ¡D ]}|ˆv rE||ƒ||< q9ˆ dd ¡}	|	d u rmi }
t 	ˆj
¡D ]}|ˆv rd||ƒ|
|< qXˆj
d'i |
¤Ž}	|	|d< |D ]}| ˆ|¡ qsˆd'i |¤Ž‰ˆ |¡\‰ ‰ˆ |d	i ƒ¡ tˆ ƒ‰ |d
d ƒ}|d u röd&‡ ‡‡fdd„	}|d|ƒ}|dd ƒ}|d u r»ˆ |¡}dˆi}dddddddddœ}t |¡D ]}| ||¡}|ˆv rá||ƒ||< qÏ|D ]}| ||¡ qä||fi |¤Ž}nt|tjƒ�r|jˆ i ˆ¤Ž}n|}ˆ|_| j}i }t |¡D ]}|ˆv �r"||ƒ||< �qˆ dd¡}ˆ�rDtdd dd„ ˆD ƒ¡ˆjj|jj|jf ƒ‚||ˆ|fi |¤Ž‰|�r|ˆ ¡ ‰ˆ�rl‡fdd „}t |d!|¡ t |d"|¡ ‡‡fd#d$„}tj|d!|dd%� ˆ ˆ¡ |ˆu�r‹| ˆ¡ |D ]}| ˆ¡ �q�ˆS )(NÚpluginÚpluginsÚ_coerce_configFc                    s(   ˆ  | |¡}| ˆ jv rˆ j|  |ƒ}|S r   )ÚpopÚengine_config_types)ÚkeyÚdefaultÚvalue)Údialect_clsr   r   r   Ú	pop_kwargB   s   
z/DefaultEngineStrategy.create.<locals>.pop_kwargÚmoduleÚdbapiÚconnect_argsr	   c                    sB   ˆj rˆjjD ]}|ˆ| ˆ ˆƒ}|d ur|  S qˆjˆ i ˆ¤ŽS r   )Ú_has_eventsÚdispatchÚ
do_connectÚconnect)Úconnection_recordÚfnÚ
connection)ÚcargsÚcparamsÚdialectr   r   r/   j   s   ÿÿz-DefaultEngineStrategy.create.<locals>.connectÚcreatorÚ	poolclassr5   Úpool_logging_nameÚ	echo_poolÚpool_timeoutÚpool_recycleÚpool_eventsÚpool_threadlocalÚpool_reset_on_returnÚpool_pre_ping)Úlogging_nameÚechoÚtimeoutÚrecycleÚeventsÚuse_threadlocalÚreset_on_returnÚpre_pingÚ_initializeTzªInvalid argument(s) %s sent to create_engine(), using configuration %s/%s/%s.  Please check that the keyword arguments are appropriate for this combination of components.ú,c                 s   s   � | ]}d | V  qdS )z'%s'Nr   )Ú.0Úkr   r   r   Ú	<genexpr>©   s   € z/DefaultEngineStrategy.create.<locals>.<genexpr>c                    s$   t | d| ƒ}|d u rd S ˆ |ƒ d S )NÚ_sqla_unwrap)Úgetattr)Údbapi_connectionr0   Úconn)Údo_on_connectr   r   Ú
on_connect¶   s   ÿz0DefaultEngineStrategy.create.<locals>.on_connectÚfirst_connectr/   c                    s(   t jˆ| dd�}t ¡ |_ˆ  |¡ d S )NF)r2   r,   )r   Ú
Connectionr
   ÚimmutabledictÚ_execution_optionsÚ
initialize)rO   r0   Úc)r5   Úenginer   r   rS   Á   s
   ÿ
z3DefaultEngineStrategy.create.<locals>.first_connect)Úoncer   r   ) r   Úmake_urlÚ_instantiate_pluginsÚqueryr"   Ú_get_entrypointÚget_dialect_clsr
   Úget_cls_kwargsÚget_func_kwargsr*   Úhandle_dialect_kwargsÚcreate_connect_argsÚupdateÚlistÚget_pool_classÚgetÚhandle_pool_kwargsÚ
isinstanceÚpoollibÚ_DBProxyÚget_poolÚ_dialectÚ
engine_clsÚ	TypeErrorÚjoinÚ	__class__r   rR   r   ÚlistenÚengine_created)r   Úname_or_urlr   Úur    Ú
entrypointr(   Údialect_argsrK   r*   Ú
dbapi_argsr   r	   r/   r6   r7   Ú	pool_argsÚ	translateÚtkÚengineclassÚengine_argsrH   rR   rS   r   )r3   r4   r5   r'   rQ   rY   r   r   r   4   s´   


€€




ø
€
€üüÿ


zDefaultEngineStrategy.createN)r   r   r   r   r   r   r   r   r   r   1   s    r   c                   @   ó   e Zd ZdZdZejZdS )ÚPlainEngineStrategyz*Strategy for configuring a regular Engine.ÚplainN)r   r   r   r   r   r   ÚEnginern   r   r   r   r   r   Ô   ó    
r   c                   @   r~   )ÚThreadLocalEngineStrategyz=Strategy for configuring an Engine with threadlocal behavior.r   N)r   r   r   r   r   r   ÚTLEnginern   r   r   r   r   rƒ   Þ   r‚   rƒ   c                   @   s.   e Zd ZdZdZdd„ ZG dd„ dejƒZdS )ÚMockEngineStrategyz¼Strategy for configuring an Engine-like object with mocked execution.

    Produces a single mock Connectable object which dispatches
    statement execution to a passed-in function.

    Úmockc           	      K   sV   t  |¡}| ¡ }i }t |¡D ]}||v r| |¡||< q|di |¤Ž}t ||¡S )Nr   )r   r[   Úget_dialectr
   r`   r"   r…   ÚMockConnection)	r   rt   Úexecutorr   ru   r'   rw   rK   r5   r   r   r   r   ò   s   
€zMockEngineStrategy.createc                   @   s~   e Zd Zdd„ Zedd„ ƒZeedƒƒZedd„ ƒZe	 
d¡Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	ddd„Zdd„ ZdS )z!MockEngineStrategy.MockConnectionc                 C   s   || _ || _d S r   )rm   Úexecute)r   r5   rŠ   r   r   r   r     s   
z*MockEngineStrategy.MockConnection.__init__c                 C   ó   | S r   r   ©Úsr   r   r   Ú<lambda>  s    z*MockEngineStrategy.MockConnection.<lambda>rm   c                 C   s   | j jS r   )rm   r   rŒ   r   r   r   rŽ   
  s    Nc                 K   r‹   r   r   )r   r   r   r   r   Úcontextual_connect  ó   z4MockEngineStrategy.MockConnection.contextual_connectc                 K   r‹   r   r   )r   Úkwr   r   r   Úexecution_options  r�   z3MockEngineStrategy.MockConnection.execution_optionsc                 K   s   | j j||fd| i|¤ŽS )NrY   )rm   Úcompiler)r   Ú	statementÚ
parametersr   r   r   r   r“     s   ÿÿÿz*MockEngineStrategy.MockConnection.compilerc                 K   ó4   d|d< ddl m} |j| j| fi |¤Ž |¡ d S ©NFÚ
checkfirstr   )Úddl)Úsqlalchemy.enginer™   ÚSchemaGeneratorr5   Útraverse_single©r   Úentityr   r™   r   r   r   r     ó
   ÿz(MockEngineStrategy.MockConnection.createc                 K   r–   r—   )rš   r™   ÚSchemaDropperr5   rœ   r�   r   r   r   Údrop!  rŸ   z&MockEngineStrategy.MockConnection.dropc                 K   s&   d|d< || j | fi |¤Ž |¡ d S )NFr˜   )r5   rœ   )r   ÚvisitorcallableÚelementr2   r   r   r   r   Ú_run_visitor)  s   ÿz.MockEngineStrategy.MockConnection._run_visitorc                 O   r   r   r   )r   Úobject_ÚmultiparamsÚparamsr   r   r   rŠ   1  s   z)MockEngineStrategy.MockConnection.executer   )r   r   r   r   ÚpropertyrY   r   r5   r   r   Ú_schema_getterÚschema_for_objectr�   r’   r“   r   r¡   r¤   rŠ   r   r   r   r   rˆ     s    
	
ÿrˆ   N)	r   r   r   r   r   r   r   ÚConnectablerˆ   r   r   r   r   r…   è   s
    r…   N)r   Úoperatorr   Ú r   r   r   r   r	   rj   r
   Úsqlr   r   Úobjectr   r   r   rƒ   r…   r   r   r   r   Ú<module>   s&   
 $
M