Skip to content

Commit d0e165b

Browse files
committed
Remove experimental deserializer interface
Remove the experimental deserializer interface and all supporting code: - Delete deserializer.go interface definition - Delete deserializer_test.go test file - Remove deserializer support from reflection.go - Remove deserializer methods from data_decoder.go - Remove unused math/big import from data_decoder.go - Add breaking change notice to changelog recommending UnmarshalMaxMindDB
1 parent 75f5cf5 commit d0e165b

File tree

5 files changed

+4
-338
lines changed

5 files changed

+4
-338
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## 2.0.0-beta.4
44

5+
- **BREAKING CHANGE**: Removed experimental `deserializer` interface and
6+
supporting code. Applications using this interface should migrate to the
7+
`Unmarshaler` interface by implementing `UnmarshalMaxMindDB(d *Decoder) error`
8+
instead.
59
- `Open` and `FromBytes` now accept options.
610
- `IncludeNetworksWithoutData` and `IncludeAliasedNetworks` now return a
711
`NetworksOption` rather than being one themselves. This was done to improve

deserializer_test.go

Lines changed: 0 additions & 120 deletions
This file was deleted.

internal/decoder/data_decoder.go

Lines changed: 0 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/binary"
66
"fmt"
77
"math"
8-
"math/big"
98

109
"github.com/oschwald/maxminddb-golang/v2/internal/mmdberrors"
1110
)
@@ -430,36 +429,6 @@ func (d *DataDecoder) NextValueOffset(offset, numberToSkip uint) (uint, error) {
430429
return d.NextValueOffset(offset, numberToSkip-1)
431430
}
432431

