o
    [hw&                     @   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   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/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              
      s4  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 rd' fdd	}|d|}|dd }|d u r|}di}dddddddddd	}t|D ]}|||}|v r||||< q|D ]}||| q||fi |}nt|tjjr|j i }n|}|_| j}i }t|D ]}|v r$||||< qdd}rFtdddd D jj|jj|jf |||fi ||r~ rnfd d!}t|d"| t|d#| fd$d%}tj|d"|dd&   |ur|  |D ]}|  qS ))NpluginpluginsZ_coerce_configFc                    s(    | |}|  jv 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                    sB   j rjjD ]}||  }|d ur|  S qj i 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	poolclassr1   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timeout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 u 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)r1   enginer   r   rB      s   

z3DefaultEngineStrategy.create.<locals>.first_connect)Z_once_unless_exceptionr   r   )!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   rA   r   listenZengine_created)r   name_or_urlr   ur    
entrypointr&   dialect_argsr;   r(   Z
dbapi_argsr   r	   r+   r2   r3   Z	pool_args	translatetkZengineclassZengine_argsr8   rA   rB   r   )r/   r0   r1   r%   r@   rE   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   ZEnginerO   r   r   r   r   r[          
r[   c                   @   rZ   )ThreadLocalEngineStrategyz=Strategy for configuring an Engine with threadlocal behavior.r   N)r   r   r   r   r   r   ZTLEnginerO   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 )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   sV   t |}| }i }t|D ]}||v r||||< q|di |}t||S )Nr   )r   rF   get_dialectr
   rH   r!   r_   MockConnection)	r   rT   executorr   rU   r%   rW   r;   r1   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   )rN   execute)r   r1   rc   r   r   r   r     s   
z*MockEngineStrategy.MockConnection.__init__c                 C      | S r   r   sr   r   r   <lambda>  s    z*MockEngineStrategy.MockConnection.<lambda>rN   c                 C   s   | j jS r   )rN   r   re   r   r   r   rg     s    Nc                 K   rd   r   r   r   r   r   r   r   contextual_connect     z4MockEngineStrategy.MockConnection.contextual_connectc                 K   rd   r   r   rh   r   r   r   r+     rj   z)MockEngineStrategy.MockConnection.connectc                 K   rd   r   r   )r   kwr   r   r   execution_options  rj   z3MockEngineStrategy.MockConnection.execution_optionsc                 K   s   | j j||fd| i|S )NrE   )rN   compiler)r   Z	statement
parametersr   r   r   r   rm     s   z*MockEngineStrategy.MockConnection.compilerc                 K   4   d|d< ddl m} |j| j| fi || d S NF
checkfirstr   )ddl)sqlalchemy.enginerr   ZSchemaGeneratorr1   traverse_singler   entityr   rr   r   r   r   r   #  
   z(MockEngineStrategy.MockConnection.createc                 K   ro   rp   )rs   rr   ZSchemaDropperr1   rt   ru   r   r   r   drop+  rw   z&MockEngineStrategy.MockConnection.dropc                 K   s&   d|d< || j | fi || d S )NFrq   )r1   rt   )r   Zvisitorcallableelementr.   r   r   r   r   _run_visitor3  s   z.MockEngineStrategy.MockConnection._run_visitorc                 O   r   r   r   )r   Zobject_Zmultiparamsparamsr   r   r   rc   ;  s   z)MockEngineStrategy.MockConnection.executer   )r   r   r   r   propertyrE   r   r1   r   r   Z_schema_getterZschema_for_objectri   r+   rl   rm   r   rx   rz   rc   r   r   r   r   ra   
  s    
	
ra   N)	r   r   r   r   r   r   r   ZConnectablera   r   r   r   r   r_      s
    r_   N)r   operatorr    r   r   r   r   r	   rM   r
   sqlr   r   objectr   r   r[   r^   r_   r   r   r   r   <module>   s&   
 +
P