
    #jD                        U d dl mZ d dlZd dlZd dlmZ erd dlmZ  ej        e	          Z
dZdZdZ G d d          Zdaded	<   ddZddZddZddZddZdS )    )annotationsN)TYPE_CHECKINGPg0	hindsightc                  X    e Zd ZdZdeeedfddZddZdddZ	d dZ
d!dZd"dZd!dZdS )#EmbeddedPostgreszBManages an embedded PostgreSQL server instance using pg0-embedded.Nr   port
int | Noneusernamestrpassworddatabasenamec                Z    || _         || _        || _        || _        || _        d | _        d S )N)r
   r   r   r   r   _pg0)selfr
   r   r   r   r   kwargss          Y/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/hindsight_api/pg0.py__init__zEmbeddedPostgres.__init__   s2     	   	 $			    returnr   c                    | j         ^	 ddlm} n# t          $ r t          d          w xY w| j        | j        | j        | j        d}| j        
| j        |d<    |di || _         | j         S )Nr   r   zppg0-embedded is required for embedded PostgreSQL. Install it with: pip install 'hindsight-api-slim[embedded-db]')r   r   r   r   r
    )	r   pg0r   ImportErrorr   r   r   r   r
   )r   r   r   s      r   _get_pg0zEmbeddedPostgres._get_pg0$   s    9#######   !U   	 M M M	 F y$!%vfDIys    *         @max_retriesintretry_delayfloatc           
     $  K   | j         r
d| j          nd}t                              d| j         d| d           |                                 }d}t          d|dz             D ]}	 t          j                    }|                    d|j	                   d{V }|j
        }	t                              d|	            |	c S # t          $ r}
t          |
          }||k     rh|d	|dz
  z  z  }t                              d
| d| d|            t                              d|dd           t          j        |           d{V  n#t                              d
| d| d|            Y d}
~
d}
~
ww xY wt          d| d|           )z-Start the PostgreSQL server with retry logic.zport=z	port=autoz#Starting embedded PostgreSQL (name=z, )...N   zPostgreSQL started:    zpg0 start attempt /z	 failed: zRetrying in z.1fzs...z*Failed to start embedded PostgreSQL after z attempts. Last error: )r
   loggerinfor   r   rangeasyncioget_event_looprun_in_executorstarturi	Exceptionr   debugsleepRuntimeError)r   r    r"   	port_infor   
last_errorattemptloopr*   r0   edelays               r   r/   zEmbeddedPostgres.start9   s     +/9E'DI'''+	V$)VVyVVVWWWmmoo
Qa00 	d 	dGd-//!11$	BBBBBBBBh8388999


 d d d VV
[(('11+=>ELL!bg!b!b!b!bV`!b!bcccLL!?!?!?!?!?@@@!-..........LL!bg!b!b!b!bV`!b!bcccd iii]gii
 
 	
s   )AC
E:B E55E:Nonec                  K   |                                  }t                              d| j         d           	 t	          j                    }|                    d|j                   d{V  t                              d           dS # t          $ r@}dt          |          
                                v rY d}~dS t          d|           d}~ww xY w)zStop the PostgreSQL server.z$Stopping embedded PostgreSQL (name: r%   NzEmbedded PostgreSQL stoppedznot runningzFailed to stop PostgreSQL: )r   r)   r*   r   r,   r-   r.   stopr1   r   lowerr4   )r   r   r8   r9   s       r   r=   zEmbeddedPostgres.stopW   s      mmooJ49JJJKKK	B)++D&&tSX666666666KK566666 	B 	B 	BA..@Q@@AAA	Bs   AB 
