U
    R+|j:  ã                   @   sD   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 )é    )ÚBaseDatabaseSchemaEditor)ÚIndexColumns)Úsql)Ú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d4‡ fdd„	ZdZdZdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zd d!„ Zd5‡ fd#d$„	Z‡ fd%d&„Zd6d'd(„Zd7d)d*„Zd8‡ fd,d-„	Zd+d+d.d.d+dd+dd+d"d+d+d/œ‡ fd0d1„
Zd2d3„ Z‡  Z S )9ÚDatabaseSchemaEditorzeUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULL; SET CONSTRAINTS ALL IMMEDIATEz1ALTER SEQUENCE IF EXISTS %(sequence)s AS %(type)sz,DROP SEQUENCE IF EXISTS %(sequence)s CASCADEzZCREATE INDEX %(name)s ON %(table)s%(using)s (%(columns)s)%(include)s%(extra)s%(condition)szgCREATE INDEX CONCURRENTLY %(name)s ON %(table)s%(using)s (%(columns)s)%(include)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                    s8   |d krt ƒ  ||¡S | jj t|ƒ|¡}t ƒ  |d ¡S ©N)ÚsuperÚexecuteÚ
connectionÚopsZcompose_sqlÚstr)Úselfr   Úparams©Ú	__class__r   úlc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\django/db/backends/postgresql/schema.pyr
   *   s    zDatabaseSchemaEditor.executezRALTER TABLE %(table)s ALTER COLUMN %(column)s ADD GENERATED BY DEFAULT AS IDENTITYzEALTER TABLE %(table)s ALTER COLUMN %(column)s DROP IDENTITY IF EXISTSc                 C   s&   t |tƒr| dd¡}t || jj¡S )Nú%z%%)Ú
isinstancer   Úreplacer   Úquoter   )r   Úvaluer   r   r   Úquote_value:   s    
z DatabaseSchemaEditor.quote_valuec                    s0   t ƒ  ||¡}|  ||¡}|d k	r,| |¡ |S r   )r	   Ú_field_indexes_sqlÚ_create_like_index_sqlÚappend)r   ÚmodelÚfieldÚoutputÚlike_index_statementr   r   r   r   ?   s
    
z'DatabaseSchemaEditor._field_indexes_sqlc                 C   s.   |j r| | j¡S | jj | ¡ | | j¡¡S r   )Zis_relationZrel_db_typer   Ú
data_typesÚgetÚget_internal_typeÚdb_type©r   r   r   r   r   Ú_field_data_typeF   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'   N   s    z+DatabaseSchemaEditor._field_base_data_typesc                 C   s�   |j | jd�}|dk	rŒ|js"|jrŒd|kr.dS t|ddƒ}|rL|  |¡sLdS | d¡rl| j||gddgd�S | d	¡rŒ| 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ú[Zdb_collationÚvarcharÚ_likeZvarchar_pattern_ops)ÚfieldsÚsuffixÚ	opclassesÚtextZtext_pattern_ops)r#   r   Údb_indexÚuniqueÚgetattrÚ_is_collation_deterministicÚ
startswithÚ_create_index_sql)r   r   r   r#   Úcollation_namer   r   r   r   U   s,    
ü
üz+DatabaseSchemaEditor._create_like_index_sqlc                 C   sb   d}|  ¡ }|  ¡ }|dkrF||krFt|  |¡ƒt|  |¡ƒkr^|S n|  |¡|  |¡kr^|S dS )Nz USING %(column)s::%(type)sr&   Ú )r"   Úlistr'   r%   )r   Ú	new_fieldÚ	old_fieldÚ	using_sqlÚnew_internal_typeÚold_internal_typer   r   r   Ú
_using_sqlz   s    ÿzDatabaseSchemaEditor._using_sqlc              
   C   sT   | j  ¡ �@}| j j ||¡D ](}|d |kr|d   W  5 Q R £ S qW 5 Q R X d S )NÚcolumnÚname)r   ÚcursorZintrospectionZget_sequences)r   Útabler?   rA   Úsequencer   r   r   Ú_get_sequence_nameˆ   s
    $z'DatabaseSchemaEditor._get_sequence_namec                    sd  |j | jd�}|d }|js"|jrˆ| d¡r6| d¡r^| d¡rJ| d¡r^| d¡rˆ| d¡sˆ| j|jj|jgdd�}	|  	|  
||	¡¡ d| _|  ||¡ }
r¬|  j|
7  _| ¡ }| ¡ }t|jjƒ}d	d
dh}||k}||k}|�r6|�s6t|jƒ}| j|  |¡|ddœ g f| j|  |¡|  |¡dœ g fgfS |�rÆ|�sÆ|  	| j|  |¡|  t|jƒ¡dœ ¡ t|jƒ}tƒ  ||||||¡\}}g }|  ||¡ }�r¾| jd|  |¡i g fg}||fS |�rJ|�rJ||k�rJtƒ  ||||||¡\}}t|jƒ}ddddœ}g }|  ||¡ }�rB| j|  |¡|| dœ g fg}||fS tƒ  ||||||¡S d S )Nr(   Útyper*   r/   Zcitextr+   ©r-   z2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sÚ	AutoFieldÚBigAutoFieldÚSmallAutoFieldr7   ©r?   rE   Z	collation)rB   r?   rC   ÚintegerZbigintZsmallint)rG   rH   rI   )rC   rE   )Zdb_parametersr   r0   r1   r4   Ú_create_index_nameÚ_metaÚdb_tabler?   r
   Ú_delete_index_sqlZsql_alter_column_typer>   r"   r   Ú
