
    hhQ                     b    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r " S S	\5      rg)
    N)settings)DatabaseError)BaseDatabaseCreation)get_random_string)cached_propertytest_c                       \ rS rSr\S 5       rS$S jrS rS rS r	S%S jr
S&S jrS&S	 jrS
 rS r S&S jrS rS rS'S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S#r%g)(DatabaseCreation   c                 2   [         R                  U R                  R                     nUR	                  S5      =(       d    US   nUR	                  S5      =(       d    US   n0 UEX#S.En[        U R                  5      nU" XR                  R                  S9$ )a  
This is analogous to other backends' `_nodb_connection` property,
which allows access to an "administrative" connection which can
be used to manage the test databases.
For Oracle, the only connection that can be used for that purpose
is the main (non-test) connection.

SAVED_USERUSERSAVED_PASSWORDPASSWORD)r   r   )alias)r   	DATABASES
connectionr   gettype)selfsettings_dictuserpasswordDatabaseWrappers        T/var/www/html/env/lib/python3.13/site-packages/django/db/backends/oracle/creation.py_maindb_connection#DatabaseCreation._maindb_connection   s     !**4??+@+@A  .G-2G $$%56S-
:SM=M$Mt/}OO4I4IJJ    c           	      "   U R                  5       nU R                  R                  5        nU R                  5       (       a   U R	                  XTX5        U R!                  5       (       a*  US:  a  U R                  S5         U R#                  XTX5        S S S 5        U R                  R'                  5         U R)                  U5        U R                  R*                  S   $ ! [
         Ga  nS[        U5      ;  a*  U R                  SU-  5        [        R                  " S5        U(       d  [        SUS   -  5      nU(       d  WS:X  GaD  US:  a(  U R                  SU R                  R                  -  5         U R                  XTU5        O! [         aZ  nS	[        U5      ;   a  U R                  XTX5         S nAOsU R                  S
U-  5        [        R                  " S5         S nAODS nAf[
         a4  nU R                  S
U-  5        [        R                  " S5         S nAOS nAff = f U R	                  XTX5         S nAGN! [
         a9  nU R                  SU-  5        [        R                  " S5         S nA S nAGN1S nAff = fU R                  S5        [        R                  " S5         S nAGNfS nAff = f! [
         Ga/  nS[        U5      ;  a*  U R                  SU-  5        [        R                  " S5        U(       d  [        SUS   -  5      nU(       d  WS:X  a   US:  a  U R                  S5        U R%                  XTU5        US:  a  U R                  S5        U R#                  XTX5         S nAGN! [
         a9  nU R                  SU-  5        [        R                  " S5         S nA S nAGN/S nAff = fU R                  S5        [        R                  " S5         S nAGNdS nAff = f! , (       d  f       GNs= f)N	ORA-01543z+Got an error creating the test database: %s   z^It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: r   yes   .Destroying old test database for alias '%s'...z	ORA-29857z1Got an error destroying the old test database: %sz-Got an error recreating the test database: %szTests cancelled.zCreating test user...	ORA-01920z'Got an error creating the test user: %szZIt appears the test user, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: Destroying old test user...z)Got an error recreating the test user: %sNAME)_get_test_db_paramsr   cursor_test_database_create_execute_test_db_creation	Exceptionstrlogsysexitinputr   r   _execute_test_db_destructionr   )_handle_objects_preventing_db_destruction_test_user_create_create_test_user_destroy_test_userclose_switch_to_test_userr   )r   	verbosityautoclobberkeepdb
parametersr)   econfirms           r   _create_test_db DatabaseCreation._create_test_db   s|   --/
$$++-))++6$22In %%''>HH45$**6yQ} .v 	%%'!!*-,,V44o ! 2$"#a&0!NQR!RS&"'K(01#
 #g&6$> HH P"&//"7"7!8( == &I  - ,*c!f4 $ N N$*	!" !" !%$W&'%(!" !$( ( HH SVW W  HHQKK	(
( :: &I   ) ( HH ORS S  HHQKK	( !34e2$r ! $"#a&0!JQ!NO&"'F(01#
 #g&6((A~ $)F G 33F	R(A~ $)@ A 22 &I   ) ( HH%PST%TUHHQKK( !345$ .-s  O?C,O?KJ?*BJ:8F
J:
H+!G*6J:;*G*%J:*H+7*H&!J:&H++J:/IO?
J
*J;J:?O?J

*J:4O?:J??O?O<AO7,AN>O?
O*O8O7<O?O*O71O?7O<<O??
Pc                    [         R                  U R                  R                     nU R                  R                  S   =US'   U R                  R                  S'   U R                  R                  S   =US'   U R                  R                  S'   US   nU R                  R                  S   nUS   =US'   =US'   =US'   U R                  R                  S'   US   =US'   U R                  R                  S'   g)	aV  
Switch to the user that's used for creating the test database.

Oracle doesn't have the concept of separate databases under the same
user, so a separate user is used; see _create_test_db(). The main user
is also needed for cleanup when testing is completed, so save its
credentials in the SAVED_USER/SAVED_PASSWORD key in the settings dict.
r   r   r   r   TESTr   r   N)r   r   r   r   r   )r   r<   real_settingsreal_test_settingstest_settingss        r   r8   %DatabaseCreation._switch_to_test_user~   s    !**4??+@+@AOO))&1	
l#doo&C&CL&Q
 OO))*5	6&'$//*G*G+
 +6255f= v	6" 	]6%: 	]6=ROO))&1 z"	
j!DOO$A$A*$Mr   c                 t    US   U R                   R                  S'   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   r   Nr   r   )r   primary_settings_dicts     r   set_as_test_mirror#DatabaseCreation.set_as_test_mirror   s7    
 1Ff0M%%f-4I*4U%%j1r   c                 B   U R                  S5        U R                  5       (       a  U(       d  [        SUS   -  5      nU(       d  WS:X  al   US:  a  U R                  S5        U R                  XU5         US:  a(  U R                  S	U R                  R                  -  5        U R                  XU5        g U R                  S5        [
        R                  " S5        g U R                  SUS   -  5        U R                  S5        [
        R                  " S5        g ! [         a4  nU R                  SU-  5        [
        R                  " S5         S nANS nAff = f! [         a4  nU R                  S
U-  5        [
        R                  " S5         S nAg S nAff = f)Na  There are objects in the old test database which prevent its destruction.
If they belong to the test user, deleting the user will allow the test database to be recreated.
Otherwise, you will need to find and remove each of these objects, or use a different tablespace.
zType 'yes' to delete user %s: r   r"   r#   r&   z)Got an error destroying the test user: %sr!   r$   z-Got an error destroying the test database: %sz5Tests cancelled -- test database cannot be recreated.z[Django is configured to use pre-existing test user '%s', and will not attempt to delete it.)
r.   r4   r1   r6   r,   r/   r0   r   r   r2   )r   r)   r<   r9   r:   r>   r=   s          r   r3   :DatabaseCreation._handle_objects_preventing_db_destruction   sd   
 	/	
 !!## @:fCU UVg.  A~!>?++F	J	  A~L"oo334 55f)T
 PQHH68B68JK HHLMHHQK- !  HHH1LMHHQKK  !  HHLqPQHHQKK s1   )D 7A E  
E)*EE 
F**FFc                    U R                   R                  S   U R                   R                  S'   U R                   R                  S   U R                   R                  S'   U R                   R                  5         U R                  5       nU R                  R                  5        nU R                  5       (       a)  US:  a  U R                  S5        U R                  XCU5        U R                  5       (       a)  US:  a  U R                  S5        U R                  XCU5        SSS5        U R                  R                  5         g! , (       d  f       N)= f)	z
Destroy a test database, prompting the user for confirmation if the
database already exists. Return the name of the test database created.
r   r   r   r   r#   zDestroying test user...z"Destroying test database tables...N)r   r   r7   r(   r   r)   r4   r.   r6   r*   r2   )r   test_database_namer9   r<   r)   s        r   _destroy_test_db!DatabaseCreation._destroy_test_db   s   
 150M0M1
%%f- 59OO4Q4Q5
%%j1 	--/
$$++-%%''>HH67''IF))++>HHAB11&iP . 	%%' .-s   %A=E
Ec                     US:  a  U R                  SUS   -  5        U R                  5       (       a  SS/nOSS/nU(       a  SOS nU R                  XX#U5        g )	Nr!   z_create_test_db(): dbname = %sr   z
                CREATE TABLESPACE %(tblspace)s
                DATAFILE SIZE %(size)s
                AUTOEXTEND ON NEXT %(extsize)s MAXSIZE %(maxsize)s
                z
                CREATE TEMPORARY TABLESPACE %(tblspace_temp)s
                TEMPFILE SIZE %(size_tmp)s
                AUTOEXTEND ON NEXT %(extsize_tmp)s MAXSIZE %(maxsize_tmp)s
                z
                CREATE TABLESPACE %(tblspace)s
                DATAFILE '%(datafile)s' SIZE %(size)s REUSE
                AUTOEXTEND ON NEXT %(extsize)s MAXSIZE %(maxsize)s
                z
                CREATE TEMPORARY TABLESPACE %(tblspace_temp)s
                TEMPFILE '%(datafile_tmp)s' SIZE %(size_tmp)s REUSE
                AUTOEXTEND ON NEXT %(extsize_tmp)s MAXSIZE %(maxsize_tmp)s
                r    )r.   #_test_database_oracle_managed_files_execute_allow_fail_statements)r   r)   r<   r9   r;   
statementsacceptable_ora_errs          r   r+   *DatabaseCreation._execute_test_db_creation   ss    >HH5
68JJK3355
J
J -3[++
7I	
r   c                 n   US:  a  U R                  SUS   -  5        SS/nU(       a  SOS nU R                  XX#U5      nU(       d'  U R                  S5      c  SnU R                  X/X#5        S	 HB  n	S
n
XS'   U R                  X/X#S5      nU(       a  M&  US:  d  M.  U R                  SU	-  5        MD     g )Nr!   z"_create_test_user(): username = %sr   zCREATE USER %(user)s
               IDENTIFIED BY "%(password)s"
               DEFAULT TABLESPACE %(tblspace)s
               TEMPORARY TABLESPACE %(tblspace_temp)s
               QUOTA UNLIMITED ON %(tblspace)s
            zGRANT CREATE SESSION,
                     CREATE TABLE,
                     CREATE SEQUENCE,
                     CREATE PROCEDURE,
                     CREATE TRIGGER
               TO %(user)sr%   r   z0ALTER USER %(user)s IDENTIFIED BY "%(password)s")VIEWzMATERIALIZED VIEWz(GRANT CREATE %(object_type)s TO %(user)sobject_typez	ORA-01031zBFailed to grant CREATE %s permission to test user. This may be ok.)r.   rT   _test_settings_get_execute_statements)r   r)   r<   r9   r;   rU   rV   successset_passwordrZ   extras              r   r5   "DatabaseCreation._create_test_user  s    >HH9Jv<NNO

 -3[55
7I
 422:>FML$$V^ZS 9K>E(3}%99G 7yA~X!" 9r   c                 j    US:  a  U R                  SUS   -  5        SS/nU R                  XX#5        g )Nr!   z)_execute_test_db_destruction(): dbname=%sr   zQDROP TABLESPACE %(tblspace)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTSzVDROP TABLESPACE %(tblspace_temp)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTSr.   r\   r   r)   r<   r9   rU   s        r   r2   -DatabaseCreation._execute_test_db_destruction.  sE    >HH@:fCUUVCC

 	  ZKr   c                     US:  a(  U R                  SUS   -  5        U R                  S5        S/nU R                  XX#5        g )Nr!   z_destroy_test_user(): user=%sr   z&Be patient. This can take some time...zDROP USER %(user)s CASCADErb   rc   s        r   r6   #DatabaseCreation._destroy_test_user9  sI    >HH4z&7IIJHH=>(

 	  ZKr   c                     U H*  nXc-  nUS:  a  [        U5         UR                  U5        M,     g ! [         a'  nU(       a  US:  a  U R                  SU-  5        e S nAff = f)Nr!   zFailed (%s))printexecuter,   r.   )	r   r)   rU   r<   r9   allow_quiet_failtemplatestmterrs	            r   r\   $DatabaseCreation._execute_statementsB  sd     #H(DA~dt$ #  (Y!^HH]c23s   2
A#"AA#c                      USL=(       a    [        U5      S:  nU R                  UUUUUS9  g! [         a  n[        U5      nUb  XX;  a  e  SnAgSnAff = f)z
Execute statements which are allowed to fail silently if the Oracle
error code given by `acceptable_ora_err` is raised. Return True if the
statements execute without an exception, or False otherwise.
Nr   )rj   TF)lenr\   r   r-   )	r   r)   rU   r<   r9   rV   rj   rm   descriptions	            r   rT   /DatabaseCreation._execute_allow_fail_statementsP  sz    	 #$.N37I3JQ3N  $$!1 %   	c(K!)-?-R		s   ,/ 
AAAc                    U R                  5       U R                  5       U R                  5       U R                  5       U R	                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       S.$ )N)dbnamer   r   tblspacetblspace_tempdatafiledatafile_tmpmaxsizemaxsize_tmpsizesize_tmpextsizeextsize_tmp)_test_database_name_test_database_user_test_database_passwd_test_database_tblspace_test_database_tblspace_tmp _test_database_tblspace_datafile$_test_database_tblspace_tmp_datafile_test_database_tblspace_maxsize#_test_database_tblspace_tmp_maxsize_test_database_tblspace_size _test_database_tblspace_tmp_size_test_database_tblspace_extsize#_test_database_tblspace_tmp_extsizer   s    r   r(   $DatabaseCreation._get_test_db_paramsk  s    ..0,,.224446!==?==? EEG;;=CCE557==?;;=CCE
 	
