o
    EDi                     @   s  d dl Z d dlZd dlZd dlmZ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Zd dlmZ d dlmZ d dlmZ dZed	d
ddfZedZG dd dZdefddZ	d(dede	e
eeeef f  de	e defddZ	d(dede	e
eeeef f  de	e deeeeef f fddZdefddZdefddZ ej!fdedefd d!Z"ej!fdedefd"d#Z#ej!d$fdeded%e$fd&d'Z%dS ))    N)tzinfodatetimedate)Enum)OptionalUnionSequenceDictAnyTuple)common)	dict_copy)any_to_json\'`	
z{.+:.+}c                   @   s0   e Zd ZdefddZdededefddZd	S )
	DT64Paramvaluec                 C   s
   || _ d S Nr   )selfr    r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_connect/driver/binding.py__init__   s   
zDT64Param.__init__tz	top_levelreturnc                 C   s2   | j }|r
||}|d}|r|S d| dS )Nz%Y-%m-%d %H:%M:%S.%fr   )r   
astimezonestrftime)r   r   r   r   sr   r   r   format   s   

zDT64Param.formatN)	__name__
__module____qualname__r   r   r   boolstrr"   r   r   r   r   r      s    r   
identifierc                 C   s0   | d }|dv r| d |kr| S dt |  dS )Nr   )r   "r   
escape_str)r(   
first_charr   r   r   quote_identifier!   s   r.   query
parameters	server_tzr   c                    sP   |  d} |s	| S t|dr|  fdd| D  S | t fdd|D  S )N;itemsc                    s   i | ]
\}}|t | qS r   format_query_value.0kvr1   r   r   
<dictcomp>/   s    z"finalize_query.<locals>.<dictcomp>c                 3       | ]}t | V  qd S r   r4   )r7   r9   r:   r   r   	<genexpr>0       z!finalize_query.<locals>.<genexpr>)rstriphasattrr3   tuple)r/   r0   r1   r   r:   r   finalize_query)   s   

rB   c                    s  |  d} |s| i fS d }t|trt|}dd | D }| D ]}||= q#i }| D ]<\}}|drgt|trH|d d }t|}nt|t	rgt
|dkrgt|d trg|d d }dd |D }|||< q/t| d u r}t| | i } }	n fd	d| D }	n	t| | i } }	|r|  }
i }| D ]'\}}| }d}	 |
||}|dkrn||f||t
| < |t
|7 }qqd} d}t| D ]}|| \}}| |
|| | | 7 } |}q| |
|d  7 } | |	fS )Nr2   c                 S   s6   i | ]\}}| d r|d rt|dkr||qS )$   )
startswithendswithlenr6   r   r   r   r;   >   s   6 zbind_query.<locals>.<dictcomp>_64r   c                 S   s   g | ]}t |qS r   )r   r7   xr   r   r   
<listcomp>J   s    zbind_query.<locals>.<listcomp>c                    s"   i | ]\}}d | t | qS )param_format_bind_valuer6   r:   r   r   r;   O   s   " Tr*       )r?   
isinstancedictr   r3   keysrF   r   r   listrG   external_bind_researchrB   encodefindsorted)r/   r0   r1   binary_bindsparams_copykeyfinal_paramsr8   r9   bound_paramsbinary_querybinary_indexes
item_indexstartlocr   r   r:   r   
bind_query4   sZ   




$
rd   r   c                 C   s   dt |  dS )Nr   r+   r   r   r   r   
format_strh   s   re   c                 C   s   d dd | D S )N c                 s   s(    | ]}|t v rt | n|V  qd S r   )must_escapeBS)r7   cr   r   r   r=   m   s   & zescape_str.<locals>.<genexpr>)joinr   r   r   r   r,   l   s   r,   c                    sh  | du rdS t | trt| S t | tr|  dS t | tr7| jdus) tjkr.| 	 } d| 
d dS t | trDd|   dS t | trYdd fdd	| D  d
S t | trndd fdd	| D  dS t | trtddkrtt|  S  fdd|  D }dd| dS t | trt| j S t | tjtjtjfrd|  dS | S )z
    Format Python values in a ClickHouse query
    :param value: Python object
    :param server_tz: Server timezone for adjusting datetime values
    :return: Literal string for python value
    NNULLFr   %Y-%m-%d %H:%M:%S[, c                 3   r<   r   str_query_valuerJ   r:   r   r   r=      r>   z%format_query_value.<locals>.<genexpr>](c                 3   r<   r   ro   rJ   r:   r   r   r=      r>   )dict_parameter_formatjsonc                    s(   g | ]\}}t | d  t |  qS :ro   r6   r:   r   r   rL      s    z&format_query_value.<locals>.<listcomp>{})rQ   r'   re   r   r"   r   r   pytzUTCr   r    r   	isoformatrT   rj   rA   rR   r   get_settingr   decoder3   r   r5   r   uuidUUID	ipaddressIPv4AddressIPv6Address)r   r1   pairsr   r:   r   r5   q   s8   





 
 


r5   c                 C   s   t t| |S r   )r'   r5   )r   r1   r   r   r   rp      s   rp   Tr   c                    s`  fdd | du rdS t | tr|rt| S t| S t | tr&| |S t | tr?| } | d}|r9|S d| dS t | t	rR|rJ| 
 S d| 
  dS t | trgdd fd	d
| D  dS t | tr|dd fdd
| D  dS t | trtddkrt|  S  fdd|  D }dd| dS t | tr | jS t| S )a  
    Format Python values in a ClickHouse query
    :param value: Python object
    :param server_tz: Server timezone for adjusting datetime values
    :param top_level: Flag for top level for nested structures
    :return: Literal string for python value
    c                    s   t |  dS )NFrN   )rK   r:   r   r   recurse   s   z"format_bind_value.<locals>.recurseNz\Nrl   r   rm   rn   c                 3       | ]} |V  qd S r   r   rJ   r   r   r   r=          z$format_bind_value.<locals>.<genexpr>rq   rr   c                 3   r   r   r   rJ   r   r   r   r=      r   rs   rt   ru   c                    s$   g | ]\}} |d   | qS rv   r   r6   r   r   r   rL      s    z%format_bind_value.<locals>.<listcomp>rx   ry   )rQ   r'   r,   re   r   r"   r   r   r    r   r|   rT   rj   rA   rR   r   r}   r   r~   r3   r   r   )r   r1   r   valr   r   )r   r1   r   rO      sB   	






 
 



rO   r   )&r   rer   r   r   r   enumr   typingr   r   r   r	   r
   r   rz   clickhouse_connectr    clickhouse_connect.driver.commonr   clickhouse_connect.json_implr   rh   rg   compilerU   r   r'   r.   rB   rd   re   r,   r{   r5   rp   r&   rO   r   r   r   r   <module>   s@     
	 
 
4$"