
    ɯei                        d dl mZ d dlZd dlmZmZmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlZddlmZ dd	lmZmZ dd
lmZmZmZmZmZ ddlmZmZ ddlmZmZmZ  ee      Z 	 	 	 	 	 	 	 	 ddZ! G d de      Z"y)    )annotationsN)datedatetime	timedelta)	getLogger)struct_time)AnyCallable   
IS_WINDOWS)is_date_type_nameis_timestamp_type_name)
ZERO_EPOCHSnowflakeConverter_adjust_fraction_of_nanoseconds_extract_timestamp_generate_tzinfo_from_tzoffset)SnowflakeBinaryFormatbinary_to_python)SnowflakeDateFormatSnowflakeDateTimeSnowflakeDateTimeFormatc                    t        ||| j                  d            }| j                  d      r| d   j                  |      S t        |      S )Nscale)r   
nanosecondr   fmt)r   getformatstr)ctxvaluefranction_of_nanosecondssf_datetimes       g/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/converter_snowsql.pyformat_sftimestampr&      sJ     $#;3777CSK .1WWU^3u:[)Q[AQQ    c                  |     e Zd ZdZd fdZddZ	 	 	 	 	 	 ddZd Zd Zd Z	d Z
dd	Zdd
ZddZddZeZ xZS )SnowflakeConverterSnowSQLz|Snowflake Converter for SnowSQL.

    Format data instead of just converting the values into native
    Python objects.
    c                R    t        |   di | |j                  dd      | _        y )Nsupport_negative_yearT )super__init__r   _support_negative_year)selfkwargs	__class__s     r%   r.   z"SnowflakeConverterSnowSQL.__init__+   s'    "6"&,jj1H$&O#r'   c                F   d}|dk(  r!| j                   j                  d      }|sd}|S |dk(  r| j                   j                  d      }|S |dz   | j                   v r%| j                   |dz      }|s| j                   d   }|S |d	k(  r| j                   j                  d
      }|S )zGets the format.NDATEDATE_OUTPUT_FORMATz
