o
    h?Y                     @   s@  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( dd	l)m*Z* dd
l+m,Z, ddl-m.Z. G dd de*Z/G dd de/Z0G dd de/Z1G dd de/Z2G dd de*Z3dS )    N)charset_by_name)BITBLOBDATEDATETIMEDOUBLEENUMFLOATGEOMETRYINT24JSONLONGLONGLONG
NEWDECIMALSETSHORTSTRINGTIME	TIMESTAMPTINYVARCHARYEAR   )	bit_countbit_get)Column)	DATETIME2DELETE_ROWS_EVENT_V2TIME2
TIMESTAMP2UPDATE_ROWS_EVENT_V2WRITE_ROWS_EVENT_V2)TableMetadataUnavailableError)BinLogEvent)Table)byte2intc                       s   e Zd Z fddZe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dd  Zed!d" Z  ZS )#	RowsEventc                    s  t t| j||||fi | d | _|d | _|d | _|d | _|d | _|  | _	z|| j	 j
d | _| j| j	 j| _| j| j	 j| _W n tyS   d| _Y d S w | j d| j }| jd url|| jvrld| _d S | jd ur{|| jv r{d| _d S | jd ur| j| jvrd| _d S | jd ur| j| jv rd| _d S | jtks| jtks| jtkrtd| jd	\| _| _| j| jd
 | _ntd| jdd | _| j | _| j| j	 j| _t| jdkrd| _ | j!rt"| jd S d S )Nonly_tablesignored_tablesonly_schemasignored_schemasprimary_keyF.z<HH      <H   r   )#superr&   __init___rows_only_tables_ignored_tables_only_schemas_ignored_schemas_read_table_idtable_iddatar+   	table_mapschematableKeyError
_processed
event_typer!   r   r    structunpackpacketreadflagsextra_data_length
extra_dataread_length_coded_binarynumber_of_columnscolumnslencomplete#_fail_on_table_metadata_unavailabler"   )selffrom_packet
event_sizer;   ctl_connectionkwargsschema_table	__class__ a/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/asyncmy/replication/row_events.pyr2   /   s\   









zRowsEvent.__init__c                 C   s2   | t |d  }t|trt|}|d|d > @ S )Nr.   r   )int
isinstancestrord)null_bitmappositionbitrV   rV   rW   _is_nullh   s   
zRowsEvent._is_nullc           
         s  i }| j t|d d }d}t| j}td|D ]3}| j| }| j| j j| j}| j| j j| j	}	t
||dkrBd||< q| ||rNd||< n|jtkru|	retd| j dd ||< ntd| j dd ||< n|jtkr|	rtd| j d	d ||< ntd
| j d	d ||< n|jtkr|	rtd| j dd ||< ntd| j dd ||< n|jtkr|	r| j  ||< nw| j  ||< nn|jtkrtd| j dd ||< nY|jtkrtd| j dd ||< nC|jtks|jtkr-|jdkr#| d	|||< n'| d|||< n|jtkr<| |||< n|jtkrL| |j|||< n|jtkrY|   ||< n|jt!krf| " ||< n|jt#krs| $ ||< n|jt%krt&j&'| j ( ||< n|jt)kr| *|||< n|jt+kr| ,|||< n|jt-kr| .t&j&'| j /d|||< n|jt0kr|	r| j 1 ||< n| j 2 ||< ny|jt3kr| j 4 d ||< ni|jt5kr|j6| j 7|j8 ||< nV|jt9kr| j 7|j8 t: fddt;|j<D pd||< n5|jt=kr#| >|||< n'|jt?kr3| j @|j||< n|jtAkrC| j B|j||< ntCd|j |d7 }q|S )zXUse for WRITE, UPDATE and DELETE events.
        Return an array of column data
           r.   r   N<Br   z<br/   r0   z<hz<Ir-   z<iz<fz<d   il  c                 3   s$    | ]\}} d | @ r|V  qdS )r0   NrV   ).0idxvalbit_maskrV   rW   	<genexpr>   s   " z.RowsEvent._read_column_data.<locals>.<genexpr>zUnknown MySQL column type: %d)DrC   rD   r   rK   rJ   ranger;   r9   nameunsignedr   r_   typer   rA   rB   r   r   r   read_uint24
