def _from_db(self, name, pyrange, conn_or_curs): """Return a `RangeCaster` instance for the type *pgrange*. Raise `ProgrammingError` if the type is not found. """ from psycopg2.extensions import STATUS_IN_TRANSACTION from psycopg2.extras import _solve_conn_curs conn, curs = _solve_conn_curs(conn_or_curs) if conn.server_version < 90200: raise ProgrammingError("range types not available in version %s" % conn.server_version) # Store the transaction status of the connection to revert it after use conn_status = conn.status # Use the correct schema if "." in name: schema, tname = name.split(".", 1) else: tname = name schema = "public" # get the type oid and attributes try: curs.execute( """\ select rngtypid, rngsubtype, (select typarray from pg_type where oid = rngtypid) from pg_range r join pg_type t on t.oid = rngtypid join pg_namespace ns on ns.oid = typnamespace where typname = %s and ns.nspname = %s; """, (tname, schema), ) except ProgrammingError: if not conn.autocommit: conn.rollback() raise else: rec = curs.fetchone() # revert the status of the connection as before the command if conn_status != STATUS_IN_TRANSACTION and not conn.autocommit: conn.rollback() if not rec: raise ProgrammingError("PostgreSQL type '%s' not found" % name) type, subtype, array = rec return RangeCaster(name, pyrange, oid=type, subtype_oid=subtype, array_oid=array)
def _from_db(self, name, pyrange, conn_or_curs): """Return a `RangeCaster` instance for the type *pgrange*. Raise `ProgrammingError` if the type is not found. """ from psycopg2.extensions import STATUS_IN_TRANSACTION from psycopg2.extras import _solve_conn_curs conn, curs = _solve_conn_curs(conn_or_curs) if conn.info.server_version < 90200: raise ProgrammingError("range types not available in version %s" % conn.info.server_version) # Store the transaction status of the connection to revert it after use conn_status = conn.status # Use the correct schema if '.' in name: schema, tname = name.split('.', 1) else: tname = name schema = 'public' # get the type oid and attributes try: curs.execute except ProgrammingError: if not conn.autocommit: conn.rollback() raise else: rec = curs.fetchone() # revert the status of the connection as before the command if (conn_status != STATUS_IN_TRANSACTION and not conn.autocommit): conn.rollback() if not rec: raise ProgrammingError("PostgreSQL type '%s' not found" % name) type, subtype, array = rec return RangeCaster(name, pyrange, oid=type, subtype_oid=subtype, array_oid=array)
def query_range_oids(pgrange, conn_or_curs): conn, curs = _solve_conn_curs(conn_or_curs) # Store transaction status conn_status = conn.status # Calculate absolutre location for pgrange if "." in pgrange: schema, name = pgrange.split(".", 1) else: name = pgrange schema = "public" # Query oids try: curs.execute( """ SELECT r.rngtypid, r.rngsubtype, t.typarray FROM pg_range r JOIN pg_type t ON(t.oid = r.rngtypid) JOIN pg_namespace ns ON(ns.oid = t.typnamespace) WHERE t.typname = %s AND ns.nspname = %s; """, (name, schema)) except ProgrammingError: if not conn.autocommit: conn.rollback() raise type_data = curs.fetchone() # Reset status if it was tampered with if conn_status != STATUS_IN_TRANSACTION and not conn.autocommit: conn.rollback() if type_data is None: raise ProgrammingError( "PostgreSQL type '{type}' not found".format(type=name)) return type_data