@@ -27,7 +27,8 @@ static boolin_backup = false;/* TODO: more robust logic */
2727 * Backup routines
2828 */
2929static void backup_cleanup (bool fatal ,void * userdata );
30- static void delete_old_files (const char * root ,parray * files ,int keep_files ,int keep_days ,bool is_arclog );
30+ static void delete_old_files (const char * root ,parray * files ,int keep_files ,
31+ int keep_days ,int server_version ,bool is_arclog );
3132static void backup_files (const char * from_root ,const char * to_root ,
3233parray * files ,parray * prev_files ,XLogRecPtr * lsn ,bool compress_data );
3334static parray * do_backup_database (parray * backup_list ,bool smooth_checkpoint );
@@ -432,11 +433,12 @@ do_backup(bool smooth_checkpoint,
432433int keep_data_generations ,
433434int keep_data_days )
434435{
435- int ret ;
436436parray * backup_list ;
437437parray * files_database ;
438438parray * files_arclog ;
439439parray * files_srvlog ;
440+ int server_version ;
441+ int ret ;
440442
441443/* PGDATA and BACKUP_MODE are always required */
442444if (pgdata == NULL )
@@ -462,7 +464,7 @@ do_backup(bool smooth_checkpoint,
462464#endif
463465
464466/* confirm data block size and xlog block size are compatible */
465- ( void ) get_server_version ();
467+ server_version = get_server_version ();
466468
467469/* setup cleanup callback function */
468470in_backup = true;
@@ -546,10 +548,10 @@ do_backup(bool smooth_checkpoint,
546548 */
547549if (HAVE_ARCLOG (& current ))
548550delete_old_files (arclog_path ,files_arclog ,keep_arclog_files ,
549- keep_arclog_days , true);
551+ keep_arclog_days ,server_version , true);
550552if (current .with_serverlog )
551553delete_old_files (srvlog_path ,files_srvlog ,keep_srvlog_files ,
552- keep_srvlog_days , false);
554+ keep_srvlog_days ,server_version , false);
553555
554556/* Delete old backup files after all backup operation. */
555557pgBackupDelete (keep_data_generations ,keep_data_days );
@@ -603,14 +605,17 @@ get_server_version(void)
603605
604606/* confirm server version */
605607server_version = PQserverVersion (connection );
606- if (server_version < 80000 )
608+ if (server_version < 80200 )
607609elog (ERROR_PG_INCOMPATIBLE ,
608- _ ("server version is %d, but must be 8.0 or higher." ),
609- server_version );
610+ _ ("server version is %d.%d.%d, but must be 8.2 or higher." ),
611+ server_version /10000 ,
612+ (server_version /100 ) %100 ,
613+ server_version %100 );
610614
611615/* confirm block_size (BLCKSZ) and wal_block_size (XLOG_BLCKSZ) */
612616confirm_block_size ("block_size" ,BLCKSZ );
613- confirm_block_size ("wal_block_size" ,XLOG_BLCKSZ );
617+ if (server_version >=80400 )
618+ confirm_block_size ("wal_block_size" ,XLOG_BLCKSZ );
614619
615620if (my_conn )
616621disconnect ();
@@ -625,9 +630,7 @@ confirm_block_size(const char *name, int blcksz)
625630char * endp ;
626631int block_size ;
627632
628- res = execute (
629- "SELECT setting from pg_settings where name = $1" ,
630- 1 ,& name );
633+ res = execute ("SELECT current_setting($1)" ,1 ,& name );
631634if (PQntuples (res )!= 1 || PQnfields (res )!= 1 )
632635elog (ERROR_PG_COMMAND ,_ ("can't get %s: %s" ),
633636name ,PQerrorMessage (connection ));
@@ -955,7 +958,12 @@ backup_files(const char *from_root, const char *to_root, parray *files,
955958 * of newer files exist.
956959 */
957960static void
958- delete_old_files (const char * root ,parray * files ,int keep_files ,int keep_days ,bool is_arclog )
961+ delete_old_files (const char * root ,
962+ parray * files ,
963+ int keep_files ,
964+ int keep_days ,
965+ int server_version ,
966+ bool is_arclog )
959967{
960968int i ;
961969int j ;
@@ -996,7 +1004,7 @@ delete_old_files(const char *root, parray *files, int keep_files, int keep_days,
9961004
9971005elog (LOG ,"%s() %s" ,__FUNCTION__ ,file -> path );
9981006/* Delete complete WAL only. */
999- if (is_arclog && !xlog_is_complete_wal (file ))
1007+ if (is_arclog && !xlog_is_complete_wal (file , server_version ))
10001008{
10011009elog (LOG ,"%s() not complete WAL" ,__FUNCTION__ );
10021010continue ;