
v^.                 @   s   d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d Z Gd d	   d	  Z d S)
    N)StringIO)apps)settings)serializers)routerZtest_c               @   s  e  Z d  Z d Z d d   Z e d d    Z d d   Z d d	 d
 d	 d d  Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d	 d d  Z d	 d d  Z d d	 d	 d d  Z d d   Z d	 d d   Z d! d d	 d! d" d#  Z d$ d%   Z d& d'   Z d( d)   Z d! S)*BaseDatabaseCreationzs
    Encapsulate backend-specific differences pertaining to creation and
    destruction of the test database.
    c             C   s   | |  _  d  S)N)
connection)selfr    r
   B/tmp/pip-build-8lau8j11/django/django/db/backends/base/creation.py__init__   s    zBaseDatabaseCreation.__init__c             C   s
   |  j  j S)zH
        Used to be defined here, now moved to DatabaseWrapper.
        )r   _nodb_connection)r	   r
   r
   r   r      s    z%BaseDatabaseCreation._nodb_connectionc             C   s   t  j j | t j  d  S)N)sysstderrwriteoslinesep)r	   msgr
   r
   r   log   s    zBaseDatabaseCreation.log   FTc          
   C   s  d d l  m } |  j   } | d k r] d } | r: d } |  j d | |  j | |  f  |  j | | |  |  j j   | t j	 |  j j
 d <| |  j j d <| d d	 t | d d  d
 d d |  j j
 d d | r |  j   |  j _ | d d |  j j
 |  j j   | S)z
        Create a test database, prompting the user for confirmation if the
        database already exists. Return the name of the test database created.
        r   )call_commandr   ZCreatingzUsing existingz %s test database for alias %s...NAMEZmigrate	verbosityinteractiveFZdatabaseZ
run_syncdbTZcreatecachetable)Zdjango.core.managementr   _get_test_db_namer   _get_database_display_str_create_test_dbr   closer   	DATABASESaliassettings_dictmaxserialize_db_to_stringZ_test_serialized_contentsZensure_connection)r	   r   autoclobber	serializekeepdbr   test_database_nameactionr
   r
   r   create_test_db!   s0    	z#BaseDatabaseCreation.create_test_dbc             C   s   | d |  j  j d <d S)z
        Set this database up to be used in testing as a mirror of a primary
        database whose settings are given.
        r   N)r   r    )r	   Zprimary_settings_dictr
   r
   r   set_as_test_mirrorY   s    z'BaseDatabaseCreation.set_as_test_mirrorc                s   d d l  m } |  j  } g    xZ t j   D]L } | j d k	 r2 | j | j k r2 | j t	 j
 k r2   j | d f  q2 W   f d d   } t   } t j d |   d d d | | j   S)	z
        Serialize all data in the database into a JSON string.
        Designed only for test runner usage; will not handle large
        amounts of data.
        r   )MigrationLoaderNc              3   s   x} t  j    D]l }  |  j j  j  r t j  j j |   r |  j j	  j j  j
 |  j j j  } | j   Ed  Hq Wd  S)N)r   Zsort_dependenciesZ_metaZcan_migrater   r   Zallow_migrate_modelr   Z_default_managerusingZorder_bypknameiterator)modelZqueryset)app_listr	   r
   r   get_objectss   s
    *z@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objectsjsonindentstream)Zdjango.db.migrations.loaderr*   r   r   Zget_app_configsZmodels_modulelabelZmigrated_appsr-   r   ZTEST_NON_SERIALIZED_APPSappendr   r   r$   getvalue)r	   r*   loaderZ
app_configr1   outr
   )r0   r	   r   r"   `   s    	z+BaseDatabaseCreation.serialize_db_to_stringc             C   sC   t  |  } x0 t j d | d |  j j D] } | j   q+ Wd S)zw
        Reload the database with data from a string generated by
        the serialize_db_to_string() method.
        r2   r+   N)r   r   Zdeserializer   r   save)r	   dataobjr
   r
   r   deserialize_db_from_string~   s    %z/BaseDatabaseCreation.deserialize_db_from_stringc             C   s*   d |  j  j | d k r" d | n d f S)zR
        Return display string for a database for use in various actions.
        z'%s'%s   z ('%s') )r   r   )r	   r   Zdatabase_namer
   r
   r   r      s    	z.BaseDatabaseCreation._get_database_display_strc             C   s8   |  j  j d d r& |  j  j d d St |  j  j d S)z
        Internal implementation - return the name of the test DB that will be
        created. Only useful when called from create_test_db() and
        _create_test_db() and when no external munging is done with the 'NAME'
        settings.
        ZTESTr   )r   r    TEST_DATABASE_PREFIX)r	   r
   r
   r   r      s    z&BaseDatabaseCreation._get_test_db_namec             C   s   | j  d |  d  S)Nz%CREATE DATABASE %(dbname)s %(suffix)s)execute)r	   cursorZ