read_int24r	   r   r   r   
max_length_RowsEvent__read_stringr   _RowsEvent__read_new_decimalr   length_sizer   _RowsEvent__read_datetimer   _RowsEvent__read_timer   _RowsEvent__read_dater   datetimefromtimestampread_uint32r   _RowsEvent__read_datetime2r   _RowsEvent__read_time2r   _RowsEvent__add_fsp_to_timeread_int_be_by_sizer   read_uint64
read_int64r   
read_uint8r   enum_valuesread_uint_by_sizesizer   set	enumerate
set_valuesr   _RowsEvent__read_bitr
   read_length_coded_pascal_stringr   read_binary_jsonNotImplementedError)
rN   cols_bitmapvaluesr\   null_bitmap_index
nb_columnsicolumnrj   rk   rV   rf   rW   _read_column_datao   s   


  
  
  

  

zRowsEvent._read_column_datac                 C   s"   |  |}|dkr|j|d}|S )zRead and add the fractional part of time
        For more details about new date format:
        http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
        r   )microsecond)_RowsEvent__read_fspreplace)rN   timer   r   rV   rV   rW   __add_fsp_to_time   s   
zRowsEvent.__add_fsp_to_timec                 C   s   d}|j dks|j dkrd}n|j dks|j dkrd}n|j dks&|j dkr(d}|dkrF| j|}|j d r=t|d }|dd|j    S dS )	Nr   r   r0      r-         
   )fsprC   r|   rX   )rN   r   rD   r   rV   rV   rW   
__read_fsp   s   
zRowsEvent.__read_fspc                 C   s   t | }|r	|jS | S N)r   encoding)rj   charsetrV   rV   rW   charset_to_encoding   s   zRowsEvent.charset_to_encodingc                 C   s0   | j |}|jd ur| |j}||}|S r   )rC   r   character_set_namer   decode)rN   r   r   stringr   rV   rV   rW   __read_string   s
   

zRowsEvent.__read_stringc                 C   s   d}t d|jD ]D}d}| j }|dkr*|jdkr|j}n|jd }|dkr)d}nd}t d|D ]}|d|> @ r>|d7 }q1|d7 }q1||ddd 7 }q|S )	zRead MySQL BIT type r   r   r.   10N)ri   bytesrC   r   bits)rN   r   respbytecurrent_byter:   endr^   rV   rV   rW   
__read_bit   s$   




zRowsEvent.__read_bitc                 C   s:   | j  }tjt|d t|d d t|d d}|S )N'  d   )hoursminutesseconds)rC   rm   rv   	timedeltarX   )rN   r   daterV   rV   rW   __read_time  s   


zRowsEvent.__read_timec              	   C   sz   | j d}| |dddrdnd}|dkr| d }tj|| |ddd | |dd	d| |d
d	d| |d}|S )a0  TIME encoding for nonfractional part:

         1 bit sign    (1= non-negative, 0= negative)
         1 bit unused  (reserved for future extensions)
        10 bits hour   (0-838)
         6 bits minute (0-59)
         6 bits second (0-59)
        ---------------------
        24 bits = 3 bytes
        r   r   r      r   r0   r      r      )r   r   r   microseconds)rC   r|   _read_binary_slicerv   r   r   )rN   r   r:   signtrV   rV   rW   __read_time2  s   
