
    ^f                    f   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j#                    Z$ G d dej%                  Z% G 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                       e Zd ZdZdZi Z fdZd Zd Zd Z	e
d             Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zed             Zed             Z xZS )ChannelzThe channel class.Nc                z    |                      |j        j                    t                      j        |fi | d S N)_configure_entity_tablenamesclienttransport_optionssuper__init__)self
connectionkwargs	__class__s      U/var/www/html/env/lib/python3.11/site-packages/kombu/transport/sqlalchemy/__init__.pyr   zChannel.__init__\   sB    ))**;*MNNN..v.....    c                    |                     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   optss     r#   r   z$Channel._configure_entity_tablenames`   sQ    #xx(9=II!%*=!O!O 	+4+++++++r$   c                    | j         j        }|j                                        }|                    dd            |                    dd            t          |j        fi |S )Nr&   r(   )r    r   r   copypopr   hostname)r   conninfor   s      r#   _engine_from_configzChannel._engine_from_configk   si    ?)$6;;==/66614888X.DD2CDDDr$   c                   | j         j        }|j        | j        vrt          5  |j        | j        v r| j        |j                 cd d d            S |                                 }t          |          }t          j        |           ||f| j        |j        <   d d d            n# 1 swxY w Y   | j        |j                 S )N)bind)	r    r   r1   _engines_MUTEXr3   r
   r   
create_all)r   r2   engineSessions       r#   _openzChannel._openr   s0   ?)DM11 	C 	C$55  =):;		C 	C 	C 	C 	C 	C 	C 	C 1133&F333#F+++397?h/0	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C }X.//s    B$A	B$$B(+B(c                j    | j         &|                                 \  }} |            | _         | j         S r   )_sessionr;   )r   _r:   s      r#   sessionzChannel.session   s0    = JAw#GIIDM}r$   c                   | j                             | j                                      | j        j        |k                                              }|st          5  | j                             | j                                      | j        j        |k                                              }|r|cd d d            S |                     |          }| j                             |           	 | j                                          n)# t          $ r | j         
                                 Y nw xY wd d d            n# 1 swxY w Y   |S r   )r?   queryr+   filternamefirstr7   addcommitr	   rollbackr   queueobjs      r#   _get_or_createzChannel._get_or_create   s   l  00VDN'5011%%'' 	 	, , ,l((88VDN/5899%%''   , , , , , , , , nnU++  %%%,L''))))' , , ,L))+++++,, , , , , , , , , , , , , , , 
s=   AD>?/D>/D	D>	#D/,D>.D//D>>EEc                0    |                      |           d S r   )rK   )r   rI   r!   s      r#   
_new_queuezChannel._new_queue   s    E"""""r$   c                2   |                      |          }|                     t          |          |          }| j                            |           	 | j                                         d S # t          $ r | j                                         Y d S w xY wr   )rK   r,   r   r?   rE   rF   r	   rG   )r   rI   payloadr!   rJ   messages         r#   _putzChannel._put   s    !!%((""5>>377!!!	$L!!!!! 	$ 	$ 	$L!!######	$s   A/ /#BBc                2   |                      |          }| j        j        j        dk    r'| j                            t          d                     	 | j                            | j                                                  	                    | j        j
        |j        k              	                    | j        j        dk                                  | j        j                                      | j        j                                      d                                          }|rAd|_        t#          t%          |j                            | j                                         S t+                      # | j                                         w xY w)NsqlitezBEGIN IMMEDIATE TRANSACTIONFr   )rK   r?   r5   rC   executer   rA   r,   with_for_updaterB   queue_ididvisibleorder_bysent_atlimitrD   r   r   rO   rF   r   )r   rI   rJ   msgs       r#   _getzChannel._get   sC   !!%((<!X--L  &C!D!DEEE	",$$T%566 ""(1SV;<<(0E9::$*233$*-..q   8#\#+6677 L!!!! ''ML!!!!s   D E; -E; ;Fc                    |                      |          }| j                            | j                                      | j        j        |j        k              S r   )rK   r?   rA   r,   rB   rV   rW   rH   s      r#   
_query_allzChannel._query_all   sJ    !!%((|!!$"233VD$-788	9r$   c                    |                      |                              d          }	 | j                                         n)# t          $ r | j                                         Y nw xY w|S )NF)synchronize_session)r_   deleter?   rF   r	   rG   )r   rI   counts      r#   _purgezChannel._purge   sz    &&--%-HH	$L!!!! 	$ 	$ 	$L!!#####	$s   A #A+*A+c                P    |                      |                                          S r   )r_   rc   )r   rI   s     r#   _sizezChannel._size   s     u%%++---r$   c                    |t           vrft          5  |t           v rt           |         cd d d            S t          t          |          |t          f|          cd d d            S # 1 swxY w Y   t           |         S r   )r   r7   typestrr   )r   rC   basenss       r#   _declarative_clszChannel._declarative_cls   s    ~%% > >>)) *$/	> > > > > > > > CIIi'8"==> > > > > > > > > > > > > > > > d##s   A%$A%%A),A)c                H    |                      dt          d| j        i          S )Nr   __tablename__)rl   	QueueBaser&   r   s    r#   r+   zChannel.queue_cls   s+    $$d23
 
 	
r$   c                H    |                      dt          d| j        i          S )Nr   rn   )rl   MessageBaser(   rp   s    r#   r,   zChannel.message_cls   s+    $$d45
 
 	
r$   )__name__
__module____qualname____doc__r=   r6   r   r   r3   r;   propertyr?   rK   rM   rQ   r]   r_   rd   rf   rl   r   r+   r,   __classcell__)r"   s   @r#   r   r   V   sA       HH/ / / / /	, 	, 	,E E E0 0 0    X  *# # #$ $ $" " "(9 9 9
  . . .
$ 
$ 
$ 
 
 _
 
 
 _
 
 
 
 
r$   r   c                  2    e Zd ZdZeZdZdZdZdZe	fZ
d ZdS )	TransportzThe transport class.Tr   sql
sqlalchemyc                    dd l }|j        S )Nr   )r|   __version__)r   r|   s     r#   driver_versionzTransport.driver_version   s    %%r$   N)rs   rt   ru   rv   r   can_parse_urldefault_portdriver_typedriver_namer	   connection_errorsr    r$   r#   rz   rz      sK        GMLKK),& & & & &r$   rz   )'rv   
__future__r   	threadingjsonr   r   rI   r   r|   r   r   sqlalchemy.excr	   sqlalchemy.ormr
   kombu.transportr   kombu.utilsr   kombu.utils.encodingr   modelsr   rr   r   r   ro   r   r   VERSIONjoinmapri   r~   RLockr7   r   rz   r   r$   r#   <module>r      s  4 4j # " " " " "                   * * * * * * * * + + + + + + ' ' ' ' ' ' # # # # # # ' ' ' ' ' ' - - - - - - * * * * * *       & & & & & & , , , , , , , , hhss3(())			R
 R
 R
 R
 R
go R
 R
 R
j& & & & &! & & & & &r$   