|
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