U
    8ÄT_ž(  ã                   @   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/tmp/pip-unpacked-wheel-dv63caxw/django/db/utils.pyr
      s   r
   c                   @   s   e Zd ZdS )ÚInterfaceErrorNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ÚDatabaseErrorNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )Ú	DataErrorNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ÚOperationalErrorNr   r   r   r   r   r       s   r   c                   @   s   e Zd ZdS )ÚIntegrityErrorNr   r   r   r   r   r   $   s   r   c                   @   s   e Zd ZdS )ÚInternalErrorNr   r   r   r   r   r   (   s   r   c                   @   s   e Zd ZdS )ÚProgrammingErrorNr   r   r   r   r   r   ,   s   r   c                   @   s   e Zd ZdS )ÚNotSupportedErrorNr   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   sp   |d krd S t 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
_| |¡|‚q"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&   ˆ� ˆ | |ŽW  5 Q R £ S Q R X d S r   r   )r#   Úkwargs©Úfuncr   r   r   Úinner_   s    z,DatabaseErrorWrapper.__call__.<locals>.innerr   )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} zt d|  ƒW S  tk
r  } zhtttƒjd ƒ}dd„ t |g¡D ƒ}| dd„ |D ƒkrŽtt	t
|ƒƒ}td| d	 |¡f ƒ|‚n‚ W 5 d
}~X Y 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 )>   Úpostgresql_psycopg2ÚbaseÚdummyr   )Ú.0Ú_ÚnameÚispkgr   r   r   Ú
<listcomp>t   s    ÿz load_backend.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )zdjango.db.backends.%sr   )r3   Úbr   r   r   r7   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)Úbackend_nameZe_userZbackend_dirZbuiltin_backendsZbackend_reprsr   r   r   Úload_backende   s&    
ÿþÿürD   c                   @   s   e Zd ZdS )ÚConnectionDoesNotExistNr   r   r   r   r   rE   „   s   rE   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)Z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ÚENGINEúdjango.db.backends.dummyz You must define a '%s' database.)rG   r   Z	DATABASESÚDEFAULT_DB_ALIASr   r   r   r   r   rI   –   s    

 ÿÿ
zConnectionHandler.databasesc                 C   s®   z| j | }W n  tk
r.   td| ƒ‚Y nX | dd¡ | dd¡ | dd¡ |d dksh|d spd|d< | d	d
¡ | di ¡ | dd¡ dD ]}| |d¡ q˜dS )z}
        Put the defaults into the settings dictionary for a given connection
        where no settings is provided.
        úThe connection %s doesn't existZATOMIC_REQUESTSFZ
AUTOCOMMITTrJ   rK   zdjango.db.backends.ZCONN_MAX_AGEr   ÚOPTIONSZ	TIME_ZONEN)ÚNAMEÚUSERZPASSWORDZHOSTZPORTÚ ©rI   ÚKeyErrorrE   Ú
setdefault)r   ÚaliasÚconnZsettingr   r   r   Úensure_defaults¦   s    z!ConnectionHandler.ensure_defaultsc                 C   sh   z| j | }W n  tk
r.   td| ƒ‚Y nX | di ¡}dddddg}|D ]\}}| ||¡ qNdS )	zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        rM   ZTEST)ÚCHARSETN)Z	COLLATIONN)ZMIGRATET)ZMIRRORN)rO   NNrR   )r   rU   rV   Ztest_settingsZdefault_test_settingsÚkeyÚvaluer   r   r   Úprepare_test_settings»   s    ûz'ConnectionHandler.prepare_test_settingsc                 C   s`   t | j|ƒrt| j|ƒS |  |¡ |  |¡ | j| }t|d ƒ}| ||¡}t| j||ƒ |S )NrJ   )	ÚhasattrrH   r!   rW   r[   rI   rD   ZDatabaseWrapperÚsetattr)r   rU   ÚdbÚbackendrV   r   r   r   Ú__getitem__Ï   s    


zConnectionHandler.__getitem__c                 C   s   t | j||ƒ d S r   )r]   rH   )r   rY   rZ   r   r   r   Ú__setitem__Û   s    zConnectionHandler.__setitem__c                 C   s   t | j|ƒ d S r   )ÚdelattrrH   )r   rY   r   r   r   Ú__delitem__Þ   s    zConnectionHandler.__delitem__c                 C   s
   t | jƒS r   )ÚiterrI   r   r   r   r   Ú__iter__á   s    zConnectionHandler.__iter__c                    s   ‡ fdd„ˆ D ƒS )Nc                    s   g | ]}ˆ | ‘qS r   r   )r3   rU   r   r   r   r7   å   s     z)ConnectionHandler.all.<locals>.<listcomp>r   r   r   r   r   Úallä   s    zConnectionHandler.allc              	   C   s@   | D ]6}zt | j|ƒ}W n tk
r0   Y qY nX | ¡  qd S r   )r!   rH   ÚAttributeErrorÚclose)r   rU   Ú
connectionr   r   r   Ú	close_allç   s    
zConnectionHandler.close_all)N)r   r   r   r   r   rI   rW   r[   r`   ra   rc   re   rf   rj   r   r   r   r   rF   ˆ   s   

rF   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   sJ   | j d krtj| _ g }| j D ](}t|tƒr6t|ƒƒ }n|}| |¡ q|S r   )rl   r   ZDATABASE_ROUTERSÚ
isinstancer:   r   Úappend)r   rm   ÚrÚrouterr   r   r   rm   ÷   s    


zConnectionRouter.routersc                    s   ‡ fdd„}|S )Nc              	      sr   d }| j D ]@}zt|ˆ ƒ}W n tk
r0   Y q
X ||f|Ž}|r
|  S q
| d¡}|d k	rn|jjrn|jjS tS )NÚinstance)rm   r!   rg   ÚgetÚ_stater^   rL   )r   ÚmodelÚhintsZ	chosen_dbrq   Úmethodrr   ©Úactionr   r   Ú	_route_db  s    


z0ConnectionRouter._router_func.<locals>._route_dbr   )ry   rz   r   rx   r   Ú_router_func  s    zConnectionRouter._router_funcÚdb_for_readÚdb_for_writec              	   K   sZ   | j D ]B}z
|j}W n tk
r(   Y qX |||f|Ž}|d k	r|  S q|jj|jjkS r   )rm   Úallow_relationrg   rt   r^   )r   Zobj1Úobj2rv   rq   rw   Úallowr   r   r   r~     s    


zConnectionRouter.allow_relationc              	   K   sR   | j D ]F}z
|j}W n tk
r,   Y qY nX |||f|Ž}|d k	r|  S qdS r    )rm   Úallow_migraterg   )r   r^   Ú	app_labelrv   rq   rw   r€   r   r   r   r�   '  s    



zConnectionRouter.allow_migratec                 C   s   | j ||jj|jj|d�S )N)Ú
model_nameru   )r�   Z_metar‚   rƒ   )r   r^   ru   r   r   r   Úallow_migrate_model5  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 | ]}ˆ  ˆ |¡r|‘qS r   )r„   )r3   ru   ©r^   r   r   r   r7   @  s      z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Z
get_models)r   Z
app_configr^   r…   Úmodelsr   r†   r   Úget_migratable_models=  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   ) r=   Ú	importlibr   Úpathlibr   Zasgiref.localr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   rL   ZDJANGO_VERSION_PICKLE_KEYÚ	Exceptionr
   r   r   r   r   r   r   r   r   r   rD   rE   rF   rk   r   r   r   r   Ú<module>   s.   1h