SlideShare a Scribd company logo
1 of 25
Download to read offline
PGDay.IT 2011
                                             Monash University Prato Centre
                                                 Venerdì 25 Novembre 2011




Scrivere un'estensione
 per PostgreSQL 9.1
            Marco Nenciarini
    Italian PostgreSQL Users Group



            www.itpug.org
          www.postgresql.org
                  Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                        Monash University Prato Centre
                                                            Venerdì 25 Novembre 2011




  Marco Nenciarini
• DBA, sviluppatore e sysadmin presso 2ndQuadrant
   – Database OLTP business critical
   – Data warehousing
• Membro della comunità di PostgreSQL
   – Co-Fondatore di ITPUG
• Debian Developer




                             Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                  Monash University Prato Centre
                                                      Venerdì 25 Novembre 2011




    Sommario
•   Perché le estensioni
•   Anatomia di un'estensione
•   Installazione
•   Manutenzione e aggiornamento
•   PGXN
•   Conclusioni




                       Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                      Monash University Prato Centre
                                                          Venerdì 25 Novembre 2011




  Ecosistema PostgreSQL
• Estensibilità
• Ricca documentazione
• Grande quantità di moduli aggiuntivi
   – 46 Contrib, molteplici estensioni, estensioni private
   – PostGIS, hstore, adminpack, dblink, ltree, pgq, ip4r, intagg,
     cube, pgfincore, pgcrypto, citext, pg_trgm, wildspeed, temporal,
     prexpg_stattuple, pg_freespacemap, pg_stat_statements, …




                           Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Prima di PostgreSQL 9.1
• Installazione tramite script
apt-get install postgresql-contrib-9.0
psql -f /usr/share/postgresql/9.0/contrib/cube.sql


• Lo script sql può contenere molti oggetti
• Tutti gli oggetti vengono creati nello schema di default
• Difficoltà di gestione in database multi-schema



                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                       Monash University Prato Centre
                                                           Venerdì 25 Novembre 2011




   Perché le estensioni
• Supporto migliore per dump e restore
• Separazione logica fra l'estensione e gli altri oggetti
  presenti nel database
    – Non fa parte dei dati
    – È una dipendenza dei dati
• Installazione in uno schema specifico
• Operazioni di manutenzione semplificate
CREATE EXTENSION IF NOT EXISTS cube WITH SCHEMA public;



                            Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                      Monash University Prato Centre
                                                          Venerdì 25 Novembre 2011




   Anatomia di un'estensione
• File di controllo
   – Metadati
   – Impostazioni
   – Dipendenze
• Script SQL di installazione
   – Nessuna nuova sintassi da imparare
   – Ambiente di esecuzione controllato
• Script SQL di aggiornamento (opzionali)
• Moduli binari (opzionali)

                           Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                 Monash University Prato Centre
                                                     Venerdì 25 Novembre 2011




   Il file di controllo
• In ${SHAREDIR}/extension
• Si deve chiamare <nome_estensione>.control
• Sintassi chiave/valore (come postgresql.conf)

$ cat /usr/share/postgresql/9.1/extension/pair.control
# pair extension
comment = 'A key/value pair data type'
default_version = '1.0'
relocatable = true



                      Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                        Monash University Prato Centre
                                                            Venerdì 25 Novembre 2011




    Lo script di installazione
• <estensione>--<versione>.sql
• È un normale script SQL
• Viene eseguito all'interno di una transazione
    – No BEGIN/COMMIT/ROLLBACK
• Ambiente controllato
    – Tutto quello che viene creato fa parte dell'estensione
• Due sostituzioni possibili
    – MODULE_PATHNAME
    – @extschema@
•
                             Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                               Monash University Prato Centre
                                                   Venerdì 25 Novembre 2011




   Esempio: pair--1.0.sql
CREATE TYPE pair AS ( k text, v text );
ALTER EXTENSION pair DROP TYPE _pair; -- bug 9.1
CREATE OR REPLACE FUNCTION pair(text, text)
RETURNS pair
LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair;';

CREATE OPERATOR ~> (
   LEFTARG = text,
   RIGHTARG = text,
   PROCEDURE = pair);

                    Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Esempio: estensione non rilocabile
• Se l'estensione necessita conoscere schema di
  destinazione durante l'installazione essere marcata come
  non rilocabile
   – Usare @extschema@ come segnaposto per lo schema
   – relocatable = false
• Se l'estensione necessita di essere installata in uno
  schema specifico
   – relocatable = false
   – schema = schema_di_destinazione


                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                      Monash University Prato Centre
                                                          Venerdì 25 Novembre 2011




   Installazione
