o
    EDi}                     @   s  d dl Z d dlZd dlZd dl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mZmZmZmZ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mZ d d
lmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZD d dlEmFZFmGZG d dlHmIZI d dlJmKZK eLeMZNeOdejPZQdZRG dd de'ZSdS )    N)import_module)version)	b64encode)	OptionalDictAnySequenceUnionListCallable	GeneratorBinaryIO)	urlencode)Timeout)	HTTPError)PoolManager)HTTPResponse)common)registry)ClickHouseType)Client)	dict_copycoerce_bool
coerce_intdict_add)available_compression)RespBuffCls)DatabaseErrorOperationalErrorProgrammingError)ExternalData)ResponseSourceget_pool_managerget_response_datadefault_pool_managerget_proxy_managerall_managerscheck_env_proxycheck_conn_expiration)InsertContext)QueryResultQueryContext)quote_identifier
bind_query)QuerySummary)NativeTransformzLIMIT 0\s*$zX-ClickHouse-Exception-Codec                @       sR  e Zd Zi Zh dZh dZdZ																								
		didedededededede	e de
eef dedededede	e de
eef de	e de	e de	e de	e de	eeef  de	e de	e d e	e d!e	e d"e	e
eef  d#e	e d$e	e d%e	e d&e	e d'ed(ed)e	e f> fd*d+Zd,d- Zd.e	e fd/d0Zdefd1d2Zd3ef fd4d5Zd3ed.efd6d7Zd3ed.efd8d9Z							djd:ed;e	ee  d<e
eeeeddf ef de	e d=e	e d>e	e d?e	eeef  d.efd@dAZedBe fdCdDZ!						dkdEe	e
eeeef f  dFe
eef de	e dGedHe	e" d?e	eeef  d.e
eeee ef fdIdJZ#dldBe dKed.dfdLdMZ$		N					dmdOeeef dPe	eeef  dQedRedSedTedUe	eee%f  dVe&d.e fdWdXZ'						dkdYedEe	e
eeeef f  de	eeef  d=edGedHe	e" d?e	eeef  d.efdZd[Z(						dkdYedEe	e
eeeef f  de	eeef  d=edGedHe	e" d?e	eeef  d.e)j*fd\d]Z+dYedEe	e
eeeef f  de	eeef  d=edGedHe	e" fd^d_Z,d`efdadbZ-dcdd Z.dedf Z/dgdh Z0  Z1S )n
HttpClient>   rolecompressdatabasequery_id	quota_key
decompress
session_idbuffer_sizesession_checksession_timeoutwait_end_of_queryclient_protocol_version>   enable_http_compressionsend_progress_in_http_headers!http_headers_progress_interval_msFNTr      
   ,   	interfacehostportusernamepasswordr3   access_tokenr2   query_limitquery_retriesconnect_timeoutsend_receive_timeoutclient_nameverifyca_certclient_certclient_cert_keyr7   settingspool_mgr
http_proxyhttps_proxyserver_host_nameapply_server_timezoneutc_tz_awareshow_clickhouse_errorsautogenerate_session_idtls_mode
proxy_pathform_encode_query_paramsrename_response_columnc            &   
      s  | d}|rd| }| d| d| | | _i | _|| _ttj| _t|| j} || _|dkrt|t	rB|
 dkrBd}|pAd}|sJtd||}t|}|rh|du sX|dkrh|s^td	|| jd
< d| jd< | js|su|su|su|ru|rd|i}!t|!d| t|!d| t|!d| |r|!d r||!d< ||!d< td,d|i|!| _d| _| js|std||}|rt||| _nt | _|rd| | jd< n|r|dv r|rdt| d|    | jd< t | _t|| jd< d | _| _t | _|durt|}|durt|}t||d| _ d| _!d| _"d| _#d| _$d| _%|| _&|du r.t'dn|}"|r8|| d< nd| vrH|"rHt	t() | d< t|rXd *t+}#t+d! | _,n|rr|d"vrr|t+vrltd#| |}#|| _,nd}#t- j.|| j|	|
||||d$ t| j| /| | _| 0d%}$|$j1 o|$j2| _#|$j1s|$j2r|#| _3| 0d&}%|%j1 o|%j2| _"|%j1s|%j2r| 0d'j2rt	t4d(t5d)|d* d+ | _$dS dS dS )-zs
        Create an HTTP ClickHouse Connect client
        See clickhouse_connect.get_client for parameters
        /z://:httpsproxyTNmutualz<username parameter is required for Mutual TLS authenticationzX-ClickHouse-Useronz!X-ClickHouse-SSL-Certificate-AuthrO   rP   rQ   rR   assert_hostnameserver_hostnamerV   httpBearer Authorization)strictrc   zBasic 
