
    љ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Jr  \R                   " \5      r " S S\5      rg)    N)datetimetimezone	timedelta)OptionalDictAnyCallable	Awaitable   )SessionStateSessionStateManagerc                   n   \ rS rSrSSSSSSSSSS	S
S.S\/ \\R                     4   S\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 jrS\S\S\SS4S  jrS\S!\S"\\   S#\\\\4      SS4
S$ jrS\SS4S% jrS+S&\	SS4S' jjrS(\S\\   4S) jrS*rg),PostgreSQLSessionStateManager   N	localhosti8  aiavatarpostgres  <   r      )get_poolhostportdbnameuserpasswordconnection_strsession_timeout	cache_ttldb_pool_min_sizedb_pool_max_sizer   r   r   r   r   r   r   r   r   r    r!   c                    Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        0 U l	        Xl
        Xl        S U l        [        R                  " 5       U l        SU l        g )NF)_get_pool_funcr   r   r   r   r   r   r   r   cacher    r!   _poolasyncioLock
_pool_lock_db_initialized)selfr   r   r   r   r   r   r   r   r   r    r!   s               e/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/session_state_manager/postgres.py__init__&PostgreSQLSessionStateManager.__init__   sc     '			 ,.".0
 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   r2   r3   )r#   r)   r(   init_dbr%   r   asyncpgcreate_poolr    r!   r   r   r   r   r   )r*   pools     r+   r   &PostgreSQLSessionStateManager.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r8   c                   #    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   UR                  S5      I S h  vN   S S S 5      IS h  vN   g  Na NI N2 N! [         a  n[        R	                  SU 35        e S nAff = f N8! , IS h  vN  (       d  f       g = f7f)Na*  
                    CREATE TABLE IF NOT EXISTS session_states (
                        session_id TEXT PRIMARY KEY,
                        active_transaction_id TEXT,
                        previous_request_timestamp TIMESTAMP,
                        previous_request_text TEXT,
                        previous_request_files JSON,
                        timestamp_inserted_at TIMESTAMP NOT NULL,
                        updated_at TIMESTAMP NOT NULL,
                        created_at TIMESTAMP NOT NULL
                    )
                    z
                    ALTER TABLE session_states
                    ADD COLUMN IF NOT EXISTS timestamp_inserted_at TIMESTAMP NOT NULL DEFAULT '0001-01-01 00:00:00'
                    z
                    CREATE INDEX IF NOT EXISTS idx_session_states_updated_at
                    ON session_states (updated_at)
                    zError at init_db: )acquireexecute	Exceptionloggererror)r*   r8   connexs       r+   r5   %PostgreSQLSessionStateManager.init_dbT   s     <<>>Tll   ll   ll  1 ">>  1"67= ">>>s   CA9CB.BA;B
