B
    `'                 @   s@   d dl 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)BaseDatabaseSchemaEditor)IndexColumns)strip_quotesc            
       s   e Zd ZdZdZdZd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dd Zdd Z fddZd) fdd	Z fddZd*ddZd+dd Zd, fd"d#	Zd!d$d$d!d%d!d%d!dd&	 fd'd(
Z  ZS )-DatabaseSchemaEditorzCREATE SEQUENCE %(sequence)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEz=SELECT setval('%(sequence)s', MAX(%(column)s)) FROM %(table)sz9ALTER SEQUENCE %(sequence)s OWNED BY %(table)s.%(column)szOCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)sz\CREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s (%(columns)s)%(extra)s%(condition)szDROP INDEX IF EXISTS %(name)sz*DROP INDEX CONCURRENTLY IF EXISTS %(name)szyCONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)s; SET CONSTRAINTS %(namespace)s%(name)s IMMEDIATEzRSET CONSTRAINTS %(name)s IMMEDIATE; ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz,DROP FUNCTION %(procedure)s(%(param_types)s)c             C   s*   t |tr|dd}tj|  S )N%z%%)
isinstancestrreplacepsycopg2
extensionsZadaptZ	getquoteddecode)selfvalue r   S/home/dcms/DCMS/lib/python3.7/site-packages/django/db/backends/postgresql/schema.pyquote_value"   s    
z DatabaseSchemaEditor.quote_valuec                s0   t  ||}| ||}|d k	r,|| |S )N)super_field_indexes_sql_create_like_index_sqlappend)r   modelfieldoutputlike_index_statement)	__class__r   r   r   (   s
    
z'DatabaseSchemaEditor._field_indexes_sqlc             C   s.   |j r|| jS | jj| || jS )N)Zis_relationZrel_db_type
connectionZ
data_typesgetget_internal_typedb_type)r   r   r   r   r   _field_data_type/   s
    z%DatabaseSchemaEditor._field_data_typec             c   s4   |j  dkr"| |j E d H  n| |j V  d S )N
ArrayField)Z
base_fieldr   _field_base_data_typesr   )r   r   r   r   r   r!   7   s    z+DatabaseSchemaEditor._field_base_data_typesc             C   sr   |j | jd}|dk	rn|js"|jrnd|kr.dS |drN| j||gddgdS |drn| j||gdd	gdS 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.
        )r   N[varchar_likeZvarchar_pattern_ops)suffix	opclassestextZtext_pattern_ops)r   r   db_indexunique
startswith_create_index_sql)r   r   r   r   r   r   r   r   >   s    

z+DatabaseSchemaEditor._create_like_index_sqlc                s  d| _ d}| }| }|dkrV||krVt| |t| |krx|  j |7  _ n"| || |krx|  j |7  _ t|jj}dddd}	| |	krt|j	}
d||
f }| j | 
|
|	|  d	 g f| jd
| 
|i g f| jd
| 
|i g f| j| 
|| j| 
|
d| 
| d d g f| j| 
|| 
|
| 
|d g f| j| 
|| 
|
| 
|d g fgfS t ||||S d S )Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr    ZbigintintegerZsmallint)Z	bigserialserialZsmallserialz	%s_%s_seq)columntypesequenceznextval('%s'))r.   default)tablechanges)r2   r.   r0   )Zsql_alter_column_typer   listr!   r   r   _metadb_tablelowerr.   
quote_namesql_delete_sequencesql_create_sequenceZsql_alter_columnZsql_alter_column_defaultsql_set_sequence_maxsql_set_sequence_ownerr   _alter_column_type_sql)r   r   	old_field	new_fieldnew_typeZ	using_sqlZnew_internal_typeZold_internal_typer2   Zserial_fields_mapr.   Zsequence_name)r   r   r   r=   T   sR    

z+DatabaseSchemaEditor._alter_column_type_sqlFc	          
      s  |j s|jrr|dr |drH|dr4|drH|drr|dsr| j|jj|jgdd}	| | ||	 t	 
|||||||| |j s|js|j s|js|jr| ||}
|
d k	r| |
 |jr
|j s
|js
| j|jj|jgdd}| | || d S )Nr#   r'   Zcitextr$   )r%   )r(   r)   r*   Z_create_index_namer5   r6   r.   execute_delete_index_sqlr   _alter_fieldr   )r   r   r>   r?   Zold_typer@   Zold_db_paramsZnew_db_paramsstrictZ
index_namer   Zindex_to_remove)r   r   r   rC      s"    
z!DatabaseSchemaEditor._alter_fieldc                s*   |rt ||| j||dS t ||||S )N)col_suffixesr&   )r   r8   r   _index_columns)r   r2   columnsrE   r&   )r   r   r   rF      s    z#DatabaseSchemaEditor._index_columnsc             C   s   | j |j|| |dd d d S )N)concurrently)params)rA   Z
create_sql)r   r   indexrH   r   r   r   	add_index   s    zDatabaseSchemaEditor.add_indexc             C   s   |  |j|| |d d S )N)rH   )rA   Z
remove_sql)r   r   rJ   rH   r   r   r   remove_index   s    z!DatabaseSchemaEditor.remove_indexNc                s    |r
| j n| j}t |||S )N)sql_delete_index_concurrentlysql_delete_indexr   rB   )r   r   namesqlrH   )r   r   r   rB      s    z&DatabaseSchemaEditor._delete_index_sql r   )	rO   r%   usingdb_tablespacerE   rP   r&   	conditionrH   c   	            s0   |s
| j n| j}t j|||||||||	|
d
S )N)rO   r%   rR   rS   rE   rP   r&   rT   )sql_create_indexsql_create_index_concurrentlyr   r+   )r   r   fieldsrO   r%   rR   rS   rE   rP   r&   rT   rH   )r   r   r   r+      s    z&DatabaseSchemaEditor._create_index_sql)F)F)F)NF)__name__
__module____qualname__r:   r9   r;   r<   rU   rV   rN   rM   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer   r   r   r!   r   r=   rC   rF   rK   rL   rB   r+   __classcell__r   r   )r   r   r      s2   G

r   )r
   Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   Zdjango.db.backends.utilsr   r   r   r   r   r   <module>   s   