
    ^f(                        d Z ddlmZ ddlZddlZddlZddl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dlmZmZ ddlmZ dZd                     eee                    Zej         dk    r2ddl!Z!ddl"Z"ddl#Z#e"j$        Z%dZ&e"j'        Z( e!j)                    Z*d Z+d Z,n)ej         dk    rddl-Z-ddl-m%Z%m&Z& d Z+d Z,n e.d           edg d          Z/ G d dej0                  Z0 G d dej1                  Z1dS )a	  File-system Transport module for kombu.

Transport using the file-system as the message store. Messages written to the
queue are stored in `data_folder_in` directory and
messages read from the queue are read from `data_folder_out` directory. Both
directories must be created manually. Simple example:

* Producer:

.. code-block:: python

    import kombu

    conn = kombu.Connection(
        'filesystem://', transport_options={
            'data_folder_in': 'data_in', 'data_folder_out': 'data_out'
        }
    )
    conn.connect()

    test_queue = kombu.Queue('test', routing_key='test')

    with conn as conn:
        with conn.default_channel as channel:
            producer = kombu.Producer(channel)
            producer.publish(
                        {'hello': 'world'},
                        retry=True,
                        exchange=test_queue.exchange,
                        routing_key=test_queue.routing_key,
                        declare=[test_queue],
                        serializer='pickle'
            )

* Consumer:

.. code-block:: python

    import kombu

    conn = kombu.Connection(
        'filesystem://', transport_options={
            'data_folder_in': 'data_out', 'data_folder_out': 'data_in'
        }
    )
    conn.connect()

    def callback(body, message):
        print(body, message)
        message.ack()

    test_queue = kombu.Queue('test', routing_key='test')

    with conn as conn:
        with conn.default_channel as channel:
            consumer = kombu.Consumer(
                conn, [test_queue], accept=['pickle']
            )
            consumer.register_callback(callback)
            with consumer:
                conn.drain_events(timeout=1)

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

Connection String
=================
Connection string is in the following format:

.. code-block::

    filesystem://

Transport Options
=================
* ``data_folder_in`` - directory where are messages stored when written
  to queue.
* ``data_folder_out`` - directory from which are messages read when read from
  queue.
* ``store_processed`` - if set to True, all processed messages are backed up to
  ``processed_folder``.
* ``processed_folder`` - directory where are backed up processed files.
* ``control_folder`` - directory where are exchange-queue table stored.
    )annotationsN)
namedtuple)Path)Empty)	monotonic)ChannelError)virtual)bytes_to_strstr_to_bytes)dumpsloads)cached_property)   r   r   .ntc                    t          j        |                                           }t          j        ||ddt                     dS )Create file lock.r         N)	win32file_get_osfhandlefileno
LockFileEx__overlapped)fileflagshfiles      L/var/www/html/env/lib/python3.11/site-packages/kombu/transport/filesystem.pylockr   }   s9    (77UE1j,GGGGG    c                    t          j        |                                           }t          j        |ddt                     dS )Remove file lock.r   r   N)r   r   r   UnlockFileExr   )r   r   s     r   unlockr#      s7    (77ua\BBBBBr   posix)LOCK_EXLOCK_SHc                T    t          j        |                                 |           dS )r   N)fcntlflockr   )r   r   s     r   r   r      s"    DKKMM5)))))r   c                h    t          j        |                                 t           j                   dS )r!   N)r(   r)   r   LOCK_UN)r   s    r   r#   r#      s$    DKKMM5=11111r   z9Filesystem plugin only defined for NT and POSIX platformsexchange_queue_t)routing_keypatternqueuec                      e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zed
             Zed             Zed             Zed             Zed             Zed             ZdS )ChannelzFilesystem Channel.Tc                   | j         | dz  }	 |                    d          }	 t          |t                     t	          t          |                                                    }d |D             t          |           |                                 S # t          |           |                                 w xY w# t          $ r g cY S t          $ r t          d|           w xY w)N	.exchangerc                     g | ]}t          | S  r,   .0qs     r   
