diff --git a/sql/install.sql b/sql/install.sql index 368604a..3c489e7 100644 --- a/sql/install.sql +++ b/sql/install.sql @@ -39,11 +39,17 @@ SET LOCAL search_path TO pov; \i sql/schema/pov/functions/Set_Revision.sql \i sql/schema/pov/functions/Hash.sql \i sql/schema/pov/functions/Sort_Array.sql +\i sql/schema/pov/functions/_format_type.sql +\i sql/schema/pov/functions/tsort.pl +\i sql/schema/pov/functions/pg_get_object_unique_columns.sql -- Internal views -\i sql/schema/pov/views/View_Functions.sql -\i sql/schema/pov/views/View_Constraints.sql -\i sql/schema/pov/views/View_Views.sql +\i sql/schema/pov/views/pg_all_objects_unique_columns.sql +\i sql/schema/pov/views/pg_depend_remapped.sql +\i sql/schema/pov/views/pg_depend_oid_concat.sql +\i sql/schema/pov/views/pg_depend_dot.sql +\i sql/schema/pov/views/pg_depend_tsort.sql +\i sql/schema/pov/views/pg_depend_definitions.sql SET LOCAL search_path TO public; diff --git a/sql/schema/pov/functions/New_Revision.sql b/sql/schema/pov/functions/New_Revision.sql index c0680c6..f52d8fb 100644 --- a/sql/schema/pov/functions/New_Revision.sql +++ b/sql/schema/pov/functions/New_Revision.sql @@ -15,9 +15,9 @@ SELECT Set_Revision(ObjectIDs) INTO STRICT _RevisionID FROM ( FROM ( -- Create new ObjectID for each function. -- If a object already exists with the same content (function definition), its ObjectID will be selected. - SELECT Set_Object(ARRAY[CreateObject,DropObject],'function') AS ObjectID FROM View_Functions UNION - SELECT Set_Object(ARRAY[CreateObject,DropObject],'constraint') AS ObjectID FROM View_Constraints UNION - SELECT Set_Object(ARRAY[CreateObject,DropObject],'view') AS ObjectID FROM View_Views + SELECT Set_Object(ARRAY[create_definition,drop_definition],description) AS ObjectID FROM pov.pg_depend_definitions + WHERE create_definition IS NOT NULL AND drop_definition IS NOT NULL + ORDER BY row_number ) AS Objects ) AS Revision; diff --git a/sql/schema/pov/views/View_Constraints.sql b/sql/schema/pov/views/View_Constraints.sql deleted file mode 100644 index 1fe6aeb..0000000 --- a/sql/schema/pov/views/View_Constraints.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE OR REPLACE VIEW pov.View_Constraints AS -SELECT - pg_catalog.pg_constraint.oid, - 'ALTER TABLE ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_class.relname || ' ADD CONSTRAINT ' || pg_catalog.pg_constraint.conname || ' ' || pg_catalog.pg_get_constraintdef(pg_catalog.pg_constraint.oid) AS CreateObject, - 'ALTER TABLE ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_class.relname || ' DROP CONSTRAINT ' || pg_catalog.pg_constraint.conname AS DropObject -FROM pov.View_Functions -INNER JOIN pg_catalog.pg_depend ON (pg_catalog.pg_depend.refobjid = pov.View_Functions.oid) -INNER JOIN pg_catalog.pg_constraint ON (pg_catalog.pg_constraint.oid = pg_catalog.pg_depend.objid) -INNER JOIN pg_catalog.pg_class ON (pg_catalog.pg_class.oid = pg_catalog.pg_constraint.conrelid) -INNER JOIN pg_catalog.pg_namespace ON (pg_catalog.pg_namespace.oid = pg_catalog.pg_class.relnamespace) -; diff --git a/sql/schema/pov/views/View_Functions.sql b/sql/schema/pov/views/View_Functions.sql deleted file mode 100644 index 61be22e..0000000 --- a/sql/schema/pov/views/View_Functions.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE OR REPLACE VIEW pov.View_Functions AS -SELECT - pg_catalog.pg_proc.oid, - pg_catalog.pg_get_functiondef(pg_catalog.pg_proc.oid) || ';' || 'ALTER FUNCTION ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_proc.proname || '(' || pg_get_function_identity_arguments(pg_catalog.pg_proc.oid) || ') OWNER TO ' || pg_catalog.pg_get_userbyid(pg_catalog.pg_proc.proowner) AS CreateObject, - 'DROP FUNCTION ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_proc.proname || '(' || pg_get_function_identity_arguments(pg_catalog.pg_proc.oid) || ')' AS DropObject -FROM pg_catalog.pg_proc -INNER JOIN pg_catalog.pg_namespace ON (pg_catalog.pg_namespace.oid = pg_catalog.pg_proc.pronamespace) --- Do not include pg_catalog, information_schema, or our own schema "pov" -WHERE pg_catalog.pg_namespace.nspname NOT IN ('pg_catalog','information_schema','pov') --- Skip aggregates as they cannot be defined using pg_get_functiondef -AND pg_catalog.pg_proc.proisagg IS FALSE --- Do not include the pov API-functions in the selection -AND (pg_catalog.pg_namespace.nspname <> 'public' OR pg_catalog.pg_proc.proname <> 'pov') -; diff --git a/sql/schema/pov/views/View_Views.sql b/sql/schema/pov/views/View_Views.sql deleted file mode 100644 index 48cf586..0000000 --- a/sql/schema/pov/views/View_Views.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE OR REPLACE VIEW pov.View_Views AS -SELECT - pg_catalog.pg_class.oid, - 'CREATE VIEW ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_class.relname || ' AS ' || pg_catalog.pg_get_viewdef(pg_catalog.pg_class.oid) || ';' - || 'ALTER VIEW ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_class.relname || ' OWNER TO ' || pg_catalog.pg_get_userbyid(pg_catalog.pg_class.relowner) AS CreateObject, - 'DROP VIEW ' || pg_catalog.pg_namespace.nspname || '.' || pg_catalog.pg_class.relname AS DropObject -FROM pov.View_Functions -INNER JOIN pg_catalog.pg_depend ON (pg_catalog.pg_depend.refobjid = pov.View_Functions.oid) -INNER JOIN pg_catalog.pg_rewrite ON (pg_catalog.pg_rewrite.oid = pg_catalog.pg_depend.objid) -INNER JOIN pg_catalog.pg_class ON (pg_catalog.pg_class.oid = pg_catalog.pg_rewrite.ev_class) -INNER JOIN pg_catalog.pg_namespace ON (pg_catalog.pg_namespace.oid = pg_catalog.pg_class.relnamespace) -WHERE pg_catalog.pg_class.relkind = 'v' -; diff --git a/sql/schema/public/functions/pov.sql b/sql/schema/public/functions/pov.sql index 2337624..adb4183 100644 --- a/sql/schema/public/functions/pov.sql +++ b/sql/schema/public/functions/pov.sql @@ -25,7 +25,7 @@ END IF; -- Deactivate existing pov, if any. (might affect 0 rows, it's not a bug we lack IF NOT FOUND here) UPDATE Snapshots SET Active = 0 WHERE Active = 1; --- Create a new FSnapshotID. The RevisionID might be identical to a previous pov. +-- Create a new SnapshotID. The RevisionID might be identical to a previous pov. INSERT INTO Snapshots (RevisionID) VALUES (_RevisionID) RETURNING SnapshotID INTO STRICT _SnapshotID; -- Return _SnapshotID and _RevisionID @@ -50,14 +50,18 @@ _ObjectIDs text[]; _FunctionID oid; _ObjectID text; _SQL text; +_ObjectType text; _CurrentSnapshotID bigint; _CurrentRevisionID text; _CurrentObjectIDs text[]; _RestoredRevisionID text; +_TYPE integer := 1; _CREATE integer := 2; _DROP integer := 3; +_i integer; +_Num_Objects integer; BEGIN -- Disable check_function_bodies to allow creation of sql functions depending on not-yet-created functions, @@ -75,44 +79,36 @@ IF NOT FOUND THEN RAISE EXCEPTION 'ERROR_FSNAPSHOT_REVISION_NOT_FOUND RevisionID %', _CurrentRevisionID; END IF; --- Lookup RevisionID and ObjectIDs for FSnapshotID to restore +-- Lookup RevisionID and ObjectIDs for SnapshotID to restore SELECT Snapshots.RevisionID, Revisions.ObjectIDs INTO _RevisionID, _ObjectIDs FROM Snapshots INNER JOIN Revisions ON (Revisions.RevisionID = Snapshots.RevisionID) WHERE Snapshots.SnapshotID = _RestoreSnapshotID; IF NOT FOUND THEN - RAISE EXCEPTION 'ERROR_FSNAPSHOT_SNAPSHOT_NOT_FOUND FSnapshotID %', _RestoreSnapshotID; + RAISE EXCEPTION 'ERROR_FSNAPSHOT_SNAPSHOT_NOT_FOUND SnapshotID %', _RestoreSnapshotID; END IF; -- Drop objects not part of the revision. -FOR _ObjectID IN -SELECT DropObjects.ObjectID FROM ( - SELECT unnest AS ObjectID FROM unnest(_CurrentObjectIDs) - EXCEPT - SELECT unnest AS ObjectID FROM unnest(_ObjectIDs) -) AS DropObjects -INNER JOIN Objects ON (Objects.ObjectID = DropObjects.ObjectID) -INNER JOIN ObjectTypes ON (ObjectTypes.Name = Objects.Content[1]) -ORDER BY ObjectTypes.ObjectTypeID DESC +_Num_Objects := array_upper(_CurrentObjectIDs,1); +FOR _i IN 1.._Num_Objects LOOP - SELECT Content[_DROP] INTO STRICT _SQL FROM Objects WHERE ObjectID = _ObjectID; - RAISE DEBUG E'\n-%\n%', _ObjectID, '- ' || replace(_SQL,E'\n',E'\n- '); - EXECUTE _SQL; + _ObjectID := _CurrentObjectIDs[_Num_Objects-_i+1]; + IF NOT _ObjectID <@ _ObjectIDs THEN + SELECT Content[_TYPE], Content[_DROP] INTO STRICT _ObjectType, _SQL FROM Objects WHERE ObjectID = _ObjectID; + RAISE DEBUG E'\n-%\n%\n%', _ObjectID, '- ' || _ObjectType, '- ' || replace(_SQL,E'\n',E'\n- '); + -- EXECUTE _SQL; + END IF; END LOOP; --- Create objects not in the current revision. -FOR _ObjectID IN -SELECT CreateObjects.ObjectID FROM ( - SELECT unnest AS ObjectID FROM unnest(_ObjectIDs) - EXCEPT - SELECT unnest AS ObjectID FROM unnest(_CurrentObjectIDs) -) AS CreateObjects -INNER JOIN Objects ON (Objects.ObjectID = CreateObjects.ObjectID) -INNER JOIN ObjectTypes ON (ObjectTypes.Name = Objects.Content[1]) -ORDER BY ObjectTypes.ObjectTypeID ASC +-- Create unpresent objects part of the revision. +_Num_Objects := array_upper(_ObjectIDs,1); +FOR _i IN 1.._Num_Objects LOOP - SELECT Content[_CREATE] INTO STRICT _SQL FROM Objects WHERE ObjectID = _ObjectID; - RAISE DEBUG E'\n+%\n%', _ObjectID, '+ ' || replace(_SQL,E'\n',E'\n+ '); - EXECUTE _SQL; + _ObjectID := _CurrentObjectIDs[_Num_Objects]; + IF NOT _ObjectID <@ _CurrentObjectIDs THEN + SELECT Content[_TYPE], Content[_CREATE] INTO STRICT _ObjectType, _SQL FROM Objects WHERE ObjectID = _ObjectID; + RAISE DEBUG E'\n-%\n%\n%', _ObjectID, '+ ' || _ObjectType, '+ ' || replace(_SQL,E'\n',E'\n+ '); + -- EXECUTE _SQL; + END IF; END LOOP; SET LOCAL search_path TO public;