U
    7h"                     @   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__ r/var/www/formularioweb/env/lib/python3.8/site-packages/django_extensions/management/commands/drop_test_database.pyr      s\                         zCommand.add_argumentsc                    s"  |d }|d t kr,tjdtdd |d }tj|}|dkrLtd| |d}d	 } }   }}	|d
krt|\}} }}	|d p|dp|}|d p|dp|}z|d d  W n t	k
r   d Y nX  dkrt
|d p|d   dks d	krtd|dp"|}|dp2|	}	|d }
|d rXtdj d}nd}|dkrrtd dS  fdd}|tkrtd|  dd }z@||D ]2}tj|s qtd |  t| qW n tk
r   Y dS X n|tkrd!dl}||d"}|d#r.||d$< n||d%< |	rHt|	|d&< |jf |}| }|d'jD ]L}d(| }||}|d)k r qd*| }td+| d,  || qfnJ|tkrtj d-}|rd!dl!}nd!dl"}dd.i}|r||d< |r
||d< |r||d%< |	r&|	|d&< |jf |}|r@d/|_#n
|$d! | }|d'jD ]}d0| }zF|| |j%d)k rW  qd1| }td+| d,  || W n@ |j&k
r } zt'd2t(|  W Y  dS d}~X Y nX 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 mysqlr   USERr   ZPASSWORDZ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   s     z=Command.handle.<locals>.get_database_names.<locals>.<genexpr>   Nr   r1   r0   r4   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';r3   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infor7   r8   isfileunlinkOSErrorr   ZMySQLdb
startswithintconnectcursorexecuter
   	importlibutil	find_specrE   Zpsycopg2Z
autocommitZset_isolation_levelZrowcountZProgrammingError	exceptionstr)r   argsoptionsr$   ZdbinfoZenginer   r   Zdatabase_hostZdatabase_portr+   Zconfirmr6   r?   r,   ZDatabasekwargs
connectionrT   Zexists_query	row_countZ
drop_queryZhas_psycopg3Zconn_paramser"   r5   r#   handle1   s    


	











 zCommand.handle)__name__
__module____qualname__r   r   r   ra   __classcell__r"   r"   r    r#   r      s   r   )importlib.utilrV   	itertoolsr   r7   rL   rF   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   