a
    ‘ÐOc¡1  ã                   @   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Zdd„ Z‡ fdd„Z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d$d$d)œ‡ fd*d+„
Z‡  ZS )0Ú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)zRALTER 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 |¡}t|dƒr2d|_| ¡  	¡ S )Nú%z%%ÚencodingÚutf8)
Ú
isinstanceÚstrÚreplaceÚpsycopg2Ú
extensionsZadaptÚhasattrr   Z	getquotedÚdecode)ÚselfÚvalueZadapted© r   ú[/var/www/html/gsl.tools/lib/python3.9/site-packages/django/db/backends/postgresql/schema.pyÚquote_value4   s    

z DatabaseSchemaEditor.quote_valuec                    s0   t ƒ  ||¡}|  ||¡}|d u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 r   )Zis_relationZrel_db_typeÚ
connectionÚ
data_typesÚgetÚget_internal_typeÚdb_type©r   r   r   r   r   Ú_field_data_typeD   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(   L   s    z+DatabaseSchemaEditor._field_base_data_typesc                 C   sr   |j | jd�}|durn|js"|jrnd|v 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)ÚfieldsÚsuffixÚ	opclassesÚtextZtext_pattern_ops)r$   r    Údb_indexÚuniqueÚ
startswithÚ_create_index_sql)r   r   r   r$   r   r   r   r   S   s&    
ü
üz+DatabaseSchemaEditor._create_like_index_sqlc                 C   sj   | j  ¡ �L}| j j ||¡D ]*}|d |kr|d   W  d   ƒ S qW d   ƒ n1 s\0    Y  d S )NÚcolumnÚname)r    ÚcursorZintrospectionZget_sequences)r   Útabler4   r6   Úsequencer   r   r   Ú_get_sequence_names   s
    :z'DatabaseSchemaEditor._get_sequence_namec                    s  d| _ d}| ¡ }| ¡ }|dkrV||krVt|  |¡ƒt|  |¡ƒkrx|  j |7  _ n"|  |¡|  |¡krx|  j |7  _ t|jjƒ}h d£}	||	v }
||	v }|rê|
sêt|jƒ}| j |  	|¡|dœ g f| j
|  	|¡|  	|¡dœ g fgfS |
�rv|�sv|  | j|  	|¡|  	t|jƒ¡dœ ¡ t|jƒ}tƒ  ||||¡\}}g }|  ||¡ }�rn| jd|  	|¡i g fg}||fS |�rö|
�rö||k�rötƒ  ||||¡\}}t|jƒ}dd	d
dœ}g }|  ||¡ }�rî| j|  	|¡|| dœ g fg}||fS tƒ  ||||¡S d S )Nz%ALTER COLUMN %(column)s TYPE %(type)sz USING %(column)s::%(type)sr'   >   ÚBigAutoFieldÚ	AutoFieldÚSmallAutoField)r4   Útype)r7   r4   r8   ÚintegerZbigintZsmallint)r;   r:   r<   )r8   r=   )Zsql_alter_column_typer#   Úlistr(   r&   r   Ú_metaÚdb_tabler4   Ú
quote_nameÚsql_add_identityÚexecuteÚsql_drop_indentityr   Ú_alter_column_type_sqlr9   Úsql_delete_sequenceÚsql_alter_sequence_type)r   r   Ú	old_fieldÚ	new_fieldÚnew_typeZ	using_sqlZnew_internal_typeZold_internal_typer7   Zauto_field_typesZold_is_autoZnew_is_autor4   ÚfragmentÚ_Zother_actionsZsequence_nameZdb_typesr   r   r   rF   z   s˜    ÿ
þÿú
þÿúÿ÷þÿÿ
ÿ
ÿÿûÿ	ÿ
ýþÿúÿ
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 urÈ|  |
¡ |j�r
|j �s
|j�s
| j|jj|jgdd�}|  |  ||¡¡ d S )Nr*   r/   Zcitextr+   )r-   )r0   r1   r2   Z_create_index_namer@   rA   r4   rD   Ú_delete_index_sqlr   Ú_alter_fieldr   )r   r   rI   rJ   Zold_typerK   Zold_db_paramsZnew_db_paramsÚstrictZ
index_namer   Zindex_to_remover   r   r   rO   ß   sP    ÿÿþþýýÿøÿÿ
ÿz!DatabaseSchemaEditor._alter_fieldc                    s*   |rt ||| j||d�S tƒ  ||||¡S )N)Úcol_suffixesr.   )r   rB   r   Ú_index_columns)r   r7   ÚcolumnsrQ   r.   r   r   r   rR     s    ûz#DatabaseSchemaEditor._index_columnsc                 C   s   | j |j|| |d�d d� d S )N©Úconcurrently)Úparams)rD   Z
create_sql©r   r   ÚindexrU   r   r   r   Ú	add_index  s    ÿzDatabaseSchemaEditor.add_indexc                 C   s   |   |j|| |d�¡ d S )NrT   )rD   Z
remove_sqlrW   r   r   r   Úremove_index  s    z!DatabaseSchemaEditor.remove_indexNc                    s    |r
| j n| j}tƒ  |||¡S r   )Úsql_delete_index_concurrentlyÚsql_delete_indexr   rN   )r   r   r5   ÚsqlrU   r   r   r   rN   "  s
    ÿýz&DatabaseSchemaEditor._delete_index_sqlÚ r   )r,   r5   r-   ÚusingÚdb_tablespacerQ   r]   r.   Ú	conditionrU   ÚincludeÚexpressionsc                   s4   |s
| j n| j}tƒ j|||||||||	|
||d�S )N)r,   r5   r-   r_   r`   rQ   r]   r.   ra   rb   rc   )Úsql_create_indexÚsql_create_index_concurrentlyr   r3   )r   r   r,   r5   r-   r_   r`   rQ   r]   r.   ra   rU   rb   rc   r   r   r   r3   *  s$    ÿýôz&DatabaseSchemaEditor._create_index_sql)F)F)F)NF)Ú__name__Ú
__module__Ú__qualname__Zsql_update_with_defaultrH   rG   rd   re   r\   r[   Zsql_create_column_inline_fkZsql_delete_fkZsql_delete_procedurerC   rE   r   r   r&   r(   r   r9   rF   rO   rR   rY   rZ   rN   r3   Ú__classcell__r   r   r   r   r      sZ   ÿÿÿÿÿÿÿ	 n ÷0

ñ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   