3
7^                 @   s8   d dl Z d dlZd dlZd dlmZ G dd deZdS )    N)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   | dkpd| kS )Nz:memory:zmode=memory )Zdatabase_namer   r   E/tmp/pip-build-8app2_gc/Django/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NAMEz:memory: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   | j  }|r|S | j|s|dkr:| jd| j||f  tj|tjr|sXtd| }|sd|dkrytj| W q t	k
r } z| jd|  t
jd W Y d d }~X qX n| jd t
jd |S )N   z,Destroying old test database for alias %s...zXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: yesz/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   s*    


z DatabaseCreation._create_test_dbc             C   sL   | j j}|d }| j|r|S tjj|d \}}|ddj|||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_settings0   s    
z+DatabaseCreation.get_test_db_clone_settingsc             C   s   | j jd }| j|d }| j|stj|tjr|r:d S |dkrZ| jd| j||f  ytj	| W n: t
k
r } z| jd|  tjd W Y d d }~X nX ytj|| W n: t
k
r } z| jd|  tjd W Y d d }~X nX d S )Nr   r   z,Destroying old test database for alias %s...z/Got an error deleting the old test database: %sr   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_db9   s&    
zDatabaseCreation._clone_test_dbc             C   s   |r| j | rtj| d S )N)r   r   r   )r   r   r   r   r   r   _destroy_test_dbQ   s    z!DatabaseCreation._destroy_test_dbc             C   s6   | j  }| jjd g}| j|r.|j| jj 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_signatureV   s
    
z"DatabaseCreation.test_db_signatureN)F)F)__name__
__module____qualname__staticmethodr   r   r   r&   r)   r*   r.   r   r   r   r   r      s   
	
r   )r   r'   r   Z django.db.backends.base.creationr   r   r   r   r   r   <module>   s   