o
    —¨Êh  ã                   @  sø   d Z ddl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 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dZd e e!eƒ¡Z"e #¡ Z$G dd„ dej%ƒZ%G dd„ dej&ƒZ&dS )aG  SQLAlchemy Transport module for kombu.

Kombu transport using SQL Database as the message store.

Features
========
* Type: Virtual
* Supports Direct: yes
* Supports Topic: yes
* Supports Fanout: no
* Supports Priority: no
* Supports TTL: no

Connection String
=================

.. code-block::

    sqla+SQL_ALCHEMY_CONNECTION_STRING
    sqlalchemy+SQL_ALCHEMY_CONNECTION_STRING

For details about ``SQL_ALCHEMY_CONNECTION_STRING`` see SQLAlchemy Engine Configuration documentation.

Examples
--------
.. code-block::

    # PostgreSQL with default driver
    sqla+postgresql://scott:tiger@localhost/mydatabase

    # PostgreSQL with psycopg2 driver
    sqla+postgresql+psycopg2://scott:tiger@localhost/mydatabase

    # PostgreSQL with pg8000 driver
    sqla+postgresql+pg8000://scott:tiger@localhost/mydatabase

    # MySQL with default driver
    sqla+mysql://scott:tiger@localhost/foo

    # MySQL with mysqlclient driver (a maintained fork of MySQL-Python)
    sqla+mysql+mysqldb://scott:tiger@localhost/foo

    # MySQL with PyMySQL driver
    sqla+mysql+pymysql://scott:tiger@localhost/foo

Transport Options
=================

* ``queue_tablename``: Name of table storing queues.
* ``message_tablename``: Name of table storing messages.

Moreover parameters of :func:`sqlalchemy.create_engine()` function can be passed as transport options.
é    )ÚannotationsN)ÚdumpsÚloads)ÚEmpty)Úcreate_engineÚtext)ÚOperationalError)Úsessionmaker)Úvirtual)Úcached_property)Úbytes_to_stré   )ÚMessage)Ú	ModelBase)ÚQueue)Úclass_registryÚmetadata)r   é   r   Ú.c                      s¤   e Zd ZdZdZi Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Z	e
dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZedd „ ƒZ‡  ZS )!ÚChannelzThe channel class.Nc                   s&   |   |jj¡ tƒ j|fi |¤Ž d S ©N)Ú_configure_entity_tablenamesÚclientÚtransport_optionsÚsuperÚ__init__)ÚselfÚ
connectionÚkwargs©Ú	__class__© úU/var/www/html/env/lib/python3.10/site-packages/kombu/transport/sqlalchemy/__init__.pyr   \   s   zChannel.__init__c                 C  s2   |  dd¡| _|  dd¡| _| jo| j d S  d S )NÚqueue_tablenameÚkombu_queueÚmessage_tablenameÚkombu_message)Úgetr#   r%   Ú	queue_clsÚmessage_cls)r   Úoptsr!   r!   r"   r   `   s   z$Channel._configure_entity_tablenamesc                 C  s<   | j j}|j ¡ }| dd ¡ | dd ¡ t|jfi |¤ŽS )Nr#   r%   )r   r   r   ÚcopyÚpopr   Úhostname)r   Úconninfor   r!   r!   r"   Ú_engine_from_configk   s
   
zChannel._engine_from_configc                 C  s–   | j j}|j| jvrEt�1 |j| jv r | j|j W  d   ƒ S |  ¡ }t|d�}t |¡ ||f| j|j< W d   ƒ n1 s@w   Y  | j|j S )N)Úbind)	r   r   r-   Ú_enginesÚ_MUTEXr/   r	   r   Ú
create_all)r   r.   ÚengineÚSessionr!   r!   r"   Ú_openr   s   
ü

