@nsshunt/stsdatamanagement 1.18.195 → 1.18.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -443,6 +443,7 @@ ALTER TABLE public.stsresource
443
443
 
444
444
  -- DROP INDEX public.stsresource_resname_vnum;
445
445
 
446
+ -- Enforce resource version uniqueness.
446
447
  CREATE UNIQUE INDEX stsresource_resname_vnum
447
448
  ON public.stsresource USING btree
448
449
  (resname COLLATE pg_catalog."default" ASC NULLS LAST, vnum ASC NULLS LAST)
@@ -452,12 +453,14 @@ CREATE UNIQUE INDEX stsresource_resname_vnum
452
453
 
453
454
  -- DROP INDEX public.stsresource_resname_validto;
454
455
 
456
+ -- General current-version lookup.
457
+ -- Includes current deleted records.
455
458
  CREATE INDEX stsresource_resname_validto
456
459
  ON public.stsresource USING btree
457
460
  (resname COLLATE pg_catalog."default" ASC NULLS LAST, validto DESC NULLS LAST)
458
461
  TABLESPACE pg_default;
459
462
 
460
-
463
+ /*
461
464
  -- DROP INDEX public.stsresource_given;
462
465
 
463
466
  CREATE INDEX stsresource_given
@@ -471,6 +474,15 @@ CREATE INDEX stsresource_family
471
474
  ON public.stsresource USING btree
472
475
  (family COLLATE pg_catalog."default" ASC)
473
476
  WHERE family IS NOT NULL;
477
+ */
478
+
479
+ -- DROP INDEX public.idx_stsresource_resname_current;
480
+
481
+ -- Normal application reads and cursor-based pagination.
482
+ CREATE INDEX idx_stsresource_resname_current
483
+ ON public.stsresource (resname, oid)
484
+ WHERE validto IS NULL
485
+ AND dbaction != 3;
474
486
 
475
487
  -- FUNCTION: public.create_stsresource(character varying, character varying, character varying)
476
488
 
