@@ -42,6 +42,30 @@ library_name_compare(const void *p1, const void *p2)
42
42
((const LibraryInfo * ) p2 )-> dbnum );
43
43
}
44
44
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
+ }
45
69
46
70
/*
47
71
* get_loadable_libraries()
@@ -54,47 +78,41 @@ library_name_compare(const void *p1, const void *p2)
54
78
void
55
79
get_loadable_libraries (void )
56
80
{
57
- PGresult * * ress ;
58
81
int totaltups ;
59
82
int dbnum ;
60
83
int n_libinfos ;
84
+ UpgradeTask * task = upgrade_task_create ();
85
+ struct loadable_libraries_state state ;
86
+ char * query ;
61
87
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 ;
64
90
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 );
70
98
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 );
86
104
87
105
/*
88
106
* Allocate memory for required libraries and logical replication output
89
107
* plugins.
90
108
*/
91
- n_libinfos = totaltups + count_old_cluster_logical_slots ();
109
+ n_libinfos = state . totaltups + count_old_cluster_logical_slots ();
92
110
os_info .libraries = (LibraryInfo * ) pg_malloc (sizeof (LibraryInfo ) * n_libinfos );
93
111
totaltups = 0 ;
94
112
95
113
for (dbnum = 0 ; dbnum < old_cluster .dbarr .ndbs ; dbnum ++ )
96
114
{
97
- PGresult * res = ress [dbnum ];
115
+ PGresult * res = state . ress [dbnum ];
98
116
int ntups ;
99
117
int rowno ;
100
118
LogicalSlotInfoArr * slot_arr = & old_cluster .dbarr .dbs [dbnum ].slot_arr ;
@@ -129,7 +147,8 @@ get_loadable_libraries(void)
129
147
}
130
148
}
131
149
132
- pg_free (ress );
150
+ pg_free (state .ress );
151
+ pg_free (query );
133
152
134
153
os_info .num_libraries = totaltups ;
135
154
}
0 commit comments