o a~&@s,ddlZddlmZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z d Zd ZGd d d eZGd ddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddZdd ZGd!d"d"e ZGd#d$d$ZdS)%N) import_modulesettings)ImproperlyConfigured)ConnectionDoesNotExist)BaseConnectionHandler)cached_property) import_stringdefault_django_versionc@ eZdZdS)ErrorN__name__ __module__ __qualname__rr1/usr/lib/python3/dist-packages/django/db/utils.pyr r c@r )InterfaceErrorNrrrrrrrrc@r ) DatabaseErrorNrrrrrrrrc@r ) DataErrorNrrrrrrrrc@r )OperationalErrorNrrrrrr rrc@r )IntegrityErrorNrrrrrr$rrc@r ) InternalErrorNrrrrrr(rrc@r )ProgrammingErrorNrrrrrr,rrc@r )NotSupportedErrorNrrrrrr0rrc@s0eZdZdZddZddZddZdd Zd S) DatabaseErrorWrapperz~ Context manager and decorator that reraises backend-specific database exceptions using Django's common wrappers. cC ||_dS)zx wrapper is a database wrapper. It must have a Database attribute defining PEP-249 exceptions. N)wrapper)selfrrrr__init__:s zDatabaseErrorWrapper.__init__cCsdSNrr rrr __enter__BszDatabaseErrorWrapper.__enter__c Csp|durdStttttttttf D]$}t |j j |j }t ||r5||j}|ttfvr/d|j _|||qdSNT)rrrrrrrrr getattrrDatabaser issubclassargserrors_occurredwith_traceback)r exc_type exc_value traceback dj_exc_type db_exc_type dj_exc_valuerrr__exit__Es(    zDatabaseErrorWrapper.__exit__csfdd}|S)Ncs6|i|WdS1swYdSr"r)r)kwargsfuncr rrinner_s $z,DatabaseErrorWrapper.__call__..innerr)r r5r6rr4r__call__\szDatabaseErrorWrapper.__call__N)rrr__doc__r!r$r2r7rrrrr4s  rc Cs|dkrd}ztd|WStyG}z.ddl}ddt|jjjD}|dd|DvrBtt t |}t d |d |f|d}~ww) 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_psycopg2zdjango.db.backends.postgresqlz%s.baserNcSs"g|] \}}}|r|dvr|qS)>basedummyr).0_nameispkgrrr tsz load_backend..cSsg|]}d|qS)zdjango.db.backends.%sr)r;brrrr?xsz%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 ImportErrordjango.db.backendspkgutil iter_modulesdbbackends__path__mapreprsortedrjoin) backend_namee_userdjangobuiltin_backends backend_reprsrrr load_backendes*  rQcsPeZdZdZdZfddZeddZddZd d Z d d Z d dZ Z S)ConnectionHandler DATABASESTcsXt|}|ikrddi|t<|St|vrtdtd|tikr*d|td<|S)NENGINEdjango.db.backends.dummyzYou must define a 'z ' database.)superconfigure_settingsDEFAULT_DB_ALIASr)r databases __class__rrrWs     z$ConnectionHandler.configure_settingscCs|jSr"rr#rrrrYszConnectionHandler.databasescCsz|j|}Wnty|d|dw|dd|dd|dd|dd ks4|ds8d|d<|d d |d i|d ddD]}||dqLdS)z} Put the defaults into the settings dictionary for a given connection where no settings is provided. The connection '' doesn't exist.ATOMIC_REQUESTSF AUTOCOMMITTrTrUzdjango.db.backends. CONN_MAX_AGErOPTIONS TIME_ZONEN)NAMEUSERPASSWORDHOSTPORTrYKeyErrorexception_class setdefault)r aliasconnsettingrrrensure_defaultss        z!ConnectionHandler.ensure_defaultscCsbz|j|}Wnty|d|dw|di}gd}|D] \}}|||q$dS)zY Make sure the test settings are available in the 'TEST' sub-dictionary. r\r]TEST))CHARSETN) COLLATIONN)MIGRATET)MIRRORN)rcNNri)r rmrn test_settingsdefault_test_settingskeyvaluerrrprepare_test_settingss   z'ConnectionHandler.prepare_test_settingscCs6|||||j|}t|d}|||S)NrT)rprzrYrQDatabaseWrapper)r rmrEbackendrrrcreate_connections     z#ConnectionHandler.create_connectionc Cs:|D]}zt|j|}Wn tyYqw|qdSr")r& _connectionsAttributeErrorclose)r rm connectionrrr close_alls  zConnectionHandler.close_all) rrr settings_namethread_criticalrWpropertyrYrprzr}r __classcell__rrrZrrRs  rRc@s\eZdZdddZeddZddZedZed Zd d Z d d Z ddZ dddZ dS)ConnectionRouterNcCr)zT If routers is not specified, default to settings.DATABASE_ROUTERS. N)_routers)r routersrrrr!s zConnectionRouter.__init__cCsJ|jdur tj|_g}|jD]}t|trt|}n|}||q|Sr")rrDATABASE_ROUTERS isinstancestrr append)r rrrouterrrrrs     zConnectionRouter.routerscsfdd}|S)Nc std}|jD]!}zt|}Wn tyYqw||fi|}|r&|Sq|d}|dur8|jjr8|jjStS)Ninstance)rr&rget_staterErX)r modelhints chosen_dbrmethodractionrr _route_dbs   z0ConnectionRouter._router_func.._route_dbr)rrrrr _router_funcs zConnectionRouter._router_func db_for_read db_for_writec Ks\|jD]"}z|j}Wn tyYqw|||fi|}|dur%|Sq|jj|jjkSr")rallow_relationrrrE)r obj1obj2rrrallowrrrrs   zConnectionRouter.allow_relationc KsP|jD]"}z|j}Wn tyYqw|||fi|}|dur%|SqdSr%)r allow_migrater)r rE app_labelrrrrrrrrs   zConnectionRouter.allow_migratecCs|j||jj|jj|dS)N) model_namer)r_metarr)r rErrrrallow_migrate_models z$ConnectionRouter.allow_migrate_modelFcs |j|d}fdd|DS)z8Return app models allowed to be migrated on provided db.)include_auto_createdcsg|] }|r|qSr)r)r;rrEr rrr?(sz:ConnectionRouter.get_migratable_models..) get_models)r app_configrErmodelsrrrget_migratable_models%s z&ConnectionRouter.get_migratable_modelsr")F) rrrr!rrrrrrrrrrrrrrs    r)rC importlibr django.confrdjango.core.exceptionsrdjango.utils.connectionrrdjango.utils.functionalrdjango.utils.module_loadingr rXDJANGO_VERSION_PICKLE_KEY Exceptionr rrrrrrrrrrQrRrrrrrs.       1!R