ó
¿b›]c           @   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 d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e ƒ  d e f d „  ƒ  YZ e ƒ  d e f d „  ƒ  YZ e ƒ  d S(   sq  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.
iÿÿÿÿ(   t
   attrgetteri   (   t   base(   t   threadlocal(   t   urli   (   t   event(   t   pool(   t   util(   t   schemat   EngineStrategyc           B   s    e  Z d  Z d „  Z d „  Z RS(   sÂ   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(   t
   strategiest   name(   t   self(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   __init__(   s    c         O   s   t  ƒ  ‚ d S(   s/   Given arguments, returns a new Engine instance.N(   t   NotImplementedError(   R   t   argst   kwargs(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   create+   s    (   t   __name__t
   __module__t   __doc__R   R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR       s   	t   DefaultEngineStrategyc           B   s   e  Z d  Z d „  Z RS(   s#   Base class for built-in strategies.c            s¥  t  j | ƒ } | j ˆ ƒ } | j j d d  ƒ ˆ j d d  ƒ | j ƒ  } | j | ƒ ‰ ˆ j d t ƒ r† d  ‡ ‡ f d † } n	 ˆ j } i  } x6 t	 j
 ˆ ƒ D]% } | ˆ k r¥ | | ƒ | | <q¥ q¥ Wˆ j d d  ƒ }	 |	 d  k r@i  }
 x9 t	 j ˆ j ƒ D]% } | ˆ k r| | ƒ |
 | <qqWˆ j |
   }	 n  |	 | d <x | D] } | j ˆ | ƒ qQWˆ |   ‰ ˆ j | ƒ \ ‰  ‰ ˆ j | d i  ƒ ƒ t ˆ  ƒ ‰  | d d  ƒ } | d  k ríd  ‡  ‡ ‡ f d	 † } | d
 | ƒ } | d d  ƒ } | d  k rˆ j | ƒ } n  i ˆ d 6} i	 d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6} xH t	 j
 | ƒ D]7 } | j | | ƒ } | ˆ k r| | ƒ | | <qqWx | D] } | j | | ƒ qÁW| | |  } n9 t | t j j ƒ r| j ˆ  ˆ Ž  } n | } ˆ | _ |  j } i  } x6 t	 j
 | ƒ D]% } | ˆ k rE| | ƒ | | <qEqEWˆ j d t ƒ } ˆ rÇt d  d! j d" „  ˆ Dƒ ƒ ˆ j j | j j | j f ƒ ‚ n  | | ˆ | |  ‰ | rZˆ j  ƒ  ‰ ˆ r,‡ f d# †  } t! j" | d$ | ƒ t! j" | d% | ƒ n  ‡ ‡ f d& †  } t! j" | d$ | d' t ƒn  ˆ j# ˆ ƒ | ˆ k	 rƒ| j# ˆ ƒ n  x | D] } | j# ˆ ƒ qŠWˆ S((   Nt   plugint   pluginst   _coerce_configc            s;   ˆ j  |  | ƒ } |  ˆ  j k r7 ˆ  j |  | ƒ } n  | S(   N(   t   popt   engine_config_types(   t   keyt   defaultt   value(   t   dialect_clsR   (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt	   pop_kwargB   s    t   modulet   dbapit   connect_argsR   c            sX   ˆ j  rH x< ˆ j j D]+ } | ˆ |  ˆ  ˆ ƒ } | d  k	 r | Sq Wn  ˆ j ˆ  ˆ Ž  S(   N(   t   _has_eventst   dispatcht
   do_connectt   Nonet   connect(   t   connection_recordt   fnt
   connection(   t   cargst   cparamst   dialect(    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR&   j   s    	t   creatort	   poolclassR,   t   pool_logging_namet   logging_namet	   echo_poolt   echot   pool_timeoutt   timeoutt   pool_recyclet   recyclet   pool_eventst   eventst   pool_threadlocalt   use_threadlocalt   pool_reset_on_returnt   reset_on_returnt   pool_pre_pingt   pre_pingt   pool_use_lifot   use_lifot   _initializesª   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.t   ,c         s   s   |  ] } d  | Vq d S(   s   '%s'N(    (   t   .0t   k(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pys	   <genexpr>ª   s    c            s0   t  |  d |  ƒ } | d  k r" d  Sˆ  | ƒ d  S(   Nt   _sqla_unwrap(   t   getattrR%   (   t   dbapi_connectionR'   t   conn(   t   do_on_connect(    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt
   on_connect·   s
    t   first_connectR&   c            sK   t  j ˆ d |  d t ƒ} t j ƒ  | _ ˆ  j | ƒ ˆ  j | j ƒ d  S(   NR)   R"   (	   R   t
   Connectiont   FalseR   t   immutabledictt   _execution_optionst
   initializet   do_rollbackR)   (   RG   R'   t   c(   R,   t   engine(    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyRK   Â   s
    t   _once_unless_exception($   R   t   make_urlt   _instantiate_pluginst   queryR   R%   t   _get_entrypointt   get_dialect_clsRM   R   t   get_cls_kwargst   get_func_kwargsR    t   handle_dialect_kwargst   create_connect_argst   updatet   listt   get_pool_classt   gett   handle_pool_kwargst
   isinstancet   poollibt   dbapi_proxyt   _DBProxyt   get_poolt   _dialectt
   engine_clst   Truet	   TypeErrort   joint	   __class__R   RJ   R   t   listent   engine_created(   R   t   name_or_urlR   t   uR   t
   entrypointR   t   dialect_argsRD   R    t
   dbapi_argsR   R   R&   R-   R.   t	   pool_argst	   translatet   tkt   engineclasst   engine_argsRA   RJ   RK   (    (   R*   R+   R,   R   RI   RS   R   s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR   4   s°    	


				
(   R   R   R   R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR   1   s   t   PlainEngineStrategyc           B   s   e  Z d  Z d Z e j Z RS(   s*   Strategy for configuring a regular Engine.t   plain(   R   R   R   R
   R   t   EngineRi   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyRz   Û   s   t   ThreadLocalEngineStrategyc           B   s   e  Z d  Z d Z e j Z RS(   s=   Strategy for configuring an Engine with threadlocal behavior.R   (   R   R   R   R
   R   t   TLEngineRi   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR}   å   s   t   MockEngineStrategyc           B   s6   e  Z d  Z d Z d „  Z d e j f d „  ƒ  YZ RS(   s¼   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.

    t   mockc   	      K   sy   t  j | ƒ } | j ƒ  } i  } x9 t j | ƒ D]( } | | k r1 | j | ƒ | | <q1 q1 W| |   } t j | | ƒ S(   N(   R   RU   t   get_dialectR   RZ   R   R   t   MockConnection(	   R   Rp   t   executorR   Rq   R   Rs   RD   R,   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR   ù   s    R‚   c           B   s›   e  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 RS(   c         C   s   | |  _  | |  _ d  S(   N(   Rh   t   execute(   R   R,   R„   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR     s    	c         C   s   |  S(   N(    (   t   s(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   <lambda>  t    Rh   c         C   s
   |  j  j S(   N(   Rh   R
   (   R…   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR†     R‡   c         K   s   |  S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   contextual_connect  s    c         K   s   |  S(   N(    (   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR&     s    c         K   s   |  S(   N(    (   R   t   kw(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   execution_options  s    c         K   s   |  j  j | | d |  | S(   NRS   (   Rh   t   compiler(   R   t	   statementt
   parametersR   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR‹     s    	c         K   s=   t  | d <d d l m } | j |  j |  |  j | ƒ d  S(   Nt
   checkfirstiÿÿÿÿ(   t   ddl(   RM   t   sqlalchemy.engineR   t   SchemaGeneratorR,   t   traverse_single(   R   t   entityR   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR   #  s    
c         K   s=   t  | d <d d l m } | j |  j |  |  j | ƒ d  S(   NRŽ   iÿÿÿÿ(   R   (   RM   R   R   t   SchemaDropperR,   R’   (   R   R“   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   drop+  s    
c         K   s*   t  | d <| |  j |  |  j | ƒ d  S(   NRŽ   (   RM   R,   R’   (   R   t   visitorcallablet   elementR)   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   _run_visitor3  s    
c         O   s   t  ƒ  ‚ d  S(   N(   R   (   R   t   object_t   multiparamst   params(    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR„   ;  s    N(   R   R   R   t   propertyRS   R    R,   R
   R   t   _schema_getterR%   t   schema_for_objectRˆ   R&   RŠ   R‹   R   R•   R˜   R„   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR‚   
  s   								(   R   R   R   R
   R   R   t   ConnectableR‚   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyR   ï   s   	N(   R   t   operatorR    R‡   R   R   R   R   R   Rd   R   t   sqlR   R	   t   objectR   R   Rz   R}   R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/engine/strategies.pyt   <module>   s"   ªP