User-AgentNative)connectread   Fr[   r7   ,r   )Falsefalse0zUnsupported compression method )r3   urirJ   rK   rW   rX   rY   rZ   r=   r>   r?   i i'     i   )6lstripurlheadersr^   r   r0   paramsrh   
isinstancestrlowerr'   r   r   r   r"   _owns_pool_managerr%   r$   r   encodedecodeset_reported_libsr   build_client_name_read_format_write_formatr/   
_transformr   r   timeouthttp_retries_send_progress_send_comp_setting_progress_interval_active_session_rename_response_columnget_settinguuiduuid4joinr   write_compressionsuper__init___validate_settings_setting_statusis_setis_writablecompressionminmax)&selfrD   rE   rF   rG   rH   r3   rI   r2   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   r7   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   ch_settingsoptions_autogenerate_session_idr   comp_settingsend_setting	__class__rw   ]/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_connect/driver/httpclient.pyr   6   s   
$

$










"zHttpClient.__init__c                 C   s.   |  ||td}|d ur|| j|< d S d S )Ninvalid_setting_action)_validate_settingr   r   r{   )r   keyvalue	str_valuerw   rw   r   set_client_setting   s   zHttpClient.set_client_settingreturnc                 C   s   | j |S N)r{   get)r   r   rw   rw   r   get_client_setting   s   zHttpClient.get_client_settingc                 C   s6   | j d}|r|dstdd| | j d< d S )Nrj   Bearerz:Cannot set access token when a different auth type is usedri   )rz   r   
startswithr   )r   rI   auth_headerrw   rw   r   set_access_token   s   zHttpClient.set_access_tokencontextc                    s@   t  |}|jr|S d| j }t|tr||  S || S )N	
 FORMAT )r   _prep_query	is_insertr   r|   bytesr   )r   r   final_queryfmtr   rw   r   r      s   
zHttpClient._prep_queryc                 C   s  i }i }| j r| j |d< | jr| j|d< d|_|| |j | j|_|jst	
|jr|j d}| jr^d|i}||j |jrQ||jj ||jj | jt ||| j|d}n5|jr|jj}||j ||jj ||d< | jt ||| j|d}n||j | j|||| jd}t|j}g }g }	|j}
|d D ]9}|d	 }|
d urz|
|}W n ty } ztd
|| W Y d }~nd }~ww || |	t|d  qtg d t |t |	S | j!r| j!|d< | j"rd|d< | #|}i }| jr#t }||d< ||j |jr"||jj ||jj n+|jr@||j t }||d< ||jj |jj}n||j |}d }d|d< | j||t$||j%d| j||j& d}t't(|}|)| *|j+,d | j-.||}| /||_0|S )Nr3   r<   Tz
 FORMAT JSONquery)retriesfields)r   metanamez5Failed to rename col '%s'. Skipping rename. Error: %stypezAccept-Encoding1r=   text/plain; charset=utf-8Content-Type)streamr   r   server_waitzX-ClickHouse-Timezone)1r3   protocol_version
block_infoupdater   rS   r   r_   r   columns_only_researchuncommented_queryr   r^   bind_paramsexternal_dataquery_params	form_data_raw_requestr   rK   jsonloadsdatacolumn_renamer	Exceptionloggerdebugappendr   get_from_namer*   tupler   r   r   r   transport_settings	streamingr   r!   set_response_tz_check_tz_changerz   r   r   parse_response_summarysummary)r   r   rz   r{   fmt_json_queryr   responsejson_resultnamestypesrenamercolr   er   bodybyte_sourcequery_resultrw   rw   r   _query_with_context   s   






zHttpClient._query_with_contextc                    s    j rtd t S dtf fdd}ddi} jdu r"j _ jr* j|d< j }i }j	r:j	|d	< |
 j t| j}j||||d
d}td|j|j d _t|S );
        See BaseClient doc_string for this method
        z$No data included in insert, skippingrespc                    s$    j r j }d  _ ||  d S r   )insert_exception_error_handler)r   exr   r   rw   r   error_handler6  s
   z-HttpClient.data_insert.<locals>.error_handlerr   application/octet-streamNContent-Encodingr3   F)r   r   z-Context insert response code: %d, content: %s)emptyr   r   r.   r   r   r   r   build_insertr3   r   r   rS   r   r   r   statusr   r   )r   r   r   rz   	block_genr{   r   rw   r   r   data_insert.  s&   



zHttpClient.data_inserttablecolumn_namesinsert_blockr   r   r   c                 C   s  i }ddi}	|r||	d< |rV|dur dd dd |D  d	nd
}
d| |
 d|r,|n| j }|s?t|tr?|d | }n|sRt|tttfrR|d  | }n||d< | jr^| j|d< |	| 
