@@ -1550,72 +1550,76 @@ check_for_incompatible_polymorphics(ClusterInfo *cluster)
15501550}
15511551
15521552/*
1553- * Verify that no tables are declared WITH OIDS.
1553+ * Callback function for processing results of query for
1554+ * check_for_tables_with_oids()'s UpgradeTask. If the query returned any rows
1555+ * (i.e., the check failed), write the details to the report file.
15541556 */
15551557static void
1556- check_for_tables_with_oids ( ClusterInfo * cluster )
1558+ process_with_oids_check ( DbInfo * dbinfo , PGresult * res , void * arg )
15571559{
1558- int dbnum ;
1559- FILE * script = NULL ;
1560- char output_path [MAXPGPATH ];
1560+ UpgradeTaskReport * report = (UpgradeTaskReport * )arg ;
1561+ bool db_used = false;
1562+ int ntups = PQntuples (res );
1563+ int i_nspname = PQfnumber (res ,"nspname" );
1564+ int i_relname = PQfnumber (res ,"relname" );
15611565
1562- prep_status ( "Checking for tables WITH OIDS" );
1566+ AssertVariableIsOfType ( & process_with_oids_check , UpgradeTaskProcessCB );
15631567
1564- snprintf (output_path ,sizeof (output_path ),"%s/%s" ,
1565- log_opts .basedir ,
1566- "tables_with_oids.txt" );
1568+ if (!ntups )
1569+ return ;
15671570
1568- /* Find any tables declared WITH OIDS */
1569- for (dbnum = 0 ;dbnum < cluster -> dbarr .ndbs ;dbnum ++ )
1571+ for (int rowno = 0 ;rowno < ntups ;rowno ++ )
15701572{
1571- PGresult * res ;
1572- bool db_used = false;
1573- int ntups ;
1574- int rowno ;
1575- int i_nspname ,
1576- i_relname ;
1577- DbInfo * active_db = & cluster -> dbarr .dbs [dbnum ];
1578- PGconn * conn = connectToServer (cluster ,active_db -> db_name );
1579-
1580- res = executeQueryOrDie (conn ,
1581- "SELECT n.nspname, c.relname "
1582- "FROMpg_catalog.pg_class c, "
1583- "pg_catalog.pg_namespace n "
1584- "WHEREc.relnamespace = n.oid AND "
1585- "c.relhasoids AND"
1586- " n.nspname NOT IN ('pg_catalog')" );
1587-
1588- ntups = PQntuples (res );
1589- i_nspname = PQfnumber (res ,"nspname" );
1590- i_relname = PQfnumber (res ,"relname" );
1591- for (rowno = 0 ;rowno < ntups ;rowno ++ )
1573+ if (report -> file == NULL &&
1574+ (report -> file = fopen_priv (report -> path ,"w" ))== NULL )
1575+ pg_fatal ("could not open file \"%s\": %m" ,report -> path );
1576+ if (!db_used )
15921577{
1593- if (script == NULL && (script = fopen_priv (output_path ,"w" ))== NULL )
1594- pg_fatal ("could not open file \"%s\": %m" ,output_path );
1595- if (!db_used )
1596- {
1597- fprintf (script ,"In database: %s\n" ,active_db -> db_name );
1598- db_used = true;
1599- }
1600- fprintf (script ," %s.%s\n" ,
1601- PQgetvalue (res ,rowno ,i_nspname ),
1602- PQgetvalue (res ,rowno ,i_relname ));
1578+ fprintf (report -> file ,"In database: %s\n" ,dbinfo -> db_name );
1579+ db_used = true;
16031580}
1581+ fprintf (report -> file ," %s.%s\n" ,
1582+ PQgetvalue (res ,rowno ,i_nspname ),
1583+ PQgetvalue (res ,rowno ,i_relname ));
1584+ }
1585+ }
16041586
1605- PQclear (res );
1587+ /*
1588+ * Verify that no tables are declared WITH OIDS.
1589+ */
1590+ static void
1591+ check_for_tables_with_oids (ClusterInfo * cluster )
1592+ {
1593+ UpgradeTaskReport report ;
1594+ UpgradeTask * task = upgrade_task_create ();
1595+ const char * query = "SELECT n.nspname, c.relname "
1596+ "FROM pg_catalog.pg_class c, "
1597+ " pg_catalog.pg_namespace n "
1598+ "WHERE c.relnamespace = n.oid AND "
1599+ " c.relhasoids AND"
1600+ " n.nspname NOT IN ('pg_catalog')" ;
16061601
1607- PQfinish (conn );
1608- }
1602+ prep_status ("Checking for tables WITH OIDS" );
16091603
1610- if (script )
1604+ report .file = NULL ;
1605+ snprintf (report .path ,sizeof (report .path ),"%s/%s" ,
1606+ log_opts .basedir ,
1607+ "tables_with_oids.txt" );
1608+
1609+ upgrade_task_add_step (task ,query ,process_with_oids_check ,
1610+ true,& report );
1611+ upgrade_task_run (task ,cluster );
1612+ upgrade_task_free (task );
1613+
1614+ if (report .file )
16111615{
1612- fclose (script );
1616+ fclose (report . file );
16131617pg_log (PG_REPORT ,"fatal" );
16141618pg_fatal ("Your installation contains tables declared WITH OIDS, which is not\n"
16151619"supported anymore. Consider removing the oid column using\n"
16161620" ALTER TABLE ... SET WITHOUT OIDS;\n"
16171621"A list of tables with the problem is in the file:\n"
1618- " %s" ,output_path );
1622+ " %s" ,report . path );
16191623}
16201624else
16211625check_ok ();