Skip to content

Commit daa3365

Browse files
mbleclaude
andcommitted
Fix lint issues in metadata package
Extract readTimeFields helper to reduce cyclomatic complexity, convert if-else chain to switch statement, and add test constants for repeated string literals. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent e9cc6a4 commit daa3365

2 files changed

Lines changed: 58 additions & 40 deletions

File tree

metadata/metadata.go

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
162193
func 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 {

metadata/metadata_test.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import (
1010
"github.com/mble/pgdump-metadata-extractor/metadata"
1111
)
1212

13+
const (
14+
testDBName = "test_db"
15+
testVersion = "10.11"
16+
testVersionPG = "14.0"
17+
testVersionPG2 = "16.0"
18+
testVersionPG3 = "17.0"
19+
)
20+
1321
func strPtr(s string) *string {
1422
return &s
1523
}
@@ -163,8 +171,8 @@ func TestNewMetadata(t *testing.T) {
163171
TimeYear: 2021,
164172
TimeIsDST: 1,
165173
DatabaseName: strPtr("empty_db"),
166-
RemoteVersion: strPtr("10.11"),
167-
PGDumpVersion: strPtr("10.11"),
174+
RemoteVersion: strPtr(testVersion),
175+
PGDumpVersion: strPtr(testVersion),
168176
TOCCount: 15,
169177
}
170178

@@ -189,8 +197,8 @@ func TestNewMetadataIntSize8(t *testing.T) {
189197

190198
intSize := 8
191199
db := "empty_db"
192-
remote := "10.11"
193-
pgDump := "10.11"
200+
remote := testVersion
201+
pgDump := testVersion
194202

195203
var buf bytes.Buffer
196204
buf.WriteString("PGDMP")
@@ -235,8 +243,8 @@ func TestNewMetadataIntSize8(t *testing.T) {
235243
TimeYear: 2021,
236244
TimeIsDST: 1,
237245
DatabaseName: strPtr("empty_db"),
238-
RemoteVersion: strPtr("10.11"),
239-
PGDumpVersion: strPtr("10.11"),
246+
RemoteVersion: strPtr(testVersion),
247+
PGDumpVersion: strPtr(testVersion),
240248
TOCCount: 15,
241249
}
242250

@@ -359,7 +367,7 @@ func TestNewMetadataFormat115(t *testing.T) {
359367

360368
// Format 1.15 uses compression as a string
361369
intSize := 4
362-
db := "test_db"
370+
db := testDBName
363371
remote := "14.0"
364372
pgDump := "14.0"
365373
compressionSpec := "none"
@@ -406,7 +414,7 @@ func TestNewMetadataFormat115(t *testing.T) {
406414
TimeMonth: 6,
407415
TimeYear: 2021,
408416
TimeIsDST: 1,
409-
DatabaseName: strPtr("test_db"),
417+
DatabaseName: strPtr(testDBName),
410418
RemoteVersion: strPtr("14.0"),
411419
PGDumpVersion: strPtr("14.0"),
412420
TOCCount: 15,
@@ -422,7 +430,7 @@ func TestNewMetadataFormat116(t *testing.T) {
422430

423431
// Format 1.16 uses compression as a single byte
424432
intSize := 4
425-
db := "test_db"
433+
db := testDBName
426434
remote := "16.0"
427435
pgDump := "17.0"
428436

@@ -468,7 +476,7 @@ func TestNewMetadataFormat116(t *testing.T) {
468476
TimeMonth: 8,
469477
TimeYear: 2025,
470478
TimeIsDST: 1,
471-
DatabaseName: strPtr("test_db"),
479+
DatabaseName: strPtr(testDBName),
472480
RemoteVersion: strPtr("16.0"),
473481
PGDumpVersion: strPtr("17.0"),
474482
TOCCount: 10,
@@ -499,8 +507,8 @@ func TestToJSON(t *testing.T) {
499507
TimeYear: 2021,
500508
TimeIsDST: 1,
501509
DatabaseName: strPtr("empty_db"),
502-
RemoteVersion: strPtr("10.11"),
503-
PGDumpVersion: strPtr("10.11"),
510+
RemoteVersion: strPtr(testVersion),
511+
PGDumpVersion: strPtr(testVersion),
504512
TOCCount: 15,
505513
}
506514

0 commit comments

Comments
 (0)