|pei  t|	|}	| j|||	dd}td|j|j t| |S )r   r   r   r   N (z, c                 S   s   g | ]}t |qS rw   )r,   ).0xrw   rw   r   
<listcomp>^  s    z)HttpClient.raw_insert.<locals>.<listcomp>)rC   zINSERT INTO z FORMAT 
r   r3   F)r   z)Raw insert response code: %d, content: %s)r   r   r|   r}   r   	bytearrayr   r   r3   r   r   r   r   r   r   r   r   r.   r   )r   r   r   r   rS   r   r   r   r{   rz   colsr   r   rw   rw   r   
raw_insertO  s&   
(

zHttpClient.raw_insertr   c                 C   sN   i }d| j v rz
t| j d }W n
 tjy   Y nw | j dd|d< |S )NzX-ClickHouse-SummaryzX-ClickHouse-Query-IdrC   r4   )rz   r   r   JSONDecodeErrorr   )r   r   rw   rw   r   r   n  s   
zHttpClient._summary
parametersr   use_databaser   c                 C   s  t ||| j\}}i }	d}
d}|r"|rtdd|j}||j nt|tr0d|	d< | }
nt|t	r;d|	d< |}
|
du rF|sFtdd|
sJ|rO||d< n|}
|r[| j
r[| j
|d< || |pbi  t|	|}	|
sn|rpd	nd
}| j|
||	||dd}|jrz,|j dd d}t|dkrzt|d W W S  ty   |d  Y W S w |W S  ty   t|j Y S w t| |S )r   Nz.Cannot combine command data with external datar   r   r   z-Command sent without query or recognized datar   r3   POSTGETF)r   r   	rp   r   )r-   	server_tzr   r   r   r   r|   r}   r   r   r3   r   r   r   r   r   splitlenint
ValueErrorUnicodeDecodeErrorr.   r   )r   cmdr	  r   rS   r
  r   r   r{   rz   payloadr   methodr   resultrw   rw   r   commandy  sP   








zHttpClient.commandretriedc                 C   s   zVd}zt |}t|jdd }W n ty$   tjddd Y nw | jrF|j	
t}|r6d| }nd|j }|rE| d	| }nd
}| d| j d}W |  n|  w |rct|dt|d)zV
        Handles HTTP errors. Tries to be robust and provide maximum context.
        rC   backslashreplace)errorsz"Failed to read error response bodyTexc_infoz%Received ClickHouse exception, code: z!HTTP driver received HTTP status z, server response: z'The ClickHouse server returned an errorz
 (for url r  N)r#   r   format_errorr   stripr   r   warningrZ   rz   r   	ex_headerr   ry   closer   r   )r   r   r  r   raw_bodyerr_codeerr_strrw   rw   r   r     s0   
zHttpClient._error_handlerr  r{   rz   r  r   r   r   r   r   c
              
   C   s:  t |tr	| }t| j|}d}
i }|rd|d< | jr d|d< | jr(| j|d< t| j|}t||}| j dt	| }|| j
| j| d}| jrXd|d	< |d
 d| ji |r_||d< n||d< t| j |d}	 |
d7 }
|r|| jkr}td|| _zZz| jj||fi |}W nE ty } z9t |jtr|
dkrtd W Y d }~W |rd | _qmtd | jrd| j dnd}td| d|
 | |d }~ww W |rd | _n|rd | _w d|j  krdk rn n|jts|S |jdv r|
|kr| |d td|j n|	r|	| n| | qn)Nr   r   r;   r>   r?   ?)rz   r   r   preload_contentFassert_same_hostrz   Hostr   r   r7   Trp   zwAttempt to execute concurrent queries within the same session.Please use a separate client instance per thread/process.z#Retrying remotely closed connectionz Unexpected Http Driver Exceptionr   r  rC   zError z  executing HTTP request attempt    rB   )i  i  i  z%Retrying requests with status code %d)r|   r}   r   r   rz   r   r   r{   ry   r   r   r   rW   r   r(   rh   r   r   r   requestr   __context__ConnectionResetErrorr   r   r!  rZ   r   r   r"  r   )r   r   r{   rz   r  r   r   r   r   r   attemptsfinal_paramsry   kwargsquery_sessionr   r   err_urlrw   rw   r   r     s   









