|
5 | 5 | "encoding/binary"
|
6 | 6 | "fmt"
|
7 | 7 | "math"
|
8 |
| - "math/big" |
9 | 8 |
|
10 | 9 | "github.com/oschwald/maxminddb-golang/v2/internal/mmdberrors"
|
11 | 10 | )
|
@@ -430,36 +429,6 @@ func (d *DataDecoder) NextValueOffset(offset, numberToSkip uint) (uint, error) {
|
430 | 429 | return d.NextValueOffset(offset, numberToSkip-1)
|
431 | 430 | }
|
432 | 431 |
|
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 |
| - |
463 | 432 | func (d *DataDecoder) sizeFromCtrlByte(
|
464 | 433 | ctrlByte byte,
|
465 | 434 | offset uint,
|
@@ -495,157 +464,6 @@ func (d *DataDecoder) sizeFromCtrlByte(
|
495 | 464 | return size, newOffset, nil
|
496 | 465 | }
|
497 | 466 |
|
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 |
| - |
649 | 467 | func decodeBool(size, offset uint) (bool, uint) {
|
650 | 468 | return size != 0, offset
|
651 | 469 | }
|
|
0 commit comments