@@ -157,10 +157,40 @@ func (m *Metadata) ToJSON() ([]byte, error) {
157157 return out , nil
158158}
159159
160+ // readTimeFields reads all timestamp-related fields from the archive header.
161+ func readTimeFields (m * Metadata , readInt func (string ) (int , error )) error {
162+ const yearStart = 1900
163+ var err error
164+
165+ if m .TimeSec , err = readInt ("timeSec" ); err != nil {
166+ return err
167+ }
168+ if m .TimeMin , err = readInt ("timeMin" ); err != nil {
169+ return err
170+ }
171+ if m .TimeHour , err = readInt ("timeHour" ); err != nil {
172+ return err
173+ }
174+ if m .TimeDay , err = readInt ("timeDay" ); err != nil {
175+ return err
176+ }
177+ if m .TimeMonth , err = readInt ("timeMonth" ); err != nil {
178+ return err
179+ }
180+ yearOffset , err := readInt ("timeYearOffset" )
181+ if err != nil {
182+ return err
183+ }
184+ m .TimeYear = yearStart + yearOffset
185+ if m .TimeIsDST , err = readInt ("timeIsDst" ); err != nil {
186+ return err
187+ }
188+ return nil
189+ }
190+
160191// NewMetadata reads from reader, parsing out the pg_dump archive header format
161192// into a Metadata struct.
162193func NewMetadata (reader io.Reader ) (Metadata , error ) {
163- const yearStart = 1900
164194 metadata := Metadata {}
165195
166196 r := bufio .NewReader (reader )
@@ -223,48 +253,28 @@ func NewMetadata(reader io.Reader) (Metadata, error) {
223253 // Version 1.16+ (PostgreSQL 16+) changed the format again - the compression algorithm
224254 // is stored as a single byte indicator.
225255 const versionWithCompressionSpec = (1 << 16 ) | (15 << 8 ) // 1.15
226- const versionWithNewCompression = (1 << 16 ) | (16 << 8 ) // 1.16
227- if metadata .ArchiveVersion () >= versionWithNewCompression {
256+ const versionWithNewCompression = (1 << 16 ) | (16 << 8 ) // 1.16
257+ archiveVersion := metadata .ArchiveVersion ()
258+ switch {
259+ case archiveVersion >= versionWithNewCompression :
228260 // Format 1.16+: Read single-byte compression algorithm indicator
229261 compressionAlgo , readErr := ReadExactInt (r , 1 )
230262 if readErr != nil {
231263 return metadata , readErr
232264 }
233265 metadata .Compression = int (compressionAlgo )
234- } else if metadata . ArchiveVersion () >= versionWithCompressionSpec {
266+ case archiveVersion >= versionWithCompressionSpec :
235267 // Format 1.15.x: Compression is a string specification
236268 if metadata .CompressionSpec , err = metadata .ReadString (r ); err != nil {
237269 return metadata , err
238270 }
239- } else {
271+ default :
240272 // Older formats use an integer for compression level
241273 if metadata .Compression , err = readIntField ("compression" ); err != nil {
242274 return metadata , err
243275 }
244276 }
245- if metadata .TimeSec , err = readIntField ("timeSec" ); err != nil {
246- return metadata , err
247- }
248- if metadata .TimeMin , err = readIntField ("timeMin" ); err != nil {
249- return metadata , err
250- }
251- if metadata .TimeHour , err = readIntField ("timeHour" ); err != nil {
252- return metadata , err
253- }
254- if metadata .TimeDay , err = readIntField ("timeDay" ); err != nil {
255- return metadata , err
256- }
257- if metadata .TimeMonth , err = readIntField ("timeMonth" ); err != nil {
258- return metadata , err
259- }
260-
261- yearOffset , err := readIntField ("timeYearOffset" )
262- if err != nil {
263- return metadata , err
264- }
265- metadata .TimeYear = yearStart + yearOffset
266-
267- if metadata .TimeIsDST , err = readIntField ("timeIsDst" ); err != nil {
277+ if err = readTimeFields (& metadata , readIntField ); err != nil { //nolint:gocritic // reusing err is clearer here
268278 return metadata , err
269279 }
270280 if metadata .DatabaseName , err = metadata .ReadString (r ); err != nil {
0 commit comments