diff --git a/controldata.c b/controldata.c index 6c6f9358..9da29eef 100644 --- a/controldata.c +++ b/controldata.c @@ -227,7 +227,15 @@ get_controlfile(const char *DataDir) control_file_info->control_file_processed = true; - if (version_num >= 90500) + if (version_num >= 110000) + { + ControlFileData11 *ptr = (struct ControlFileData11 *)ControlFileDataPtr; + control_file_info->system_identifier = ptr->system_identifier; + control_file_info->state = ptr->state; + control_file_info->checkPoint = ptr->checkPoint; + control_file_info->data_checksum_version = ptr->data_checksum_version; + } + else if (version_num >= 90500) { ControlFileData95 *ptr = (struct ControlFileData95 *)ControlFileDataPtr; control_file_info->system_identifier = ptr->system_identifier; diff --git a/controldata.h b/controldata.h index d9feb06d..9d685132 100644 --- a/controldata.h +++ b/controldata.h @@ -265,6 +265,71 @@ typedef struct ControlFileData95 } ControlFileData95; +/* + * Following field removed in 11: + * + * XLogRecPtr prevCheckPoint; + * + * In 10, following field appended *after* "data_checksum_version": + * + * char mock_authentication_nonce[MOCK_AUTH_NONCE_LEN]; + * + * (but we don't care about that) + */ + +typedef struct ControlFileData11 +{ + uint64 system_identifier; + + uint32 pg_control_version; /* PG_CONTROL_VERSION */ + uint32 catalog_version_no; /* see catversion.h */ + + DBState state; /* see enum above */ + pg_time_t time; /* time stamp of last pg_control update */ + XLogRecPtr checkPoint; /* last check point record ptr */ + + CheckPoint95 checkPointCopy; /* copy of last check point record */ + + XLogRecPtr unloggedLSN; /* current fake LSN value, for unlogged rels */ + + XLogRecPtr minRecoveryPoint; + TimeLineID minRecoveryPointTLI; + XLogRecPtr backupStartPoint; + XLogRecPtr backupEndPoint; + bool backupEndRequired; + + int wal_level; + bool wal_log_hints; + int MaxConnections; + int max_worker_processes; + int max_prepared_xacts; + int max_locks_per_xact; + bool track_commit_timestamp; + + uint32 maxAlign; /* alignment requirement for tuples */ + double floatFormat; /* constant 1234567.0 */ + + uint32 blcksz; /* data block size for this DB */ + uint32 relseg_size; /* blocks per segment of large relation */ + + uint32 xlog_blcksz; /* block size within WAL files */ + uint32 xlog_seg_size; /* size of each WAL segment */ + + uint32 nameDataLen; /* catalog name field width */ + uint32 indexMaxKeys; /* max number of columns in an index */ + + uint32 toast_max_chunk_size; /* chunk size in TOAST tables */ + uint32 loblksize; /* chunk size in pg_largeobject */ + + bool enableIntTimes; /* int64 storage enabled? */ + + bool float4ByVal; /* float4 pass-by-value? */ + bool float8ByVal; /* float8, int8, etc pass-by-value? */ + + uint32 data_checksum_version; + +} ControlFileData11; + extern DBState get_db_state(const char *data_directory);