U
    x^w&                     @   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 )EngineStrategyzAn 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   D/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/engine/strategies.py__init__(   s    zEngineStrategy.__init__c                 O   s
   t  dS )z/Given arguments, returns a new Engine instance.N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              
      s*  t |}|}|jdd  dd  | }||ddr^d'fdd	}nj}i }tD ]}|krr||||< qrdd }	|	d kri }
t	j
D ]}|kr|||
|< qj
f |
}	|	|d< |D ]}|| qf ||\ |d	i  t  |d
d }|d krd( fdd	}|d|}|dd }|d krr|}di}dddddddddd	}t|D ](}|||}|kr||||< q|D ]}||| q||f|}n(t|tjjr
|j }n|}|_| j}i }t|D ]}|kr(||||< q(dd}rtdddd D jj|jj|jf |||f||r r҇fd d!}t|d"| t|d#| fd$d%}tj|d"|dd&   |k	r|  |D ]}|  qS ))NpluginpluginsZ_coerce_configFc                    s(    | |}|  jkr$ j|  |}|S r   )popZengine_config_types)keydefaultvalue)dialect_clsr   r   r   	pop_kwargB   s    
z/DefaultEngineStrategy.create.<locals>.pop_kwargmoduledbapiZconnect_argsr	   c                    s>   j r2jjD ]"}||  }|d k	r|  S qj S r   )_has_eventsdispatchZ
do_connectconnect)connection_recordfn
connection)cargscparamsdialectr   r   r*   j   s       
z-DefaultEngineStrategy.create.<locals>.connectcreator	poolclassr0   Zpool_logging_nameZ	echo_poolpool_timeoutZpool_recycleZpool_eventsZpool_threadlocalZpool_reset_on_returnZpool_pre_pingZpool_use_lifo)	Zlogging_nameZechotimeoutZrecycleeventsZuse_threadlocalZreset_on_returnZpre_pingZuse_lifo_initializeTzInvalid 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 krd S  | d S )NZ_sqla_unwrap)getattr)dbapi_connectionr+   conn)do_on_connectr   r   
on_connect   s      z0DefaultEngineStrategy.create.<locals>.on_connectfirst_connectr*   c                    s4   t j| dd}t |_ |  |j d S )NF)r-   r(   )r   
Connectionr
   ZimmutabledictZ_execution_optionsZ
initializeZdo_rollbackr-   )r<   r+   c)r0   enginer   r   r@      s      

z3DefaultEngineStrategy.create.<locals>.first_connect)Z_once_unless_exception)N)N)!r   make_urlZ_instantiate_pluginsqueryr    Z_get_entrypointZget_dialect_clsr
   get_cls_kwargsZget_func_kwargsr'   Zhandle_dialect_kwargsZcreate_connect_argsupdatelistZget_pool_classgetZhandle_pool_kwargs
isinstancepoollibZdbapi_proxyZ_DBProxyZget_pool_dialect
engine_cls	TypeErrorjoin	__class__r   r?   r   listenZengine_created)r   name_or_urlr   ur   Z
entrypointr%   dialect_argsr9   r'   Z
dbapi_argsr   r	   r*   r1   r2   Z	pool_args	translateZtkZengineclassZengine_argsr6   r?   r@   r   )r.   r/   r0   r$   r>   rC   r   r   r   4   s    















zDefaultEngineStrategy.createN)r   r   r   r   r   r   r   r   r   r   1   s   r   c                   @   s   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   ZEnginerM   r   r   r   r   rV      s   rV   c                   @   s   e Zd ZdZdZejZdS )ThreadLocalEngineStrategyz=Strategy for configuring an Engine with threadlocal behavior.r   N)r   r   r   r   r   r   ZTLEnginerM   r   r   r   r   rX      s   rX   c                   @   s.   e Zd ZdZdZdd ZG dd dejZdS )MockEngineStrategyzStrategy for configuring an Engine-like object with mocked execution.

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

    Zmockc           	      K   sR   t |}| }i }t|D ]}||kr ||||< q |f |}t||S r   )r   rD   get_dialectr
   rF   r    rY   MockConnection)	r   rR   executorr   rS   r$   rT   r9   r0   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 ZdddZdd ZdS )z!MockEngineStrategy.MockConnectionc                 C   s   || _ || _d S r   )rL   execute)r   r0   r]   r   r   r   r     s    z*MockEngineStrategy.MockConnection.__init__c                 C   s   | S r   r   sr   r   r   <lambda>      z*MockEngineStrategy.MockConnection.<lambda>rL   c                 C   s   | j jS r   )rL   r   r^   r   r   r   r`     ra   Nc                 K   s   | S r   r   r   r   r   r   r   contextual_connect  s    z4MockEngineStrategy.MockConnection.contextual_connectc                 K   s   | S r   r   rb   r   r   r   r*     s    z)MockEngineStrategy.MockConnection.connectc                 K   s   | S r   r   )r   kwr   r   r   execution_options  s    z3MockEngineStrategy.MockConnection.execution_optionsc                 K   s   | j j||fd| i|S )NrC   )rL   compiler)r   Z	statement
parametersr   r   r   r   rf     s     z*MockEngineStrategy.MockConnection.compilerc                 K   s0   d|d< ddl m} |j| j| f|| d S NF
checkfirstr   )ddl)sqlalchemy.enginerj   ZSchemaGeneratorr0   traverse_singler   entityr   rj   r   r   r   r   #  s
    z(MockEngineStrategy.MockConnection.createc                 K   s0   d|d< ddl m} |j| j| f|| d S rh   )rk   rj   ZSchemaDropperr0   rl   rm   r   r   r   drop+  s
    z&MockEngineStrategy.MockConnection.dropc                 K   s"   d|d< || j | f|| d S )NFri   )r0   rl   )r   Zvisitorcallableelementr-   r   r   r   r   _run_visitor3  s    z.MockEngineStrategy.MockConnection._run_visitorc                 O   s
   t  d S r   r   )r   Zobject_Zmultiparamsparamsr   r   r   r]   ;  s    z)MockEngineStrategy.MockConnection.execute)N)r   r   r   r   propertyrC   r   r0   r   r   Z_schema_getterZschema_for_objectrc   r*   re   rf   r   ro   rq   r]   r   r   r   r   r[   
  s   
	 
r[   N)	r   r   r   r   r   r   r   ZConnectabler[   r   r   r   r   rY      s   rY   N)r   operatorr    r   r   r   r   r	   rK   r
   Zsqlr   r   objectr   r   rV   rX   rY   r   r   r   r   <module>   s$   
 +P