
v^'                 @   s  d  d l  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	 Z d
 Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z d d    Z Gd! d"   d" e  Z Gd# d$   d$  Z Gd% d&   d&  Z d S)'    N)import_module)Path)Local)settings)ImproperlyConfigured)cached_property)import_stringdefaultZ_django_versionc               @   s   e  Z d  Z d S)ErrorN)__name__
__module____qualname__ r   r   1/tmp/pip-build-8lau8j11/django/django/db/utils.pyr
      s   r
   c               @   s   e  Z d  Z d S)InterfaceErrorN)r   r   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d S)DatabaseErrorN)r   r   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d S)	DataErrorN)r   r   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d S)OperationalErrorN)r   r   r   r   r   r   r   r       s   r   c               @   s   e  Z d  Z d S)IntegrityErrorN)r   r   r   r   r   r   r   r   $   s   r   c               @   s   e  Z d  Z d S)InternalErrorN)r   r   r   r   r   r   r   r   (   s   r   c               @   s   e  Z d  Z d S)ProgrammingErrorN)r   r   r   r   r   r   r   r   ,   s   r   c               @   s   e  Z d  Z d S)NotSupportedErrorN)r   r   r   r   r   r   r   r   0   s   r   c               @   sF   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 S)DatabaseErrorWrapperz~
    Context manager and decorator that reraises backend-specific database
    exceptions using Django's common wrappers.
    c             C   s   | |  _  d S)zx
        wrapper is a database wrapper.

        It must have a Database attribute defining PEP-249 exceptions.
        N)wrapper)selfr   r   r   r   __init__:   s    zDatabaseErrorWrapper.__init__c             C   s   d  S)Nr   )r   r   r   r   	__enter__B   s    zDatabaseErrorWrapper.__enter__c          	   C   s   | d  k r d  Sx t  t t t t t t t t f	 D]l } t	 |  j
 j | j  } t | |  r2 | | j   } | t  t f k r d |  j
 _ | j |  |  q2 Wd  S)NT)r   r   r   r   r   r   r   r   r
   getattrr   ZDatabaser   
issubclassargsZerrors_occurredwith_traceback)r   exc_type	exc_value	tracebackZdj_exc_typeZdb_exc_typeZdj_exc_valuer   r   r   __exit__E   s$    zDatabaseErrorWrapper.__exit__c                s      f d d   } | S)Nc           
      s       |  |   SWd  QRXd  S)Nr   )r   kwargs)funcr   r   r   inner_   s    z,DatabaseErrorWrapper.__call__.<locals>.innerr   )r   r&   r'   r   )r&   r   r   __call__\   s    zDatabaseErrorWrapper.__call__N)r   r   r   __doc__r   r   r$   r(   r   r   r   r   r   4   s
   r   c             C   s   |  d k r d }  y t  d |   SWn t k
 r } z t t t  j d  } d d   t j | g  D } |  d d   | D k r t t	 t
 |   } t d |  d	 j |  f  |  n   WYd
 d
 } ~ Xn Xd
 S)z
    Return a database backend's "base" module given a fully qualified database
    backend name, or raise an error if it doesn't exist.
    z&django.db.backends.postgresql_psycopg2zdjango.db.backends.postgresqlz%s.basebackendsc             S   s1   g  |  ]' \ } } } | r | d k r |  q S)basedummypostgresql_psycopg2>   r-   basedummyr   ).0_nameispkgr   r   r   
<listcomp>u   s   	 z load_backend.<locals>.<listcomp>c             S   s   g  |  ] } d  |  q S)zdjango.db.backends.%sr   )r0   br   r   r   r4   x   s   	 zg%r isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    %sz, N)r   ImportErrorstrr   __file__parentpkgutiliter_modulesmapreprsortedr   join)Zbackend_nameZe_userZbackend_dirZbuiltin_backendsZbackend_reprsr   r   r   load_backende   s    	r@   c               @   s   e  Z d  Z d S)ConnectionDoesNotExistN)r   r   r   r   r   r   r   rA      s   rA   c               @   s   e  Z d  Z d d d  Z e d d    Z d d   Z d d	   Z d
 d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)ConnectionHandlerNc             C   s   | |  _  t d d  |  _ d S)z{
        databases is an optional dictionary of database definitions (structured
        like settings.DATABASES).
        Zthread_criticalTN)
_databasesr   _connections)r   	databasesr   r   r   r      s    	zConnectionHandler.__init__c             C   s   |  j  d  k r t j |  _  |  j  i  k r? t d d i i |  _  t |  j  k r^ t d t   |  j  t i  k r d |  j  t d <|  j  S)NENGINEzdjango.db.backends.dummyz You must define a '%s' database.)rC   r   Z	DATABASESDEFAULT_DB_ALIASr   )r   r   r   r   rE      s    zConnectionHandler.databasesc             C   s   y |  j  | } Wn" t k
 r5 t d |   Yn X| j d d  | j d d  | j d d  | d d k s | d r d | d <| j d	 d
  | j d i   | j d d  x- d d d d d g D] } | j | d  q Wd S)z}
        Put the defaults into the settings dictionary for a given connection
        where no settings is provided.
        zThe connection %s doesn't existZATOMIC_REQUESTSFZ
