o
    uvXjA&  ã                   @   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ÚdefaultÚ_django_versionc                   @   ó   e Zd ZdS )ÚErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úL/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/utils.pyr      ó    r   c                   @   r   )ÚInterfaceErrorNr   r   r   r   r   r      r   r   c                   @   r   )ÚDatabaseErrorNr   r   r   r   r   r      r   r   c                   @   r   )Ú	DataErrorNr   r   r   r   r   r      r   r   c                   @   r   )ÚOperationalErrorNr   r   r   r   r   r      r   r   c                   @   r   )ÚIntegrityErrorNr   r   r   r   r   r   #   r   r   c                   @   r   )ÚInternalErrorNr   r   r   r   r   r   '   r   r   c                   @   r   )ÚProgrammingErrorNr   r   r   r   r   r   +   r   r   c                   @   r   )ÚNotSupportedErrorNr   r   r   r   r   r   /   r   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   ó
   || _ 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   sp   |d u rd S t ttttttttf	D ]$}t	| j
j|jƒ}t||ƒr5||jŽ }|t tfvr/d| j
_| |¡|‚qd S ©NT)r   r   r   r   r   r   r   r   r   Úgetattrr   ÚDatabaser   Ú
issubclassÚargsÚerrors_occurredÚwith_traceback)r   Úexc_typeÚ	exc_valueÚ	tracebackÚdj_exc_typeÚdb_exc_typeÚdj_exc_valuer   r   r   Ú__exit__D   s(   ÷

úôzDatabaseErrorWrapper.__exit__c                    s   ‡ ‡fdd„}|S )Nc                     s6   ˆ� ˆ | i |¤ŽW  d   ƒ S 1 sw   Y  d S r!   r   )r(   Úkwargs©Úfuncr   r   r   Úinner^   s   $ÿz,DatabaseErrorWrapper.__call__.<locals>.innerr   )r   r4   r5   r   r3   r   Ú__call__[   s   zDatabaseErrorWrapper.__call__N)r   r   r   Ú__doc__r    r#   r1   r6   r   r   r   r   r   3   s    r   c              
   C   s–   | dkrd} zt d|  ƒW S  tyJ } z1tttƒjd ƒ}dd„ t |g¡D ƒ}| dd„ |D ƒvrEtt	t
|ƒƒ}td| d	 |¡f ƒ|‚‚ d
}~ww )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 vr|‘qS )>   ÚbaseÚdummyÚpostgresql_psycopg2r   )Ú.0Ú_ÚnameÚispkgr   r   r   Ú
<listcomp>s   s    þÿz load_backend.<locals>.<listcomp>c                 S   s   g | ]}d | ‘qS )zdjango.db.backends.%sr   )r<   Úbr   r   r   r@   w   ó    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_nameÚe_userÚbackend_dirÚbuiltin_backendsÚbackend_reprsr   r   r   Úload_backendd   s*   
ÿþÿü€ïrR   c                   @   r   )ÚConnectionDoesNotExistNr   r   r   r   r   rS   ƒ   r   rS   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 u r	tj| _ | j i krtddii| _ t| j v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.)rU   r   Ú	DATABASESÚDEFAULT_DB_ALIASr   r"   r   r   r   rW   �   s   

ÿÿ
zConnectionHandler.databasesc                 C   s¨   z| j | }W n ty   td| ƒ‚w | dd¡ | dd¡ | dd¡ |d dks1|d s5d|d< | d	d
¡ | di ¡ | dd¡ dD ]}| |d¡ qIdS )z}
        Put the defaults into the settings dictionary for a given connection
        where no settings is provided.
        úThe connection %s doesn't existÚATOMIC_REQUESTSFÚ
AUTOCOMMITTrX   rY   zdjango.db.backends.ÚCONN_MAX_AGEr   ÚOPTIONSÚ	TIME_ZONEN)ÚNAMEÚUSERÚPASSWORDÚHOSTÚPORTÚ ©rW   ÚKeyErrorrS   Ú
setdefault)r   ÚaliasÚconnÚsettingr   r   r   Úensure_defaults    s    ÿÿz!ConnectionHandler.ensure_defaultsc                 C   sP   z| j | }W n ty   td| ƒ‚w | di ¡}dD ]}| |d¡ qdS )zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        r\   ÚTEST)ÚCHARSETÚ	COLLATIONrb   ÚMIRRORNrh   )r   rk   rl   Ú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 )NrX   )	ÚhasattrrV   r%   rn   ru   rW   rR   ÚDatabaseWrapperÚsetattr)r   rk   ÚdbÚbackendrl   r   r   r   Ú__getitem__Â   s   


