
vÅÏ^€  ã               @   sN   d  d l  Z  d  d l Z d  d l Z d  d l m Z Gd d „  d e ƒ Z d S)é    N)ÚBaseDatabaseCreationc               @   sp   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-8lau8j11/django/django/db/backends/sqlite3/creation.pyÚis_in_memory_db
   s    z DatabaseCreation.is_in_memory_dbc             C   s8   |  j  j d d p d } | d k r4 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 rQ |  j d |  j | | ƒ f ƒ t j | t j ƒ r| s| t d | ƒ } | sŽ | d k rè y t j | ƒ Wqt	 k
 rä } z# |  j d | ƒ t
 j d ƒ WYd  d  } ~ XqXn |  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   sh   |  j  j } | d } |  j | ƒ r) | St j j | d ƒ \ } } | d d j | | | ƒ i – Sd  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   s2  |  j  j d } |  j | ƒ d } |  j | ƒ s.t j | t j ƒ rÔ | rQ d  S| d k r} |  j d |  j | | ƒ f ƒ y t j	 | ƒ WnC t
 k
 rÓ } z# |  j d | ƒ t j d ƒ WYd  d  } ~ Xn Xy t j | | ƒ WnC t
 k
 r-} z# |  j d | ƒ t j d ƒ WYd  d  } ~ Xn Xd  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   sK   |  j  ƒ  } |  j j d g } |  j | ƒ rA | 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)Ú__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   