
    +h                         d Z ddlZddlmZmZ ddlmZmZmZ dZdZ	dZ
dZ G d	 d
      Z	 	 ddZddZddZddZddZy)zImplementation of the JSON adaptation objects

This module exists to avoid a circular import problem: pyscopg2.extras depends
on psycopg2.extension, so I can't create the default JSON typecasters in
extensions importing register_json from extras.
    N)	ISQLQuoteQuotedString)new_typenew_array_typeregister_typer      i  i  c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
Jsona  
    An `~psycopg2.extensions.ISQLQuote` wrapper to adapt a Python object to
    :sql:`json` data type.

    `!Json` can be used to wrap any object supported by the provided *dumps*
    function. If none is provided, the standard :py:func:`json.dumps()` is
    used.

    Nc                 R    || _         d | _        |xs t        j                  | _        y N)adapted_connjsondumps_dumps)selfr   r   s      A/var/www/html/venv/lib/python3.12/site-packages/psycopg2/_json.py__init__zJson.__init__8   s     
)tzz    c                     |t         u r| S y r   )r   )r   protos     r   __conform__zJson.__conform__=   s    IK r   c                 $    | j                  |      S )zSerialize *obj* in JSON format.

        The default is to call `!json.dumps()` or the *dumps* function
        provided in the constructor. You can override this method to create a
        customized JSON wrapper.
        )r   )r   objs     r   r   z
Json.dumpsA   s     {{3r   c                     || _         y r   )r   )r   conns     r   preparezJson.prepareJ   s	    
r   c                     | j                  | j                        }t        |      }| j                  |j	                  | j                         |j                         S r   )r   r   r   r   r   	getquoted)r   sqss      r   r    zJson.getquotedM   sC    JJt||$!_::!JJtzz"||~r   c                 B    | j                         j                  dd      S )Nasciireplace)r    decode)r   s    r   __str__zJson.__str__T   s    ~~&&w	::r   r   )
__name__
__module____qualname____doc__r   r   r   r   r    r'    r   r   r   r   .   s%    *
 ;r   r   c                     |t        | |      \  }}t        ||||j                               \  }}t        || xr | xs d       |t        || xr | xs d       ||fS )a  Create and register typecasters converting :sql:`json` type to Python objects.

    :param conn_or_curs: a connection or cursor used to find the :sql:`json`
        and :sql:`json[]` oids; the typecasters are registered in a scope
        limited to this object, unless *globally* is set to `!True`. It can be
        `!None` if the oids are provided
    :param globally: if `!False` register the typecasters only on
        *conn_or_curs*, otherwise register them globally
    :param loads: the function used to parse the data into a Python object. If
        `!None` use `!json.loads()`, where `!json` is the module chosen
        according to the Python version (see above)
    :param oid: the OID of the :sql:`json` type if known; If not, it will be
        queried on *conn_or_curs*
    :param array_oid: the OID of the :sql:`json[]` array type if known;
        if not, it will be queried on *conn_or_curs*
    :param name: the name of the data type to look for in *conn_or_curs*

    The connection or cursor passed to the function will be used to query the
    database and look for the OID of the :sql:`json` type (or an alternative
    type if *name* if provided). No query is performed if *oid* and *array_oid*
    are provided.  Raise `~psycopg2.ProgrammingError` if the type is not found.

    N)loadsname)_get_json_oids_create_json_typecastersupperr   )conn_or_cursgloballyr.   oid	array_oidr/   JSON	JSONARRAYs           r   register_jsonr9   Y   st    2 {'d;Y.Ye$**,8OD) $H5=>iX!>,!F$G?r   c                 2    t        | ||t        t              S )a{  
    Create and register :sql:`json` typecasters for PostgreSQL 9.2 and following.

    Since PostgreSQL 9.2 :sql:`json` is a builtin type, hence its oid is known
    and fixed. This function allows specifying a customized *loads* function
    for the default :sql:`json` type without querying the database.
    All the parameters have the same meaning of `register_json()`.
    )r3   r4   r.   r5   r6   )r9   JSON_OIDJSONARRAY_OIDr3   r4   r.   s      r   register_default_jsonr>      s     lX]< <r   c                 4    t        | ||t        t        d      S )a^  
    Create and register :sql:`jsonb` typecasters for PostgreSQL 9.4 and following.

    As in `register_default_json()`, the function allows to register a
    customized *loads* function for the :sql:`jsonb` type at its known oid for
    PostgreSQL 9.4 and following versions.  All the parameters have the same
    meaning of `register_json()`.
    jsonb)r3   r4   r.   r5   r6   r/   )r9   	JSONB_OIDJSONBARRAY_OIDr=   s      r   register_default_jsonbrC      s      lXn7L Lr   c                     t         j                  fd}t        | f||      }|t        |f| d|      }||fS d}||fS )z&Create typecasters for json data type.Nc                     | y  |       S r   r,   )r!   curr.   s     r   typecast_jsonz/_create_json_typecasters.<locals>.typecast_json   s    9Qxr   ARRAY)r   r.   r   r   )r5   r6   r.   r/   rG   r7   r8   s     `    r   r1   r1      sa    }


 SGT=1D"I=TF%.$G	 ? 	?r   c                 H   ddl m} ddlm}  ||       \  }}|j                  }|j
                  j                  dk\  xr dxs d}|j                  d|z  |f       |j                         }||k7  r|j                  s|j                          |s|j                  | d      |S )	Nr   )STATUS_IN_TRANSACTION)_solve_conn_cursi9 typarrayNULLz6SELECT t.oid, %s FROM pg_type t WHERE t.typname = %%s;z data type not found)psycopg2.extensionsrJ   psycopg2.extrasrK   statusinfoserver_versionexecutefetchone
autocommitrollbackProgrammingError)	r3   r/   rJ   rK   r   cursconn_statusrL   rs	            r   r0   r0      s    90!,/JD$ ++K yy''50?ZI6H 	LL@
	G 	A ++DOO##tf,@$ABBHr   )NFNNNr   )NFN)Nr7   )r   )r+   r   psycopg2._psycopgr   r   r   r   r   r;   r<   rA   rB   r   r9   r>   rC   r1   r0   r,   r   r   <module>r\      s_   <  5 E E  	(; (;V <@17$N
<
L&r   