U
    ÉZjñ  ã                   @   s„   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
„ d
ƒZddd„Zddd„Zddd„Zddd„Zddd„ZdS )z÷Implementation 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_typeér   éÇ   iÚ  iß  c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú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                 C   s   || _ d | _|ptj| _d S ©N)ÚadaptedÚ_connÚjsonÚdumpsÚ_dumps)Úselfr   r   © r   úQ/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/psycopg2/_json.pyÚ__init__8   s    zJson.__init__c                 C   s   |t kr| S d S r
   )r   )r   Úprotor   r   r   Ú__conform__=   s    zJson.__conform__c                 C   s
   |   |¡S )zßSerialize *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   Úobjr   r   r   r   A   s    z
Json.dumpsc                 C   s
   || _ d S r
   )r   )r   Úconnr   r   r   ÚprepareJ   s    zJson.preparec                 C   s2   |   | j¡}t|ƒ}| jd k	r*| | j¡ | ¡ S r
   )r   r   r   r   r   Ú	getquoted)r   ÚsÚqsr   r   r   r   M   s
    
zJson.getquotedc                 C   s   |   ¡  dd¡S )NÚasciiÚreplace)r   Údecode)r   r   r   r   Ú__str__T   s    zJson.__str__)N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r   r	   .   s   	
	r	   Fr   c                 C   sf   |dkrt | |ƒ\}}t|||| ¡ d�\}}t|| r<| p>dƒ |dk	r^t|| rX| pZdƒ ||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Ú	JSONARRAYr   r   r   Úregister_jsonY   s       ÿ
r/   c                 C   s   t | ||ttd�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()`.
    )r)   r*   r$   r+   r,   )r/   ÚJSON_OIDÚJSONARRAY_OID©r)   r*   r$   r   r   r   Úregister_default_json€   s
    	  ÿr3   c                 C   s   t | ||ttd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()`.
    Zjsonb)r)   r*   r$   r+   r,   r%   )r/   Ú	JSONB_OIDÚJSONBARRAY_OIDr2   r   r   r   Úregister_default_jsonb�   s    	   ÿr6   r-   c                    sR   ˆ dkrt j‰ ‡ fdd„}t| f||ƒ}|dk	rFt|f|› d�|ƒ}nd}||fS )z&Create typecasters for json data type.Nc                    s   | d krd S ˆ | ƒS r
   r   )r   Úcur©r$   r   r   Útypecast_jsonŸ   s    z/_create_json_typecasters.<locals>.typecast_jsonZARRAY)r   r$   r   r   )r+   r,   r$   r%   r9   r-   r.   r   r8   r   r'   š   s    r'   c           	      C   s†   ddl m} ddlm} || ƒ\}}|j}|jjdkr:dp<d}| d| |f¡ | ¡ }||krn|j	sn| 
¡  |s‚| |› d�¡‚|S )	Nr   )ÚSTATUS_IN_TRANSACTION)Ú_solve_conn_cursi¬9 ÚtyparrayZNULLz6SELECT t.oid, %s FROM pg_type t WHERE t.typname = %%s;z data type not found)Zpsycopg2.extensionsr:   Zpsycopg2.extrasr;   ÚstatusÚinfoZserver_versionÚexecuteZfetchoneZ
autocommitÚrollbackZProgrammingError)	r)   r%   r:   r;   r   ZcursZconn_statusr<   Úrr   r   r   r&   ­   s"    ÿþr&   )NFNNNr   )NFN)NFN)Nr-   )r   )r#   r   Zpsycopg2._psycopgr   r   r   r   r   r0   r1   r4   r5   r	   r/   r3   r6   r'   r&   r   r   r   r   Ú<module>   s"   +      ÿ
'


