3
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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G dd dZdd  ZG d!d" d"eZG d#d$ d$ZG d%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   3/usr/lib/python3.6/site-packages/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               @   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 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   st   |d krd S xbt ttttttttf	D ]H}t	| j
j|j}t||r$||j }|t tfkr`d| j
_|j||q$W d 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     | |S Q R X d 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|  S  tk
r } zjtttjd }dd tj|gD }| dd |D krtt	t
|}td| d	j|f |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>   r-   r+   r,   r   ).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   )r.   br   r   r   r2   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   r?      s   r?   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d| _dS )z{
        databases is an optional dictionary of database definitions (structured
        like settings.DATABASES).
        T)thread_criticalN)
_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| _ 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.)rB   r   	DATABASESDEFAULT_DB_ALIASr   )r   r   r   r   rD      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}
        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
AUTOCOMMITTrE   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   OPTIONS	TIME_ZONENNAMEUSERPASSWORDHOSTPORT )rJ   rK   rL   rM   rN   )rD   KeyErrorr?   
setdefault)r   aliasconn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 )	zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        zThe connection %s doesn't existZTESTCHARSET	COLLATIONrJ   MIRRORN)rV   rW   rJ   rX   )rD   rP   r?   rQ   )r   rR   rS   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 )NrE   )	hasattrrC   r   rU   rZ   rD   r>   ZDatabaseWrappersetattr)r   rR   dbbackendrS   r   r   r   __getitem__   s    


zConnectionHandler.__getitem__c             C   s   t | j|| d S )N)r\   rC   )r   rY   valuer   r   r   __setitem__   s    zConnectionHandler.__setitem__c             C   s   t | j| d S )N)delattrrC   )r   rY   r   r   r   __delitem__   s    zConnectionHandler.__delitem__c             C   s
   t | jS )N)iterrD   )r   r   r   r   __iter__   s    zConnectionHandler.__iter__c                s    fdd D S )Nc                s   g | ]} | qS r   r   )r.   rR   )r   r   r   r2      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   rC   AttributeErrorclose)r   rR   
connectionr   r   r   	close_all   s    
zConnectionHandler.close_all)N)r   r   r   r   r   rD   rU   rZ   r_   ra   rc   re   rf   rj   r   r   r   r   r@      s   
r@   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   sN   | j d krtj| _ g }x2| j D ](}t|tr8t| }n|}|j| qW |S )N)rl   r   DATABASE_ROUTERS
isinstancer5   r   append)r   rm   rrouterr   r   r   rm      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)rm   r   rg   get_stater]   rG   )r   modelhintsZ	chosen_dbrr   methodrs   )actionr   r   	_route_db   s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )ry   rz   r   )ry   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)rm   allow_relationrg   ru   r]   )r   Zobj1Zobj2rw   rr   rx   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)rm   allow_migraterg   )r   r]   	app_labelrw   rr   rx   r   r   r   r   r      s    
zConnectionRouter.allow_migratec             C   s   | j ||jj|jj|dS )N)
model_namerv   )r   _metar   r   )r   r]   rv   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S r   )r   )r.   rv   )r]   r   r   r   r2   9  s    z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)
get_models)r   
app_configr]   r   modelsr   )r]   r   r   get_migratable_models6  s    z&ConnectionRouter.get_migratable_models)N)F)r   r   r   r   r   rm   r{   r|   r}   r~   r   r   r   r   r   r   r   rk      s   
rk   ) r8   	importlibr   pathlibr   asgiref.localr   django.confr   django.core.exceptionsr   django.utils.functionalr   django.utils.module_loadingr   rG   DJANGO_VERSION_PICKLE_KEY	Exceptionr
   r   r   r   r   r   r   r   r   r   r>   r?   r@   rk   r   r   r   r   <module>   s.   1a