
    LȂi@                         S SK r S SKrS SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJr  S S	KJr  S
r " S S5      rg)    N)StringIO)apps)settings)serializers)router)atomic)RemovedInDjango70Warning)import_stringtest_c                       \ rS rSrSrS rS rS rS r SS jr	S	 r
S
 rS rS rS rSS jrSS jrSS jrS rSS jr SS jrS rS rS rS rS rSrg)BaseDatabaseCreation   zg
Encapsulate backend-specific differences pertaining to creation and
destruction of the test database.
c                     Xl         g N
connection)selfr   s     QD:\sksbv-state-backend\venv\Lib\site-packages\django/db/backends/base/creation.py__init__BaseDatabaseCreation.__init__   s    $    c                     U ? g r   r   r   s    r   __del__BaseDatabaseCreation.__del__   s    Or   c                 6    U R                   R                  5       $ r   )r   _nodb_cursorr   s    r   r   !BaseDatabaseCreation._nodb_cursor   s    ++--r   c                 d    [         R                  R                  U[        R                  -   5        g r   )sysstderrwriteoslinesep)r   msgs     r   logBaseDatabaseCreation.log"   s    

rzz)*r   Nc                    SSK Jn  U R                  5       nUS:  a3  SnU(       a  SnU R                  U< SU R	                  X5      < S35        U R                  XU5        U R                  R                  5         U[        R                  U R                  R                     S'   X`R                  R                  S'    U R                  R                  S	   S
   SL aH  [        R                  n[        R                  " 5        V	s0 sH  oR                  S_M     sn	[        l        U" S[!        US-
  S5      SU R                  R                  SS9  U R                  R                  S	   S
   SL a  W[        l        Ub@  ["        R$                  " SS[&        S9  U(       a  U R)                  5       U R                  l        U" SU R                  R                  S9  U R                  R-                  5         [.        R0                  R3                  S5      S:X  a  U R5                  5         U$ s  sn	f ! U R                  R                  S	   S
   SL a  W[        l        f f = f)z
Create a test database, prompting the user for confirmation if the
database already exists. Return the name of the test database created.
r   )call_command   CreatingzUsing existing test database for alias ...NAMETESTMIGRATEFNmigrateT)	verbosityinteractivedatabase
run_syncdbzDatabaseCreation.create_test_db(serialize) is deprecated. Call DatabaseCreation.serialize_test_db() once all test databases are set up instead if you need fixtures persistence between tests.   )
stacklevelcategorycreatecachetable)r4   RUNNING_DJANGOS_TEST_SUITEtrue)django.core.managementr)   _get_test_db_namer&   _get_database_display_str_create_test_dbr   closer   	DATABASESaliassettings_dictMIGRATION_MODULESr   get_app_configslabelmaxwarningswarnr	   serialize_db_to_string_test_serialized_contentsensure_connectionr#   environget mark_expected_failures_and_skips)
r   r2   autoclobber	serializekeepdbr)   test_database_nameactionold_migration_modulesapps
             r   create_test_db#BaseDatabaseCreation.create_test_db'   s    	8!335>F)HH 229Q 	YV<<N4??001&90B%%f-	C,,V4Y?5H(0(B(B%/3/C/C/E./EIItO/E.* i!mQ/!.. ,,V4Y?5H-B*  MMM 1 //1 9 	'$//2G2GH 	))+::>>676A113!!Y. ,,V4Y?5H-B* Is   ?AH- H(7H- (H- --Ic                 <    US   U R                   R                  S'   g)zh
Set this database up to be used in testing as a mirror of a primary
database whose settings are given.
r.   N)r   rC   )r   primary_settings_dicts     r   set_as_test_mirror'BaseDatabaseCreation.set_as_test_mirror}   s    
 1Ff0M%%f-r   c                 |   ^  U 4S jn[        5       n[        R                  " SU" 5       SUS9  UR                  5       $ )z
Serialize all data in the database into a JSON string.
Designed only for test runner usage; will not handle large
amounts of data.
c               3     >#    SSK Jn   U " TR                  5      n[        R                  " 5        GHL  nUR
                  c  M  UR                  UR                  ;   d  M/  UR                  [        R                  ;  d  MO  UR                  5        H  nUR                  R                  TR                  5      (       d  M/  [        R                  " TR                  R                   U5      (       d  Ma  UR"                  R%                  TR                  R                   5      R'                  UR                  R(                  R                  5      nUR*                  (       a  SOS nUR-                  US9 S h  vN   M     GMO     g  N7f)Nr   )MigrationLoaderi  )
chunk_size)django.db.migrations.loaderr_   r   r   rE   models_modulerF   migrated_appsnamer   TEST_NON_SERIALIZED_APPS
get_models_metacan_migrater   allow_migrate_modelrB   _base_managerusingorder_bypk_prefetch_related_lookupsiterator)r_   loader
app_configmodelquerysetr`   r   s         r   get_objects@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objects   s    C$T__5F"224
,,8"((F,@,@@"x/P/PP!+!6!6!8 ;;22 OO $889N9NPUVV',':':'@'@ $ 5 5(&hu{{~~':':; % )1(J(JPT ' (0'8'8J'8'OOO "9 5  Ps0   =FF F ;F?.F1BF4F5FjsonN)indentstream)r   r   rQ   getvalue)r   rt   outs   `  r   rJ   +BaseDatabaseCreation.serialize_db_to_string   s4    	P. jfkmDM||~r   c                 (   [        U5      n[        5       n[        U R                  R                  S9   U R                  R                  5          [        R                  " SXR                  R                  S9 HL  nUR                  5         UR                  UR                  R                  R                  R                  5        MN     SSS5        U R                  R                  US9  SSS5        g! , (       d  f       N0= f! , (       d  f       g= f)z_
Reload the database with data from a string generated by
the serialize_db_to_string() method.
)rk   rv   N)table_names)r   setr   r   rB   constraint_checks_disabledr   deserializesaveaddobject	__class__rg   db_tablecheck_constraints)r   datar}   objs       r   deserialize_db_from_string/BaseDatabaseCreation.deserialize_db_from_string   s    
 ~e$////0 ;;=&22D(=(=C HHJOOCJJ$8$8$>$>$G$GH	 > OO--+-F 10 >= 10s$   DA:C2!D2
D 	<D
Dc                 Z    SU R                   R                  < SUS:  a  SU-  < 3$ S< 3$ )zB
Return display string for a database for use in various actions.
'r6   z ('%s') )r   rB   )r   r2   database_names      r   r>   .BaseDatabaseCreation._get_database_display_str   s<    
 OO!!+4>Y&A
 	
?AA
 	
r   c                     U R                   R                  S   S   (       a  U R                   R                  S   S   $ [        U R                   R                  S   -   $ )z
Internal implementation - return the name of the test DB that will be
created. Only useful when called from create_test_db() and
_create_test_db() and when no external munging is done with the 'NAME'
settings.
r/   r.   )r   rC   TEST_DATABASE_PREFIXr   s    r   r=   &BaseDatabaseCreation._get_test_db_name   sO     ??((08??008@@#doo&C&CF&KKKr   c                 ,    UR                  SU-  5        g )Nz%CREATE DATABASE %(dbname)s %(suffix)s)execute)r   cursor
parametersrR   s       r   _execute_create_test_db,BaseDatabaseCreation._execute_create_test_db   s    >KLr   c           	      `   U R                  5       nU R                  R                  R                  U5      U R	                  5       S.nU R                  5        n U R                  XeU5        SSS5        U$ ! [         Ga  nU(       a  Us SnAsSSS5        $ U R                  SU-  5        U(       d  [        SU-  5      nU(       d  WS:X  a   US:  a%  U R                  SU R                  X5      < S35        UR                  S	U-  5        U R                  XeU5         SnAN! [         a8  nU R                  S
U-  5        [        R                  " S5         SnA SnANSnAff = fU R                  S5        [        R                  " S5         SnAGN+SnAff = f! , (       d  f       U$ = f)z6
Internal implementation - create the test db tables.
)dbnamesuffixNz+Got an error creating the test database: %szXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: yesr*   z'Destroying old test database for alias r-   zDROP DATABASE %(dbname)sz-Got an error recreating the test database: %sr6   zTests cancelled.)r=   r   ops
quote_namesql_table_creation_suffixr   r   	Exceptionr&   inputr>   r   r    exit)	r   r2   rP   rR   rS   test_db_paramsr   econfirms	            r   r?   $BaseDatabaseCreation._create_test_db   s    "335oo))445GH446

  F  ,,VVL !F "!A    -- !  FJK"#=?QRG 'U"2$$> HH %)$B$B(1%&!" 'AN'RS44VVTT$ $!PST!TU$ HH/0HHQKK=  ! F "!ss   FA55F FF	F6FAD$F$
E&.*E!FF!E&&*FFFF
F-c                     U R                   R                  S   nUS:  a3  SnU(       a  SnU R                  U< SU R                  X%5      < S35        U R	                  XU5        g)z
Clone a test database.
r.   r*   zCloning test databasezUsing existing clonez for alias r-   N)r   rC   r&   r>   _clone_test_db)r   r   r2   rP   rR   source_database_namerT   s          r   clone_test_db"BaseDatabaseCreation.clone_test_db  sc      $<<VD>,F/HH 229S 	Fv6r   c                 d    U R                   R                  n0 UESSR                  US   U5      0E$ )zH
Return a modified connection settings dict for the n-th clone of a DB.
r.   z{}_{})r   rC   format)r   r   orig_settings_dicts      r   get_test_db_clone_settings/BaseDatabaseCreation.get_test_db_clone_settings  sA     "__::
 
GNN#5f#=vF
 	
r   c                     [        S5      e)z9
Internal implementation - duplicate the test db tables.
znThe database backend doesn't support cloning databases. Disable the option to run tests in parallel processes.)NotImplementedError)r   r   r2   rR   s       r   r   #BaseDatabaseCreation._clone_test_db%  s     "E
 	
r   c                    U R                   R                  5         Uc  U R                   R                  S   nOU R                  U5      S   nUS:  a3  SnU(       a  SnU R	                  U< SU R                  X%5      < S35        U(       d  U R                  XR5        UbC  U[        R                  U R                   R                     S'   XR                   R                  S'   gg)z^
Destroy a test database, prompting the user for confirmation if the
database already exists.
Nr.   r*   
Destroying
Preservingr,   r-   )
r   r@   rC   r   r&   r>   _destroy_test_dbr   rA   rB   )r   old_database_namer2   rR   r   rS   rT   s          r   destroy_test_db$BaseDatabaseCreation.destroy_test_db.  s     	>!%!>!>v!F!%!@!@!H!P>!F%HH 229Q !!"4@ (@QHt445f=4EOO))&1 )r   c                     U R                  5        nUR                  SU R                  R                  R	                  U5      -  5        SSS5        g! , (       d  f       g= f)z6
Internal implementation - remove the test db tables.
zDROP DATABASE %sN)r   r   r   r   r   )r   rS   r2   r   s       r   r   %BaseDatabaseCreation._destroy_test_dbQ  sH      FNN"T__%8%8%C%CDV%WW !  s   8A
A c           	         SSK JnJn  U R                  R                  R
                   Hi  nUR                  S5      u  pEnUR                  S5      S   nU[        R                  ;   d  MA  [        U5      n[        X5      n	[        XU" U	5      5        Mk     U R                  R                  R                  R                  5        Hz  u  pU Ho  nUR                  S5      u  pEnUR                  S5      S   nU[        R                  ;   d  MA  [        U5      n[        X5      n	[        XU" U
5      " U	5      5        Mq     M|     g)z
Mark tests in Django's test suite which are expected failures on this
database and test which should be skipped on this database.
r   )expectedFailureskip.N)unittestr   r   r   featuresdjango_test_expected_failures
rpartitionsplitr   INSTALLED_APPSr
   getattrsetattrdjango_test_skipsitems)r   r   r   	test_nametest_case_name_test_method_nametest_app	test_casetest_methodreasontestss               r   rO   5BaseDatabaseCreation.mark_expected_failures_and_skips^  s    	311OOI2;2F2Fs2K/N/ s+A.H8222).9	%iB	_[5QR P "__55GGMMOMF"	6?6J6J36O3#3$??3/2 x666 -n =I"))"FKIfk9RS # Pr   c                     g)zA
SQL to append to the end of the test table creation statements.
r    r   s    r   r   .BaseDatabaseCreation.sql_table_creation_suffixy  s     r   c                 h    U R                   R                  nUS   US   US   U R                  5       4$ )z
Return a tuple with elements of self.connection.settings_dict (a
DATABASES setting value) that uniquely identify a database
accordingly to the RDBMS particularities.
HOSTPORTENGINE)r   rC   r=   )r   rC   s     r   test_db_signature&BaseDatabaseCreation.test_db_signature  sA     55&!&!(#""$	
 	
r   c                     U R                  [        U5      5      nU R                  R                  R	                  U5        U R                  R                  5         g r   )r   strr   rC   updater@   )r   
_worker_idrC   s      r   setup_worker_connection,BaseDatabaseCreation.setup_worker_connection  s@    77JH
 	%%,,];r   r   )r*   FNF)F)r*   FF)Nr*   FN)__name__
__module____qualname____firstlineno____doc__r   r   r   r&   rW   r[   rJ   r   r>   r=   r   r?   r   r   r   r   r   rO   r   r   r   __static_attributes__r   r   r   r   r      s    
%.+ FKT"lN!FG*
	LM-"^7,

 IM!FFT6
 r   r   )r#   r    rH   ior   django.appsr   django.confr   django.corer   	django.dbr   django.db.transactionr   django.utils.deprecationr	   django.utils.module_loadingr
   r   r   r   r   r   <module>r      s:    	 
      #  ( = 5  A  A r   