r   Nc                     U R                   R                  nUS   R                  X5      nUc  U(       a  [        XC   -   nU$ )zr
Return a value from the test settings dict, or a given default, or a
prefixed entry from the main settings dict.
rB   r   r   r   TEST_DATABASE_PREFIX)r   keydefaultprefixedr   vals         r   r[   #DatabaseCreation._test_settings_get|  sA    
 55F#''5;8&)@@C
r   c                 "    U R                  SSS9$ )Nr'   r   r[   r   s    r   r   $DatabaseCreation._test_database_name      &&v&??r   c                 "    U R                  SSS9$ )N	CREATE_DBTr   r   r   s    r   r*   &DatabaseCreation._test_database_create  s    &&{D&AAr   c                 "    U R                  SSS9$ )NCREATE_USERTr   r   r   s    r   r4   "DatabaseCreation._test_user_create  s    &&}d&CCr   c                 "    U R                  SSS9$ )Nr   r   r   r   s    r   r   $DatabaseCreation._test_database_user  r   r   c                 n    U R                  S5      nUc   U R                  5       (       a  [        S5      nU$ )Nr      )r[   r4   r   )r   r   s     r   r   &DatabaseCreation._test_database_passwd  s5    **:6 6 6 8 8(,Hr   c                 "    U R                  SSS9$ )NTBLSPACEr   r   r   r   s    r   r   (DatabaseCreation._test_database_tblspace  s    &&zF&CCr   c                 r    U R                   R                  nUS   R                  S[        US   -   S-   5      $ )NrB   TBLSPACE_TMPr   _tempr   r   r   s     r   r   ,DatabaseCreation._test_database_tblspace_tmp  s>    55V$((0=3HH7R
 	
r   c                 H    SU R                  5       -  nU R                  SUS9$ )N%s.dbfDATAFILEr   )r   r[   r   ru   s     r   r   1DatabaseCreation._test_database_tblspace_datafile  s+    d::<<&&z8&DDr   c                 H    SU R                  5       -  nU R                  SUS9$ )Nr   DATAFILE_TMPr   )r   r[   r   s     r   r   5DatabaseCreation._test_database_tblspace_tmp_datafile  s+    d>>@@&&~x&HHr   c                 "    U R                  SSS9$ )NDATAFILE_MAXSIZE500Mr   r   r   s    r   r   0DatabaseCreation._test_database_tblspace_maxsize  s    &&'96&JJr   c                 "    U R                  SSS9$ )NDATAFILE_TMP_MAXSIZEr   r   r   r   s    r   r   4DatabaseCreation._test_database_tblspace_tmp_maxsize  s    &&'=v&NNr   c                 "    U R                  SSS9$ )NDATAFILE_SIZE50Mr   r   r   s    r   r   -DatabaseCreation._test_database_tblspace_size  s    &&&FFr   c                 "    U R                  SSS9$ )NDATAFILE_TMP_SIZEr   r   r   r   s    r   r   1DatabaseCreation._test_database_tblspace_tmp_size  s    &&':E&JJr   c                 "    U R                  SSS9$ )NDATAFILE_EXTSIZE25Mr   r   r   s    r   r   0DatabaseCreation._test_database_tblspace_extsize  s    &&'95&IIr   c                 "    U R                  SSS9$ )NDATAFILE_TMP_EXTSIZEr   r   r   r   s    r   r   4DatabaseCreation._test_database_tblspace_tmp_extsize      &&'=u&MMr   c                 "    U R                  SSS9$ )NORACLE_MANAGED_FILESFr   r   r   s    r   rS   4DatabaseCreation._test_database_oracle_managed_files  r   r   c                 4    U R                   R                  S   $ )z
Return the 'production' DB name to get the test DB creation machinery
to work. This isn't a great deal in this case because DB names as
handled by Django don't have real counterparts in Oracle.
r'   rH   r   s    r   _get_test_db_name"DatabaseCreation._get_test_db_name  s     ,,V44r   c                 p    U R                   R                  nUS   US   US   US   U R                  5       4$ )NHOSTPORTENGINEr'   )r   r   r   r   s     r   test_db_signature"DatabaseCreation.test_db_signature  sG    55&!&!(#&!$$&
 	
r    )r#   FF)r#   )F)NN)&__name__
__module____qualname____firstlineno__r   r   r?   r8   rJ   r3   rP   r+   r5   r2   r6   r\   rT   r(   r[   r   r*   r4   r   r   r   r   r   r   r   r   r   r   r   r   rS   r   r   __static_attributes__r   r   r   r
   r
      s    K K_5B
2V*X(0!
F&P	LL KP6
"	@BD@D
EIKOGKJNN5
r   r
   )r/   django.confr   	django.dbr    django.db.backends.base.creationr   django.utils.cryptor   django.utils.functionalr   r   r
   r   r   r   <module>r      s,    
   # A 1 3 D
+ D
r   