o
    9f(                     @   sx   d dl mZ d dlmZ d dlmZ ddlm	Z	 dZ
dZdZG d	d
 d
eZdd ZG dd deZG dd deZdS )    )islice)Client)Error   )DatabaseExceptionz2.0   pyformatc                   @   s   e Zd ZdZdS )r   z
    Exception that is the base class of all other error exceptions.
    You can use this to catch all errors with one single except statement.
    N)__name__
__module____qualname____doc__ r   r   g/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_sqlalchemy/drivers/native/connector.pyr      s    r   c                  O   s   t | i |S )z
    Make new connection.
    )
Connection)argskwargsr   r   r   connect   s   r   c                       s@   e Zd ZeZ fddZdd Zdd Zdd Zd	d
 Z	  Z
S )r   c                    s(   |d }| j || _tt|   d S Nr   )transport_clsfrom_url	transportsuperr   __init__)selfr   r   url	__class__r   r   r   "   s   zConnection.__init__c                 C      d S Nr   r   r   r   r   close'      zConnection.closec                 C   r   r   r   r   r   r   r   commit*   r!   zConnection.commitc                 C   r   r   r   r   r   r   r   rollback-   r!   zConnection.rollbackc                 C   s   t | S r   )Cursorr   r   r   r   cursor0   s   zConnection.cursor)r	   r
   r   DriverClientr   r   r    r"   r#   r%   __classcell__r   r   r   r   r      s    r   c                       s   e Zd ZdZG dd deZe Z fddZedd Z	edd	 Z
d
d Zdd Zd.ddZd/ddZd.ddZdd Zdd Zd0ddZdd Zedd Zejd d Zd!d" Zd.d#d$Zd1d&d'Zd(d) Zd*d+ Zd,d- Z  ZS )2r$   a  
    These objects represent a database cursor, which is used to manage
    the context of a fetch operation.

    Cursors are not isolated, i.e., any changes done to the database
    by a cursor are immediately visible by other cursors or connections.
    c                   @   s   e Zd Zed\ZZZdS )zCursor.Statesr   N)r	   r
   r   rangeNONERUNNINGFINISHEDr   r   r   r   States<   s    r,   c                    s&   || _ |   d| _tt|   d S )N   )_connection_reset_state
_arraysizer   r$   r   )r   
connectionr   r   r   r   E   s   zCursor.__init__c                 C      | j S r   )	_rowcountr   r   r   r   rowcountK      zCursor.rowcountc                 C   s(   | j pg }| jp	g }dd t||D S )Nc              	   S   s"   g | ]\}}||d d d d dfqS )NTr   ).0name	type_coder   r   r   
<listcomp>T   s    z&Cursor.description.<locals>.<listcomp>)_columns_typeszip)r   columnstypesr   r   r   descriptionO   s
   

zCursor.descriptionc                 C   s   | j j  d S r   )r.   r   
disconnectr   r   r   r   r    Y   s   zCursor.closec           
      C   s|   | d}|d u rd S g }|j}|D ])}g }|jD ]}|j|j|d}	||j|	f q||j||jd d d q|S )Nexternal_tables)type_expression
clickhousedata)r7   	structurerD   )gettype_compilerr=   processtypeappendr7   dialect_options)
r   dialectexecution_optionsrA   tablesrG   tablerE   ctype_r   r   r   make_external_tables\   s    


zCursor.make_external_tablesNc           	      C   s   |r|j }| |j|}ni }d }| jj}|j}t|dd }|dd| _|d}| jr=|r=|}|p4i }|dd|d< |||ddd	}||fS )
Nexecute_iterstream_resultsFsettingsmax_row_bufferi  max_block_sizetypes_check)rU   rA   rX   )	rM   rR   rL   r.   r   executegetattrrF   _stream_results)	r   contextrM   rA   r   rY   rS   rU   execute_kwargsr   r   r   _preparer   s,   



zCursor._preparec              
   C   sp   |    |   z| |\}}||f|dd|}W n ty, } zt|d }~ww | | |   d S )NT)paramswith_column_typesr/   _begin_queryr^   DriverErrorr   _process_response
_end_query)r   	operation
parametersr\   rY   r]   responseorigr   r   r   rY      s"   

zCursor.executec              
   C   sr   |    |   z| |\}}||fd|i|}W n ty+ } zt|d }~ww | j|dd |   d S )Nr_   T)executemanyra   )r   rf   seq_of_parametersr\   rY   r]   rh   ri   r   r   r   rj      s"   
zCursor.executemanyc                 C   s   | j | jjkrtdd S )NzNo query yet)_state_statesr)   RuntimeErrorr   r   r   r   check_query_started   s   zCursor.check_query_startedc                 C   s0   |    | jrt| jd S | jsd S | jdS r   )ro   r[   next_rowspopr   r   r   r   fetchone   s   zCursor.fetchoner-   c                 C   s@   |    | jrtt| j|S | jd | }| j|d  | _|S r   )ro   r[   listr   rq   )r   sizervr   r   r   	fetchmany   s   zCursor.fetchmanyc                 C   s(   |    | jrt| jS | j}g | _|S r   )ro   r[   rt   rq   )r   rv   r   r   r   fetchall   s   
zCursor.fetchallc                 C   r2   r   r0   r   r   r   r   	arraysize   r5   zCursor.arraysizec                 C   s
   || _ d S r   ry   )r   valuer   r   r   rz      s   
c                 C   r   r   r   )r   sizesr   r   r   setinputsizes   r!   zCursor.setinputsizesc                 C   r   r   r   )r   ru   columnr   r   r   setoutputsize   r!   zCursor.setoutputsizeFc                 C   sp   |r|| _ d }|sg  | _ | _| _d S | jrt|}|}n|\}}|r-t| \| _| _ng  | _| _|| _d S r   )r3   r:   r;   rq   r[   rp   r<   )r   rh   rj   columns_with_typesrowsr   r   r   rd      s   
zCursor._process_responsec                 C   s,   | j j| _d| _d| _d| _d| _d| _dS )zE
        Resets query state and get ready for another query.
        NF)rm   r)   rl   r:   r;   rq   r3   r[   r   r   r   r   r/      s   

zCursor._reset_statec                 C      | j j| _d S r   )rm   r*   rl   r   r   r   r   rb   
     zCursor._begin_queryc                 C   r   r   )rm   r+   rl   r   r   r   r   re     r   zCursor._end_queryr   )NN)r-   )F)r	   r
   r   r   objectr,   rm   r   propertyr4   r?   r    rR   r^   rY   rj   ro   rs   rw   rx   rz   setterr}   r   rd   r/   rb   re   r'   r   r   r   r   r$   4   s8    

	

 







r$   N)	itertoolsr   clickhouse_driver.clientr   r&   clickhouse_driver.errorsr   rc   
exceptionsr   apilevelthreadsafety
paramstyle	Exceptionr   r   r   r$   r   r   r   r   <module>   s    