
    h~                    b   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j?                   e e!e            Z" ejF                         Z$ G d dejJ                        Z% G d dejL                        Z&y)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                p    | j                  |j                  j                         t        |   |fi | y N)_configure_entity_tablenamesclienttransport_optionssuper__init__)self
connectionkwargs	__class__s      _/var/www/Befach/backend/env/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__init__.pyr   zChannel.__init__\   s/    ))**;*;*M*MN.v.    c                    |j                  dd      | _        |j                  dd      | _        | j                  xr | j                   y  y )Nqueue_tablenamekombu_queuemessage_tablenamekombu_message)getr&   r(   	queue_clsmessage_cls)r   optss     r#   r   z$Channel._configure_entity_tablenames`   sA    #xx(9=I!%*=!O 	+4+++r$   c                   | j                   j                  }|j                  j                         }|j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        |j	                  dd        |j	                  d	d        t        |j                  fi |S )
Nr&   r(   callbackerrbackmax_retriesinterval_startinterval_stepinterval_maxretry_errors)r    r   r   copypopr   hostname)r   conninfor   s      r#   _engine_from_configzChannel._engine_from_configk   s    ??))$66;;=/6148j$/i.mT2.5ot4nd3nd3X..D2CDDr$   c                   | j                   j                  }|j                  | j                  vrt        5  |j                  | j                  v r"| j                  |j                     cd d d        S | j                         }t        |      }t        j                  |       ||f| j                  |j                  <   d d d        | j                  |j                     S # 1 sw Y   "xY w)N)bind)	r    r   r8   _engines_MUTEXr:   r
   r   
create_all)r   r9   engineSessions       r#   _openzChannel._openz   s    ??))DMM1 	C$$5  ==):):;		C 	C 113&F3##F+397?h//0	C }}X..//	C 	Cs   1C0ACC&c                p    | j                   | j                         \  }} |       | _         | j                   S r   )_sessionrB   )r   _rA   s      r#   sessionzChannel.session   s.    == JAw#IDM}}r$   c                   | j                   j                  | j                        j                  | j                  j                  |k(        j                         }|st        5  | j                   j                  | j                        j                  | j                  j                  |k(        j                         }|r|cd d d        S | j                  |      }| j                   j                  |       	 | j                   j                          d d d        |S |S # t        $ r | j                   j                          Y 1w xY w# 1 sw Y   |S xY wr   )rF   queryr+   filternamefirstr>   addcommitr	   rollbackr   queueobjs      r#   _get_or_createzChannel._get_or_create   s   ll  0VDNN''501%%' 	 ,ll((8VDNN//589%%'  , , nnU+  %,LL''), 
s
 ( ,LL))+,, 
s1   "AE	,E6D#E?EEEEc                &    | j                  |       y r   )rR   )r   rP   r!   s      r#   
_new_queuezChannel._new_queue   s    E"r$   c                   | j                  |      }| j                  t        |      |      }| j                  j	                  |       	 | j                  j                          y # t        $ r | j                  j                          Y y w xY wr   )rR   r,   r   rF   rL   rM   r	   rN   )r   rP   payloadr!   rQ   messages         r#   _putzChannel._put   sn    !!%(""5>37!	$LL! 	$LL!!#	$s   	A$ $#B
	B
c                `   | j                  |      }| j                  j                  j                  dk(  r$| j                  j	                  t        d             	 | j                  j                  | j                        j                         j                  | j                  j                  |j                  k(        j                  | j                  j                  dk7        j                  | j                  j                        j                  | j                  j                        j                  d      j!                         }|r?d|_        t#        t%        |j&                              | j                  j)                          S t+               # | j                  j)                          w xY w)NsqlitezBEGIN IMMEDIATE TRANSACTIONFr   )rR   rF   r<   rJ   executer   rH   r,   with_for_updaterI   queue_ididvisibleorder_bysent_atlimitrK   r   r   rV   rM   r   )r   rP   rQ   msgs       r#   _getzChannel._get   s,   !!%(<<!!X-LL  &C!DE	",,$$T%5%56 "((11SVV;<((00E9:$**223$**--.q  #\#++67 LL! 'MLL!s   DF 
F F-c                    | j                  |      }| j                  j                  | j                        j	                  | j                  j
                  |j                  k(        S r   )rR   rF   rH   r,   rI   r]   r^   rO   s      r#   
_query_allzChannel._query_all   sN    !!%(||!!$"2"23VD$$--78	9r$   c                    | j                  |      j                  d      }	 | j                  j                          |S # t        $ r | j                  j                          Y |S w xY w)NF)synchronize_session)rf   deleterF   rM   r	   rN   )r   rP   counts      r#   _purgezChannel._purge   s`    &--%-H	$LL!    	$LL!!#	$s   ? #A&%A&c                @    | j                  |      j                         S r   )rf   rj   )r   rP   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 t         |   S # 1 sw Y   t         |   S xY wr   )r   r>   typestrr   )r   rJ   basenss       r#   _declarative_clszChannel._declarative_cls   so    ~% >>) *$/	> > CIi'8"=> > d##> d##s   AAA)c                H    | j                  dt        d| j                  i      S )Nr   __tablename__)rs   	QueueBaser&   r   s    r#   r+   zChannel.queue_cls   s)    $$d223
 	
r$   c                H    | j                  dt        d| j                  i      S )Nr   ru   )rs   MessageBaser(   rw   s    r#   r,   zChannel.message_cls   s)    $$d445
 	
r$   )__name__
__module____qualname____doc__rD   r=   r   r   r:   rB   propertyrF   rR   rT   rX   rd   rf   rk   rm   rs   r   r+   r,   __classcell__)r"   s   @r#   r   r   V   s    HH/	,E0   *#$"(9
.
$ 
 
 
 
r$   r   c                  0    e Zd ZdZeZdZdZdZdZe	fZ
d Zy)	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)rz   r{   r|   r}   r   can_parse_urldefault_portdriver_typedriver_namer	   connection_errorsr    r$   r#   r   r      s,    GMLKK),&r$   r   )'r}   
__future__r   	threadingjsonr   r   rP   r   r   r   r   sqlalchemy.excr	   sqlalchemy.ormr
   kombu.transportr   kombu.utilsr   kombu.utils.encodingr   modelsr   ry   r   r   rv   r   r   VERSIONjoinmaprp   r   RLockr>   r   r   r   r$   r#   <module>r      s   4j #    * + ' # ' - *  & , hhs3()		Z
goo Z
z&!! &r$   