o
    i3                     @  s  d dl m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 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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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-m0Z0 dd#l-m1Z2 dd$l-m3Z3 dd%l-m4Z4 ed&Z5ed'Z6	dedfd/d0Z7dgd5d6Z8dhd<d=Z9did@dAZ:ej;dBfej<dBfej=dBfej>dCffZ?djdGdHZ@dkdMdNZAdldQdRZBdmdUdVZCerFejDdd dWkr8ednd[d\ZEedod^d\ZEedpd_d\ZEdpd`d\ZEG dadb dbeZFG dcdd ddeZGdS )q    )annotationsN)	Awaitable)Callable)Iterable)List)Optional)overload)Tuple)Type)TYPE_CHECKING)TypeVar)	ParamSpec   AsyncExecutor)
Autocommit)
Connection)Cursor)IsolationLevel)LEGACY_TRANSACTION_CONTROL)OperationalErrorRawExecuteResult)SqlParameters   )LibsqlError)_expand_config)_config_to_url)	HranaConn)HranaStream_error_from_proto_value_to_proto)Batch)BatchResult)	BatchStep)Error)Stmt)
StmtResultPTsessionaiohttp.ClientSessionurlstr
auth_tokenreturnr   c              
   C  s   t ||d d}z|jdvrtd|jdt|}W n  ty; } z|jdkr6tt|}d|_d|_| d }~ww t	| ||j
S )N)r0   tls)wswssz6Only 'libsql', 'ws' and 'wss' URLs are supported, got URL_INVALID   SQLITE_CANTOPEN)r   schemer   r   coder   r/   sqlite_errorcodesqlite_errornamer   r0   )r,   r.   r0   confige
sqlite_err r?   N/home/ubuntu/.local/lib/python3.10/site-packages/libsql_client/dbapi2/hrana.py_create_hrana_connection7   s(   

rA   stmtr(   sql_idintc                 C  s   | d= || d< | S )NsqlrC   r?   )rB   rC   r?   r?   r@   _conv_stmt_plain_to_storedQ   s   rF   rE   
parametersr   	want_rowsboolc                 C  sj   | |d}t |tjjrdd | D |d< |S |r3g }tt|D ]}|t||  q#||d< |S )NrE   rH   c                 S  s   g | ]\}}|t |d qS ))namevaluer"   ).0kvr?   r?   r@   
<listcomp>a   s    z_conv_stmt.<locals>.<listcomp>
named_argsargs)	
isinstancecollectionsabcMappingitemsrangelenappendr#   )rE   rG   rH   rB   rR   ir?   r?   r@   
_conv_stmtW   s   
r\   Iterable[SqlParameters]
List[Stmt]c                   s    fdd|D S )Nc                   s   g | ]}t  |qS r?   )r\   )rM   prJ   r?   r@   rP   t   s    z_conv_stmts.<locals>.<listcomp>r?   )rE   rG   rH   r?   rJ   r@   _conv_stmtso   s   r`   r7   SQLITE_IOERRerroraiohttp.ClientErrorTuple[int, str]c                 C  s4   t D ]\}}t| |rttj|}||f  S qdS )N)r    )_aiohttp_error_maprS   getattrsqlite3dbapi2)rb   	error_cls
error_name
error_coder?   r?   r@   _get_aiohttp_client_error_code   s   
rm   resultOptional[StmtResult]Optional[BaseException]r   c                 C  sB   t |tjrt|\}}tt|}|r||_||_t| g|gS N)	rS   aiohttpClientErrorrm   r   r/   r:   r;   r   )rn   rb   r9   rK   r?   r?   r@   _conv_stmt_result   s   rt   stmtsr$   c                 C  sP   g }t | D ]\}}|dkr|d|i q|d|d d|d qd|iS )Nr   rB   okr   )typestep)	conditionrB   steps)	enumeraterZ   )ru   rz   r[   rB   r?   r?   r@   _conv_batch   s   r|   respr%   c                   s.   ddd  fdd| d	 D }t | d
 |S )Nr=   Optional[ErrorResult]r1   rp   c                 S  s   | d u rd S t | S rq   r    )r=   r?   r?   r@   conv_err   s   z$_conv_batch_result.<locals>.conv_errc                   s   g | ]} |qS r?   r?   )rM   r=   r   r?   r@   rP      s    z&_conv_batch_result.<locals>.<listcomp>step_errorsstep_results)r=   r~   r1   rp   r   )r}   errorsr?   r   r@   _conv_batch_result   s   
r   )   	   fn)Callable[P, Awaitable[asyncio.Future[T]]]Callable[P, T]c                 C     d S rq   r?   r   r?   r?   r@   run_in_executor   s   r   Callable[P, Awaitable[T]]c                 C  r   rq   r?   r   r?   r?   r@   r         c                 C  r   rq   r?   r   r?   r?   r@   r      r   c                   s   d
 fdd}|S )aK  ConnectionHrana method decorator that runs code in the executor thread.

    This will execute the decorated method body inside the
    :py:class:`AsyncExecutor` thread by doing a ``AsyncExecutor.submit()``
    and then ``future.result(timeout)``.

    The method itself will block until the executor runs.

    :meta private:
    rR   P.argskwargsP.kwargsr1   r+   c                    sL   | d }t |tsJ |jd usJ |jj g| R i |}|j|jdS )Nr   )timeout)rS   ConnectionHrana	_executorsubmitrn   _timeout)rR   r   selffuturer   r?   r@   wrapper   s
   z run_in_executor.<locals>.wrapperN)rR   r   r   r   r1   r+   r?   )r   r   r?   r   r@   r      s   	c                      s,  e Zd ZU dZded< ded< ded< ded	< d
ed< dZded< dddddddefdW fd$d%ZdXd&d'ZdYd)d*Z	dZd,d-Z
ed[d/d0Zed\d2d3Zed]d6d7Zed^d9d:Zed_d<d=Zed`d?d@ZedadDdEZedbdGdHZedcdJdKZedddNdOZededSdTZdXdUdVZ  ZS )fr   zImplement :py:class:`sqlite3.Connection` for remote servers
    using the `Hrana Protocol
    <https://github.com/libsql/sqld/blob/main/docs/HRANA_2_SPEC.md>`_.
    zOptional[AsyncExecutor]r   zOptional[aiohttp.ClientSession]_sessionzOptional[HranaConn]_connzOptional[HranaStream]_streamzType['CursorHrana']cursor_factoryre   r/   r0   Ng      @r   T   Fdatabaser   floatdetect_typesrD   isolation_levelOptional[IsolationLevel]check_same_threadrI   cached_statementsuri
