
 X(                 @   s  d  d l  Z  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 m Z d  d l m Z d  d	 l m Z d
 Z d Z Gd d   d e j r e n 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 e!  Z" d  d!   Z# Gd" d#   d# e  Z$ Gd$ d%   d% e!  Z% Gd& d'   d' e!  Z& d S)(    N)import_module)local)settings)ImproperlyConfigured)six)npathupath)cached_property)import_stringdefaultZ_django_versionc               @   s   e  Z d  Z d S)ErrorN)__name__
__module____qualname__ r   r   =/home/ubuntu/projects/ifolica/build/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   1   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 re-throws 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__C   s    zDatabaseErrorWrapper.__enter__c          	   C   s   | d  k r d  Sx t  t t t t t t t t f	 D] } t	 |  j
 j | j  } t | |  r2 | | j   } | | _ t | d  s | | _ n  | t  t f k r d |  j
 _ n  t j | | |  q2 q2 Wd  S)N__traceback__T)r   r   r   r   r   r   r   r   r   getattrr   ZDatabaser   
issubclassargs	__cause__hasattrr   Zerrors_occurredr   reraise)r   exc_type	exc_value	tracebackZdj_exc_typeZdb_exc_typeZdj_exc_valuer   r   r   __exit__F   s*    	zDatabaseErrorWrapper.__exit__c                s      f d d   } | S)Nc           
      s       |  |   SWd  QXd  S)Nr   )r"   kwargs)funcr   r   r   innerc   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   5   s
   r   c             C   s  |  d k r d }  n  y t  d |   SWn t k
 r} z t j j t j j t t   d  } y) d d   t j	 t
 |  g  D } Wn t k
 r g  } Yn X|  d d   | D k r t t t |   } d |  d	 j |  | f } t |   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>   baser2   dummyr   ).0_nameispkgr   r   r   
<listcomp>z   s   	 z load_backend.<locals>.<listcomp>c             S   s   g  |  ] } d  |  q S)zdjango.db.backends.%sr   )r5   br   r   r   r9      s   	 zu%r isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    %s
Error was: %sz, N)r   ImportErrorospathjoindirnamer   __file__pkgutiliter_modulesr   EnvironmentErrormapreprsortedr   )Zbackend_nameZe_userZbackend_dirZbuiltin_backendsZbackend_reprsZ	error_msgr   r   r   load_backendi   s"    	')rG   c               @   s   e  Z d  Z d S)ConnectionDoesNotExistN)r   r   r   r   r   r   r   rH      s   rH   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 S)z{
        databases is an optional dictionary of database definitions (structured
        like settings.DATABASES).
        N)
_databasesr   _connections)r   	databasesr   r   r   r      s    	zConnectionHandler.__init__c             C   s   |  j  d  k r t j |  _  n  |  j  i  k rG i i d d 6t 6|  _  n  |  j  t i  k rn d |  j  t d <n  t |  j  k r t d t   n  |  j  S)Nzdjango.db.backends.dummyENGINEzYou must define a '%s' database)rJ   r   Z	DATABASESDEFAULT_DB_ALIASr   )r   r   r   r   rL      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 <n  | j d	 d
  | j d i   | j d d  x- d d d d d g D] } | j | d  q Wd S)z~
        Puts the defaults into the settings dictionary for a given connection
        where no settings is provided.
        zThe connection %s doesn't existZATOMIC_REQUESTSFZ
AUTOCOMMITTrM   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   OPTIONSZ	TIME_ZONENNAMEUSERZPASSWORDZHOSTZPORT )rL   KeyErrorrH   
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)zZ
        Makes sure the test settings are available in the 'TEST' sub-dictionary.
        zThe connection %s doesn't existZTESTCHARSETZ	COLLATIONrP   ZMIRRORN)rL   rS   rH   rT   )r   rU   rV   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)NrM   )	r$   rK   r    rW   rZ   rL   rG   ZDatabaseWrappersetattr)r   rU   dbbackendrV   r   r   r   __getitem__   s    zConnectionHandler.__getitem__c             C   s   t  |  j | |  d  S)N)r[   rK   )r   rY   valuer   r   r   __setitem__   s    zConnectionHandler.__setitem__c             C   s   t  |  j |  d  S)N)delattrrK   )r   rY   r   r   r   __delitem__   s    zConnectionHandler.__delitem__c             C   s   t  |  j  S)N)iterrL   )r   r   r   r   __iter__   s    zConnectionHandler.__iter__c                s     f d d     D S)Nc                s   g  |  ] }   |  q Sr   r   )r5   rU   )r   r   r   r9      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    rK   AttributeErrorclose)r   rU   
connectionr   r   r   	close_all   s    zConnectionHandler.close_all)r   r   r   r   r	   rL   rW   rZ   r^   r`   rb   rd   re   ri   r   r   r   r   rI      s   rI   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)zY
        If routers is not specified, will default to settings.DATABASE_ROUTERS.
        N)_routers)r   routersr   r   r   r      s    zConnectionRouter.__init__c             C   ss   |  j  d  k r t j |  _  n  g  } xH |  j  D]= } t | t j  rX t |    } n | } | j |  q. W| S)N)rk   r   ZDATABASE_ROUTERS
isinstancer   string_typesr
   append)r   rl   rrouterr   r   r   rl      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)rl   r    rf   get_stater\   rN   )r   modelhintsZ	chosen_dbrq   methodrr   )actionr   r   	_route_db  s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )rx   ry   r   )rx   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)rl   allow_relationrf   rt   r\   )r   Zobj1obj2rv   rq   rw   allowr   r   r   r}     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)rl   allow_migraterf   )r   r\   	app_labelrv   rq   rw   r   r   r   r   r   $  s    zConnectionRouter.allow_migratec             C   s(   |  j  | | j j d | j j d | S)N
model_nameru   )r   Z_metar   r   )r   r\   ru   r   r   r   allow_migrate_model2  s
    z$ConnectionRouter.allow_migrate_modelFc                s,   | j  d |  }    f d d   | D S)zN
        Return app models allowed to be synchronized on provided db.
        include_auto_createdc                s(   g  |  ] }  j    |  r |  q Sr   )r   )r5   ru   )r\   r   r   r   r9   ?  s   	 z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Z
get_models)r   Z
app_configr\   r   modelsr   )r\   r   r   get_migratable_models:  s    z&ConnectionRouter.get_migratable_models)r   r   r   r   r	   rl   rz   r{   r|   r}   r   r   r   r   r   r   r   rj      s   rj   )'r<   rA   	importlibr   	threadingr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utilsr   Zdjango.utils._osr   r   Zdjango.utils.functionalr	   Zdjango.utils.module_loadingr
   rN   ZDJANGO_VERSION_PICKLE_KEYPY3	ExceptionStandardErrorr   r   r   r   r   r   r   r   r   objectr   rG   rH   rI   rj   r   r   r   r   <module>   s2   %4#]