
    9h                         S r SSKrSSKJrJr  SSKJrJrJr  SrSr	Sr
Sr " S	 S
5      r  SS jrSS jrSS jrSS jrSS jrg)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                   @    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
rg)Json.   z
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                 Z    Xl         S U l        U=(       d    [        R                  U l        g N)adapted_connjsondumps_dumps)selfr   r   s      @/var/www/html/env/lib/python3.13/site-packages/psycopg2/_json.py__init__Json.__init__8   s    
)tzz    c                     U[         L a  U $ g r   )r   )r   protos     r   __conform__Json.__conform__=   s    IK r   c                 $    U R                  U5      $ )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   
Json.dumpsA   s     {{3r   c                     Xl         g r   )r   )r   conns     r   prepareJson.prepareJ   s    
r   c                     U R                  U R                  5      n[        U5      nU R                  b  UR	                  U R                  5        UR                  5       $ r   )r   r   r   r   r"   	getquoted)r   sqss      r   r%   Json.getquotedM   sC    JJt||$!_::!JJtzz"||~r   c                 B    U R                  5       R                  SS5      $ )Nasciireplace)r%   decode)r   s    r   __str__Json.__str__T   s    ~~&&w	::r   )r   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r"   r%   r-   __static_attributes__ r   r   r   r   .   s%    *
 ;r   r   c                     Uc  [        X5      u  p4[        X4X%R                  5       S9u  pg[        Xa(       + =(       a    U =(       d    S5        Ub"  [        Xq(       + =(       a    U =(       d    S5        Xg4$ )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globallyr7   oid	array_oidr8   JSON	JSONARRAYs           r   register_jsonrB   Y   sd    2 {';.e**,8OD $5=>i!>,!F$G?r   c                 *    [        XU[        [        S9$ )ac  
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()`.
)r<   r=   r7   r>   r?   )rB   JSON_OIDJSONARRAY_OIDr<   r=   r7   s      r   register_default_jsonrG      s     l]< <r   c           	      ,    [        XU[        [        SS9$ )aF  
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)r<   r=   r7   r>   r?   r8   )rB   	JSONB_OIDJSONBARRAY_OIDrF   s      r   register_default_jsonbrL      s     ln7L Lr   c                    ^ Tc  [         R                  mU4S jn[        U 4X45      nUb  [        U4U S3U5      nXV4$ SnXV4$ )z&Create typecasters for json data type.Nc                    > U c  g T" U 5      $ r   r5   )r&   curr7   s     r   typecast_json/_create_json_typecasters.<locals>.typecast_json   s    9Qxr   ARRAY)r   r7   r   r   )r>   r?   r7   r8   rP   r@   rA   s     `    r   r:   r:      s[    }


 SGT1D"I=TF%.$G	 ? 	?r   c                 n   SSK Jn  SSKJn  U" U 5      u  pEUR                  nUR
                  R                  S:  =(       a    S=(       d    SnUR                  SU-  U45        UR                  5       nXb:w  a!  UR                  (       d  UR                  5         U(       d  UR                  U S35      eU$ )	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.extensionsrT   psycopg2.extrasrU   statusinfoserver_versionexecutefetchone
autocommitrollbackProgrammingError)	r<   r8   rT   rU   r!   cursconn_statusrV   rs	            r   r9   r9      s    90!,/JD ++K yy''50?ZI6H 	LL@
	G 	A +DOO##tf,@$ABBHr   )NFNNNr   )NFN)Nr@   )r   )r3   r   psycopg2._psycopgr   r   r   r   r   rD   rE   rJ   rK   r   rB   rG   rL   r:   r9   r5   r   r   <module>rf      s_   <  5 E E  	(; (;V <@17$N
<
L&r   