quote_nameÚsql_add_identityÚsql_drop_indentityr	   Ú_alter_column_type_sqlrD   Úsql_delete_sequenceÚsql_alter_sequence_type)r   r   r:   r9   Únew_typeZold_collationÚnew_collationÚold_db_paramsÚold_typeZ
index_namer;   r<   r=   rB   Zauto_field_typesZold_is_autoZnew_is_autor?   ÚfragmentÚ_Zother_actionsZsequence_nameZdb_typesr   r   r   rS   �   sä    ÿÿþþýý  ÿÿý
ýÿùþÿúÿöþÿÿ
     ÿ ÿÿûÿ	     ÿ
ýþÿúÿ
     ÿz+DatabaseSchemaEditor._alter_column_type_sqlc                 C   sL   | j }|  ||¡ }r||7 }||  |j¡||r>d|  |¡ nddœ g fS )Nú r7   rJ   )Zsql_alter_column_collater>   rP   r?   Z_collate_sql)r   r   r9   rV   rW   r:   r   r;   r   r   r   Ú_alter_column_collation_sql  s    
ÿûÿ÷z0DatabaseSchemaEditor._alter_column_collation_sqlFc	              
      s–   t ƒ  ||||||||¡ |js,|js,|js8|jsV|jrV|  ||¡}	|	d k	rV|  |	¡ |jr’|js’|js’| j|jj|j	gdd�}
|  |  
||
¡¡ d S )Nr+   rF   )r	   Ú_alter_fieldr0   r1   r   r
   rL   rM   rN   r?   rO   )r   r   r:   r9   rY   rV   rX   Znew_db_paramsÚstrictr   Zindex_to_remover   r   r   r^     s2    øÿÿ
  ÿz!DatabaseSchemaEditor._alter_fieldc                    s*   |rt ||| j||d�S tƒ  ||||¡S )N)Úcol_suffixesr.   )r   rP   r	   Ú_index_columns)r   rB   Úcolumnsr`   r.   r   r   r   ra   9  s    ûz#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |d�d d� d S )N©Úconcurrently)r   )r
   Z
create_sql©r   r   Úindexrd   r   r   r   Ú	add_indexD  s     ÿzDatabaseSchemaEditor.add_indexc                 C   s   |   |j|| |d�¡ d S )Nrc   )r
   Z
remove_sqlre   r   r   r   Úremove_indexI  s    z!DatabaseSchemaEditor.remove_indexNc                    s    |r
| j n| j}tƒ  |||¡S r   )Úsql_delete_index_concurrentlyÚsql_delete_indexr	   rO   )r   r   r@   r   rd   r   r   r   rO   L  s
    ÿýz&DatabaseSchemaEditor._delete_index_sqlr7   )r,   r@   r-   ÚusingÚdb_tablespacer`   r   r.   Ú	conditionrd   ÚincludeÚexpressionsc                   s8   |p|s| j n| j}tƒ j|||||||||	|
||d�S )N)r,   r@   r-   rk   rl   r`   r   r.   rm   rn   ro   )Úsql_create_indexÚsql_create_index_concurrentlyr	   r5   )r   r   r,   r@   r-   rk   rl   r`   r   r.   rm   rd   rn   ro   r   r   r   r5   T  s&    ÿýôz&DatabaseSchemaEditor._create_index_sqlc              
   C   sH   | j  ¡ �4}| d|g¡ | ¡ }|r.|d nd W  5 Q R £ S Q R X d S )Nz‚
                SELECT collisdeterministic
                FROM pg_collation
                WHERE collname = %s
                r   )r   rA   r
   Zfetchone)r   r6   rA   Úrowr   r   r   r3   y  s    úz0DatabaseSchemaEditor._is_collation_deterministic)r   )F)F)F)NF)!Ú__name__Ú
__module__Ú__qualname__Zsql_update_with_defaultrU   rT   rp   rq   rj   ri   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurer
   rQ   rR   r   r   r%   r'   r   r>   rD   rS   r]   r^   ra   rg   rh   rO   r5   r3   Ú__classcell__r   r   r   r   r      sb   ÿÿÿÿÿ	ÿÿ%s ÷$

ñ%r   N)	Zdjango.db.backends.base.schemar   Z!django.db.backends.ddl_referencesr   Z)django.db.backends.postgresql.psycopg_anyr   Zdjango.db.backends.utilsr   r   r   r   r   r   Ú<module>   s   