A=B#A?$B(C3B,4C;B=B?B
B)B$$B))B.,C.C4B75CC
session_idc                 4  #    U(       d  [        S5      eXR                  ;   ap  U R                  U   nUR                  (       aP  [        R                  " [
        R                  5      UR                  -
  R                  5       nX0R                  :  a  U$ U R                  5       I S h  vN nUR                  5        IS h  vN n UR                  SU5      I S h  vN nU(       a  US   n[        U[        5      (       a  [        R                  " U5      n[!        US   US   U R#                  US   5      US   UU R#                  US   5      U R#                  US	   5      U R#                  US
   5      S9nXR                  U'   UsS S S 5      IS h  vN   $ [        R                  " [
        R                  5      n	U	R%                  S S9n
[!        UU	U	S9nUR&                  (       a  UR&                  R%                  S S9OS nUR)                  SUS S S S XU
5	      I S h  vN   XR                  U'   UsS S S 5      IS h  vN   $  GN GN GNo N N0 N! [*         a  n[,        R/                  SU 35        e S nAff = f! , IS h  vN  (       d  f       g = f7f)Nz>Error at get_session_state: session_id cannot be None or emptya9  
                    SELECT session_id, active_transaction_id, previous_request_timestamp,
                           previous_request_text, previous_request_files, timestamp_inserted_at, updated_at, created_at
                    FROM session_states
                    WHERE session_id = $1
                    previous_request_filesrC   active_transaction_idprevious_request_timestampprevious_request_texttimestamp_inserted_at
updated_at
created_at)rC   rF   rG   rH   rE   rI   rJ   rK   tzinfo)rC   rJ   rK   aM  
                    INSERT INTO session_states (session_id, active_transaction_id, previous_request_timestamp,
                                               previous_request_text, previous_request_files, timestamp_inserted_at, updated_at, created_at)
                    VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
                    zError at get_session_state: )
ValueErrorr$   rJ   r   nowr   utctotal_secondsr   r   r;   fetchrow
isinstancestrjsonloadsr   _ensure_utcreplacerI   r<   r=   r>   r?   )r*   rC   cached_state	cache_ager8   r@   rowrE   statenow_utc	now_naive	new_statetimestamp_inserted_at_naiverA   s                 r+   get_session_state/PostgreSQLSessionStateManager.get_session_statew   ss    ]^^ #::j1L&&%\\(,,7,:Q:QQ``b	~~-'' ]]_$<<>>T8 MM   -01I-J*!"8#>>15<R1S.(#&|#4.12I.J373C3CCHdDe3f.12I.J/E.2.>.>sCZ?[.\#'#3#3C4E#F#'#3#3C4E#F	E .3JJz* ; ">>@ #,,x||4#OO4O8	()&&	 gp  gF  gFi.M.M.U.U]a.U.b  LP+ll
 dD$8S`i   *3

:& k ">> %! "TU "n  ;B4@Ao ">>s   B%J'I(J IJI>II
B+IJIJBIII2J>I?JJ
IJIJ
I;I66I;;I>>JJJJtransaction_idrI   c           	        #    U(       d  [        S5      eU R                  5       I S h  vN nUR                  5        IS h  vN n [        R                  " [
        R                  5      nUR                  S S9nU(       a   UR                  (       a  UR                  S S9OUnUR                  SXXU5      I S h  vN   XR                  ;   a:  X R                  U   l        X0R                  U   l        X`R                  U   l        O[        UUUUUS9U R                  U'    S S S 5      IS h  vN   g  GN N N~! [         a  n	[         R#                  SU	 35        e S n	A	ff = f N7! , IS h  vN  (       d  f       g = f7f)Nz?Error at update_transaction: session_id cannot be None or emptyrL   a
  
                    INSERT INTO session_states (session_id, active_transaction_id, timestamp_inserted_at, updated_at, created_at)
                    VALUES ($1, $2, $3, $4, $5)
                    ON CONFLICT(session_id) DO UPDATE SET
                        active_transaction_id = EXCLUDED.active_transaction_id,
                        timestamp_inserted_at = COALESCE(EXCLUDED.timestamp_inserted_at, session_states.timestamp_inserted_at),
                        updated_at = EXCLUDED.updated_at
                    )rC   rF   rI   rJ   rK   zError at update_transaction: )rN   r   r;   r   rO   r   rP   rX   rM   r<   r$   rF   rI   rJ   r   r=   r>   r?   )
r*   rC   rc   rI   r8   r@   r]   r^   r`   rA   s
             r+   update_transaction0PostgreSQLSessionStateManager.update_transaction   sX    ^__]]_$<<>>T"",,x||4#OO4O8	\q  wL  wS  wS.C.K.KSW.K.X  Yn+ll 0KXa
 
 
 +CQJJz*@CXJJz*@8?JJz*5 .:#-.<.C#*#*.DJJz*3 ">> %!
6  <RDABC ">>>s   &FD4FD7FE(A3D;:D9;AD;E(D;"E(#F.E&/F7F9D;;
E#EE##E(&F(E?.E1/E?;F	timestamptextfilesc                   #    U(       d  [        S5      eU R                  5       I S h  vN nUR                  5        IS h  vN n [        R                  " [
        R                  5      nUR                  S S9nU(       a  [        R                  " USS9OS n	U(       a   UR                  (       a  UR                  S S9OUn
[        R                  nUR                  SUS XXX5	      I S h  vN   XR                  ;   aM  X R                  U   l        X0R                  U   l        X@R                  U   l        XpR                  U   l        O[%        UUUUUUS9U R                  U'    S S S 5      IS h  vN   g  GNP GN: N! [&         a  n[(        R+                  SU 35        e S nAff = f N8! , IS h  vN  (       d  f       g = f7f)NzDError at update_previous_request: session_id cannot be None or emptyrL   F)ensure_asciia  
                    INSERT INTO session_states (
                        session_id, active_transaction_id, previous_request_timestamp, previous_request_text,
                        previous_request_files, timestamp_inserted_at, updated_at, created_at
                    )
                    VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
                    ON CONFLICT(session_id) DO UPDATE SET
                        previous_request_timestamp = EXCLUDED.previous_request_timestamp,
                        previous_request_text = EXCLUDED.previous_request_text,
                        previous_request_files = EXCLUDED.previous_request_files,
                        updated_at = EXCLUDED.updated_at
                    )rC   rG   rH   rE   rJ   rK   z"Error at update_previous_request: )rN   r   r;   r   rO   r   rP   rX   rU   dumpsrM   minr<   r$   rG   rH   rE   rJ   r   r=   r>   r?   )r*   rC   rg   rh   ri   r8   r@   r]   r^   
files_jsontimestamp_naiver`   rA   s                r+   update_previous_request5PostgreSQLSessionStateManager.update_previous_request   s}     cdd]]_$<<>>T*",,x||4#OO4O8	FKTZZEBQU
DMR[RbRb)"3"34"3"@hq.6ll+ll oZfo  " +HQJJz*ECGJJz*@DIJJz*A8?JJz*5 .:#-3<.2/4#*#*.DJJz*A ">> %!B  A"FGS ">>>s   &GE8GE;GF-B#F *E>+AF 
F-F &F-'G2F+3G;G>F  
F(
F##F((F-+G-G3F64G Gc                   #    U(       d  [        S5      eU R                  5       I S h  vN nUR                  5        IS h  vN n UR                  SU5      I S h  vN   XR                  ;   a  U R                  U	 S S S 5      IS h  vN   g  Ne NN N5! [
         a  n[        R                  SU 35        e S nAff = f N6! , IS h  vN  (       d  f       g = f7f)Nz:Error at clear_session: session_id cannot be None or emptyz0DELETE FROM session_states WHERE session_id = $1zError at clear_session: )rN   r   r;   r<   r$   r=   r>   r?   )r*   rC   r8   r@   rA   s        r+   clear_session+PostgreSQLSessionStateManager.clear_session"  s     YZZ]]_$<<>>TllF   +

