o
    ^"<f~&                     @   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default_django_versionc                   @      e Zd ZdS )ErrorN__name__
__module____qualname__ r   r   F/var/www/html/kck/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   0   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__:   s   
zDatabaseErrorWrapper.__init__c                 C   s   d S Nr   r    r   r   r   	__enter__B   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__E   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    r5   r6   r   r4   r   __call__\   s   zDatabaseErrorWrapper.__call__N)r   r   r   __doc__r!   r$   r2   r7   r   r   r   r   r   4   s    r   c              
   C   s   | dkrd} zt d|  W S  tyG } z.ddl}dd t|jjjD }| dd |D vrBt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.baser   Nc                 S   s"   g | ]\}}}|r|d vr|qS )>   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   r?   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   ImportErrordjango.db.backendspkgutiliter_modulesdbbackends__path__mapreprsortedr   join)backend_namee_userdjangobuiltin_backendsbackend_reprsr   r   r   load_backende   s*   	rQ   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 )ConnectionHandler	DATABASESTc                    sX   t  |}|i krddi|t< |S t|vrtdt d|t i kr*d|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   rW      s   
z$ConnectionHandler.configure_settingsc                 C   s   | j S r"   r   r#   r   r   r   rY      s   zConnectionHandler.databasesc                 C   s   z| j | }W n ty   | d| dw |dd |dd |dd |d d	ks4|d s8d|d< |d
d |di  |dd dD ]}||d qLdS )z}
        Put the defaults into the settings dictionary for a given connection
        where no settings is provided.
        The connection '' doesn't exist.ATOMIC_REQUESTSF
AUTOCOMMITTrT   rU   zdjango.db.backends.CONN_MAX_AGEr   OPTIONS	TIME_ZONEN)NAMEUSERPASSWORDHOSTPORT rY   KeyErrorexception_class
setdefault)r    aliasconnsettingr   r   r   ensure_defaults   s    z!ConnectionHandler.ensure_defaultsc                 C   sb   z| j | }W n ty   | d| dw |di }g d}|D ]
\}}||| q$dS )zY
        Make sure the test settings are available in the 'TEST' sub-dictionary.
        r\   r]   TEST))CHARSETN)	COLLATIONN)MIGRATET)MIRRORN)rc   NNri   )r    rm   rn   test_settingsdefault_test_settingskeyvaluer   r   r   prepare_test_settings   s   z'ConnectionHandler.prepare_test_settingsc                 C   s6   |  | | | | j| }t|d }|||S )NrT   )rp   rz   rY   rQ   DatabaseWrapper)r    rm   rE   backendr   r   r   create_connection   s
   


z#ConnectionHandler.create_connectionc              	   C   s:   | D ]}zt | j|}W n	 ty   Y qw |  qd S r"   )r&   _connectionsAttributeErrorclose)r    rm   
connectionr   r   r   	close_all   s   
zConnectionHandler.close_all)r   r   r   settings_namethread_criticalrW   propertyrY   rp   rz   r}   r   __classcell__r   r   rZ   r   rR      s    
rR   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
isinstancestrr	   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_staterE   rX   )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   rE   )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    rE   	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    rE   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   rE   r    r   r   r?   (  s    z:ConnectionRouter.get_migratable_models.<locals>.<listcomp>)
get_models)r    
app_configrE   r   modelsr   r   r   get_migratable_models%  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   )rC   	importlibr   django.confr   django.core.exceptionsr   django.utils.connectionr   r   django.utils.functionalr   django.utils.module_loadingr	   rX   DJANGO_VERSION_PICKLE_KEY	Exceptionr   r   r   r   r   r   r   r   r   r   rQ   rR   r   r   r   r   r   <module>   s.    1!R