433-
func (d *DataDecoder) decodeToDeserializer(
434-
offset uint,
435-
dser deserializer,
436-
depth int,
437-
getNext bool,
438-
) (uint, error) {
439-
if depth > maximumDataStructureDepth {
440-
return 0, mmdberrors.NewInvalidDatabaseError(
441-
"exceeded maximum data structure depth; database is likely corrupt",
442-
)
443-
}
444-
skip, err := dser.ShouldSkip(uintptr(offset))
445-
if err != nil {
446-
return 0, err
447-
}
448-
if skip {
449-
if getNext {
450-
return d.NextValueOffset(offset, 1)
451-
}
452-
return 0, nil
453-
}
454-
455-
kindNum, size, newOffset, err := d.DecodeCtrlData(offset)
456-
if err != nil {
457-
return 0, err
458-
}
459-
460-
return d.decodeFromTypeToDeserializer(kindNum, size, newOffset, dser, depth+1)
461-
}
462-
463432
func (d *DataDecoder) sizeFromCtrlByte(
464433
ctrlByte byte,
465434
offset uint,
@@ -495,157 +464,6 @@ func (d *DataDecoder) sizeFromCtrlByte(
495464
return size, newOffset, nil
496465
}
497466

498-
func (d *DataDecoder) decodeFromTypeToDeserializer(
499-
dtype Kind,
500-
size uint,
501-
offset uint,
502-
dser deserializer,
503-
depth int,
504-
) (uint, error) {
505-
// For these types, size has a special meaning
506-
switch dtype {
507-
case KindBool:
508-
v, offset := decodeBool(size, offset)
509-
return offset, dser.Bool(v)
510-
case KindMap:
511-
return d.decodeMapToDeserializer(size, offset, dser, depth)
512-
case KindPointer:
513-
pointer, newOffset, err := d.DecodePointer(size, offset)
514-
if err != nil {
515-
return 0, err
516-
}
517-
_, err = d.decodeToDeserializer(pointer, dser, depth, false)
518-
return newOffset, err
519-
case KindSlice:
520-
return d.decodeSliceToDeserializer(size, offset, dser, depth)
521-
case KindBytes:
522-
v, offset, err := d.DecodeBytes(size, offset)
523-
if err != nil {
524-
return 0, err
525-
}
526-
return offset, dser.Bytes(v)
527-
case KindFloat32:
528-
v, offset, err := d.DecodeFloat32(size, offset)
529-
if err != nil {
530-
return 0, err
531-
}
532-
return offset, dser.Float32(v)
533-
case KindFloat64:
534-
v, offset, err := d.DecodeFloat64(size, offset)
535-
if err != nil {
536-
return 0, err
537-
}
538-
539-
return offset, dser.Float64(v)
540-
case KindInt32:
541-
v, offset, err := d.DecodeInt32(size, offset)
542-
if err != nil {
543-
return 0, err
544-
}
545-
546-
return offset, dser.Int32(v)
547-
case KindString:
548-
v, offset, err := d.DecodeString(size, offset)
549-
if err != nil {
550-
return 0, err
551-
}
552-
553-
return offset, dser.String(v)
554-
case KindUint16:
555-
v, offset, err := d.DecodeUint16(size, offset)
556-
if err != nil {
557-
return 0, err
558-
}
559-
560-
return offset, dser.Uint16(v)
561-
case KindUint32:
562-
v, offset, err := d.DecodeUint32(size, offset)
563-
if err != nil {
564-
return 0, err
565-
}
566-
567-
return offset, dser.Uint32(v)
568-
case KindUint64:
569-
v, offset, err := d.DecodeUint64(size, offset)
570-
if err != nil {
571-
return 0, err
572-
}
573-
574-
return offset, dser.Uint64(v)
575-
case KindUint128:
576-
hi, lo, offset, err := d.DecodeUint128(size, offset)
577-
if err != nil {
578-
return 0, err
579-
}
580-
581-
// Convert hi/lo representation to big.Int for deserializer
582-
value := new(big.Int)
583-
if hi == 0 {
584-
value.SetUint64(lo)
585-
} else {
586-
value.SetUint64(hi)
587-
value.Lsh(value, 64) // Shift high part left by 64 bits
588-
value.Or(value, new(big.Int).SetUint64(lo)) // OR with low part
589-
}
590-
591-
return offset, dser.Uint128(value)
592-
default:
593-
return 0, mmdberrors.NewInvalidDatabaseError("unknown type: %d", dtype)
594-
}
595-
}
596-
597-
func (d *DataDecoder) decodeMapToDeserializer(
598-
size uint,
599-
offset uint,
600-
dser deserializer,
601-
depth int,
602-
) (uint, error) {
603-
err := dser.StartMap(size)
604-
if err != nil {
605-
return 0, err
606-
}
607-
for range size {
608-
// TODO - implement key/value skipping?
609-
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
610-
if err != nil {
611-
return 0, err
612-
}
613-
614-
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
615-
if err != nil {
616-
return 0, err
617-
}
618-
}
619-
err = dser.End()
620-
if err != nil {
621-
return 0, err
622-
}
623-
return offset, nil
624-
}
625-
626-
func (d *DataDecoder) decodeSliceToDeserializer(
627-
size uint,
628-
offset uint,
629-
dser deserializer,
630-
depth int,
631-
) (uint, error) {
632-
err := dser.StartSlice(size)
633-
if err != nil {
634-
return 0, err
635-
}
636-
for range size {
637-
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
638-
if err != nil {
639-
return 0, err
640-
}
641-
}
642-
err = dser.End()
643-
if err != nil {
644-
return 0, err
645-
}
646-
return offset, nil
647-
}
648-
649467
func decodeBool(size, offset uint) (bool, uint) {
650468
return size != 0, offset
651469
}

internal/decoder/deserializer.go

Lines changed: 0 additions & 31 deletions
This file was deleted.

internal/decoder/reflection.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ func (d *ReflectionDecoder) Decode(offset uint, v any) error {
4343
return unmarshaler.UnmarshalMaxMindDB(decoder)
4444
}
4545

46-
if dser, ok := v.(deserializer); ok {
47-
_, err := d.decodeToDeserializer(offset, dser, 0, false)
48-
return d.wrapError(err, offset)
49-
}
50-
5146
_, err := d.decode(offset, rv, 0)
5247
if err == nil {
5348
return nil

0 commit comments

Comments
 (0)