o
    wvXjÆ  ã                   @   sä   d Z ddlmZmZ ddlZddlZddlZddlmZ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yU   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 )z"SoftLayer Message Queue transport.é    )Úabsolute_importÚunicode_literalsN)ÚEmptyÚtext_t)Úbytes_to_strÚsafe_str)ÚloadsÚdumps)Úcached_propertyé   )Úvirtual)Ú
get_client)ÚResponseErrorc                 C   s   i | ]}|d vrt |ƒd“qS )Ú_é_   )Úord)Ú.0Úc© r   úQ/var/www/html/myproject/venv/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                    sH   t d u rtdƒ‚tt| ƒj|i |¤Ž | j ¡ }|D ]}|| j|< qd S )Nz7SLMQ transport requires the softlayer_messaging library)r   ÚImportErrorÚsuperr   Ú__init__ÚslmqÚqueuesÚ_queue_cache)ÚselfÚargsÚkwargsr   Úqueue©Ú	__class__r   r   r   %   s   ÿ
ÿzChannel.__init__c                    s0   |r| j  |¡ tt| ƒj||g|¢R i |¤ŽS ©N)Ú_noack_queuesÚaddr   r   Úbasic_consume)r   r!   Úno_ackr   r    r"   r   r   r'   /   s   ÿÿzChannel.basic_consumec                    s0   || j v r| j| }| j |¡ tt| ƒ |¡S r$   )Ú
_consumersÚ_tag_to_queuer%   Údiscardr   r   Úbasic_cancel)r   Úconsumer_tagr!   r"   r   r   r,   5   s   

zChannel.basic_cancelc                 C   s   t t|ƒƒ |¡S )z4Format AMQP queue name into a valid SLQS queue name.)r   r   Ú	translate)r   ÚnameÚtabler   r   r   Úentity_name;   ó   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)	r1   Úqueue_name_prefixr   ÚKeyErrorr   Úcreate_queuer3   r   r!   )r   r!   r    Úqr   r   r   Ú
_new_queue?   s   
ÿÿùzChannel._new_queuec                    s@   |   |¡}| j |d¡ | j |¡jdd� tt| ƒ |¡ dS )zDelete queue by name.NT)Úforce)	r1   r   Úpopr   r!   Údeleter   r   Ú_delete)r   r!   r   r    Ú
queue_namer"   r   r   r<   M   s   
zChannel._deletec                 K   s   |   |¡}| t|ƒ¡ dS )zPut message onto queue.N)r8   Úpushr	   )r   r!   Úmessager    r7   r   r   r   Ú_putT   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)
r8   r:   r   r   r%   r?   r;   Úupdater/   r   )r   r!   r7   ÚrsÚmÚpayloadr   r   r   Ú_getY   s   


þ
ÿzChannel._getc                    sR   | j  |¡j}z|d }W n	 ty   Y n	w |  ||d ¡ tt| ƒ |¡ d S )NrG   rF   )ÚqosÚgetrE   r5   Údelete_messager   r   Ú	basic_ack)r   Údelivery_tagrE   r!   r"   r   r   rP   h   s   ÿzChannel.basic_ackc                 C   s   |   |¡ ¡ d S )z)Return the number of messages in a queue.Úmessage_count)r8   Údetail)r   r!   r   r   r   Ú_sizer   r2   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   é
   rA   rC   r   )r8   r:   rO   )r   r!   r7   ÚnÚresultsrJ   r   r   r   Ú_purgev   s   



üzChannel._purgec                 C   s    | j  |  |¡¡}| |¡ ¡ S r$   )r   r!   r1   r?   r;   )r   r!   Ú
message_idr7   r   r   r   rO   ‚   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{0}://{1}{2}ÚhttpsÚhttpz:{0}Ú )Úendpoint)Ú_slmqÚconninfoÚosÚenvironrN   Úvirtual_hostÚuseridÚpasswordÚhostnameÚportÚboolÚtransport_optionsÚformatr   Úauthenticate)	r   rf   ÚaccountÚuserÚapi_keyÚhostrm   r`   rd   r   r   r   r   †   s&   
ÿÿþzChannel.slmqc                 C   s   | j jS r$   )Ú
connectionÚclient©r   r   r   r   rf   ›   s   zChannel.conninfoc                 C   s
   | j jjS r$   )rv   rw   ro   rx   r   r   r   ro   Ÿ   s   
zChannel.transport_optionsc                 C   s   | j  d¡p| jS )Nr3   )ro   rN   Údefault_visibility_timeoutrx   r   r   r   r3   £   s   ÿzChannel.visibility_timeoutc                 C   s   | j  dd¡S )Nr4   rc   )ro   rN   rx   r   r   r   r4   ¨   s   zChannel.queue_name_prefix)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ry   Údomain_formatre   r   Úsetr%   r   r'   r,   ÚCHARS_REPLACE_TABLEr1   r8   r<   r@   rL   rP   rT   rX   rO   Úpropertyr   rf   ro   r
   r3   r4   Ú__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)rz   r{   r|   r}   r   Úpolling_intervalÚdefault_portr   rƒ   Úconnection_errorsr   ÚsocketÚerrorr   r   r   r   rƒ   ­   s    ÿÿrƒ   )r}   Ú
__future__r   r   r‡   Ústringrg   Ú
kombu.fiver   r   Úkombu.utils.encodingr   r   Úkombu.utils.jsonr   r	   Úkombu.utils.objectsr
   rc   r   Úsoftlayer_messagingr   Úsoftlayer_messaging.errorsr   r   Úpunctuationr€   r   rƒ   r   r   r   r   Ú<module>   s,    ÿÿ 