
    3fi                         d dl Z d dlZd dlmZ d dl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 d dlmZ d dlmZ  ej&                  e      Z G d	 d
e      Zy)    N)datetime)ListOptional)BaseChatMessageHistory)BaseMessagemessage_to_dictmessages_from_dict)create_enginetext)SQLAlchemyError)sessionmakerc            
           e Zd ZdZ	 	 ddedededee   fdZdd	Zdd
Z	e
dee   fd       ZdeddfdZddZddZddZy)TiDBChatMessageHistoryzF
    Represents a chat message history stored in a TiDB database.
    N
session_idconnection_string
table_nameearliest_timec                     || _         || _        || _        g | _        t	        |      | _        t        | j
                        } |       | _        | j                          | j                          y)a  
        Initializes a new instance of the TiDBChatMessageHistory class.

        Args:
            session_id (str): The ID of the chat session.
            connection_string (str): The connection string for the TiDB database.
                format: mysql+pymysql://<host>:<PASSWORD>@<host>:4000/<db>?ssl_ca=/etc/ssl/cert.pem&ssl_verify_cert=true&ssl_verify_identity=true
            table_name (str, optional): the table name to store the chat messages.
                Defaults to "langchain_message_store".
            earliest_time (Optional[datetime], optional): The earliest time to retrieve messages from.
                Defaults to None.
        )bindN)
r   r   r   cacher
   enginer   session_create_table_if_not_exists_load_messages_to_cache)selfr   r   r   r   Sessions         m/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/chat_message_histories/tidb.py__init__zTiDBChatMessageHistory.__init__   s_    ( %$*
 $$56DKK0y((*$$&    returnc                 2   t        d| j                   d      }	 | j                  j                  |       | j                  j	                          y# t
        $ r<}t        j                  d|        | j                  j                          Y d}~yd}~ww xY w)zO
        Creates a table if it does not already exist in the database.
        z(
            CREATE TABLE IF NOT EXISTS a   (
                id INT AUTO_INCREMENT PRIMARY KEY,
                session_id VARCHAR(255) NOT NULL,
                message JSON NOT NULL,
                create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                INDEX session_idx (session_id)
            );zError creating table: N)	r   r   r   executecommitr   loggererrorrollback)r   create_table_queryes      r   r   z2TiDBChatMessageHistory._create_table_if_not_exists5   s    
 "((,'8 9	
	$LL  !34LL! 	$LL1!56LL!!##	$s   5A 	B2BBc                    | j                   rd| j                    dnd}t        d| j                   d| d      }	 | j                  j	                  |d| j
                  i      }|j                         D ]B  }t        j                  |d         }| j                  j                  t        |g      d          D y
# t        $ r"}t        j                  d	|        Y d
}~y
d
}~ww xY w)a4  
        Loads messages from the database into the cache.

        This method retrieves messages from the database table. The retrieved messages
        are then stored in the cache for faster access.

        Raises:
            SQLAlchemyError: If there is an error executing the database query.

        zAND create_time >= '' z!
            SELECT message FROM z- 
            WHERE session_id = :session_id z# 
            ORDER BY id;
        r   r   z!Error loading messages to cache: N)r   r   r   r   r"   r   fetchalljsonloadsr   appendr	   r   r$   r%   )r   time_conditionqueryresultrecordmessage_dictr(   s          r   r   z.TiDBChatMessageHistory._load_messages_to_cacheK   s     =A<N<N"4#5#5"6a8TV 	 !!% 1 2,,:+; <	
	B\\))%,1PQF //+ I#zz&)4

!!"4l^"DQ"GHI  	BLL<QC@AA	Bs   A=B: :	C%C  C%c                 j    t        | j                        dk(  r| j                          | j                  S )zreturns all messagesr   )lenr   reload_cacher   s    r   messageszTiDBChatMessageHistory.messagesh   s*     tzz?azzr   messagec           	         t        d| j                   d      }	 | j                  j                  || j                  t        j                  t        |            d       | j                  j                          | j                  j                  |       y# t        $ r<}t        j                  d|        | j                  j                          Y d}~yd}~ww xY w)z(adds a message to the database and cachezINSERT INTO z6 (session_id, message) VALUES (:session_id, :message);)r   r:   zError adding message: N)r   r   r   r"   r   r-   dumpsr   r#   r   r/   r   r$   r%   r&   )r   r:   r1   r(   s       r   add_messagez"TiDBChatMessageHistory.add_messageo   s    4??++ab
	$LL  "&//#zz/'*BC LL!JJg& 	$LL1!56LL!!##	$s   A:B 	C2CCc                    t        d| j                   d      }	 | j                  j                  |d| j                  i       | j                  j                          | j                  j                          y# t        $ r<}t        j                  d|        | j                  j                          Y d}~yd}~ww xY w)zclears all messageszDELETE FROM z  WHERE session_id = :session_id;r   zError clearing messages: N)r   r   r   r"   r   r#   r   clearr   r$   r%   r&   )r   r1   r(   s      r   r?   zTiDBChatMessageHistory.clear   s    |DOO#44TUV	$LL  t(GHLL!JJ 	$LL4QC89LL!!##	$s   AA8 8	B=2B88B=c                 X    | j                   j                          | j                          y)z'reloads messages from database to cacheN)r   r?   r   r8   s    r   r7   z#TiDBChatMessageHistory.reload_cache   s    

$$&r   c                 8    | j                   j                          y)zcloses the sessionN)r   closer8   s    r   __del__zTiDBChatMessageHistory.__del__   s    r   )langchain_message_storeN)r    N)__name__
__module____qualname____doc__strr   r   r   r   r   propertyr   r   r9   r=   r?   r7   rC    r   r   r   r      s     4,0'' ' 	'
  )'B$,B: ${+  $; $4 $&	$'
r   r   )r-   loggingr   typingr   r   langchain_core.chat_historyr   langchain_core.messagesr   r   r	   
sqlalchemyr
   r   sqlalchemy.excr   sqlalchemy.ormr   	getLoggerrE   r$   r   rK   r   r   <module>rT      sD       ! > T T * * '			8	$E3 Er   