
    љi                         S SK r S SKJrJrJr  S SKrS SKrS SKJrJrJ	r	J
r
Jr  S SKrSSKJr  \R                  " \5      r " S S\5      rg)    N)datetimetimezone	timedelta)ListDictUnionCallable	Awaitable   )ContextManagerc                   *   \ rS rSrSSSSSSSSSS	S
.
S\/ \\R                     4   S\S\	S\S\S\S\S\	S\	S\	4S jjr
S\R                  4S jrS\R                  4S jrS"S\\\\   4   S\	S\\   4S jjrS#S\S\\   S\4S jjrS\S\4S  jrS!rg)$PostgreSQLContextManager   N	localhosti8  aiavatarpostgresi        )
get_poolhostportdbnameuserpasswordconnection_strcontext_timeoutdb_pool_min_sizedb_pool_max_sizer   r   r   r   r   r   r   r   r   r   c       
             Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        S U l
        [        R                  " 5       U l        SU l        g )NF)_get_pool_funcr   r   r   r   r   r   r   r   r   _poolasyncioLock
_pool_lock_db_initialized)selfr   r   r   r   r   r   r   r   r   r   s              c/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/llm/context_manager/postgres.py__init__!PostgreSQLContextManager.__init__   sW     '			 ,. 0 0#'
!,,.$    returnc                   #    U R                   b  U R                  5       I S h  vN nU R                  (       dX  U R                   IS h  vN   U R                  (       d   U R                  U5      I S h  vN   SU l        S S S 5      IS h  vN   U$ U$ U R                  b  U R                  $ U R                   IS h  vN   U R                  b  U R                  sS S S 5      IS h  vN   $ U R
                  (       aB  [        R                  " U R
                  U R                  U R                  S9I S h  vN U l        Om[        R                  " U R                  U R                  U R                  U R                  U R                  U R                  U R                  S9I S h  vN U l        U R                  U R                  5      I S h  vN   SU l        S S S 5      IS h  vN   U R                  $  GN GN GN GNp! , IS h  vN  (       d  f       U$ = f GN\ GN6 N N~ NX NC! , IS h  vN  (       d  f       U R                  $ = f7f)NT)dsnmin_sizemax_size)r   r   databaser   r   r.   r/   )r    r%   r$   init_dbr!   r   asyncpgcreate_poolr   r   r   r   r   r   r   )r&   pools     r'   r   !PostgreSQLContextManager.get_pool)   s    *,,..D''???//"ll4000/3, +? K4K ::!::???zz%zz #?? ""#*#6#6++!22!22$ 
 $+#6#6![[!]]!22!22$ 
 ,,tzz***#'D + #?. zzG /*0 +??? K #
 +) #??. zzs  !IG1%I	G4
I&G=3G74G=?I
G:1I<H=I H&I%H&I+AH&3H4A-H&!H "'H&	H"
H&I H$!I4I7G=:I=HHH	IIH& H&"H&$I&I,H/-I9Ir4   c                 f  #    UR                  5        IS h  vN n UR                  S5      I S h  vN   UR                  S5      I S h  vN   S S S 5      IS h  vN   g  NH N0 N! [         a"  n[        R	                  SU 35         S nAN>S nAff = f N:! , IS h  vN  (       d  f       g = f7f)Naf  
                    CREATE TABLE IF NOT EXISTS chat_histories (
                        id SERIAL PRIMARY KEY,
                        created_at TIMESTAMP NOT NULL,
                        context_id TEXT NOT NULL,
                        serialized_data JSON NOT NULL,
                        context_schema TEXT
                    )
                    z
                    CREATE INDEX IF NOT EXISTS idx_chat_histories_context_id_created_at
                    ON chat_histories (context_id, created_at)
                    zError at init_db: )acquireexecute	Exceptionlogger	exception)r&   r4   connexs       r'   r1    PostgreSQLContextManager.init_dbQ   s     <<>>T<ll
 
 
 ll   ">>
  <  #5bT!:;;<+ ">>>s   B1A B1BA&A"A&
A$A&B1BB1"A&$A&&
B0BBBBB1B.B B.*B1
context_idlimitc           
      J  #    U R                  5       I S h  vN nUR                  5        IS h  vN n U(       d  [        S5      e/ n/ nSn[        U[        [
        45      (       ao  SR                  [        Xw[        U5      -   5       Vs/ s H  nSU 3PM
     sn5      n	UR                  SU	 S35        UR                  U5        U[        U5      -  nO*UR                  SU 35        UR                  U5        US-  nU R                  S:  ao  UR                  S	U 35        [        R                  " [        R                  5      R!                  S S
9[#        U R                  S9-
  n
UR                  U
5        US-  nUR                  U5        SSR                  U5       SU S3nUR$                  " U/UQ76 I S h  vN n[	        ['        U5      5      n/ nU HD  nUS   n[        U[(        5      (       a  [*        R,                  " U5      nUR                  U5        MF     UsS S S 5      IS h  vN   $  GN! GNs  snf  N N! [.         a6  n[0        R3                  SU 35        / s S nAsS S S 5      IS h  vN    $ S nAff = f! , IS h  vN  (       d  f       g = f7f)Nzcontext_id is requiredr   ,$zcontext_id IN ()zcontext_id = $r   zcreated_at >= $tzinfo)secondszb
                SELECT serialized_data
                FROM chat_histories
                WHERE z AND z9
                ORDER BY id DESC
                LIMIT $z
                serialized_datazError at get_histories: )r   r7   
ValueError
isinstancelisttuplejoinrangelenappendextendr   r   nowr   utcreplacer   fetchreversedstrjsonloadsr9   r:   r;   )r&   r?   r@   r4   r<   where_clausesparamsparam_indexiplaceholderscutoff_timesqlrowsresultsrowdatar=   s                    r'   get_histories&PostgreSQLContextManager.get_historiesj   s[    ]]_$<<>>T0!$%=>> "j4-88#&88eK_bcm_nQn>o,p>oqW>o,p#qL!((?<.)JKMM*-3z?2K!((>+)GHMM*-1$K''!+!((?;-)HI"*,,x||"<"D"DD"D"QT]fjfzfzT{"{KMM+.1$Ke$ ||M23 4#} % "ZZ5f55HTN+C01D!$,,#zz$/NN4(	  
 [ ">> %! -q4 6I "^    #;B4!@A	c ">>^_ ">>s   J#H7J#H:J#J	AIH=
D$I?I A%I%J#1I2J#:J#=IJ#
JJ)J*J	.J#:I=;J#JJ		J JJ J#	data_listcontext_schemac           	      D  #    U(       d  g U R                  5       I S h  vN nUR                  5        IS h  vN n Sn[        R                  " [        R
                  5      R                  S S9n/ nU H-  n	UU[        R                  " U	SS9U4n
UR                  U
5        M/     UR                  Xh5      I S h  vN   S S S 5      IS h  vN   g  N N N! [         a"  n[        R                  SU 35         S nAN>S nAff = f N:! , IS h  vN  (       d  f       g = f7f)Nz
                    INSERT INTO chat_histories (created_at, context_id, serialized_data, context_schema)
                    VALUES ($1, $2, $3, $4)
                rE   F)ensure_asciizError at add_histories: )r   r7   r   rR   r   rS   rT   rX   dumpsrP   executemanyr9   r:   r;   )r&   r?   rg   rh   r4   r<   	sql_querynow_utcrecords	data_itemrecordr=   s               r'   add_histories&PostgreSQLContextManager.add_histories   s     ]]_$<<>>TB	
 #,,x||4<<D<I!*I"

95A&	F NN6* "+ &&y:::% ">> %!$ ; B  #;B4!@AAB) ">>>s   D CD CD DA<C9C:C>D 	D
D D C
DC<7D<DDD DDDD c                   #    U R                  5       I S h  vN nUR                  5        IS h  vN n SnUR                  XA5      I S h  vN nU(       aZ  US   (       aP  US   nUR                  c  UR	                  [
        R                  S9nOKUR                  [
        R                  5      nO+[        R                  R	                  [
        R                  S9nUsS S S 5      IS h  vN   $  N N N N! [         a_  n[        R                  SU 35        [        R                  R	                  [
        R                  S9s S nAsS S S 5      IS h  vN    $ S nAff = f! , IS h  vN  (       d  f       g = f7f)Nz
                SELECT created_at
                FROM chat_histories
                WHERE context_id = $1
                ORDER BY id DESC
                LIMIT 1
                
created_atrE   zError at get_last_created_at: )r   r7   fetchrowrF   rT   r   rS   
astimezoner   minr9   r:   r;   )r&   r?   r4   r<   r`   rc   last_created_atr=   s           r'   get_last_created_at,PostgreSQLContextManager.get_last_created_at   s    ]]_$<<>>TA !MM#::3|,&),&7O&--5*9*A*A*A*V*9*D*DX\\*R&.ll&:&:(,,&:&OO&+ ">> %! ; ".  A  #A"!FG||++8<<+@@3 ">>.A/ ">>s   E=C/E=C1E=E#C7C3BC7E=)C5*E=1E=3C75E=7
E AEE E#E=EE=E  E##E:)E,*E:6E=)r%   r    r!   r$   r   r   r   r   r   r   r   r   r   )d   )N)__name__
__module____qualname____firstlineno__r	   r
   r2   PoolrW   intr(   r   r1   r   r   r   re   rr   r   rz   __static_attributes__ r*   r'   r   r      s'    ;? "# ! !% 2y667% 	%
 % % % % % % % %8& &P<',, <23eCcN.C 3C 3Z^_cZd 3jBc Bd4j BZ] B8AC AH Ar*   r   )r"   r   r   r   rX   loggingtypingr   r   r   r	   r
   r2   baser   	getLoggerr}   r:   r   r   r*   r'   <module>r      s@     2 2   9 9  !			8	$JA~ JAr*   