o
    Zhf(                     @   sj  d dl 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mZmZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZmZ d dlm Z m!Z!m"Z"m#Z# zd d	lm$Z$ W n e%yp   e&d
e&fi Z$Y nw e" Z'zd dlm(Z( G dd de'Z)W n e%y   d dlm*Z* G dd de'Z)Y nw dedede+fddZ,G dd dee-e.f Z/dS )    N)Path)AnyAsyncGeneratorAsyncIteratorDict	GeneratorIteratorListOptionalSequenceTupleUnioncast)	BaseStore)LargeBinaryTextand_create_enginedeleteselect)Engine)AsyncEngineAsyncSessioncreate_async_engine)MappedSessiondeclarative_basesessionmaker)async_sessionmakerr   )mapped_columnc                   @   sX   e Zd ZU dZdZeddddZee e	d< eddddZ
ee e	d< eedddZd	S )
LangchainKeyValueStoresTable used to save values.langchain_key_value_storesTFZprimary_keyindexnullable	namespacekeyr$   r%   N)__name__
__module____qualname____doc____tablename__r   r&   r   str__annotations__r'   r   value r1   r1   V/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/storage/sql.pyr    3   s   
 r    )Columnc                   @   sF   e Zd ZdZdZee ddddZee ddddZee	dddZ
dS )r    r!   r"   TFr#   r(   N)r)   r*   r+   r,   r-   r3   r   r&   r'   r   r0   r1   r1   r1   r2   r    F   s    xyreturnc                 C   s   | |kS Nr1   )r4   r5   r1   r1   r2   items_equalT   s   r8   c                   @   s  e Zd ZdZddddddedeeeef  deeee	f  dee
eef  dee f
d	d
Zd/ddZd/ddZd/ddZdee deee  fddZdee deee  fddZdeeeef  ddfddZdeeeef  ddfddZdee deddfddZdee deddfdd Zdee ddfd!d"Zdee ddfd#d$Zdd%d&ee dee fd'd(Z dd%d&ee de!e fd)d*Z"e#j$de%eddf fd+d,Z&e#j'de(edf fd-d.Z)dS )0SQLStorea  BaseStore interface that works on an SQL database.

    Examples:
        Create a SQLStore instance and perform operations on it:

        .. code-block:: python

            from langchain_community.storage import SQLStore

            # Instantiate the SQLStore with the root path
            sql_store = SQLStore(namespace="test", db_url="sqlite://:memory:")

            # Set values for keys
            sql_store.mset([("key1", b"value1"), ("key2", b"value2")])

            # Get values for keys
            values = sql_store.mget(["key1", "key2"])  # Returns [b"value1", b"value2"]

            # Delete keys
            sql_store.mdelete(["key1"])

            # Iterate over keys
            for key in sql_store.yield_keys():
                print(key)

    N)db_urlengineengine_kwargs
async_moder&   r:   r;   r<   r=   c                C   s   |d u r|d u rt d|d ur|d urt d|r>|d u r d}|r0tddt|i|p,i }ntddt|i|p:i }n	|rC|}ntdt|trUd| _t|d}nd| _t	|d}|| _
|jj| _|| _|| _d S )	Nz$Must specify either db_url or enginez.Must specify either db_url or engine, not bothFurlz2Something went wrong with configuration of engine.Tbindr1   )
ValueErrorr   r.   r   AssertionError
isinstancer   r=   r   r   r;   dialectnamesession_makerr&   )selfr&   r:   r;   r<   r=   Z_engineZ_session_makerr1   r1   r2   __init__v   s4   	



zSQLStore.__init__r6   c                 C   s   t j| j d S r7   )Basemetadata
create_allr;   rG   r1   r1   r2   create_schema   s   zSQLStore.create_schemac              	      sj   t | jts	J | j 4 I d H }|tjjI d H  W d   I d H  d S 1 I d H s.w   Y  d S r7   )rC   r;   r   beginZrun_syncrI   rJ   rK   rG   sessionr1   r1   r2   acreate_schema   s
   .zSQLStore.acreate_schemac                 C   s   t jj| j d d S )Nr?   )rI   rJ   Zdrop_allr;   connectrL   r1   r1   r2   drop   s   zSQLStore.dropkeysc              	      s   t | jts	J i  |  4 I d H .}ttttj	|tj
| j
k}||I d H D ]}|j |j< q.W d   I d H  n1 I d H sGw   Y   fdd|D S )Nc                       g | ]}  |qS r1   get.0r'   resultr1   r2   
<listcomp>       z"SQLStore.amget.<locals>.<listcomp>)rC   r;   r   _make_async_sessionr   r    filterr   r'   in_r&   scalarsr0   rG   rT   rP   stmtvr1   rZ   r2   amget   s   

