B *]Z@sdZddlZddlmZmZddlmZmZmZddlm Z dZ dZ dZ d Z Gd d d eZdddZdddZdddZdddZdddZdS)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_type)PY2riic@sPeZdZdZdddZddZddZd d Zd d Ze rDd dZ nddZ 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|_|ptj|_dS)N)adapted_connjsondumps_dumps)selfr rrA/opt/alt/python37/lib64/python3.7/site-packages/psycopg2/_json.py__init__8sz Json.__init__cCs|tkr |SdS)N)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)robjrrrrAsz Json.dumpscCs ||_dS)N)r )rconnrrrprepareJsz Json.preparecCs2||j}t|}|jdk r*||j|S)N)rr rr r getquoted)rsZqsrrrrMs    zJson.getquotedcCs|S)N)r)rrrr__str__Usz Json.__str__cCs|ddS)Nasciireplace)rdecode)rrrrrXs)N) __name__ __module__ __qualname____doc__rrrrrrrrrrrr .s    r Fr cCsf|dkrt||\}}t||||d\}}t|| r<|p>d|dk r^t|| rX|pZd||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_json]sr.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_OID)r(r)r#rrrregister_default_jsons r1cCst|||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()`. Zjsonb)r(r)r#r*r+r$)r. JSONB_OIDJSONBARRAY_OID)r(r)r#rrrregister_default_jsonbs r4r,csPdkrtjfdd}t|f||}|dk rDt|fd||}nd}||fS)z&Create typecasters for json data type.Ncs|dkr dS|S)Nr)rZcur)r#rr typecast_jsonsz/_create_json_typecasters..typecast_jsonz%sARRAY)r r#rr)r*r+r#r$r5r,r-r)r#rr&s r&c Csddlm}ddlm}||\}}|j}|jjdkr:dps / &