Ë
    ¹ûàgç=  ã                   ó€   — d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d	Z G d
„ d«      Zy)é    N)ÚStringIO)Úapps)Úsettings)Úserializers)Úrouter)Úatomic)Úimport_stringÚtest_c                   ó˜   — e Zd ZdZd„ Zd„ Zd„ Z	 dd„Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdd„Zdd„Zdd„Zd„ Zdd„Z	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚBaseDatabaseCreationzs
    Encapsulate backend-specific differences pertaining to creation and
    destruction of the test database.
    c                 ó   — || _         y ©N)Ú
connection)Úselfr   s     ú^/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/django/db/backends/base/creation.pyÚ__init__zBaseDatabaseCreation.__init__   s	   € Ø$ˆ�ó    c                 ó6   — | j                   j                  «       S r   )r   Ú_nodb_cursor©r   s    r   r   z!BaseDatabaseCreation._nodb_cursor   s   € Ø�‰×+Ñ+Ó-Ð-r   c                 ód   — t         j                  j                  |t        j                  z   «       y r   )ÚsysÚstderrÚwriteÚosÚlinesep)r   Úmsgs     r   ÚlogzBaseDatabaseCreation.log   s   € Ü�
‰
×Ñ˜œrŸz™zÑ)Õ*r   c                 ón  — ddl m} | j                  «       }|dk\  r-d}|rd}| j                  |›d| j	                  ||«      ›d�«       | j                  |||«       | j                  j                  «        |t        j                  | j                  j                     d<   || j                  j                  d<   	 | j                  j                  d	   d
   du rFt        j                  }t        j                  «       D �	ci c]  }	|	j                  d“Œ c}	t        _         |dt!        |dz
  d«      d| j                  j                  d¬«       | j                  j                  d	   d
   du rt        _        	 |r| j#                  «       | j                  _         |d| j                  j                  ¬«       | j                  j'                  «        t(        j*                  j-                  d«      dk(  r| j/                  «        |S c c}	w # | j                  j                  d	   d
   du rt        _        w w xY w)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_syncdbÚcreatecachetable)r+   Ú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Úserialize_db_to_stringÚ_test_serialized_contentsÚensure_connectionr   ÚenvironÚgetÚ mark_expected_failures_and_skips)
r   r)   ÚautoclobberÚ	serializeÚkeepdbr    Útest_database_nameÚactionÚold_migration_modulesÚapps
             r   Úcreate_test_dbz#BaseDatabaseCreation.create_test_db    sð  € õ 	8à!×3Ñ3Ó5Ðà˜Š>ØˆFÙØ)�à�H‰Hò Ø×2Ñ2°9Ð>PÕQðôð 	×Ñ˜Y¨°VÔ<à�‰×ÑÔØ<NŒ×Ñ˜4Ÿ?™?×0Ñ0Ñ1°&Ñ9Ø0Bˆ�‰×%Ñ% fÑ-ð	CØ�‰×,Ñ,¨VÑ4°YÑ?À5ÑHä(0×(BÑ(BÐ%ä/3×/CÑ/CÓ/Eö.Ø(+�C—I‘I˜t‘Oò.”Ô*ñ ØÜ˜i¨!™m¨QÓ/Ø!ØŸ™×.Ñ.Øõð �‰×,Ñ,¨VÑ4°YÑ?À5ÑHØ-B”Õ*ñ Ø8<×8SÑ8SÓ8UˆD�O‰OÔ5áÐ'°$·/±/×2GÑ2GÕHð 	�‰×)Ñ)Ô+ä�:‰:�>‰>Ð6Ó7¸6ÒAØ×1Ñ1Ô3à!Ð!ùòA.øð �‰×,Ñ,¨VÑ4°YÑ?À5ÑHØ-B”Õ*ð Iús   Â:AH Ã>HÄ:H ÈH È,H4c                 ó<   — |d   | j                   j                  d<   y)z€
        Set this database up to be used in testing as a mirror of a primary
        database whose settings are given.
        r%   N)r   r7   )r   Úprimary_settings_dicts     r   Úset_as_test_mirrorz'BaseDatabaseCreation.set_as_test_mirrorj   s   € ð
 1FÀfÑ0Mˆ�‰×%Ñ% fÒ-r   c                 ó~   ‡ — ˆ fd„}t        «       }t        j                  d |«       d|¬«       |j                  «       S )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   óÖ  •K  — ddl m}   | ‰j                  «      }t        j                  «       D �]2  }|j
                  €Œ|j                  |j                  v sŒ*|j                  t        j                  vsŒG|j                  «       D ]Ù  }|j                  j                  ‰j                  «      sŒ)t        j                  ‰j                  j                   |«      sŒT|j"                  j%                  ‰j                  j                   «      j'                  |j                  j(                  j                  «      }|j*                  rdnd }|j-                  |¬«      E d {  –—†  ŒÛ �Œ5 y 7 Œ
