
    ؄_w&                     6   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e          Z G d de          Z G d de          Z e              G d de          Z e              G 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                       e Zd ZdZd Z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                 $    | t           | j        <   d S N)
strategiesname)selfs    a/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/engine/strategies.py__init__zEngineStrategy.__init__(   s     $
49    c                     t                      )z/Given arguments, returns a new Engine instance.NotImplementedError)r   argskwargss      r   createzEngineStrategy.create+   s     "###r   N)__name__
__module____qualname____doc__r   r    r   r   r   r       s<         % % %$ $ $ $ $r   r   c                       e Zd ZdZd ZdS )DefaultEngineStrategyz#Base class for built-in strategies.c                    t          j        |          }|                              }|j                            dd                                dd            |                                }|                    |                              dd          rd%fd	}nj        }i }t          j                  D ]}|v r ||          ||<                       dd           }	|	=i }
t          j	        j
                  D ]}|v r ||          |
|<    j
        d&i |
}	|	|d<   |D ]}|                    |            d&i |                    |          \                       |di                      t                     |d	d           }|d%fd
	} |d|          } |dd           }|                    |          }di}dddddddddd	}t          j        |          D ]*}|                    ||          }|v r ||          ||<   +|D ]}|                    ||            ||fi |}n6t%          |t&          j        j                  r |j        i }n|}|_        | j        }i }t          j        |          D ]}|v r ||          ||<                       dd          }rRt3          dd                    d D                       dj        j        d|j        j        d|j        d	           |||fi ||re                                r1fd }t=          j        |d!|           t=          j        |d"|           fd#}t=          j        |d!|d$                                           |ur|                                |D ]}|                                S )'Npluginplugins_coerce_configFc                 r                         | |          }| j        v r j        |          |          }|S r   )popengine_config_types)keydefaultvaluedialect_clsr   s      r   	pop_kwargz/DefaultEngineStrategy.create.<locals>.pop_kwargB   s@    

300+999@K;C@GGEr   moduledbapiconnect_argsr
   c                 r    j         r#j        j        D ]} ||           }||c S  j        i S r   )_has_eventsdispatch
do_connectconnect)connection_recordfn
connectioncargscparamsdialects      r   r7   z-DefaultEngineStrategy.create.<locals>.connectj   sn    & .%.9 . .%'R#%6w& &
 &1#---- 2&w9999r   creator	poolclassr=   pool_logging_name	echo_poolpool_timeoutpool_recyclepool_eventspool_threadlocalpool_reset_on_returnpool_pre_pingpool_use_lifo)	logging_nameechotimeoutrecycleeventsuse_threadlocalreset_on_returnpre_pinguse_lifo_initializeTzInvalid argument(s) ,c              3       K   | ]	}d |z  V  
