2222 *
2323 *
2424 * IDENTIFICATION
25- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.205.2.3 2001/07/29 22:12:49 tgl Exp $
25+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.205.2.4 2001/08/03 20:14:06 tgl Exp $
2626 *
2727 * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
2828 *
@@ -180,7 +180,8 @@ typedef enum _formatLiteralOptions
180180/* only checks for 'opts == CONV_ALL' anyway. */
181181}formatLiteralOptions ;
182182
183- static void dumpComment (Archive * outfile ,const char * target ,const char * oid );
183+ static void dumpComment (Archive * outfile ,const char * target ,const char * oid ,
184+ const char * ((* deps )[]));
184185static void dumpSequence (Archive * fout ,TableInfo tbinfo ,const bool schemaOnly ,const bool dataOnly );
185186static void dumpACL (Archive * fout ,TableInfo tbinfo );
186187static void dumpTriggers (Archive * fout ,const char * tablename ,
@@ -1329,7 +1330,10 @@ getTypes(int *numTypes)
13291330int i_typdelim ;
13301331int i_typdefault ;
13311332int i_typrelid ;
1333+ int i_typalign ;
1334+ int i_typstorage ;
13321335int i_typbyval ;
1336+ int i_typisdefined ;
13331337int i_usename ;
13341338int i_typedefn ;
13351339
@@ -1348,14 +1352,14 @@ getTypes(int *numTypes)
13481352{
13491353appendPQExpBuffer (query ,"SELECT pg_type.oid, typowner, typname, typlen, typprtlen, "
13501354"typinput, typoutput, typreceive, typsend, typelem, typdelim, "
1351- "typdefault, typrelid, typbyval, "
1355+ "typdefault, typrelid,typalign, 'p'::char as typstorage, typbyval, typisdefined , "
13521356"(select usename from pg_user where typowner = usesysid) as usename, "
13531357"typname as typedefn "
13541358"from pg_type" );
13551359}else {
13561360appendPQExpBuffer (query ,"SELECT pg_type.oid, typowner, typname, typlen, typprtlen, "
13571361"typinput, typoutput, typreceive, typsend, typelem, typdelim, "
1358- "typdefault, typrelid, typbyval, "
1362+ "typdefault, typrelid,typalign, typstorage, typbyval, typisdefined , "
13591363"(select usename from pg_user where typowner = usesysid) as usename, "
13601364"format_type(pg_type.oid, NULL) as typedefn "
13611365"from pg_type" );
@@ -1386,7 +1390,10 @@ getTypes(int *numTypes)
13861390i_typdelim = PQfnumber (res ,"typdelim" );
13871391i_typdefault = PQfnumber (res ,"typdefault" );
13881392i_typrelid = PQfnumber (res ,"typrelid" );
1393+ i_typalign = PQfnumber (res ,"typalign" );
1394+ i_typstorage = PQfnumber (res ,"typstorage" );
13891395i_typbyval = PQfnumber (res ,"typbyval" );
1396+ i_typisdefined = PQfnumber (res ,"typisdefined" );
13901397i_usename = PQfnumber (res ,"usename" );
13911398i_typedefn = PQfnumber (res ,"typedefn" );
13921399
@@ -1405,6 +1412,8 @@ getTypes(int *numTypes)
14051412tinfo [i ].typdelim = strdup (PQgetvalue (res ,i ,i_typdelim ));
14061413tinfo [i ].typdefault = strdup (PQgetvalue (res ,i ,i_typdefault ));
14071414tinfo [i ].typrelid = strdup (PQgetvalue (res ,i ,i_typrelid ));
1415+ tinfo [i ].typalign = strdup (PQgetvalue (res ,i ,i_typalign ));
1416+ tinfo [i ].typstorage = strdup (PQgetvalue (res ,i ,i_typstorage ));
14081417tinfo [i ].usename = strdup (PQgetvalue (res ,i ,i_usename ));
14091418tinfo [i ].typedefn = strdup (PQgetvalue (res ,i ,i_typedefn ));
14101419
@@ -1424,12 +1433,19 @@ getTypes(int *numTypes)
14241433tinfo [i ].isArray = 1 ;
14251434else
14261435tinfo [i ].isArray = 0 ;
1436+
1437+ if (strcmp (PQgetvalue (res ,i ,i_typisdefined ),"f" )== 0 )
1438+ tinfo [i ].isDefined = 0 ;
1439+ else
1440+ tinfo [i ].isDefined = 1 ;
14271441}
14281442
14291443* numTypes = ntups ;
14301444
14311445PQclear (res );
14321446
1447+ destroyPQExpBuffer (query );
1448+
14331449return tinfo ;
14341450}
14351451
@@ -1567,8 +1583,14 @@ clearTypeInfo(TypeInfo *tp, int numTypes)
15671583free (tp [i ].typdefault );
15681584if (tp [i ].typrelid )
15691585free (tp [i ].typrelid );
1586+ if (tp [i ].typalign )
1587+ free (tp [i ].typalign );
1588+ if (tp [i ].typstorage )
1589+ free (tp [i ].typstorage );
15701590if (tp [i ].usename )
15711591free (tp [i ].usename );
1592+ if (tp [i ].typedefn )
1593+ free (tp [i ].typedefn );
15721594}
15731595free (tp );
15741596}
@@ -2989,16 +3011,17 @@ getIndices(int *numIndices)
29893011 * oid handed to this routine. The routine takes a constant character
29903012 * string for the target part of the object and the oid of the object
29913013 * whose comments are to be dumped. It is perfectly acceptable
2992- * to hand an oid to this routine which has not been commented. In
2993- * addition, the routine takes the stdio FILE handle to which the
2994- * output should be written.
3014+ * to hand an oid to this routine which has not been commented. Additional
3015+ * dependencies can be passed for the comment, too --- this is needed for
3016+ * VIEWs, whose comments are filed under the table OID but which are dumped
3017+ * in order by their rule OID.
29953018 *------------------------------------------------------------------
29963019*/
29973020
29983021static void
2999- dumpComment (Archive * fout ,const char * target ,const char * oid )
3022+ dumpComment (Archive * fout ,const char * target ,const char * oid ,
3023+ const char * ((* deps )[]))
30003024{
3001-
30023025PGresult * res ;
30033026PQExpBuffer query ;
30043027int i_description ;
@@ -3033,7 +3056,8 @@ dumpComment(Archive *fout, const char *target, const char *oid)
30333056formatStringLiteral (query ,PQgetvalue (res ,0 ,i_description ),PASS_LFTAB );
30343057appendPQExpBuffer (query ,";\n" );
30353058
3036- ArchiveEntry (fout ,oid ,target ,"COMMENT" ,NULL ,query -> data ,"" /* Del */ ,
3059+ ArchiveEntry (fout ,oid ,target ,"COMMENT" ,deps ,
3060+ query -> data ,"" /* Del */ ,
30373061"" /* Copy */ ,"" /* Owner */ ,NULL ,NULL );
30383062
30393063}
@@ -3085,13 +3109,13 @@ dumpDBComment(Archive *fout)
30853109i_oid = PQfnumber (res ,"oid" );
30863110resetPQExpBuffer (query );
30873111appendPQExpBuffer (query ,"DATABASE %s" ,fmtId (PQdb (g_conn ),force_quotes ));
3088- dumpComment (fout ,query -> data ,PQgetvalue (res ,0 ,i_oid ));
3112+ dumpComment (fout ,query -> data ,PQgetvalue (res ,0 ,i_oid ), NULL );
30893113}
30903114
30913115/*** Clear the statement buffer and return ***/
30923116
30933117PQclear (res );
3094-
3118+ destroyPQExpBuffer ( query );
30953119}
30963120
30973121/*
@@ -3108,13 +3132,10 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
31083132PQExpBuffer delq = createPQExpBuffer ();
31093133int funcInd ;
31103134const char * ((* deps )[]);
3111- int depIdx = 0 ;
3112-
3113- deps = malloc (sizeof (char * )* 10 );
3135+ int depIdx ;
31143136
31153137for (i = 0 ;i < numTypes ;i ++ )
31163138{
3117-
31183139/* skip all the builtin types */
31193140if (atooid (tinfo [i ].oid ) <=g_last_builtin_oid )
31203141continue ;
@@ -3123,11 +3144,18 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
31233144if (atoi (tinfo [i ].typrelid )!= 0 )
31243145continue ;
31253146
3147+ /* skip undefined placeholder types */
3148+ if (!tinfo [i ].isDefined )
3149+ continue ;
3150+
31263151/* skip all array types that start w/ underscore */
31273152if ((tinfo [i ].typname [0 ]== '_' )&&
31283153(strcmp (tinfo [i ].typinput ,"array_in" )== 0 ))
31293154continue ;
31303155
3156+ deps = malloc (sizeof (char * )* 10 );
3157+ depIdx = 0 ;
3158+
31313159/*
31323160 * before we create a type, we need to create the input and output
31333161 * functions for it, if they haven't been created already
@@ -3146,6 +3174,7 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
31463174dumpOneFunc (fout ,finfo ,funcInd ,tinfo ,numTypes );
31473175}
31483176
3177+ resetPQExpBuffer (delq );
31493178appendPQExpBuffer (delq ,"DROP TYPE %s;\n" ,fmtId (tinfo [i ].typname ,force_quotes ));
31503179
31513180resetPQExpBuffer (q );
@@ -3175,8 +3204,6 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
31753204{
31763205fprintf (stderr ,"Notice: array type %s - type for elements (oid %s) is not dumped.\n" ,
31773206tinfo [i ].typname ,tinfo [i ].typelem );
3178- resetPQExpBuffer (q );
3179- resetPQExpBuffer (delq );
31803207continue ;
31813208}
31823209
@@ -3185,8 +3212,24 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
31853212
31863213(* deps )[depIdx ++ ]= strdup (tinfo [i ].typelem );
31873214}
3215+
3216+ /* XXX these are all the aligns currently handled by DefineType */
3217+ if (strcmp (tinfo [i ].typalign ,"i" )== 0 )
3218+ appendPQExpBuffer (q ,", alignment = int4" );
3219+ else if (strcmp (tinfo [i ].typalign ,"d" )== 0 )
3220+ appendPQExpBuffer (q ,", alignment = double" );
3221+
3222+ if (strcmp (tinfo [i ].typstorage ,"p" )== 0 )
3223+ appendPQExpBuffer (q ,", storage = plain" );
3224+ if (strcmp (tinfo [i ].typstorage ,"e" )== 0 )
3225+ appendPQExpBuffer (q ,", storage = external" );
3226+ if (strcmp (tinfo [i ].typstorage ,"x" )== 0 )
3227+ appendPQExpBuffer (q ,", storage = extended" );
3228+ if (strcmp (tinfo [i ].typstorage ,"m" )== 0 )
3229+ appendPQExpBuffer (q ,", storage = main" );
3230+
31883231if (tinfo [i ].passedbyvalue )
3189- appendPQExpBuffer (q ,",passedbyvalue);\n" );
3232+ appendPQExpBuffer (q ,", passedbyvalue);\n" );
31903233else
31913234appendPQExpBuffer (q ,");\n" );
31923235
@@ -3201,7 +3244,7 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs,
32013244resetPQExpBuffer (delq );
32023245
32033246appendPQExpBuffer (q ,"TYPE %s" ,fmtId (tinfo [i ].typname ,force_quotes ));
3204- dumpComment (fout ,q -> data ,tinfo [i ].oid );
3247+ dumpComment (fout ,q -> data ,tinfo [i ].oid , NULL );
32053248
32063249resetPQExpBuffer (q );
32073250}
@@ -3486,7 +3529,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
34863529appendPQExpBuffer (q ,"FUNCTION %s " ,
34873530fmtId (finfo [i ].proname ,force_quotes ));
34883531appendPQExpBuffer (q ,"( %s )" ,fnlist -> data );
3489- dumpComment (fout ,q -> data ,finfo [i ].oid );
3532+ dumpComment (fout ,q -> data ,finfo [i ].oid , NULL );
34903533
34913534}
34923535
@@ -3743,7 +3786,7 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs,
37433786resetPQExpBuffer (q );
37443787appendPQExpBuffer (q ,"AGGREGATE %s %s" ,agginfo [i ].aggname ,
37453788findTypeByOid (tinfo ,numTypes ,agginfo [i ].aggbasetype ,zeroAsOpaque + useBaseTypeName ));
3746- dumpComment (fout ,q -> data ,agginfo [i ].oid );
3789+ dumpComment (fout ,q -> data ,agginfo [i ].oid , NULL );
37473790
37483791}
37493792}
@@ -4001,6 +4044,7 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
40014044int actual_atts ;/* number of attrs in this CREATE statment */
40024045char * reltypename ;
40034046char * objoid ;
4047+ const char * ((* commentDeps )[]);
40044048
40054049/* First - dump SEQUENCEs */
40064050if (tablename && strlen (tablename )> 0 )
@@ -4043,12 +4087,15 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
40434087objoid = tblinfo [i ].viewoid ;
40444088appendPQExpBuffer (delq ,"DROP VIEW %s;\n" ,fmtId (tblinfo [i ].relname ,force_quotes ));
40454089appendPQExpBuffer (q ,"CREATE VIEW %s as %s\n" ,fmtId (tblinfo [i ].relname ,force_quotes ),tblinfo [i ].viewdef );
4046-
4090+ commentDeps = malloc (sizeof (char * )* 2 );
4091+ (* commentDeps )[0 ]= strdup (objoid );
4092+ (* commentDeps )[1 ]= NULL ;/* end of list */
40474093}
40484094else
40494095{
40504096reltypename = "TABLE" ;
40514097objoid = tblinfo [i ].oid ;
4098+ commentDeps = NULL ;
40524099parentRels = tblinfo [i ].parentRels ;
40534100numParents = tblinfo [i ].numParents ;
40544101
@@ -4167,17 +4214,20 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
41674214appendPQExpBuffer (q ,"COLUMN %s" ,fmtId (tblinfo [i ].relname ,force_quotes ));
41684215appendPQExpBuffer (q ,"." );
41694216appendPQExpBuffer (q ,"%s" ,fmtId (tblinfo [i ].attnames [j ],force_quotes ));
4170- dumpComment (fout ,q -> data ,tblinfo [i ].attoids [j ]);
4217+ dumpComment (fout ,q -> data ,tblinfo [i ].attoids [j ], NULL );
41714218}
41724219
41734220/* Dump Table Comments */
41744221
41754222resetPQExpBuffer (q );
41764223appendPQExpBuffer (q ,"%s %s" ,reltypename ,fmtId (tblinfo [i ].relname ,force_quotes ));
4177- dumpComment (fout ,q -> data ,tblinfo [i ].oid );
4224+ dumpComment (fout ,q -> data ,tblinfo [i ].oid , commentDeps );
41784225
41794226}
41804227}
4228+
4229+ destroyPQExpBuffer (q );
4230+ destroyPQExpBuffer (delq );
41814231}
41824232
41834233static PQExpBuffer
@@ -4461,7 +4511,7 @@ dumpIndices(Archive *fout, IndInfo *indinfo, int numIndices,
44614511/* Dump Index Comments */
44624512resetPQExpBuffer (q );
44634513appendPQExpBuffer (q ,"INDEX %s" ,id1 -> data );
4464- dumpComment (fout ,q -> data ,indinfo [i ].indoid );
4514+ dumpComment (fout ,q -> data ,indinfo [i ].indoid , NULL );
44654515
44664516}
44674517}
@@ -4776,7 +4826,7 @@ dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool
47764826
47774827resetPQExpBuffer (query );
47784828appendPQExpBuffer (query ,"SEQUENCE %s" ,fmtId (tbinfo .relname ,force_quotes ));
4779- dumpComment (fout ,query -> data ,tbinfo .oid );
4829+ dumpComment (fout ,query -> data ,tbinfo .oid , NULL );
47804830}
47814831}
47824832
@@ -4802,7 +4852,7 @@ dumpTriggers(Archive *fout, const char *tablename,
48024852ArchiveEntry (fout ,tblinfo [i ].triggers [j ].oid ,tblinfo [i ].triggers [j ].tgname ,
48034853"TRIGGER" ,NULL ,tblinfo [i ].triggers [j ].tgsrc ,"" ,"" ,
48044854tblinfo [i ].usename ,NULL ,NULL );
4805- dumpComment (fout ,tblinfo [i ].triggers [j ].tgcomment ,tblinfo [i ].triggers [j ].oid );
4855+ dumpComment (fout ,tblinfo [i ].triggers [j ].tgcomment ,tblinfo [i ].triggers [j ].oid , NULL );
48064856}
48074857}
48084858}
@@ -4882,7 +4932,7 @@ dumpRules(Archive *fout, const char *tablename,
48824932
48834933resetPQExpBuffer (query );
48844934appendPQExpBuffer (query ,"RULE %s" ,fmtId (PQgetvalue (res ,i ,i_rulename ),force_quotes ));
4885- dumpComment (fout ,query -> data ,PQgetvalue (res ,i ,i_oid ));
4935+ dumpComment (fout ,query -> data ,PQgetvalue (res ,i ,i_oid ), NULL );
48864936
48874937}
48884938