autocommitr   r1   Nonec
           
   	     s,   |sJ || _ t j|||||||	d d S )N)r   r   r   r   r   r   r   )r0   super__init__)
r   r   r0   r   r   r   r   r   r   r   	__class__r?   r@   r      s   
zConnectionHrana.__init__c                 C  sR   t | _z|  | _|  | _| | j| _| 	 | _
W d S  ty(   |    w rq   )CursorHranar   _acquire_executorr   _acquire_sessionr   _acquire_connection	_databaser   _create_streamr   	Exception
_raw_closer   r?   r?   r@   	_raw_init  s   

zConnectionHrana._raw_initr   c                 C  s   t  S rq   r   r   r?   r?   r@   r     s   z!ConnectionHrana._acquire_executorexecutorc                 C  s   |   d S rq   )shutdown)r   r   r?   r?   r@   _dispose_executor  s   z!ConnectionHrana._dispose_executorr-   c                 C  s   t  S rq   )rr   ClientSessionr   r?   r?   r@   r     s   z ConnectionHrana._acquire_sessionr,   c                      |  I d H  d S rq   close)r   r,   r?   r?   r@   _dispose_session     z ConnectionHrana._dispose_sessionr.   r   c              
     s|   | j d usJ t| j || j}z
| I d H  |W S  ty= } z| I d H  td |jd }|d us7J |d }~ww )Nr   )r   rA   r0   wait_connectedr   r   rt   r   )r   r.   connrb   excr?   r?   r@   r     s   z#ConnectionHrana._acquire_connectionr   c                   r   rq   r   )r   r   r?   r?   r@   _dispose_connection(  r   z#ConnectionHrana._dispose_connectionr   c                 C  s(   | j d usJ | j  }| d| |S )Nzcreated stream: %s)r   open_stream_infr   streamr?   r?   r@   r   ,  s   
zConnectionHrana._create_streamr   c                 C  s   |  d| |  d S )Nzclosing stream: %s)r   r   r   r?   r?   r@   _destroy_stream3  s   zConnectionHrana._destroy_streamrB   r(   asyncio.Future[StmtResult]c                 C     | j d usJ | j |S rq   )r   execute)r   rB   r?   r?   r@   _raw_execute8     zConnectionHrana._raw_executerE   c                 C  r   rq   )r   	store_sql)r   rE   r?   r?   r@   _raw_store_sql=  r   zConnectionHrana._raw_store_sqlrC   c                 C  r   rq   )r   	close_sql)r   rC   r?   r?   r@   _raw_close_sqlB  r   zConnectionHrana._raw_close_sql
sql_scriptasyncio.Future[None]c                 C  r   rq   )r   sequencer   r   r?   r?   r@   _raw_execute_scriptG  r   z#ConnectionHrana._raw_execute_scriptbatchr$   asyncio.Future[BatchResult]c                 C  r   rq   )r   r   )r   r   r?   r?   r@   
_raw_batchL  r   zConnectionHrana._raw_batchc                 C  s   t | dd }|d ur| | d | _t | dd }|d ur$| | d | _t | dd }|d ur6| | d | _t | dd }|d urJ| | d | _d S d S )Nr   r   r   r   )	rg   r   r   r   r   r   r   r   r   )r   r   r   r,   r   r?   r?   r@   r   Q  s"   




