
    g{                        d dl Z d dlZd dlmZ d dlZd dlZd dlmZmZ d dl	Z	ddl
mZmZmZmZmZmZmZ ej$                  dk(  Z e j                   ddde j(                  j*                        Z e j                   ddd      Zd	 Zd
ee j                   ef   dedefdZd Zd
ee j                   ef   dedefdZd Zd Zd Zd Z d Z!d Z"eeeeeeee e!e"d
Z#y)    N)BytesIO)DictUnion   )MCS_PER_HOURMCS_PER_MINUTEMCS_PER_SECONDMLS_PER_HOURMLS_PER_MINUTEMLS_PER_SECOND
DAYS_SHIFTnti  tzinfoc                    t        | t        j                        r| j                  H| t        z
  }|j                  dz  dz  |j
                  z   t        z  t        |j                  dz        z   S t        rH| t        z
  }|j                  dz  dz  |j
                  z   t        z  t        |j                  dz        z   S t        t        j                  | j                                     t        z  t        | j                  dz        z   S | S )zDConverts datetime.datetime object to int timestamp with milliseconds       )
isinstancedatetimer   epochdayssecondsr   intmicroseconds
is_windowsepoch_naivetimemktime	timetuplemicroseconddataschemadeltas      Q/var/www/openai/venv/lib/python3.12/site-packages/fastavro/_logical_writers_py.pyprepare_timestamp_millisr'      s    $))*;;"5LEJJOd*U]]:nLs""T)P   ;&EJJOd*U]]:nLs""T)P   t{{4>>#345F  4'J       r#   r$   returnc                    t        | t        j                        rp| j                  t        j                  j                        t
        z
  }|j                  dz  dz  |j                  z   t        z  t        |j                  dz        z   S | S )a  Converts datetime.datetime object to int timestamp with milliseconds.

    The local-timestamp-millis logical type represents a timestamp in a local
    timezone, regardless of what specific time zone is considered local, with a
    precision of one millisecond.
    r   r   r   r   )r   r   replacetimezoneutcr   r   r   r   r   r   r"   s      r&   prepare_local_timestamp_millisr.   0   sz     $))*H$5$5$9$9:UB

R$&6.H3%L
 
 	
 r(   c                    t        | t        j                        r| j                  <| t        z
  }|j                  dz  dz  |j
                  z   t        z  |j                  z   S t        r<| t        z
  }|j                  dz  dz  |j
                  z   t        z  |j                  z   S t        t        j                  | j                                     t        z  | j                  z   S | S )z=Converts datetime.datetime to int timestamp with microsecondsr   r   )r   r   r   r   r   r   r	   r   r   r   r   r   r   r    r!   r"   s      r&   prepare_timestamp_microsr0   B   s    $))*;;"5LE

R$&6!&!3!34 4 ;&E

R$&6!&!3!34 4
 DKK 012^CdFVFVV r(   c                    t        | t        j                        rd| j                  t        j                  j                        t
        z
  }|j                  dz  dz  |j                  z   t        z  |j                  z   S | S )a  Converts datetime.datetime to int timestamp with microseconds

    The local-timestamp-micros logical type represents a timestamp in a local
    timezone, regardless of what specific time zone is considered local, with a
    precision of one microsecond.
    r   r   r   )
r   r   r+   r,   r-   r   r   r   r	   r   r"   s      r&   prepare_local_timestamp_microsr2   Z   sp     $))*H$5$5$9$9:UBJJOd"U]]2"//0 	0 r(   c                     t        | t        j                        r| j                         t        z
  S t        | t
              r4t        j                  j                  |       j                         t        z
  S | S )z'Converts datetime.date to int timestamp)r   r   date	toordinalr   strfromisoformatr#   r$   s     r&   prepare_dater9   l   sT    $&~~*,,	D#	}}**40::<zIIr(   c                 |   t        | t        j                        s| S |j                  dd      }|d   }| j	                         \  }}}t        |      |kD  rt        d      ||z   }|dk  rt        d      d}|D ]
  }	|dz  |	z   } d|z  |z  }|j                         dz   dz  }
