B
    CVvg~&  ã               @   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dS )%é    N)Úimport_module)Úsettings)ÚImproperlyConfigured)ÚConnectionDoesNotExist)ÚBaseConnectionHandler)Úcached_property)Úimport_stringÚdefaultZ_django_versionc               @   s   e Zd ZdS )ÚErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú3/tmp/pip-install-o3oxmrkh/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               @   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
_| |¡|‚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˜ } zbddl}dd„ t |jjj¡D ƒ}| dd„ |D ƒkr†tt	t
|ƒƒ}td	| d
 |¡f ƒ|‚n‚ W d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.baser   Nc             S   s"   g | ]\}}}|r|d kr|‘qS )>   ÚdummyÚbaser   )Ú.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   r0   x   s    z¹%r isn't an available database backend or couldn't be imported. Check the above exception. To use one of the built-in backends, use 'django.db.backends.XXX', where XXX is one of:
    %sz, )r   ÚImportErrorZdjango.db.backendsÚpkgutilÚiter_modulesÚdbÚbackendsÚ__path__ÚmapÚreprÚsortedr   Újoin)Zbackend_nameZe_userZdjangoZbuiltin_backendsZbackend_reprsr   r   r   Úload_backende   s    r<   c                   sP   e Zd ZdZdZ‡ fdd„Zedd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ Z‡  ZS )ÚConnectionHandlerZ	DATABASESTc                sX   t ƒ  |¡}|i kr"ddi|t< n2t|kr<tdt› d�ƒ‚n|t i krTd|t d< |S )NÚENGINEzdjango.db.backends.dummyzYou must define a 'z' database.)ÚsuperÚconfigure_settingsÚDEFAULT_DB_ALIASr   )r   Ú	databases)Ú	__class__r   r   r@   �   s    z$ConnectionHandler.configure_settingsc             C   s   | j S )N)r   )r   r   r   r   rB   ›   s    zConnectionHandler.databasesc             C   s¸   y| j | }W n& tk
r4   |  d|› d�¡‚Y nX | dd¡ | dd¡ | dd¡ |d d	ksn|d svd|d< | d
d¡ | di ¡ | dd¡ xdD ]}| |d¡ q W dS )z}
        Put the defaults into the settings dictionary for a given connection
        where no settings is provided.
        zThe connection 'z' doesn't exist.ZATOMIC_REQUESTSFZ
AUTOCOMMITTr>   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   ÚOPTIONSZ	TIME_ZONEN)ÚNAMEÚUSERZPASSWORDZHOSTZPORTÚ )rB   ÚKeyErrorÚexception_classÚ
setdefault)r   ÚaliasÚconnZsettingr   r   r   Úensure_defaultsŸ   s    
z!ConnectionHandler.ensure_defaultsc             C   sr   y| j | }W n& tk
r4   |  d|› d�¡‚Y nX | di ¡}dddddg}x|D ]\}}| ||¡ qVW d	S )
zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        zThe connection 'z' doesn't exist.ZTEST)ÚCHARSETN)Z	COLLATIONN)ZMIGRATET)ZMIRRORN)rE   NN)rB   rH   rI   rJ   )r   rK   rL   Ztest_settingsZdefault_test_settingsÚkeyÚvaluer   r   r   Úprepare_test_settings´   s    z'ConnectionHandler.prepare_test_settingsc             C   s6   |   |¡ |  |¡ | j| }t|d ƒ}| ||¡S )Nr>   )rM   rQ   rB   r<   ZDatabaseWrapper)r   rK   r5   Úbackendr   r   r   Úcreate_connectionÈ   s
    


z#ConnectionHandler.create_connectionc          	   C   sB   x<| D ]4}yt | j|ƒ}W n tk
r0   wY nX | ¡  qW d S )N)r   Z_connectionsÚAttributeErrorÚclose)r   rK   Ú
connectionr   r   r   Ú	close_allÏ   s    
zConnectionHandler.close_all)r   r   r   Zsettings_nameZthread_criticalr@   ÚpropertyrB   rM   rQ   rS   rW   Ú__classcell__r   r   )rC   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|}| |¡ qW |S )N)r[   r   ZDATABASE_ROUTERSÚ
isinstanceÚstrr   Úappend)r   r\   ÚrÚrouterr   r   r   r\   ß   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 | d¡}|d k	rn|jjrn|jjS tS )NÚinstance)r\   r   rT   ÚgetÚ_stater5   rA   )r   ÚmodelÚhintsZ	chosen_dbra   Úmethodrb   )Úactionr   r   Ú	_route_dbí   s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )rh   ri   r   )rh   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)r\   Úallow_relationrT   rd   r5   )r   Zobj1Úobj2rf   ra   rg   Úallowr   r   r   rm     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)r\   Úallow_migraterT   )r   r5   Ú	app_labelrf   ra   rg   ro   r   r   r   rp     s    
zConnectionRouter.allow_migratec             C   s   | j ||jj|jj|d�S )N)Ú
model_namere   )rp   Z_metarq   rr   )r   r5   re   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 | ]}ˆ  ˆ |¡r|‘qS r   )rs   )r,   re   )r5   r   r   r   r0   (  s    z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Z
get_models)r   Z
app_configr5   rt   Úmodelsr   )r5   r   r   Úget_migratable_models%  s    z&ConnectionRouter.get_migratable_models)N)F)r   r   r   r   r   r\   rj   rk   rl   rm   rp   rs   rv   r   r   r   r   rZ   Ø   s   
rZ   )r3   Ú	importlibr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.connectionr   r   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   rA   ZDJANGO_VERSION_PICKLE_KEYÚ	Exceptionr
   r   r   r   r   r   r   r   r   r   r<   r=   rZ   r   r   r   r   Ú<module>   s,   1!R