o
    ?Zœc#  ã                   @   sÐ   d Z ddlZddlZddlZddlmZ ddlmZ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 dd
lmZ W n eyK   d Z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+  SoftLayer Message Queue transport module for kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: No
* Supports Priority: No
* Supports TTL: No

Connection String
=================
 *Unreviewed*

Transport Options
=================
 *Unreviewed*
é    N)ÚEmpty)Úbytes_to_strÚsafe_str)ÚdumpsÚloads)Úcached_propertyé   )Úvirtual)Ú
get_client)ÚResponseErrorc                 C   s   i | ]}|d vrt |ƒd“qS )Ú_é_   )Úord)Ú.0Úc© r   úJ/var/www/chikooza/env/lib/python3.10/site-packages/kombu/transport/SLMQ.pyÚ
<dictcomp>'   s
    ÿÿr   c                       sÞ   e Zd ZdZdZdZdZi Zeƒ Z	‡ fdd„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„ Z‡ fdd„Z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ed%d&„ ƒZ‡  ZS )'ÚChannelzSLMQ Channel.i  zkombu%(vhost)sNc                    sD   t d u rtdƒ‚tƒ j|i |¤Ž | j ¡ }|D ]}|| j|< qd S )Nz7SLMQ transport requires the softlayer_messaging library)r
   ÚImportErrorÚsuperÚ__init__ÚslmqÚqueuesÚ_queue_cache)ÚselfÚargsÚkwargsr   Úqueue©Ú	__class__r   r   r   5   s   ÿ
ÿzChannel.__init__c                    s,   |r| j  |¡ tƒ j||g|¢R i |¤ŽS ©N)Ú_noack_queuesÚaddr   Úbasic_consume)r   r   Úno_ackr   r   r   r   r   r$   ?   s   ÿÿzChannel.basic_consumec                    s,   || j v r| j| }| j |¡ tƒ  |¡S r!   )Ú
_consumersÚ_tag_to_queuer"   Údiscardr   Úbasic_cancel)r   Úconsumer_tagr   r   r   r   r)   E   s   

zChannel.basic_cancelc                 C   s   t t|ƒƒ |¡S )z4Format AMQP queue name into a valid SLQS queue name.)Ústrr   Ú	translate)r   ÚnameÚtabler   r   r   Úentity_nameK   ó   zChannel.entity_namec                 K   st   |   | j| ¡}z| j| W S  ty9   z| jj|| jd W n	 ty)   Y nw | j |¡ }| j|< | Y S w )zEnsure a queue exists in SLQS.)Úvisibility_timeout)	r/   Úqueue_name_prefixr   ÚKeyErrorr   Úcreate_queuer1   r   r   )r   r   r   Úqr   r   r   Ú
_new_queueO   s   
ÿÿùzChannel._new_queuec                    s<   |   |¡}| j |d¡ | j |¡jdd tƒ  |¡ dS )zDelete queue by name.NT)Úforce)r/   r   Úpopr   r   Údeleter   Ú_delete)r   r   r   r   Ú
queue_namer   r   r   r:   ]   s   
zChannel._deletec                 K   s   |   |¡}| t|ƒ¡ dS )zPut message onto queue.N)r6   Úpushr   )r   r   Úmessager   r5   r   r   r   Ú_putd   s   
zChannel._putc                 C   s€   |   |¡}| d¡}|d r=|d d }tt|d ƒƒ}|| jv r,| |d ¡ ¡  |S |d d  |d |jdœ¡ |S t	ƒ ‚)	z/Try to retrieve a single message off ``queue``.r   Úitemsr   ÚbodyÚidÚ
propertiesÚdelivery_info)Úslmq_message_idÚslmq_queue_name)
r6   r8   r   r   r"   r=   r9   Úupdater-   r   )r   r   r5   ÚrsÚmÚpayloadr   r   r   Ú_geti   s   


þ
ÿzChannel._getc                    sN   | j  |¡j}z|d }W n	 ty   Y n	w |  ||d ¡ tƒ  |¡ d S )NrE   rD   )ÚqosÚgetrC   r3   Údelete_messager   Ú	basic_ack)r   Údelivery_tagrC   r   r   r   r   rN   x   s   ÿzChannel.basic_ackc                 C   s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Úmessage_count)r6   Údetail)r   r   r   r   r   Ú_size‚   r0   zChannel._sizec                 C   s\   |   |¡}d}| d¡}|d r,|d D ]}|  ||d ¡ |d7 }q| d¡}|d s|S )z'Delete all current messages in a queue.r   é
   r?   rA   r   )r6   r8   rM   )r   r   r5   ÚnÚresultsrH   r   r   r   Ú_purge†   s   



üzChannel._purgec                 C   s    | j  |  |¡¡}| |¡ ¡ S r!   )r   r   r/   r=   r9   )r   r   Ú
message_idr5   r   r   r   rM   ’   s   zChannel.delete_messagec           	      C   sÄ   | j d u r_| j}tj d|j¡}tj d|j¡}tj d|j¡}tj d|j¡}tj d|j	¡}t
tj d| j d¡¡p=dƒ}d	 |rEd
nd||rNd|› nd¡}t||d| _ | j  ||¡ | j S )NÚSLMQ_ACCOUNTÚSL_USERNAMEÚ
SL_API_KEYÚ	SLMQ_HOSTÚ	SLMQ_PORTÚSLMQ_SECUREÚsecureTz	{}://{}{}ÚhttpsÚhttpú:Ú )Úendpoint)Ú_slmqÚconninfoÚosÚenvironrL   Úvirtual_hostÚuseridÚpasswordÚhostnameÚportÚboolÚtransport_optionsÚformatr
   Úauthenticate)	r   re   ÚaccountÚuserÚapi_keyÚhostrl   r^   rc   r   r   r   r   –   s&   
ÿÿþzChannel.slmqc                 C   s   | j jS r!   )Ú
connectionÚclient©r   r   r   r   re   «   s   zChannel.conninfoc                 C   s
   | j jjS r!   )ru   rv   rn   rw   r   r   r   rn   ¯   s   
zChannel.transport_optionsc                 C   s   | j  d¡p| jS )Nr1   )rn   rL   Údefault_visibility_timeoutrw   r   r   r   r1   ³   s   ÿzChannel.visibility_timeoutc                 C   s   | j  dd¡S )Nr2   rb   )rn   rL   rw   r   r   r   r2   ¸   s   zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rx   Údomain_formatrd   r   Úsetr"   r   r$   r)   ÚCHARS_REPLACE_TABLEr/   r6   r:   r>   rJ   rN   rR   rV   rM   Úpropertyr   re   rn   r   r1   r2   Ú__classcell__r   r   r   r   r   ,   s:    





r   c                   @   s.   e Zd ZdZeZdZdZejj	e
ejf Z	dS )Ú	TransportzSLMQ Transport.r   N)ry   rz   r{   r|   r   Úpolling_intervalÚdefault_portr	   r‚   Úconnection_errorsr   ÚsocketÚerrorr   r   r   r   r‚   ½   s    ÿÿr‚   )r|   rf   r†   Ústringr   r   Úkombu.utils.encodingr   r   Úkombu.utils.jsonr   r   Úkombu.utils.objectsr   rb   r	   Úsoftlayer_messagingr
   Úsoftlayer_messaging.errorsr   r   Úpunctuationr   r   r‚   r   r   r   r   Ú<module>   s*    ÿÿ 