dS )z'%s'Nr!   ).0ks     r   	<genexpr>z/DefaultEngineStrategy.create.<locals>.<genexpr>   s&      88AVaZ888888r   z. sent to create_engine(), using configuration /z^.  Please check that the keyword arguments are appropriate for this combination of components.c                 H    t          | d|           }|d S  |           d S )N_sqla_unwrap)getattr)dbapi_connectionr8   conndo_on_connects      r   
on_connectz0DefaultEngineStrategy.create.<locals>.on_connect   s<    "(.:J D |!M$'''''r   first_connectr7   c                     t          j        | d          }t          j                    |_                            |                               |j                   d S )NF)r:   r4   )r   
Connectionr   immutabledict_execution_options
initializedo_rollbackr:   )r\   r8   cr=   engines      r   r`   z3DefaultEngineStrategy.create.<locals>.first_connect   sd    O'7U   (,'9';';$""1%%%##AL11111r   )_once_unless_exceptionr   r!   )!r   make_url_instantiate_pluginsqueryr)   _get_entrypointget_dialect_clsr   get_cls_kwargsget_func_kwargsr1   handle_dialect_kwargscreate_connect_argsupdatelistget_pool_classgethandle_pool_kwargs
isinstancepoollibdbapi_proxy_DBProxyget_pool_dialect
engine_cls	TypeErrorjoin	__class__r   r_   r	   listenengine_created)r   name_or_urlr   ur&   
entrypointr/   dialect_argsrV   r1   
dbapi_argsr%   r
   r7   r>   r?   	pool_args	translatetkengineclassengine_argsrR   r_   r`   r;   r<   r=   r.   r^   rh   s     `                     @@@@@@r   r   zDefaultEngineStrategy.create4   s]   L%%((00	Hd###

9d###&&((
 0033::&.. 		#        
I$[11 	/ 	/AF{{"+)A,,Q

8T**=J)+*;<< 1 1;;$-IaLLJqM%K%33
33E %W 	D 	DF((lCCCC +---- #66q99yy44555U y&&<: : : : : : : :  i	733G!	+t44I '66q99	"G,I
 !4#))'#5#9++
 
I (33 1 1]]1a((<<#,9R==IaL! @ @)))Y????9W22	22DD$ 3 <== $t}e7w77#DM o$[11 	. 	.AF{{!*1Ajj55  	) HH888888888%...N+++(((	   T7A==== 	#..00M :( ( ( ( ( T?J???T9j9992 2 2 2 2 2 L'+	    	""6***[((%%f--- 	* 	*F!!&))))r   N)r   r   r   r    r   r!   r   r   r#   r#   1   s.        --d d d d dr   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   Enginer~   r!   r   r   r   r      s         44DJJJr   r   c                   $    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   TLEnginer~   r!   r   r   r   r      s!        GGD%JJJr   r   c                   B    e Zd ZdZdZd Z G 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.

    mockc                    t          j        |          }|                                }i }t          j        |          D ]}||v r|                    |          ||<    |di |}t                              ||          S )Nr!   )r   rj   get_dialectr   ro   r)   r   MockConnection)	r   r   executorr   r   r.   r   rV   r=   s	            r   r   zMockEngineStrategy.create   s    L%%mmoo$[11 	0 	0AF{{"(**Q--Q +----!00(CCCr   c                       e Zd Zd Z ed           Z e ed                    Z ed           Z e	j
        d          Zd Zd Zd Zd	 Zd
 Zd Z	 ddZd ZdS )!MockEngineStrategy.MockConnectionc                 "    || _         || _        d S r   )r}   execute)r   r=   r   s      r   r   z*MockEngineStrategy.MockConnection.__init__  s    #DM"DLLLr   c                     | S r   r!   ss    r   <lambda>z*MockEngineStrategy.MockConnection.<lambda>  s    A r   r}   c                     | j         j        S r   )r}   r   r   s    r   r   z*MockEngineStrategy.MockConnection.<lambda>  s
    !*/ r   Nc                     | S r   r!   r   r   s     r   contextual_connectz4MockEngineStrategy.MockConnection.contextual_connect      Kr   c                     | S r   r!   r   s     r   r7   z)MockEngineStrategy.MockConnection.connect  r   r   c                     | S r   r!   )r   kws     r   execution_optionsz3MockEngineStrategy.MockConnection.execution_options  r   r   c                 .     | j         j        ||fd| i|S )Nrh   )r}   compiler)r   	statement
parametersr   s       r   r   z*MockEngineStrategy.MockConnection.compiler  s5    )4=): .26<  r   c                 j    d|d<   ddl m}  |j        | j        | fi |                    |           d S NF
checkfirstr   )ddl)sqlalchemy.enginer   SchemaGeneratorr=   traverse_singler   entityr   r   s       r   r   z(MockEngineStrategy.MockConnection.create#  s\    #(F< ------Cd==f==MM    r   c                 j    d|d<   ddl m}  |j        | j        | fi |                    |           d S r   )r   r   SchemaDropperr=   r   r   s       r   dropz&MockEngineStrategy.MockConnection.drop+  s\    #(F< ------CdlD;;F;;KK    r   c                 T    d|d<    || j         | fi |                    |           d S )NFr   )r=   r   )r   visitorcallableelementr:   r   s        r   _run_visitorz.MockEngineStrategy.MockConnection._run_visitor3  sI     $)F< ODL$99&99II    r   c                     t                      r   r   )r   object_multiparamsparamss       r   r   z)MockEngineStrategy.MockConnection.execute;  s    %'''r   r   )r   r   r   r   propertyrh   r   r=   r   r   _schema_getterschema_for_objectr   r7   r   r   r   r   r   r   r!   r   r   r   r   
  s        	# 	# 	# ++&&(::j1122x11221F1$77	 	 		 	 		 	 		 	 	
	 	 		 	 	 8<	 	 	 		( 	( 	( 	( 	(r   r   N)	r   r   r   r    r   r   r   Connectabler   r!   r   r   r   r      sd          DD D D"2( 2( 2( 2( 2() 2( 2( 2( 2( 2(r   r   N)r    operatorr    r   r   r   r	   r
   ry   r   sqlr   r   objectr   r#   r   r   r   r!   r   r   <module>r      s                                                     
$ $ $ $ $V $ $ $"g g g g gN g g gT    /        & & & & & 5 & & &     M( M( M( M( M( M( M( M(`       r   