Translate

Pesquisar este blog

terça-feira, 2 de fevereiro de 2016

Criando uma função no PostgreSQL usando linguagem C - Parte 2: funções que recebem tipos compostos

Receber um registro de uma tabela, na lista de parâmetros é possível.

Observe que PG_MODULE_MAGIC só deve ser usada uma vez em todo o projeto, senão há erro de compilação.






#include "postgres.h"
#include "fmgr.h"  

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(limite_salario);

Datum limite_salario(PG_FUNCTION_ARGS)
{
    HeapTupleHeader  t = PG_GETARG_HEAPTUPLEHEADER(0);
    int32            limite = PG_GETARG_INT32(1);
    bool isnull;
    Datum salario = GetAttributeByName(t, "salario", &isnull);
 
    if (isnull)
        PG_RETURN_NULL(); 
 
  PG_RETURN_BOOL(DatumGetInt32(salario) > limite);
}



Existe uma tabela profissional assim:
create table profissional (
id serial primary key,
salario int,
nome varchar
);



Declarar a função assim:
CREATE FUNCTION limite_salario(profissional,int) returns bool
as '/tmp/teste.so', 'limite_salario' language c strict;






Chamar a função assim:
select a.*,limite_salario(a.*,10) from profissional a

Criando uma função no PostgreSQL usando linguagem C - Parte 1: funções de retorno simples

 É possível criar funções em linguagem C e chamá-las no banco PostgreSQL via SQL. Para isso é necessário criar uma biblioteca dinâmica (.so) contendo as rotinas.

As funções que fiz nesse exemplo usei o NetBeans. O Code::Blocks só travava na minha máquina.

É preciso colocar como diretório de inclusão de cabeçalhos /usr/include/postgresql/server . Claro esse caminho pode variar de distro.

Exemplo 1: Soma de dois parâmetros inteiros.

#include<postgres.h>
#include <fmgr.h>
#include<funcapi.h>

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(soma);


Datum soma(PG_FUNCTION_ARGS) {
 
     PG_RETURN_INT32( PG_GETARG_INT32(0)+PG_GETARG_INT32(1));
}


  • PG_MODULE_MAGIC:  Esta macro obrigatória indica que o arquivo .so é válido para ser usado pelo PostgreSQL.
  • PG_FUNCTION_INFO_V1: Cada função C que vai ser utilizada no banco deve ser declarada com o uso desta macro.
  • Datum: O retorno da função deve ser sempre do tipo Datum.
  • PG_FUNCTION_ARGS: A lista de parâmetros de entrada da função. Use a macro PG_GETARG_xxx(x)  para pegar esses valores de entrada.
  • PG_RETURN_xxx(x): Use no lugar de return.




Na Makefile do NetBeans eu coloco a seguinte linha no começo do arquivo  para ele copiar o teste.so para /tmp e ficar mais fácil com permissões.

install: build
    cp -f $(CND_ARTIFACT_PATH_Debug) /tmp/teste.so





Agora eh só declarar a função no SQL com os parâmetros de entrada e saída adequados.

CREATE FUNCTION soma(integer,integer) RETURNS integer
     AS '/tmp/teste.so', 'soma'
     LANGUAGE C STRICT;