O PostgreSQL é um sistema de banco de dados extensível. Os usuários podem adicionar ao servidor funções que podem ser chamadas nas consultas, e até mesmo adicionar tipos de dado. Como estas facilidades existem apenas no PostgreSQL, as mesmas são suportadas no Java através de um conjunto de APIs de extensão. Algumas funcionalidades dentro do núcleo do driver padrão usam estas extensões para implementar Objetos Grandes, etc.
Para acessar algumas das extensões é necessário utilizar alguns métodos extras da classe org.postgresql.PGConnection
. Neste caso, será necessário transformar o valor retornado por Driver.getConnection()
. Por exemplo:
Connection db = Driver.getConnection(url, nome_do_usuário, senha); // ... // depois Fastpath fp = ((org.postgresql.PGConnection)db).getFastpathAPI();
org.postgresql.PGConnection
public class PGConnection
Abaixo estão os métodos extra utilizados para obter acesso às extensões do PostgreSQL.
public Fastpath getFastpathAPI() throws SQLExceptionRetorna a API de caminho rápido (fast-path) para a conexão corrente. É utilizada principalmente pela API LargeObject. A melhor forma de utilizar é a mostrada a seguir:
import org.postgresql.fastpath.*; ... Fastpath fp = ((org.postgresql.PGConnection)conn).getFastpathAPI();onde conn é uma
Connection
com o PostgreSQL aberta.
Fastpath
que permite acessar funções no servidor PostgreSQL.
SQLException
por Fastpath
ao inicializar pela primeira vez
public LargeObjectManager getLargeObjectAPI() throws SQLExceptionRetorna a API LargeObject para a conexão corrente. A melhor forma de utilizar é a mostrada a seguir:
import org.postgresql.largeobject.*; ... LargeObjectManager lo = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();onde conn é uma
Connection
com o PostgreSQL aberta.
LargeObject
que implementa a API
SQLException
por LargeObject
ao inicializar pela primeira vez
public void addDataType(String tipo, String nome)Permite o código cliente adicionar tratador para um dos tipos de dado únicos do PostgreSQL. Normalmente, um tipo de dado desconhecido pelo driver é retornado por ResultSet.getObject() como uma instância de
PGobject
. Este método permite escrever uma classe que estende PGobject
, e informar ao driver o nome do tipo e o nome da classe a ser utilizada. O problema é que este método deve ser chamado toda vez que for feita uma conexão.
A melhor forma de utilizar é a mostrada a seguir:
... ((org.postgresql.PGConnection)conn).addDataType("meu_tipo","minha.classe.nome"); ...onde conn é uma
Connection
aberta com o PostgreSQL. A classe tratadora deve estender org.postgresql.util.PGobject
.
org.postgresql.Fastpath
public class Fastpath extends Object java.lang.Object | +----org.postgresql.fastpath.Fastpath
Fastpath
é uma API que existe dentro da interface C da libpq, que permite a máquina cliente executar funções no servidor de banco de dados. A maior parte dos códigos cliente não precisa utilizar este método, mas é fornecido porque é utilizado pela API LargeObject.
Para usá-lo é necessário importar o pacote org.postgresql.fastpath
, utilizando a linha:
import org.postgresql.fastpath.*;
Depois, no código, é necessário obter um objeto FastPath
:
Fastpath fp = ((org.postgresql.PGConnection)conn).getFastpathAPI();
A linha acima retorna uma instância associada à conexão com o banco de dados, que pode ser utilizada para executar comandos. A conversão de Connection
em org.postgresql.PGConnection
é necessária, porque getFastpathAPI()
é um método de extensão, e não parte do JDBC. Uma vez obtida uma instância de Fastpath
, podem ser utilizados os métodos fastpath()
para executar uma função do servidor.
Veja também: FastpathFastpathArg
, LargeObject
public Object fastpath(int fnid, boolean resulttype, FastpathArg args[]) throws SQLExceptionEnvia uma chamada de função para o servidor PostgreSQL.
FastpathArguments
a serem passados para a chamada de fast-path.
public Object fastpath(String nome, boolean resulttype, FastpathArg args[]) throws SQLExceptionEnvia uma chamada para o servidor PostgreSQL por nome.
Nota: O mapeamento entre nome de procedimento e identificador de função precisa existir, geralmente é feito através de uma chamada prévia a addfunction()
. Este é o método preferido para chamar, porque os identificadores de função podem mudar entre versões do servidor. Para ver um exemplo mostrando como funciona, consulte org.postgresql.LargeObject
FastpathArguments
a serem passados para a chamada de fast-path.
LargeObject
public int getInteger(String nome, FastpathArg args[]) throws SQLExceptionEste método assume que o valor retornado é um Integer
SQLException
se ocorrer um erro de acesso ao banco de dados ou não houver resultado
public byte[] getData(String nome, FastpathArg args[]) throws SQLExceptionEste método assume que o valor retornado é binário
SQLException
se ocorrer um erro de acesso ao banco de dados ou não houver resultado
public void addFunction(String nome, int fnid)Adiciona uma função à tabela de procura. Pode ser utilizado o método
addFunctions
, que tem por base uma consulta, em vez de especificar diretamente o OID. Não há garantia que o OID da função permaneça estático, mesmo entre servidores diferentes com a mesma versão.
public void addFunctions(ResultSet rs) throws SQLExceptionRecebe um
ResultSet
contendo duas colunas. A coluna 1 contém o nome da função e a coluna 2 o OID. Todo o ResultSet
é lido e os valores são carregados na tabela de função.
Importante: Lembre-se de fechar (close()
) oResultSet
após a chamada!
Notas de implementação sobre a procura de nome de função: O PostgreSQL armazena os identificadores das funções e seus nomes correspondentes na tabelapg_proc
. Para acelerar o processamento local, em vez de consultar cada função na tabela toda vez que for necessário, é utilizada umaHashtable
. Também, somente as funções necessárias são colocadas nesta tabela, tornando o tempo de conexão o mais rápido possível. A classeorg.postgresql.LargeObject
realiza a consulta ao ser inicializada, e passa oResultSet
retornado para o métodoaddFunctions()
. Após o término, a API LargeObject faz referência às funções por nome. Não se deve supor que vai funcionar se forem convertidos manualmente nos OIDs. Está certo, por ora funcionam, mas podem mudar durante o desenvolvimento (existia alguma explicação sobre este assunto para a versão V7.0) e, portanto, isto é implementado para prevenir contra dores de cabeça futuras.
LargeObjectManager
public int getID(String nome) throws SQLExceptionRetorna o identificador de função associado a partir do nome. Se
addFunction()
ou addFunctions()
ainda não tiver sido chamada para este nome, então é lançada uma exceção SQLException
.
org.postgresql.fastpath.FastpathArg
public class FastpathArg extends Object java.lang.Object | +----org.postgresql.fastpath.FastpathArg
Cada chamada de fast-path requer uma matriz de argumentos, o número e o tipo dependendo da função sendo chamada. Esta classe implementa os métodos necessários para fornecer esta capacidade.
Para ver um exemplo de sua utilização consulte o pacote org.postgresql.LargeObject
.
Veja também: Fastpath
, LargeObjectManager
, LargeObject
public FastpathArg(int valor)Constrói um argumento que consiste em um valor inteiro
public FastpathArg(byte bytes[])Constrói um argumento que consiste em uma matriz de bytes
public FastpathArg(byte buf[], int off, int len)Constrói um argumento que consiste em uma parte de uma matriz de bytes
public FastpathArg(String s)Constrói um argumento que consiste em uma cadeia de caracteres.
O PostgreSQL possui um conjunto de tipos de dado que podem armazenar características geométricas em uma tabela. Fazem parte pontos, linhas e polígonos. Estes tipos são suportados no Java através do pacote org.postgresql.geometric, que contém classes que estendem a classe org.postgresql.util.PGobject. Consulte esta classe para obter detalhes sobre como implementar seus próprios tratadores de tipo de dado.
Class org.postgresql.geometric.PGbox java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGbox public class PGbox extends PGobject implements Serializable, Cloneable Representa o tipo de dado caixa no PostgreSQL. Variáveis public PGpoint point[] Dois pontos do canto da caixa. Construtores public PGbox(double x1, double y1, double x2, double y2) Parâmetros: x1 - primeira coordenada x y1 - primeira coordenada y x2 - segunda coordenada x y2 - segunda coordenada y public PGbox(PGpoint p1, PGpoint p2) Parâmetros: p1 - primeiro ponto p2 - segundo ponto public PGbox(String s) throws SQLException Parâmetros: s - definição da caixa na sintaxe do PostgreSQL Lança: SQLException se a definição não for válida public PGbox() Construtor requerido Métodos public void setValue(String valor) throws SQLException Este método define o valor deste objeto. Deve ser sobreposta, mas ainda chamada por subclasses. Parâmetros: valor - a representação do valor do objeto em uma cadeia de caracteres Lança: SQLException lançado se o valor for inválido para este tipo Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se as duas caixas forem idênticas Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGbox na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject Class org.postgresql.geometric.PGcircle java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGcircle public class PGcircle extends PGobject implements Serializable, Cloneable Representa o tipo de dado círculo do PostgreSQL, que consiste em um ponto e o raio Variáveis public PGpoint center O ponto do centro double radius O raio Construtores public PGcircle(double x, double y, double r) Parâmetros: x - coordenada do centro y - coordenada do centro r - raio do círculo public PGcircle(PGpoint c, double r) Parâmetros: c - PGpoint descrevendo o centro do círculo r - raio do círculo public PGcircle(String s) throws SQLException Parâmetros: s - definição do círculo na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão public PGcircle() Este construtor é utilizado pelo driver. Métodos public void setValue(String s) throws SQLException Parâmetros: s - definição do círculo na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se os dois círculos forem idênticos Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGcircle na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject Class org.postgresql.geometric.PGline java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGline public class PGline extends PGobject implements Serializable, Cloneable Implementa uma linha consistindo em dois pontos. Atualmente linha ainda não está implementada no servidor, mas esta classe garante que quando for feito estaremos pronto para isso. Variáveis public PGpoint point[] São os dois pontos. Construtores public PGline(double x1, double y1, double x2, double y2) Parâmetros: x1 - coordenada do primeiro ponto y1 - coordenada do primeiro ponto x2 - coordenada do segundo ponto y2 - coordenada do segundo ponto public PGline(PGpoint p1, PGpoint p2) Parâmetros: p1 - primeiro ponto p2 - segundo ponto public PGline(String s) throws SQLException Parâmetros: s - definição da linha na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão public PGline() requerido pelo driver Métodos public void setValue(String s) throws SQLException Parâmetros: s - Definição do segmento de linha na sintaxe do PostgreSQL Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se as duas linhas fore idênticas Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGline na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject Class org.postgresql.geometric.PGlseg java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGlseg public class PGlseg extends PGobject implements Serializable, Cloneable Implementa lseg (segmento de linha) consistindo em dois pontos Variáveis public PGpoint point[] Os dois pontos. Construtores public PGlseg(double x1, double y1, double x2, double y2) Parâmetros: x1 - coordenada do primeiro ponto y1 - coordenada do primeiro ponto x2 - coordenada do segundo ponto y2 - coordenada do segundo ponto public PGlseg(PGpoint p1, PGpoint p2) Parâmetros: p1 - primeiro ponto p2 - segundo ponto public PGlseg(String s) throws SQLException Parâmetros: s - Definição do segmento de linha na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão public PGlseg() requerido pelo driver Métodos public void setValue(String s) throws SQLException Parâmetros: s - Definição do segmento de linha na sintaxe do PostgreSQL Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se os dois segmentos de linha forem idênticos Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGlseg na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject Class org.postgresql.geometric.PGpath java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpath public class PGpath extends PGobject implements Serializable, Cloneable Implementa o caminho (uma linha com vários segmentos, que pode ser fechada) Variáveis public boolean open Verdade se o caminho for aberto, falso se for fechado public PGpoint points[] Os pontos que definem o caminho Construtores public PGpath(PGpoint points[], boolean open) Parâmetros: points - os PGpoints que definem o caminho open - Verdade se o caminho for aberto, falso se for fechado public PGpath() Requerido pelo driver public PGpath(String s) throws SQLException Parâmetros: s - definição do caminho na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão Métodos public void setValue(String s) throws SQLException Parâmetros: s - definição do caminho na sintaxe do PostgreSQL Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se os dois caminhos forem idênticos Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna o caminho na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject public boolean isOpen() Retorna verdade se o caminho for aberto public boolean isClosed() Retorna verdade se o caminho for fechado public void closePath() Marca o caminho como fechado public void openPath() Marca o caminho como aberto Class org.postgresql.geometric.PGpoint java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpoint public class PGpoint extends PGobject implements Serializable, Cloneable Implementa a versão de java.awt.Point, exceto por utilizar precisão dupla para representar as coordenadas. Mapeia para o tipo de dado ponto do PostgreSQL. Variáveis public double x coordenada X do ponto public double y coordenada Y do ponto Construtores public PGpoint(double x, double y) Parâmetros: x - coordenada y - coordenada public PGpoint(String valor) throws SQLException Chamado principalmente pelos outros tipos geométricos, quando o ponto está incorporado na sua definição. Parâmetros: valor - Definição do ponto na sintaxe do PostgreSQL public PGpoint() Requerido pelo driver Métodos public void setValue(String s) throws SQLException Parâmetros: s - Definição do ponto na sintaxe do PostgreSQL Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se os dois pontos forem idênticos Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGpoint na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject public void translate(int x, int y) Translação do ponto na quantidade especificada Parâmetros: x - quantidade inteira a ser adicionada ao eixo x y - quantidade inteira a ser adicionada ao eixo y public void translate(double x, double y) Translação do ponto na quantidade especificada Parâmetros: x - quantidade em precisão dupla a ser adicionada ao eixo x y - quantidade em precisão dupla a ser adicionada ao eixo y public void move(int x, int y) Move o ponto para as coordenadas fornecidas. Parâmetros: x - coordenada inteira y - coordenada inteira public void move(double x, double y) Move o ponto para as coordenadas fornecidas. Parâmetros: x - coordenada em precisão dupla y - coordenada em precisão dupla public void setLocation(int x, int y) Move o ponto para as coordenadas fornecidas. Consulte java.awt.Point para obter a descrição Parâmetros: x - coordenada inteira y - coordenada inteira Veja também: Point public void setLocation(Point p) Move o ponto para as coordenadas java.awt.Point fornecidas. Consulte java.awt.Point para obter a descrição Parâmetros: p - Ponto para mover para Veja também: Point Class org.postgresql.geometric.PGpolygon java.lang.Object | +----org.postgresql.util.PGobject | +----org.postgresql.geometric.PGpolygon public class PGpolygon extends PGobject implements Serializable, Cloneable Implementa o tipo de dado polígono no PostgreSQL. Variáveis public PGpoint points[] Os pontos que definem o polígono Construtores public PGpolygon(PGpoint points[]) Cria um polígono utilizando uma matriz de PGpoints Parâmetros: points - os pontos que definem o polígono public PGpolygon(String s) throws SQLException Parâmetros: s - definição do polígono na sintaxe do PostgreSQL. Lança: SQLException na falha de conversão public PGpolygon() Requerido pelo driver Métodos public void setValue(String s) throws SQLException Parâmetros: s - definição do polígono na sintaxe do PostgreSQL Lança: SQLException na falha de conversão Sobrepõe: setValue na classe PGobject public boolean equals(Object obj) Parâmetros: obj - Objeto a ser comparado Retorna: verdade se os dois polígonos forem idênticos Sobrepõe: equals na classe PGobject public Object clone() Deve ser sobreposta para permitir a clonagem do objeto Sobrepõe: clone na classe PGobject public String getValue() Retorna: PGpolygon na sintaxe esperada pelo PostgreSQL Sobrepõe: getValue na classe PGobject
Os Objetos Grandes são suportados na especificação padrão do JDBC. Entretanto, a interface é limitada e a API fornecida pelo PostgreSQL permite o acesso aleatório ao conteúdo do objeto, como se fosse um arquivo local.
O pacote org.postgresql.largeobject fornece ao Java a interface C da API de objeto grande da libpq. Consiste em duas classes, LargeObjectManager
, que trata da criação, abertura e exclusão de objetos grandes, e LargeObject
que trata individualmente os objetos.
org.postgresql.largeobject.LargeObject
public class LargeObject extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObject
Esta classe implementa a interface de objeto grande do PostgreSQL.
Fornece os métodos básicos requeridos para executar a interface, mais um par de métodos que fornecem as classes InputStream
e OutputStream
para o objeto.
Normalmente, o código cliente utiliza os métodos de BLOB
para acessar os objetos grandes.
Entretanto, algumas vezes é necessário acesso de baixo nível aos Objetos Grandes que não são suportados pela especificação do JDBC.
Consulte org.postgresql.largeobject.LargeObjectManager para ver como obter acesso aos Objetos Grandes, ou como criar um.
Veja também: LargeObjectManager
public int getOID()Retorna o OID deste
LargeObject
public void close() throws SQLExceptionEste método fecha o objeto. Não devem ser chamados métodos do objeto após este método ter sido chamado.
public byte[] read(int len) throws SQLExceptionLê alguns dados do objeto, retornando uma matriz de byte[]
public int read(byte buf[], int off, int len) throws SQLExceptionLê alguns dados do objeto para dentro de uma matriz existente
public void write(byte buf[]) throws SQLExceptionEscreve uma matriz em um objeto
public void write(byte buf[], int off, int len) throws SQLExceptionEscreve alguns dados da matriz no objeto
org.postgresql.largeobject.LargeObjectManager
public class LargeObjectManager extends Object java.lang.Object | +----org.postgresql.largeobject.LargeObjectManager
Esta classe implementa a interface de objeto grande do PostgreSQL. Fornece métodos que permitem o código cliente criar, abrir e excluir objetos grandes no banco de dados. Ao se abrir um objeto, é retornada uma instância de org.postgresql.largeobject.LargeObject
e, então, seus métodos permitem acessar o objeto.
Esta classe somente pode ser criada por org.postgresql.PGConnection. Para obter acesso a esta classe, deve ser utilizado o seguinte segmento de código:
import org.postgresql.largeobject.*; Connection conn; LargeObjectManager lobj; // ... código que abre a conexão... lobj = ((org.postgresql.PGConnection)conn).getLargeObjectAPI();
Normalmente, o código cliente utiliza os métodos de BLOB
para acessar os objetos grandes.
Entretanto, algumas vezes é necessário acesso de baixo nível aos Objetos Grandes que não são suportados pela especificação do JDBC.
Consulte org.postgresql.largeobject.LargeObjectManager para ver como manipular o conteúdo dos Objetos Grandes.
public LargeObject open(int oid) throws SQLExceptionAbre um objeto grande existente com base em seu OID. Este método assume que está sendo requerido acesso de READ e de WRITE (o padrão).
public LargeObject open(int oid, int mode) throws SQLExceptionAbre um objeto grande existente com base em seu OID. Permite definir o método de acesso.
public int create() throws SQLExceptionCria um objeto grande e retorna o seu OID. O padrão é READWRITE para atributos do novo objeto.
public int create(int mode) throws SQLExceptionCria um objeto grande e retorna o seu OID. Define o modo de acesso.
public void delete(int oid) throws SQLExceptionRemove um objeto grande.
public void unlink(int oid) throws SQLExceptionRemove um objeto grande. É idêntico ao método acima. É fornecido porque a API C utiliza "unlink".