U
    ڲg                     @  s   d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZmZ e	jZe
jZdZd"ddddddZd#ddddddZdddddZedZedZdddddZdddd d!ZdS )$z*
Functions to manipulate conninfo strings
    )annotationsN   )pq)errors)_conninfo_utils)_conninfo_attempts)_conninfo_attempts_async)	ConnParamConnDict    strr	   )conninfokwargsreturnc                 K  sp   | s|sdS |s t |  t| S dd | D }| rLt| }|| |}ddd | D } t |  | S )a  
    Merge a string and keyword params into a single conninfo string.

    :param conninfo: A `connection string`__ as accepted by PostgreSQL.
    :param kwargs: Parameters overriding the ones specified in `!conninfo`.
    :return: A connection string valid for PostgreSQL, with the `!kwargs`
        parameters merged.

    Raise `~psycopg.ProgrammingError` if the input doesn't make a valid
    conninfo string.

    .. __: https://www.postgresql.org/docs/current/libpq-connect.html
           #LIBPQ-CONNSTRING
    r   c                 S  s   i | ]\}}|d k	r||qS N .0kvr   r   4/tmp/pip-unpacked-wheel-b_ea6rx_/psycopg/conninfo.py
<dictcomp>6   s       z!make_conninfo.<locals>.<dictcomp> c                 s  s(   | ] \}}| d t t| V  qdS )=N)_param_escaper   r   r   r   r   	<genexpr>=   s     z make_conninfo.<locals>.<genexpr>)_parse_conninfor   itemsconninfo_to_dictupdatejoin)r   r   tmpr   r   r   make_conninfo   s    
r#   r
   c                 K  s<   t | }dd |D }| D ]\}}|dk	r|||< q|S )a  
    Convert the `!conninfo` string into a dictionary of parameters.

    :param conninfo: A `connection string`__ as accepted by PostgreSQL.
    :param kwargs: Parameters overriding the ones specified in `!conninfo`.
    :return: Dictionary with the parameters parsed from `!conninfo` and
        `!kwargs`.

    Raise `~psycopg.ProgrammingError` if `!conninfo` is not a a valid connection
    string.

    .. __: https://www.postgresql.org/docs/current/libpq-connect.html
           #LIBPQ-CONNSTRING
    c                 S  s(   i | ] }|j d k	r|j |j  qS r   )valkeyworddecode)r   optr   r   r   r   U   s    
  z$conninfo_to_dict.<locals>.<dictcomp>N)r   r   )r   r   optsrvr   r   r   r   r   r   E   s    
r   zlist[pq.ConninfoOption])r   r   c              
   C  sL   zt j|  W S  tjk
rF } ztt|dW 5 d}~X Y nX dS )z
    Verify that `!conninfo` is a valid connection string.

    Raise ProgrammingError if the string is not valid.

    Return the result of pq.Conninfo.parse() on success.
    N)r   ZConninfoparseencodeeZOperationalErrorProgrammingErrorr   )r   exr   r   r   r   ^   s    r   z([\\'])z\s)sr   c                 C  s.   | sdS t d| } t| r*d|  d } | S )z9
    Apply the escaping rule required by PQconnectdb
    z''z\\\1')	re_escapesubre_spacesearch)r/   r   r   r   r   p   s    
r   int)paramsr   c                 C  sn   t | d}|dkrt}ztt|}W n& tk
rN   td|dY nX |dkr^t}n|dk rjd}|S )zG
    Return the timeout in seconds from the connection parameters.
    connect_timeoutNzbad value for connect_timeout: r      )r   	get_param_DEFAULT_CONNECT_TIMEOUTr5   float
ValueErrorr,   r-   )r6   valuetimeoutr   r   r   timeout_from_conninfo~   s    r?   )r   )r   )__doc__
__future__r   rer   r   r   r,   r   r   r   abcr	   r
   Zconninfo_attemptsZconninfo_attempts_asyncr:   r#   r   r   compiler1   r3   r   r?   r   r   r   r   <module>   s$   )