zRowsEvent.__read_time2c                 C   sf   | j  }|dkrd S |d@ d? }|d@ d? }|d@ }|dks'|dks'|dkr)d S tj|||d}|S )Nr   i  	   i  r      )yearmonthday)rC   rm   rv   r   )rN   r   r   r   r   r   rV   rV   rW   __read_date9  s   
zRowsEvent.__read_datec              	   C   s   | j  }|dkrd S |d }t|d }t|d }t|d d }t|d }|dks5|dks5|dkr7d S tj|||t|d t|d d t|d d}|S )Nr   i@B r   r   r   r   r   hourminutesecond)rC   r}   rX   rv   )rN   valuer   r   r   r   r   rV   rV   rW   __read_datetimeG  s&   


zRowsEvent.__read_datetimec                 C   s   | j d}| |ddd}z+tjt|d |d | |ddd| |ddd| |dd	d| |d
d	dd}W n tyH   | | Y dS w | ||S )a^  DATETIME

        1 bit  sign           (1= non-negative, 0= negative)
        17 bits year*13+month  (year 0-9999, month 0-12)
         5 bits day            (0-31)
         5 bits hour           (0-23)
         6 bits minute         (0-59)
         6 bits second         (0-59)
        ---------------------------
        40 bits = 5 bytes
        r   r      (      r         r   "   r   N)rC   r|   r   rv   rX   
ValueErrorr   r{   )rN   r   r:   
year_monthr   rV   rV   rW   __read_datetime2_  s    


zRowsEvent.__read_datetime2c                 C   sj  d}g d}|j |j }t|| }t|j| }|||  }|j||  }| j }	|	d@ dkr6d}
d}nd}d}
| jtd|	dA  || }|dkr\| j||A }	|
t	|	7 }
t
d|D ]}td	| jd
d |A }	|
d|	 7 }
qa|
d7 }
t
d|D ]}td	| jd
d |A }	|
d|	 7 }
q|| }|dkr| j||A }	|
d||	f 7 }
t|
S )z5Read MySQL's new decimal format introduced in MySQL 5r   )
r   r   r   r0   r0   r   r   r-   r-   r-      r   r   r   -ra   z>ir-   z%09dr,   z%0*d)	precisiondecimalsrX   rC   r   unreadrA   packr|   rZ   ri   rB   rD   decimalDecimal)rN   r   digits_per_integercompressed_bytesintegraluncomp_integraluncomp_fractionalcomp_integralcomp_fractionalr   resmaskr   r   rV   rV   rW   __read_new_decimal{  s<   

zRowsEvent.__read_new_decimalc                 C   s$   | |||  ? } d|> d }| |@ S )z
        Read a part of binary data and extract a number
        binary: the data
        start: From which bit (1 to X)
        size: How many bits should be read
        data_length: data size
        r   rV   )binarystartr   data_lengthr   rV   rV   rW   r     s   	zRowsEvent._read_binary_slicec                 C   sD   g | _ | jsd S | jj| jk r | j |   | jj| jk sd S d S r   )r3   rL   rC   