parametersr%   r
   r
   r   _execute_create_test_db   s    z,BaseDatabaseCreation._execute_create_test_dbc       	   #   C   s  |  j    } d |  j j j |  d |  j   i } |  j j   @} y |  j | | |  Wnt k
 r}} z | r{ | S|  j	 d |  | s t
 d |  } | s | d k rQyT | d k r |  j	 d |  j | |  f  | j d |  |  j | | |  Wqkt k
 rM} z# |  j	 d	 |  t j d
  WYd d } ~ XqkXn |  j	 d  t j d  WYd d } ~ Xn XWd QRX| S)zF
        Internal implementation - create the test db tables.
        Zdbnamesuffixz+Got an error creating the test database: %szXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: yesr   z,Destroying old test database for alias %s...zDROP DATABASE %(dbname)sz-Got an error recreating the test database: %sr>   NzTests cancelled.)r   r   ops
quote_namesql_table_creation_suffixr   rB   rC   	Exceptionr   inputr   rA   r   exit)	r	   r   r#   r%   r&   Ztest_db_paramsrB   eZconfirmr
   r
   r   r      s6    
	#'z$BaseDatabaseCreation._create_test_dbc             C   sh   |  j  j d } | d k rQ d } | r. d } |  j d | |  j | |  f  |  j | | |  d S)z(
        Clone a test database.
        r   r   zCloning test databasezUsing existing clonez%s for alias %s...N)r   r    r   r   _clone_test_db)r	   rD   r   r#   r%   Zsource_database_namer'   r
   r
   r   clone_test_db   s    	z"BaseDatabaseCreation.clone_test_dbc             C   s,   |  j  j } | d d j | d |  i  S)zX
        Return a modified connection settings dict for the n-th clone of a DB.
        r   z{}_{})r   r    format)r	   rD   Zorig_settings_dictr
   r
   r   get_test_db_clone_settings   s    z/BaseDatabaseCreation.get_test_db_clone_settingsc             C   s   t  d   d S)zI
        Internal implementation - duplicate the test db tables.
        znThe database backend doesn't support cloning databases. Disable the option to run tests in parallel processes.N)NotImplementedError)r	   rD   r   r%   r
   r
   r   rM      s    z#BaseDatabaseCreation._clone_test_dbNc             C   s   |  j  j   | d k r, |  j  j d } n |  j |  d } | d k r d } | r] d } |  j d | |  j | |  f  | s |  j | |  | d k	 r | t j |  j  j	 d <| |  j  j d <d S)zv
        Destroy a test database, prompting the user for confirmation if the
        database already exists.
        Nr   r   Z
DestroyingZ
Preservingz %s test database for alias %s...)
r   r   r    rP   r   r   _destroy_test_dbr   r   r   )r	   Zold_database_namer   r%   rD   r&   r'   r
   r
   r   destroy_test_db   s     	z$BaseDatabaseCreation.destroy_test_dbc             C   s@   |  j  j j   ' } | j d |  j  j j |   Wd QRXd S)zF
        Internal implementation - remove the test db tables.
        zDROP DATABASE %sN)r   r   rB   rA   rF   rG   )r	   r&   r   rB   r
   r
   r   rR   
  s    	z%BaseDatabaseCreation._destroy_test_dbc             C   s   d S)zQ
        SQL to append to the end of the test table creation statements.
        r?   r
   )r	   r
   r
   r   rH     s    z.BaseDatabaseCreation.sql_table_creation_suffixc             C   s.   |  j  j } | d | d | d |  j   f S)z
        Return a tuple with elements of self.connection.settings_dict (a
        DATABASES setting value) that uniquely identify a database
        accordingly to the RDBMS particularities.
        ZHOSTZPORTZENGINE)r   r    r   )r	   r    r
   r
   r   test_db_signature  s
    z&BaseDatabaseCreation.test_db_signature)__name__
__module____qualname____doc__r   propertyr   r   r(   r)   r"   r=   r   r   rC   r   rN   rP   rM   rS   rR   rH   rT   r
   r
   r
   r   r      s&   8		)
r   )r   r   ior   Zdjango.appsr   Zdjango.confr   Zdjango.corer   Z	django.dbr   r@   r   r
   r
   r
   r   <module>   s   