U
    Ha$                     @   s6  d dl mZmZmZ d dlmZmZ d dlmZm	Z	 d dl
mZ G dd deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd deeZG dd dee	ZG dd deZG dd  d eZG d!d" d"eZd#S )$    )get_citext_oidsget_hstore_oidsregister_type_handlers)NotSupportedErrorrouter)AddIndexRemoveIndex)	Operationc                   @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )CreateExtensionTc                 C   s
   || _ d S Nname)selfr    r   F/tmp/pip-unpacked-wheel-3jxiddxt/django/contrib/postgres/operations.py__init__   s    zCreateExtension.__init__c                 C   s   d S r   r   r   	app_labelstater   r   r   state_forwards   s    zCreateExtension.state_forwardsc                 C   sb   |j jdkst|j j|s d S | || jsD|d|| j  t	
  t
  t|j  d S )N
postgresqlz!CREATE EXTENSION IF NOT EXISTS %s)
connectionvendorr   allow_migratealiasextension_existsr   execute
quote_namer   cache_clearr   r   r   r   schema_editor
from_stateto_stater   r   r   database_forwards   s    
z!CreateExtension.database_forwardsc                 C   sL   t |jj|sd S | || jr8|d|| j  t	  t
	  d S )NzDROP EXTENSION IF EXISTS %s)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   database_backwards$   s    z"CreateExtension.database_backwardsc              
   C   s<   |j  (}|d|g t| W  5 Q R  S Q R X d S )Nz-SELECT 1 FROM pg_extension WHERE extname = %s)r   cursorr   boolZfetchone)r   r    	extensionr%   r   r   r   r   /   s    z CreateExtension.extension_existsc                 C   s
   d| j  S )NzCreates extension %sr   r   r   r   r   describe7   s    zCreateExtension.describec                 C   s
   d| j  S )Nzcreate_extension_%sr   r(   r   r   r   migration_name_fragment:   s    z'CreateExtension.migration_name_fragmentN)__name__
__module____qualname__Z
reversibler   r   r#   r$   r   r)   propertyr*   r   r   r   r   r
   	   s   r
   c                   @   s   e Zd Zdd ZdS )BloomExtensionc                 C   s
   d| _ d S )NZbloomr   r(   r   r   r   r   A   s    zBloomExtension.__init__Nr+   r,   r-   r   r   r   r   r   r/   ?   s   r/   c                   @   s   e Zd Zdd ZdS )BtreeGinExtensionc                 C   s
   d| _ d S )NZ	btree_ginr   r(   r   r   r   r   G   s    zBtreeGinExtension.__init__Nr0   r   r   r   r   r1   E   s   r1   c                   @   s   e Zd Zdd ZdS )BtreeGistExtensionc                 C   s
   d| _ d S )NZ
btree_gistr   r(   r   r   r   r   M   s    zBtreeGistExtension.__init__Nr0   r   r   r   r   r2   K   s   r2   c                   @   s   e Zd Zdd ZdS )CITextExtensionc                 C   s
   d| _ d S )NZcitextr   r(   r   r   r   r   S   s    zCITextExtension.__init__Nr0   r   r   r   r   r3   Q   s   r3   c                   @   s   e Zd Zdd ZdS )CryptoExtensionc                 C   s
   d| _ d S )NZpgcryptor   r(   r   r   r   r   Y   s    zCryptoExtension.__init__Nr0   r   r   r   r   r4   W   s   r4   c                   @   s   e Zd Zdd ZdS )HStoreExtensionc                 C   s
   d| _ d S )NZhstorer   r(   r   r   r   r   _   s    zHStoreExtension.__init__Nr0   r   r   r   r   r5   ]   s   r5   c                   @   s   e Zd Zdd ZdS )TrigramExtensionc                 C   s
   d| _ d S )NZpg_trgmr   r(   r   r   r   r   e   s    zTrigramExtension.__init__Nr0   r   r   r   r   r6   c   s   r6   c                   @   s   e Zd Zdd ZdS )UnaccentExtensionc                 C   s
   d| _ d S )NZunaccentr   r(   r   r   r   r   k   s    zUnaccentExtension.__init__Nr0   r   r   r   r   r7   i   s   r7   c                   @   s   e Zd Zdd ZdS )NotInTransactionMixinc                 C   s   |j jrtd| jj d S )Nz_The %s operation cannot be executed inside a transaction (set atomic = False on the migration).)r   Zin_atomic_blockr   	__class__r+   r   r    r   r   r   _ensure_not_in_transactionp   s    z0NotInTransactionMixin._ensure_not_in_transactionN)r+   r,   r-   r;   r   r   r   r   r8   o   s   r8   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
AddIndexConcurrentlyzDCreate an index using PostgreSQL's CREATE INDEX CONCURRENTLY syntax.Fc                 C   s   d| j jd| j j| jf S )Nz7Concurrently create index %s on field(s) %s of model %s, )indexr   joinfields
model_namer(   r   r   r   r)   }   s
    zAddIndexConcurrently.describec                 C   s@   |  | |j|| j}| |jj|r<|j|| jdd d S NT)Zconcurrently)	r;   apps	get_modelrA   allow_migrate_modelr   r   	add_indexr>   r   r   r    r!   r"   modelr   r   r   r#      s    
