a
    ÛEbj&  ã                   @   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   úO/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/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   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 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__C   s    zDatabaseErrorWrapper.__enter__c              	   C   sp   |d u 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v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__F   s$    ÷

zDatabaseErrorWrapper.__exit__c                    s   ‡ ‡fdd„}|S )Nc                     s6   ˆ� ˆ | i |¤ŽW  d   ƒ S 1 s(0    Y  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   5   s
   r   c              
   C   s¢   | dkrd} zt d|  ƒW S  tyœ } zjddl}dd„ t |jjj¡D ƒ}| dd„ |D ƒvr†tt	t
|ƒƒ}td	| d
 |¡f ƒ|‚n‚ W Y d}~n
d}~0 0 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 vr|‘qS )>   ÚbaseÚdummyr   )Ú.0Ú_ÚnameÚispkgr   r   r   Ú
<listcomp>w   s   þz load_backend.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )zdjango.db.backends.%sr   )r2   Úbr   r   r   r6   |   ó    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)Úbackend_nameZe_userÚdjangoZbuiltin_backendsZbackend_reprsr   r   r   Úload_backendg   s&    þüÿú	rE   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|vr<tdt› d�ƒ‚n|t i krTd|t d< |S )NÚENGINEúdjango.db.backends.dummyzYou must define a 'z' database.)ÚsuperÚconfigure_settingsÚDEFAULT_DB_ALIASr   )r   Ú	databases©Ú	__class__r   r   rJ   “   s    
ÿz$ConnectionHandler.configure_settingsc                 C   s   | j S r   r   r   r   r   r   rL   Ÿ   s    zConnectionHandler.databasesc                 C   s²   z| j | }W n$ ty2   |  d|› d�¡‚Y n0 | dd¡ | dd¡ | dd¡ |d d	ksl|d std|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 'ú' doesn't exist.ZATOMIC_REQUESTSFZ
AUTOCOMMITTrG   rH   zdjango.db.backends.ZCONN_MAX_AGEr   ÚOPTIONSZ	TIME_ZONEN)ÚNAMEÚUSERZPASSWORDZHOSTZPORTÚ ©rL   ÚKeyErrorZexception_classÚ
setdefault)r   ÚaliasÚconnZsettingr   r   r   Úensure_defaults£   s    z!ConnectionHandler.ensure_defaultsc                 C   sf   z| j | }W n$ ty2   |  d|› d�¡‚Y n0 | di ¡}g d¢}|D ]\}}| ||¡ qLdS )zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        rO   rP   ÚTEST))ÚCHARSETN)Z	COLLATIONN)ZMIGRATET)ZMIRRORN)rR   NNrU   )r   rX   rY   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 )NrG   )rZ   r_   rL   rE   ZDatabaseWrapper)r   rX   r<   Úbackendr   r   r   Úcreate_connectionÌ   s
    


z#ConnectionHandler.create_connectionc              	   C   s>   | D ]4}zt | j|ƒ}W n ty.   Y qY n0 | ¡  qd S r   )r"   Z_connectionsÚAttributeErrorÚclose)r   rX   Ú
connectionr   r   r   Ú	close_allÓ   s    
zConnectionHandler.close_all)r   r   r   Zsettings_nameZthread_criticalrJ   ÚpropertyrL   rZ   r_   ra   re   Ú__classcell__r   r   rM   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 u rtj| _ g }| j D ](}t|tƒr6t|ƒƒ }n|}| |¡ q|S r   )ri   r   ZDATABASE_ROUTERSÚ
isinstanceÚstrr	   Úappend)r   rj   ÚrÚrouterr   r   r   rj   ã   s    


zConnectionRouter.routersc                    s   ‡ fdd„}|S )Nc              	      st   d }| j D ]B}zt|ˆ ƒ}W n ty.   Y q
0 ||fi |¤Ž}|r
|  S q
| d¡}|d urp|jjrp|jjS tS )NÚinstance)rj   r"   rb   ÚgetÚ_stater<   rK   )r   ÚmodelÚhintsZ	chosen_dbro   Úmethodrp   ©Úactionr   r   Ú	_route_dbñ   s    


z0ConnectionRouter._router_func.<locals>._route_dbr   )rw   rx   r   rv   r   Ú_router_funcð   s    zConnectionRouter._router_funcÚdb_for_readÚdb_for_writec              	   K   s\   | j D ]D}z
|j}W n ty&   Y q0 |||fi |¤Ž}|d ur|  S q|jj|jjkS r   )rj   Úallow_relationrb   rr   r<   )r   Zobj1Úobj2rt   ro   ru   Úallowr   r   r   r|     s    


zConnectionRouter.allow_relationc              	   K   sT   | j D ]H}z
|j}W n ty*   Y qY n0 |||fi |¤Ž}|d ur|  S qdS r!   )rj   Úallow_migraterb   )r   r<   Ú	app_labelrt   ro   ru   r~   r   r   r   r     s    



zConnectionRouter.allow_migratec                 C   s   | j ||jj|jj|d�S )N)Ú
model_namers   )r   Ú_metar€   r�   )r   r<   rs   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ƒ   )r2   rs   ©r<   r   r   r   r6   -  r8   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   rj   ry   rz   r{   r|   r   rƒ   r‡   r   r   r   r   rh   Ü   s   

rh   )r:   Ú	importlibr   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.connectionr   r   Zdjango.utils.functionalr   Zdjango.utils.module_loadingr	   rK   ZDJANGO_VERSION_PICKLE_KEYÚ	Exceptionr   r   r   r   r   r   r   r   r   r   rE   rF   rh   r   r   r   r   Ú<module>   s,   2#R