o
    ô<âgÁ  ã                   @   s`   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 G dd„ de
ƒZdS )é    N)ÚPath)ÚNotSupportedError)ÚBaseDatabaseCreationc                   @   sT   e Zd Zedd„ ƒZdd„ Zddd„Zdd	„ Zdd
d„Zdd„ Z	dd„ Z
dd„ ZdS )ÚDatabaseCreationc                 C   s   t | tƒ o| dkpd| v S )Nú:memory:zmode=memory)Ú
isinstancer   )Údatabase_name© r	   úV/var/www/html/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/creation.pyÚis_in_memory_db   s   ÿz DatabaseCreation.is_in_memory_dbc                 C   s,   | j jd d p	d}|dkrd| j j S |S )NÚTESTÚNAMEr   z)file:memorydb_%s?mode=memory&cache=shared)Ú
connectionÚsettings_dictÚalias)ÚselfÚtest_database_namer	   r	   r
   Ú_get_test_db_name   s   z"DatabaseCreation._get_test_db_nameFc              
   C   sÌ   |   ¡ }|r|S |  |¡sd|dkr|  d|  ||¡f ¡ t |tj¡rd|s,td| ƒ}|s2|dkrZzt |¡ W |S  t	yY } z|  d| ¡ t
 d¡ W Y d }~|S d }~ww |  d¡ t
 d¡ |S )Né   ú,Destroying old test database for alias %s...zXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: Úyesú/Got an error deleting the old test database: %sé   zTests cancelled.)r   r   ÚlogÚ_get_database_display_strÚosÚaccessÚF_OKÚinputÚremoveÚ	ExceptionÚsysÚexit)r   Ú	verbosityÚautoclobberÚkeepdbr   ÚconfirmÚer	   r	   r
   Ú_create_test_db   s<   
ÿÿÿÿú€ú

z DatabaseCreation._create_test_dbc                 C   s˜   | j j}|d p	d}|  |¡s&tj |¡\}}i |¥d|› d|› |› i¥S t ¡ }|dkr0|S |dkrDi |¥d| j j› d|› di¥S t	d|›dƒ‚)	Nr   r   Ú_ÚforkÚspawnz.sqlite3zCloning with start method z is not supported.)
r   r   r   r   ÚpathÚsplitextÚmultiprocessingÚget_start_methodr   r   )r   ÚsuffixÚorig_settings_dictÚsource_database_nameÚrootÚextÚstart_methodr	   r	   r
   Úget_test_db_clone_settings6   s"   
ÿþ
ÿz+DatabaseCreation.get_test_db_clone_settingsc              
   C   s0  | j jd }|  |¡d }|  |¡s|t |tj¡rS|rd S |dkr-|  d|  ||¡f ¡ zt 	|¡ W n t
yR } z|  d| ¡ t d¡ W Y d }~nd }~ww z	t ||¡ W d S  t
y{ } z|  d| ¡ t d¡ W Y d }~d S d }~ww t ¡ dkr–tj|dd	}| j j  |¡ | ¡  d S d S )
Nr   r   r   r   r   z*Got an error cloning the test database: %sr+   T©Úuri)r   r   r6   r   r   r   r   r   r   r   r    r!   r"   ÚshutilÚcopyr.   r/   Úsqlite3ÚconnectÚbackupÚclose)r   r0   r#   r%   r2   Útarget_database_namer'   Ú	ondisk_dbr	   r	   r
   Ú_clone_test_dbJ   sD   
ÿÿÿÿ€þ€þýzDatabaseCreation._clone_test_dbc                 C   s$   |r|   |¡st |¡ d S d S d S )N)r   r   r   )r   r   r#   r	   r	   r
   Ú_destroy_test_dbm   s   þz!DatabaseCreation._destroy_test_dbc                 C   sH   |   ¡ }| jjd g}|  |¡r| | jj¡ t|ƒS | |¡ t|ƒS )a   
        Return a tuple that uniquely identifies a test database.

        This takes into account the special cases of ":memory:" and "" for
        SQLite since the databases will be distinct despite having the same
        TEST NAME. See https://www.sqlite.org/inmemorydb.html
        r   )r   r   r   r   Úappendr   Útuple)r   r   Úsigr	   r	   r
   Útest_db_signaturer   s   

ÿz"DatabaseCreation.test_db_signaturec                 C   sè   |   |¡}t ¡ }|dkr| jj |¡ | j ¡  d S |dkrp| jj}d|› d|› d}| jjj	d|› d|› ddd	}t
j	|dd	}| |¡ | ¡  | jj |¡ || jjd
< | j 	¡  | ¡  tj d¡dkrr|  ¡  d S d S d S )Nr*   r+   zfile:memorydb_r)   z?mode=memory&cache=sharedzfile:z.sqlite3?mode=roTr7   r   ÚRUNNING_DJANGOS_TEST_SUITEÚtrue)r6   r.   r/   r   r   Úupdater>   r   ÚDatabaser<   r;   r=   r   ÚenvironÚgetÚ mark_expected_failures_and_skips)r   Ú
_worker_idr   r5   r   Úconnection_strÚ	source_dbÚ	target_dbr	   r	   r
   Úsetup_worker_connection‚   s.   
ÿÿ

íz(DatabaseCreation.setup_worker_connectionN)F)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r   r(   r6   rA   rB   rF   rR   r	   r	   r	   r
   r      s    


#r   )r.   r   r9   r;   r!   Úpathlibr   Ú	django.dbr   Ú django.db.backends.base.creationr   r   r	   r	   r	   r
   Ú<module>   s    