a
    5¤Xh«  ã                   @   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   )Zdatabase_name© r   úh/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/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 |  |¡sÆ|dkr:|  d|  ||¡f ¡ t |tj¡rÆ|sXtd| ƒ}|sd|dkr²zt |¡ W qÆ t	y® } z$|  d| ¡ t
 d¡ W Y d }~qÆd }~0 0 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 }|  |¡sHtj |¡\}}i |¥d|› d|› |› i¥S t ¡ }|dkr\|S |dkr„i |¥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 }|  |¡söt |tj¡r¦|r:d S |dkrZ|  d|  ||¡f ¡ zt 	|¡ W n< t
y¤ } z$|  d| ¡ t d¡ W Y d }~n
d }~0 0 zt ||¡ W n< t
yò } z$|  d| ¡ t d¡ W Y d }~n
d }~0 0 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   r3   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)   Tr4   r   ZRUNNING_DJANGOS_TEST_SUITEÚtrue)r3   r,   r-   r   r   Úupdater;   r   ZDatabaser9   r8   r:   r   ÚenvironÚgetZ mark_expected_failures_and_skips)r   Z
_worker_idr   r2   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%   r3   r<   r=   rA   rF   r   r   r   r	   r      s   


#r   )r,   r   r6   r8   r    Úpathlibr   Z	django.dbr   Z django.db.backends.base.creationr   r   r   r   r   r	   Ú<module>   s   