o
    i                     @  s(  d dl mZ d dlZd dlmZ d dlmZ d dlm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 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 d"ddZd#ddZG dd deZ G d d! d!eZ!dS )$    )annotationsN)List)Optional)Set   )proto)	HranaConn)HranaStream)_batch_results_from_proto)_batch_to_proto)_result_set_from_proto)_stmt_to_proto   )Client)InArgs)InStatement)LibsqlError)Transaction)_Config)	ResultSetconfigr   returnHranaClientc                 C  s"   | j dv sJ t| }t|| jS )N)wswss)scheme_config_to_urlr   
auth_token)r   url r   N/home/ubuntu/.local/lib/python3.10/site-packages/libsql_client/hrana/client.py_create_hrana_client   s   r!   strc                 C  sR   | j dkr| jrtdd| j dkr| jstddtj| j | j| jdddfS )Nr   z/A 'ws:' URL cannot opt into TLS by using ?tls=1URL_INVALIDr   z2A 'wss:' URL cannot opt out of TLS by using ?tls=0 )r   tlsr   urllibparse
urlunparse	authoritypath)r   r   r   r    r   !   s"   r   c                   @  s   e Zd ZU ded< ded< ded< ded< d	ed
< ded< d,ddZd-d.ddZd/ddZd0d d!Zd1d#d$Zd2d%d&Z	d3d(d)Z
ed4d*d+ZdS )5r   zaiohttp.ClientSession_sessionr   _connzSet[asyncio.Task[None]]_close_tasksr"   _urlOptional[str]_auth_tokenbool_closedr   r   c                 C  s2   t  | _t | _|| _|| _|  | _d| _	d S )NF)
aiohttpClientSessionr+   setr-   r.   r0   
_open_connr,   r2   )selfr   r   r   r   r    __init__?   s   


zHranaClient.__init__Nstmtr   argsr   r   r   c                   sL   |   }t||}||}W d    n1 sw   Y  t|I d H S N)_open_streamr   executer   )r7   r9   r:   stream
proto_stmtproto_result_futr   r   r    r=   G   s   

zHranaClient.executestmtsList[InStatement]List[ResultSet]c                   sP   |   }t|}||}W d    n1 sw   Y  t|I d H t|S r;   )r<   r   batchr
   len)r7   rA   r>   proto_batchr@   r   r   r    rD   M   s   
zHranaClient.batchHranaTransactionc                 C  s   |   }t|S r;   )r<   rG   r7   r>   r   r   r    transactionS   s   zHranaClient.transactionr	   c                 C  sZ   | j rtdd| jjd ur(t| j }| j| |	| jj
 |  | _| j S )NzThe client is closedCLIENT_CLOSED)r2   r   r,   	exceptionasynciocreate_taskcloser-   addadd_done_callbackdiscardr6   open_stream)r7   
close_taskr   r   r    r<   W   s   


zHranaClient._open_streamc                 C  s   t | j| j| jS r;   )r   r+   r.   r0   r7   r   r   r    r6   c   s   zHranaClient._open_connNonec                   sV   | j  I d H  t| jdkrtjt| jtjdI d H  | j I d H  d| _	d S )Nr   )return_whenT)
r,   rN   rE   r-   rL   waitlistALL_COMPLETEDr+   r2   rT   r   r   r    rN   f   s   
zHranaClient.closec                 C  s   | j S r;   )r2   rT   r   r   r    closedo   s   zHranaClient.closed)r   r"   r   r/   r;   r9   r   r:   r   r   r   )rA   rB   r   rC   )r   rG   )r   r	   )r   r   r   rU   r   r1   )__name__
__module____qualname____annotations__r8   r=   rD   rI   r<   r6   rN   propertyrZ   r   r   r   r    r   7   s    
 





	c                   @  s`   e Zd ZU ded< ded< dddZddddZdddZdddZdddZe	dddZ
dS ) rG   r	   _streamz asyncio.Future[proto.StmtResult]
_begin_futr>   c                 C  s   || _ |ddd| _d S )NBEGINFsql	want_rows)rc   r=   rd   rH   r   r   r    r8   x   s   
zHranaTransaction.__init__Nr9   r   r:   r   r   r   c                   sD   | j I d H  | jjrtddt||}| j|I d H }t|S )NThe transaction is closedTRANSACTION_CLOSED)rd   rc   rZ   r   r   r=   r   )r7   r9   r:   r?   proto_resultr   r   r    r=      s   

zHranaTransaction.executerU   c                   sD   | j I d H  | jjrd S | jddd}| j  |I d H  d S )NROLLBACKFrf   )rd   rc   rZ   r=   rN   r7   futr   r   r    rollback   s   
zHranaTransaction.rollbackc                   sJ   | j I d H  | jjrtdd| jddd}| j  |I d H  d S )Nri   rj   COMMITFrf   )rd   rc   rZ   r   r=   rN   rm   r   r   r    commit   s   

zHranaTransaction.commitc                 C  s   | j   d S r;   )rc   rN   rT   r   r   r    rN      s   zHranaTransaction.closer1   c                 C  s   | j jS r;   )rc   rZ   rT   r   r   r    rZ      s   zHranaTransaction.closed)r>   r	   r;   r[   r\   r]   )r^   r_   r`   ra   r8   r=   ro   rq   rN   rb   rZ   r   r   r   r    rG   t   s   
 
	
	

rG   )r   r   r   r   )r   r   r   r"   )"
__future__r   rL   typingr   r   r   urllib.parser&   r3   r$   r   connr   r	   convertr
   r   r   r   clientr   r   r   r   r   r   r   resultr   r!   r   r   rG   r   r   r   r    <module>   s2    

=