read_bytesrP   append_fetch_one_rowrN   rV   rV   rW   _fetch_rows  s   zRowsEvent._fetch_rowsc                 C   s   | j d u r	|   | j S r   )r3   r   r   rV   rV   rW   rows  s   
zRowsEvent.rows)__name__
__module____qualname__r2   staticmethodr_   r   r{   r   r   rp   r   rt   rz   ru   rs   ry   rq   r   r   propertyr   __classcell__rV   rV   rT   rW   r&   .   s,    9
j

	1
	r&   c                       (   e Zd ZdZ fddZdd Z  ZS )DeleteRowsEventzThis event is trigger when a row in the database is removed

    For each row you have a hash with a single key: values which contain
    the data of the removed line.
    c                    D   t t| j||||fi | | jr | j| jd d | _d S d S Nr`   r.   )r1   r   r2   r?   rC   rD   rI   columns_present_bitmaprN   rO   rP   r;   rQ   rR   rT   rV   rW   r2        
zDeleteRowsEvent.__init__c                 C      d|  | jiS Nr   r   r   r   rV   rV   rW   r        zDeleteRowsEvent._fetch_one_rowr   r   r   __doc__r2   r   r   rV   rV   rT   rW   r     s    r   c                       r   )WriteRowsEventzThis event is triggered when a row in database is added

    For each row you have a hash with a single key: values which contain the data of the new line.
    c                    r   r   )r1   r  r2   r?   rC   rD   rI   r   r   rT   rV   rW   r2     r   zWriteRowsEvent.__init__c                 C   r   r   r   r   rV   rV   rW   r     r   zWriteRowsEvent._fetch_one_rowr   rV   rV   rT   rW   r    s    r  c                       r   )UpdateRowsEventak  This event is triggered when a row in the database is changed

    For each row you got a hash with two keys:
        * before_values
        * after_values

    Depending of your MySQL configuration the hash can contains the full row or only the changes:
    http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_image
    c                    s\   t t| j||||fi | | jr,| j| jd d | _| j| jd d | _d S d S r   )	r1   r  r2   r?   rC   rD   rI   r   columns_present_bitmap2r   rT   rV   rW   r2     s   
zUpdateRowsEvent.__init__c                 C   s   |  | j|  | jd}|S )N)before_valuesafter_values)r   r   r  )rN   rowrV   rV   rW   r      s   

zUpdateRowsEvent._fetch_one_rowr   rV   rV   rT   rW   r    s    
	r  c                       s4   e Zd ZdZ fddZedd Zdd Z  ZS )TableMapEventzThis event describes the structure of a table.
    It's sent before a change happens on a table.
    An end user of the lib should have no usage of this
    c                    s  t t| j||||fi | |d | _|d | _|d | _|d | _|d | _|| _| 	 | _
| j
|v r=| jr=d| _d S td| jdd	 | _t| jd
| _| j| j | _| jd
 t| jd
| _| j| j | _| j d| j }| jd ur|| jvrd| _d S | jd ur|| jv rd| _d S | jd ur| j| jvrd| _d S | jd ur| j| jv rd| _d S | jd
 | j | _g | _d S )Nr'   r(   r)   r*   freeze_schemaFr/   r0   r   r   r,   )r1   r  r2   r4   r5   r6   r7   _freeze_schema
_table_mapr8   r9   r?   rA   rB   rC   rD   rE   r%   schema_lengthr   r<   advancetable_length
table_namerH   column_countrJ   )rN   rO   rP   r;   
connectionrR   rS   rT   rV   rW   r2     sJ   







zTableMapEvent.__init__c                 C   s   | j S r   )_tabler   rV   rV   rW   r=   ;  s   zTableMapEvent.tablec                    s  | j | jv r| j| j  j| _n| j| j| jI d H I d H | _d}t| jdkr~t| j	
| j}| j	  tdt|D ]?}|| }z| j| }||d d krTt|d7 }W n tyo   dj|dd d d ddd}Y nw t||| j	}| j| q>t| j| j | j| j| j| _d S )	Nr   ORDINAL_POSITIONr   z__dropped_col_{i}__)r   r   r   )COLUMN_NAMECOLLATION_NAMECHARACTER_SET_NAMECOLUMN_COMMENTCOLUMN_TYPE
COLUMN_KEY)r9   r  column_schemas_connection_get_table_informationr<   r  rK   listrC   rD   r  rH   ri   
IndexErrorformatr   rJ   r   r$   r  )rN   ordinal_pos_loccolumn_typesr   column_typecolumn_schemacolrV   rV   rW   init?  sD   





zTableMapEvent.init)	r   r   r   r  r2   r   r=   r%  r   rV   rV   rT   rW   r  	  s    ,
r  )4rv   r   rA   asyncmy.charsetr   asyncmy.constants.FIELD_TYPEr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   bitmapr   r   r   r   	constantsr   r   r   r   r    r!   errorsr"   eventsr#   r=   r$   utilsr%   r&   r   r  r  r  rV   rV   rV   rW   <module>   s(    \    