U
    €Ha  ã                   @   sD   d dl Z d dlZd dlZd dlmZ d dlmZ G dd„ deƒZdS )é    N)ÚPath)ÚBaseDatabaseCreationc                   @   sL   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S )ÚDatabaseCreationc                 C   s   t | tƒ o| dkpd| kS )Nú:memory:zmode=memory)Ú
isinstancer   )Zdatabase_name© r   úG/tmp/pip-unpacked-wheel-3jxiddxt/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 )NZ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 |  |¡sÄ|dkr:|  d|  ||¡f ¡ t |tj¡rÄ|sXtd| ƒ}|sd|dkr°zt |¡ W qÄ t	k
r¬ } z|  d| ¡ t
 d¡ W 5 d }~X Y qÄX n|  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   Ú	verbosityZautoclobberÚkeepdbr   ZconfirmÚer   r   r   Ú_create_test_db   s0    

ÿÿÿ

z DatabaseCreation._create_test_dbc                 C   sL   | j j}|d }|  |¡r|S tj |d ¡\}}|dd |||¡i–S d S )Nr
   z{}_{}.{})r   r   r	   r   ÚpathÚsplitextÚformat)r   ÚsuffixZorig_settings_dictÚsource_database_nameÚrootÚextr   r   r   Úget_test_db_clone_settings3   s    
z+DatabaseCreation.get_test_db_clone_settingsc              
   C   sô   | j jd }|  |¡d }|  |¡sðt |tj¡r¤|r:d S |dkrZ|  d|  ||¡f ¡ zt 	|¡ W n: t
k
r¢ } z|  d| ¡ t d¡ W 5 d }~X Y nX zt ||¡ W n: t
k
rî } z|  d| ¡ t d¡ W 5 d }~X Y nX d S )Nr
   r   r   r   r   z*Got an error cloning the test database: %s)r   r   r+   r	   r   r   r   r   r   r   r   r   r   ÚshutilÚcopy)r   r'   r    r!   r(   Ztarget_database_namer"   r   r   r   Ú_clone_test_db<   s(    

ÿzDatabaseCreation._clone_test_dbc                 C   s   |r|   |¡st |¡ d S )N)r	   r   r   )r   r   r    r   r   r   Ú_destroy_test_dbT   s    z!DatabaseCreation._destroy_test_dbc                 C   sB   |   ¡ }| jjd g}|  |¡r0| | jj¡ n
| |¡ 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_signatureY   s    

z"DatabaseCreation.test_db_signatureN)F)F)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr	   r   r#   r+   r.   r/   r3   r   r   r   r   r   	   s   

	
r   )r   r,   r   Úpathlibr   Z django.db.backends.base.creationr   r   r   r   r   r   Ú<module>   s
   