@@ -564,7 +576,7 @@ ALTER FUNCTION public.create_stsresource(character varying, character varying, c
564
576
  CREATE OR REPLACE FUNCTION public.update_stsresource(
565
577
  _dbactionuser character varying,
566
578
  _resname character varying,
567
- _resvnum integer,
579
+ _resvnum bigint,
568
580
  _resdesc character varying)
569
581
  RETURNS SETOF stsresource
570
582
  LANGUAGE 'plpgsql'
@@ -616,13 +628,10 @@ BEGIN
616
628
  END;
617
629
  $BODY$;
618
630
 
619
- ALTER FUNCTION public.update_stsresource(character varying, character varying, integer, character varying)
631
+ ALTER FUNCTION public.update_stsresource(character varying, character varying, bigint, character varying)
620
632
  OWNER TO postgres;
621
633
 
622
634
 
623
- -- FUNCTION: public.update_stsresource(character varying, character varying, integer, character varying)
624
-
625
- -- DROP FUNCTION public.update_stsresource(character varying, character varying, integer, character varying);
626
635
 
627
636
  CREATE OR REPLACE FUNCTION public.update_stsresource_latest(
628
637
  _dbactionuser character varying,
@@ -640,7 +649,7 @@ declare
640
649
  _now timestamp without time zone := now();
641
650
  resoid bigint;
642
651
  newresoid stsresource.oid%TYPE;
643
- _resvnum integer;
652
+ _resvnum bigint;
644
653
  _resdesc_jsonb JSONB;
645
654
  _given character varying(64) COLLATE pg_catalog."default";
646
655
  _family character varying(64) COLLATE pg_catalog."default";
@@ -691,14 +700,11 @@ ALTER FUNCTION public.update_stsresource_latest(character varying, character var
691
700
 
692
701
 
693
702
 
694
- -- FUNCTION: public.delete_stsresource(character varying, character varying, integer)
695
-
696
- -- DROP FUNCTION public.delete_stsresource(character varying, character varying, integer);
697
703
 
698
704
  CREATE OR REPLACE FUNCTION public.delete_stsresource(
699
705
  _dbactionuser character varying,
700
706
  _resname character varying,
701
- _resvnum integer)
707
+ _resvnum bigint)
702
708
  RETURNS SETOF stsresource
703
709
  LANGUAGE 'plpgsql'
704
710
 
@@ -738,7 +744,7 @@ BEGIN
738
744
  END;
739
745
  $BODY$;
740
746
 
741
- ALTER FUNCTION public.delete_stsresource(character varying, character varying, integer)
747
+ ALTER FUNCTION public.delete_stsresource(character varying, character varying, bigint)
742
748
  OWNER TO postgres;
743
749
 
744
750
 
@@ -758,7 +764,7 @@ declare
758
764
  _now timestamp without time zone := now();
759
765
  resoid bigint;
760
766
  newresoid stsresource.oid%TYPE;
761
- _resvnum integer;
767
+ _resvnum bigint;
762
768
  BEGIN
763
769
  begin
764
770
  _resvnum := (select vnum from stsresource r where r.resname = _resname and r.validto is null and r.dbaction != 3);
@@ -798,8 +804,6 @@ ALTER FUNCTION public.delete_stsresource_latest(character varying, character var
798
804
 
799
805
 
800
806
 
801
-
802
-
803
807
  -- Table: public.stsentity
804
808
 
805
809
  -- DROP TABLE public.stsentity;
@@ -831,77 +835,257 @@ ALTER TABLE public.stsentity
831
835
 
832
836
  -- DROP INDEX public.stsentity_resourceoid_entname_vnum;
833
837
 
838
+ -- Enforce entity version uniqueness.
834
839
  CREATE UNIQUE INDEX stsentity_resourceoid_entname_vnum
835
840
  ON public.stsentity USING btree
836
- (resourceoid ASC NULLS LAST, entname COLLATE pg_catalog."default" ASC NULLS LAST, vnum ASC NULLS LAST)
841
+ (resourceoid ASC NULLS LAST, entname COLLATE pg_catalog."default" ASC NULLS LAST, vnum ASC NULLS LAST)
837
842
  TABLESPACE pg_default;
838
843
 
839
- -- Index: stsentity_resourceoid_entname_validto
840
-
841
- -- DROP INDEX public.stsentity_resourceoid_entname_validto;
842
-
844
+ -- General current/version lookup.
843
845
  CREATE INDEX stsentity_resourceoid_entname_validto
844
846
  ON public.stsentity USING btree
845
847
  (resourceoid ASC NULLS LAST, entname COLLATE pg_catalog."default" ASC NULLS LAST, validto DESC NULLS LAST)
846
848
  TABLESPACE pg_default;
847
849
 
850
+ -- Normal application reads and cursor-based pagination.
851
+ CREATE UNIQUE INDEX idx_stsentity_resourceoid_entname_current
852
+ ON public.stsentity
853
+ (resourceoid, entname)
854
+ WHERE validto IS NULL;
848
855
 
849
- -- FUNCTION: public.create_stsentity(character varying, character varying, integer, character varying, character varying)
850
-
851
- -- DROP FUNCTION public.create_stsentity(character varying, character varying, integer, character varying, character varying);
852
856
 
853
857
  CREATE OR REPLACE FUNCTION public.create_stsentity(
854
858
  _dbactionuser character varying,
855
859
  _resname character varying,
856
- _resvnum integer,
860
+ _resvnum bigint,
857
861
  _entname character varying,
858
- _entvalue character varying)
859
- RETURNS SETOF stsentity
860
- LANGUAGE 'plpgsql'
862
+ _entvalue character varying
863
+ )
864
+ RETURNS SETOF stsentity
865
+ LANGUAGE 'plpgsql'
866
+ COST 100
867
+ VOLATILE
868
+ ROWS 1000
861
869
 
862
- COST 100
863
- VOLATILE
864
- ROWS 1000
865
-
866
870
  AS $BODY$
867
- declare
868
- resoid bigint;
871
+ DECLARE
872
+ __now timestamp without time zone := now();
873
+
874
+ -- Current resource.
875
+ __resoid bigint;
876
+
877
+ -- Current entity, if one exists.
878
+ __entoid bigint;
879
+ __entvnum bigint;
880
+ __entdbaction smallint;
881
+
882
+ -- Version to assign to the newly created entity.
883
+ __newvnum bigint;
884
+
885
+ -- Newly inserted entity.
869
886
  __inserted_oid bigint;
870
- _entvalue_jsonb JSONB;
887
+
888
+ -- Parsed entity JSON.
889
+ __entvalue_jsonb jsonb;
890
+
871
891
  BEGIN
872
- begin
873
- _entvalue_jsonb := _entvalue::jsonb;
874
- exception
875
- when others then
876
- raise exception 'Invalid JSON string: %', _entvalue;
877
- end;
878
892
 
879
- -- Ensure we get the current non-deleted resource.
880
- resoid := (select oid from stsresource r where r.resname = _resname and r.vnum = _resvnum and r.validto is null and r.dbaction != 3);
881
- if resoid is null then
882
- -- Exception Codes: https://www.postgresql.org/docs/10/errcodes-appendix.html
883
- RAISE 'resname and version not found or not current version (not deleted) within stsresource %', _resname USING ERRCODE = 'no_data_found';
884
- end if;
885
- if (select count(*) from stsentity e
886
- where e.resourceoid = resoid and e.entname = _entname and e.validto is null and e.dbaction != 3) > 0 then
887
- -- Exception Codes: https://www.postgresql.org/docs/10/errcodes-appendix.html
888
- -- RAISE EXCEPTION 'resname already exists within stsresource %', now();
889
- RAISE 'Duplicate entname within stsresource: %', _resname USING ERRCODE = 'unique_violation';
890
- else
891
- insert into stsentity(resourceoid, entname, entvalue, entvalue_jsonb, vnum, dbaction, dbactionuser, validfrom)
892
- values (resoid, _entname, _entvalue, _entvalue_jsonb, 1, 1, _dbactionuser, now())
893
- returning oid into __inserted_oid;
893
+ -- -------------------------------------------------------------------------
894
+ -- Validate / parse entity JSON
895
+ -- -------------------------------------------------------------------------
896
+
897
+ BEGIN
898
+ __entvalue_jsonb := _entvalue::jsonb;
899
+
900
+ EXCEPTION
901
+ WHEN others THEN
902
+ RAISE EXCEPTION
903
+ 'Invalid JSON string: %',
904
+ _entvalue;
905
+ END;
906
+
907
+ -- -------------------------------------------------------------------------
908
+ -- Resolve the requested resource.
909
+ --
910
+ -- The supplied resource version must still be the current, non-deleted
911
+ -- version of the resource.
912
+ -- -------------------------------------------------------------------------
913
+
914
+ BEGIN
915
+ SELECT
916
+ r.oid
917
+ INTO STRICT
918
+ __resoid
919
+ FROM public.stsresource r
920
+ WHERE r.resname = _resname
921
+ AND r.vnum = _resvnum
922
+ AND r.validto IS NULL
923
+ AND r.dbaction != 3;
924
+
925
+ EXCEPTION
926
+
927
+ WHEN no_data_found THEN
928
+ RAISE
929
+ 'Resource % version % not found, not current, or deleted',
930
+ _resname,
931
+ _resvnum
932
+ USING ERRCODE = 'no_data_found';
933
+
934
+ WHEN too_many_rows THEN
935
+ RAISE
936
+ 'Too many current stsresource records for resource % version %',
937
+ _resname,
938
+ _resvnum
939
+ USING ERRCODE = 'cardinality_violation';
940
+
941
+ END;
942
+
943
+ -- -------------------------------------------------------------------------
944
+ -- Find the current entity.
945
+ --
946
+ -- IMPORTANT:
947
+ --
948
+ -- Do NOT exclude dbaction = 3 here.
949
+ --
950
+ -- A logically deleted entity is still the current entity version while
951
+ -- validto IS NULL. If it exists, it must be closed before the entity can
952
+ -- be created again.
953
+ -- -------------------------------------------------------------------------
954
+
955
+ BEGIN
956
+ SELECT
957
+ e.oid,
958
+ e.vnum,
959
+ e.dbaction
960
+ INTO STRICT
961
+ __entoid,
962
+ __entvnum,
963
+ __entdbaction
964
+ FROM public.stsentity e
965
+ WHERE e.resourceoid = __resoid
966
+ AND e.entname = _entname
967
+ AND e.validto IS NULL;
968
+
969
+ EXCEPTION
970
+
971
+ WHEN no_data_found THEN
972
+ __entoid := NULL;
973
+ __entvnum := NULL;
974
+ __entdbaction := NULL;
975
+
976
+ WHEN too_many_rows THEN
977
+ RAISE
978
+ 'Too many current stsentity records for entity % within resource %',
979
+ _entname,
980
+ _resname
981
+ USING ERRCODE = 'cardinality_violation';
982
+
983
+ END;
984
+
985
+ -- -------------------------------------------------------------------------
986
+ -- Current entity exists
987
+ -- -------------------------------------------------------------------------
988
+
989
+ IF __entoid IS NOT NULL THEN
990
+
991
+ -- ---------------------------------------------------------------------
992
+ -- Current entity is active.
993
+ --
994
+ -- CREATE is not allowed because the entity already exists.
995
+ -- ---------------------------------------------------------------------
996
+
997
+ IF __entdbaction != 3 THEN
998
+
999
+ RAISE
1000
+ 'Duplicate entname % within stsresource %',
1001
+ _entname,
1002
+ _resname
1003
+ USING ERRCODE = 'unique_violation';
1004
+
1005
+ END IF;
1006
+
1007
+ -- ---------------------------------------------------------------------
1008
+ -- Current entity is logically deleted.
1009
+ --
1010
+ -- Close the deleted version and create the next version.
1011
+ -- ---------------------------------------------------------------------
1012
+
1013
+ UPDATE public.stsentity
1014
+ SET validto = __now
1015
+ WHERE oid = __entoid;
1016
+
1017
+ __newvnum := __entvnum + 1;
1018
+
1019
+ ELSE
1020
+
1021
+ -- ---------------------------------------------------------------------
1022
+ -- No current entity exists.
1023
+ --
1024
+ -- Normally this means the entity has never existed and MAX(vnum)
1025
+ -- will be NULL, resulting in version 1.
1026
+ --
1027
+ -- Using MAX(vnum) also protects against an abnormal historical state
1028
+ -- where previous versions exist but none has validto IS NULL.
1029
+ -- ---------------------------------------------------------------------
1030
+
1031
+ SELECT
1032
+ COALESCE(MAX(e.vnum), 0) + 1
1033
+ INTO
1034
+ __newvnum
1035
+ FROM public.stsentity e
1036
+ WHERE e.resourceoid = __resoid
1037
+ AND e.entname = _entname;
1038
+
1039
+ END IF;
1040
+
1041
+ -- -------------------------------------------------------------------------
1042
+ -- Create new active entity version
1043
+ -- -------------------------------------------------------------------------
1044
+
1045
+ INSERT INTO public.stsentity(
1046
+ resourceoid,
1047
+ entname,
1048
+ entvalue,
1049
+ entvalue_jsonb,
1050
+ vnum,
1051
+ dbaction,
1052
+ dbactionuser,
1053
+ validfrom
1054
+ )
1055
+ VALUES (
1056
+ __resoid,
1057
+ _entname,
1058
+ _entvalue,
1059
+ __entvalue_jsonb,
1060
+ __newvnum,
1061
+ 1,
1062
+ _dbactionuser,
1063
+ __now
1064
+ )
1065
+ RETURNING oid
1066
+ INTO __inserted_oid;
1067
+
1068
+ -- -------------------------------------------------------------------------
1069
+ -- Return newly created entity
1070
+ -- -------------------------------------------------------------------------
1071
+
1072
+ RETURN QUERY
1073
+ SELECT *
1074
+ FROM public.stsentity
1075
+ WHERE oid = __inserted_oid;
894
1076
 
895
- return query
896
- select * from stsentity where oid = __inserted_oid;
897
- END IF;
898
1077
  END;
899
1078
  $BODY$;
900
1079
 
901
- ALTER FUNCTION public.create_stsentity(character varying, character varying, integer, character varying, character varying)
902
- OWNER TO postgres;
903
-
904
1080
 
1081
+ ALTER FUNCTION public.create_stsentity(
1082
+ character varying,
1083
+ character varying,
1084
+ bigint,
1085
+ character varying,
1086
+ character varying
1087
+ )
1088
+ OWNER TO postgres;
905
1089
 
906
1090
 
907
1091
  CREATE OR REPLACE FUNCTION public.create_stsentity_latest(
@@ -956,16 +1140,12 @@ ALTER FUNCTION public.create_stsentity_latest(character varying, character varyi
956
1140
 
957
1141
 
958
1142
 
959
- -- FUNCTION: public.update_stsentity(character varying, character varying, integer, character varying, integer, character varying)
960
-
961
- -- DROP FUNCTION public.update_stsentity(character varying, character varying, integer, character varying, integer, character varying);
962
-
963
1143
  CREATE OR REPLACE FUNCTION public.update_stsentity(
964
1144
  _dbactionuser character varying,
965
1145
  _resname character varying,
966
- _resvnum integer,
1146
+ _resvnum bigint,
967
1147
  _entname character varying,
968
- _entvnum integer,
1148
+ _entvnum bigint,
969
1149
  _entvalue character varying)
970
1150
  RETURNS SETOF stsentity
971
1151
  LANGUAGE 'plpgsql'
@@ -1025,13 +1205,11 @@ BEGIN
1025
1205
  END;
1026
1206
  $BODY$;
1027
1207
 
1028
- ALTER FUNCTION public.update_stsentity(character varying, character varying, integer, character varying, integer, character varying)
1208
+ ALTER FUNCTION public.update_stsentity(character varying, character varying, bigint, character varying, bigint, character varying)
1029
1209
  OWNER TO postgres;
1030
1210
 
1031
1211
 
1032
1212
 
1033
-
1034
-
1035
1213
  CREATE OR REPLACE FUNCTION public.update_stsentity_latest(
1036
1214
  _dbactionuser character varying,
1037
1215
  _resname character varying,
@@ -1050,7 +1228,7 @@ declare
1050
1228
  resoid bigint;
1051
1229
  entoid bigint;
1052
1230
  __inserted_oid bigint;
1053
- _entvnum integer;
1231
+ _entvnum bigint;
1054
1232
  _entvalue_jsonb JSONB;
1055
1233
  BEGIN
1056
1234
  begin
@@ -1107,16 +1285,12 @@ ALTER FUNCTION public.update_stsentity_latest(character varying, character varyi
1107
1285
  OWNER TO postgres;
1108
1286
 
1109
1287
 
1110
- -- FUNCTION: public.delete_stsentity(character varying, character varying, integer, character varying, integer)
1111
-
1112
- -- DROP FUNCTION public.delete_stsentity(character varying, character varying, integer, character varying, integer);
1113
-
1114
1288
  CREATE OR REPLACE FUNCTION public.delete_stsentity(
1115
1289
  _dbactionuser character varying,
1116
1290
  _resname character varying,
1117
- _resvnum integer,
1291
+ _resvnum bigint,
1118
1292
  _entname character varying,
1119
- _entvnum integer)
1293
+ _entvnum bigint)
1120
1294
  RETURNS SETOF stsentity
1121
1295
  LANGUAGE 'plpgsql'
1122
1296
 
@@ -1168,14 +1342,11 @@ BEGIN
1168
1342
  END;
1169
1343
  $BODY$;
1170
1344
 
1171
- ALTER FUNCTION public.delete_stsentity(character varying, character varying, integer, character varying, integer)
1345
+ ALTER FUNCTION public.delete_stsentity(character varying, character varying, bigint, character varying, bigint)
1172
1346
  OWNER TO postgres;
1173
1347
 
1174
1348
 
1175
1349
 
1176
-
1177
-
1178
-
1179
1350
  CREATE OR REPLACE FUNCTION public.delete_stsentity_latest(
1180
1351
  _dbactionuser character varying,
1181
1352
  _resname character varying,
@@ -1193,7 +1364,7 @@ declare
1193
1364
  resoid bigint;
1194
1365
  entoid bigint;
1195
1366
  __inserted_oid bigint;
1196
- _entvnum integer;
1367
+ _entvnum bigint;
1197
1368
  BEGIN
1198
1369
  BEGIN
1199
1370
  -- Ensure we get the current non-deleted resource.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsdatamanagement",
3
- "version": "1.18.195",
3
+ "version": "1.18.196",
4
4
  "description": "STS Data Management Modules, Utilities and Services",
5
5
  "type": "module",
6
6
  "main": "./dist/dbaccess.js",