&


zHttpClient._raw_requestr   c                 C   s.   |  ||||||\}}	}
| j||	|
|djS )r   )r   rz   )_prep_raw_queryr   r   r   r   r	  rS   r   r
  r   r   r   r{   r   rw   rw   r   	raw_query'  s   
zHttpClient.raw_queryc                 C   s0   |  ||||||\}}	}
| j||	|
dd|dS )r   TF)r   r   r   rz   )r4  r   r5  rw   rw   r   
raw_stream4  s   
zHttpClient.raw_streamc                 C   s   |r	|d| 7 }t ||| j\}}| |pi }	|r#| jr#| j|	d< i }
|r3| js3t|tr3td| jrQt }||
d< |
| |rP|	|j	 |
|j
 n!|ri|	| t }||	d< |	|j	 |j
}
n	|	| |}d }
||	|
fS )Nr   r3   zTBinary query cannot be placed in URL when using External Data; enable form encoding.r   )r-   r  r   r3   r^   r|   r   r   r   r   r   )r   r   r	  rS   r   r
  r   r   r   r{   r   r   rw   rw   r   r4  B  s6   





zHttpClient._prep_raw_queryr   c                 C   s  t dr
|| jv rdS zd}zt|}W n ty4   zt|}t|dd}W n	 ty1   Y nw Y nw | d| }| jdd}|	d}|d	krOW dS |	d
|d }|d	kr^W dS ||d | 
 }||v ru| j| W dS |r~| d| n|}	|d|d   |	 ||d  }
|

 | jd< | j| td| W dS  ty } ztd|| W Y d}~dS d}~ww )zr
        Dynamically adds a product (like pandas or sqlalchemy) to the User-Agent string details section.
        send_integration_tagsNunknown__version__r`   rl   rC   (r  r  rp   z; zAdded '%s' to User-Agentz%Problem adding '%s' to User-Agent: %s)r   r   r   dist_versionr   r   getattrrz   r   findr   addr   r   )r   r   vermodproduct_infouastartenddetailsnew_detailsnew_uar   rw   rw   r   _add_integration_tagg  sH   
$zHttpClient._add_integration_tagc                 C   s^   z| j jd| j dddd}d|j  kodk W S   W S  ty.   tjddd	 Y d
S w )r   r  z/ping   T)r   r(  r+  rB   zping failedr  F)rh   r,  ry   r   r   r   r   )r   r   rw   rw   r   ping  s   zHttpClient.pingc                 C   s   | j   d S r   )rh   clearr   rw   rw   r   close_connections  s   zHttpClient.close_connectionsc                 C   s&   | j r| j  t| jd  d S d S r   )r   rh   rL  r&   poprM  rw   rw   r   r#    s   
zHttpClient.close)NTr   r@   rA   rB   NTNNNNNNNNNNNNNNrC   FN)NNNNNNN)NNNTNN)F)Nr  r   FTNN)2__name__
__module____qualname__r{   valid_transport_settingsoptional_transport_settingsr   r}   r  r   r	   boolr   r   r   r   r   r   r   r+   r   r*   r   r)   r.   r   r   r   r   r   r  staticmethodr   r   r    r  r   r   r   r   r6  ioIOBaser7  r4  rI  rK  rN  r#  __classcell__rw   rw   r   r   r0   (   s   
	

 	U!



3/
		
P


%,r0   )TrW  r   loggingrer   	importlibr   importlib.metadatar   r<  base64r   typingr   r   r   r   r	   r
   r   r   r   urllib.parser   urllib3r   urllib3.exceptionsr   urllib3.poolmanagerr   urllib3.responser   clickhouse_connectr   clickhouse_connect.datatypesr   !clickhouse_connect.datatypes.baser    clickhouse_connect.driver.clientr    clickhouse_connect.driver.commonr   r   r   r   %clickhouse_connect.driver.compressionr    clickhouse_connect.driver.ctypesr   $clickhouse_connect.driver.exceptionsr   r   r   "clickhouse_connect.driver.externalr    "clickhouse_connect.driver.httputilr!   r"   r#   r$   r%   r&   r'   r(    clickhouse_connect.driver.insertr)   clickhouse_connect.driver.queryr*   r+   !clickhouse_connect.driver.bindingr,   r-   !clickhouse_connect.driver.summaryr.   #clickhouse_connect.driver.transformr/   	getLoggerrP  r   compile
IGNORECASEr   r"  r0   rw   rw   rw   r   <module>   sB    ,(
