U
    dO                     @   sL   d dl Z d dlm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)
errorcodes)ImproperlyConfigured)BaseDatabaseCreation)strip_quotesc                       sJ   e Zd Zdd ZdddZdd Zdd	 Zd fdd	ZdddZ  Z	S )DatabaseCreationc                 C   s   | j j|S )N)
connectionopsZ
quote_name)selfname r   J/tmp/pip-unpacked-wheel-7vj2equ7/django/db/backends/postgresql/creation.py_quote_name   s    zDatabaseCreation._quote_nameNc                 C   s:   d}|r|d |7 }|r.|d | |7 }|o8d| S )N z ENCODING '{}'z TEMPLATE {}ZWITH)formatr   )r	   encodingtemplatesuffixr   r   r   _get_database_create_suffix   s    z,DatabaseCreation._get_database_create_suffixc                 C   s:   | j jd }|dd k	r"td| j|d |ddS )NZTESTZ	COLLATIONzHPostgreSQL does not support collation setting at database creation time.CHARSETTEMPLATE)r   r   )r   settings_dictgetr   r   )r	   Ztest_settingsr   r   r   sql_table_creation_suffix   s    z*DatabaseCreation.sql_table_creation_suffixc                 C   s   | dt|g | d k	S )Nz7SELECT 1 FROM pg_catalog.pg_database WHERE datname = %s)executer   Zfetchone)r	   cursorZdatabase_namer   r   r   _database_exists"   s
    z!DatabaseCreation._database_existsFc              
      s   z.|r|  ||d rW d S t ||| W nV tk
r } z8t|jddtjkrn| d|  t	
d n|st W 5 d }~X Y nX d S )NdbnameZpgcoder   z+Got an error creating the test database: %s   )r   super_execute_create_test_db	Exceptiongetattr	__cause__r   ZDUPLICATE_DATABASElogsysexit)r	   r   
parameterskeepdbe	__class__r   r   r   )   s    z(DatabaseCreation._execute_create_test_dbc           	      C   s   | j   | j jd }| |d }| || j|dd}|  }z| ||| W n tk
r   z@|dkr| 	d| 
||f  |d|  | ||| W n: tk
r } z| 	d|  td W 5 d }~X Y nX Y nX W 5 Q R X d S )	NNAME)r   )r   r      z,Destroying old test database for alias %s...zDROP DATABASE %(dbname)sz*Got an error cloning the test database: %sr   )r   closer   Zget_test_db_clone_settingsr   r   Z_nodb_cursorr   r    r#   Z_get_database_display_strr   r$   r%   )	r	   r   	verbosityr'   Zsource_database_nameZtarget_database_nameZtest_db_paramsr   r(   r   r   r   _clone_test_db:   s4    


 zDatabaseCreation._clone_test_db)NN)F)F)
__name__
__module____qualname__r   r   r   r   r   r/   __classcell__r   r   r)   r   r   
   s   
r   )
r$   Zpsycopg2r   Zdjango.core.exceptionsr   Z django.db.backends.base.creationr   Zdjango.db.backends.utilsr   r   r   r   r   r   <module>   s
   