U
    }®c$  ã                   @   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-7m9rsep5/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