B
    ©0H[>&  ã               @   s6  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 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)Úlocal)Úsettings)ÚImproperlyConfigured)Úcached_property)Úimport_stringÚdefaultZ_django_versionc               @   s   e Zd ZdS )ÚErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úSC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\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   /   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__9   s    zDatabaseErrorWrapper.__init__c             C   s   d S )Nr   )r   r   r   r   Ú	__enter__A   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__D   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   3   s
   r   c          
   C   s¨   | dkrd} yt d|  ƒS  tk
r¢ } zltj tj t¡d¡}dd„ t |g¡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.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   )r-   Úbr   r   r   r1   w   s    zg%r isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    %sz, N)r   ÚImportErrorÚosÚpathÚjoinÚdirnameÚ__file__ÚpkgutilÚiter_modulesÚmapÚreprÚsortedr   )Zbackend_nameZe_userZbackend_dirZbuiltin_backendsZbackend_reprsr   r   r   Úload_backendd   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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)rA   r   Z	DATABASESÚDEFAULT_DB_ALIASr   )r   r   r   r   rC   �   s    


zConnectionHandler.databasesc             C   s²   y| 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¡ 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 %s doesn't existZATOMIC_REQUESTSFZ
AUTOCOMMITTrD   zdjango.db.backends.dummyzdjango.db.backends.ZCONN_MAX_AGEr   ÚOPTIONSZ	TIME_ZONEN)ÚNAMEÚUSERZPASSWORDZHOSTZPORTÚ )rC   ÚKeyErrorr?   Ú
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 | di ¡}xdD ]}| |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)ÚCHARSETZ	COLLATIONrG   ZMIRRORN)rC   rJ   r?   rK   )r   rL   rM   Ztest_settingsÚkeyr   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 )NrD   )	ÚhasattrrB   r   rN   rQ   rC   r>   ZDatabaseWrapperÚsetattr)r   rL   ÚdbÚbackendrM   r   r   r   Ú__getitem__Ã   s    


zConnectionHandler.__getitem__c             C   s   t | j||ƒ d S )N)rS   rB   )r   rP   Úvaluer   r   r   Ú__setitem__Ï   s    zConnectionHandler.__setitem__c             C   s   t | j|ƒ d S )N)ÚdelattrrB   )r   rP   r   r   r   Ú__delitem__Ò   s    zConnectionHandler.__delitem__c             C   s
   t | jƒS )N)ÚiterrC   )r   r   r   r   Ú__iter__Õ   s    zConnectionHandler.__iter__c                s   ‡ fdd„ˆ D ƒS )Nc                s   g | ]}ˆ | ‘qS r   r   )r-   rL   )r   r   r   r1   Ù   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 | ¡  qW d S )N)r   rB   ÚAttributeErrorÚclose)r   rL   Ú
connectionr   r   r   Ú	close_allÛ   s    
zConnectionHandler.close_all)N)r
   r   r   r   r   rC   rN   rQ   rV   rX   rZ   r\   r]   ra   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|}| |¡ qW |S )N)rc   r   ZDATABASE_ROUTERSÚ
isinstanceÚstrr   Úappend)r   rd   ÚrÚrouterr   r   r   rd   ë   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)rd   r   r^   ÚgetÚ_staterT   rE   )r   ÚmodelÚhintsZ	chosen_dbri   Úmethodrj   )Úactionr   r   Ú	_route_dbù   s    
z0ConnectionRouter._router_func.<locals>._route_dbr   )rp   rq   r   )rp   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)rd   Úallow_relationr^   rl   rT   )r   Zobj1Úobj2rn   ri   ro   Úallowr   r   r   ru     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)rd   Úallow_migrater^   )r   rT   Ú	app_labelrn   ri   ro   rw   r   r   r   rx     s    
zConnectionRouter.allow_migratec             C   s   | j ||jj|jj|d�S )N)Ú
model_namerm   )rx   Z_metary   rz   )r   rT   rm   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   )r{   )r-   rm   )rT   r   r   r   r1   4  s    z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Z
get_models)r   Z
app_configrT   r|   Úmodelsr   )rT   r   r   Úget_migratable_models1  s    z&ConnectionRouter.get_migratable_models)N)F)r
   r   r   r   r   rd   rr   rs   rt   ru   rx   r{   r~   r   r   r   r   rb   ä   s   
rb   )r4   r9   Ú	importlibr   Ú	threadingr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr   rE   ZDJANGO_VERSION_PICKLE_KEYÚ	Exceptionr	   r   r   r   r   r   r   r   r   r   r>   r?   r@   rb   r   r   r   r   Ú<module>   s.   1]