• CREATE EXTENSION
   –   IF NOT EXISTS
   –   SCHEMA <schema_esistente>
   –   VERSION <versione>
   –   FROM <versione_modulo>

CREATE EXTENSION hstore;

CREATE EXTENSION cube FROM unpackaged;


                           Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                       Monash University Prato Centre
                                                           Venerdì 25 Novembre 2011




    Ispezione da psql
postgres=# dx
             List of installed extensions
 Name | Version | Schema |        Description
------+---------+--------+----------------------------
 pair | 1.0     | pair   | A key/value pair data type
(1 row)

postgres=# dx+
  Objects in extension "pair"
      Object Description
-------------------------------
 function pair.pair(text,text)
 operator pair.~>(text,text)
 type pair.pair
(3 rows)


                            Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                       Monash University Prato Centre
                                                           Venerdì 25 Novembre 2011




   Supporto per il dump/restore
• L'estensione è una dipendenza
    – Una sola riga nel dump (commenti esclusi)
• L'estensione può contenere tabelle
    – Le tabelle non compaiono nel dump
    – Ma le tabelle possono essere modificate!
$ pg_dump | grep pair
-- Name: pair; Type: EXTENSION; Schema: -; Owner:
CREATE EXTENSION IF NOT EXISTS pair WITH SCHEMA public;
-- Name: EXTENSION pair; Type: COMMENT; Schema: -; Owner:
COMMENT ON EXTENSION pair IS 'A key/value pair data type';


                            Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                         Monash University Prato Centre
                                                             Venerdì 25 Novembre 2011




   Tabelle
CREATE TABLE extconfig (
   key text,
   value text,
  standard_entry boolean
);

SELECT pg_catalog.pg_extension_config_dump(
   'extconfig', 'WHERE NOT standard_entry'
);

Supporto per tabelle di configurazione
    – Dump del solo contenuto
    – Possibilità di discriminare fra dati di default e dati aggiuntivi

                              Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                  Monash University Prato Centre
                                                      Venerdì 25 Novembre 2011




   Manutenzione
• Aggiornamento atomico

ALTER EXTENSION pair UPDATE;

• Rilocazione in uno schema diverso
ALTER EXTENSION pair SET SCHEMA pair;




                       Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




    Gli script di aggiornamento
•   <estensione>--<da_versione>--<a_versione>.sql
•   Stessa sintassi dello script di installazione
•   Strada più corta per la versione richiesta
•   Nessuna assunzione su ordinamento
    – Downgrade
    – Nomi simbolici
• Funzione pg_extension_update_paths('estensione')
• Versione “unpackaged”


                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                 Monash University Prato Centre
                                                     Venerdì 25 Novembre 2011




   Esempio: pair--unpackaged--1.0.sql
• Si basa su un'estensione vuota
• Aggiunge manualmente il contenuto del vecchio modulo

ALTER EXTENSION pair ADD
  TYPE pair;
ALTER EXTENSION pair ADD
  FUNCTION pair(text, text);
ALTER EXTENSION pair ADD
  OPERATOR ~> (text,text);



                      Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Esempio: pair--1.0--1.1.sql
CREATE OR REPLACE FUNCTION pair(anyelement, anyelement)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';
CREATE OR REPLACE FUNCTION pair(text, anyelement)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';
CREATE OR REPLACE FUNCTION pair(anyelement, anyelement)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';
CREATE OPERATOR ~>
  (LEFTARG = text, RIGHTARG = anyelement, PROCEDURE = pair);
CREATE OPERATOR ~>
  (LEFTARG = anyelement, RIGHTARG = text, PROCEDURE = pair);
CREATE OPERATOR ~>
  (LEFTARG = anyelement, RIGHTARG = anyelement,
    PROCEDURE = pair);


                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Esempio: pg_extension_update_paths
postgres=# SELECT * FROM pg_extension_update_paths('pair');
   source   |    target  |          path
------------+------------+----------------------
 1.0        | 1.1        | 1.0--1.1
 1.0        | unpackaged |
 1.1        | 1.0        |
 1.1        | unpackaged |
 unpackaged | 1.0        | unpackaged--1.0
 unpackaged | 1.1        | unpackaged--1.0--1.1
(6 rows)




                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                         Monash University Prato Centre
                                                             Venerdì 25 Novembre 2011




  PostgreSQL eXtension Network - PGXN
• http://pgxn.org/
• Obiettivo: raccogliere tutte le estensioni open source
• PGXN Client
   – simile a apt-get o yum
       • pgxn install estensione
       • pgxn search parola