zConnectionHandler.__getitem__c                 C   s   t | j||ƒ d S r!   )rx   rV   )r   rt   Úvaluer   r   r   Ú__setitem__Î   ó   zConnectionHandler.__setitem__c                 C   s   t | j|ƒ d S r!   )ÚdelattrrV   )r   rt   r   r   r   Ú__delitem__Ñ   s   zConnectionHandler.__delitem__c                 C   s
   t | jƒS r!   )ÚiterrW   r"   r   r   r   Ú__iter__Ô   s   
zConnectionHandler.__iter__c                    s   ‡ fdd„ˆ D ƒS )Nc                    s   g | ]}ˆ | ‘qS r   r   )r<   rk   r"   r   r   r@   Ø   rB   z)ConnectionHandler.all.<locals>.<listcomp>r   r"   r   r"   r   Úall×   r~   zConnectionHandler.allc              	   C   s:   | D ]}zt | j|ƒ}W n	 ty   Y qw | ¡  qd S r!   )r%   rV   ÚAttributeErrorÚclose)r   rk   Ú
connectionr   r   r   Ú	close_allÚ   s   ÿ
ûzConnectionHandler.close_allr!   )r   r   r   r    r   rW   rn   ru   r{   r}   r€   r‚   rƒ   r‡   r   r   r   r   rT   ‡   s    

rT   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   r   )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ƒrt|ƒƒ }n|}| |¡ q|S r!   )r‰   r   ÚDATABASE_ROUTERSÚ
isinstancerD   r   Úappend)r   rŠ   ÚrÚrouterr   r   r   rŠ   ê   s   


zConnectionRouter.routersc                    s   ‡ fdd„}|S )Nc              	      st   d }| j D ]!}zt|ˆ ƒ}W n	 ty   Y qw ||fi |¤Ž}|r&|  S q| d¡}|d ur8|jjr8|jjS tS )NÚinstance)rŠ   r%   r„   ÚgetÚ_statery   r[   )r   ÚmodelÚhintsÚ	chosen_dbr�   Úmethodr�   ©Úactionr   r   Ú	_route_dbø   s   
þÿ
z0ConnectionRouter._router_func.<locals>._route_dbr   )r˜   r™   r   r—   r   Ú_router_func÷   s   zConnectionRouter._router_funcÚdb_for_readÚdb_for_writec              	   K   s\   | j D ]"}z|j}W n	 ty   Y qw |||fi |¤Ž}|d ur%|  S q|jj|jjkS r!   )rŠ   Úallow_relationr„   r’   ry   )r   Úobj1Úobj2r”   r�   r–   Úallowr   r   r   r�     s   

þÿzConnectionRouter.allow_relationc              	   K   sP   | j D ]"}z|j}W n	 ty   Y qw |||fi |¤Ž}|d ur%|  S qdS r$   )rŠ   Úallow_migrater„   )r   ry   Ú	app_labelr”   r�   r–   r    r   r   r   r¡     s   

þÿzConnectionRouter.allow_migratec                 C   s   | j ||jj|jj|d�S )N)Ú
model_namer“   )r¡   Ú_metar¢   r£   )r   ry   r“   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<   r“   ©ry   r   r   r   r@   3  s    z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)Ú
get_models)r   Ú
app_configry   r¦   Úmodelsr   r§   r   Úget_migratable_models0  s   z&ConnectionRouter.get_migratable_modelsr!   )F)r   r   r   r    r   rŠ   rš   r›   rœ   r�   r¡   r¥   r«   r   r   r   r   rˆ   ã   s    

rˆ   ) rG   Ú	importlibr   Úpathlibr   Ú	threadingr   Údjango.confr   Údjango.core.exceptionsr   Údjango.utils.functionalr   Údjango.utils.module_loadingr   r[   ÚDJANGO_VERSION_PICKLE_KEYÚ	Exceptionr   r   r   r   r   r   r   r   r   r   rR   rS   rT   rˆ   r   r   r   r   Ú<module>   s0    1\