o
    h"                     @   sT   d dl Z d dlZd dlZd dlmZ d dlmZmZ G dd dZG dd dZ	dS )    N)BytesIO)SetUnionc                   @   s   e Zd Zedd Zedd Zedd Zedefdd	Zd
d Z	dd Z
dd Zd,defddZdd Zdd Zdd Zdd Zedd Zdd Zedefd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ ZdS )-Gtidc                 C   s    | d |d k o| d |d kS Nr       i1i2r   r   [/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/asyncmy/replication/gtid.pyoverlap	       zGtid.overlapc                 C   s    |d | d ko|d | d kS r   r   r	   r   r   r   contains   r   zGtid.containsc                 C   sJ   t d| }|std| f t|d}t|dp|}||d fS )z
        We parse a human-generated string here. So our end value b
        is incremented to conform to the internal representation format.
        z^([0-9]+)(?:-([0-9]+))?$GTID format is incorrect: %rr      )research
ValueErrorintgroup)intervalmabr   r   r   parse_interval   s   zGtid.parse_intervalgtidc                 C   sV   t d| }|std| f |d}|d}dd |ddd  D }||fS )NzG^([0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12})((?::[0-9-]+)+)$r   r   r   c                 S   s   g | ]}t |qS r   )r   r   .0xr   r   r   
<listcomp>*   s    zGtid.parse.<locals>.<listcomp>:)r   r   r   r   split)r   r   sid	intervalsintervals_parsedr   r   r   parse   s   

z
Gtid.parsec                    s   g } d  d krt d f t fddjD r%t d f tjD ])} d |d kr=|d  d f q* d |d krN d |d f q*|| q*t| g _dS )zr
        Use the internal representation format and add it
        to our intervals, merging if required.
        r   r   Malformed interval %sc                 3       | ]	} | V  qd S Nr   r   itvlselfr   r   	<genexpr>8       z%Gtid._add_interval.<locals>.<genexpr>zOverlapping interval %sN)	Exceptionanyr$   sortedappendr-   r,   newexistingr   r+   r   _add_interval.   s   zGtid._add_intervalc                    s   g } d  d krt d f t fddjD s dS tjD ]4}| rT|d  d k r@||d  d f |d  d krS| d |d f q%|| q%|_dS )z5Using the internal representation, remove an intervalr   r   r'   c                 3   r(   r)   r*   r   r+   r   r   r.   P   r/   z&Gtid.__sub_interval.<locals>.<genexpr>N)r0   r1   r$   r2   r   r3   r4   r   r+   r   __sub_intervalI   s   
zGtid.__sub_intervalc                    s(   |j  j krdS t fdd|jD S )NFc                 3   s*    | ] t  fd djD V  qdS )c                 3   s    | ]	}  |V  qd S r)   )r   )r   me)r-   themr   r   r.   e   r/   z.Gtid.__contains__.<locals>.<genexpr>.<genexpr>N)r1   r$   )r   r-   )r:   r   r.   d   s    
z$Gtid.__contains__.<locals>.<genexpr>)r#   allr$   r-   otherr   r;   r   __contains__`   s
   zGtid.__contains__Nc                 C   sH   |d u rg }|r|}nt |\}}|| _g | _|D ]}| | qd S r)   )r   r&   r#   r$   r7   )r-   r   r#   r$   r,   r   r   r   __init__h   s   zGtid.__init__c                 C   sF   | j |j krtd| j |j f tt| }|jD ]}|| q|S )z]Include the transactions of this gtid. Raise if the
        attempted merge has different SIDz&Attempt to merge different SID%s != %s)r#   r0   r   strr$   r7   r-   r>   resultr,   r   r   r   __add__u   s   
zGtid.__add__c                 C   s6   t t| }| j|jkr|S |jD ]}|| q|S )zFRemove intervals. Do not raise, if different SID simply
        ignore)r   rA   r#   r$   _Gtid__sub_intervalrB   r   r   r   __sub__   s   
zGtid.__sub__c                 C   s    d| j ddd | jD f S )zvWe represent the human value here - a single number
        for one transaction, or a closed interval (decrementing b)%s:%sr!   c                 s   sH    | ]}|d  d |d krd|d  |d d f nt |d  V  qdS )r   r   %d-%dNrA   r   r   r   r   r.      s
    6
