o
    
=h                     @   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	   [/var/www/ecommerce/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rt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    