U
     f!                     @   s   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 )    countN)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__ \/tmp/pip-unpacked-wheel-1isl55vw/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 qd*| }td+| d,  || qfn |tkrd!dl}dd-i}|r||d< |r||d< |r||d%< |	r
|	|d&< |jf |}|d! | }|d'jD ]}d.| }zF|| |j d)k r^W  qd/| }td+| d,  || W n@ |j!k
r } zt"d0t#|  W Y  dS d}~X Y nX q2ntd1| |
dks|d rtd2 dS )3z$Drop test database for this project.databaser   z2--router is deprecated. You should use --database.   )
stacklevelNzUnknown database %sZENGINE Z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>p   s     z=Command.handle.<locals>.get_database_names.<locals>.<genexpr>   Nr   r0   r/   r3   r#   get_database_namesf   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_filenamez   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';r2   zDROP DATABASE IF EXISTS `%s`zExecuting: ""Z	template1z>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   inputr9   printr	   logginginfor6   r7   isfileunlinkOSErrorr   ZMySQLdb
startswithintconnectcursorexecuter
   Zpsycopg2Zset_isolation_levelZrowcountZProgrammingError	exceptionstr)r   argsoptionsr$   ZdbinfoZenginer   r   Zdatabase_hostZdatabase_portr*   Zconfirmr5   r>   r+   ZDatabasekwargs
connectionrR   Zexists_queryZ	row_countZ
drop_queryZconn_paramser"   r4   r#   handle0   s    


	










 zCommand.handle)__name__
__module____qualname__r   r   r   r[   __classcell__r"   r"   r    r#   r      s   r   )	itertoolsr   r6   rJ   rD   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   