zGtid.__str__.<locals>.<genexpr>)r#   joinr$   r;   r   r   r   __str__   s   
zGtid.__str__c                 C   s   d|  S )Nz<Gtid "%s">r   r;   r   r   r   __repr__   s   zGtid.__repr__c                 C   s   ddt | j  S )N      )lenr$   r;   r   r   r   encoded_length   s   zGtid.encoded_lengthc                 C   sj   d}|t | jdd7 }|tdt| j7 }| jD ]}|td|d 7 }|td|d 7 }q|S )N    - <Qr   r   )binascii	unhexlifyr#   replacestructpackrO   r$   )r-   bufferr   r   r   r   encode   s   
zGtid.encodepayloadc                 C   s   d}|t |d }|d }|t |d }|d }|t |d }|d }|t |d }|d }|t |d }td|d\}g }td|D ]}td	|d
\}}|||d f qU| d|dddd |D f S )NrQ         -r      rT      r   z<QQrN   r   rG   asciir!   c                 S   s   g | ]}d | qS )rH   r   r   r   r   r   r       s    zGtid.decode.<locals>.<listcomp>)	rU   hexlifyreadrX   unpackranger3   decoderJ   )clsr\   r#   n_intervalsr$   istartendr   r   r   rf      s,   zGtid.decodec                 C   s   |j | j krdS | j|jkS )NFr#   r$   r=   r   r   r   __eq__   s   zGtid.__eq__c                 C   s$   |j | j kr| j |j k S | j|jk S r)   rl   r=   r   r   r   __lt__      zGtid.__lt__c                 C   s$   |j | j kr| j |j kS | j|jkS r)   rl   r=   r   r   r   __le__   ro   zGtid.__le__c                 C   s$   |j | j kr| j |j kS | j|jkS r)   rl   r=   r   r   r   __gt__   ro   zGtid.__gt__c                 C   s$   |j | j kr| j |j kS | j|jkS r)   rl   r=   r   r   r   __ge__   ro   zGtid.__ge__)NN)__name__
__module____qualname__staticmethodr   r   r   rA   r&   r7   rE   r?   r@   rD   rF   rK   rL   propertyrP   r[   classmethodr   rf   rm   rn   rp   rq   rr   r   r   r   r   r      s6    



	r   c                   @   s   e Zd Zdee fddZdefddZdeed f fdd	Zdeed f fd
dZ	dd Z
dd Zedd Zdd ZeZedefddZdddZdS )GtidSetgtid_setc                 C   s
   || _ d S r)   	_gtid_set)r-   rz   r   r   r   r@         
zGtidSet.__init__r   c                 C   s`   t  }| jD ]}|j|jkr|||  q|| q|jdd |D vr+|| || _d S )Nc                 s       | ]}|j V  qd S r)   )r#   r   r   r   r   r.          z%GtidSet.merge_gtid.<locals>.<genexpr>)setr|   r#   add)r-   r   new_gtid_setr6   r   r   r   
merge_gtid   s   


zGtidSet.merge_gtidr>   c                    sH   t  trtfdd jD S t  tr"t fddjD S t)Nc                 3   s    | ]}| j v V  qd S r)   r{   )r   
other_gtidr;   r   r   r.          z'GtidSet.__contains__.<locals>.<genexpr>c                 3   s    | ]} |v V  qd S r)   r   r   )r>   r   r   r.          )
isinstancery   r<   r|   r   r1   NotImplementedErrorr=   r   )r>   r-   r   r?      s
   

zGtidSet.__contains__c                 C   sT   t |trt| j}|| |S t |tr(t| j}|jD ]}|| q|S tr)   )r   r   ry   r|   r   r   )r-   r>   r5   r   r   r   r   rD      s   





zGtidSet.__add__c                 C   s   d dd | jD S )N,c                 s   s    | ]}t |V  qd S r)   rI   r   r   r   r   r.     r   z"GtidSet.__str__.<locals>.<genexpr>)rJ   r|   r;   r   r   r   rK     s   zGtidSet.__str__c                 C   s
   d| j  S )Nz<GtidSet %r>r{   r;   r   r   r   rL     r}   zGtidSet.__repr__c                 C   s   dt dd | jD  S )Nr`   c                 s   r~   r)   )rP   r   r   r   r   r.     r   z)GtidSet.encoded_length.<locals>.<genexpr>)sumr|   r;   r   r   r   rP     s   zGtidSet.encoded_lengthc                 C   s,   dt dt| jddd | jD   S )NrQ   rT   c                 s   s    | ]}|  V  qd S r)   )r[   r   r   r   r   r.     r   z"GtidSet.encoded.<locals>.<genexpr>)rX   rY   rO   r|   rJ   r;   r   r   r   encoded  s   &zGtidSet.encodedr\   c                    s4   t d d\}| t fddtd|D S )NrT   r`   c                 3   s    | ]}t  V  qd S r)   )r   rf   )r   _r\   r   r   r.   "  r   z!GtidSet.decode.<locals>.<genexpr>r   )rX   rd   rc   r   re   )rg   r\   n_sidr   r   r   rf     s    zGtidSet.decodec                 C   s   | j |j kS r)   r{   r=   r   r   r   rm   $  s   zGtidSet.__eq__N)r>   ry   )rs   rt   ru   r   r   r@   r   r   r?   rD   rK   rL   rw   rP   r   r[   rx   r   rf   rm   r   r   r   r   ry      s    
ry   )
rU   r   rX   ior   typingr   r   r   ry   r   r   r   r   <module>   s     c