YYYY-MM-DDTIMETIME_OUTPUT_FORMAT_OUTPUT_FORMATTIMESTAMP_OUTPUT_FORMATBINARYBINARY_OUTPUT_FORMAT)_parametersr   )r0   	type_namer   s      r%   _get_formatz%SnowflakeConverterSnowSQL._get_format/   s    ""&&';<C" 
 & ""&&';<C 
 ))T-=-==""9/?#?@C&&'@A 
 ("""&&'=>C
r'   c                   |j                         }|j                  d      "t        d|d   z        |d<   dd|d   z
  z  |d<   d }t        |      rDt        st
        j                  nt        }t        | j                  |      | j                  |      }nWt        |      r-t        | j                  |      || j                  t              }n|d	k(  rt        | j                  |            }t        j!                  d
||       ||d<   d| dg}|D ]  }	  t#        | |      |      c S  t        j'                  d|       y # t$        $ r Y ;w xY w)Nr   
   max_fraction0	   	zero_fill)r+   datetime_class)	data_typer+   rE   r:   zType: %s, Format: %sr   _
_to_pythonz&No column converter found for type: %s)copyr   intr   r   timer   r   r   r>   r/   r   r   r   r   loggerdebuggetattrAttributeErrorwarning)r0   r=   columnr!   r   rE   
convertersconvs           r%   to_python_methodz*SnowflakeConverterSnowSQL.to_python_methodD   sY    kkm777'"%bCL&8"9C"a#g,&67CY'5?T--TN%  +&*&A&A-C
 $I.)  +#&*&A&A0	C ("'(8(8(CDC+Y<E
)J/0
 	D*wtT*3//	
 	?K " s   E	EEc                    d S )No conversion for SnowSQL.c                    | dv rdS dS )N)1TruerY   Falser,   )r"   s    r%   <lambda>z>SnowflakeConverterSnowSQL._BOOLEAN_to_python.<locals>.<lambda>i   s    u'=V 7 r'   r,   r0   r!   s     r%   _BOOLEAN_to_pythonz,SnowflakeConverterSnowSQL._BOOLEAN_to_pythong   s    JJr'   c                     yrV   Nr,   r\   s     r%   _FIXED_to_pythonz*SnowflakeConverterSnowSQL._FIXED_to_pythonk       r'   c                     yr_   r,   r\   s     r%   _REAL_to_pythonz)SnowflakeConverterSnowSQL._REAL_to_pythono   ra   r'   c                    fdS )z5BINARY to a string formatted by BINARY_OUTPUT_FORMAT.c                >    d   j                  t        |             S )Nr   )r   r   r"   r!   s    r%   r[   z=SnowflakeConverterSnowSQL._BINARY_to_python.<locals>.<lambda>u   s    SZ../?/FG r'   r,   r\   s    `r%   _BINARY_to_pythonz+SnowflakeConverterSnowSQL._BINARY_to_pythons   s	    GGr'   c                .    dfd}fd}t         s|S |S )zMConverts DATE to struct_time/date.

        No timezone is attached.
        c                j    d   j                  t        j                  t        |       dz              S )Nr   Q )r   rK   gmtimerJ   rf   s    r%   rS   z7SnowflakeConverterSnowSQL._DATE_to_python.<locals>.conv}   s*    u:$$T[[U|1L%MNNr'   c                    t         t        t        |       dz        z   }d   j                  t	        |j
                  |j                  |j                              S )Nrj   secondsr   )r   r   rJ   r   r   yearmonthday)r"   tsr!   s     r%   conv_windowsz?SnowflakeConverterSnowSQL._DATE_to_python.<locals>.conv_windows   sE    iE
l0KLLBu:$$T"''288RVV%DEEr'   r"   r    returnr    r   )r0   r!   rS   rs   s    `  r%   _DATE_to_pythonz)SnowflakeConverterSnowSQL._DATE_to_pythonw   s    	O	F &t7<7r'   c                f    d   j                  d      dfd}dfd}dkD  r|S |S )zXConverts TIMESTAMP TZ to datetime.

        The timezone offset is piggybacked.
        r   rA   c                   | j                         \  }}t        |      }t        t        |      dz
        }	 t	        j
                  ||      }t        |	
      }t!        ||      S # t        $ rl}t        j                  d|       t        t        |      z   }t        j                  |k7  r||j                  |      z  }|j                  |      }Y d }~d }~ww xY w)N  tz1OSError occurred but falling back to datetime: %srm   tzinfo)splitfloatr   rJ   r   fromtimestampOSErrorrL   rM   r   r   pytzutc	utcoffsetreplacer   r&   encoded_valuer"   r{   microsecondsr~   tefraction_of_nanosecondsr!   rA   r   s           r%   conv0z@SnowflakeConverterSnowSQL._TIMESTAMP_TZ_to_python.<locals>.conv0   s    %++-IE2 <L3CGdNCF-**<FC 'F|U'# &c1.EFF  -PRST<!@@88v%))!,,AIIVI,-s   A) )	C2A"CCc                   | j                         \  }}t        |d
 dz          }t        t        |      dz
        }	 t	        j
                  ||      }t!        |	
      }t#        ||      S # t        t        f$ rl}t        j                  d|       t        t        |      z   }t        j                  |k7  r||j                  |      z  }|j                  |      }Y d }~d }~ww xY w)Nr      ry   rz   r|   rm   r}   )r   r   r   rJ   r   r   r   
ValueErrorrL   rM   r   r   r   r   r   r   r   r&   r   s           r%   rS   z?SnowflakeConverterSnowSQL._TIMESTAMP_TZ_to_python.<locals>.conv   s    %++-IE2 qE6A:!67L3CGdNCF-**<FC 'F|U'# &c1.EFF Z( -PRST<!@@88v%))!,,AIIVI,-s   A0 0C+?A"C&&C+r   )r   r    ru   r    )r   )r0   r!   r   rS   rA   r   s    `  @@r%   _TIMESTAMP_TZ_to_pythonz1SnowflakeConverterSnowSQL._TIMESTAMP_TZ_to_python   s;    
 Gww~.	G$	G& qyt+e+r'   c                     d fd}|S )Nc                H    j                  |       \  }}t        ||      S )N)_pre_TIMESTAMP_LTZ_to_pythonr&   )r"   r   r   r!   r0   s      r%   rS   z@SnowflakeConverterSnowSQL._TIMESTAMP_LTZ_to_python.<locals>.conv   s,    )-)J)J5RU)V&A&%c1.EFFr'   rt   r,   r0   r!   rS   s   `` r%   _TIMESTAMP_LTZ_to_pythonz2SnowflakeConverterSnowSQL._TIMESTAMP_LTZ_to_python   s    	G r'   c                    dfd}|S )zeConverts TIMESTAMP NTZ to Snowflake Formatted String.

        No timezone info is attached.
        c                    t        |       \  }}	 t        j                  |      }t        ||      S # t        t        f$ r3}t
        j                  d|       t        t        |      z   }Y d }~Jd }~ww xY w)Nr|   rm   )
r   rK   rk   r   r   rL   rM   r   r   r&   )r"   r   r   r   r   r!   s        r%   rS   z@SnowflakeConverterSnowSQL._TIMESTAMP_NTZ_to_python.<locals>.conv   ss    4Fuc4R1L1CKK- &c1.EFF Z( CPRSTL!BBCs   4 A6)A11A6rt   r,   r   s    ` r%   _TIMESTAMP_NTZ_to_pythonz2SnowflakeConverterSnowSQL._TIMESTAMP_NTZ_to_python   s    	G r'   )ru   None)r=   r    ru   r    )r=   r    rQ   dict[str, Any]ru   zCallable | None)r!   zdict[str, str | None]ru   r
   )r!   r   ru   r
   )__name__
__module____qualname____doc__r.   r>   rT   r]   r`   rc   rg   rv   r   r   r   _TIME_to_python__classcell__)r2   s   @r%   r)   r)   $   sc    P*!!&4!	!FKH8-,^" /Or'   r)   )r!   r   r"   zdatetime | struct_timer#   rJ   ru   r    )#
__future__r   rK   r   r   r   loggingr   r   typingr	   r
   r   compatr   	constantsr   r   	converterr   r   r   r   r   sfbinaryformatr   r   
sfdatetimer   r   r   r   rL   r&   r)   r,   r'   r%   <module>r      s|    "  . .       @  D W W	8	R	R 6RRURRi/ 2 i/r'   