­w)Nr   )ÚMigrationLoaderiÐ  )Ú
chunk_size)Údjango.db.migrations.loaderrO   r   r   r9   Úmodels_moduler:   Úmigrated_appsÚnamer   ÚTEST_NON_SERIALIZED_APPSÚ
get_modelsÚ_metaÚcan_migrater   Úallow_migrate_modelr6   Ú_base_managerÚusingÚorder_byÚpkÚ_prefetch_related_lookupsÚiterator)rO   ÚloaderÚ
app_configÚmodelÚquerysetrP   r   s         €r   Úget_objectsz@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objectsy   s$  øè ø€ ÝCá$ T§_¡_Ó5ˆFÜ"×2Ñ2Ó4ó P�
à×,Ñ,Ñ8Ø"×(Ñ(¨F×,@Ñ,@Ò@Ø"Ÿ™¬x×/PÑ/PÒPà!+×!6Ñ!6Ó!8ò 
P˜Ø Ÿ;™;×2Ñ2Ø ŸO™Oõä$×8Ñ8¸¿¹×9NÑ9NÐPUÕVØ',×':Ñ':×'@Ñ'@Ø $§¡× 5Ñ 5ó(ç&™h u§{¡{§~¡~×':Ñ':Ó;ð %ð )1×(JÒ(J¡ÐPTð 'ð (0×'8Ñ'8ÀJÐ'8Ó'O×OÑOò
PñPð  Pús0   ƒ=E)ÁE)ÁE)Á78E)Â0*E)ÃBE)ÅE'ÅE)ÚjsonN)ÚindentÚstream)r   r   rC   Úgetvalue)r   rd   Úouts   `  r   r<   z+BaseDatabaseCreation.serialize_db_to_stringq   s4   ø€ ô	Pô. ‹jˆÜ×Ñ˜f¡k£m¸DÈÕMØ�|‰|‹~Ðr   c                 ó$  — t        |«      }t        «       }t        | j                  j                  ¬«      5  | j                  j                  «       5  t        j                  d|| j                  j                  ¬«      D ]K  }|j                  «        |j                  |j                  j                  j                  j                  «       ŒM 	 ddd«       | j                  j                  |¬«       ddd«       y# 1 sw Y   Œ.xY w# 1 sw Y   yxY w)zw
        Reload the database with data from a string generated by
        the serialize_db_to_string() method.
        )r[   re   N)Útable_names)r   Úsetr   r   r6   Úconstraint_checks_disabledr   ÚdeserializeÚsaveÚaddÚobjectÚ	__class__rW   Údb_tableÚcheck_constraints)r   Údatark   Úobjs       r   Údeserialize_db_from_stringz/BaseDatabaseCreation.deserialize_db_from_string”   sá   € ô
 ˜‹~ˆÜ“eˆä˜$Ÿ/™/×/Ñ/Ô0ñ 	Gð —‘×;Ñ;Ó=ñ IÜ&×2Ñ2Ø˜D¨¯©×(=Ñ(=ôò I�Cð —H‘H”JØ—O‘O C§J¡J×$8Ñ$8×$>Ñ$>×$GÑ$GÕHñ	I÷Ið �O‰O×-Ñ-¸+Ð-ÔF÷	Gð 	G÷Ið Iú÷	Gð 	Gús$   ¶DÁA;C:Ã$DÃ:D	Ã?DÄDc                 óR   — d| j                   j                  ›d|dk\  rd|z  ›�S d›�S )zR
        Return display string for a database for use in various actions.
        ú'é   z ('%s')Ú )r   r6   )r   r)   Údatabase_names      r   r2   z.BaseDatabaseCreation._get_database_display_str©   s<   � ð
 �O‰O×!Ó!Ø+4¸ª>ˆY˜Ñ&ÐAð
ð 	
à?AÐAð
ð 	
r   c                 ó²   — | j                   j                  d   d   r| j                   j                  d   d   S t        | j                   j                  d   z   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   r7   ÚTEST_DATABASE_PREFIXr   s    r   r1   z&BaseDatabaseCreation._get_test_db_name²   sO   € ð �?‰?×(Ñ(¨Ñ0°Ò8Ø—?‘?×0Ñ0°Ñ8¸Ñ@Ð@Ü# d§o¡o×&CÑ&CÀFÑ&KÑKÐKr   c                 ó,   — |j                  d|z  «       y )Nz%CREATE DATABASE %(dbname)s %(suffix)s)Úexecute)r   ÚcursorÚ
parametersrD   s       r   Ú_execute_create_test_dbz,BaseDatabaseCreation._execute_create_test_db½   s   € Ø�‰Ð>ÀÑKÕLr   c           	      ó   — | j                  «       }| j                  j                  j                  |«      | j	                  «       dœ}| j                  «       5 }	 | j                  |||«       ddd«       |S # t        $ �r }|r|cY d}~cddd«       S | j                  d|z  «       |st        d|z  «      }|sdk(  r’	 |dk\  r%| j                  d| j                  ||«      ›d�«       |j                  d	|z  «       | j                  |||«       ne# t        $ r3}| j                  d
|z  «       t        j                  d«       Y d}~n.d}~ww xY w| j                  d«       t        j                  d«       Y d}~�Œd}~ww xY w# 1 sw Y   |S xY w)zF
        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: %srz   zTests cancelled.)r1   r   ÚopsÚ
