
    ]j"                         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e
      Zy)    Ncount)settings)BaseCommandCommandError)DEFAULT_DB_ALIAS)TEST_DATABASE_PREFIX)SQLITE_ENGINESPOSTGRESQL_ENGINESMYSQL_ENGINES)parse_mysql_cnf)signalcommand)RemovedInNextVersionWarningc                   2     e Zd ZdZ fdZed        Z xZS )Commandz%Drops test database for this project.c                 P   t         |   |       |j                  dddddd       |j                  dd	d
dd d       |j                  ddd
dd d       |j                  ddd
dd d       |j                  ddd
dt        d       |j                  dt        dt        z         y )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__s     b/root/env/lib/python3.12/site-packages/django_extensions/management/commands/drop_test_database.pyr   zCommand.add_arguments   s    f%m-[ 	 	
 	(7P 	 	
 	,wZT 	 	
 	*W8TH 	 	
 	*W8EUM 	 	
 	"2Z]mm 	 	
    c                 x   |d   }|d   t         k7  r!t        j                  dt        d       |d   }t        j
                  j                  |      }|t        d|z        |j                  d      }d	x}x}xx}}	|d
k(  rt        |      \  }}}}	|d   xs |j                  d      xs |}|d   xs |j                  d      xs |}	 |d   d   t        |d   xs |j                  d      z   d	k(  rt        d      |j                  d      xs |}|j                  d      xs |	}	|d   }
|d   rt        dj                              }nd}|dk7  rt        d       yfd}|t        v ryt        j                   d|z         d }	  ||      D ]P  }t"        j$                  j'                  |      s n/t        j                   d|z         t#        j(                  |       R n|t,        v rddl}||d }|j1                  d!      r||d"<   n||d#<   |	rt3        |	      |d$<    |j4                  d3i |}|j7                         } |d%j                        D ]Q  }d&|z  }|j9                  |      }|d'k  r nCd(|z  }t        j                   d)|z   d*z          |j9                  |       S n|t:        v rt<        j>                  jA                  d+      }|rddl!}nddl"}dd,i}|r||d<   |r||d<   |r||d#<   |	r|	|d$<    |j4                  d3i |}|rd-|_#        n|jI                  d       |j7                         } |d%j                        D ][  }d.|z  }	 |j9                  |       |jJ                  d'k  r nBd/|z  }t        j                   d)|z   d*z          |j9                  |       ] nt        d1|z        |
dk\  s|d   rt        d2       yy# t        $ r dY w xY w# t*        $ r Y yw xY w# |jL                  $ r,}t        jN                  d0tQ        |      z         Y d}~ yd}~ww xY w)4z$Drop test database for this project.databaser   z2--router is deprecated. You should use --database.   )
stacklevelNzUnknown database %sENGINE mysqlr   USERr   PASSWORDTESTNAMEr   z?You need to specify DATABASE_NAME in your Django settings file.HOST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   V    K     fdt        d      D        E d{    y7 w)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   0   K   | ]  } |        y w)N ).0ndatabase_name	formatters     r$   	<genexpr>z=Command.handle.<locals>.get_database_names.<locals>.<genexpr>q   s     F	-3Fs      Nr   )r<   r;   s   `r$   get_database_namesz*Command.handle.<locals>.get_database_namesg   s!       FU1XFFFs   )')zUnlinking %s databasesc                 l    t         j                  j                  |       \  }}dj                  |||      S )Nz{}_{}.{})ospathsplitextformat)namenumberfilenameexts       r$   format_filenamez'Command.handle.<locals>.format_filename{   s1     " 0 0 6# "((63??r%   zUnlinking database named "%s"r   )r   passwd/unix_sockethostportz{}_{}zKSELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='%s';r>   zDROP DATABASE IF EXISTS `%s`zExecuting: ""psycopg	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.r8   ))r   warningswarnr   r   	DATABASESgetr   r   KeyErrorr	   inputrD   printr
   logginginforA   rB   isfileunlinkOSErrorr   MySQLdb
startswithintconnectcursorexecuter   	importlibutil	find_specrP   psycopg2
autocommitset_isolation_levelrowcountProgrammingError	exceptionstr)r!   argsoptionsr'   dbinfoenginer   r   database_hostdatabase_portr3   confirmr?   rI   r4   Databasekwargs
connectionrb   exists_query	row_count
drop_queryhas_psycopg3conn_paramser;   s                            @r$   handlezCommand.handle1   s    :&8 00MMNPkxyzx(H##''1>4x?@@H%JLLLxL-L--WL[\bLcIT8]M=v<&**V"4<:&L&**Z*@LH	!"6N62M  0GH4E4[TZI[\M MR$7`aa

6*;m

6*;mK(	=! 	/ 06vmv/L	NG Ge$%
	G ^# LL1F:;@1/B 'G77>>'2LL!@7!JKIIg&	' }$&"F '',(5}%!.v!$]!3v)))3F3J&&(F-gnn= 	+a  #NN<8	q=;gE
^j83>?z*	+ ))$>>33I>L*+#[1K&*F#*2J'&3F#&3F#)))8K8J(,
%..q1&&(F-gnn= _ NN<0 *!BW!LJLL*!<s!BCNN:.  ;fDEE>W]3%& 4Y  	! M	!F  F  00 %%kCF&:;sC   O AO/ " O>1O>O,+O,/	O;:O;>P9!P44P9)__name__
__module____qualname__r   r   r   r~   __classcell__)r#   s   @r$   r   r      s#    2D
6 c' c'r%   r   )importlib.utilrd   	itertoolsr   rA   rY   rR   django.confr   django.core.management.baser   r   	django.dbr    django.db.backends.base.creationr	   django_extensions.settingsr
   r   r   "django_extensions.management.mysqlr   "django_extensions.management.utilsr   #django_extensions.utils.deprecationr   r   r8   r%   r$   <module>r      s=      	     A & A X X > < KB'k B'r%   