Estripando o Elefante
   Como estender o
    PostgreSQL...
  … estripando sua aplicação e dividindo
            um problemão em
   problemas menores utilizando extensões?




            por Dickson S. Guedes
                   (@guediz)
           PGBR 2011, 4 de Novembro
Estripando o Elefante
   Como estender o
    PostgreSQL...
  … estripando sua aplicação e dividindo
            um problemão em
   problemas menores utilizando extensões?




            por Dickson S. Guedes
                   (@guediz)
           PGBR 2011, 4 de Novembro
ADVERTÊNCIA!
ESTA PALESTRA
 POSSUI CONTEÚDO
QUE PODE QUEBRAR
     CERTOS
 PARADÍGMAS SEUS
“Quando você faz as
  coisas sempre do
mesmo jeito, obterá
 sempre os mesmos
  resultados” – Alguém
No começo haviam vários bancos
espalhados com várias funções...
PostgreSQL 9.0
              +
          PL/Perl
              +
Funções definidas pelo usuário
… e então perdeu-se o controle.
… e então perdeu-se o controle.

         Gerenciamento manual
         Não havia controle de versão
         Falta de abstração, e modularidade
         Sem reutilização de código
Como melhorar?
Primeiramente entendendo o
        problema...
Primeiramente entendendo o
         problema...

Pensando fora da caixa!
pessoas                       usuarios



     email_valido()          cpf_valido()




PL/perl               PL/pgsql              SQL


             PostgreSQL 9.1
As aplicações precisavam ser
       modularizadas...
As aplicações precisavam ser
       modularizadas...

     … e o banco precisava ser
                    atualizado
As aplicações precisavam ser
       modularizadas...

     … e o banco precisava ser
                    atualizado
Até então não tinhamos....
●   Versionamento de funções no banco
●   Gerenciamento de contribs
    ●     saber facilmente quais contribs estão instaladas, por exemplo
●   Modularidade
●   Reaproveitamento de código
●   Contribuições para comunidade
●   ...
Até então não tinhamos....
●   Versionamento de funções no banco
●   Gerenciamento de contribs
    ●     saber facilmente quais contribs estão instaladas, por exemplo
●   Modularidade
●   Reaproveitamento de código
●   Contribuições para comunidade
●   ...

            SIM! Eu consigo dividir para conquistar!
Tá! E como o PostgreSQL pode
           ajudar?
EXTENSÕES
EXTENSÕES

  POR QUE?
Porque o PostgreSQL é
divertidamente estendível !
Por que o PostgreSQL é
divertidamente estendível ?
Por que o PostgreSQL é
divertidamente estendível ?

É guiado por catálogo!
Catálogo do sistema


             Metadados


                      Dicionário de dados
Catálogo do sistema


             Metadados


                      Dicionário de dados

Diferença para outros SGDBS?
Tabelas
Colunas
              Tipos de dados
                                Funções
   Domínios
                          Métodos de acesso
                    ...
Tabelas
Colunas
              Tipos de dados
                                Funções
   Domínios
                          Métodos de acesso
                    ...
PostgreSQL não é
     apenas um
Sistema Gerenciador
de Banco de Dados ...
… ele é uma Plataforma
de Desenvolvimento de
      Aplicações
Você desenvolve bibliotecas de
  extensões reutilizáveis …
… e as combina para criar aplicações!
Vamos começar!
Banco PostgreSQL 9.0
           Varias tabelas
Várias funções em varias linguagens
         Código sem testes
 Pouco versionamento das funcoes
O dump possui o codigo das funcoes
Gerenciamento atraves de esquemas
Cadastro de pessoas
CREATE TABLE pessoas
(
     nro_cpf   cpf   PRIMARY KEY,
     nome      text NOT NULL,
     data_nascimento date
);
Cadastro de pessoas
CREATE TABLE pessoas
(
     nro_cpf   cpf   PRIMARY KEY,
     nome      text NOT NULL,
     data_nascimento date
);
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');

Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(12312312300, 'Ester Lionata Rio', '1981-04-22')
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES
(88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),
(96672786465, 'Enelildo Protolino Calado'   , '1983-02-13'),
(88856899302, 'Feicebuque Ailaique'         , '1976-07-06'),
(12563330858, 'Torrecilda Tapelia'          , '1987-11-16'),
(27837882334, 'Almofafio Vasildo Tomado'    , '1965-01-08'),
(25616561282, 'Uessebelson Blutuf'          , '1983-05-11');


Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento)
VALUES                VIOLATION!
(12312312300, 'Ester Lionata Rio', '1981-04-22')
Cadastro de usuarios
CREATE TABLE usuarios (
     login email PRIMARY KEY,
    nro_cpf cpf REFERENCES
pessoas(nro_cpf)
);
Cadastro de usuarios
CREATE TABLE usuarios (
     login email PRIMARY KEY,
    nro_cpf cpf REFERENCES
pessoas(nro_cpf)
);
Um operador especial
CREATE OPERATOR #? (
     LEFTARG   = numeric,
     PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR #? (
     LEFTARG   = numeric,
     PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR @? (
     LEFTARG = citext,
     PROCEDURE = email_valido
);
Um operador especial
CREATE OPERATOR @? (
     LEFTARG = citext,
     PROCEDURE = email_valido
);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
    ('adaloso@cahimbinho.net', 88856899302),
    ('enelildo@calado.com',     96672786465),
    ('feicebuque.ailaique@facebook.com', 88856899302),
    ('tata.torre87@hotmail.com', 12563330858),
    ('tomado35@gmail.com',       27837882334),
    ('usb.83@aasdasdasd.com',    25616561282);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
    ('adaloso@cahimbinho.net', 88856899302),
    ('enelildo@calado.com',     96672786465),
    ('feicebuque.ailaique@facebook.com', 88856899302),
    ('tata.torre87@hotmail.com', 12563330858),
    ('tomado35@gmail.com',       27837882334),
    ('usb.83@aasdasdasd.com',     25616561282);
