@@ -259,35 +259,57 @@ pgFileDelete(pgFile *file)
259259}
260260
261261pg_crc32
262- pgFileGetCRC (const char * file_path )
262+ pgFileGetCRC (const char * file_path , bool use_crc32c )
263263{
264264 FILE * fp ;
265265 pg_crc32 crc = 0 ;
266266 char buf [1024 ];
267267 size_t len ;
268268 int errno_tmp ;
269269
270+ #define INIT_FILE_CRC32 (crc ) \
271+ do { \
272+ if (use_crc32c) \
273+ INIT_CRC32C(crc); \
274+ else \
275+ INIT_TRADITIONAL_CRC32(crc); \
276+ } while (0)
277+ #define COMP_FILE_CRC32 (crc , data , len ) \
278+ do { \
279+ if (use_crc32c) \
280+ COMP_CRC32C((crc), (data), (len)); \
281+ else \
282+ COMP_TRADITIONAL_CRC32(crc, data, len); \
283+ } while (0)
284+ #define FIN_FILE_CRC32 (crc ) \
285+ do { \
286+ if (use_crc32c) \
287+ FIN_CRC32C(crc); \
288+ else \
289+ FIN_TRADITIONAL_CRC32(crc); \
290+ } while (0)
291+
270292 /* open file in binary read mode */
271293 fp = fopen (file_path , PG_BINARY_R );
272294 if (fp == NULL )
273295 elog (ERROR , "cannot open file \"%s\": %s" ,
274296 file_path , strerror (errno ));
275297
276298 /* calc CRC of backup file */
277- INIT_TRADITIONAL_CRC32 (crc );
299+ INIT_FILE_CRC32 (crc );
278300 while ((len = fread (buf , 1 , sizeof (buf ), fp )) == sizeof (buf ))
279301 {
280302 if (interrupted )
281303 elog (ERROR , "interrupted during CRC calculation" );
282- COMP_TRADITIONAL_CRC32 (crc , buf , len );
304+ COMP_FILE_CRC32 (crc , buf , len );
283305 }
284306 errno_tmp = errno ;
285307 if (!feof (fp ))
286308 elog (WARNING , "cannot read \"%s\": %s" , file_path ,
287309 strerror (errno_tmp ));
288310 if (len > 0 )
289- COMP_TRADITIONAL_CRC32 (crc , buf , len );
290- FIN_TRADITIONAL_CRC32 (crc );
311+ COMP_FILE_CRC32 (crc , buf , len );
312+ FIN_FILE_CRC32 (crc );
291313
292314 fclose (fp );
293315
0 commit comments