a
    ÆZEg"  ã                   @   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__© úq/var/www/sistema_ama/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r„t|ƒ\}}‰ }}	|d p˜| d¡p˜|}|d p®| d¡p®|}z|d d ‰ W n t	yÖ   d‰ Y n0 ˆ du röt
|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 �røt d| ¡ dd„ }z@||ƒD ]2}tj |¡�s¾ �qÚt d | ¡ t |¡ �q¦W n t�yò   Y dS 0 �n|tv �r¸d!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 �røtj  d-¡}|�rÞd!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 �rŒW  �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   