C#C>CCc                   K   |                                  }t          j                    }|                    d|j                   d{V }|j        S )z1Get the connection URI for the PostgreSQL server.N)r   r,   r-   r.   r*   r0   r   r   r8   r*   s       r   get_urizEmbeddedPostgres.get_urie   sQ      mmoo%''))$99999999xr   boolc                   K   	 |                                  }t          j                    }|                    d|j                   d{V }|duo|j        S # t          $ r Y dS w xY w)z4Check if the PostgreSQL server is currently running.NF)r   r,   r-   r.   r*   runningr1   r@   s       r   
is_runningzEmbeddedPostgres.is_runningl   s      	--//C)++D--dCH========Dt#44 	 	 	55	s   AA 
A%$A%c                   K   |                                   d{V r|                                  d{V S |                                  d{V S )z?Ensure the PostgreSQL server is running, starting it if needed.N)rE   rA   r/   )r   s    r   ensure_runningzEmbeddedPostgres.ensure_runningv   sj      """""""" 	('''''''ZZ\\!!!!!!!r   )
r
   r   r   r   r   r   r   r   r   r   )r   r   )r   r   )r    r!   r"   r#   r   r   r   r;   r   r   )r   rB   )__name__
__module____qualname____doc__DEFAULT_USERNAMEDEFAULT_PASSWORDDEFAULT_DATABASEr   r   r/   r=   rA   rE   rG   r   r   r   r	   r	      s        LL  (((% % % % %    *
 
 
 
 
<B B B B      " " " " " "r   r	   zEmbeddedPostgres | None_default_instancer   c                 :    t           t                      a t           S )z4Get or create the default EmbeddedPostgres instance.)rQ   r	   r   r   r   get_embedded_postgresrS      s      ,..r   r   c                 R   K   t                                                       d{V S )z-Quick start function for embedded PostgreSQL.N)rS   rG   r   r   r   start_embedded_postgresrU      s0      &((77999999999r   r;   c                 Z   K   t           r!t                                            d{V  dS dS )z.Stop the default embedded PostgreSQL instance.N)rQ   r=   r   r   r   stop_embedded_postgresrW      sD        '$$&&&&&&&&&&&' 'r   db_url#tuple[bool, str | None, int | None]c                    | dk    rdS |                      d          rB| dd         }d|v r-|                    dd          \  }}d|pd	t          |          fS d|pd	dfS d
S )aT  
    Parse a database URL and check if it's a pg0:// embedded database URL.

    Supports:
    - "pg0" -> default instance "hindsight"
    - "pg0://instance-name" -> named instance
    - "pg0://instance-name:port" -> named instance with explicit port
    - Any other URL (e.g., postgresql://) -> not a pg0 URL

    Args:
        db_url: The database URL to parse

    Returns:
        Tuple of (is_pg0, instance_name, port)
        - is_pg0: True if this is a pg0 URL
        - instance_name: The instance name (or None if not pg0)
        - port: The explicit port (or None for auto-assign)
    r   )Tr   Nzpg0://   N:r&   Tr   )FNN)
startswithrsplitr!   )rX   url_partinstance_nameport_strs       r   parse_pg0_urlrb      s    & &&"" 7!"":(??&.ooc1&=&=#M85+s8}}DD0[$66r   c                   K   t          |           \  }}}|r+t          ||          }|                                 d{V S | S )ap  
    Resolve a database URL, handling pg0:// embedded database URLs.

    If the URL is a pg0:// URL, starts the embedded PostgreSQL and returns
    the actual postgresql:// connection URL. Otherwise, returns the URL unchanged.

    Args:
        db_url: Database URL (pg0://, pg0, or postgresql://)

    Returns:
        The resolved postgresql:// connection URL
    )r   r
   N)rb   r	   rG   )rX   is_pg0r`   r
   r   s        r   resolve_database_urlre      s_       #0"7"7FM4 *M==='')))))))))Mr   )r   r	   rI   rH   )rX   r   r   rY   )rX   r   r   r   )
__future__r   r,   loggingtypingr   r   r   	getLoggerrJ   r)   rN   rO   rP   r	   rQ   __annotations__rS   rU   rW   rb   re   r   r   r   <module>rk      s0   " " " " " " "               		8	$	$   i" i" i" i" i" i" i" i"X .2  1 1 1 1   : : : :
' ' ' '   B     r   