|
12 | 12 | *by PostgreSQL
|
13 | 13 | *
|
14 | 14 | * IDENTIFICATION
|
15 |
| - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.541 2009/07/20 20:53:40momjian Exp $ |
| 15 | + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.542 2009/07/23 22:59:40tgl Exp $ |
16 | 16 | *
|
17 | 17 | *-------------------------------------------------------------------------
|
18 | 18 | */
|
@@ -134,6 +134,7 @@ static void dumpBaseType(Archive *fout, TypeInfo *tinfo);
|
134 | 134 | staticvoiddumpEnumType(Archive*fout,TypeInfo*tinfo);
|
135 | 135 | staticvoiddumpDomain(Archive*fout,TypeInfo*tinfo);
|
136 | 136 | staticvoiddumpCompositeType(Archive*fout,TypeInfo*tinfo);
|
| 137 | +staticvoiddumpCompositeTypeColComments(Archive*fout,TypeInfo*tinfo); |
137 | 138 | staticvoiddumpShellType(Archive*fout,ShellTypeInfo*stinfo);
|
138 | 139 | staticvoiddumpProcLang(Archive*fout,ProcLangInfo*plang);
|
139 | 140 | staticvoiddumpFunc(Archive*fout,FuncInfo*finfo);
|
@@ -6755,6 +6756,119 @@ dumpCompositeType(Archive *fout, TypeInfo *tinfo)
|
6755 | 6756 | destroyPQExpBuffer(q);
|
6756 | 6757 | destroyPQExpBuffer(delq);
|
6757 | 6758 | destroyPQExpBuffer(query);
|
| 6759 | + |
| 6760 | +/* Dump any per-column comments */ |
| 6761 | +dumpCompositeTypeColComments(fout,tinfo); |
| 6762 | +} |
| 6763 | + |
| 6764 | +/* |
| 6765 | + * dumpCompositeTypeColComments |
| 6766 | + * writes out to fout the queries to recreate comments on the columns of |
| 6767 | + * a user-defined stand-alone composite type |
| 6768 | + */ |
| 6769 | +staticvoid |
| 6770 | +dumpCompositeTypeColComments(Archive*fout,TypeInfo*tinfo) |
| 6771 | +{ |
| 6772 | +CommentItem*comments; |
| 6773 | +intncomments; |
| 6774 | +PGresult*res; |
| 6775 | +PQExpBufferquery; |
| 6776 | +PQExpBuffertarget; |
| 6777 | +OidpgClassOid; |
| 6778 | +inti; |
| 6779 | +intntups; |
| 6780 | +inti_attname; |
| 6781 | +inti_attnum; |
| 6782 | + |
| 6783 | +query=createPQExpBuffer(); |
| 6784 | + |
| 6785 | +/* We assume here that remoteVersion must be at least 70300 */ |
| 6786 | +appendPQExpBuffer(query, |
| 6787 | +"SELECT c.tableoid, a.attname, a.attnum " |
| 6788 | +"FROM pg_catalog.pg_class c, pg_catalog.pg_attribute a " |
| 6789 | +"WHERE c.oid = '%u' AND c.oid = a.attrelid " |
| 6790 | +" AND NOT a.attisdropped " |
| 6791 | +"ORDER BY a.attnum ", |
| 6792 | +tinfo->typrelid); |
| 6793 | + |
| 6794 | +/* Fetch column attnames */ |
| 6795 | +res=PQexec(g_conn,query->data); |
| 6796 | +check_sql_result(res,g_conn,query->data,PGRES_TUPLES_OK); |
| 6797 | + |
| 6798 | +/* Expecting at least a single result */ |
| 6799 | +ntups=PQntuples(res); |
| 6800 | +if (ntups<1) |
| 6801 | +{ |
| 6802 | +write_msg(NULL,"query returned no rows: %s\n",query->data); |
| 6803 | +exit_nicely(); |
| 6804 | +} |
| 6805 | + |
| 6806 | +pgClassOid=atooid(PQgetvalue(res,0,PQfnumber(res,"tableoid"))); |
| 6807 | + |
| 6808 | +/* Search for comments associated with type's pg_class OID */ |
| 6809 | +ncomments=findComments(fout, |
| 6810 | +pgClassOid, |
| 6811 | +tinfo->typrelid, |
| 6812 | +&comments); |
| 6813 | + |
| 6814 | +/* If no comments exist, we're done */ |
| 6815 | +if (ncomments <=0) |
| 6816 | +{ |
| 6817 | +PQclear(res); |
| 6818 | +destroyPQExpBuffer(query); |
| 6819 | +return; |
| 6820 | +} |
| 6821 | + |
| 6822 | +/* Build COMMENT ON statements */ |
| 6823 | +target=createPQExpBuffer(); |
| 6824 | + |
| 6825 | +i_attnum=PQfnumber(res,"attnum"); |
| 6826 | +i_attname=PQfnumber(res,"attname"); |
| 6827 | +while (ncomments>0) |
| 6828 | +{ |
| 6829 | +constchar*attname; |
| 6830 | + |
| 6831 | +attname=NULL; |
| 6832 | +for (i=0;i<ntups;i++) |
| 6833 | +{ |
| 6834 | +if (atoi(PQgetvalue(res,i,i_attnum))==comments->objsubid) |
| 6835 | +{ |
| 6836 | +attname=PQgetvalue(res,i,i_attname); |
| 6837 | +break; |
| 6838 | +} |
| 6839 | +} |
| 6840 | +if (attname)/* just in case we don't find it */ |
| 6841 | +{ |
| 6842 | +constchar*descr=comments->descr; |
| 6843 | + |
| 6844 | +resetPQExpBuffer(target); |
| 6845 | +appendPQExpBuffer(target,"COLUMN %s.", |
| 6846 | +fmtId(tinfo->dobj.name)); |
| 6847 | +appendPQExpBuffer(target,"%s", |
| 6848 | +fmtId(attname)); |
| 6849 | + |
| 6850 | +resetPQExpBuffer(query); |
| 6851 | +appendPQExpBuffer(query,"COMMENT ON %s IS ",target->data); |
| 6852 | +appendStringLiteralAH(query,descr,fout); |
| 6853 | +appendPQExpBuffer(query,";\n"); |
| 6854 | + |
| 6855 | +ArchiveEntry(fout,nilCatalogId,createDumpId(), |
| 6856 | +target->data, |
| 6857 | +tinfo->dobj.namespace->dobj.name, |
| 6858 | +NULL,tinfo->rolname, |
| 6859 | + false,"COMMENT",SECTION_NONE, |
| 6860 | +query->data,"",NULL, |
| 6861 | +&(tinfo->dobj.dumpId),1, |
| 6862 | +NULL,NULL); |
| 6863 | +} |
| 6864 | + |
| 6865 | +comments++; |
| 6866 | +ncomments--; |
| 6867 | +} |
| 6868 | + |
| 6869 | +PQclear(res); |
| 6870 | +destroyPQExpBuffer(query); |
| 6871 | +destroyPQExpBuffer(target); |
6758 | 6872 | }
|
6759 | 6873 |
|
6760 | 6874 | /*
|
|