]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2166] create-drop fixes and 9.2 compatibility
authorThomas Markwalder <tmark@isc.org>
Tue, 2 Nov 2021 15:06:57 +0000 (11:06 -0400)
committerTomek Mrugalski <tomek@isc.org>
Tue, 9 Nov 2021 19:26:35 +0000 (19:26 +0000)
src/share/database/scripts/pgsql/dhcpdb_create.pgsql
src/share/database/scripts/pgsql/upgrade_6.2_to_7.0.sh.in
    added "OR REPLACE" to function creates
    made all TIMESTAMP elements "WITH TIME ZONE"
    replaced use of ON CONFLICT

src/share/database/scripts/pgsql/dhcpdb_drop.pgsql
    Added arguments to function drops. Posgresql requires argument
    lists to match to drop a function.

src/share/database/scripts/pgsql/dhcpdb_create.pgsql
src/share/database/scripts/pgsql/dhcpdb_drop.pgsql
src/share/database/scripts/pgsql/upgrade_6.2_to_7.0.sh.in

index 3f2c4cc90aeb5d25e705aa8993cc311630c6539f..d832b1f77e7bd807c50f70947ecf1c2ae2ae39c4 100644 (file)
@@ -140,7 +140,7 @@ ALTER TABLE lease6
 --
 --  FUNCTION that returns a result set containing the column names for lease4 dumps.
 DROP FUNCTION IF EXISTS lease4DumpHeader();
-CREATE FUNCTION lease4DumpHeader() RETURNS text AS  $$
+CREATE OR REPLACE FUNCTION lease4DumpHeader() RETURNS text AS  $$
     select cast('address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname,state' as text) as result;
 $$ LANGUAGE SQL;
 --
@@ -148,7 +148,7 @@ $$ LANGUAGE SQL;
 --
 --  FUNCTION that returns a result set containing the data for lease4 dumps.
 DROP FUNCTION IF EXISTS lease4DumpData();
