U 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|_|ptj|_dSN)adapted_connjsondumps_dumps)selfr rrOC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-8c51wohf\psycopg2\_json.py__init__8sz Json.__init__cCs|tkr |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)robjrrrrAsz Json.dumpscCs ||_dSr )r )rconnrrrprepareJsz Json.preparecCs2||j}t|}|jdk r*||j|Sr )rr rr r getquoted)rsqsrrrrMs    zJson.getquotedcCs|ddS)Nasciireplace)rdecode)rrrr__str__Tsz Json.__str__)N) __name__ __module__ __qualname____doc__rrrrrrrrrrr .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_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()`. Zjsonb)r)r*r$r+r,r%)r/ JSONB_OIDJSONBARRAY_OIDr2rrrregister_default_jsonbs r6r-csRdkrtjfdd}t|f||}|dk rFt|f|d|}nd}||fS)z&Create typecasters for json data type.Ncs|dkr dS|Sr r)rcurr$rr typecast_jsonsz/_create_json_typecasters..typecast_jsonARRAY)r r$rr)r+r,r$r%r9r-r.rr8rr's r'c Csddlm}ddlm}||\}}|j}|jjdkr:dps"+ '