|r| }|j                  |
dd	
      S )z Convert decimal.Decimal to bytesscaler   	precision6The decimal precision is bigger than allowed by schema3Scale provided in schema does not match the decimal
      bigT)	byteordersigned)	r   decimalDecimalgetas_tuplelen
ValueError
bit_lengthto_bytes)r#   r$   r;   r<   signdigitsexpr%   unscaled_datumdigit	bytes_reqs              r&   prepare_bytes_decimalrR   v   s    dGOO,JJw"E{#ID&#
6{YQRR%KEqyNOON(2-6  Y/N**,q0Q6I(""9d"KKr(   c                    t        | t        j                        s| S |j                  dd      }|d   }|d   }| j	                         \  }}}t        |      |kD  rt        d      | |kD  rt        d      ||z   }|dkD  r|d|z  z   }d}	|D ]
  }
|	dz  |
z   }	 |	j                         d	z   }|d
z  }||z
  }d|z  d	z
  }d	}t        |      D ]  }||z  }|d	z  } |d
k  rd	}n|d
z  }|d
z  dk7  r|d	z  }t               }|rXd	|z  |	z
  }	||	z  }	t        |d	z
  dd      D ](  }|	d
|z  z	  }|j                  t        |dz  g             * |j                         S t        |d
z        D ]  }|j                  t        dg              t        |d	z
  dd      D ](  }|	d
|z  z	  }|j                  t        |dz  g             * |j                         S )z4Converts decimal.Decimal to fixed length bytes arrayr;   r   sizer<   r=   r>   )r   r?   r   r@         )r   rD   rE   rF   rG   rH   rI   rJ   ranger   writebytesgetvalue)r#   r$   r;   rT   r<   rL   rM   rN   r%   rO   rP   bits_reqsize_in_bitsoffset_bitsmaskbitirQ   tmpindexbits_to_writes                        r&   prepare_fixed_decimalre      s   dGOO,JJw"E&>D{#I D&#
6{YQRRte|NOO%KEqy$,&N(2-6  ((*Q.H!8L)Kl?QD
C8_	  !|	M	a<1NI
)Cx->9.4!8R,E*q5y9MIIe]T1234 - <<> {a'(AIIeQCj! )9q="b1E*q5y9MIIe]T1234 2 <<>r(   c                 P    t        | t        j                        rt        |       S | S )zYConverts uuid.UUID to
    string formatted UUID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    )r   uuidUUIDr6   r8   s     r&   prepare_uuidri      s!     $		"4yr(   c                     t        | t        j                        r]t        | j                  t
        z  | j                  t        z  z   | j                  t        z  z   t        | j                  dz        z         S | S )z8Convert datetime.time to int timestamp with millisecondsr   )r   r   r   r   hourr
   minuter   secondr   r!   r8   s     r&   prepare_time_millisrn      sl    $&II$kkN*+kkN*+ $""T)*+
 	
 r(   c                     t        | t        j                        rQt        | j                  t
        z  | j                  t        z  z   | j                  t        z  z   | j                  z         S | S )z8Convert datetime.time to int timestamp with microseconds)r   r   r   r   rk   r   rl   r   rm   r	   r!   r8   s     r&   prepare_time_microsrp      sb    $&II$kkN*+kkN*+ 
 	
 r(   )
zlong-timestamp-milliszlong-local-timestamp-milliszlong-timestamp-microszlong-local-timestamp-microszint-datezbytes-decimalzfixed-decimalzstring-uuidzint-time-milliszlong-time-micros)$r   rD   ior   osr   typingr   r   rg   constr   r   r	   r
   r   r   r   namer   r,   r-   r   r   r'   r   r.   r0   r2   r9   rR   re   ri   rn   rp   LOGICAL_WRITERS r(   r&   <module>rx      s      	      WW_
$1X->->-B-BCha+0
!!3&
'15$0
!!3&
'15$L>;|

 6#A5#A***+r(   