o a@sdZddlZddlmZmZddlmZmZmZdZdZ dZ dZ Gd d d Z  dd dZ dddZdddZdddZdddZdS)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_typenew_array_type register_typeriic@sBeZdZdZdddZddZddZd d Zd d Zd dZ dS)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. NcCs||_d|_|p tj|_dSN)adapted_connjsondumps_dumps)selfr rr0/usr/lib/python3/dist-packages/psycopg2/_json.py__init__8sz Json.__init__cCs|tur|SdSr )r)rprotorrr __conform__=szJson.__conform__cCs ||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)robjrrrrAs z Json.dumpscCs ||_dSr )r )rconnrrrprepareJs z Json.preparecCs2||j}t|}|jdur||j|Sr )rr rr r getquoted)rsqsrrrrMs   zJson.getquotedcCs|ddS)Nasciireplace)rdecode)rrrr__str__Tsz Json.__str__r ) __name__ __module__ __qualname____doc__rrrrrrrrrrr .s   r Fr cCsf|dur t||\}}t||||d\}}t|| r|pd|dur/t|| r,|p-d||fS)aCreate 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)loadsname)_get_json_oids_create_json_typecastersupperr) conn_or_cursgloballyr$oid array_oidr%JSON JSONARRAYrrr register_jsonYs  r/cCst|||ttdS)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_OIDr)r*r$rrrregister_default_jsons r3cCst|||ttddS)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)r)r*r$r+r,r%)r/ JSONB_OIDJSONBARRAY_OIDr2rrrregister_default_jsonbs r7r-csXdurtjfdd}t|f||}|dur&t|f|d|}||fSd}||fS)z&Create typecasters for json data type.Ncs|durdS|Sr r)rcurr$rr typecast_jsonsz/_create_json_typecasters..typecast_jsonARRAY)r r$rr)r+r,r$r%r:r-r.rr9rr's r'c Csddlm}ddlm}||\}}|j}|jjdkrdpd}|d||f|}||kr7|j s7| |sA| |d|S) Nr)STATUS_IN_TRANSACTION)_solve_conn_cursi9typarrayNULLz6SELECT t.oid, %s FROM pg_type t WHERE t.typname = %%s;z data type not found) psycopg2.extensionsr<psycopg2.extrasr=statusinfoserver_versionexecutefetchone autocommitrollbackProgrammingError) r)r%r<r=rcurs conn_statusr>rrrrr&s"   r&)NFNNNr )NFN)Nr-)r )r#r psycopg2._psycopgrrrrrr0r1r5r6r r/r3r7r'r&rrrrs + '