z&AddIndexConcurrently.database_forwardsc                 C   s@   |  | |j|| j}| |jj|r<|j|| jdd d S rB   )	r;   rC   rD   rA   rE   r   r   remove_indexr>   rG   r   r   r   r$      s    
z'AddIndexConcurrently.database_backwardsNr+   r,   r-   __doc__Zatomicr)   r#   r$   r   r   r   r   r<   y   s
   r<   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
RemoveIndexConcurrentlyzBRemove an index using PostgreSQL's DROP INDEX CONCURRENTLY syntax.Fc                 C   s   d| j | jf S )Nz$Concurrently remove index %s from %s)r   rA   r(   r   r   r   r)      s    z RemoveIndexConcurrently.describec                 C   sZ   |  | |j|| j}| |jj|rV|j|| jf }|	| j
}|j||dd d S rB   )r;   rC   rD   rA   rE   r   r   modelsmodel_name_lowerget_index_by_namer   rI   )r   r   r    r!   r"   rH   Zfrom_model_stater>   r   r   r   r#      s    
z)RemoveIndexConcurrently.database_forwardsc                 C   sZ   |  | |j|| j}| |jj|rV|j|| jf }|	| j
}|j||dd d S rB   )r;   rC   rD   rA   rE   r   r   rM   rN   rO   r   rF   )r   r   r    r!   r"   rH   Zto_model_stater>   r   r   r   r$      s    
z*RemoveIndexConcurrently.database_backwardsNrJ   r   r   r   r   rL      s
   rL   c                   @   s<   e Zd ZdddddZdd Zdd	 Zd
d Zdd ZdS )CollationOperationlibcT)providerdeterministicc                C   s   || _ || _|| _|| _d S r   )r   localerR   rS   )r   r   rT   rR   rS   r   r   r   r      s    zCollationOperation.__init__c                 C   s   d S r   r   r   r   r   r   r      s    z!CollationOperation.state_forwardsc                 C   sJ   | j | jd}| jr(| jdkr(| j|d< | jdkr<| j|d< | jjg |fS )N)r   rT   rQ   rR   FrS   )r   rT   rR   rS   r9   r-   )r   kwargsr   r   r   deconstruct   s    


zCollationOperation.deconstructc              	   C   s   | j dkr|jjjstd| jdkr8|jjjs8tdd|| ji}| jdkrb|| j|d< | j dkrtd|d< |	d	|| j
d
dd | D d  d S )NFz4Non-deterministic collations require PostgreSQL 12+.rQ   z*Non-libc providers require PostgreSQL 10+.rT   rR   falserS   z$CREATE COLLATION %(name)s (%(args)s)r=   c                 s   s    | ]\}}| d | V  qdS )=Nr   ).0optionvaluer   r   r   	<genexpr>   s     z6CollationOperation.create_collation.<locals>.<genexpr>)r   args)rS   r   featuresZ%supports_non_deterministic_collationsr   rR   Z&supports_alternate_collation_providersr   rT   r   r   r?   items)r   r    r]   r   r   r   create_collation   s*    


z#CollationOperation.create_collationc                 C   s   | d|| j  d S )NzDROP COLLATION %s)r   r   r   r:   r   r   r   remove_collation   s    z#CollationOperation.remove_collationN)r+   r,   r-   r   r   rV   r`   ra   r   r   r   r   rP      s
   rP   c                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )CreateCollationzCreate a collation.c                 C   s.   |j jdkst|j j|s d S | | d S Nr   )r   r   r   r   r   r`   r   r   r   r   r#      s    
z!CreateCollation.database_forwardsc                 C   s"   t |jj|sd S | | d S r   )r   r   r   r   ra   r   r   r   r   r$      s    z"CreateCollation.database_backwardsc                 C   s   d| j  S )NzCreate collation r   r(   r   r   r   r)      s    zCreateCollation.describec                 C   s   d| j   S )Nzcreate_collation_%sr   lowerr(   r   r   r   r*      s    z'CreateCollation.migration_name_fragmentN	r+   r,   r-   rK   r#   r$   r)   r.   r*   r   r   r   r   rb      s   rb   c                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )RemoveCollationzRemove a collation.c                 C   s.   |j jdkst|j j|s d S | | d S rc   )r   r   r   r   r   ra   r   r   r   r   r#      s    
z!RemoveCollation.database_forwardsc                 C   s"   t |jj|sd S | | d S r   )r   r   r   r   r`   r   r   r   r   r$      s    z"RemoveCollation.database_backwardsc                 C   s   d| j  S )NzRemove collation r   r(   r   r   r   r)     s    zRemoveCollation.describec                 C   s   d| j   S )Nzremove_collation_%srd   r(   r   r   r   r*     s    z'RemoveCollation.migration_name_fragmentNrf   r   r   r   r   rg      s   rg   N)Zdjango.contrib.postgres.signalsr   r   r   Z	django.dbr   r   Zdjango.db.migrationsr   r   Z$django.db.migrations.operations.baser	   r
   r/   r1   r2   r3   r4   r5   r6   r7   r8   r<   rL   rP   rb   rg   r   r   r   r   <module>   s$   6
3