6
6
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
- * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.78 2001/07/10 22:09:28 tgl Exp $
9
+ * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.79 2001/07/12 18:02:59 tgl Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -787,13 +787,47 @@ CreateGroup(CreateGroupStmt *stmt)
787
787
HeapTuple tuple ;
788
788
TupleDesc pg_group_dsc ;
789
789
bool group_exists = false,
790
- sysid_exists = false;
790
+ sysid_exists = false,
791
+ havesysid = false;
791
792
int max_id = 0 ;
792
793
Datum new_record [Natts_pg_group ];
793
794
char new_record_nulls [Natts_pg_group ];
794
795
List * item ,
795
- * newlist = NULL ;
796
+ * option ,
797
+ * newlist = NIL ;
796
798
ArrayType * userarray ;
799
+ int sysid = 0 ;
800
+ List * userElts = NIL ;
801
+ DefElem * dsysid = NULL ;
802
+ DefElem * duserElts = NULL ;
803
+
804
+ foreach (option , stmt -> options )
805
+ {
806
+ DefElem * defel = (DefElem * ) lfirst (option );
807
+
808
+ if (strcasecmp (defel -> defname , "sysid" ) == 0 ) {
809
+ if (dsysid )
810
+ elog (ERROR , "CREATE GROUP: conflicting options" );
811
+ dsysid = defel ;
812
+ }
813
+ else if (strcasecmp (defel -> defname , "userElts" ) == 0 ) {
814
+ if (duserElts )
815
+ elog (ERROR , "CREATE GROUP: conflicting options" );
816
+ duserElts = defel ;
817
+ }
818
+ else
819
+ elog (ERROR ,"CREATE GROUP: option \"%s\" not recognized" ,
820
+ defel -> defname );
821
+ }
822
+
823
+ if (dsysid )
824
+ {
825
+ sysid = intVal (dsysid -> arg );
826
+ havesysid = true;
827
+ }
828
+
829
+ if (duserElts )
830
+ userElts = (List * ) duserElts -> arg ;
797
831
798
832
/*
799
833
* Make sure the user can do this.
@@ -819,8 +853,8 @@ CreateGroup(CreateGroupStmt *stmt)
819
853
datum = heap_getattr (tuple , Anum_pg_group_grosysid ,
820
854
pg_group_dsc , & null );
821
855
Assert (!null );
822
- if (stmt -> sysid >= 0 ) /* customized id wanted */
823
- sysid_exists = (DatumGetInt32 (datum ) == stmt -> sysid );
856
+ if (havesysid ) /* customized id wanted */
857
+ sysid_exists = (DatumGetInt32 (datum ) == sysid );
824
858
else
825
859
{
826
860
/* pick 1 + max */
@@ -835,19 +869,19 @@ CreateGroup(CreateGroupStmt *stmt)
835
869
stmt -> name );
836
870
if (sysid_exists )
837
871
elog (ERROR , "CREATE GROUP: group sysid %d is already assigned" ,
838
- stmt -> sysid );
872
+ sysid );
839
873
840
874
/*
841
875
* Translate the given user names to ids
842
876
*/
843
- foreach (item , stmt -> initUsers )
877
+ foreach (item , userElts )
844
878
{
845
879
const char * groupuser = strVal (lfirst (item ));
846
880
Value * v ;
847
881
848
882
v = makeInteger (get_usesysid (groupuser ));
849
883
if (!member (v , newlist ))
850
- newlist = lcons ( v , newlist );
884
+ newlist = lappend ( newlist , v );
851
885
}
852
886
853
887
/* build an array to insert */
@@ -872,14 +906,12 @@ CreateGroup(CreateGroupStmt *stmt)
872
906
/*
873
907
* Form a tuple to insert
874
908
*/
875
- if (stmt -> sysid >= 0 )
876
- max_id = stmt -> sysid ;
877
- else
878
- max_id ++ ;
909
+ if (!havesysid )
910
+ sysid = max_id + 1 ;
879
911
880
912
new_record [Anum_pg_group_groname - 1 ] =
881
913
DirectFunctionCall1 (namein , CStringGetDatum (stmt -> name ));
882
- new_record [Anum_pg_group_grosysid - 1 ] = Int32GetDatum (max_id );
914
+ new_record [Anum_pg_group_grosysid - 1 ] = Int32GetDatum (sysid );
883
915
new_record [Anum_pg_group_grolist - 1 ] = PointerGetDatum (userarray );
884
916
885
917
new_record_nulls [Anum_pg_group_groname - 1 ] = ' ' ;
@@ -952,7 +984,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
952
984
char new_record_nulls [Natts_pg_group ];
953
985
ArrayType * newarray ,
954
986
* oldarray ;
955
- List * newlist = NULL ,
987
+ List * newlist = NIL ,
956
988
* item ;
957
989
HeapTuple tuple ;
958
990
bool null = false;
@@ -976,7 +1008,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
976
1008
v = makeInteger (arrval );
977
1009
/* filter out duplicates */
978
1010
if (!member (v , newlist ))
979
- newlist = lcons ( v , newlist );
1011
+ newlist = lappend ( newlist , v );
980
1012
}
981
1013
982
1014
/*
@@ -1007,7 +1039,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
1007
1039
}
1008
1040
1009
1041
if (!member (v , newlist ))
1010
- newlist = lcons ( v , newlist );
1042
+ newlist = lappend ( newlist , v );
1011
1043
else
1012
1044
/*
1013
1045
* we silently assume here that this error will only come
@@ -1074,7 +1106,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
1074
1106
char new_record_nulls [Natts_pg_group ];
1075
1107
ArrayType * oldarray ,
1076
1108
* newarray ;
1077
- List * newlist = NULL ,
1109
+ List * newlist = NIL ,
1078
1110
* item ;
1079
1111
int i ;
1080
1112
@@ -1094,7 +1126,7 @@ AlterGroup(AlterGroupStmt *stmt, const char *tag)
1094
1126
v = makeInteger (arrval );
1095
1127
/* filter out duplicates */
1096
1128
if (!member (v , newlist ))
1097
- newlist = lcons ( v , newlist );
1129
+ newlist = lappend ( newlist , v );
1098
1130
}
1099
1131
1100
1132
/*
0 commit comments