B
    CVvg$  ã               @   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-install-o3oxmrkh/Django/django/contrib/postgres/operations.pyÚ__init__   s    zCreateExtension.__init__c             C   s   d S )Nr   )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   r   r   r   r   Údatabase_backwards$   s    z"CreateExtension.database_backwardsc          	   C   s0   |j  ¡ �}| d|g¡ t| ¡ ƒ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 %s)r   )r   r   r   r   Údescribe7   s    zCreateExtension.describec             C   s
   d| j  S )Nzcreate_extension_%s)r   )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bloom)r   )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_gin)r   )r   r   r   r   r   G   s    zBtreeGinExtension.__init__N)r&   r'   r(   r   r   r   r   r   r+   E   s   r+   c               @   s   e Zd Zdd„ ZdS )ÚBtreeGistExtensionc             C   s
   d| _ d S )NZ
btree_gist)r   )r   r   r   r   r   M   s    zBtreeGistExtension.__init__N)r&   r'   r(   r   r   r   r   r   r,   K   s   r,   c               @   s   e Zd Zdd„ ZdS )ÚCITextExtensionc             C   s
   d| _ d S )NZcitext)r   )r   r   r   r   r   S   s    zCITextExtension.__init__N)r&   r'   r(   r   r   r   r   r   r-   Q   s   r-   c               @   s   e Zd Zdd„ ZdS )ÚCryptoExtensionc             C   s
   d| _ d S )NZpgcrypto)r   )r   r   r   r   r   Y   s    zCryptoExtension.__init__N)r&   r'   r(   r   r   r   r   r   r.   W   s   r.   c               @   s   e Zd Zdd„ ZdS )ÚHStoreExtensionc             C   s
   d| _ d S )NZhstore)r   )r   r   r   r   r   _   s    zHStoreExtension.__init__N)r&   r'   r(   r   r   r   r   r   r/   ]   s   r/   c               @   s   e Zd Zdd„ ZdS )ÚTrigramExtensionc             C   s
   d| _ d S )NZpg_trgm)r   )r   r   r   r   r   e   s    zTrigramExtension.__init__N)r&   r'   r(   r   r   r   r   r   r0   c   s   r0   c               @   s   e Zd Zdd„ ZdS )ÚUnaccentExtensionc             C   s
   d| _ d S )NZunaccent)r   )r   r   r   r   r   k   s    zUnaccentExtension.__init__N)r&   r'   r(   r   r   r   r   r   r1   i   s   r1   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(   r4   r   r   r   r   r2   o   s   r2   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 %sz, )Úindexr   ÚjoinÚfieldsÚ
model_name)r   r   r   r   r$   }   s    zAddIndexConcurrently.describec             C   s@   |   |¡ |j || j¡}|  |jj|¡r<|j|| jdd� d S )NT)Úconcurrently)	r4   ÚappsÚ	get_modelr9   Úallow_migrate_modelr   r   Ú	add_indexr6   )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 )NT)r:   )	r4   r;   r<   r9   r=   r   r   Úremove_indexr6   )r   r   r   r   r   r?   r   r   r   r    Š   s    
z'AddIndexConcurrently.database_backwardsN)r&   r'   r(   Ú__doc__Úatomicr$   r   r    r   r   r   r   r5   y   s
   r5   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   r9   )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 )NT)r:   )r4   r;   r<   r9   r=   r   r   ÚmodelsÚmodel_name_lowerÚget_index_by_namer   r@   )r   r   r   r   r   r?   Zfrom_model_stater6   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 )NT)r:   )r4   r;   r<   r9   r=   r   r   rD   rE   rF   r   r>   )r   r   r   r   r   r?   Zto_model_stater6   r   r   r   r        s    
z*RemoveIndexConcurrently.database_backwardsN)r&   r'   r(   rA   rB   r$   r   r    r   r   r   r   rC   ‘   s
   rC   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 )N)r   ÚlocalerI   rJ   )r   r   rK   rI   rJ   r   r   r   r   ª   s    zCollationOperation.__init__c             C   s   d S )Nr   )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   rK   rH   rI   FrJ   )r   rK   rI   rJ   r3   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+.rH   z*Non-libc providers require PostgreSQL 10+.rK   rI   ÚfalserJ   z$CREATE COLLATION %(name)s (%(args)s)z, c             s   s    | ]\}}|› d |› �V  qdS )ú=Nr   )Ú.0ÚoptionÚvaluer   r   r   ú	<genexpr>Ó   s    z6CollationOperation.create_collation.<locals>.<genexpr>)r   Úargs)rJ   r   ÚfeaturesZ%supports_non_deterministic_collationsr   rI   Z&supports_alternate_collation_providersr   rK   r   r   r7   Úitems)r   r   rT   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   r   Úremove_collationÖ   s    z#CollationOperation.remove_collationN)r&   r'   r(   r   r   rM   rW   rX   r   r   r   r   rG   ©   s
   rG   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   rW   )r   r   r   r   r   r   r   r   r   Þ   s    z!CreateCollation.database_forwardsc             C   s"   t  |jj|¡sd S |  |¡ d S )N)r   r   r   r   rX   )r   r   r   r   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   Úlower)r   r   r   r   r%   î   s    z'CreateCollation.migration_name_fragmentN)	r&   r'   r(   rA   r   r    r$   r)   r%   r   r   r   r   rY   Ü   s
   rY   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 )Nr   )r   r   r   r   r   rX   )r   r   r   r   r   r   r   r   r   õ   s    z!RemoveCollation.database_forwardsc             C   s"   t  |jj|¡sd S |  |¡ d S )N)r   r   r   r   rW   )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_%s)r   rZ   )r   r   r   r   r%     s    z'RemoveCollation.migration_name_fragmentN)	r&   r'   r(   rA   r   r    r$   r)   r%   r   r   r   r   r[   ó   s
   r[   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*   r+   r,   r-   r.   r/   r0   r1   r2   r5   rC   rG   rY   r[   r   r   r   r   Ú<module>   s$   6
3