î

_ÝVý  ã               @   s6   d  d l  Z  d  d l m Z Gd d „  d e ƒ Z d S)é    N)ÚBaseDatabaseSchemaEditorc                   s…   e  Z d  Z d Z d Z d Z d Z d Z d Z d d „  Z	 ‡  f d	 d
 †  Z
 d d „  Z ‡  f d d †  Z d ‡  f d d † Z ‡  S)ÚDatabaseSchemaEditorz@ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::%(type)szCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)szMCREATE INDEX %(name)s ON %(table)s (%(columns)s varchar_pattern_ops)%(extra)szJCREATE INDEX %(name)s ON %(table)s (%(columns)s text_pattern_ops)%(extra)sc             C   s   t  j j | ƒ S)N)Úpsycopg2Ú
extensionsZadapt)ÚselfÚvalue© r   úF/tmp/pip-build-ghmbqnp_/Django/django/db/backends/postgresql/schema.pyÚquote_value   s    z DatabaseSchemaEditor.quote_valuec                sŠ   t  t |  ƒ j | ƒ } | j j s= | j j s= | j j rA | SxB | j j D]4 } |  j | | ƒ } | d  k	 rN | j	 | ƒ qN qN W| S)N)
Úsuperr   Ú_model_indexes_sqlZ_metaZmanagedÚproxyZswappedZlocal_fieldsÚ_create_like_index_sqlÚappend)r   ÚmodelÚoutputÚfieldÚlike_index_statement)Ú	__class__r   r	   r      s    %z'DatabaseSchemaEditor._model_indexes_sqlc             C   s¬   | j  d |  j ƒ } | d k	 r¨ | j s3 | j r¨ d | k rC d S| j d ƒ rt |  j | | g d d d |  j ƒS| j d ƒ r¨ |  j | | g d d d |  j ƒSn  d S)	z£
        Return the statement to create an index with varchar operator pattern
        when the column type is 'varchar' or 'text', otherwise return None.
        Ú
connectionNú[ZvarcharÚsuffixÚ_likeZsqlÚtext)Údb_typer   Údb_indexÚuniqueÚ
startswithZ_create_index_sqlÚsql_create_varchar_indexÚsql_create_text_index)r   r   r   r   r   r   r	   r      s    "%z+DatabaseSchemaEditor._create_like_index_sqlc          
      sN  | j  ƒ  d k r+| j } d | | f } |  j i |  j | ƒ d 6d d 6g  f |  j i |  j | ƒ d 6g  f |  j i |  j | ƒ d 6g  f |  j i |  j | ƒ d 6|  j i |  j | ƒ d 6d |  j | ƒ d	 6d
 6g  f |  j i |  j | ƒ d 6|  j | ƒ d 6|  j | ƒ d 6g  f g f St	 t
 |  ƒ j | | | | ƒ Sd S)z:
        Makes ALTER TYPE with SERIAL make sense.
        Úserialz	%s_%s_seqÚcolumnÚintegerÚtypeÚsequenceÚtableznextval('%s')ÚdefaultZchangesN)Úlowerr!   Úsql_alter_column_typeZ
quote_nameÚsql_delete_sequenceÚsql_create_sequenceZsql_alter_columnZsql_alter_column_defaultÚsql_set_sequence_maxr   r   Ú_alter_column_type_sql)r   r%   Ú	old_fieldÚ	new_fieldÚnew_typer!   Zsequence_name)r   r   r	   r,   5   s4    							z+DatabaseSchemaEditor._alter_column_type_sqlFc	          	      s)  t  t |  ƒ j | | | | | | | | ƒ | j r‚ | j r‚ | j sQ | j r‚ |  j | | ƒ }	 |	 d  k	 r‚ |  j |	 ƒ q‚ n  | j s” | j r%| j p£ | j r%|  j | | j g d d ƒ}
 |  j	 | | j g d d ƒ} x? | D]4 } | |
 k rê |  j |  j
 |  j | | ƒ ƒ qê qê Wn  d  S)Nr   r   ÚindexT)r   r   Ú_alter_fieldr   r   r   ÚexecuteZ_create_index_namer!   Z_constraint_namesZ_delete_constraint_sqlZsql_delete_index)r   r   r-   r.   Zold_typer/   Zold_db_paramsZnew_db_paramsÚstrictr   Zindex_to_removeZindex_namesZ
index_name)r   r   r	   r1   j   s    
&%z!DatabaseSchemaEditor._alter_field)Ú__name__Ú
__module__Ú__qualname__r(   r*   r)   r+   r   r   r
   r   r   r,   r1   r   r   )r   r	   r      s   6r   )r   Zdjango.db.backends.base.schemar   r   r   r   r   r	   Ú<module>   s   