@@ -66,7 +66,7 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
6666 if (strcmp (newrel -> nspname , "pg_toast" ) == 0 )
6767 continue ;
6868
69- oldrel = relarr_lookup_rel (& ( old_db -> rel_arr ) , newrel -> nspname ,
69+ oldrel = relarr_lookup_rel (& old_db -> rel_arr , newrel -> nspname ,
7070 newrel -> relname , CLUSTER_OLD );
7171
7272 map_rel (oldrel , newrel , old_db , new_db , old_pgdata , new_pgdata ,
@@ -275,7 +275,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
275275
276276 for (dbnum = 0 ; dbnum < db_arr -> ndbs ; dbnum ++ )
277277 get_rel_infos (& db_arr -> dbs [dbnum ],
278- & ( db_arr -> dbs [dbnum ].rel_arr ) , whichCluster );
278+ & db_arr -> dbs [dbnum ].rel_arr , whichCluster );
279279
280280 if (log .debug )
281281 dbarr_print (db_arr , whichCluster );
@@ -292,8 +292,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
292292 * FirstNormalObjectId belongs to the user
293293 */
294294static void
295- get_rel_infos (const DbInfo * dbinfo ,
296- RelInfoArr * relarr , Cluster whichCluster )
295+ get_rel_infos (const DbInfo * dbinfo , RelInfoArr * relarr , Cluster whichCluster )
297296{
298297 PGconn * conn = connectToServer (dbinfo -> db_name , whichCluster );
299298 PGresult * res ;
@@ -386,6 +385,7 @@ get_rel_infos(const DbInfo *dbinfo,
386385
387386 relarr -> rels = relinfos ;
388387 relarr -> nrels = num_rels ;
388+ relarr -> cache_name_rel = 0 ;
389389}
390390
391391
@@ -419,31 +419,31 @@ dbarr_lookup_db(DbInfoArr *db_arr, const char *db_name)
419419 * RelInfo structure.
420420 */
421421static RelInfo *
422- relarr_lookup_rel (RelInfoArr * rel_arr ,
423- const char * nspname , const char * relname ,
424- Cluster whichCluster )
422+ relarr_lookup_rel (RelInfoArr * rel_arr , const char * nspname ,
423+ const char * relname , Cluster whichCluster )
425424{
426- static int relnum = 0 ;
425+ int relnum ;
427426
428427 if (!rel_arr || !relname )
429428 return NULL ;
430429
431- /* Test most recent lookup first, for speed */
432- if (relnum < rel_arr -> nrels &&
433- strcmp (rel_arr -> rels [relnum ].nspname , nspname ) == 0 &&
434- strcmp (rel_arr -> rels [relnum ].relname , relname ) == 0 )
435- return & rel_arr -> rels [relnum ];
436-
437- if (relnum + 1 < rel_arr -> nrels &&
438- strcmp (rel_arr -> rels [relnum + 1 ].nspname , nspname ) == 0 &&
439- strcmp (rel_arr -> rels [relnum + 1 ].relname , relname ) == 0 )
440- return & rel_arr -> rels [relnum + 1 ];
441-
430+ /* Test next lookup first, for speed */
431+ if (rel_arr -> cache_name_rel + 1 < rel_arr -> nrels &&
432+ strcmp (rel_arr -> rels [rel_arr -> cache_name_rel + 1 ].nspname , nspname ) == 0 &&
433+ strcmp (rel_arr -> rels [rel_arr -> cache_name_rel + 1 ].relname , relname ) == 0 )
434+ {
435+ rel_arr -> cache_name_rel ++ ;
436+ return & rel_arr -> rels [rel_arr -> cache_name_rel ];
437+ }
438+
442439 for (relnum = 0 ; relnum < rel_arr -> nrels ; relnum ++ )
443440 {
444441 if (strcmp (rel_arr -> rels [relnum ].nspname , nspname ) == 0 &&
445442 strcmp (rel_arr -> rels [relnum ].relname , relname ) == 0 )
443+ {
444+ rel_arr -> cache_name_rel = relnum ;
446445 return & rel_arr -> rels [relnum ];
446+ }
447447 }
448448 pg_log (PG_FATAL , "Could not find %s.%s in %s cluster\n" ,
449449 nspname , relname , CLUSTERNAME (whichCluster ));
@@ -483,6 +483,7 @@ relarr_free(RelInfoArr *rel_arr)
483483{
484484 pg_free (rel_arr -> rels );
485485 rel_arr -> nrels = 0 ;
486+ rel_arr -> cache_name_rel = 0 ;
486487}
487488
488489
0 commit comments