<listcomp>z%Channel.get_table.<locals>.<listcomp>   s    EEE(!,EEEr   zCannot open )control_folderopenr   r&   r   r
   readr#   closeFileNotFoundErrorOSErrorr   )selfexchanger   f_objexchange_tables        r   	get_tablezChannel.get_table   s    "%;%;%;;	6IIcNNEUG$$$!&|EJJLL'A'A!B!BEEnEEEu u  	 	 	III 	6 	6 	64d44555	6s)   B? AB 3#B? %B<<B? ?C)C)c                   | j         | dz  }| j                             d           t          |pd|pd|pd          }	 |                                r|                    dd          }t          |t                     t          t          |	                                                    }d |D             }	||	vrZ|	
                    d|           |                    d           |                    t          t          |	                               n^|                    d	d          }t          |t                     |g}	|                    t          t          |	                               t          |           |                                 d S # t          |           |                                 w xY w)
Nr3   T)exist_ok zrb+r   	bufferingc                     g | ]}t          | S r6   r7   r8   s     r   r;   z'Channel._queue_bind.<locals>.<listcomp>   s    GGG1*A.GGGr   wb)r<   mkdirr,   existsr=   r   r%   r   r
   r>   insertseekwriter   r   r#   r?   )
rB   rC   r-   r.   r/   r   	queue_valrD   rE   queuess
             r   _queue_bindzChannel._queue_bind   s   "%;%;%;;!!4!000$[%6B2%*[b2 2		{{}} 9		%1	55UG$$$!&|EJJLL'A'A!B!BGGGGGF**MM!Y///JJqMMMKKU6]] ; ;<<<		$!	44UG$$$#Lv778885MMMKKMMMMM 5MMMKKMMMMs   D7F %Gc                ^    |                      |          D ]} | j        |j        |fi | d S N)rF   _putr/   )rB   rC   payloadr-   kwargsr:   s         r   _put_fanoutzChannel._put_fanout   sH    )) 	2 	2ADIagw11&1111	2 	2r   c                |   d                     t          t          t                      dz                      t	          j                    |          }t          j                            | j	        |          }	 t          |dd          }t          |t                     |                    t          t          |                               n!# t           $ r t#          d|d          w xY w	 t%          |           |                                 dS # t%          |           |                                 w xY w)	zPut `message` onto `queue`.z{}_{}.{}.msgi  rM   r   rJ   zCannot add file z to directoryN)formatintroundr   uuiduuid4ospathjoindata_folder_outr=   r   r%   rR   r   r   rA   r   r#   r?   )rB   r/   rY   rZ   filenamefs         r   rX   zChannel._put   s   !((U9;;3E-F-F)G)G)-u> >7<< 4h??		Xtq111AGGGLw001111 	> 	> 	><8<<<> > >	> 2
 1IIIGGIIIII 1IIIGGIIIIs   8AC D C--D %D;c                @   d|z   dz   }t          j        | j                  }t          |          }t	          |          dk    rM|                    d          }|                    |          dk     rC| j        r| j        }nt          j
                    }	 t          j        t           j                            | j        |          |           n# t          $ r Y w xY wt           j                            ||          }	 t!          |d          }|                                }|                                 | j        st          j        |           n!# t          $ r t)          d|d          w xY wt+          t-          |                    S t/                      )zGet next message from `queue`.r   .msgr   rbzCannot read file z from queue.)rb   listdirdata_folder_insortedlenpopfindstore_processedprocessed_foldertempfile
gettempdirshutilmoverc   rd   rA   r=   r>   r?   remover   r   r
   r   )rB   r/   
