î
ªÍ Xu  ã               @   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
 ‡  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   úR/home/ubuntu/projects/ifolica/build/django/django/db/backends/postgresql/schema.pyÚquote_value   s    z DatabaseSchemaEditor.quote_valuec                sN   t  t |  ƒ j | | ƒ |  j | | ƒ } | d  k	 rJ |  j j | ƒ n  d  S)N)Úsuperr   Ú	add_fieldÚ_create_like_index_sqlZdeferred_sqlÚappend)r   ÚmodelÚfieldÚlike_index_statement)Ú	__class__r   r	   r      s    zDatabaseSchemaEditor.add_fieldc                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)
r   r   Ú_model_indexes_sqlZ_metaZmanagedÚproxyZswappedZlocal_fieldsr   r   )r   r   Úoutputr   r   )r   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          
      sl  | j  ƒ  d k rI| j } d | | f } | j  ƒ  d k rC d n d } |  j i |  j | ƒ d 6| 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.
        ÚserialÚ	bigserialz	%s_%s_seqÚintegerZbigintÚcolumnÚtypeÚsequenceÚtableznextval('%s')ÚdefaultZchangesN)zserialr"   )Ú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_nameZcol_type)r   r   r	   r.   ;   s6    							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/   r0   Zold_typer1   Zold_db_paramsZnew_db_paramsÚstrictr   Zindex_to_removeZindex_namesZ
index_name)r   r   r	   r3   q   s    
&%z!DatabaseSchemaEditor._alter_field)Ú__name__Ú
__module__Ú__qualname__r*   r,   r+   r-   r   r    r
   r   r   r   r.   r3   r   r   )r   r	   r      s   7r   )r   Zdjango.db.backends.base.schemar   r   r   r   r   r	   Ú<module>   s   