-CREATE FUNCTION lease4DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease4DumpData() RETURNS
     table (address inet,
            hwaddr text,
            client_id text,
@@ -178,7 +178,7 @@ $$ LANGUAGE SQL;
 --
 --  FUNCTION that returns a result set containing the column names for lease6 dumps.
 DROP FUNCTION IF EXISTS lease6DumpHeader();
-CREATE FUNCTION lease6DumpHeader() RETURNS text AS  $$
+CREATE OR REPLACE FUNCTION lease6DumpHeader() RETURNS text AS  $$
     select cast('address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,state' as text) as result;
 $$ LANGUAGE SQL;
 --
@@ -186,7 +186,7 @@ $$ LANGUAGE SQL;
 --
 --  FUNCTION that returns a result set containing the data for lease6 dumps.
 DROP FUNCTION IF EXISTS lease6DumpData();
-CREATE FUNCTION lease6DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease6DumpData() RETURNS
     TABLE (
            address text,
            duid text,
@@ -382,7 +382,7 @@ INSERT INTO lease_hwaddr_source VALUES (128, 'HWADDR_SOURCE_DOCSIS_MODEM');
 --
 --  FUNCTION that returns a result set containing the data for lease4 dumps.
 DROP FUNCTION IF EXISTS lease4DumpData();
-CREATE FUNCTION lease4DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease4DumpData() RETURNS
     table (address inet,
            hwaddr text,
            client_id text,
@@ -419,7 +419,7 @@ ALTER TABLE lease6
 --
 --  FUNCTION that returns a result set containing the column names for lease6 dumps.
 DROP FUNCTION IF EXISTS lease6DumpHeader();
-CREATE FUNCTION lease6DumpHeader() RETURNS text AS  $$
+CREATE OR REPLACE FUNCTION lease6DumpHeader() RETURNS text AS  $$
     select cast('address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,state,hwaddr,hwtype,hwaddr_source' as text) as result;
 $$ LANGUAGE SQL;
 --
@@ -427,7 +427,7 @@ $$ LANGUAGE SQL;
 --
 --  FUNCTION that returns a result set containing the data for lease6 dumps.
 DROP FUNCTION IF EXISTS lease6DumpData();
-CREATE FUNCTION lease6DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease6DumpData() RETURNS
     TABLE (
            address text,
            duid text,
@@ -580,7 +580,7 @@ CREATE TABLE lease4_stat (
 
 --
 -- Create v4 insert trigger procedure
-CREATE FUNCTION proc_stat_lease4_insert () RETURNS trigger AS $stat_lease4_insert$
+CREATE OR REPLACE FUNCTION proc_stat_lease4_insert () RETURNS trigger AS $stat_lease4_insert$
 BEGIN
     IF NEW.state < 2 THEN
         UPDATE lease4_stat
@@ -604,7 +604,7 @@ AFTER INSERT ON lease4
 
 --
 -- Create v4 update trigger procedure
-CREATE FUNCTION proc_stat_lease4_update () RETURNS trigger AS $stat_lease4_update$
+CREATE OR REPLACE FUNCTION proc_stat_lease4_update () RETURNS trigger AS $stat_lease4_update$
 BEGIN
     IF OLD.state != NEW.state THEN
         IF OLD.state < 2 THEN
@@ -638,7 +638,7 @@ AFTER UPDATE ON lease4
 
 --
 -- Create the v4 delete trigger procedure
-CREATE FUNCTION proc_stat_lease4_delete () RETURNS trigger AS $stat_lease4_delete$
+CREATE OR REPLACE FUNCTION proc_stat_lease4_delete () RETURNS trigger AS $stat_lease4_delete$
 BEGIN
     IF OLD.state < 2 THEN
         -- Decrement the state count if record exists
@@ -667,7 +667,7 @@ CREATE TABLE lease6_stat (
 
 --
 -- Create v6 insert trigger procedure
-CREATE FUNCTION proc_stat_lease6_insert () RETURNS trigger AS $stat_lease6_insert$
+CREATE OR REPLACE FUNCTION proc_stat_lease6_insert () RETURNS trigger AS $stat_lease6_insert$
 BEGIN
     IF NEW.state < 2 THEN
         UPDATE lease6_stat
@@ -694,7 +694,7 @@ AFTER INSERT ON lease6
 
 --
 -- Create v6 update trigger procedure
-CREATE FUNCTION proc_stat_lease6_update () RETURNS trigger AS $stat_lease6_update$
+CREATE OR REPLACE FUNCTION proc_stat_lease6_update () RETURNS trigger AS $stat_lease6_update$
 BEGIN
     IF OLD.state != NEW.state THEN
         IF OLD.state < 2 THEN
@@ -729,7 +729,7 @@ AFTER UPDATE ON lease6
 
 --
 -- Create the v6 delete trigger procedure
-CREATE FUNCTION proc_stat_lease6_delete() RETURNS trigger AS $stat_lease6_delete$
+CREATE OR REPLACE FUNCTION proc_stat_lease6_delete() RETURNS trigger AS $stat_lease6_delete$
 BEGIN
     IF OLD.state < 2 THEN
         -- Decrement the state count if record exists
@@ -762,14 +762,14 @@ ALTER TABLE lease6 ADD COLUMN user_context TEXT;
 
 --
 DROP FUNCTION IF EXISTS lease4DumpHeader();
-CREATE FUNCTION lease4DumpHeader() RETURNS text AS  $$
+CREATE OR REPLACE FUNCTION lease4DumpHeader() RETURNS text AS  $$
     select cast('address,hwaddr,client_id,valid_lifetime,expire,subnet_id,fqdn_fwd,fqdn_rev,hostname,state,user_context' as text) as result;
 $$ LANGUAGE SQL;
 --
 
 --
 DROP FUNCTION IF EXISTS lease4DumpData();
-CREATE FUNCTION lease4DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease4DumpData() RETURNS
     table (address inet,
            hwaddr text,
            client_id text,
@@ -801,14 +801,14 @@ $$ LANGUAGE SQL;
 
 --
 DROP FUNCTION IF EXISTS lease6DumpHeader();
-CREATE FUNCTION lease6DumpHeader() RETURNS text AS  $$
+CREATE OR REPLACE FUNCTION lease6DumpHeader() RETURNS text AS  $$
     select cast('address,duid,valid_lifetime,expire,subnet_id,pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname,state,hwaddr,hwtype,hwaddr_source,user_context' as text) as result;
 $$ LANGUAGE SQL;
 --
 
 --
 DROP FUNCTION IF EXISTS lease6DumpData();
-CREATE FUNCTION lease6DumpData() RETURNS
+CREATE OR REPLACE FUNCTION lease6DumpData() RETURNS
     TABLE (
            address text,
            duid text,
@@ -1747,10 +1747,10 @@ CREATE INDEX dhcp4_audit_idx2 ON dhcp4_audit (revision_id);
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- -----------------------------------------------------
-CREATE FUNCTION createAuditRevisionDHCP4(audit_ts TIMESTAMP,
-                                                     server_tag VARCHAR(256),
-                                                     audit_log_message TEXT,
-                                                     cascade_transaction SMALLINT)
+CREATE OR REPLACE FUNCTION createAuditRevisionDHCP4(audit_ts TIMESTAMP WITH TIME ZONE,
+                                         server_tag VARCHAR(256),
+                                         audit_log_message TEXT,
+                                         cascade_transaction SMALLINT)
 RETURNS VOID
 LANGUAGE plpgsql
 AS $$
@@ -1794,7 +1794,7 @@ END;$$;
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- ----------------------------------------------------
-CREATE FUNCTION createAuditEntryDHCP4(object_type_val VARCHAR(256),
+CREATE OR REPLACE FUNCTION createAuditEntryDHCP4(object_type_val VARCHAR(256),
                                        object_id_val BIGINT,
                                        modification_type_val VARCHAR(32))
 RETURNS VOID
@@ -1895,7 +1895,7 @@ CREATE INDEX key_dhcp4_client_class_order_index on dhcp4_client_class_order (ord
 -- - old_follow_class_name previous name of the class after which this
 --   class was positioned within the class hierarchy.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION setClientClass4Order(id BIGINT,
+CREATE OR REPLACE FUNCTION setClientClass4Order(id BIGINT,
                                      follow_class_name VARCHAR(128),
                                      old_follow_class_name VARCHAR(128))
 RETURNS VOID
@@ -1987,12 +1987,17 @@ BEGIN
     -- whenever the dhcp4_client_class record is updated. Such update may include
     -- test expression changes impacting the dependency on KNOWN/UNKNOWN classes.
     -- This value will be later adjusted when dependencies are inserted.
-    -- TKM - note that ON CONFLICT requires PostgreSQL 9.5 or later.
---    INSERT INTO  dhcp4_client_class_order(class_id, order_index, depend_on_known_indirectly)
---        VALUES (id, follow_class_index + 1, 0)
---        ON CONFLICT(class_id) DO UPDATE
---        SET order_index = excluded.order_index,
---            depend_on_known_indirectly = excluded.depend_on_known_indirectly;
+    -- ON CONFLICT required 9.5 or later
+    UPDATE dhcp4_client_class_order 
+        SET order_index = follow_class_index + 1,
+            depend_on_known_indirectly = depend_on_known_indirectly
+        WHERE class_id = id;
+    IF FOUND THEN
+        RETURN;
+    END IF;
+
+    INSERT INTO  dhcp4_client_class_order(class_id, order_index, depend_on_known_indirectly)
+        VALUES (id, follow_class_index + 1, 0);
     RETURN;
 END;$$;
 
@@ -2093,7 +2098,7 @@ CREATE INDEX dhcp4_client_class_dependency_id_idx on dhcp4_client_class_dependen
 -- - class_id id client class,
 -- - dependency_id id of the dependency.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv4ClientClassDependency(class_id BIGINT,
+CREATE OR REPLACE FUNCTION checkDHCPv4ClientClassDependency(class_id BIGINT,
                                                   dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -2201,7 +2206,7 @@ CREATE TRIGGER dhcp4_client_class_check_dependency_BINS
 -- - client_class_id id of the client class which dependency is set,
 -- - dependency_id id of the client class on which the given class depends.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION updateDHCPv4ClientClassKnownDependency(client_class_id BIGINT,
+CREATE OR REPLACE FUNCTION updateDHCPv4ClientClassKnownDependency(client_class_id BIGINT,
                                                         dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -2254,7 +2259,7 @@ CREATE TRIGGER dhcp4_client_class_dependency_AINS
 -- update. It signals an error if it has changed and there is at least
 -- one class depending on this class.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv4ClientClassKnownDependencyChange()
+CREATE OR REPLACE FUNCTION checkDHCPv4ClientClassKnownDependencyChange()
 RETURNS VOID
 LANGUAGE plpgsql
 AS $$
@@ -2352,7 +2357,7 @@ CREATE INDEX fk_dhcp4_client_class_server_id ON dhcp4_client_class_server (serve
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- -----------------------------------------------------
-CREATE FUNCTION createAuditRevisionDHCP6(audit_ts TIMESTAMP,
+CREATE OR REPLACE FUNCTION createAuditRevisionDHCP6(audit_ts TIMESTAMP WITH TIME ZONE,
                                          server_tag VARCHAR(256),
                                          audit_log_message TEXT,
                                          cascade_transaction SMALLINT)
@@ -2399,7 +2404,7 @@ END;$$;
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- ----------------------------------------------------
-CREATE FUNCTION createAuditEntryDHCP6(object_type_val VARCHAR(256),
+CREATE OR REPLACE FUNCTION createAuditEntryDHCP6(object_type_val VARCHAR(256),
                                        object_id_val BIGINT,
                                        modification_type_val VARCHAR(32))
 RETURNS VOID
@@ -2496,7 +2501,7 @@ CREATE INDEX key_dhcp6_client_class_order_index on dhcp6_client_class_order (ord
 -- - old_follow_class_name previous name of the class after which this
 --   class was positioned within the class hierarchy.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION setClientClass6Order(id BIGINT,
+CREATE OR REPLACE FUNCTION setClientClass6Order(id BIGINT,
                                      follow_class_name VARCHAR(128),
                                      old_follow_class_name VARCHAR(128))
 RETURNS VOID
@@ -2589,11 +2594,16 @@ BEGIN
     -- test expression changes impacting the dependency on KNOWN/UNKNOWN classes.
     -- This value will be later adjusted when dependencies are inserted.
     -- TKM - note that ON CONFLICT requires PostgreSQL 9.5 or later.
+    UPDATE dhcp6_client_class_order 
+        SET order_index = follow_class_index + 1,
+            depend_on_known_indirectly = depend_on_known_indirectly
+        WHERE class_id = id;
+    IF FOUND THEN
+        RETURN;
+    END IF;
+
     INSERT INTO  dhcp6_client_class_order(class_id, order_index, depend_on_known_indirectly)
-        VALUES (id, follow_class_index + 1, 0)
-        ON CONFLICT(class_id) DO UPDATE
-        SET order_index = excluded.order_index,
-            depend_on_known_indirectly = excluded.depend_on_known_indirectly;
+        VALUES (id, follow_class_index + 1, 0);
     RETURN;
 END;$$;
 
@@ -2693,7 +2703,7 @@ CREATE INDEX dhcp6_client_class_dependency_id_idx on dhcp6_client_class_dependen
 -- - class_id id client class,
 -- - dependency_id id of the dependency.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv6ClientClassDependency(class_id BIGINT,
+CREATE OR REPLACE FUNCTION checkDHCPv6ClientClassDependency(class_id BIGINT,
                                                   dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -2801,7 +2811,7 @@ CREATE TRIGGER dhcp6_client_class_check_dependency_BINS
 -- - client_class_id id of the client class which dependency is set,
 -- - dependency_id id of the client class on which the given class depends.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION updateDHCPv6ClientClassKnownDependency(client_class_id BIGINT,
+CREATE OR REPLACE FUNCTION updateDHCPv6ClientClassKnownDependency(client_class_id BIGINT,
                                                         dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -2854,7 +2864,7 @@ CREATE TRIGGER dhcp6_client_class_dependency_AINS
 -- update. It signals an error if it has changed and there is at least
 -- one class depending on this class.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv6ClientClassKnownDependencyChange()
+CREATE OR REPLACE FUNCTION checkDHCPv6ClientClassKnownDependencyChange()
 RETURNS VOID
 LANGUAGE plpgsql
 AS $$
@@ -3116,7 +3126,7 @@ CREATE TRIGGER dhcp4_option_def_ADEL
 -- - modification_ts: modification timestamp of the
 --   option.
 -- -----------------------------------------------------
-CREATE FUNCTION createOptionAuditDHCP4(modification_type VARCHAR,
+CREATE OR REPLACE FUNCTION createOptionAuditDHCP4(modification_type VARCHAR,
                                        scope_id SMALLINT,
                                        option_id INT,
                                        subnet_id BIGINT,
@@ -3377,7 +3387,7 @@ CREATE TRIGGER dhcp6_option_def_ADEL
 -- - modification_ts: modification timestamp of the
 --   option.
 -- -----------------------------------------------------
-CREATE FUNCTION createOptionAuditDHCP6(modification_type VARCHAR(32),
+CREATE OR REPLACE FUNCTION createOptionAuditDHCP6(modification_type VARCHAR(32),
                                        scope_id SMALLINT,
                                        option_id INT,
                                        subnet_id BIGINT,
index e6da977c9f3156df134013f28128a835aab0ee71..d15b458e5ebf7881b9eacd8ab52695558d219897 100644 (file)
@@ -31,13 +31,20 @@ DROP FUNCTION IF EXISTS proc_stat_lease6_delete ();
 DROP TABLE IF EXISTS logs CASCADE;
 
 -- config backend procedures for DHCPv6
-DROP FUNCTION IF EXISTS createAuditRevisionDHCP6;
-DROP FUNCTION IF EXISTS createAuditEntryDHCP6;
-DROP FUNCTION IF EXISTS createOptionAuditDHCP6;
-DROP FUNCTION IF EXISTS setClientClass6Order;
-DROP FUNCTION IF EXISTS checkDHCPv6ClientClassDependency;
-DROP FUNCTION IF EXISTS updateDHCPv6ClientClassKnownDependency;
-DROP FUNCTION IF EXISTS checkDHCPv6ClientClassKnownDependencyChange;
+DROP FUNCTION IF EXISTS createAuditRevisionDHCP6(audit_ts TIMESTAMP WITH TIME ZONE, server_tag VARCHAR(256), 
+                                                 audit_log_message TEXT, cascade_transaction SMALLINT);
+DROP FUNCTION IF EXISTS createAuditEntryDHCP6(object_type_val VARCHAR(256), object_id_val BIGINT,
+                                              modification_type_val VARCHAR(32));
+DROP FUNCTION IF EXISTS createOptionAuditDHCP6(modification_type VARCHAR, scope_id SMALLINT,
+                                               option_id INT, subnet_id BIGINT, host_id INT, 
+                                               network_name VARCHAR, pool_id BIGINT, pd_pool_id BIGINT,
+                                               modification_ts TIMESTAMP WITH TIME ZONE);
+DROP FUNCTION IF EXISTS setClientClass6Order(id BIGINT, follow_class_name VARCHAR(128),
+                                             old_follow_class_name VARCHAR(128));
+DROP FUNCTION IF EXISTS checkDHCPv6ClientClassDependency(class_id BIGINT, dependency_id BIGINT);
+DROP FUNCTION IF EXISTS updateDHCPv6ClientClassKnownDependency(client_class_id BIGINT, 
+                                                               dependency_id BIGINT);
+DROP FUNCTION IF EXISTS checkDHCPv6ClientClassKnownDependencyChange();
 
 -- config backend tables for DHCPv6
 DROP TABLE IF EXISTS dhcp6_audit CASCADE;
@@ -60,41 +67,48 @@ DROP TABLE IF EXISTS dhcp6_client_class_order CASCADE;
 DROP TABLE IF EXISTS dhcp6_client_class CASCADE;
 
 -- drop trigger functions for DHCPv6
-DROP FUNCTION IF EXISTS func_dhcp6_client_class_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_client_class_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_client_class_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_client_class_check_dependency_BINS;
-DROP FUNCTION IF EXISTS func_dhcp6_client_class_dependency_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_pool_BDEL;
-DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_subnet_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_subnet_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_shared_network_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_shared_network_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_shared_network_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_option_def_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_option_def_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_option_def_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_options_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_options_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_options_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_server_AINS;
-DROP FUNCTION IF EXISTS func_dhcp6_server_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp6_server_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp6_shared_network_BDEL;
-DROP FUNCTION IF EXISTS func_dhcp6_subnet_BDEL;
-DROP FUNCTION IF EXISTS func_dhcp6_pd_pool_BDEL;
+DROP FUNCTION IF EXISTS func_dhcp6_client_class_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_client_class_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_client_class_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_client_class_check_dependency_BINS();
+DROP FUNCTION IF EXISTS func_dhcp6_client_class_dependency_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_pool_BDEL();
+DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_global_parameter_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_subnet_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_subnet_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_shared_network_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_shared_network_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_shared_network_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_option_def_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_option_def_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_option_def_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_options_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_options_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_options_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_server_AINS();
+DROP FUNCTION IF EXISTS func_dhcp6_server_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp6_server_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp6_shared_network_BDEL();
+DROP FUNCTION IF EXISTS func_dhcp6_subnet_BDEL();
+DROP FUNCTION IF EXISTS func_dhcp6_pd_pool_BDEL();
 
 -- config backend procedures for DHCPv4
-DROP FUNCTION IF EXISTS createAuditRevisionDHCP4;
-DROP FUNCTION IF EXISTS createAuditEntryDHCP4;
-DROP FUNCTION IF EXISTS createOptionAuditDHCP4;
-DROP FUNCTION IF EXISTS setClientClass4Order;
-DROP FUNCTION IF EXISTS checkDHCPv4ClientClassDependency;
-DROP FUNCTION IF EXISTS updateDHCPv4ClientClassKnownDependency;
-DROP FUNCTION IF EXISTS checkDHCPv4ClientClassKnownDependencyChange;
+DROP FUNCTION IF EXISTS createAuditRevisionDHCP4(audit_ts TIMESTAMP WITH TIME ZONE, server_tag VARCHAR(256), 
+                                                 audit_log_message TEXT, cascade_transaction SMALLINT);
+DROP FUNCTION IF EXISTS createAuditEntryDHCP4(object_type_val VARCHAR(256), object_id_val BIGINT,
+                                              modification_type_val VARCHAR(32));
+DROP FUNCTION IF EXISTS createOptionAuditDHCP4(modification_type VARCHAR, scope_id SMALLINT,
+                                               option_id INT, subnet_id BIGINT, host_id INT, 
+                                               network_name VARCHAR, pool_id BIGINT,
+                                               modification_ts TIMESTAMP WITH TIME ZONE);
+DROP FUNCTION IF EXISTS setClientClass4Order(id BIGINT, follow_class_name VARCHAR(128),
+                                             old_follow_class_name VARCHAR(128));
+DROP FUNCTION IF EXISTS checkDHCPv4ClientClassDependency(class_id BIGINT, dependency_id BIGINT);
+DROP FUNCTION IF EXISTS updateDHCPv4ClientClassKnownDependency(client_class_id BIGINT, 
+                                                               dependency_id BIGINT);
+DROP FUNCTION IF EXISTS checkDHCPv4ClientClassKnownDependencyChange();
 
 -- config backend tables for DHCPv4
 DROP TABLE IF EXISTS dhcp4_audit CASCADE;
@@ -117,35 +131,35 @@ DROP TABLE IF EXISTS dhcp4_client_class_order CASCADE;
 DROP TABLE IF EXISTS dhcp4_client_class CASCADE;
 
 -- drop trigger functions for DHCPv4
-DROP FUNCTION IF EXISTS func_dhcp4_client_class_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_client_class_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_client_class_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_client_class_check_dependency_BINS;
-DROP FUNCTION IF EXISTS func_dhcp4_client_class_dependency_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_pool_BDEL;
-DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_subnet_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_subnet_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_shared_network_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_shared_network_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_shared_network_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_option_def_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_option_def_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_option_def_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_options_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_options_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_options_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_server_AINS;
-DROP FUNCTION IF EXISTS func_dhcp4_server_AUPD;
-DROP FUNCTION IF EXISTS func_dhcp4_server_ADEL;
-DROP FUNCTION IF EXISTS func_dhcp4_shared_network_BDEL;
-DROP FUNCTION IF EXISTS func_dhcp4_subnet_BDEL;
+DROP FUNCTION IF EXISTS func_dhcp4_client_class_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_client_class_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_client_class_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_client_class_check_dependency_BINS();
+DROP FUNCTION IF EXISTS func_dhcp4_client_class_dependency_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_pool_BDEL();
+DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_global_parameter_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_subnet_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_subnet_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_shared_network_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_shared_network_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_shared_network_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_option_def_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_option_def_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_option_def_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_options_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_options_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_options_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_server_AINS();
+DROP FUNCTION IF EXISTS func_dhcp4_server_AUPD();
+DROP FUNCTION IF EXISTS func_dhcp4_server_ADEL();
+DROP FUNCTION IF EXISTS func_dhcp4_shared_network_BDEL();
+DROP FUNCTION IF EXISTS func_dhcp4_subnet_BDEL();
 
 -- common tables for config backend
 DROP TABLE IF EXISTS modification CASCADE;
 DROP TABLE IF EXISTS parameter_data_type CASCADE;
 DROP TABLE IF EXISTS ddns_replace_client_name_types CASCADE;
-DROP FUNCTION IF EXISTS modification_ts_update;
+DROP FUNCTION IF EXISTS modification_ts_update();
 
index 4461368e942b952db7bec8a1f5c3a5f377785bc9..c49a317aa8d72b272bba47980c0d5be47e40328d 100644 (file)
@@ -753,10 +753,10 @@ CREATE INDEX dhcp4_audit_idx2 ON dhcp4_audit (revision_id);
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- -----------------------------------------------------
-CREATE FUNCTION createAuditRevisionDHCP4(audit_ts TIMESTAMP,
-                                                     server_tag VARCHAR(256),
-                                                     audit_log_message TEXT,
-                                                     cascade_transaction SMALLINT)
+CREATE OR REPLACE FUNCTION createAuditRevisionDHCP4(audit_ts TIMESTAMP WITH TIME ZONE,
+                                         server_tag VARCHAR(256),
+                                         audit_log_message TEXT,
+                                         cascade_transaction SMALLINT)
 RETURNS VOID
 LANGUAGE plpgsql
 AS \$\$
@@ -800,7 +800,7 @@ END;\$\$;
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- ----------------------------------------------------
-CREATE FUNCTION createAuditEntryDHCP4(object_type_val VARCHAR(256),
+CREATE OR REPLACE FUNCTION createAuditEntryDHCP4(object_type_val VARCHAR(256),
                                        object_id_val BIGINT,
                                        modification_type_val VARCHAR(32))
 RETURNS VOID
@@ -901,7 +901,7 @@ CREATE INDEX key_dhcp4_client_class_order_index on dhcp4_client_class_order (ord
 -- - old_follow_class_name previous name of the class after which this
 --   class was positioned within the class hierarchy.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION setClientClass4Order(id BIGINT,
+CREATE OR REPLACE FUNCTION setClientClass4Order(id BIGINT,
                                      follow_class_name VARCHAR(128),
                                      old_follow_class_name VARCHAR(128))
 RETURNS VOID
@@ -993,12 +993,17 @@ BEGIN
     -- whenever the dhcp4_client_class record is updated. Such update may include
     -- test expression changes impacting the dependency on KNOWN/UNKNOWN classes.
     -- This value will be later adjusted when dependencies are inserted.
-    -- TKM - note that ON CONFLICT requires PostgreSQL 9.5 or later.
---    INSERT INTO  dhcp4_client_class_order(class_id, order_index, depend_on_known_indirectly)
---        VALUES (id, follow_class_index + 1, 0)
---        ON CONFLICT(class_id) DO UPDATE
---        SET order_index = excluded.order_index,
---            depend_on_known_indirectly = excluded.depend_on_known_indirectly;
+    -- ON CONFLICT required 9.5 or later
+    UPDATE dhcp4_client_class_order 
+        SET order_index = follow_class_index + 1,
+            depend_on_known_indirectly = depend_on_known_indirectly
+        WHERE class_id = id;
+    IF FOUND THEN
+        RETURN;
+    END IF;
+
+    INSERT INTO  dhcp4_client_class_order(class_id, order_index, depend_on_known_indirectly)
+        VALUES (id, follow_class_index + 1, 0);
     RETURN;
 END;\$\$;
 
@@ -1099,7 +1104,7 @@ CREATE INDEX dhcp4_client_class_dependency_id_idx on dhcp4_client_class_dependen
 -- - class_id id client class,
 -- - dependency_id id of the dependency.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv4ClientClassDependency(class_id BIGINT,
+CREATE OR REPLACE FUNCTION checkDHCPv4ClientClassDependency(class_id BIGINT,
                                                   dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -1207,7 +1212,7 @@ CREATE TRIGGER dhcp4_client_class_check_dependency_BINS
 -- - client_class_id id of the client class which dependency is set,
 -- - dependency_id id of the client class on which the given class depends.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION updateDHCPv4ClientClassKnownDependency(client_class_id BIGINT,
+CREATE OR REPLACE FUNCTION updateDHCPv4ClientClassKnownDependency(client_class_id BIGINT,
                                                         dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -1260,7 +1265,7 @@ CREATE TRIGGER dhcp4_client_class_dependency_AINS
 -- update. It signals an error if it has changed and there is at least
 -- one class depending on this class.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv4ClientClassKnownDependencyChange()
+CREATE OR REPLACE FUNCTION checkDHCPv4ClientClassKnownDependencyChange()
 RETURNS VOID
 LANGUAGE plpgsql
 AS \$\$
@@ -1358,7 +1363,7 @@ CREATE INDEX fk_dhcp4_client_class_server_id ON dhcp4_client_class_server (serve
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- -----------------------------------------------------
-CREATE FUNCTION createAuditRevisionDHCP6(audit_ts TIMESTAMP,
+CREATE OR REPLACE FUNCTION createAuditRevisionDHCP6(audit_ts TIMESTAMP WITH TIME ZONE,
                                          server_tag VARCHAR(256),
                                          audit_log_message TEXT,
                                          cascade_transaction SMALLINT)
@@ -1405,7 +1410,7 @@ END;\$\$;
 --   unit tests.  This avoids issues with revision_id
 --   being null.
 -- ----------------------------------------------------
-CREATE FUNCTION createAuditEntryDHCP6(object_type_val VARCHAR(256),
+CREATE OR REPLACE FUNCTION createAuditEntryDHCP6(object_type_val VARCHAR(256),
                                        object_id_val BIGINT,
                                        modification_type_val VARCHAR(32))
 RETURNS VOID
@@ -1502,7 +1507,7 @@ CREATE INDEX key_dhcp6_client_class_order_index on dhcp6_client_class_order (ord
 -- - old_follow_class_name previous name of the class after which this
 --   class was positioned within the class hierarchy.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION setClientClass6Order(id BIGINT,
+CREATE OR REPLACE FUNCTION setClientClass6Order(id BIGINT,
                                      follow_class_name VARCHAR(128),
                                      old_follow_class_name VARCHAR(128))
 RETURNS VOID
@@ -1595,11 +1600,16 @@ BEGIN
     -- test expression changes impacting the dependency on KNOWN/UNKNOWN classes.
     -- This value will be later adjusted when dependencies are inserted.
     -- TKM - note that ON CONFLICT requires PostgreSQL 9.5 or later.
+    UPDATE dhcp6_client_class_order 
+        SET order_index = follow_class_index + 1,
+            depend_on_known_indirectly = depend_on_known_indirectly
+        WHERE class_id = id;
+    IF FOUND THEN
+        RETURN;
+    END IF;
+
     INSERT INTO  dhcp6_client_class_order(class_id, order_index, depend_on_known_indirectly)
-        VALUES (id, follow_class_index + 1, 0)
-        ON CONFLICT(class_id) DO UPDATE
-        SET order_index = excluded.order_index,
-            depend_on_known_indirectly = excluded.depend_on_known_indirectly;
+        VALUES (id, follow_class_index + 1, 0);
     RETURN;
 END;\$\$;
 
@@ -1699,7 +1709,7 @@ CREATE INDEX dhcp6_client_class_dependency_id_idx on dhcp6_client_class_dependen
 -- - class_id id client class,
 -- - dependency_id id of the dependency.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv6ClientClassDependency(class_id BIGINT,
+CREATE OR REPLACE FUNCTION checkDHCPv6ClientClassDependency(class_id BIGINT,
                                                   dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -1807,7 +1817,7 @@ CREATE TRIGGER dhcp6_client_class_check_dependency_BINS
 -- - client_class_id id of the client class which dependency is set,
 -- - dependency_id id of the client class on which the given class depends.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION updateDHCPv6ClientClassKnownDependency(client_class_id BIGINT,
+CREATE OR REPLACE FUNCTION updateDHCPv6ClientClassKnownDependency(client_class_id BIGINT,
                                                         dependency_id BIGINT)
 RETURNS VOID
 LANGUAGE plpgsql
@@ -1860,7 +1870,7 @@ CREATE TRIGGER dhcp6_client_class_dependency_AINS
 -- update. It signals an error if it has changed and there is at least
 -- one class depending on this class.
 -- -----------------------------------------------------------------------
-CREATE FUNCTION checkDHCPv6ClientClassKnownDependencyChange()
+CREATE OR REPLACE FUNCTION checkDHCPv6ClientClassKnownDependencyChange()
 RETURNS VOID
 LANGUAGE plpgsql
 AS \$\$
@@ -2122,7 +2132,7 @@ CREATE TRIGGER dhcp4_option_def_ADEL
 -- - modification_ts: modification timestamp of the
 --   option.
 -- -----------------------------------------------------
-CREATE FUNCTION createOptionAuditDHCP4(modification_type VARCHAR,
+CREATE OR REPLACE FUNCTION createOptionAuditDHCP4(modification_type VARCHAR,
                                        scope_id SMALLINT,
                                        option_id INT,
                                        subnet_id BIGINT,
@@ -2383,7 +2393,7 @@ CREATE TRIGGER dhcp6_option_def_ADEL
 -- - modification_ts: modification timestamp of the
 --   option.
 -- -----------------------------------------------------
-CREATE FUNCTION createOptionAuditDHCP6(modification_type VARCHAR(32),
+CREATE OR REPLACE FUNCTION createOptionAuditDHCP6(modification_type VARCHAR(32),
                                        scope_id SMALLINT,
                                        option_id INT,
                                        subnet_id BIGINT,