AUTOCOMMITTrF   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   OPTIONSZ	TIME_ZONENNAMEUSERZPASSWORDZHOSTZPORT )rE   KeyErrorrA   
setdefault)r   aliasconnZsettingr   r   r   ensure_defaults   s    
z!ConnectionHandler.ensure_defaultsc             C   sy   y |  j  | } Wn" t k
 r5 t d |   Yn X| j d i   } x* d d d d g D] } | j | d  q[ Wd S)zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        zThe connection %s doesn't existZTESTCHARSETZ	COLLATIONrI   ZMIRRORN)rE   rL   rA   rM   )r   rN   rO   Ztest_settingskeyr   r   r   prepare_test_settings   s    z'ConnectionHandler.prepare_test_settingsc             C   s   t  |  j |  r" t |  j |  S|  j |  |  j |  |  j | } t | d  } | j | |  } t |  j | |  | S)NrF   )	hasattrrD   r   rP   rS   rE   r@   ZDatabaseWrappersetattr)r   rN   dbbackendrO   r   r   r   __getitem__   s    zConnectionHandler.__getitem__c             C   s   t  |  j | |  d  S)N)rU   rD   )r   rR   valuer   r   r   __setitem__   s    zConnectionHandler.__setitem__c             C   s   t  |  j |  d  S)N)delattrrD   )r   rR   r   r   r   __delitem__   s    zConnectionHandler.__delitem__c             C   s   t  |  j  S)N)iterrE   )r   r   r   r   __iter__   s    zConnectionHandler.__iter__c                s     f d d     D S)Nc                s   g  |  ] }   |  q Sr   r   )r0   rN   )r   r   r   r4      s   	 z)ConnectionHandler.all.<locals>.<listcomp>r   )r   r   )r   r   all   s    zConnectionHandler.allc             C   sM   xF |  D]> } y t  |  j |  } Wn t k
 r: w Yn X| j   q Wd  S)N)r   rD   AttributeErrorclose)r   rN   
connectionr   r   r   	close_all   s    zConnectionHandler.close_all)r   r   r   r   r   rE   rP   rS   rX   rZ   r\   r^   r_   rc   r   r   r   r   rB      s   rB   c               @   s   e  Z d  Z d d d  Z e d d    Z d d   Z e d  Z e d	  Z d
 d   Z	 d d   Z
 d d   Z d d d  Z d S)ConnectionRouterNc             C   s   | |  _  d S)zT
        If routers is not specified, default to settings.DATABASE_ROUTERS.
        N)_routers)r   routersr   r   r   r      s    zConnectionRouter.__init__c             C   sm   |  j  d  k r t j |  _  g  } xE |  j  D]: } t | t  rR t |    } n | } | j |  q+ W| S)N)re   r   ZDATABASE_ROUTERS
isinstancer7   r   append)r   rf   rrouterr   r   r   rf      s    zConnectionRouter.routersc                s     f d d   } | S)Nc                s   d  } xR |  j  D]G } y t |    } Wn t k
 r= Yq X| | |  } | r | Sq W| j d  } | d  k	 r | j j r | j j St S)Ninstance)rf   r   r`   get_staterV   rG   )r   modelhintsZ	chosen_dbrj   methodrk   )actionr   r   	_route_db   s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )rq   rr   r   )rq   r   _router_func   s    zConnectionRouter._router_funcdb_for_readdb_for_writec             K   sn   xU |  j  D]J } y | j } Wn t k
 r1 Yq
 X| | | |  } | d  k	 r
 | Sq
 W| j j | j j k S)N)rf   allow_relationr`   rm   rV   )r   Zobj1obj2ro   rj   rp   allowr   r   r   rv     s    zConnectionRouter.allow_relationc             K   s_   xX |  j  D]M } y | j } Wn t k
 r4 w
 Yn X| | | |  } | d  k	 r
 | Sq
 Wd S)NT)rf   allow_migrater`   )r   rV   	app_labelro   rj   rp   rx   r   r   r   ry      s    zConnectionRouter.allow_migratec             C   s(   |  j  | | j j d | j j d | S)N
model_namern   )ry   Z_metarz   r{   )r   rV   rn   r   r   r   allow_migrate_model.  s
    z$ConnectionRouter.allow_migrate_modelFc                s,   | j  d |  }    f d d   | D S)z8Return app models allowed to be migrated on provided db.include_auto_createdc                s(   g  |  ] }  j    |  r |  q Sr   )r|   )r0   rn   )rV   r   r   r   r4   9  s   	 z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Z
get_models)r   Z
app_configrV   r}   modelsr   )rV   r   r   get_migratable_models6  s    z&ConnectionRouter.get_migratable_models)r   r   r   r   r   rf   rs   rt   ru   rv   ry   r|   r   r   r   r   r   rd      s   rd   ) r:   	importlibr   Zpathlibr   Zasgiref.localr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   rG   ZDJANGO_VERSION_PICKLE_KEY	Exceptionr
   r   r   r   r   r   r   r   r   r   r@   rA   rB   rd   r   r   r   r   <module>   s.   1a