Comportamento esperado
●   SELECT cpf_valido(59328253241); -- true
●   SELECT 59328253241 #?; -- true
●   SELECT 91416000433 #?; -- false
●   SELECT NOT 37821042003 #?; -- true
●   SELECT email_valido('xpto@net'); -- false
●   SELECT email_valido('xpto@hotmail.com'); -- true
●   SELECT 'rotime@net' @? ; -- false
●   SELECT 'feice@book.net' @? ; -- true
pessoas                         usuarios


                   Validadores
email_valido()                        cpf_valido()



 PL/perl                PL/pgsql          SQL


                 PostgreSQL 9.1
Cara! Show me the code!
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Makefile
EXTENSION    = validadores
EXTVERSION   = $(shell grep default_version $
(EXTENSION).control | sed -e
"s/default_version[[:space:]]*=[[:space:]]*'
([^']*)'/1/")

DATA         = $(filter-out $(wildcard sql/*--*.sql),$
(wildcard sql/*.sql))
DOCS         = $(wildcard doc/*.md)
TESTS        = $(wildcard test/sql/*.sql)
REGRESS      = $(patsubst test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS = --inputdir=test --load-language=plpgsql
#Descomente esta linha caso tenha funções em C
#MODULES      = $(patsubst %.c,%,$(wildcard src/*.c))
PG_CONFIG    = pg_config
PG91         = $(shell $(PG_CONFIG) --version | grep -qE
" 8.| 9.0" && echo no || echo yes)
Makefile
ifeq ($(PG91),yes)
all: sql/$(EXTENSION)--$(EXTVERSION).sql

sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql
   cp $< $@

DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$
(EXTVERSION).sql
EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql
endif

PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Controlfile: validadores.control
# validadores extension
comment = 'Extensao que contem validadores de CNPJ, CPF'
default_version = '0.0.1'
relocatable = true
Controlfile: validadores.control
# validadores extension
comment = 'Extensao que contem validadores de CNPJ, CPF'
default_version = '0.0.1'
relocatable = true




Learn more ...
http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Testes?
Em banco?
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Os passos
●   Prepare o código fonte, os testes e a
    documentação
●   Crie o arquivo Makefile
●   Crie o arquivo de controle
●   Escreva testes
●   Escreva o código
●   Documente
Gostei! Quero compartilhar!
Como faço?
PGXN!
PGXN

Um índice central de extensões do
          PostgreSQL
                 +
         Documentação
                 +
            Pesquisa
                 +
         Fácil instalação
Obrigado

David E. Wheeler!
     (@theory)
DEMO
PGXN Client


sudo apt­get install python­pip
pip install pgxnclient
pgxn –help

Ex. pgxn install resetsequence
Obrigado

Daniele Varrazzo!
     (@dvarrazzo)
DEMO
PGXN Utils


gem install pgxn_utils
pgxn_utils help
 
Ex. pgxn_utils skeleton teste
DEMO
Então...
Use extensões ao invés
 de scripts que criam
    objetos órfãos
O PostgreSQL vai saber
 que os objetos fazem
parte de um pacote e...
… poderá removê-los
  com um simples:
DROP EXTENSION … ;
pg_dump não vai fazer o
   dump de todos os
  objetos da extensão
O PostgreSQL não vai
 deixar você remover
  objetos individuais
Scripts de modificação
para upgrade de versão
    extensao--1.0.0--1.0.1.sql

  ALTER EXTENSION extensao
        UPDATE TO '1.0.1';
?
Referências
●   WEB
    ●   http://pgxn.org
    ●   http://blog.pgxn.org
    ●   http://www.postgresql.org.br
    ●   http://www.postgresql.org
●   IRC
    ●   irc.freenode.net
        –   Guedes @ #postgresql, #postgresql-br
●   Gtalk
    ●   guedes@guedesoft.net
●   Twitter
    ●   @pgxn
    ●   @guediz
    ●   @pgcasts
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

  • 1.
    Estripando o Elefante Como estender o PostgreSQL... … estripando sua aplicação e dividindo um problemão em problemas menores utilizando extensões? por Dickson S. Guedes (@guediz) PGBR 2011, 4 de Novembro
  • 2.
    Estripando o Elefante Como estender o PostgreSQL... … estripando sua aplicação e dividindo um problemão em problemas menores utilizando extensões? por Dickson S. Guedes (@guediz) PGBR 2011, 4 de Novembro
  • 3.
  • 4.
    ESTA PALESTRA POSSUICONTEÚDO QUE PODE QUEBRAR CERTOS PARADÍGMAS SEUS
  • 5.
    “Quando você fazas coisas sempre do mesmo jeito, obterá sempre os mesmos resultados” – Alguém
  • 6.
    No começo haviamvários bancos espalhados com várias funções...
  • 7.
    PostgreSQL 9.0 + PL/Perl + Funções definidas pelo usuário
  • 8.
    … e entãoperdeu-se o controle.
  • 9.
    … e entãoperdeu-se o controle. Gerenciamento manual Não havia controle de versão Falta de abstração, e modularidade Sem reutilização de código
  • 10.
  • 11.
  • 12.
    Primeiramente entendendo o problema... Pensando fora da caixa!
  • 13.
    pessoas usuarios email_valido() cpf_valido() PL/perl PL/pgsql SQL PostgreSQL 9.1
  • 14.
    As aplicações precisavamser modularizadas...
  • 15.
    As aplicações precisavamser modularizadas... … e o banco precisava ser atualizado
  • 16.
    As aplicações precisavamser modularizadas... … e o banco precisava ser atualizado
  • 17.
    Até então nãotinhamos.... ● Versionamento de funções no banco ● Gerenciamento de contribs ● saber facilmente quais contribs estão instaladas, por exemplo ● Modularidade ● Reaproveitamento de código ● Contribuições para comunidade ● ...
  • 18.
    Até então nãotinhamos.... ● Versionamento de funções no banco ● Gerenciamento de contribs ● saber facilmente quais contribs estão instaladas, por exemplo ● Modularidade ● Reaproveitamento de código ● Contribuições para comunidade ● ... SIM! Eu consigo dividir para conquistar!
  • 19.
    Tá! E comoo PostgreSQL pode ajudar?
  • 20.
  • 21.
  • 22.
    Porque o PostgreSQLé divertidamente estendível !
  • 23.
    Por que oPostgreSQL é divertidamente estendível ?
  • 24.
    Por que oPostgreSQL é divertidamente estendível ? É guiado por catálogo!
  • 25.
    Catálogo do sistema Metadados Dicionário de dados
  • 26.
    Catálogo do sistema Metadados Dicionário de dados Diferença para outros SGDBS?
  • 27.
    Tabelas Colunas Tipos de dados Funções Domínios Métodos de acesso ...
  • 28.
    Tabelas Colunas Tipos de dados Funções Domínios Métodos de acesso ...
  • 29.
    PostgreSQL não é apenas um Sistema Gerenciador de Banco de Dados ...
  • 30.
    … ele éuma Plataforma de Desenvolvimento de Aplicações
  • 31.
    Você desenvolve bibliotecasde extensões reutilizáveis …
  • 32.
    … e ascombina para criar aplicações!
  • 33.
  • 34.
    Banco PostgreSQL 9.0 Varias tabelas Várias funções em varias linguagens Código sem testes Pouco versionamento das funcoes O dump possui o codigo das funcoes Gerenciamento atraves de esquemas
  • 35.
    Cadastro de pessoas CREATETABLE pessoas ( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date );
  • 36.
    Cadastro de pessoas CREATETABLE pessoas ( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date );
  • 37.
    Cadastro de pessoas INSERTINTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11');
  • 38.
    Cadastro de pessoas INSERTINTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11');
  • 39.
    Cadastro de pessoas INSERTINTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11'); Mas... INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (12312312300, 'Ester Lionata Rio', '1981-04-22')
  • 40.
    Cadastro de pessoas INSERTINTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'), (96672786465, 'Enelildo Protolino Calado' , '1983-02-13'), (88856899302, 'Feicebuque Ailaique' , '1976-07-06'), (12563330858, 'Torrecilda Tapelia' , '1987-11-16'), (27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'), (25616561282, 'Uessebelson Blutuf' , '1983-05-11'); Mas... INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES VIOLATION! (12312312300, 'Ester Lionata Rio', '1981-04-22')
  • 41.
    Cadastro de usuarios CREATETABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCES pessoas(nro_cpf) );
  • 42.
    Cadastro de usuarios CREATETABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCES pessoas(nro_cpf) );
  • 43.
    Um operador especial CREATEOPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido );
  • 44.
    Um operador especial CREATEOPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido );
  • 45.
    Um operador especial CREATEOPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido );
  • 46.
    Um operador especial CREATEOPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido );
  • 47.
    Cadastro de usuarios INSERTINTO usuarios (login, nro_cpf) VALUES ('adaloso@cahimbinho.net', 88856899302), ('enelildo@calado.com', 96672786465), ('feicebuque.ailaique@facebook.com', 88856899302), ('tata.torre87@hotmail.com', 12563330858), ('tomado35@gmail.com', 27837882334), ('usb.83@aasdasdasd.com', 25616561282);
  • 48.
    Cadastro de usuarios INSERTINTO usuarios (login, nro_cpf) VALUES ('adaloso@cahimbinho.net', 88856899302), ('enelildo@calado.com', 96672786465), ('feicebuque.ailaique@facebook.com', 88856899302), ('tata.torre87@hotmail.com', 12563330858), ('tomado35@gmail.com', 27837882334), ('usb.83@aasdasdasd.com', 25616561282);
  • 49.
    Comportamento esperado ● SELECT cpf_valido(59328253241); -- true ● SELECT 59328253241 #?; -- true ● SELECT 91416000433 #?; -- false ● SELECT NOT 37821042003 #?; -- true ● SELECT email_valido('xpto@net'); -- false ● SELECT email_valido('xpto@hotmail.com'); -- true ● SELECT 'rotime@net' @? ; -- false ● SELECT 'feice@book.net' @? ; -- true
  • 50.
    pessoas usuarios Validadores email_valido() cpf_valido() PL/perl PL/pgsql SQL PostgreSQL 9.1
  • 51.
    Cara! Show methe code!
  • 52.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 53.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 54.
    Makefile EXTENSION = validadores EXTVERSION = $(shell grep default_version $ (EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*' ([^']*)'/1/") DATA = $(filter-out $(wildcard sql/*--*.sql),$ (wildcard sql/*.sql)) DOCS = $(wildcard doc/*.md) TESTS = $(wildcard test/sql/*.sql) REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS)) REGRESS_OPTS = --inputdir=test --load-language=plpgsql #Descomente esta linha caso tenha funções em C #MODULES = $(patsubst %.c,%,$(wildcard src/*.c)) PG_CONFIG = pg_config PG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8.| 9.0" && echo no || echo yes)
  • 55.
    Makefile ifeq ($(PG91),yes) all: sql/$(EXTENSION)--$(EXTVERSION).sql sql/$(EXTENSION)--$(EXTVERSION).sql:sql/$(EXTENSION).sql cp $< $@ DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$ (EXTVERSION).sql EXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sql endif PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS)
  • 56.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 57.
    Controlfile: validadores.control # validadoresextension comment = 'Extensao que contem validadores de CNPJ, CPF' default_version = '0.0.1' relocatable = true
  • 58.
    Controlfile: validadores.control # validadoresextension comment = 'Extensao que contem validadores de CNPJ, CPF' default_version = '0.0.1' relocatable = true Learn more ... http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
  • 59.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 60.
  • 61.
  • 62.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 63.
    Os passos ● Prepare o código fonte, os testes e a documentação ● Crie o arquivo Makefile ● Crie o arquivo de controle ● Escreva testes ● Escreva o código ● Documente
  • 64.
  • 65.
  • 66.
  • 67.
    PGXN Um índice centralde extensões do PostgreSQL + Documentação + Pesquisa + Fácil instalação
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
    Use extensões aoinvés de scripts que criam objetos órfãos
  • 77.
    O PostgreSQL vaisaber que os objetos fazem parte de um pacote e...
  • 78.
    … poderá removê-los com um simples: DROP EXTENSION … ;
  • 79.
    pg_dump não vaifazer o dump de todos os objetos da extensão
  • 80.
    O PostgreSQL nãovai deixar você remover objetos individuais
  • 81.
    Scripts de modificação paraupgrade de versão extensao--1.0.0--1.0.1.sql ALTER EXTENSION extensao UPDATE TO '1.0.1';
  • 82.
  • 83.
    Referências ● WEB ● http://pgxn.org ● http://blog.pgxn.org ● http://www.postgresql.org.br ● http://www.postgresql.org ● IRC ● irc.freenode.net – Guedes @ #postgresql, #postgresql-br ● Gtalk ● guedes@guedesoft.net ● Twitter ● @pgxn ● @guediz ● @pgcasts