@@ -42,6 +42,30 @@ library_name_compare(const void *p1, const void *p2)
4242 ((const LibraryInfo * )p2 )-> dbnum );
4343}
4444
45+ /*
46+ * Private state for get_loadable_libraries()'s UpgradeTask.
47+ */
48+ struct loadable_libraries_state
49+ {
50+ PGresult * * ress ;/* results for each database */
51+ int totaltups ;/* number of tuples in all results */
52+ };
53+
54+ /*
55+ * Callback function for processing results of query for
56+ * get_loadable_libraries()'s UpgradeTask. This function stores the results
57+ * for later use within get_loadable_libraries().
58+ */
59+ static void
60+ process_loadable_libraries (DbInfo * dbinfo ,PGresult * res ,void * arg )
61+ {
62+ struct loadable_libraries_state * state = (struct loadable_libraries_state * )arg ;
63+
64+ AssertVariableIsOfType (& process_loadable_libraries ,UpgradeTaskProcessCB );
65+
66+ state -> ress [dbinfo - old_cluster .dbarr .dbs ]= res ;
67+ state -> totaltups += PQntuples (res );
68+ }
4569
4670/*
4771 * get_loadable_libraries()
@@ -54,47 +78,41 @@ library_name_compare(const void *p1, const void *p2)
5478void
5579get_loadable_libraries (void )
5680{
57- PGresult * * ress ;
5881int totaltups ;
5982int dbnum ;
6083int n_libinfos ;
84+ UpgradeTask * task = upgrade_task_create ();
85+ struct loadable_libraries_state state ;
86+ char * query ;
6187
62- ress = (PGresult * * )pg_malloc (old_cluster .dbarr .ndbs * sizeof (PGresult * ));
63- totaltups = 0 ;
88+ state . ress = (PGresult * * )pg_malloc (old_cluster .dbarr .ndbs * sizeof (PGresult * ));
89+ state . totaltups = 0 ;
6490
65- /* Fetch all library names, removing duplicates within each DB */
66- for (dbnum = 0 ;dbnum < old_cluster .dbarr .ndbs ;dbnum ++ )
67- {
68- DbInfo * active_db = & old_cluster .dbarr .dbs [dbnum ];
69- PGconn * conn = connectToServer (& old_cluster ,active_db -> db_name );
91+ query = psprintf ("SELECT DISTINCT probin "
92+ "FROM pg_catalog.pg_proc "
93+ "WHERE prolang = %u AND "
94+ "probin IS NOT NULL AND "
95+ "oid >= %u" ,
96+ ClanguageId ,
97+ FirstNormalObjectId );
7098
71- /*
72- * Fetch all libraries containing non-built-in C functions in this DB.
73- */
74- ress [dbnum ]= executeQueryOrDie (conn ,
75- "SELECT DISTINCT probin "
76- "FROM pg_catalog.pg_proc "
77- "WHERE prolang = %u AND "
78- "probin IS NOT NULL AND "
79- "oid >= %u;" ,
80- ClanguageId ,
81- FirstNormalObjectId );
82- totaltups += PQntuples (ress [dbnum ]);
83-
84- PQfinish (conn );
85- }
99+ upgrade_task_add_step (task ,query ,process_loadable_libraries ,
100+ false,& state );
101+
102+ upgrade_task_run (task ,& old_cluster );
103+ upgrade_task_free (task );
86104
87105/*
88106 * Allocate memory for required libraries and logical replication output
89107 * plugins.
90108 */
91- n_libinfos = totaltups + count_old_cluster_logical_slots ();
109+ n_libinfos = state . totaltups + count_old_cluster_logical_slots ();
92110os_info .libraries = (LibraryInfo * )pg_malloc (sizeof (LibraryInfo )* n_libinfos );
93111totaltups = 0 ;
94112
95113for (dbnum = 0 ;dbnum < old_cluster .dbarr .ndbs ;dbnum ++ )
96114{
97- PGresult * res = ress [dbnum ];
115+ PGresult * res = state . ress [dbnum ];
98116int ntups ;
99117int rowno ;
100118LogicalSlotInfoArr * slot_arr = & old_cluster .dbarr .dbs [dbnum ].slot_arr ;
@@ -129,7 +147,8 @@ get_loadable_libraries(void)
129147}
130148}
131149
132- pg_free (ress );
150+ pg_free (state .ress );
151+ pg_free (query );
133152
134153os_info .num_libraries = totaltups ;
135154}