(	zSQLStore.amgetc                    s~   i  |   (}ttttj|tj| jk}||D ]}|j	 |j< qW d    n1 s1w   Y   fdd|D S )Nc                    rU   r1   rV   rX   rZ   r1   r2   r\      r]   z!SQLStore.mget.<locals>.<listcomp>)
_make_sync_sessionr   r    r_   r   r'   r`   r&   ra   r0   rb   r1   rZ   r2   mget   s   


	zSQLStore.mgetkey_value_pairsc              	      s      4 I d H -} dd |D |I d H  | fdd|D  | I d H  W d   I d H  d S 1 I d H s<w   Y  d S )Nc                 S   s   g | ]\}}|qS r1   r1   )rY   r'   _r1   r1   r2   r\      s    z"SQLStore.amset.<locals>.<listcomp>c                        g | ]\}}t  j||d qS )r&   r'   r0   r    r&   rY   krd   rL   r1   r2   r\          )r^   	_amdeleteadd_allcommit)rG   rh   rP   r1   rL   r2   amset   s   
.zSQLStore.amsetc                    sn   t |}  %} t| | | fdd| D  |  W d    d S 1 s0w   Y  d S )Nc                    rj   rk   rl   rm   rL   r1   r2   r\      ro   z!SQLStore.mset.<locals>.<listcomp>)dictrf   _mdeletelistrT   rq   itemsrr   )rG   rh   valuesrP   r1   rL   r2   mset   s   


"zSQLStore.msetrP   c                 C   s2   t tttj|tj| jk}|| d S r7   r   r    r_   r   r'   r`   r&   executerG   rT   rP   rc   r1   r1   r2   ru      s   

zSQLStore._mdeletec                    s:   t tttj|tj| jk}||I d H  d S r7   rz   r|   r1   r1   r2   rp      s   

zSQLStore._amdeletec                 C   sB   |   }| || |  W d    d S 1 sw   Y  d S r7   )rf   ru   rr   rG   rT   rP   r1   r1   r2   mdelete   s   

"zSQLStore.mdeletec              	      sd   |   4 I d H }| ||I d H  | I d H  W d   I d H  d S 1 I d H s+w   Y  d S r7   )r^   rp   rr   r}   r1   r1   r2   amdelete   s
   .zSQLStore.amdelete)prefixr   c                c   sv    |   ,}|ttj| jkD ]}t|j|pdr$t|jV  q|  W d    d S 1 s4w   Y  d S N )	rf   queryr    r_   r&   r.   r'   
startswithclose)rG   r   rP   rd   r1   r1   r2   
yield_keys   s   



"zSQLStore.yield_keysc             	   C  s   |   4 I d H 9}tttj| jk}||I d H D ]}t|j|p'dr/t|jV  q|	 I d H  W d   I d H  d S 1 I d H sHw   Y  d S r   )
r^   r   r    r_   r&   ra   r.   r'   r   r   )rG   r   rP   rc   rd   r1   r1   r2   ayield_keys	  s   
.zSQLStore.ayield_keysc                 c   sP    | j rtdtt|  }tt|V  W d   dS 1 s!w   Y  dS )Make an async session.zsAttempting to use a sync method in when async mode is turned on. Please use the corresponding async method instead.N)r=   rA   r   r   rF   rO   r1   r1   r2   rf     s   "zSQLStore._make_sync_sessionc              	   C  sd   | j stdtt|  4 I dH }tt|V  W d  I dH  dS 1 I dH s+w   Y  dS )r   ztAttempting to use an async method in when sync mode is turned on. Please use the corresponding async method instead.N)r=   rA   r   r   rF   rO   r1   r1   r2   r^     s   .zSQLStore._make_async_session)r6   N)*r)   r*   r+   r,   r.   r
   r   r   r   r   r   r   boolrH   rM   rQ   rS   r   r	   bytesre   rg   r   rs   ry   r   ru   r   rp   r~   r   r   r   r   r   
contextlibcontextmanagerr   rf   asynccontextmanagerr   r^   r1   r1   r1   r2   r9   Z   sD    

-

		  	

r9   )0r   pathlibr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   Zlangchain_core.storesr   Z
sqlalchemyr   r   r   r   r   r   Zsqlalchemy.engine.baser   Zsqlalchemy.ext.asyncior   r   r   Zsqlalchemy.ormr   r   r   r   r   ImportErrortyperI   r   r    r3   r   r8   r.   r   r9   r1   r1   r1   r2   <module>   s.    8 