Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
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