• PGXN Utils
   – Ausilio per lo sviluppatore di estensioni



                              Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   META.json
• Specifiche http://pgxn.org/spec/
{
   "name": "pair",
   "abstract": "A key/value pair data type",
   "version": "0.1.0",
   "maintainer": "Marco Nenciarini <info@2ndQuadrant.it>",
   "license": "postgresql",
   "meta­spec": {
      "version": "1.0.0",
      "url": "http://pgxn.org/meta/spec.txt"
   },
}


                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Conclusioni
• Usare moduli aggiuntivi non è mai stato così facile
• Vantaggi anche per chi sviluppa estensioni
   – Robustezza
   – Manutenibilità
• Applicazioni come estensioni
   – Aggiornamento atomico
   – Packaging
   – Dump selettivo
• Lenta migrazione dei moduli esistenti

                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                  Monash University Prato Centre
                                                      Venerdì 25 Novembre 2011




  Domande?
• E-Mail: marco.nenciarini@2ndquadrant.it
• URL: www.2ndquadrant.it
• Blog: blog.2ndquadrant.it




                       Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
PGDay.IT 2011
                                                    Monash University Prato Centre
                                                        Venerdì 25 Novembre 2011




   Licenza Creative Commons
Attribuzione
Non commerciale
Condividi allo stesso modo
2.5 Italia

http://creativecommons.org/licenses/by-nc-sa/2.5/it/
© 2011 2ndQuadrant Italia - http://www.2ndquadrant.it




                         Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org

More Related Content

Similar to Scrivere un'estensione per PostgreSQL 9.1

Serializable Snapshot Isolation in PostgreSQL 9.1
Serializable Snapshot Isolation in PostgreSQL 9.1Serializable Snapshot Isolation in PostgreSQL 9.1
Serializable Snapshot Isolation in PostgreSQL 9.1Marco Nenciarini
 
Esame di Stato: idee Hardware e Software
Esame di Stato: idee Hardware e SoftwareEsame di Stato: idee Hardware e Software
Esame di Stato: idee Hardware e SoftwareFabio Mora
 
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...ICTeam S.p.A.
 
Open Web Studio (Roberto Caporale)
Open Web Studio (Roberto Caporale)Open Web Studio (Roberto Caporale)
Open Web Studio (Roberto Caporale)DotNetMarche
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERDotNetCampus
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
 
05 azure well architected framework
05 azure well architected framework05 azure well architected framework
05 azure well architected frameworkRauno De Pasquale
 
Delphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingDelphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingMarco Breveglieri
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...Alessandro Alpi
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming LanguagePasquale Paola
 
Machine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsMachine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsIgor Antonacci
 
Deftcon 2012 - Paolo Dal Checco - Timeline e Supertimeline
Deftcon 2012 - Paolo Dal Checco - Timeline e SupertimelineDeftcon 2012 - Paolo Dal Checco - Timeline e Supertimeline
Deftcon 2012 - Paolo Dal Checco - Timeline e SupertimelineSandro Rossetti
 
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...Alex Ronci
 
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...festival ICT 2016
 

Similar to Scrivere un'estensione per PostgreSQL 9.1 (20)

L'Elefante e la Nuvola
L'Elefante e la NuvolaL'Elefante e la Nuvola
L'Elefante e la Nuvola
 
Serializable Snapshot Isolation in PostgreSQL 9.1
Serializable Snapshot Isolation in PostgreSQL 9.1Serializable Snapshot Isolation in PostgreSQL 9.1
Serializable Snapshot Isolation in PostgreSQL 9.1
 
Esame di Stato: idee Hardware e Software
Esame di Stato: idee Hardware e SoftwareEsame di Stato: idee Hardware e Software
Esame di Stato: idee Hardware e Software
 
