@@ -2668,29 +2668,59 @@ get_last_ptrack_lsn(void)
26682668}
26692669
26702670char *
2671- pg_ptrack_get_block (Oid tblsOid ,
2671+ pg_ptrack_get_block (Oid dbOid ,
2672+ Oid tblsOid ,
26722673 Oid relOid ,
26732674 BlockNumber blknum ,
26742675 size_t * result_size )
26752676{
2677+ PGresult * res_db ;
26762678 PGresult * res ;
2679+ const char * dbname ;
26772680 char * params [3 ];
26782681 char * result ;
26792682 char * val ;
2683+ PGconn * tmp_conn ;
26802684
26812685 params [0 ] = palloc (64 );
26822686 params [1 ] = palloc (64 );
26832687 params [2 ] = palloc (64 );
26842688
2689+ sprintf (params [0 ], "%i" , dbOid );
2690+ res_db = pgut_execute (backup_conn ,
2691+ "SELECT datname FROM pg_database WHERE oid=$1" ,
2692+ 1 , (const char * * ) params , true);
2693+ /*
2694+ * If database is not found, it's not an error.
2695+ * It could have been deleted.
2696+ */
2697+ if (PQntuples (res_db ) != 1 || PQnfields (res_db ) != 1 )
2698+ {
2699+ //elog(LOG, "Database with oid %d is not found", dbOid);
2700+ return NULL ;
2701+ }
2702+
2703+ dbname = PQgetvalue (res_db , 0 , 0 );
2704+ if (strcmp (dbname , "template0" ) == 0 )
2705+ {
2706+ /*
2707+ * There is no way to connect to the template0 database.
2708+ * But it's totally OK, since files there can never be changed.
2709+ */
2710+ return NULL ;
2711+ }
2712+ tmp_conn = pgut_connect (dbname );
2713+
26852714 /*
26862715 * Use backup_conn, cause we can do it from any database.
26872716 */
26882717 sprintf (params [0 ], "%i" , tblsOid );
26892718 sprintf (params [1 ], "%i" , relOid );
26902719 sprintf (params [2 ], "%u" , blknum );
26912720
2692- // elog(WARNING, "pg_ptrack_get_block(%i, %i, %u)", tblsOid, relOid, blknum);
2693- res = pgut_execute (backup_conn , "SELECT pg_ptrack_get_block($1, $2, $3)" ,
2721+ //elog(WARNING, "db %i pg_ptrack_get_block(%i, %i, %u)",dbOid, tblsOid, relOid, blknum);
2722+
2723+ res = pgut_execute (tmp_conn , "SELECT pg_ptrack_get_block($1, $2, $3)" ,
26942724 3 , (const char * * )params , true);
26952725
26962726 if (PQnfields (res ) != 1 )
@@ -2704,7 +2734,10 @@ pg_ptrack_get_block(Oid tblsOid,
27042734
27052735 result = (char * ) PQunescapeBytea ((unsigned char * ) PQgetvalue (res , 0 , 0 ),
27062736 result_size );
2737+
2738+ pgut_disconnect (tmp_conn );
27072739 PQclear (res );
2740+ PQclear (res_db );
27082741 pfree (params [0 ]);
27092742 pfree (params [1 ]);
27102743 pfree (params [2 ]);
0 commit comments