o
    9f
                     @   s4  d dl Z d dl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 dd
lmZ dZdZdZe dZdd Zdd Zdd Zdd Zi dedededededededededed ed!ed"ed#ed$ed%ed&eeeeeed'Zd(d) ZG d*d+ d+eZdS ),    N)datetime)Decimal)partial)IPv4AddressIPv6Address   )DatabaseException   )HTTPException)	parse_tsvz
0000-00-00z0000-00-00 00:00:00z^[^\(]+\((.+)\)$c                 C   s   | t krt| d S d S )Nz%Y-%m-%d)	DATE_NULLr   strptimedatex r   e/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_sqlalchemy/drivers/http/transport.pydate_converter   s   r   c                 C   s0   | t krd S t| dkrt| dS t| dS )N   z%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S)DATETIME_NULLlenr   r   r   r   r   r   datetime_converter   s
   r   c                 C   s$   |d u rd S t | }|r||S |S N	_get_type)subtype_strr   	converterr   r   r   nullable_converter&   s   r   c                 C   s   d S r   r   r   r   r   r   nothing_converter.   s   r   Int8UInt8Int16UInt16Int32UInt32Int64UInt64Int128UInt128Int256UInt256Float32Float64r   DateDateTime)
DateTime64IPv4IPv6NullableNothingc                 C   sf   t | }|d ur|S | drt d S | drt d S | dr1t| d}tt d |S d S )Nr/   r   z	Nullable(r	   r2   )
convertersget
startswithEXTRACT_SUBTYPE_REmatchgroupr   )type_strresultr   r   r   r   r   L   s   



r   c                       s>   e Zd Z	d fdd	ZdddZdddZdd	d
Z  ZS )RequestsTransportNc           
         s   || _ || _||f| _|d urt|nd | _|dd| _|dd | _dd | D | _	|dd| _
t|p9i }|| _d| jd	< |d
t}|d urTt|| jd< |dtj}	t|	rb|	 n|	| _tt|   d S )NverifyTcertc                 S   s(   i | ]\}}| d r|dd |qS )header__   N)r6   ).0keyvaluer   r   r   
<dictcomp>i   s    z.RequestsTransport.__init__.<locals>.<dictcomp>unicode_errorsreplaceTabSeparatedWithNamesAndTypesdefault_formatddl_timeoutdistributed_ddl_task_timeouthttp_session)db_urldb_nameauthfloattimeoutpopr=   r>   itemsheadersrE   dictch_settingsDEFAULT_DDL_TIMEOUTintrequestsSessioncallablehttpsuperr<   __init__)
selfrL   rM   usernamepasswordrP   rU   kwargsrI   r[   	__class__r   r   r]   ]   s&   

zRequestsTransport.__init__c           	      c   s    | j ||dd}| }ztt|| j}tt|| j}W n
 ty)   Y dS w dd |D }|V  |V  |D ]}dd tt|| j|D V  q9dS )zp
        Query is returning rows and these rows should be parsed or
        there is nothing to return.
        TparamsstreamNc                 S   s   g | ]}t |qS r   r   )rA   type_r   r   r   
<listcomp>   s    z-RequestsTransport.execute.<locals>.<listcomp>c                 S   s    g | ]\}}|r||n|qS r   r   )rA   r   convr   r   r   rh      s    )_send
iter_linesr   nextrE   StopIterationzip)	r^   queryre   rlinesnamestypesconvsliner   r   r   execute   s"   
zRequestsTransport.executeFc                 C   s   | j |||djS )a?  
        Performs raw query to database. Returns its output
        :param query: Query to execute
        :param params: Additional params should be passed during query.
        :param stream: If flag is true, Http response from ClickHouse will be
            streamed.
        :return: Query execution result
        rd   )rj   text)r^   ro   re   rf   r   r   r   raw   s   	zRequestsTransport.rawc                 C   sz   | d}|pi }| j|d< || j | jj| j| j|||| j| j	| j
| jd	}|jdkr;t|j}|j|_t||S )Nzutf-8database)rN   re   datarf   rP   rS   r=   r>      )encoderM   updaterU   r[   postrL   rN   rP   rS   r=   r>   status_coder
   rw   coder   )r^   rz   re   rf   rp   origr   r   r   rj      s   




zRequestsTransport._send)NNr   )NF)__name__
__module____qualname__r]   rv   rx   rj   __classcell__r   r   rb   r   r<   [   s    
#
r<   )rer   decimalr   	functoolsr   	ipaddressr   r   rX   
exceptionsr   r
   utilsr   rV   r   r   compiler7   r   r   r   r   rW   rO   r4   r   objectr<   r   r   r   r   <module>   sx    
		