zConnectionHrana._raw_close)r   r/   r0   r/   r   r   r   rD   r   r   r   rI   r   rD   r   rI   r   r   r1   r   r1   r   )r1   r   )r   r   r1   r   )r1   r-   )r,   r-   r1   r   )r.   r/   r1   r   )r   r   r1   r   )r1   r   )r   r   r1   r   )rB   r(   r1   r   )rE   r/   r1   rD   )rC   rD   r1   r   )r   r/   r1   r   )r   r$   r1   r   )__name__
__module____qualname____doc____annotations__r0   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r?   r?   r   r@   r      sV   
 


r   c                   @  sR   e Zd ZU dZded< ddd	Zd ddZddd!ddZd"ddZd#ddZ	dS )$r   zImplement :py:class:`sqlite3.Cursor` for remote servers
    using the `Hrana Protocol
    <https://github.com/libsql/sqld/blob/main/docs/HRANA_2_SPEC.md>`_.
    r   
connectionrB   r(   r1   r   c              
   C  sd   z| j jd ur| j |d  | j |}t|d W S  ty1 } ztd |W  Y d }~S d }~ww )NrE   )r   _trace_callback_tracer   rt   r   )r   rB   rn   rb   r?   r?   r@   _raw_execute_onep  s   zCursorHrana._raw_execute_oneru   r^   c                   s2  d  zzP|d d }| j |  d usJ  fdd|D }| j t|}| j jd ur8|D ]}| j | q/t|W W  d urSz| j   W S  tyR   Y S w S  ty } z"t	d |W  Y d }~W  d ur|z| j   W S  ty{   Y S w S d }~ww  d urz| j   W w  ty   Y w w w )Nr   rE   c                   s   g | ]}t | qS r?   )rF   )rM   rB   rC   r?   r@   rP     s    
z5CursorHrana._raw_execute_multiple.<locals>.<listcomp>)
r   r   r   r|   r   r   r   r   r   rt   )r   ru   rE   stored_stmtsrn   rB   rb   r?   r   r@   _raw_execute_multipley  sL   

z!CursorHrana._raw_execute_multipleT)rH   rE   r/   rG   r]   rH   rI   c                C  sF   t |||}t|dkr| |d S t|dkr| |S tg g S )Nr   r   )r`   rY   r   r   r   )r   rE   rG   rH   ru   r?   r?   r@   r     s   

zCursorHrana._raw_executer   r   c                 C  s   | j | d S rq   )r   r   r   r?   r?   r@   r     s   zCursorHrana._raw_execute_scriptc                 C  r   rq   r?   r   r?   r?   r@   r     s   zCursorHrana._raw_closeN)rB   r(   r1   r   )ru   r^   r1   r   )rE   r/   rG   r]   rH   rI   r1   r   )r   r/   r1   r   r   )
r   r   r   r   r   r   r   r   r   r   r?   r?   r?   r@   r   h  s   
 

	
r   rq   )r,   r-   r.   r/   r0   r/   r1   r   )rB   r(   rC   rD   r1   r(   )rE   r/   rG   r   rH   rI   r1   r(   )rE   r/   rG   r]   rH   rI   r1   r^   )rb   rc   r1   rd   )rn   ro   rb   rp   r1   r   )ru   r^   r1   r$   )r}   r%   r1   r   )r   r   r1   r   )r   r   r1   r   )r   r   r1   r   )H
__future__r   asynciocollections.abcrT   sqlite3.dbapi2rh   systypingr   r   r   r   r   r   r	   r
   r   r   rr   typing_extensionsr   _async_executorr   typesr   r   r   r   r   r   r   r   clientr   r<   r   hrana.clientr   
hrana.connr   r   hrana.convertr!   r#   hrana.protor$   r%   r&   r'   ErrorResultr(   r)   r*   r+   rA   rF   r\   r`   
InvalidURLClientConnectionErrorClientResponseErrorClientPayloadErrorrf   rm   rt   r|   r   version_infor   r   r   r?   r?   r?   r@   <module>   s    	


	






 