quote_nameÚsql_table_creation_suffixr   rƒ   Ú	Exceptionr   Úinputr2   r€   r   Úexit)	r   r)   rB   rD   rE   Útest_db_paramsr�   ÚeÚconfirms	            r   r3   z$BaseDatabaseCreation._create_test_dbÀ   s�  € ð "×3Ñ3Ó5Ðà—o‘o×)Ñ)×4Ñ4Ð5GÓHØ×4Ñ4Ó6ñ
ˆð
 ×ÑÓ ð !	  Fð  Ø×,Ñ,¨V°^ÀVÔL÷!	 ðF "Ð!øôA ó  ñ Ø-Ô-÷!	 ñ !	 ð —‘ÐFÈÑJÔKÙ"Ü#ð=Ø?QñRó�Gñ  '¨UÒ"2ð$Ø$¨š>Ø ŸHšHð %)×$BÑ$BØ(1Ð3Eõ%&ð!"ôð Ÿ™Ð'AÀNÑ'RÔSØ×4Ñ4°V¸^ÈVÕTøÜ$ò $ØŸ™Ð!PÐSTÑ!TÔUÜŸ™ Ÿ™ûð$úð —H‘HÐ/Ô0Ü—H‘H˜Q”Kÿùð= ú÷!	 ðF "Ð!úsm   ÁFÁA6Á6
F Â E;ÂF ÂFÂ+E;Â>ADÄE;Ä	EÄ)EÅE;ÅEÅ)E;Å5FÅ;F Æ FÆFc                 óÀ   — | j                   j                  d   }|dk\  r-d}|rd}| j                  |›d| j                  ||«      ›d�«       | j	                  |||«       y)z(
        Clone a test database.
        r%   r!   zCloning test databasezUsing existing clonez for alias r$   N)r   r7   r   r2   Ú_clone_test_db)r   r†   r)   rB   rD   Úsource_database_namerF   s          r   Úclone_test_dbz"BaseDatabaseCreation.clone_test_dbï   sh   € ð  $Ÿ™×<Ñ<¸VÑDÐà˜Š>Ø,ˆFÙØ/�Ø�H‰Hò Ø×2Ñ2°9Ð>RÕSðôð 	×Ñ˜F I¨vÕ6r   c                 ód   — | j                   j                  }i |¥ddj                  |d   |«      i¥S )zX
        Return a modified connection settings dict for the n-th clone of a DB.
        r%   z{}_{})r   r7   Úformat)r   r†   Úorig_settings_dicts      r   Úget_test_db_clone_settingsz/BaseDatabaseCreation.get_test_db_clone_settings  sA   € ð "Ÿ_™_×:Ñ:Ðð
Ø ð
à�G—N‘NÐ#5°fÑ#=¸vÓFñ
ð 	
r   c                 ó   — t        d«      ‚)zI
        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†   r)   rD   s       r   r’   z#BaseDatabaseCreation._clone_test_db  s   € ô "ðEó
ð 	
r   Nc                 ó°  — | j                   j                  «        |€| j                   j                  d   }n| j                  |«      d   }|dk\  r-d}|rd}| j	                  |›d| j                  ||«      ›d�«       |s| j                  ||«       |�D|t        j                  | j                   j                     d<   || j                   j                  d<   yy)zv
        Destroy a test database, prompting the user for confirmation if the
        database already exists.
        Nr%   r!   Ú
