U
    ѬKd                     @   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| kS )N:memory:zmode=memory)
isinstancer   )Zdatabase_name r   `/var/www/html/myproject/myenv/lib/python3.8/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 )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rzt| W q t	k
r } z| d|  t
d W 5 d }~X Y qX 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   s4    


z DatabaseCreation._create_test_dbc                 C   s   | j j}|d }| |sDtj|\}}|d| d| | iS t }|dkrX|S |dkr||d| j j d| diS t	d|dd S )Nr   _forkspawn.sqlite3zCloning with start method z is not supported.)
r   r   r
   r   pathsplitextmultiprocessingget_start_methodr   r   )r   suffixZ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   s(  | j jd }| |d }| |st|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 n2t dkr$tj|dd	}| j j | |  d S )
Nr   r   r   r   r   z*Got an error cloning the test database: %sr'   Turi)r   r   r2   r
   r   r   r   r   r   r   r   r   r    shutilcopyr+   r,   sqlite3connectbackupclose)r   r-   r!   r"   r.   Ztarget_database_namer#   Z	ondisk_dbr   r   r	   _clone_test_dbJ   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_dbm   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_signaturer   s    

z"DatabaseCreation.test_db_signaturec                 C   s   |  |}t }|dkr4| jj| | j  n|dkr| 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r|   d S )Nr&   r'   zfile:memorydb_r%   z?mode=memory&cache=sharedzfile:r(   Tr3   r   ZRUNNING_DJANGOS_TEST_SUITEtrue)r2   r+   r,   r   r   updater:   r   ZDatabaser8   r7   r9   r   environgetZ mark_expected_failures_and_skips)r   Z
_worker_idr   r1   r   Zconnection_strZ	source_dbZ	target_dbr   r   r	   setup_worker_connection   s,    
 

z(DatabaseCreation.setup_worker_connectionN)F)F)__name__
__module____qualname__staticmethodr
   r   r$   r2   r;   r<   r@   rE   r   r   r   r	   r      s   


#r   )r+   r   r5   r7   r   pathlibr   Z	django.dbr   Z django.db.backends.base.creationr   r   r   r   r   r	   <module>   s   