:. ">> %!  7t<= ">>>s   &CBCBCCBB B=CB?	CCB
B<B77B<<C?CCC
CCtimeout_secondsc                   #    U R                  5       I S h  vN nUR                  5        IS h  vN n [        R                  " [        R
                  5      R                  S S9[        US9-
  nUR                  SU5      I S h  vN nU Vs/ s H  ofS   PM	     nnUR                  SU5      I S h  vN nU(       a  [        UR                  5       S   5      OSn	U	S:  a  [        R                  SU	 S	35        U H!  n
XR                  ;   d  M  U R                  U
	 M#     S S S 5      IS h  vN   g  GN GN Ns  snf  N! [         a  n[        R!                  S
U 35        e S nAff = f N?! , IS h  vN  (       d  f       g = f7f)NrL   )secondsz;SELECT session_id FROM session_states WHERE updated_at < $1rC   z0DELETE FROM session_states WHERE updated_at < $1r   zCleaned up z old sessionszError at cleanup_old_sessions: )r   r;   r   rO   r   rP   rX   r   fetchr<   intsplitr>   infor$   r=   r?   )r*   ru   r8   r@   cutoff_timerowsr[   sessions_to_deleteresultdeleted_countrC   rA   s               r+   cleanup_old_sessions2PostgreSQLSessionStateManager.cleanup_old_sessions6  sS    ]]_$<<>>T&ll8<<8@@@MPYbqPrr "ZZQ  DH%H4C,&74"%H  $||F   <BFLLN2$6 7q 1$KK+m_M JK #5J!ZZ/ JJz2 #5+ ">> %!
 &I  >rdCD3 ">>>s   F
D4F
D7F
E0AED:ED<E3E4AEE#F
.E./F
7F
:E<E
E+E&&E++E0.F
0F6E97FF
dtc                     Uc  gUR                   c  UR                  [        R                  S9$ UR	                  [        R                  5      $ )z Ensure datetime has UTC timezoneNrL   )rM   rX   r   rP   
astimezone)r*   r   s     r+   rW   )PostgreSQLSessionStateManager._ensure_utcU  s<    :99::X\\:22==..r.   )r)   r#   r%   r(   r$   r   r   r!   r    r   r   r   r   r   r   )r   )__name__
__module____qualname____firstlineno__r	   r
   r6   PoolrT   rz   r,   r   r5   r   ra   r   re   r   r   r   rp   rs   r   rW   __static_attributes__ r.   r+   r   r      s    ;? "# ! !% 2y667% 	%
 % % % % % % % % %>& &P!',, !FG# G, GR(3 ( (dl (qu (T66 6 sm	6
 S#X'6 
6pc d (#  >/h /8H+= /r.   r   )r&   r   r   r   rU   loggingtypingr   r   r   r	   r
   r6   baser   r   	getLoggerr   r>   r   r   r.   r+   <module>r      s?     2 2   ; ;  3			8	$P/$7 P/r.   