a
    8Xh"                     @   s   d dl Zd dlmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ G dd de
ZdS )    Ncount)settings)BaseCommandCommandError)DEFAULT_DB_ALIAS)TEST_DATABASE_PREFIX)SQLITE_ENGINESPOSTGRESQL_ENGINESMYSQL_ENGINES)parse_mysql_cnf)signalcommand)RemovedInNextVersionWarningc                       s,   e Zd ZdZ fddZedd Z  ZS )Commandz%Drops test database for this project.c                    s   t  | |jddddddd |jdd	d
dd dd |jddd
dd dd |jddd
dd dd |jddd
dtdd |jdtdt d d S )Nz	--noinputz
--no-inputstore_falseinteractiveTz:Tells Django to NOT prompt the user for input of any kind.)actiondestdefaulthelpz-Uz--userstoreuserz=Use another user for the database then defined in settings.pyz-Pz
--passwordpasswordzAUse another password for the database then defined in settings.pyz-Dz--dbnamedbnamez5Use another database name then defined in settings.pyz-Rz--routerrouterz:Use this router-database other then defined in settings.pyz
--databasezGNominates a database to run command for. Defaults to the "%s" database.)r   r   )superadd_argumentsadd_argumentr   )selfparser	__class__ }/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/django_extensions/management/commands/drop_test_database.pyr      s2    



zCommand.add_argumentsc                    s$  |d }|d t kr,tjdtdd |d }tj|}|du rLtd| |d}d	 } }   }}	|d
krt|\}} }}	|d p|dp|}|d p|dp|}z|d d  W n t	y   d Y n0  du rt
|d p|d   du s
 d	krtd|dp |}|dp0|	}	|d }
|d rVtdj d}nd}|dkrptd dS  fdd}|tv rtd|  dd }z@||D ]2}tj|s qtd |  t| qW n ty   Y dS 0 n|tv rd!dl}||d"}|d#r*||d$< n||d%< |	rDt|	|d&< |jf i |}| }|d'jD ]L}d(| }||}|d)k r qd*| }td+| d,  || qfnL|tv rtj d-}|rd!dl!}nd!dl"}dd.i}|r||d< |r
||d< |r||d%< |	r&|	|d&< |jf i |}|rDd/|_#n
|$d! | }|d'jD ]}d0| }zF|| |j%d)k rW  qd1| }td+| d,  || W n> |j&y } z"t'd2t(|  W Y d}~ dS d}~0 0 q`ntd3| |
dks|d r td4 dS )5z$Drop test database for this project.databaser   z2--router is deprecated. You should use --database.   )
stacklevelNzUnknown database %sZENGINE Zmysqlr   USERr   ZPASSWORDTESTNAMEr   z?You need to specify DATABASE_NAME in your Django settings file.ZHOSTZPORT	verbosityr   aG  
You have requested to drop all test databases.
This will IRREVERSIBLY DESTROY
ALL data in the database "{db_name}"
and all cloned test databases generated via
the "--parallel" flag (these are sequentially
named "{db_name}_1", "{db_name}_2", etc.).
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: )db_nameyeszReset cancelled.c                 3   s(   V   fddt dD E dH  dS )a}  
            Return a generator of all possible test database names.
            e.g., 'test_foo', 'test_foo_1', test_foo_2', etc.

            formatter: func returning a clone db name given the primary db name
            and the clone's number, e.g., 'test_foo_1' for mysql/postgres, and
            'test_foo_1..sqlite3' for sqlite (re: double dots, see comments).
            c                 3   s   | ]} |V  qd S )Nr"   ).0n)database_name	formatterr"   r#   	<genexpr>q       z=Command.handle.<locals>.get_database_names.<locals>.<genexpr>   Nr   r1   r0   r5   r#   get_database_namesg   s    	z*Command.handle.<locals>.get_database_nameszUnlinking %s databasesc                 S   s   t j| \}}d|||S )Nz{}_{}.{})ospathsplitextformat)namenumberfilenameextr"   r"   r#   format_filename{   s    z'Command.handle.<locals>.format_filenamezUnlinking database named "%s"r   )r   passwd/Zunix_sockethostportz{}_{}zKSELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%s';r4   zDROP DATABASE IF EXISTS `%s`zExecuting: ""psycopgZ	template1Tz>SELECT datname FROM pg_catalog.pg_database WHERE datname='%s';zDROP DATABASE IF EXISTS "%s";z	Error: %szUnknown database engine %szReset successful.))r   warningswarnr   r   Z	DATABASESgetr   r   KeyErrorr   inputr;   printr	   logginginfor8   r9   isfileunlinkOSErrorr   ZMySQLdb
startswithintconnectcursorexecuter
   	importlibutil	find_specrF   Zpsycopg2Z
autocommitZset_isolation_levelZrowcountZProgrammingError	exceptionstr)r   argsoptionsr$   ZdbinfoZenginer   r   Zdatabase_hostZdatabase_portr+   Zconfirmr7   r@   r,   ZDatabasekwargs
connectionrU   Zexists_queryZ	row_countZ
drop_queryZhas_psycopg3Zconn_paramser"   r6   r#   handle1   s    


	











 zCommand.handle)__name__
__module____qualname__r   r   r   ra   __classcell__r"   r"   r    r#   r      s   r   )importlib.utilrW   	itertoolsr   r8   rM   rG   Zdjango.confr   Zdjango.core.management.baser   r   Z	django.dbr   Z django.db.backends.base.creationr   Zdjango_extensions.settingsr	   r
   r   Z"django_extensions.management.mysqlr   Z"django_extensions.management.utilsr   Z#django_extensions.utils.deprecationr   r   r"   r"   r"   r#   <module>   s   