@@ -66,7 +66,7 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
66
66
if (strcmp (newrel -> nspname , "pg_toast" ) == 0 )
67
67
continue ;
68
68
69
- oldrel = relarr_lookup_rel (& ( old_db -> rel_arr ) , newrel -> nspname ,
69
+ oldrel = relarr_lookup_rel (& old_db -> rel_arr , newrel -> nspname ,
70
70
newrel -> relname , CLUSTER_OLD );
71
71
72
72
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)
275
275
276
276
for (dbnum = 0 ; dbnum < db_arr -> ndbs ; dbnum ++ )
277
277
get_rel_infos (& db_arr -> dbs [dbnum ],
278
- & ( db_arr -> dbs [dbnum ].rel_arr ) , whichCluster );
278
+ & db_arr -> dbs [dbnum ].rel_arr , whichCluster );
279
279
280
280
if (log .debug )
281
281
dbarr_print (db_arr , whichCluster );
@@ -292,8 +292,7 @@ get_db_and_rel_infos(DbInfoArr *db_arr, Cluster whichCluster)
292
292
* FirstNormalObjectId belongs to the user
293
293
*/
294
294
static void
295
- get_rel_infos (const DbInfo * dbinfo ,
296
- RelInfoArr * relarr , Cluster whichCluster )
295
+ get_rel_infos (const DbInfo * dbinfo , RelInfoArr * relarr , Cluster whichCluster )
297
296
{
298
297
PGconn * conn = connectToServer (dbinfo -> db_name , whichCluster );
299
298
PGresult * res ;
@@ -386,6 +385,7 @@ get_rel_infos(const DbInfo *dbinfo,
386
385
387
386
relarr -> rels = relinfos ;
388
387
relarr -> nrels = num_rels ;
388
+ relarr -> cache_name_rel = 0 ;
389
389
}
390
390
391
391
@@ -419,31 +419,31 @@ dbarr_lookup_db(DbInfoArr *db_arr, const char *db_name)
419
419
* RelInfo structure.
420
420
*/
421
421
static 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 )
425
424
{
426
- static int relnum = 0 ;
425
+ int relnum ;
427
426
428
427
if (!rel_arr || !relname )
429
428
return NULL ;
430
429
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
+
442
439
for (relnum = 0 ; relnum < rel_arr -> nrels ; relnum ++ )
443
440
{
444
441
if (strcmp (rel_arr -> rels [relnum ].nspname , nspname ) == 0 &&
445
442
strcmp (rel_arr -> rels [relnum ].relname , relname ) == 0 )
443
+ {
444
+ rel_arr -> cache_name_rel = relnum ;
446
445
return & rel_arr -> rels [relnum ];
446
+ }
447
447
}
448
448
pg_log (PG_FATAL , "Could not find %s.%s in %s cluster\n" ,
449
449
nspname , relname , CLUSTERNAME (whichCluster ));
@@ -483,6 +483,7 @@ relarr_free(RelInfoArr *rel_arr)
483
483
{
484
484
pg_free (rel_arr -> rels );
485
485
rel_arr -> nrels = 0 ;
486
+ rel_arr -> cache_name_rel = 0 ;
486
487
}
487
488
488
489
0 commit comments