o
    RDi                     @  s$  d dl mZ d dlZd dlZd dl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Zd dlmZ dd	lmZ dd
lmZ ddlmZ erVd dlmZmZmZmZ zd dlZW n eyg   dZY nw zd dlZW n eyy   dZY nw ed ejjddZ e	e!Z"G dd dZ#dS )    )annotationsN)datetime	timedeltatimezonetzinfo)	getLogger)	byteorder)TYPE_CHECKING)UTC   )PARAMETER_TIMEZONE)_generate_tzinfo_from_tzoffsetinterval_year_month_to_string)
datetime64float64int64timedelta64r   c                   @  s  e Zd ZdZ	dRdSddZedTd
dZejdUddZdVddZdWddZ	dWddZ
dXddZdXddZdXddZdXdd ZdYd$d%ZdZd(d)Zd[d+d,Zd\d/d0Zd]d2d3Zd^d5d6Zd_d:d;Zd`d>d?Zdad@dAZdbdCdDZdcdFdGZdddIdJZdedLdMZdfdNdOZdgdPdQZdS )hArrowConverterContexta  Python helper functions for arrow conversions.

    Windows timestamp functions are necessary because Windows cannot handle -ve timestamps.
    Putting the OS check into the non-windows function would probably take up more CPU cycles then
    just deciding this at compile time.
    Nsession_parameters"dict[str, str | int | bool] | NonereturnNonec                 C  s,   |d u ri }t |vrd | _d S |t  | _d S N)r   	_timezone)selfr    r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/arrow_context.py__init__.   s   zArrowConverterContext.__init__strc                 C  s   | j S r   r   )r   r   r   r   r   :   s   zArrowConverterContext.timezonec                 C  s
   || _ d S r   r!   r   tzr   r   r   r   >   s   
tzinfo | UTCc                 C  s~   z| j sdn| j }t |W S  tjjy>   td tdur&t  Y S ztj j	W  Y S  t
y=   t d Y  Y S w w )z>Get the session timezone or use the local computer's timezone.r
   zconverting to tzinfo failedN)r   pytz
exceptionsUnknownTimeZoneErrorloggerwarningtzlocalget_localzoner   utcAttributeErrorr"   r   r   r   _get_session_tzB   s   
z%ArrowConverterContext._get_session_tzepochintmicrosecondsr#   r   c                 C  s$   t |d }tj||dt|d S )N  r#   r1   )r   r   fromtimestampr   )r   r/   r1   r#   r   r   r   r   TIMESTAMP_TZ_to_pythonQ   s   z,ArrowConverterContext.TIMESTAMP_TZ_to_pythonc                 C  s@   t |d }tt||d }tj|kr|||7 }|j|dS )Nr2   secondsr1   r   )r   
ZERO_EPOCHr   r%   r,   	utcoffsetreplace)r   r/   r1   r#   r   tr   r   r   TIMESTAMP_TZ_to_python_windowsY   s
   
z4ArrowConverterContext.TIMESTAMP_TZ_to_python_windowsc                 C  s    t |tjjd dt|d S )Nr   r4   )r   r5   r   r,   r;   r   r   r/   r1   r   r   r   TIMESTAMP_NTZ_to_pythonb   s
   z-ArrowConverterContext.TIMESTAMP_NTZ_to_pythonc                 C  s   t t||d S )Nr7   )r9   r   r>   r   r   r   TIMESTAMP_NTZ_to_python_windowsg   s   z5ArrowConverterContext.TIMESTAMP_NTZ_to_python_windowsc                 C  s    |   }tj||dt|d S )Nr3   r4   )r.   r   r5   r   )r   r/   r1   r   r   r   r   TIMESTAMP_LTZ_to_pythonl   s   z-ArrowConverterContext.TIMESTAMP_LTZ_to_pythonc                 C  sX   z|   }tt||d }tjj|dd|W S  ty+   t	d t
| Y S w )Nr7   F)is_dstzfOverflowError in converting from epoch time to timestamp_ltz: %s(ms). Falling back to use struct_time.)r.   r9   r   r%   r,   localize
astimezoneOverflowErrorr(   debugtime	localtime)r   r/   r1   r   tsr   r   r   TIMESTAMP_LTZ_to_python_windowsr   s   z5ArrowConverterContext.TIMESTAMP_LTZ_to_python_windows	py_doublefloatr   c                 C  
   t |S r   )numpyr   )r   rK   r   r   r   REAL_to_numpy_float64      
z+ArrowConverterContext.REAL_to_numpy_float64py_longr   c                 C  rM   r   )rN   r   )r   rQ   r   r   r   FIXED_to_numpy_int64   rP   z*ArrowConverterContext.FIXED_to_numpy_int64scalec                 C  s   t t|| S r   )rN   r   decimalDecimalscaleb)r   rQ   rS   r   r   r   FIXED_to_numpy_float64   s   z,ArrowConverterContext.FIXED_to_numpy_float64py_daysr   c                 C     t |dS )ND)rN   r   )r   rX   r   r   r   DATE_to_numpy_datetime64      z.ArrowConverterContext.DATE_to_numpy_datetime64valuec                 C  s$   t t|d| }t|dS N	   nsr0   rT   rU   rV   rN   r   )r   r]   rS   nanosecondsr   r   r   +TIMESTAMP_NTZ_ONE_FIELD_to_numpy_datetime64   s   zAArrowConverterContext.TIMESTAMP_NTZ_ONE_FIELD_to_numpy_datetime64fractionc                 C  s*   t t|dt| }t|dS r^   ra   )r   r/   rd   rb   r   r   r   +TIMESTAMP_NTZ_TWO_FIELD_to_numpy_datetime64   s   zAArrowConverterContext.TIMESTAMP_NTZ_TWO_FIELD_to_numpy_datetime64int128_bytesbytesdecimal.Decimalc                 C  sH   t j|tdd}|dkr|S dd t|D }|dk }t||| fS )NTr   signedr   c                 S  s   g | ]
}|d krt |qS )-)r0   ).0digitr   r   r   
<listcomp>   s    z?ArrowConverterContext.DECIMAL128_to_decimal.<locals>.<listcomp>)r0   
from_bytesr   r    rT   rU   )r   rf   rS   int128digitssignr   r   r   DECIMAL128_to_decimal   s   z+ArrowConverterContext.DECIMAL128_to_decimalexponentsignificandc                 C  s    t j|ddd}t||S )NbigTri   )r0   ro   rT   rU   rV   r   rt   ru   r   r   r   DECFLOAT_to_decimal   s   z)ArrowConverterContext.DECFLOAT_to_decimalc                 C  s   t | ||S r   )rN   r   rx   rw   r   r   r   DECFLOAT_to_numpy_float64   s   z/ArrowConverterContext.DECFLOAT_to_numpy_float64monthsc                 C  s   t |S r   r   r   rz   r   r   r   INTERVAL_YEAR_MONTH_to_str   s   z0ArrowConverterContext.INTERVAL_YEAR_MONTH_to_strr   c                 C  rY   )NMrN   r   r{   r   r   r   &INTERVAL_YEAR_MONTH_to_numpy_timedelta   r\   z<ArrowConverterContext.INTERVAL_YEAR_MONTH_to_numpy_timedeltananosc                 C  rY   )Nr`   r~   r   r   r   r   r   (INTERVAL_DAY_TIME_int_to_numpy_timedelta   r\   z>ArrowConverterContext.INTERVAL_DAY_TIME_int_to_numpy_timedeltar   c                 C  s   t |d dS )N  r4   )r   r   r   r   r   "INTERVAL_DAY_TIME_int_to_timedelta   s   z8ArrowConverterContext.INTERVAL_DAY_TIME_int_to_timedeltac                 C  s    t j|ddd}t|d dS )NlittleTri   i@B ms)r0   ro   rN   r   r   r]   r   r   r   r   ,INTERVAL_DAY_TIME_decimal_to_numpy_timedelta   s   zBArrowConverterContext.INTERVAL_DAY_TIME_decimal_to_numpy_timedeltac                 C  s   t j|ddd}t|d dS )Nr   Tri   r   r4   )r0   ro   r   r   r   r   r   &INTERVAL_DAY_TIME_decimal_to_timedelta   s   z<ArrowConverterContext.INTERVAL_DAY_TIME_decimal_to_timedeltar   )r   r   r   r   )r   r    )r   r   )r   r$   )r/   r0   r1   r0   r#   r0   r   r   )r/   r0   r1   r0   r   r   )rK   rL   r   r   )rQ   r0   r   r   )rQ   r0   rS   r0   r   r   )rX   r0   r   r   )r]   r0   rS   r0   r   r   )r/   r0   rd   r0   r   r   )rf   rg   rS   r0   r   rh   )rt   r0   ru   rg   r   rh   )rt   r0   ru   rg   r   r   )rz   r0   r   r    )rz   r0   r   r   )r   r0   r   r   )r   r0   r   r   )r]   rg   r   r   )r]   rg   r   r   )__name__
__module____qualname____doc__r   propertyr   setterr.   r6   r=   r?   r@   rA   rJ   rO   rR   rW   r[   rc   re   rs   rx   ry   r|   r   r   r   r   r   r   r   r   r   r   &   s<    	



	
















r   )$
__future__r   rT   rG   r   r   r   r   loggingr   sysr   typingr	   r%   r
   	constantsr   	converterr   interval_utilr   rN   r   r   r   r   ImportErrorr*   r5   r,   r;   r9   r   r(   r   r   r   r   r   <module>   s6   