queue_findfolderrf   rr   rg   rY   s           r   _getzChannel._get   s   5[6)
D/00&kkAoozz!}}H }}Z((1,,# 9#'#8  #+#6#8#8 BGLL)<hGG,. . . .    w||$4h??HB4((&&((			+ (Ih''' B B B"@@@@B B BB g..///ggs   8C 
CCAE E3c                   d}d|z   dz   }t          j        | j                  }t          |          dk    r|                                }	 |                    |          dk     rBt           j                            | j        |          }t          j        |           |dz  }n# t          $ r Y nw xY wt          |          dk    |S )z!Remove all messages from `queue`.r   r   ri   r   )
rb   rk   rl   rn   ro   rp   rc   rd   rw   rA   rB   r/   countrx   ry   rf   s         r   _purgezChannel._purge	  s    5[6)
D/00&kkAoozz||H==,,q007<<(;XFF	(###
     &kkAoo" s   B% &>B% %
B21B2c                    d}d| d}t          j        | j                  }t          |          dk    rF|                                }|                    |          dk     rA|dz  }t          |          dk    F|S )z<Return the number of messages in `queue` as an :class:`int`.r   r   ri   r   )rb   rk   rl   rn   ro   rp   r|   s         r   _sizezChannel._size"  s    $___
D/00&kkAoozz||H }}Z((1,,QJE &kkAoo r   c                $    | j         j        j        S rW   )
connectionclienttransport_optionsrB   s    r   r   zChannel.transport_options3  s    %77r   c                8    | j                             dd          S )Nrl   data_inr   getr   s    r   rl   zChannel.data_folder_in7  s    %))*:IFFFr   c                8    | j                             dd          S )Nre   data_outr   r   s    r   re   zChannel.data_folder_out;  s    %))*;ZHHHr   c                8    | j                             dd          S )Nrq   Fr   r   s    r   rq   zChannel.store_processed?  s    %))*;UCCCr   c                8    | j                             dd          S )Nrr   	processedr   r   s    r   rr   zChannel.processed_folderC  s    %))*<kJJJr   c                R    t          | j                            dd                    S )Nr<   control)r   r   r   r   s    r   r<   zChannel.control_folderG  s$    D*../?KKLLLr   N)__name__
__module____qualname____doc__supports_fanoutrF   rU   r[   rX   rz   r~   r   propertyr   r   rl   re   rq   rr   r<   r6   r   r   r1   r1      s<       O6 6 6   02 2 2  "& & &P  2  " 8 8 X8 G G _G I I _I D D _D K K _K M M XM M Mr   r1   c                       e Zd ZdZej        j                            d eg d                    Ze	Z	 ej
                    ZdZdZdZ fdZd Z xZS )		TransportzFilesystem Transport.F)directtopicfanout)asynchronousexchange_typer   
filesystemc                T     t                      j        |fi | | j        | _        d S rW   )super__init__global_statestate)rB   r   rZ   	__class__s      r   r   zTransport.__init__[  s0    **6***&


r   c                    dS )NzN/Ar6   r   s    r   driver_versionzTransport.driver_version_  s    ur   )r   r   r   r   r	   r   
implementsextend	frozensetr1   BrokerStater   default_portdriver_typedriver_namer   r   __classcell__)r   s   @r   r   r   L  s        "-44i = = =>> 5  J
 G&7&((LLKK' ' ' ' '      r   r   )2r   
__future__r   rb   ru   rs   r`   collectionsr   pathlibr   r/   r   timer   kombu.exceptionsr   kombu.transportr	   kombu.utils.encodingr
   r   kombu.utils.jsonr   r   kombu.utils.objectsr   VERSIONrd   mapstr__version__name
pywintypeswin32conr   LOCKFILE_EXCLUSIVE_LOCKr%   r&   LOCKFILE_FAIL_IMMEDIATELYLOCK_NB
OVERLAPPEDr   r   r#   r(   RuntimeErrorr,   r1   r   r6   r   r   <module>r      s  Y Yv # " " " " " 				    " " " " " "                   ) ) ) ) ) ) # # # # # # ; ; ; ; ; ; ; ; ) ) ) ) ) ) ) ) / / / / / /
hhss3(()) 7d??OOO.GG0G(:(**LH H H
C C C C WLLL&&&&&&&&* * *2 2 2 2 ,CE E E :0AAAC C jM jM jM jM jMgo jM jM jMZ    !     r   