DestroyingÚ
Preservingr#   r$   )
r   r4   r7   r˜   r   r2   Ú_destroy_test_dbr   r5   r6   )r   Úold_database_namer)   rD   r†   rE   rF   s          r   Údestroy_test_dbz$BaseDatabaseCreation.destroy_test_db  sÕ   € ð 	�‰×ÑÔØˆ>Ø!%§¡×!>Ñ!>¸vÑ!FÑà!%×!@Ñ!@ÀÓ!HÈÑ!PÐà˜Š>Ø!ˆFÙØ%�Ø�H‰Hò Ø×2Ñ2°9Ð>PÕQðôñ Ø×!Ñ!Ð"4°iÔ@ð Ð(Ø@QŒH×Ñ˜tŸ™×4Ñ4Ñ5°fÑ=Ø4EˆD�O‰O×)Ñ)¨&Ò1ð )r   c                 ó¼   — | j                  «       5 }|j                  d| j                  j                  j	                  |«      z  «       ddd«       y# 1 sw Y   yxY w)zF
        Internal implementation - remove the test db tables.
        zDROP DATABASE %sN)r   r€   r   rˆ   r‰   )r   rE   r)   r�   s       r   rž   z%BaseDatabaseCreation._destroy_test_db>  sQ   € ð ×ÑÓ ð 	 FØ�N‰NØ" T§_¡_×%8Ñ%8×%CÑ%CÐDVÓ%WÑWô÷	÷ 	ñ 	ús   ‘8AÁAc           
      ó|  — ddl m}m} | j                  j                  j
                  D ]h  }|j                  d«      \  }}}|j                  d«      d   }|t        j                  v sŒ?t        |«      }t        ||«      }	t        || ||	«      «       Œj | j                  j                  j                  j                  «       D ]x  \  }
}|D ]n  }|j                  d«      \  }}}|j                  d«      d   }|t        j                  v sŒ?t        |«      }t        ||«      }	t        ||  ||
«      |	«      «       Œp Œz y)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   rA   z5BaseDatabaseCreation.mark_expected_failures_and_skipsK  s3  € ÷ 	3àŸ™×1Ñ1×OÑOò 	SˆIØ2;×2FÑ2FÀsÓ2KÑ/ˆN˜AÐ/Ø —‘ sÓ+¨AÑ.ˆHàœ8×2Ñ2Ò2Ü)¨.Ó9�	Ü% iÐ1AÓB�Ü˜	Ð#3±_À[Ó5QÕRð	Sð "Ÿ_™_×5Ñ5×GÑG×MÑMÓOò 	T‰MˆF�EØ"ò T�	Ø6?×6JÑ6JÈ3Ó6OÑ3� Ð#3Ø$Ÿ?™?¨3Ó/°Ñ2�àœx×6Ñ6Ò6Ü -¨nÓ =�IÜ")¨)Ð5EÓ"F�KÜ˜IÐ'7¸¹¸f»ÀkÓ9RÕSñTñ	Tr   c                  ó   — y)zQ
        SQL to append to the end of the test table creation statements.
        r{   © r   s    r   rŠ   z.BaseDatabaseCreation.sql_table_creation_suffixe  s   € ð r   c                 óh   — | j                   j                  }|d   |d   |d   | j                  «       fS )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   r7   r1   )r   r7   s     r   Útest_db_signaturez&BaseDatabaseCreation.test_db_signaturek  sA   € ð Ÿ™×5Ñ5ˆà˜&Ñ!Ø˜&Ñ!Ø˜(Ñ#Ø×"Ñ"Ó$ð	
ð 	
r   c                 ó¶   — | j                  t        |«      «      }| j                  j                  j	                  |«       | j                  j                  «        y r   )r˜   Ústrr   r7   Úupdater4   )r   Ú
_worker_idr7   s      r   Úsetup_worker_connectionz,BaseDatabaseCreation.setup_worker_connectiony  s@   € Ø×7Ñ7¼¸J»ÓHˆð
 	�‰×%Ñ%×,Ñ,¨]Ô;Ø�‰×ÑÕr   )r!   FTF)F)r!   FF)Nr!   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   rI   rL   r<   rw   r2   r1   rƒ   r3   r”   r˜   r’   r    rž   rA   rŠ   r¿   rÄ   rº   r   r   r   r      s„   „ ñò
%ò.ò+ð FKóH"òTNò!òFGò*
ò	LóMó-"ó^7ò,
ó
ð IMó!FòFòTò4ò
ó r   r   )r   r   Úior   Údjango.appsr   Údjango.confr   Údjango.corer   Ú	django.dbr   Údjango.db.transactionr   Údjango.utils.module_loadingr	   r~   r   rº   r   r   ú<module>rÐ      s4   ðÛ 	Û 
Ý å Ý  Ý #Ý Ý (Ý 5ð Ð ÷o ò o r   