÷zChannel._openc                 C  s$   | j d u r|  ¡ \}}|ƒ | _ | j S r   )Ú_sessionr6   )r   Ú_r5   r!   r!   r"   Úsession‚   s   
zChannel.sessionc              	   C  sÖ   | j  | j¡ | jj|k¡ ¡ }|sit�M | j  | j¡ | jj|k¡ ¡ }|r0|W  d   ƒ S |  |¡}| j  |¡ z| j  ¡  W n t	yP   | j  
¡  Y n	w W d   ƒ |S W d   ƒ |S 1 sdw   Y  |S r   )r9   Úqueryr(   ÚfilterÚnameÚfirstr2   ÚaddÚcommitr   Úrollback©r   ÚqueueÚobjr!   r!   r"   Ú_get_or_create‰   s4   ÿÿú
ÿÿ
õþ
óñzChannel._get_or_createc                 K  s   |   |¡ d S r   )rD   )r   rB   r   r!   r!   r"   Ú
_new_queuež   ó   zChannel._new_queuec                 K  sV   |   |¡}|  t|ƒ|¡}| j |¡ z| j ¡  W d S  ty*   | j ¡  Y d S w r   )rD   r)   r   r9   r>   r?   r   r@   )r   rB   Úpayloadr   rC   Úmessager!   r!   r"   Ú_put¡   s   
ÿzChannel._putc                 C  s®   |   |¡}| jjjdkr| j tdƒ¡ z<| j | j¡ ¡  	| jj
|jk¡ 	| jjdk¡ | jj¡ | jj¡ d¡ ¡ }|rNd|_tt|jƒƒW | j ¡  S tƒ ‚| j ¡  w )NÚsqlitezBEGIN IMMEDIATE TRANSACTIONFr   )rD   r9   r0   r<   Úexecuter   r:   r)   Úwith_for_updater;   Úqueue_idÚidÚvisibleÚorder_byÚsent_atÚlimitr=   r   r   rG   r?   r   )r   rB   rC   Úmsgr!   r!   r"   Ú_getª   s&   


ùþzChannel._getc                 C  s(   |   |¡}| j | j¡ | jj|jk¡S r   )rD   r9   r:   r)   r;   rM   rN   rA   r!   r!   r"   Ú
_query_all¾   s   
ÿzChannel._query_allc                 C  sB   |   |¡jdd�}z| j ¡  W |S  ty    | j ¡  Y |S w )NF)Úsynchronize_session)rU   Údeleter9   r?   r   r@   )r   rB   Úcountr!   r!   r"   Ú_purgeÃ   s   þþzChannel._purgec                 C  s   |   |¡ ¡ S r   )rU   rX   )r   rB   r!   r!   r"   Ú_sizeË   rF   zChannel._sizec                 C  sf   |t vr/t�! |t v rt | W  d   ƒ S tt|ƒ|tf|ƒW  d   ƒ S 1 s*w   Y  t | S r   )r   r2   ÚtypeÚstrr   )r   r<   ÚbaseÚnsr!   r!   r"   Ú_declarative_clsÎ   s   ü úzChannel._declarative_clsc                 C  ó   |   dtd| ji¡S )Nr   Ú__tablename__)r_   Ú	QueueBaser#   ©r   r!   r!   r"   r(   Ú   ó
   ýzChannel.queue_clsc                 C  r`   )Nr   ra   )r_   ÚMessageBaser%   rc   r!   r!   r"   r)   â   rd   zChannel.message_cls)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r7   r1   r   r   r/   r6   Úpropertyr9   rD   rE   rI   rT   rU   rY   rZ   r_   r   r(   r)   Ú__classcell__r!   r!   r   r"   r   V   s,    
	
r   c                   @  s2   e Zd ZdZeZdZdZdZdZe	fZ
dd„ ZdS )	Ú	TransportzThe transport class.Tr   ÚsqlÚ
sqlalchemyc                 C  s   dd l }|jS )Nr   )rn   Ú__version__)r   rn   r!   r!   r"   Údriver_versionö   s   zTransport.driver_versionN)rf   rg   rh   ri   r   Úcan_parse_urlÚdefault_portÚdriver_typeÚdriver_namer   Úconnection_errorsrp   r!   r!   r!   r"   rl   ë   s    rl   )'ri   Ú
__future__r   Ú	threadingÚjsonr   r   rB   r   rn   r   r   Úsqlalchemy.excr   Úsqlalchemy.ormr	   Úkombu.transportr
   Úkombu.utilsr   Úkombu.utils.encodingr   Úmodelsr   re   r   r   rb   r   r   ÚVERSIONÚjoinÚmapr\   ro   ÚRLockr2   r   rl   r!   r!   r!   r"   Ú<module>   s*    5	 