Maven Eclipse
Maven EclipseMaven Eclipse
Maven Eclipse
 
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
AWR analysis (o di come utilizzare l’AWR per condurre un’analisi di un databa...
 
Open Web Studio (Roberto Caporale)
Open Web Studio (Roberto Caporale)Open Web Studio (Roberto Caporale)
Open Web Studio (Roberto Caporale)
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVER
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql Server
 
05 azure well architected framework
05 azure well architected framework05 azure well architected framework
05 azure well architected framework
 
Delphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingDelphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del Testing
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
 
Selex Sistemi Integrati - Success Story
Selex Sistemi Integrati - Success StorySelex Sistemi Integrati - Success Story
Selex Sistemi Integrati - Success Story
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming Language
 
free radius 201106
free radius 201106free radius 201106
free radius 201106
 
Sinossi
SinossiSinossi
Sinossi
 
Machine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsMachine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devops
 
Deftcon 2012 - Paolo Dal Checco - Timeline e Supertimeline
Deftcon 2012 - Paolo Dal Checco - Timeline e SupertimelineDeftcon 2012 - Paolo Dal Checco - Timeline e Supertimeline
Deftcon 2012 - Paolo Dal Checco - Timeline e Supertimeline
 
Slides marcosabatini
Slides marcosabatiniSlides marcosabatini
Slides marcosabatini
 
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
PROGETTAZIONE E SVILUPPO DI UN FRAMEWORK DI SUPPORTO IN AMBIENTE AZIENDALE SU...
 
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...
festival ICT 2013: Gestire criticità in maniera efficiente per liberare slot ...
 

Scrivere un'estensione per PostgreSQL 9.1

  • 1. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Scrivere un'estensione per PostgreSQL 9.1 Marco Nenciarini Italian PostgreSQL Users Group www.itpug.org www.postgresql.org Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 2. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Marco Nenciarini • DBA, sviluppatore e sysadmin presso 2ndQuadrant – Database OLTP business critical – Data warehousing • Membro della comunità di PostgreSQL – Co-Fondatore di ITPUG • Debian Developer Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 3. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Sommario • Perché le estensioni • Anatomia di un'estensione • Installazione • Manutenzione e aggiornamento • PGXN • Conclusioni Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 4. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Ecosistema PostgreSQL • Estensibilità • Ricca documentazione • Grande quantità di moduli aggiuntivi – 46 Contrib, molteplici estensioni, estensioni private – PostGIS, hstore, adminpack, dblink, ltree, pgq, ip4r, intagg, cube, pgfincore, pgcrypto, citext, pg_trgm, wildspeed, temporal, prexpg_stattuple, pg_freespacemap, pg_stat_statements, … Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 5. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Prima di PostgreSQL 9.1 • Installazione tramite script apt-get install postgresql-contrib-9.0 psql -f /usr/share/postgresql/9.0/contrib/cube.sql • Lo script sql può contenere molti oggetti • Tutti gli oggetti vengono creati nello schema di default • Difficoltà di gestione in database multi-schema Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 6. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Perché le estensioni • Supporto migliore per dump e restore • Separazione logica fra l'estensione e gli altri oggetti presenti nel database – Non fa parte dei dati – È una dipendenza dei dati • Installazione in uno schema specifico • Operazioni di manutenzione semplificate CREATE EXTENSION IF NOT EXISTS cube WITH SCHEMA public; Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 7. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Anatomia di un'estensione • File di controllo – Metadati – Impostazioni – Dipendenze • Script SQL di installazione – Nessuna nuova sintassi da imparare – Ambiente di esecuzione controllato • Script SQL di aggiornamento (opzionali) • Moduli binari (opzionali) Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 8. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Il file di controllo • In ${SHAREDIR}/extension • Si deve chiamare <nome_estensione>.control • Sintassi chiave/valore (come postgresql.conf) $ cat /usr/share/postgresql/9.1/extension/pair.control # pair extension comment = 'A key/value pair data type' default_version = '1.0' relocatable = true Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 9. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Lo script di installazione • <estensione>--<versione>.sql • È un normale script SQL • Viene eseguito all'interno di una transazione – No BEGIN/COMMIT/ROLLBACK • Ambiente controllato – Tutto quello che viene creato fa parte dell'estensione • Due sostituzioni possibili – MODULE_PATHNAME – @extschema@ • Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 10. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Esempio: pair--1.0.sql CREATE TYPE pair AS ( k text, v text ); ALTER EXTENSION pair DROP TYPE _pair; -- bug 9.1 CREATE OR REPLACE FUNCTION pair(text, text) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair;'; CREATE OPERATOR ~> ( LEFTARG = text, RIGHTARG = text, PROCEDURE = pair); Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 11. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Esempio: estensione non rilocabile • Se l'estensione necessita conoscere schema di destinazione durante l'installazione essere marcata come non rilocabile – Usare @extschema@ come segnaposto per lo schema – relocatable = false • Se l'estensione necessita di essere installata in uno schema specifico – relocatable = false – schema = schema_di_destinazione Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 12. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Installazione • CREATE EXTENSION – IF NOT EXISTS – SCHEMA <schema_esistente> – VERSION <versione> – FROM <versione_modulo> CREATE EXTENSION hstore; CREATE EXTENSION cube FROM unpackaged; Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 13. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Ispezione da psql postgres=# dx List of installed extensions Name | Version | Schema | Description ------+---------+--------+---------------------------- pair | 1.0 | pair | A key/value pair data type (1 row) postgres=# dx+ Objects in extension "pair" Object Description ------------------------------- function pair.pair(text,text) operator pair.~>(text,text) type pair.pair (3 rows) Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 14. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Supporto per il dump/restore • L'estensione è una dipendenza – Una sola riga nel dump (commenti esclusi) • L'estensione può contenere tabelle – Le tabelle non compaiono nel dump – Ma le tabelle possono essere modificate! $ pg_dump | grep pair -- Name: pair; Type: EXTENSION; Schema: -; Owner: CREATE EXTENSION IF NOT EXISTS pair WITH SCHEMA public; -- Name: EXTENSION pair; Type: COMMENT; Schema: -; Owner: COMMENT ON EXTENSION pair IS 'A key/value pair data type'; Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 15. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Tabelle CREATE TABLE extconfig ( key text, value text, standard_entry boolean ); SELECT pg_catalog.pg_extension_config_dump( 'extconfig', 'WHERE NOT standard_entry' ); Supporto per tabelle di configurazione – Dump del solo contenuto – Possibilità di discriminare fra dati di default e dati aggiuntivi Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 16. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Manutenzione • Aggiornamento atomico ALTER EXTENSION pair UPDATE; • Rilocazione in uno schema diverso ALTER EXTENSION pair SET SCHEMA pair; Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 17. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Gli script di aggiornamento • <estensione>--<da_versione>--<a_versione>.sql • Stessa sintassi dello script di installazione • Strada più corta per la versione richiesta • Nessuna assunzione su ordinamento – Downgrade – Nomi simbolici • Funzione pg_extension_update_paths('estensione') • Versione “unpackaged” Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 18. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Esempio: pair--unpackaged--1.0.sql • Si basa su un'estensione vuota • Aggiunge manualmente il contenuto del vecchio modulo ALTER EXTENSION pair ADD TYPE pair; ALTER EXTENSION pair ADD FUNCTION pair(text, text); ALTER EXTENSION pair ADD OPERATOR ~> (text,text); Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 19. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Esempio: pair--1.0--1.1.sql CREATE OR REPLACE FUNCTION pair(anyelement, anyelement) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OR REPLACE FUNCTION pair(text, anyelement) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OR REPLACE FUNCTION pair(anyelement, anyelement) RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair'; CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = anyelement, PROCEDURE = pair); CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = text, PROCEDURE = pair); CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = anyelement, PROCEDURE = pair); Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 20. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Esempio: pg_extension_update_paths postgres=# SELECT * FROM pg_extension_update_paths('pair'); source | target | path ------------+------------+---------------------- 1.0 | 1.1 | 1.0--1.1 1.0 | unpackaged | 1.1 | 1.0 | 1.1 | unpackaged | unpackaged | 1.0 | unpackaged--1.0 unpackaged | 1.1 | unpackaged--1.0--1.1 (6 rows) Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 21. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 PostgreSQL eXtension Network - PGXN • http://pgxn.org/ • Obiettivo: raccogliere tutte le estensioni open source • PGXN Client – simile a apt-get o yum • pgxn install estensione • pgxn search parola • PGXN Utils – Ausilio per lo sviluppatore di estensioni Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 22. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 META.json • Specifiche http://pgxn.org/spec/ {    "name": "pair",    "abstract": "A key/value pair data type",    "version": "0.1.0",    "maintainer": "Marco Nenciarini <info@2ndQuadrant.it>",    "license": "postgresql",    "meta­spec": {       "version": "1.0.0",       "url": "http://pgxn.org/meta/spec.txt"    }, } Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 23. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Conclusioni • Usare moduli aggiuntivi non è mai stato così facile • Vantaggi anche per chi sviluppa estensioni – Robustezza – Manutenibilità • Applicazioni come estensioni – Aggiornamento atomico – Packaging – Dump selettivo • Lenta migrazione dei moduli esistenti Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 24. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Domande? • E-Mail: marco.nenciarini@2ndquadrant.it • URL: www.2ndquadrant.it • Blog: blog.2ndquadrant.it Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org
  • 25. PGDay.IT 2011 Monash University Prato Centre Venerdì 25 Novembre 2011 Licenza Creative Commons Attribuzione Non commerciale Condividi allo stesso modo 2.5 Italia http://creativecommons.org/licenses/by-nc-sa/2.5/it/ © 2011 2ndQuadrant Italia - http://www.2ndquadrant.it Marco Nenciarini – marco.nenciarini@2ndQuadrant.it - ITPUG.org