o
    wvXjD  ã                   @   sÀ   d Z ddlmZmZ ddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZ dd	lmZ zdd
lmZ W n eyC   dZY nw dd„ ejD ƒZG dd„ dejƒZG dd„ dejƒZdS )a³  Azure Storage Queues transport.

The transport can be enabled by setting the CELERY_BROKER_URL to:

```
azurestoragequeues://:{Storage Account Access Key}@{Storage Account Name}
```

Note that if the access key for the storage account contains a slash, it will
have to be regenerated before it can be used in the connection URL.

More information about Azure Storage Queues:
https://azure.microsoft.com/en-us/services/storage/queues/

é    )Úabsolute_importÚunicode_literalsN)ÚEmptyÚtext_t)Úsafe_str)ÚloadsÚdumps)Úcached_propertyé   )Úvirtual)ÚQueueServicec                 C   s   i | ]}t |ƒd “qS )é-   )Úord)Ú.0Úc© r   ú_/var/www/html/myproject/venv/lib/python3.10/site-packages/kombu/transport/azurestoragequeues.pyÚ
<dictcomp>"   s    
ÿr   c                       s´   e Zd ZdZdZdZi ZdZeƒ Z	‡ fdd„Z
‡ fdd„Zefd	d
„Zdd„ Z‡ fdd„Zdd„ Zddd„Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS ) ÚChannelzAzure Storage Queues channel.zkombu%(vhost)sNTc                    sD   t d u rtdƒ‚tt| ƒj|i |¤Ž | j ¡ D ]}|| j|< qd S )NzGAzure Storage Queues transport requires the azure-storage-queue library)r   ÚImportErrorÚsuperr   Ú__init__Úqueue_serviceÚlist_queuesÚ_queue_name_cache)ÚselfÚargsÚkwargsÚ
queue_name©Ú	__class__r   r   r   0   s   ÿzChannel.__init__c                    s0   |r| j  |¡ tt| ƒj||g|¢R i |¤ŽS ©N)Ú_noack_queuesÚaddr   r   Úbasic_consume)r   ÚqueueÚno_ackr   r   r   r   r   r$   :   s   ÿÿzChannel.basic_consumec                 C   s   t t|ƒƒ |¡S )z=Format AMQP queue name into a valid Azure Storage Queue name.)r   r   Ú	translate)r   ÚnameÚtabler   r   r   Úentity_nameA   s   zChannel.entity_namec                 C   sR   |   | j| ¡}z| j| W S  ty(   | jj|dd� | }| j|< | Y S w )zEnsure a queue exists.F)Úfail_on_exist)r*   Úqueue_name_prefixr   ÚKeyErrorr   Úcreate_queue)r   r%   Úqr   r   r   Ú_ensure_queueE   s   ýzChannel._ensure_queuec                    s8   |   |¡}| j |d¡ | j |¡ tt| ƒ |¡ dS )zDelete queue by name.N)r*   r   Úpopr   Údelete_queuer   r   Ú_delete)r   r%   r   r   r   r   r   r   r3   O   s   
zChannel._deletec                 K   s$   |   |¡}t|ƒ}| j ||¡ dS )zPut message onto queue.N)r0   r   r   Úput_message)r   r%   Úmessager   r/   Úencoded_messager   r   r   Ú_putV   s   
zChannel._putc                 C   s\   |   |¡}| jj|d|d�}|stƒ ‚|d }| j |j¡}t|ƒ}| j ||j|j	¡ |S )z/Try to retrieve a single message off ``queue``.r
   )Únum_messagesÚtimeoutr   )
r0   r   Úget_messagesr   Údecode_functionÚcontentr   Údelete_messageÚidÚpop_receipt)r   r%   r9   r/   Úmessagesr5   Úraw_contentr<   r   r   r   Ú_get\   s   

ÿzChannel._getc                 C   s   |   |¡}| j |¡}|jS )z)Return the number of messages in a queue.)r0   r   Úget_queue_metadataÚapproximate_message_count)r   r%   r/   Úmetadatar   r   r   Ú_sizem   s   
zChannel._sizec                 C   s$   |   |¡}|  |¡}| j |¡ |S )z'Delete all current messages in a queue.)r0   rF   r   Úclear_messages)r   r%   r/   Únr   r   r   Ú_purges   s   

zChannel._purgec                 C   s&   | j d u rt| jj| jjd�| _ | j S )N)Úaccount_nameÚaccount_key)Ú_queue_servicer   ÚconninfoÚhostnameÚpassword©r   r   r   r   r   z   s   
þzChannel.queue_servicec                 C   s   | j jS r!   )Ú
connectionÚclientrP   r   r   r   rM   ƒ   s   zChannel.conninfoc                 C   s
   | j jjS r!   )rQ   rR   Útransport_optionsrP   r   r   r   rS   ‡   s   
zChannel.transport_optionsc                 C   s   | j  dd¡S )Nr,   Ú )rS   ÚgetrP   r   r   r   r,   ‹   s   zChannel.queue_name_prefixr!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Údomain_formatrL   r   r&   Úsetr"   r   r$   ÚCHARS_REPLACE_TABLEr*   r0   r3   r7   rB   rF   rI   Úpropertyr   rM   rS   r	   r,   Ú__classcell__r   r   r   r   r   '   s0    





r   c                   @   s   e Zd ZdZeZdZdZdS )Ú	TransportzAzure Storage Queues transport.r
   N)rV   rW   rX   rY   r   Úpolling_intervalÚdefault_portr   r   r   r   r_   �   s
    r_   )rY   Ú
__future__r   r   ÚstringÚ
kombu.fiver   r   Úkombu.utils.encodingr   Úkombu.utils.jsonr   r   Úkombu.utils.objectsr	   rT   r   Úazure.storage.queuer   r   Úpunctuationr\   r   r_   r   r   r   r   Ú<module>   s$    ÿÿi