3
(h(                 @   sb  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G dd dejreneZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd de!Z"d d! Z#G d"d# d#eZ$G d$d% d%e!Z%G d&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   3/tmp/pip-install-q3hcpn_q/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               @   s0   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 S xzt ttttttttf	D ]`}t	| j
j|j}t||r$||j }||_t|dsb||_|t tfkrvd| j
_tj||| q$W d 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     | |S Q R X d 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} yt d|  S  tk
r } ztjjtjjttd}ydd tj	t
|gD }W n tk
rz   g }Y nX | dd |D krttt|}d| d	j||f }t|n W Y d
d
}~X nX d
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   s"   g | ]\}}}|r|dkr|qS )basedummypostgresql_psycopg2>   r0   r1   r2   r   ).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   )r3   br   r   r   r7      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_reprs	error_msgr   r   r   load_backendi   s"    


rF   c               @   s   e Zd ZdS )ConnectionDoesNotExistN)r   r   r   r   r   r   r   rG      s   rG   c               @   sb   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   sb   | j d krtj| _ | j i kr*tddii| _ | j t i krFd| j t d< t| j kr\tdt | j S )NENGINEzdjango.db.backends.dummyzYou must define a '%s' database)rI   r   Z	DATABASESDEFAULT_DB_ALIASr   )r   r   r   r   rK      s    


zConnectionHandler.databasesc             C   s   y| j | }W n  tk
r.   td| Y nX |jdd |jdd |jdd |d dksj|d  rrd|d< |jd	d
 |jdi  |jdd xdD ]}|j|d qW d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
AUTOCOMMITTrL   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   OPTIONSZ	TIME_ZONENNAMEUSERPASSWORDHOSTPORT )rO   rP   rQ   rR   rS   )rK   KeyErrorrG   
setdefault)r   aliasconnZsettingr   r   r   ensure_defaults   s    
z!ConnectionHandler.ensure_defaultsc             C   sZ   y| j | }W n  tk
r.   td| Y nX |jdi }xdD ]}|j|d qBW dS )	zZ
        Makes sure the test settings are available in the 'TEST' sub-dictionary.
        zThe connection %s doesn't existZTESTCHARSET	COLLATIONrO   MIRRORN)rZ   r[   rO   r\   )rK   rU   rG   rV   )r   rW   rX   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 )NrL   )	r$   rJ   r    rY   r^   rK   rF   ZDatabaseWrappersetattr)r   rW   dbbackendrX   r   r   r   __getitem__   s    


zConnectionHandler.__getitem__c             C   s   t | j|| d S )N)r_   rJ   )r   r]   valuer   r   r   __setitem__   s    zConnectionHandler.__setitem__c             C   s   t | j| d S )N)delattrrJ   )r   r]   r   r   r   __delitem__   s    zConnectionHandler.__delitem__c             C   s
   t | jS )N)iterrK   )r   r   r   r   __iter__   s    zConnectionHandler.__iter__c                s    fdd D S )Nc                s   g | ]} | qS r   r   )r3   rW   )r   r   r   r7      s    z)ConnectionHandler.all.<locals>.<listcomp>r   )r   r   )r   r   all   s    zConnectionHandler.allc             C   sB   x<| D ]4}yt | j|}W n tk
r0   wY nX |j  qW d S )N)r    rJ   AttributeErrorclose)r   rW   
connectionr   r   r   	close_all   s    
zConnectionHandler.close_all)N)r   r   r   r   r	   rK   rY   r^   rb   rd   rf   rh   ri   rm   r   r   r   r   rH      s   
rH   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   sP   | j d krtj| _ g }x4| j D ]*}t|tjr:t| }n|}|j| qW |S )N)ro   r   ZDATABASE_ROUTERS
isinstancer   string_typesr
   append)r   rp   rrouterr   r   r   rp      s    
zConnectionRouter.routersc                s    fdd}|S )Nc                sr   d }xF| j D ]<}yt| }W n tk
r2   Y qX ||f|}|r|S qW |jd}|d k	rn|jjrn|jjS tS )Ninstance)rp   r    rj   get_stater`   rM   )r   modelhintsZ	chosen_dbru   methodrv   )actionr   r   	_route_db  s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )r|   r}   r   )r|   r   _router_func  s    zConnectionRouter._router_funcdb_for_readdb_for_writec             K   sZ   xH| j D ]>}y
|j}W n tk
r*   Y qX |||f|}|d k	r|S qW |jj|jjkS )N)rp   allow_relationrj   rx   r`   )r   Zobj1obj2rz   ru   r{   allowr   r   r   r     s    
zConnectionRouter.allow_relationc             K   sP   xJ| j D ]@}y
|j}W n tk
r,   wY nX |||f|}|d k	r|S qW dS )NT)rp   allow_migraterj   )r   r`   	app_labelrz   ru   r{   r   r   r   r   r   $  s    
zConnectionRouter.allow_migratec             C   s   | j ||jj|jj|dS )N)
model_namery   )r   Z_metar   r   )r   r`   ry   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S r   )r   )r3   ry   )r`   r   r   r   r7   ?  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)N)F)r   r   r   r   r	   rp   r~   r   r   r   r   r   r   r   r   r   r   rn      s   
rn   )'r:   r?   	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
   rM   ZDJANGO_VERSION_PICKLE_KEYPY3	ExceptionStandardErrorr   r   r   r   r   r   r   r   r   objectr   rF   rG   rH   rn   r   r   r   r   <module>   s2   4#]