From 6b17c2f576aa398c07b96e0cf83e23b89c06c716 Mon Sep 17 00:00:00 2001 From: Cadey Dodrill Date: Sun, 29 May 2016 11:43:51 -0700 Subject: [PATCH] dependencies --- vendor/manifest | 68 + .../Sereal/Sereal/Go/sereal/AUTHORS | 6 + .../Sereal/Sereal/Go/sereal/LICENSE | 23 + .../Sereal/Sereal/Go/sereal/Makefile | 41 + .../github.com/Sereal/Sereal/Go/sereal/TODO | 15 + .../Sereal/Sereal/Go/sereal/benchmark_test.go | 72 + .../Sereal/Sereal/Go/sereal/cmd/dsrl/dsrl.pl | 18 + .../Sereal/Sereal/Go/sereal/cmd/dsrl/main.go | 115 + .../Sereal/Go/sereal/cmd/fuzzer/main.go | 31 + .../Go/sereal/cmd/gen/test-decode-struct.pl | 35 + .../Sereal/Sereal/Go/sereal/const.go | 68 + .../Sereal/Sereal/Go/sereal/decode.go | 1266 ++++++ .../github.com/Sereal/Sereal/Go/sereal/doc.go | 12 + .../Sereal/Sereal/Go/sereal/encode.go | 624 +++ .../Sereal/Sereal/Go/sereal/errors.go | 41 + .../Sereal/Sereal/Go/sereal/fuzz.go | 39 + .../Sereal/Sereal/Go/sereal/merge.go | 692 +++ .../Sereal/Sereal/Go/sereal/merger_test.go | 39 + .../Sereal/Sereal/Go/sereal/perl.go | 49 + .../Sereal/Sereal/Go/sereal/sereal_test.go | 904 ++++ .../Sereal/Sereal/Go/sereal/snappy.go | 53 + .../Sereal/Sereal/Go/sereal/snappy_cgo.go | 9 + .../Sereal/Sereal/Go/sereal/snappy_purego.go | 9 + .../Sereal/Sereal/Go/sereal/tagscache.go | 57 + .../Sereal/Sereal/Go/sereal/test-compat.pl | 346 ++ .../Sereal/Sereal/Go/sereal/v2_test.go | 76 + .../Sereal/Sereal/Go/sereal/zlib.go | 69 + .../Sereal/Sereal/Go/sereal/zlib_cgo.go | 51 + .../Sereal/Sereal/Go/sereal/zlib_purego.go | 62 + .../github.com/Xe/Tetra/1459/README.markdown | 37 + vendor/src/github.com/Xe/Tetra/1459/line.go | 78 + .../src/github.com/Xe/Tetra/1459/line_test.go | 79 + vendor/src/github.com/asdine/storm/LICENSE | 21 + vendor/src/github.com/asdine/storm/README.md | 350 ++ vendor/src/github.com/asdine/storm/all.go | 180 + .../src/github.com/asdine/storm/all_test.go | 177 + vendor/src/github.com/asdine/storm/bucket.go | 47 + .../github.com/asdine/storm/bucket_test.go | 73 + vendor/src/github.com/asdine/storm/close.go | 6 + vendor/src/github.com/asdine/storm/codec.go | 6 + .../github.com/asdine/storm/codec/codec.go | 9 + .../asdine/storm/codec/example_test.go | 31 + .../github.com/asdine/storm/codec/gob/gob.go | 28 + .../asdine/storm/codec/gob/gob_test.go | 11 + .../storm/codec/internal/test_helpers.go | 44 + .../asdine/storm/codec/json/json.go | 18 + .../asdine/storm/codec/json/json_test.go | 11 + .../asdine/storm/codec/protobuf/protobuf.go | 31 + .../storm/codec/protobuf/protobuf_test.go | 19 + .../storm/codec/protobuf/simple_user.pb.go | 77 + .../storm/codec/protobuf/simple_user.proto | 7 + .../asdine/storm/codec/sereal/sereal.go | 20 + .../asdine/storm/codec/sereal/sereal_test.go | 21 + .../src/github.com/asdine/storm/codec_test.go | 21 + vendor/src/github.com/asdine/storm/count.go | 54 + .../src/github.com/asdine/storm/count_test.go | 53 + vendor/src/github.com/asdine/storm/delete.go | 33 + .../github.com/asdine/storm/delete_test.go | 27 + vendor/src/github.com/asdine/storm/drop.go | 28 + .../src/github.com/asdine/storm/drop_test.go | 45 + vendor/src/github.com/asdine/storm/errors.go | 45 + .../github.com/asdine/storm/examples_test.go | 391 ++ vendor/src/github.com/asdine/storm/extract.go | 166 + .../github.com/asdine/storm/extract_test.go | 57 + vendor/src/github.com/asdine/storm/find.go | 95 + .../src/github.com/asdine/storm/find_test.go | 77 + vendor/src/github.com/asdine/storm/get.go | 48 + .../src/github.com/asdine/storm/get_test.go | 53 + vendor/src/github.com/asdine/storm/helpers.go | 18 + .../github.com/asdine/storm/helpers_test.go | 41 + .../github.com/asdine/storm/index/errors.go | 14 + .../github.com/asdine/storm/index/indexes.go | 12 + .../src/github.com/asdine/storm/index/list.go | 183 + .../asdine/storm/index/list_test.go | 127 + .../github.com/asdine/storm/index/options.go | 15 + .../github.com/asdine/storm/index/unique.go | 145 + .../asdine/storm/index/unique_test.go | 152 + vendor/src/github.com/asdine/storm/init.go | 57 + .../src/github.com/asdine/storm/init_test.go | 45 + vendor/src/github.com/asdine/storm/node.go | 27 + .../src/github.com/asdine/storm/node_test.go | 48 + vendor/src/github.com/asdine/storm/one.go | 80 + .../src/github.com/asdine/storm/one_test.go | 108 + vendor/src/github.com/asdine/storm/options.go | 56 + vendor/src/github.com/asdine/storm/range.go | 100 + .../src/github.com/asdine/storm/range_test.go | 84 + vendor/src/github.com/asdine/storm/remove.go | 64 + .../github.com/asdine/storm/remove_test.go | 54 + vendor/src/github.com/asdine/storm/save.go | 113 + .../src/github.com/asdine/storm/save_test.go | 269 ++ vendor/src/github.com/asdine/storm/set.go | 46 + .../src/github.com/asdine/storm/set_test.go | 67 + vendor/src/github.com/asdine/storm/storm.go | 106 + .../src/github.com/asdine/storm/storm_test.go | 72 + .../github.com/asdine/storm/structs_test.go | 129 + .../github.com/asdine/storm/transaction.go | 52 + .../asdine/storm/transaction_test.go | 130 + vendor/src/github.com/boltdb/bolt/LICENSE | 20 + vendor/src/github.com/boltdb/bolt/Makefile | 18 + vendor/src/github.com/boltdb/bolt/README.md | 850 ++++ .../src/github.com/boltdb/bolt/appveyor.yml | 18 + vendor/src/github.com/boltdb/bolt/bolt_386.go | 7 + .../src/github.com/boltdb/bolt/bolt_amd64.go | 7 + vendor/src/github.com/boltdb/bolt/bolt_arm.go | 7 + .../src/github.com/boltdb/bolt/bolt_arm64.go | 9 + .../src/github.com/boltdb/bolt/bolt_linux.go | 10 + .../github.com/boltdb/bolt/bolt_openbsd.go | 27 + vendor/src/github.com/boltdb/bolt/bolt_ppc.go | 9 + .../src/github.com/boltdb/bolt/bolt_ppc64.go | 9 + .../github.com/boltdb/bolt/bolt_ppc64le.go | 9 + .../src/github.com/boltdb/bolt/bolt_s390x.go | 9 + .../src/github.com/boltdb/bolt/bolt_unix.go | 89 + .../boltdb/bolt/bolt_unix_solaris.go | 90 + .../github.com/boltdb/bolt/bolt_windows.go | 144 + .../github.com/boltdb/bolt/boltsync_unix.go | 8 + vendor/src/github.com/boltdb/bolt/bucket.go | 748 +++ .../src/github.com/boltdb/bolt/bucket_test.go | 1867 ++++++++ .../github.com/boltdb/bolt/cmd/bolt/main.go | 1532 +++++++ .../boltdb/bolt/cmd/bolt/main_test.go | 185 + vendor/src/github.com/boltdb/bolt/cursor.go | 400 ++ .../src/github.com/boltdb/bolt/cursor_test.go | 817 ++++ vendor/src/github.com/boltdb/bolt/db.go | 1036 +++++ vendor/src/github.com/boltdb/bolt/db_test.go | 1706 +++++++ vendor/src/github.com/boltdb/bolt/doc.go | 44 + vendor/src/github.com/boltdb/bolt/errors.go | 71 + vendor/src/github.com/boltdb/bolt/freelist.go | 242 + .../github.com/boltdb/bolt/freelist_test.go | 158 + vendor/src/github.com/boltdb/bolt/node.go | 599 +++ .../src/github.com/boltdb/bolt/node_test.go | 156 + vendor/src/github.com/boltdb/bolt/page.go | 172 + .../src/github.com/boltdb/bolt/page_test.go | 72 + .../src/github.com/boltdb/bolt/quick_test.go | 79 + .../github.com/boltdb/bolt/simulation_test.go | 329 ++ vendor/src/github.com/boltdb/bolt/tx.go | 682 +++ vendor/src/github.com/boltdb/bolt/tx_test.go | 716 +++ vendor/src/github.com/dchest/blake2b/README | 23 + .../src/github.com/dchest/blake2b/blake2b.go | 299 ++ .../github.com/dchest/blake2b/blake2b_test.go | 625 +++ vendor/src/github.com/dchest/blake2b/block.go | 1420 ++++++ vendor/src/github.com/fatih/structs/LICENSE | 21 + vendor/src/github.com/fatih/structs/README.md | 163 + vendor/src/github.com/fatih/structs/field.go | 132 + .../github.com/fatih/structs/field_test.go | 383 ++ .../src/github.com/fatih/structs/structs.go | 507 +++ .../fatih/structs/structs_example_test.go | 351 ++ .../github.com/fatih/structs/structs_test.go | 1109 +++++ vendor/src/github.com/fatih/structs/tags.go | 32 + .../src/github.com/fatih/structs/tags_test.go | 46 + .../github.com/golang/protobuf/proto/Makefile | 43 + .../golang/protobuf/proto/all_test.go | 2252 +++++++++ .../golang/protobuf/proto/any_test.go | 272 ++ .../github.com/golang/protobuf/proto/clone.go | 229 + .../golang/protobuf/proto/clone_test.go | 267 ++ .../golang/protobuf/proto/decode.go | 869 ++++ .../golang/protobuf/proto/encode.go | 1363 ++++++ .../github.com/golang/protobuf/proto/equal.go | 289 ++ .../golang/protobuf/proto/equal_test.go | 212 + .../golang/protobuf/proto/extensions.go | 555 +++ .../golang/protobuf/proto/extensions_test.go | 455 ++ .../github.com/golang/protobuf/proto/lib.go | 898 ++++ .../golang/protobuf/proto/message_set.go | 311 ++ .../golang/protobuf/proto/message_set_test.go | 66 + .../golang/protobuf/proto/pointer_reflect.go | 484 ++ .../golang/protobuf/proto/pointer_unsafe.go | 270 ++ .../golang/protobuf/proto/properties.go | 850 ++++ .../protobuf/proto/proto3_proto/proto3.pb.go | 198 + .../protobuf/proto/proto3_proto/proto3.proto | 73 + .../golang/protobuf/proto/proto3_test.go | 125 + .../golang/protobuf/proto/size2_test.go | 63 + .../golang/protobuf/proto/size_test.go | 164 + .../golang/protobuf/proto/testdata/Makefile | 50 + .../protobuf/proto/testdata/golden_test.go | 86 + .../golang/protobuf/proto/testdata/test.pb.go | 4029 +++++++++++++++++ .../golang/protobuf/proto/testdata/test.proto | 540 +++ .../github.com/golang/protobuf/proto/text.go | 854 ++++ .../golang/protobuf/proto/text_parser.go | 872 ++++ .../golang/protobuf/proto/text_parser_test.go | 567 +++ .../golang/protobuf/proto/text_test.go | 474 ++ vendor/src/github.com/golang/snappy/AUTHORS | 15 + .../src/github.com/golang/snappy/CONTRIBUTORS | 37 + vendor/src/github.com/golang/snappy/LICENSE | 27 + vendor/src/github.com/golang/snappy/README | 107 + .../golang/snappy/cmd/snappytool/main.cpp | 77 + vendor/src/github.com/golang/snappy/decode.go | 241 + .../github.com/golang/snappy/decode_amd64.go | 14 + .../github.com/golang/snappy/decode_amd64.s | 476 ++ .../github.com/golang/snappy/decode_other.go | 96 + vendor/src/github.com/golang/snappy/encode.go | 285 ++ .../github.com/golang/snappy/encode_amd64.go | 29 + .../github.com/golang/snappy/encode_amd64.s | 730 +++ .../github.com/golang/snappy/encode_other.go | 238 + .../github.com/golang/snappy/golden_test.go | 1965 ++++++++ vendor/src/github.com/golang/snappy/snappy.go | 84 + .../github.com/golang/snappy/snappy_test.go | 1320 ++++++ .../snappy/testdata/Mark.Twain-Tom.Sawyer.txt | 396 ++ .../Mark.Twain-Tom.Sawyer.txt.rawsnappy | Bin 0 -> 9871 bytes .../technoweenie/multipartstreamer/LICENSE | 7 + .../technoweenie/multipartstreamer/README.md | 47 + .../multipartstreamer/examples/multipart.go | 31 + .../multipartstreamer/examples/streamer.go | 27 + .../multipartstreamer/multipartstreamer.go | 101 + .../multipartstreamer_test.go | 124 + .../multipartstreamer/script/test | 2 + .../gopkg.in/telegram-bot-api.v4/LICENSE.txt | 21 + .../gopkg.in/telegram-bot-api.v4/README.md | 112 + .../src/gopkg.in/telegram-bot-api.v4/bot.go | 650 +++ .../gopkg.in/telegram-bot-api.v4/bot_test.go | 518 +++ .../gopkg.in/telegram-bot-api.v4/configs.go | 691 +++ .../gopkg.in/telegram-bot-api.v4/helpers.go | 562 +++ .../telegram-bot-api.v4/helpers_test.go | 142 + .../telegram-bot-api.v4/tests/audio.mp3 | Bin 0 -> 704512 bytes .../telegram-bot-api.v4/tests/cert.pem | 18 + .../telegram-bot-api.v4/tests/image.jpg | Bin 0 -> 86406 bytes .../telegram-bot-api.v4/tests/key.pem | 28 + .../telegram-bot-api.v4/tests/video.mp4 | Bin 0 -> 1053651 bytes .../telegram-bot-api.v4/tests/voice.ogg | Bin 0 -> 105243 bytes .../src/gopkg.in/telegram-bot-api.v4/types.go | 550 +++ .../telegram-bot-api.v4/types_test.go | 165 + 218 files changed, 55653 insertions(+) create mode 100644 vendor/manifest create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/AUTHORS create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/LICENSE create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/Makefile create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/TODO create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/benchmark_test.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/dsrl.pl create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/main.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/fuzzer/main.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/gen/test-decode-struct.pl create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/const.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/decode.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/doc.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/encode.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/errors.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/fuzz.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/merge.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/merger_test.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/perl.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/sereal_test.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_cgo.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_purego.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/tagscache.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/test-compat.pl create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/v2_test.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_cgo.go create mode 100644 vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_purego.go create mode 100644 vendor/src/github.com/Xe/Tetra/1459/README.markdown create mode 100644 vendor/src/github.com/Xe/Tetra/1459/line.go create mode 100644 vendor/src/github.com/Xe/Tetra/1459/line_test.go create mode 100644 vendor/src/github.com/asdine/storm/LICENSE create mode 100644 vendor/src/github.com/asdine/storm/README.md create mode 100644 vendor/src/github.com/asdine/storm/all.go create mode 100644 vendor/src/github.com/asdine/storm/all_test.go create mode 100644 vendor/src/github.com/asdine/storm/bucket.go create mode 100644 vendor/src/github.com/asdine/storm/bucket_test.go create mode 100644 vendor/src/github.com/asdine/storm/close.go create mode 100644 vendor/src/github.com/asdine/storm/codec.go create mode 100644 vendor/src/github.com/asdine/storm/codec/codec.go create mode 100644 vendor/src/github.com/asdine/storm/codec/example_test.go create mode 100644 vendor/src/github.com/asdine/storm/codec/gob/gob.go create mode 100644 vendor/src/github.com/asdine/storm/codec/gob/gob_test.go create mode 100644 vendor/src/github.com/asdine/storm/codec/internal/test_helpers.go create mode 100644 vendor/src/github.com/asdine/storm/codec/json/json.go create mode 100644 vendor/src/github.com/asdine/storm/codec/json/json_test.go create mode 100644 vendor/src/github.com/asdine/storm/codec/protobuf/protobuf.go create mode 100644 vendor/src/github.com/asdine/storm/codec/protobuf/protobuf_test.go create mode 100644 vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.pb.go create mode 100644 vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.proto create mode 100644 vendor/src/github.com/asdine/storm/codec/sereal/sereal.go create mode 100644 vendor/src/github.com/asdine/storm/codec/sereal/sereal_test.go create mode 100644 vendor/src/github.com/asdine/storm/codec_test.go create mode 100644 vendor/src/github.com/asdine/storm/count.go create mode 100644 vendor/src/github.com/asdine/storm/count_test.go create mode 100644 vendor/src/github.com/asdine/storm/delete.go create mode 100644 vendor/src/github.com/asdine/storm/delete_test.go create mode 100644 vendor/src/github.com/asdine/storm/drop.go create mode 100644 vendor/src/github.com/asdine/storm/drop_test.go create mode 100644 vendor/src/github.com/asdine/storm/errors.go create mode 100644 vendor/src/github.com/asdine/storm/examples_test.go create mode 100644 vendor/src/github.com/asdine/storm/extract.go create mode 100644 vendor/src/github.com/asdine/storm/extract_test.go create mode 100644 vendor/src/github.com/asdine/storm/find.go create mode 100644 vendor/src/github.com/asdine/storm/find_test.go create mode 100644 vendor/src/github.com/asdine/storm/get.go create mode 100644 vendor/src/github.com/asdine/storm/get_test.go create mode 100644 vendor/src/github.com/asdine/storm/helpers.go create mode 100644 vendor/src/github.com/asdine/storm/helpers_test.go create mode 100644 vendor/src/github.com/asdine/storm/index/errors.go create mode 100644 vendor/src/github.com/asdine/storm/index/indexes.go create mode 100644 vendor/src/github.com/asdine/storm/index/list.go create mode 100644 vendor/src/github.com/asdine/storm/index/list_test.go create mode 100644 vendor/src/github.com/asdine/storm/index/options.go create mode 100644 vendor/src/github.com/asdine/storm/index/unique.go create mode 100644 vendor/src/github.com/asdine/storm/index/unique_test.go create mode 100644 vendor/src/github.com/asdine/storm/init.go create mode 100644 vendor/src/github.com/asdine/storm/init_test.go create mode 100644 vendor/src/github.com/asdine/storm/node.go create mode 100644 vendor/src/github.com/asdine/storm/node_test.go create mode 100644 vendor/src/github.com/asdine/storm/one.go create mode 100644 vendor/src/github.com/asdine/storm/one_test.go create mode 100644 vendor/src/github.com/asdine/storm/options.go create mode 100644 vendor/src/github.com/asdine/storm/range.go create mode 100644 vendor/src/github.com/asdine/storm/range_test.go create mode 100644 vendor/src/github.com/asdine/storm/remove.go create mode 100644 vendor/src/github.com/asdine/storm/remove_test.go create mode 100644 vendor/src/github.com/asdine/storm/save.go create mode 100644 vendor/src/github.com/asdine/storm/save_test.go create mode 100644 vendor/src/github.com/asdine/storm/set.go create mode 100644 vendor/src/github.com/asdine/storm/set_test.go create mode 100644 vendor/src/github.com/asdine/storm/storm.go create mode 100644 vendor/src/github.com/asdine/storm/storm_test.go create mode 100644 vendor/src/github.com/asdine/storm/structs_test.go create mode 100644 vendor/src/github.com/asdine/storm/transaction.go create mode 100644 vendor/src/github.com/asdine/storm/transaction_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/LICENSE create mode 100644 vendor/src/github.com/boltdb/bolt/Makefile create mode 100644 vendor/src/github.com/boltdb/bolt/README.md create mode 100644 vendor/src/github.com/boltdb/bolt/appveyor.yml create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_386.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_amd64.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_arm.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_arm64.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_linux.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_openbsd.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_ppc.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_ppc64.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_ppc64le.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_s390x.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_unix.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_unix_solaris.go create mode 100644 vendor/src/github.com/boltdb/bolt/bolt_windows.go create mode 100644 vendor/src/github.com/boltdb/bolt/boltsync_unix.go create mode 100644 vendor/src/github.com/boltdb/bolt/bucket.go create mode 100644 vendor/src/github.com/boltdb/bolt/bucket_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/cmd/bolt/main.go create mode 100644 vendor/src/github.com/boltdb/bolt/cmd/bolt/main_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/cursor.go create mode 100644 vendor/src/github.com/boltdb/bolt/cursor_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/db.go create mode 100644 vendor/src/github.com/boltdb/bolt/db_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/doc.go create mode 100644 vendor/src/github.com/boltdb/bolt/errors.go create mode 100644 vendor/src/github.com/boltdb/bolt/freelist.go create mode 100644 vendor/src/github.com/boltdb/bolt/freelist_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/node.go create mode 100644 vendor/src/github.com/boltdb/bolt/node_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/page.go create mode 100644 vendor/src/github.com/boltdb/bolt/page_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/quick_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/simulation_test.go create mode 100644 vendor/src/github.com/boltdb/bolt/tx.go create mode 100644 vendor/src/github.com/boltdb/bolt/tx_test.go create mode 100644 vendor/src/github.com/dchest/blake2b/README create mode 100644 vendor/src/github.com/dchest/blake2b/blake2b.go create mode 100644 vendor/src/github.com/dchest/blake2b/blake2b_test.go create mode 100644 vendor/src/github.com/dchest/blake2b/block.go create mode 100644 vendor/src/github.com/fatih/structs/LICENSE create mode 100644 vendor/src/github.com/fatih/structs/README.md create mode 100644 vendor/src/github.com/fatih/structs/field.go create mode 100644 vendor/src/github.com/fatih/structs/field_test.go create mode 100644 vendor/src/github.com/fatih/structs/structs.go create mode 100644 vendor/src/github.com/fatih/structs/structs_example_test.go create mode 100644 vendor/src/github.com/fatih/structs/structs_test.go create mode 100644 vendor/src/github.com/fatih/structs/tags.go create mode 100644 vendor/src/github.com/fatih/structs/tags_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/Makefile create mode 100644 vendor/src/github.com/golang/protobuf/proto/all_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/any_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/clone.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/clone_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/decode.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/encode.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/equal.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/equal_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/extensions.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/extensions_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/lib.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/message_set.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/message_set_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/pointer_reflect.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/pointer_unsafe.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/properties.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto create mode 100644 vendor/src/github.com/golang/protobuf/proto/proto3_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/size2_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/size_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/testdata/Makefile create mode 100644 vendor/src/github.com/golang/protobuf/proto/testdata/golden_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/testdata/test.pb.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/testdata/test.proto create mode 100644 vendor/src/github.com/golang/protobuf/proto/text.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/text_parser.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/text_parser_test.go create mode 100644 vendor/src/github.com/golang/protobuf/proto/text_test.go create mode 100644 vendor/src/github.com/golang/snappy/AUTHORS create mode 100644 vendor/src/github.com/golang/snappy/CONTRIBUTORS create mode 100644 vendor/src/github.com/golang/snappy/LICENSE create mode 100644 vendor/src/github.com/golang/snappy/README create mode 100644 vendor/src/github.com/golang/snappy/cmd/snappytool/main.cpp create mode 100644 vendor/src/github.com/golang/snappy/decode.go create mode 100644 vendor/src/github.com/golang/snappy/decode_amd64.go create mode 100644 vendor/src/github.com/golang/snappy/decode_amd64.s create mode 100644 vendor/src/github.com/golang/snappy/decode_other.go create mode 100644 vendor/src/github.com/golang/snappy/encode.go create mode 100644 vendor/src/github.com/golang/snappy/encode_amd64.go create mode 100644 vendor/src/github.com/golang/snappy/encode_amd64.s create mode 100644 vendor/src/github.com/golang/snappy/encode_other.go create mode 100644 vendor/src/github.com/golang/snappy/golden_test.go create mode 100644 vendor/src/github.com/golang/snappy/snappy.go create mode 100644 vendor/src/github.com/golang/snappy/snappy_test.go create mode 100644 vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt create mode 100644 vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt.rawsnappy create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/LICENSE create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/README.md create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/examples/multipart.go create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/examples/streamer.go create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/multipartstreamer.go create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/multipartstreamer_test.go create mode 100644 vendor/src/github.com/technoweenie/multipartstreamer/script/test create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/LICENSE.txt create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/README.md create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/bot.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/bot_test.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/configs.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/helpers.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/helpers_test.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/audio.mp3 create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/cert.pem create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/image.jpg create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/key.pem create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/video.mp4 create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/tests/voice.ogg create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/types.go create mode 100644 vendor/src/gopkg.in/telegram-bot-api.v4/types_test.go diff --git a/vendor/manifest b/vendor/manifest new file mode 100644 index 0000000..eeefffb --- /dev/null +++ b/vendor/manifest @@ -0,0 +1,68 @@ +{ + "version": 0, + "dependencies": [ + { + "importpath": "github.com/Sereal/Sereal/Go/sereal", + "repository": "https://github.com/Sereal/Sereal", + "revision": "cf4a7a728a6056d9cbb112e24093ac09fb2de069", + "branch": "master", + "path": "/Go/sereal" + }, + { + "importpath": "github.com/Xe/Tetra/1459", + "repository": "https://github.com/Xe/Tetra", + "revision": "dd27f12d43838c0232b720941390f709991e0121", + "branch": "master", + "path": "/1459" + }, + { + "importpath": "github.com/asdine/storm", + "repository": "https://github.com/asdine/storm", + "revision": "d63bd29719e3c74c43790d8dd5a5a2bf78310332", + "branch": "master" + }, + { + "importpath": "github.com/boltdb/bolt", + "repository": "https://github.com/boltdb/bolt", + "revision": "dfb21201d9270c1082d5fb0f07f500311ff72f18", + "branch": "master" + }, + { + "importpath": "github.com/dchest/blake2b", + "repository": "https://github.com/dchest/blake2b", + "revision": "3c8c640cd7bea3ca78209d812b5854442ab92fed", + "branch": "master" + }, + { + "importpath": "github.com/fatih/structs", + "repository": "https://github.com/fatih/structs", + "revision": "3fe2facc32a7fbde4b29c0f85604dc1dd22836d2", + "branch": "master" + }, + { + "importpath": "github.com/golang/protobuf/proto", + "repository": "https://github.com/golang/protobuf", + "revision": "9e6977f30c91c78396e719e164e57f9287fff42c", + "branch": "master", + "path": "/proto" + }, + { + "importpath": "github.com/golang/snappy", + "repository": "https://github.com/golang/snappy", + "revision": "d6668316e43571d7dde95be6fd077f96de002f8b", + "branch": "master" + }, + { + "importpath": "github.com/technoweenie/multipartstreamer", + "repository": "https://github.com/technoweenie/multipartstreamer", + "revision": "a90a01d73ae432e2611d178c18367fbaa13e0154", + "branch": "master" + }, + { + "importpath": "gopkg.in/telegram-bot-api.v4", + "repository": "https://gopkg.in/telegram-bot-api.v4", + "revision": "217764ba453f319b00d05506e56d26ef0a9fc231", + "branch": "master" + } + ] +} \ No newline at end of file diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/AUTHORS b/vendor/src/github.com/Sereal/Sereal/Go/sereal/AUTHORS new file mode 100644 index 0000000..4e84863 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/AUTHORS @@ -0,0 +1,6 @@ +# This is the official list of Go Sereal authors for copyright purposes. +Damian Gryski +Gareth Kirwan +Ivan Kruglov +Maxim Vuets +Yuval Kogman diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/LICENSE b/vendor/src/github.com/Sereal/Sereal/Go/sereal/LICENSE new file mode 100644 index 0000000..2ffa4cf --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2013-2016 The Go Sereal Authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/Makefile b/vendor/src/github.com/Sereal/Sereal/Go/sereal/Makefile new file mode 100644 index 0000000..a81c4a1 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/Makefile @@ -0,0 +1,41 @@ +CORPUS_PROTO_VER ?= 3 +CORPUS_COMPRESS ?= SRL_UNCOMPRESSED + +test_all: test compat + +test: test_dir + -go test + +compat: test_dir + -rm -f test_dir/test_data_*-go.out + -rm -f test_freeze/*-go.out + go test -test.run=TestCorpus + go test -test.run=TestPrepareFreezeRoundtrip + prove ./test-compat.pl + env RUN_FREEZE=1 go test -test.run=TestFreezeRoundtrip + +../../Perl/Decoder/blib: + cd ../../Perl/Decoder/ ; perl Makefile.PL + make -C ../../Perl/Decoder + +../../Perl/Encoder/blib: + cd ../../Perl/Encoder/ ; perl Makefile.PL + make -C ../../Perl/Encoder + +test_dir: ../../Perl/Decoder/blib ../../Perl/Encoder/blib test_dir/VERSION_$(CORPUS_PROTO_VER) test_dir/COMPRESS_$(CORPUS_COMPRESS) test_files + cd ../../Perl/Encoder; perl -Mblib=blib -I t/lib/ -I ../shared/t/lib -MSereal::TestSet -MSereal::Encoder -e '$$Sereal::TestSet::PROTO_VERSION=$(CORPUS_PROTO_VER); $$Sereal::TestSet::COMPRESS=Sereal::Encoder::$(CORPUS_COMPRESS); Sereal::TestSet::write_test_files("../../Go/sereal/test_dir/")' + touch "test_dir/VERSION_$(CORPUS_PROTO_VER)" + touch "test_dir/COMPRESS_$(CORPUS_COMPRESS)" + +test_files: + mkdir -p test_dir + mkdir -p test_freeze + perl -Mblib=../../Perl/Encoder/blib -MSereal::Encoder cmd/gen/test-decode-struct.pl test_dir + +test_dir/VERSION_$(CORPUS_PROTO_VER): + rm -f test_dir/VERSION_* + +test_dir/COMPRESS_$(CORPUS_COMPRESS): + rm -f test_dir/COMPRESS_* + +.PHONY: test_all test compat diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/TODO b/vendor/src/github.com/Sereal/Sereal/Go/sereal/TODO new file mode 100644 index 0000000..811c0f3 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/TODO @@ -0,0 +1,15 @@ + TODO: + - lots of duplicatish code to remove: + decode cases are similar too: array/ref, map/ref/ array/binary/short-binary + - discard values that don't need to be built + - profiling shows that we can spend a lot of time setting values in maps that we might throw away + - if we don't need to keep the value, we should try to not actually create it in memory + - how do we handle hashes? + : only string keys are supported -- do we call value.String() or panic()? + : what other coersions (ints <-> strings) + - roundtrip test: perl obj -> perl-sereal stream -> go1 obj -> go-sereal stream -> go2 obj, DeepEqual(go1, go2) + - class names need their own string table (for OBJECTV) + - string table should have hash keys only? (unless dedup strings is true?) + - string vs. byte array handling? + - match 'ptr->array':ARRAYREF and 'ptr->hash':HASHREF + - go can't do this in one-pass: we don't have ref counts diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/benchmark_test.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/benchmark_test.go new file mode 100644 index 0000000..3d3a4a6 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/benchmark_test.go @@ -0,0 +1,72 @@ +package sereal_test + +import ( + "testing" + + "github.com/Sereal/Sereal/Go/sereal" +) + +var solarSystemMeta = map[string]interface{}{ + "title": "Interesting facts about Solar system", +} + +var solarSystem = map[string]interface{}{ + "galaxy": "Milky Way", + "age": 4568, + "stars": []string{"Sun"}, + "planets": []struct { + pos int + name string + mass_earths float64 + notable_satellites []string + }{ + {1, "Mercury", 0.055, []string{}}, + {2, "Venus", 0.815, []string{}}, + {3, "Earth", 1.0, []string{"Moon"}}, + {4, "Mars", 0.107, []string{"Phobos", "Deimos"}}, + {5, "Jupiter", 317.83, []string{"Io", "Europa", "Ganymede", "Callisto"}}, + {6, "Saturn", 95.16, []string{"Titan", "Rhea", "Enceladus"}}, + {7, "Uranus", 14.536, []string{"Oberon", "Titania", "Miranda", "Ariel", "Umbriel"}}, + {8, "Neptune", 17.15, []string{"Tritan"}}, + }, +} + +func BenchmarkEncodeComplexDataWithHeader(b *testing.B) { + enc := sereal.NewEncoderV3() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := enc.MarshalWithHeader(solarSystemMeta, solarSystem) + if err != nil { + b.FailNow() + } + } +} + +func BenchmarkEncodeAndSnappyComplexDataWithHeader(b *testing.B) { + enc := sereal.NewEncoderV3() + enc.Compression = sereal.SnappyCompressor{Incremental: true} + enc.CompressionThreshold = 0 + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := enc.MarshalWithHeader(solarSystemMeta, solarSystem) + if err != nil { + b.FailNow() + } + } +} + +func BenchmarkEncodeAndZlibComplexDataWithHeader(b *testing.B) { + enc := sereal.NewEncoderV3() + enc.Compression = sereal.ZlibCompressor{Level: sereal.ZlibDefaultCompression} + enc.CompressionThreshold = 0 + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := enc.MarshalWithHeader(solarSystemMeta, solarSystem) + if err != nil { + b.FailNow() + } + } +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/dsrl.pl b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/dsrl.pl new file mode 100644 index 0000000..0e16c48 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/dsrl.pl @@ -0,0 +1,18 @@ +#!/usr/bin/perl + +use blib "../../Perl/Decoder/blib/"; +use blib "../../Perl/Encoder/blib/"; +use lib "../../Perl/shared/t/lib/"; + +use Sereal::Decoder qw(decode_sereal); +use Data::Dumper; + +$Data::Dumper::Indent = 1; +$Data::Dumper::Sortkeys = 1; + +$/ = undef; + +while(<>) { + my $o = decode_sereal($_); + print Dumper($o), "\n"; +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/main.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/main.go new file mode 100644 index 0000000..9190181 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/dsrl/main.go @@ -0,0 +1,115 @@ +package main + +import ( + "encoding/binary" + "encoding/hex" + "flag" + "io/ioutil" + "log" + "os" + "runtime" + + "github.com/Sereal/Sereal/Go/sereal" + "github.com/davecgh/go-spew/spew" + "github.com/dchest/siphash" + "github.com/dgryski/go-ddmin" +) + +func sipuintptr(s []uintptr) uint64 { + + b := make([]byte, len(s)*8) + + for i, v := range s { + binary.LittleEndian.PutUint64(b[i*8:], uint64(v)) + } + + return siphash.Hash(0, 0, b) +} + +func unmarshal(b []byte) (intf map[string]interface{}, crash uint64, err error) { + + defer func() { + if p := recover(); p != nil { + var stack [5]uintptr + runtime.Callers(4, stack[:]) + crash = sipuintptr(stack[:]) + err = p.(error) + } + }() + + d := sereal.Decoder{} + + err = d.Unmarshal(b, &intf) + if err != nil { + return nil, 0, err + } + + return intf, 0, nil +} + +func process(fname string, b []byte) { + + intf, _, err := unmarshal(b) + + if err != nil { + switch e := err.(type) { + case sereal.ErrCorrupt: + log.Fatalf("error processing %s: %s (%s)", fname, e, e.Err) + default: + log.Fatalf("error processing %s: %s", fname, e) + } + } + + spew.Dump(intf) +} + +func minimize(b []byte, crashWant uint64, errWant error) []byte { + return ddmin.Minimize(b, func(b []byte) ddmin.Result { + _, crash, got := unmarshal(b) + + if got == nil { + return ddmin.Pass + } + + if crashWant == crash && got.Error() == errWant.Error() { + return ddmin.Fail + } + + return ddmin.Unresolved + }) +} + +func main() { + + optMinimize := flag.Bool("minimize", false, "minimize test input") + + flag.Parse() + + if *optMinimize { + b, _ := ioutil.ReadAll(os.Stdin) + log.Println("data to minimize length", len(b)) + _, crashWant, errWant := unmarshal(b) + if errWant == nil { + log.Fatal("no error received while unmarshalling") + } + log.Printf("crash=%x errWant=%+v\n", crashWant, errWant) + m := minimize(b, crashWant, errWant) + _, crashGot, errGot := unmarshal(m) + log.Printf("crash=%x errGot=%+v\n", crashGot, errGot) + log.Println("minimized length", len(m)) + log.Println("\n" + hex.Dump(m)) + os.Stdout.Write(m) + return + } + + if flag.NArg() == 0 { + b, _ := ioutil.ReadAll(os.Stdin) + process("stdin", b) + return + } + + for _, arg := range flag.Args() { + b, _ := ioutil.ReadFile(arg) + process(arg, b) + } +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/fuzzer/main.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/fuzzer/main.go new file mode 100644 index 0000000..7d461af --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/fuzzer/main.go @@ -0,0 +1,31 @@ +package main + +import ( + crand "crypto/rand" + "encoding/hex" + "fmt" + "github.com/Sereal/Sereal/Go/sereal" + mrand "math/rand" +) + +func main() { + + srlHeader, _ := hex.DecodeString("3d73726c0100") + + var decoder sereal.Decoder + decoder.PerlCompat = true + + for { + l := len(srlHeader) + mrand.Intn(200) + b := make([]byte, l) + crand.Read(b) + doc := make([]byte, l + len(srlHeader)) + copy(doc, srlHeader) + copy(doc[6:], b) + fmt.Println(hex.Dump(doc)) + var m interface{} + err := decoder.Unmarshal(doc, &m) + fmt.Println("err=", err) + } + +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/gen/test-decode-struct.pl b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/gen/test-decode-struct.pl new file mode 100644 index 0000000..ec21cf6 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/cmd/gen/test-decode-struct.pl @@ -0,0 +1,35 @@ +#!/usr/bin/perl + +#use blib "../../Perl/Decoder/blib/"; +#use blib "../../Perl/Encoder/blib/"; +#use lib "../../Perl/shared/t/lib/"; + +use Sereal::Encoder qw(encode_sereal); + +my $obj1 = { + ValueStr => "string as string value which actually should be 32+ characters", + ValueByte => "string as binary value", + ValueInt => 10, + ValueSlice => [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0 ], + ValueHash => { + key1 => "unique value", + key2 => "duplicate value", + key3 => "deplicate value", + } +}; + +my $obj2 = { + ValueStr => "another string as string value which actually should be 32+ characters", + ValueByte => "another string as binary value", + ValueInt => -10, + ValueSlice => [ 18.0, 19.0, 20.0 ], + ValueHash => { + key1 => "unique value", + key2 => "duplicate value", + key3 => "deplicate value", + } +}; + +open(my $fh, '>', $ARGV[0] . "/test-decode-struct.srl") or die $!; +print $fh encode_sereal([ $obj1, $obj2, $obj1 ], { dedupe_strings => 1 }); +exit; diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/const.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/const.go new file mode 100644 index 0000000..0c4361d --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/const.go @@ -0,0 +1,68 @@ +package sereal + +// ProtocolVersion is a maximum version supported by the sereal package. +const ProtocolVersion = 3 + +// magicHeadrBytes is a magic string for header. Every packet in protocol +// version 1 and 2 starts with this. +const magicHeaderBytes = uint32(0x6c72733d) // "=srl" + +// magicHeaderBytesHighBit is a new magic string for header used in protocol +// version 3 and up, with high bit set for UTF8 sanity check. It is an error to +// use a new magic header on a v1 or v2 packet, and it is an error to use the +// old magic header in v3 or later. +const magicHeaderBytesHighBit = uint32(0x6c72f33d) // "=\xF3rl" + +// magicHeaderBytesHighBitUTF8 is a magic string for header v3, corrupted by +// accidental UTF8 encoding. It makes it easy to detect when a Sereal document +// has been accidentally UTF-8 encoded because the \xF3 is translated to +// \xC3\xB3. +const magicHeaderBytesHighBitUTF8 = uint32(0x72b3c33d) // "=\xC3\xB3r" + +const headerSize = 5 // 4 magic + 1 version-type + +type documentType int + +const ( + serealRaw documentType = iota + serealSnappy + serealSnappyIncremental + serealZlib +) + +type typeTag byte + +const trackFlag = byte(0x80) + +const ( + typeVARINT = 0x20 + typeZIGZAG = 0x21 + typeFLOAT = 0x22 + typeDOUBLE = 0x23 + typeLONG_DOUBLE = 0x24 + typeUNDEF = 0x25 + typeBINARY = 0x26 + typeSTR_UTF8 = 0x27 + typeREFN = 0x28 + typeREFP = 0x29 + typeHASH = 0x2a + typeARRAY = 0x2b + typeOBJECT = 0x2c + typeOBJECTV = 0x2d + typeALIAS = 0x2e + typeCOPY = 0x2f + typeWEAKEN = 0x30 + typeREGEXP = 0x31 + typeOBJECT_FREEZE = 0x32 + typeOBJECTV_FREEZE = 0x33 + typeCANONICAL_UNDEF = 0x39 + typeFALSE = 0x3a + typeTRUE = 0x3b + typeMANY = 0x3c + typePACKET_START = 0x3d + typeEXTEND = 0x3e + typePAD = 0x3f + typeARRAYREF_0 = 0x40 + typeHASHREF_0 = 0x50 + typeSHORT_BINARY_0 = 0x60 +) diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/decode.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/decode.go new file mode 100644 index 0000000..8771b2b --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/decode.go @@ -0,0 +1,1266 @@ +package sereal + +import ( + "encoding" + "encoding/binary" + "errors" + "fmt" + "math" + "reflect" + "runtime" + "strings" +) + +type serealHeader struct { + doctype documentType + version byte + suffixStart int + suffixSize int + suffixFlags uint8 +} + +func readHeader(b []byte) (serealHeader, error) { + + if len(b) <= headerSize { + return serealHeader{}, ErrBadHeader + } + + first4Bytes := binary.LittleEndian.Uint32(b[:4]) + + var h serealHeader + + h.doctype = documentType(b[4] >> 4) + h.version = b[4] & 0x0f + + validHeader := false + + switch first4Bytes { + case magicHeaderBytes: + if 1 <= h.version && h.version <= 2 { + validHeader = true + } + case magicHeaderBytesHighBit: + if h.version >= 3 { + validHeader = true + } + case magicHeaderBytesHighBitUTF8: + return serealHeader{}, ErrBadHeaderUTF8 + } + + if !validHeader { + return serealHeader{}, ErrBadHeader + } + + ln, sz, err := varintdecode(b[5:]) + if err != nil { + return serealHeader{}, err + } + + h.suffixSize = ln + sz + h.suffixStart = headerSize + sz + + return h, nil +} + +// A Decoder reads and decodes Sereal objects from an input buffer +type Decoder struct { + tracked map[int]reflect.Value + umcache map[string]reflect.Type + tcache tagsCache + copyDepth int + + PerlCompat bool +} + +type decompressor interface { + decompress(b []byte) ([]byte, error) +} + +// NewDecoder returns a decoder with default flags +func NewDecoder() *Decoder { + return &Decoder{} +} + +// Unmarshal decodes b into body with the default decoder +func Unmarshal(b []byte, body interface{}) error { + decoder := &Decoder{} + return decoder.UnmarshalHeaderBody(b, nil, body) +} + +// UnmarshalHeader parses the Sereal-v2-encoded buffer b and stores the header data into the variable pointed to by vheader +func (d *Decoder) UnmarshalHeader(b []byte, vheader interface{}) (err error) { + return d.UnmarshalHeaderBody(b, vheader, nil) +} + +// Unmarshal parses the Sereal-encoded buffer b and stores the result in the value pointed to by vbody +func (d *Decoder) Unmarshal(b []byte, vbody interface{}) (err error) { + return d.UnmarshalHeaderBody(b, nil, vbody) +} + +// UnmarshalHeaderBody parses the Sereal-encoded buffer b extracts the header and body data into vheader and vbody, respectively +func (d *Decoder) UnmarshalHeaderBody(b []byte, vheader interface{}, vbody interface{}) (err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + + if s, ok := r.(string); ok { + err = errors.New(s) + } else { + err = r.(error) + } + } + }() + + header, err := readHeader(b) + + if err != nil { + return err + } + + bodyStart := headerSize + header.suffixSize + + if bodyStart > len(b) || bodyStart < 0 { + return ErrCorrupt{errBadOffset} + } + + switch header.version { + case 1: + break + case 2: + break + case 3: + break + default: + return fmt.Errorf("document version '%d' not yet supported", header.version) + } + + var decomp decompressor + + switch header.doctype { + case serealRaw: + // nothing + + case serealSnappy: + if header.version != 1 { + return ErrBadSnappy + } + decomp = SnappyCompressor{Incremental: false} + + case serealSnappyIncremental: + decomp = SnappyCompressor{Incremental: true} + + case serealZlib: + if header.version < 3 { + return ErrBadZlibV3 + } + decomp = ZlibCompressor{} + + default: + return fmt.Errorf("document type '%d' not yet supported", header.doctype) + } + + if vheader != nil && header.suffixSize != 1 { + d.tracked = make(map[int]reflect.Value) + defer func() { d.tracked = nil }() + + headerValue := reflect.ValueOf(vheader) + if headerValue.Kind() != reflect.Ptr { + return ErrHeaderPointer + } + + header.suffixFlags = b[header.suffixStart] + if header.suffixFlags&1 == 1 { + if ptr, ok := vheader.(*interface{}); ok && *ptr == nil { + _, err = d.decode(b[:bodyStart], header.suffixStart+1, ptr) + } else { + _, err = d.decodeViaReflection(b[:bodyStart], header.suffixStart+1, headerValue.Elem()) + } + } + } + + if err == nil && vbody != nil { + /* XXX instead of creating an uncompressed copy of the document, + * it would be more flexible to use a sort of "Reader" interface */ + if decomp != nil { + decompBody, err := decomp.decompress(b[bodyStart:]) + if err != nil { + return err + } + + // shrink down b to reuse the allocated buffer + b = b[:0] + b = append(b, b[:bodyStart]...) + b = append(b, decompBody...) + } + + d.tracked = make(map[int]reflect.Value) + defer func() { d.tracked = nil }() + + bodyValue := reflect.ValueOf(vbody) + if bodyValue.Kind() != reflect.Ptr { + return ErrBodyPointer + } + + if header.version == 1 { + if ptr, ok := vbody.(*interface{}); ok && *ptr == nil { + _, err = d.decode(b, bodyStart, ptr) + } else { + _, err = d.decodeViaReflection(b, bodyStart, bodyValue.Elem()) + } + } else { + // serealv2 documents have 1-based offsets :/ + if ptr, ok := vbody.(*interface{}); ok && *ptr == nil { + _, err = d.decode(b[bodyStart-1:], 1, ptr) + } else { + _, err = d.decodeViaReflection(b[bodyStart-1:], 1, bodyValue.Elem()) + } + } + } + + return err +} + +/**************************************************************** + * Decode document of unknown structure (i.e. without reflection) + ****************************************************************/ +func (d *Decoder) decode(by []byte, idx int, ptr *interface{}) (int, error) { + if idx < 0 || idx >= len(by) { + return 0, ErrTruncated + } + + tag := by[idx] + + // skip over any padding bytes + for tag == typePAD || tag == typePAD|trackFlag { + idx++ + if idx >= len(by) { + return 0, ErrTruncated + } + + tag = by[idx] + } + + trackme := (tag & trackFlag) == trackFlag + if trackme { + tag &^= trackFlag + d.tracked[idx] = reflect.ValueOf(ptr) + } + + //fmt.Printf("start decode: tag %d (0x%x) at %d\n", int(tag), int(tag), idx) + idx++ + + var err error + switch { + case tag < typeVARINT: + *ptr = d.decodeInt(tag) + + case tag == typeVARINT: + var val int + if val, idx, err = d.decodeVarint(by, idx); err != nil { + return 0, err + } + if val < 0 { + *ptr = uint(val) + } else { + *ptr = val + } + + case tag == typeZIGZAG: + *ptr, idx, err = d.decodeZigzag(by, idx) + + case tag == typeFLOAT: + *ptr, idx, err = d.decodeFloat(by, idx) + + case tag == typeDOUBLE: + *ptr, idx, err = d.decodeDouble(by, idx) + + case tag == typeTRUE: + *ptr = true + + case tag == typeFALSE: + *ptr = false + + case tag == typeHASH: + // see commends at top of the function + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx, err = d.decodeHash(by, idx+sz, ln, ptr, false) + + case tag >= typeHASHREF_0 && tag < typeHASHREF_0+16: + idx, err = d.decodeHash(by, idx, int(tag&0x0f), ptr, d.PerlCompat) + if err != nil { + return 0, err + } + + case tag == typeARRAY: + // see commends at top of the function + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx, err = d.decodeArray(by, idx+sz, ln, ptr, false) + if err != nil { + return 0, err + } + + case tag >= typeARRAYREF_0 && tag < typeARRAYREF_0+16: + idx, err = d.decodeArray(by, idx, int(tag&0x0f), ptr, d.PerlCompat) + if err != nil { + return 0, err + } + + case tag == typeSTR_UTF8: + var val []byte + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + if val, idx, err = d.decodeBinary(by, idx+sz, ln, false); err != nil { + return 0, err + } + *ptr = string(val) + + case tag == typeBINARY: + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + *ptr, idx, err = d.decodeBinary(by, idx+sz, ln, true) + if err != nil { + return 0, err + } + + case tag >= typeSHORT_BINARY_0 && tag < typeSHORT_BINARY_0+32: + *ptr, idx, err = d.decodeBinary(by, idx, int(tag&0x1f), true) + if err != nil { + return 0, err + } + + case tag == typeUNDEF, tag == typeCANONICAL_UNDEF: + if d.PerlCompat && tag == typeCANONICAL_UNDEF { + *ptr = perlCanonicalUndef + } else if d.PerlCompat { + *ptr = &PerlUndef{} + } else { + *ptr = nil + } + + case tag == typeCOPY: + if d.copyDepth > 0 { + return 0, ErrCorrupt{errNestedCOPY} + } + + var offs, sz int + offs, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + if offs < 0 || offs >= idx { + return 0, ErrCorrupt{errBadOffset} + } + idx += sz + + d.copyDepth++ + _, err = d.decode(by, offs, ptr) + d.copyDepth-- + + case tag == typeREFN: + if d.PerlCompat { + var iface interface{} + *ptr = &iface + + if idx, err = d.decode(by, idx, &iface); !trackme && err == nil { + // if REFN is not tracked, build a pointer to concrete type + // otherwise let ptr be pointer to something (i.e. *interface{}) + riface := reflect.ValueOf(iface) + + // reflect.New create value of type *riface.Type()) + val := reflect.New(riface.Type()) + val.Elem().Set(riface) + *ptr = val.Interface() + } + } else { + idx, err = d.decode(by, idx, ptr) + } + + case tag == typeREFP, tag == typeALIAS: + var val reflect.Value + if val, idx, err = d.decodeREFP_ALIAS(by, idx, tag == typeREFP); err == nil { + *ptr = val.Interface() + } + + case tag == typeWEAKEN: + if d.PerlCompat { + pweak := PerlWeakRef{} + *ptr = &pweak + idx, err = d.decode(by, idx, &pweak.Reference) + } else { + idx, err = d.decode(by, idx, ptr) + } + + case tag == typeREGEXP: + *ptr, idx, err = d.decodeRegexp(by, idx) + + case tag == typeOBJECT, tag == typeOBJECTV: + rvPtr := reflect.ValueOf(ptr) + idx, err = d.decodeObjectViaReflection(by, idx, rvPtr.Elem(), tag == typeOBJECTV) + + case tag == typeOBJECT_FREEZE, tag == typeOBJECTV_FREEZE: + rvPtr := reflect.ValueOf(ptr) + idx, err = d.decodeObjectFreezeViaReflection(by, idx, rvPtr.Elem(), tag == typeOBJECTV_FREEZE) + + default: + return 0, fmt.Errorf("unknown tag byte: %d (0x%x)", int(tag), int(tag)) + } + + //fmt.Printf("stop decode: tag %d (0x%x)\n", int(tag), int(tag)) + return idx, err +} + +func (d *Decoder) decodeInt(tag byte) int { + if (tag & 0x10) == 0x10 { + return int(tag) - 32 // negative number + } + return int(tag) +} + +func (d *Decoder) decodeVarint(by []byte, idx int) (int, int, error) { + i, sz, err := varintdecode(by[idx:]) + return i, idx + sz, err +} + +func (d *Decoder) decodeZigzag(by []byte, idx int) (int, int, error) { + i, sz, err := varintdecode(by[idx:]) + return int(-(1 + (uint64(i) >> 1))), idx + sz, err +} + +func (d *Decoder) decodeFloat(by []byte, idx int) (float32, int, error) { + if idx+3 >= len(by) { + return 0, 0, ErrTruncated + } + + bits := uint32(by[idx]) | uint32(by[idx+1])<<8 | uint32(by[idx+2])<<16 | uint32(by[idx+3])<<24 + return math.Float32frombits(bits), idx + 4, nil +} + +func (d *Decoder) decodeDouble(by []byte, idx int) (float64, int, error) { + if idx+7 >= len(by) { + return 0, 0, ErrTruncated + } + + bits := uint64(by[idx]) | uint64(by[idx+1])<<8 | uint64(by[idx+2])<<16 | uint64(by[idx+3])<<24 | uint64(by[idx+4])<<32 | uint64(by[idx+5])<<40 | uint64(by[idx+6])<<48 | uint64(by[idx+7])<<56 + return math.Float64frombits(bits), idx + 8, nil +} + +func (d *Decoder) decodeHash(by []byte, idx int, ln int, ptr *interface{}, isRef bool) (int, error) { + if ln < 0 || ln > math.MaxInt32 { + return 0, ErrCorrupt{errBadHashSize} + } + + if idx+2*ln > len(by) { + return 0, ErrTruncated + } + + hash := make(map[string]interface{}, ln) + + if isRef { + *ptr = &hash + } else { + *ptr = hash + } + + var err error + for i := 0; i < ln; i++ { + var key []byte + key, idx, err = d.decodeStringish(by, idx) + if err != nil { + return 0, err + } + + var value interface{} + idx, err = d.decode(by, idx, &value) + if err != nil { + return 0, err + } + + hash[string(key)] = value + } + + return idx, nil +} + +func (d *Decoder) decodeArray(by []byte, idx int, ln int, ptr *interface{}, isRef bool) (int, error) { + if ln < 0 || ln > math.MaxInt32 { + return 0, ErrCorrupt{errBadSliceSize} + } + + if idx+ln > len(by) { + return 0, ErrTruncated + } + + var slice []interface{} + + if ln == 0 { + // FIXME this is not optimal + slice = make([]interface{}, 0, 1) + } else { + slice = make([]interface{}, ln, ln) + } + + if isRef { + *ptr = &slice + } else { + *ptr = slice + } + + var err error + for i := 0; i < ln; i++ { + idx, err = d.decode(by, idx, &slice[i]) + if err != nil { + return 0, err + } + } + + return idx, nil +} + +func (d *Decoder) decodeBinary(by []byte, idx int, ln int, makeCopy bool) ([]byte, int, error) { + if ln < 0 || ln > math.MaxInt32 { + return nil, 0, ErrCorrupt{errBadStringSize} + } + if idx+ln > len(by) { + return nil, 0, ErrTruncated + } + + if makeCopy { + res := make([]byte, ln, ln) + copy(res, by[idx:idx+ln]) + return res, idx + ln, nil + } + + return by[idx : idx+ln], idx + ln, nil +} + +// decodeStringish() return slice of by, i.e. not a copy +func (d *Decoder) decodeStringish(by []byte, idx int) ([]byte, int, error) { + if idx < 0 || idx >= len(by) { + return nil, 0, ErrTruncated + } + + //TODO trackme + + tag := by[idx] + for tag == typePAD || tag == typePAD|trackFlag { + idx++ + if idx >= len(by) { + return nil, 0, ErrTruncated + } + + tag = by[idx] + } + + tag &^= trackFlag + idx++ + + //fmt.Printf("decodeStringish: tag %d (0x%x) at %d\n", int(tag), int(tag), idx) + + var res []byte + switch { + case tag == typeBINARY, tag == typeSTR_UTF8: + ln, sz, err := varintdecode(by[idx:]) + if err != nil { + return nil, 0, err + } + idx += sz + + if ln < 0 || ln > math.MaxInt32 { + return nil, 0, ErrCorrupt{errBadStringSize} + } else if idx+ln > len(by) { + return nil, 0, ErrTruncated + } + + res = by[idx : idx+ln] + idx += ln + + case tag >= typeSHORT_BINARY_0 && tag < typeSHORT_BINARY_0+32: + ln := int(tag & 0x1F) // get length from tag + if idx+ln > len(by) { + return nil, 0, ErrTruncated + } + + res = by[idx : idx+ln] + idx += ln + + case tag == typeCOPY: + if d.copyDepth > 0 { + return nil, 0, ErrCorrupt{errNestedCOPY} + } + + offs, sz, err := varintdecode(by[idx:]) + if err != nil { + return nil, 0, err + } + if offs < 0 || offs >= idx { + return nil, 0, ErrCorrupt{errBadOffset} + } + idx += sz + + d.copyDepth++ + res, _, err = d.decodeStringish(by, offs) + d.copyDepth-- + if err != nil { + return nil, 0, err + } + + default: + return nil, 0, fmt.Errorf("expect stringish at offset %d but got %d (0x%x)", idx, int(tag), int(tag)) + } + + //fmt.Printf("decodeStringish res: %s at %d\n", string(res), idx) + return res, idx, nil +} + +func (d *Decoder) decodeRegexp(by []byte, idx int) (*PerlRegexp, int, error) { + var err error + var pattern []byte + if pattern, idx, err = d.decodeStringish(by, idx); err != nil { + return nil, 0, err + } + + var modifiers []byte + if modifiers, idx, err = d.decodeStringish(by, idx); err != nil { + return nil, 0, err + } + + // TODO perhaps, copy values + return &PerlRegexp{pattern, modifiers}, idx, nil +} + +/******************************************************************** + * Decode document with predefined structure (have to use reflection) + ********************************************************************/ +func (d *Decoder) decodeViaReflection(by []byte, idx int, ptr reflect.Value) (int, error) { + if idx < 0 || idx >= len(by) { + return 0, ErrTruncated + } + + ptrKind := ptr.Kind() + + // at this point structure of decoding document is uknown, make a shortcut + if ptrKind == reflect.Interface && ptr.IsNil() { + var iface interface{} + var err error + idx, err = d.decode(by, idx, &iface) + ptr.Set(reflect.ValueOf(iface)) + return idx, err + } + + tag := by[idx] + for tag == typePAD || tag == typePAD|trackFlag { + idx++ + if idx >= len(by) { + return 0, ErrTruncated + } + + tag = by[idx] + } + + if (tag & trackFlag) == trackFlag { + tag &^= trackFlag + d.tracked[idx] = ptr + } + + //fmt.Printf("start decodeViaReflection: tag %d (0x%x) at %d\n", int(tag), int(tag), idx) + idx++ + + var err error + switch { + case tag < typeVARINT: + setInt(ptr, d.decodeInt(tag)) + + case tag == typeVARINT: + var val int + val, idx, err = d.decodeVarint(by, idx) + if err != nil { + return 0, err + } + setInt(ptr, val) + + case tag == typeZIGZAG: + var val int + val, idx, err = d.decodeZigzag(by, idx) + if err != nil { + return 0, err + } + setInt(ptr, val) + + case tag == typeFLOAT: + var val float32 + if val, idx, err = d.decodeFloat(by, idx); err != nil { + return 0, err + } + ptr.SetFloat(float64(val)) + + case tag == typeDOUBLE: + var val float64 + if val, idx, err = d.decodeDouble(by, idx); err != nil { + return 0, err + } + ptr.SetFloat(float64(val)) + + case tag == typeTRUE, tag == typeFALSE: + ptr.SetBool(tag == typeTRUE) + + case tag == typeBINARY: + var val []byte + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + if val, idx, err = d.decodeBinary(by, idx+sz, ln, false); err != nil { + return 0, err + } + setBinary(ptr, val) + + case tag >= typeSHORT_BINARY_0 && tag < typeSHORT_BINARY_0+32: + var val []byte + if val, idx, err = d.decodeBinary(by, idx, int(tag&0x1f), false); err != nil { + return 0, err + } + setBinary(ptr, val) + + case tag == typeSTR_UTF8: + var val []byte + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + if val, idx, err = d.decodeBinary(by, idx+sz, ln, false); err != nil { + return 0, err + } + ptr.SetString(string(val)) + + case tag == typeHASH: + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx, err = d.decodeHashViaReflection(by, idx+sz, ln, ptr) + + case tag >= typeHASHREF_0 && tag < typeHASHREF_0+16: + idx, err = d.decodeHashViaReflection(by, idx, int(tag&0x0f), ptr) + + case tag == typeARRAY: + var ln, sz int + ln, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx, err = d.decodeArrayViaReflection(by, idx+sz, ln, ptr) + + case tag >= typeARRAYREF_0 && tag < typeARRAYREF_0+16: + idx, err = d.decodeArrayViaReflection(by, idx, int(tag&0x0f), ptr) + + case tag == typeUNDEF, tag == typeCANONICAL_UNDEF: + if d.PerlCompat && tag == typeCANONICAL_UNDEF { + ptr.Set(reflect.ValueOf(perlCanonicalUndef)) + } else if d.PerlCompat { + ptr.Set(reflect.ValueOf(&PerlUndef{})) + } else { + if ptrKind == reflect.Ptr || ptrKind == reflect.Map || ptrKind == reflect.Slice { + ptr.Set(reflect.Zero(ptr.Type())) + } else { + // maybe panic + } + } + + case tag == typeCOPY: + if d.copyDepth > 0 { + return 0, ErrCorrupt{errNestedCOPY} + } + + var offs, sz int + offs, sz, err = varintdecode(by[idx:]) + if err != nil { + return 0, err + } + if offs < 0 || offs >= idx { + return 0, ErrCorrupt{errBadOffset} + } + idx += sz + + d.copyDepth++ + _, err = d.decodeViaReflection(by, offs, ptr) + d.copyDepth-- + + case tag == typeREFN: + idx, err = d.decodeViaReflection(by, idx, ptr) + + case tag == typeREFP, tag == typeALIAS: + var val reflect.Value + if val, idx, err = d.decodeREFP_ALIAS(by, idx, tag == typeREFP); err != nil { + return 0, err + + } + ptr.Set(val.Elem()) + + case tag == typeWEAKEN: + if d.PerlCompat { + pweak := PerlWeakRef{} + ptr.Set(reflect.ValueOf(&pweak)) + idx, err = d.decode(by, idx, &pweak.Reference) + } else { + idx, err = d.decodeViaReflection(by, idx, ptr) + } + + case tag == typeREGEXP: + var pregexp *PerlRegexp + if pregexp, idx, err = d.decodeRegexp(by, idx); err != nil { + return 0, err + } + ptr.Set(reflect.ValueOf(pregexp)) + + case tag == typeOBJECT, tag == typeOBJECTV: + idx, err = d.decodeObjectViaReflection(by, idx, ptr, tag == typeOBJECTV) + + case tag == typeOBJECT_FREEZE, tag == typeOBJECTV_FREEZE: + idx, err = d.decodeObjectFreezeViaReflection(by, idx, ptr, tag == typeOBJECTV_FREEZE) + + default: + return 0, fmt.Errorf("unknown tag byte: %d (0x%x)", int(tag), int(tag)) + } + + return idx, err +} + +func (d *Decoder) decodeArrayViaReflection(by []byte, idx int, ln int, ptr reflect.Value) (int, error) { + if ln < 0 || ln > math.MaxInt32 { + return 0, ErrCorrupt{errBadSliceSize} + } + + if idx+ln > len(by) { + return 0, ErrTruncated + } + + switch ptr.Kind() { + case reflect.Slice: + if ptr.IsNil() || ptr.Len() == 0 { + ptr.Set(reflect.MakeSlice(ptr.Type(), ln, ln)) + } + + case reflect.Array: + // do nothing + + default: + panic(&reflect.ValueError{Method: "sereal.decodeArrayViaReflection", Kind: ptr.Kind()}) + } + + var err error + ptrLen := ptr.Len() + + for i := 0; i < ln; i++ { + if i < ptrLen { + idx, err = d.decodeViaReflection(by, idx, ptr.Index(i)) + } else { + // we went outside of array length, so ignore folowwing content + var iface interface{} + idx, err = d.decode(by, idx, &iface) // TODO make this process to be efficient + } + + if err != nil { + return 0, err + } + } + + return idx, nil +} + +func (d *Decoder) decodeHashViaReflection(by []byte, idx int, ln int, ptr reflect.Value) (int, error) { + if ln < 0 || ln > math.MaxInt32 { + return 0, ErrCorrupt{errBadHashSize} + } + + if idx+2*ln > len(by) { + return 0, ErrTruncated + } + + switch ptr.Kind() { + case reflect.Map: + if ptr.IsNil() { + ptr.Set(reflect.MakeMap(ptr.Type())) + } + + var err error + for i := 0; i < ln; i++ { + var key []byte + key, idx, err = d.decodeStringish(by, idx) + if err != nil { + return 0, err + } + + keyValue := reflect.ValueOf(string(key)) + if value := ptr.MapIndex(keyValue); value.IsValid() { + // strkey exists in map, replace its content but respect structure + idx, err = d.decodeViaReflection(by, idx, value) + } else { + // there is no strkey in map, crete a new one + riface := reflect.New(ptr.Type().Elem()) + idx, err = d.decodeViaReflection(by, idx, riface.Elem()) + if err != nil { + return 0, err + } + + ptr.SetMapIndex(keyValue, riface.Elem()) + } + + if err != nil { + return 0, err + } + } + + case reflect.Ptr: + if ptr.IsNil() { + n := reflect.New(ptr.Type().Elem()) + ptr.Set(n) + } + + return d.decodeHashViaReflection(by, idx, ln, ptr.Elem()) + case reflect.Struct: + tags := d.tcache.Get(ptr) + var err error + for i := 0; i < ln; i++ { + var key []byte + key, idx, err = d.decodeStringish(by, idx) + if err != nil { + return 0, err + } + + fld := 0 + found := false + strkey := string(key) + + if tags == nil { + // do nothing + } else if fld, found = tags[strkey]; found { + idx, err = d.decodeViaReflection(by, idx, ptr.Field(fld)) + } else if fld, found = tags[strings.Title(strkey)]; found { + idx, err = d.decodeViaReflection(by, idx, ptr.Field(fld)) + } + + if !found { + // struct doesn't contain field with strkey name + var iface interface{} + idx, err = d.decode(by, idx, &iface) // TODO make this process to be efficient + } + + if err != nil { + return 0, err + } + } + + default: + panic(&reflect.ValueError{Method: "sereal.decodeHashViaReflection", Kind: ptr.Kind()}) + } + + return idx, nil +} + +func (d *Decoder) decodeREFP_ALIAS(by []byte, idx int, isREFP bool) (reflect.Value, int, error) { + offs, sz, err := varintdecode(by[idx:]) + if err != nil { + var res reflect.Value + return res, 0, err + } + idx += sz + + if offs < 0 || offs >= idx { + var res reflect.Value + return res, 0, ErrCorrupt{errBadOffset} + } + + rv, ok := d.tracked[offs] + if !ok { + var res reflect.Value + return res, 0, ErrCorrupt{errUntrackedOffsetREFP} + } + + var res reflect.Value + if rv.Kind() == reflect.Ptr && rv.Elem().Kind() == reflect.Interface { + // rv contains *interface{}, + // i.e. it was saved in decode() path + // rv.Elem() will be an interface + // rv.Elem().Elem() should be the data inside interface + + if isREFP { + rvData := rv.Elem().Elem() + res = reflect.New(rvData.Type()) + res.Elem().Set(rvData) + } else { + res = rv.Elem() + } + } else { + // rv contains original value + // i.e. it was saved in decodeViaReflection() path + res = reflect.New(rv.Type()) + res.Elem().Set(rv) + } + + return res, idx, nil +} + +func (d *Decoder) decodeObjectViaReflection(by []byte, idx int, ptr reflect.Value, isObjectV bool) (int, error) { + var err error + var className []byte + + if !isObjectV { + // typeOBJECT + className, idx, err = d.decodeStringish(by, idx) + } else { + // typeOBJECTV + offs, sz, err := varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx += sz + className, _, err = d.decodeStringish(by, offs) + } + + if err != nil { + return 0, err + } + + if d.PerlCompat { + pobj := PerlObject{Class: string(className)} + ptr.Set(reflect.ValueOf(&pobj)) + idx, err = d.decode(by, idx, &pobj.Reference) + } else { + // FIXME: stuff className somewhere if map/struct? + idx, err = d.decodeViaReflection(by, idx, ptr) + } + + return idx, err +} +func (d *Decoder) decodeObjectFreezeViaReflection(by []byte, idx int, ptr reflect.Value, isObjectV bool) (int, error) { + var err error + var className, classData []byte + + if !isObjectV { + // typeOBJECT_FREEZE + className, idx, err = d.decodeStringish(by, idx) + if err != nil { + return 0, err + } + } else { + // typeOBJECTV_FREEZE + offs, sz, err := varintdecode(by[idx:]) + if err != nil { + return 0, err + } + idx += sz + className, _, err = d.decodeStringish(by, offs) + if err != nil { + return 0, err + } + } + + if err != nil { + return 0, err + } + + if idx+1 >= len(by) { + return 0, ErrTruncated + } + + if by[idx] != typeREFN || by[idx+1] != typeARRAY { + return 0, ErrCorrupt{errFreezeNotRefnArray} + } + + var iface interface{} + if idx, err = d.decode(by, idx, &iface); err != nil { + return 0, err + } + + wrapper, ok := iface.([]interface{}) + if !ok { + return 0, ErrCorrupt{errFreezeNotArray} + } + + if len(wrapper) != 1 { + return 0, ErrCorrupt{errFreezeMultipleElts} + } + + // Expecting a single item in the array ref + if classData, ok = wrapper[0].([]byte); !ok { + return 0, ErrCorrupt{errFreezeNotByteSlice} + } + + strClassName := string(className) + + if d.PerlCompat { + ptr.Set(reflect.ValueOf(&PerlFreeze{strClassName, classData})) + } else { + if obj, ok := findUnmarshaler(ptr); ok { + + if err := obj.UnmarshalBinary(classData); err != nil { + return 0, err + } + } else { + switch { + case ptr.Kind() == reflect.Interface && ptr.IsNil(): + // do we have a registered handler for this type? + concreteClass, ok := d.getUnmarshalerType(strClassName) + + if ok { + rzero := instantiateZero(concreteClass) + obj, ok := findUnmarshaler(rzero) + + if !ok { + // only things that have an unmarshaler should have been put into the map + panic(fmt.Sprintf("unable to find unmarshaler for %s", rzero)) + } + + if err := obj.UnmarshalBinary(classData); err != nil { + return 0, err + } + + ptr.Set(reflect.ValueOf(obj)) + } else { + ptr.Set(reflect.ValueOf(&PerlFreeze{strClassName, classData})) + } + + case ptr.Kind() == reflect.Slice && ptr.Type().Elem().Kind() == reflect.Uint8 && ptr.IsNil(): + ptr.Set(reflect.ValueOf(classData)) + + default: + return 0, fmt.Errorf("can't unpack FROZEN object into %v", ptr.Type()) + } + } + } + + return idx, err +} + +func setInt(ptr reflect.Value, i int) { + switch ptr.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + ptr.SetInt(int64(i)) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + ptr.SetUint(uint64(i)) + + default: + panic(&reflect.ValueError{Method: "sereal.setInt", Kind: ptr.Kind()}) + } +} + +func setBinary(ptr reflect.Value, val []byte) { + switch ptr.Kind() { + case reflect.Slice: + if ptr.Type().Elem().Kind() == reflect.Uint8 && ptr.IsNil() { + slice := make([]byte, len(val), len(val)) + ptr.Set(reflect.ValueOf(slice)) + } + + reflect.Copy(ptr, reflect.ValueOf(val)) + + case reflect.Array: + reflect.Copy(ptr.Slice(0, ptr.Len()), reflect.ValueOf(val)) + + case reflect.String: + ptr.SetString(string(val)) + + default: + panic(&reflect.ValueError{Method: "sereal.setBinary", Kind: ptr.Kind()}) + } +} + +func varintdecode(by []byte) (n int, sz int, err error) { + s := uint(0) // shift count + for i, b := range by { + n |= int(b&0x7f) << s + s += 7 + + if (b & 0x80) == 0 { + return n, i + 1, nil + } + + if s > 63 { + // too many continuation bits + return 0, i + 1, ErrCorrupt{errBadVarint} + } + } + + // byte without continuation bit + return 0, len(by), ErrCorrupt{errBadVarint} +} + +func findUnmarshaler(ptr reflect.Value) (encoding.BinaryUnmarshaler, bool) { + if ptr.Kind() == reflect.Ptr && ptr.IsNil() { + p := reflect.New(ptr.Type().Elem()) + ptr.Set(p) + } + + if obj, ok := ptr.Interface().(encoding.BinaryUnmarshaler); ok { + return obj, true + } + + pptr := ptr.Addr() + + if obj, ok := pptr.Interface().(encoding.BinaryUnmarshaler); ok { + return obj, true + } + + return nil, false +} + +// RegisterName registers the named class with an instance of 'value'. When the +// decoder finds a FREEZE tag with the given class, the binary data will be +// passed to value's UnmarshalBinary method. +func (d *Decoder) RegisterName(name string, value interface{}) { + if d.umcache == nil { + d.umcache = make(map[string]reflect.Type) + } + + rv := reflect.ValueOf(value) + if _, ok := value.(encoding.BinaryUnmarshaler); ok { + d.umcache[name] = rv.Type() + return + } + + prv := rv.Addr() + if _, ok := prv.Interface().(encoding.BinaryUnmarshaler); ok { + d.umcache[name] = prv.Type() + return + } + + panic(fmt.Sprintf("unable to register type %s: not encoding.BinaryUnmarshaler", rv.Type())) +} + +func (d *Decoder) getUnmarshalerType(name string) (reflect.Type, bool) { + if d.umcache == nil { + return nil, false + } + + val, ok := d.umcache[name] + return val, ok +} + +func instantiateZero(typ reflect.Type) reflect.Value { + if typ.Kind() == reflect.Ptr { + return reflect.New(typ.Elem()) + } + + v := reflect.New(typ) + return v.Addr() +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/doc.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/doc.go new file mode 100644 index 0000000..d4d8105 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/doc.go @@ -0,0 +1,12 @@ +/* +Package sereal implements the Sereal serialization format + +It follows the standard Go Marshal/Unmarshal interface. + +For more information on Sereal, please see +http://blog.booking.com/sereal-a-binary-data-serialization-format.html +and +http://github.com/Sereal/Sereal + +*/ +package sereal diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/encode.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/encode.go new file mode 100644 index 0000000..c33a215 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/encode.go @@ -0,0 +1,624 @@ +package sereal + +import ( + "encoding" + "encoding/binary" + "errors" + "fmt" + "math" + "reflect" + "runtime" + "unsafe" +) + +// An Encoder encodes Go data structures into Sereal byte streams +type Encoder struct { + PerlCompat bool // try to mimic Perl's structure as much as possible + Compression compressor // optionally compress the main payload of the document using SnappyCompressor or ZlibCompressor + CompressionThreshold int // threshold in bytes above which compression is attempted: 1024 bytes by default + DisableDedup bool // should we disable deduping of class names and hash keys + DisableFREEZE bool // should we disable the FREEZE tag, which calls MarshalBinary + ExpectedSize uint // give a hint to encoder about expected size of encoded data + version int // default version to encode + tcache tagsCache +} + +type compressor interface { + compress(b []byte) ([]byte, error) +} + +// NewEncoder returns a new Encoder struct with default values +func NewEncoder() *Encoder { + return &Encoder{ + PerlCompat: false, + CompressionThreshold: 1024, + version: 1, + } +} + +// NewEncoderV2 returns a new Encoder that encodes version 2 +func NewEncoderV2() *Encoder { + return &Encoder{ + PerlCompat: false, + CompressionThreshold: 1024, + version: 2, + } +} + +// NewEncoderV3 returns a new Encoder that encodes version 3 +func NewEncoderV3() *Encoder { + return &Encoder{ + PerlCompat: false, + CompressionThreshold: 1024, + version: 3, + } +} + +var defaultEncoder = NewEncoderV3() + +// Marshal encodes body with the default encoder +func Marshal(body interface{}) ([]byte, error) { + return defaultEncoder.MarshalWithHeader(nil, body) +} + +// Marshal returns the Sereal encoding of body +func (e *Encoder) Marshal(body interface{}) (b []byte, err error) { + return e.MarshalWithHeader(nil, body) +} + +// MarshalWithHeader returns the Sereal encoding of body with header data +func (e *Encoder) MarshalWithHeader(header interface{}, body interface{}) (b []byte, err error) { + defer func() { + //return + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + + if s, ok := r.(string); ok { + err = errors.New(s) + } else { + err = r.(error) + } + } + }() + + // uninitialized encoder? set to the most recent supported protocol version + if e.version == 0 { + e.version = ProtocolVersion + } + + encHeader := make([]byte, headerSize, 32) + + if e.version < 3 { + binary.LittleEndian.PutUint32(encHeader[:4], magicHeaderBytes) + } else { + binary.LittleEndian.PutUint32(encHeader[:4], magicHeaderBytesHighBit) + } + + // Set the component in the header + encHeader[4] = byte(e.version) | byte(serealRaw)<<4 + + if header != nil && e.version >= 2 { + strTable := make(map[string]int) + ptrTable := make(map[uintptr]int) + // this is both the flag byte (== "there is user data") and also a hack to make 1-based offsets work + henv := []byte{0x01} // flag byte == "there is user data" + encHeaderSuffix, err := e.encode(henv, header, false, false, strTable, ptrTable) + + if err != nil { + return nil, err + } + + encHeader = varint(encHeader, uint(len(encHeaderSuffix))) + encHeader = append(encHeader, encHeaderSuffix...) + } else { + /* header size */ + encHeader = append(encHeader, 0) + } + + strTable := make(map[string]int) + ptrTable := make(map[uintptr]int) + + encBody := make([]byte, 0, e.ExpectedSize) + + switch e.version { + case 1: + encBody, err = e.encode(encBody, body, false, false, strTable, ptrTable) + case 2, 3: + encBody = append(encBody, 0) // hack for 1-based offsets + encBody, err = e.encode(encBody, body, false, false, strTable, ptrTable) + encBody = encBody[1:] // trim hacky first byte + } + + if err != nil { + return nil, err + } + + if e.Compression != nil && (e.CompressionThreshold == 0 || len(encBody) >= e.CompressionThreshold) { + encBody, err = e.Compression.compress(encBody) + if err != nil { + return nil, err + } + + var doctype documentType + + switch c := e.Compression.(type) { + case SnappyCompressor: + if e.version > 1 && !c.Incremental { + return nil, errors.New("non-incremental snappy compression only valid for v1 documents") + } + if e.version == 1 { + doctype = serealSnappy + } else { + doctype = serealSnappyIncremental + } + case ZlibCompressor: + if e.version < 3 { + return nil, errors.New("zlib compression only valid for v3 documents and up") + } + doctype = serealZlib + default: + // Defensive programming: this point should never be + // reached in production code because the compressor + // interface is not exported, hence no way to pass in + // an unknown thing. But it may happen during + // development when a new compressor is implemented, + // but a relevant document type is not defined. + panic("undefined compression") + } + + encHeader[4] |= byte(doctype) << 4 + } + + return append(encHeader, encBody...), nil +} + +/************************************* + * Encode via static types - fast path + *************************************/ +func (e *Encoder) encode(b []byte, v interface{}, isKeyOrClass bool, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + var err error + + switch value := v.(type) { + case nil: + b = append(b, typeUNDEF) + + case bool: + if value { + b = append(b, typeTRUE) + } else { + b = append(b, typeFALSE) + } + + case int: + b = e.encodeInt(b, reflect.Int, int64(value)) + case int8: + b = e.encodeInt(b, reflect.Int, int64(value)) + case int16: + b = e.encodeInt(b, reflect.Int, int64(value)) + case int32: + b = e.encodeInt(b, reflect.Int, int64(value)) + case int64: + b = e.encodeInt(b, reflect.Int, int64(value)) + + case uint: + b = e.encodeInt(b, reflect.Uint, int64(value)) + case uint8: + b = e.encodeInt(b, reflect.Uint, int64(value)) + case uint16: + b = e.encodeInt(b, reflect.Uint, int64(value)) + case uint32: + b = e.encodeInt(b, reflect.Uint, int64(value)) + case uint64: + b = e.encodeInt(b, reflect.Uint, int64(value)) + + case float32: + b = e.encodeFloat(b, value) + case float64: + b = e.encodeDouble(b, value) + + case string: + b = e.encodeString(b, value, isKeyOrClass, strTable) + + case []uint8: + b = e.encodeBytes(b, value, isKeyOrClass, strTable) + + case []interface{}: + b, err = e.encodeIntfArray(b, value, isRefNext, strTable, ptrTable) + + case map[string]interface{}: + b, err = e.encodeStrMap(b, value, isRefNext, strTable, ptrTable) + + case reflect.Value: + if value.Kind() == reflect.Invalid { + b = append(b, typeUNDEF) + } else { + // could be optimized to tail call + b, err = e.encode(b, value.Interface(), false, isRefNext, strTable, ptrTable) + } + + case PerlUndef: + if value.canonical { + b = append(b, typeCANONICAL_UNDEF) + } else { + b = append(b, typeUNDEF) + } + + case PerlObject: + b = append(b, typeOBJECT) + b = e.encodeBytes(b, []byte(value.Class), true, strTable) + b, err = e.encode(b, value.Reference, false, false, strTable, ptrTable) + + case PerlRegexp: + b = append(b, typeREGEXP) + b = e.encodeBytes(b, value.Pattern, false, strTable) + b = e.encodeBytes(b, value.Modifiers, false, strTable) + + case PerlWeakRef: + b = append(b, typeWEAKEN) + b, err = e.encode(b, value.Reference, false, false, strTable, ptrTable) + + //case *interface{}: + //TODO handle here if easy + + //case interface{}: + // http://blog.golang.org/laws-of-reflection + // One important detail is that the pair inside an interface always has the form (value, concrete type) + // and cannot have the form (value, interface type). Interfaces do not hold interface values. + //panic("interface cannot hold an interface") + + // ikruglov + // in theory this block should no be commented, + // but in practise type *interface{} somehow manages to match interface{} + // if one manages to properly implement *interface{} case, this block should be uncommented + + default: + b, err = e.encodeViaReflection(b, reflect.ValueOf(value), isKeyOrClass, isRefNext, strTable, ptrTable) + } + + return b, err +} + +func (e *Encoder) encodeInt(by []byte, k reflect.Kind, i int64) []byte { + switch { + case 0 <= i && i <= 15: + by = append(by, byte(i)&0x0f) + case -16 <= i && i < 0 && k == reflect.Int: + by = append(by, 0x010|(byte(i)&0x0f)) + case i > 15: + by = append(by, typeVARINT) + by = varint(by, uint(i)) + case i < 0: + n := uint(i) + if k == reflect.Int { + by = append(by, typeZIGZAG) + n = uint((i << 1) ^ (i >> 63)) + } else { + by = append(by, typeVARINT) + } + + by = varint(by, uint(n)) + } + + return by +} + +func (e *Encoder) encodeFloat(by []byte, f float32) []byte { + u := math.Float32bits(f) + by = append(by, typeFLOAT) + by = append(by, byte(u)) + by = append(by, byte(u>>8)) + by = append(by, byte(u>>16)) + by = append(by, byte(u>>24)) + return by +} + +func (e *Encoder) encodeDouble(by []byte, f float64) []byte { + u := math.Float64bits(f) + by = append(by, typeDOUBLE) + by = append(by, byte(u)) + by = append(by, byte(u>>8)) + by = append(by, byte(u>>16)) + by = append(by, byte(u>>24)) + by = append(by, byte(u>>32)) + by = append(by, byte(u>>40)) + by = append(by, byte(u>>48)) + by = append(by, byte(u>>56)) + return by +} + +func (e *Encoder) encodeString(by []byte, s string, isKeyOrClass bool, strTable map[string]int) []byte { + if !e.DisableDedup && isKeyOrClass { + if copyOffs, ok := strTable[s]; ok { + by = append(by, typeCOPY) + by = varint(by, uint(copyOffs)) + return by + } + strTable[s] = len(by) + } + + by = append(by, typeSTR_UTF8) + by = varint(by, uint(len(s))) + return append(by, s...) +} + +func (e *Encoder) encodeBytes(by []byte, byt []byte, isKeyOrClass bool, strTable map[string]int) []byte { + if !e.DisableDedup && isKeyOrClass { + if copyOffs, ok := strTable[string(byt)]; ok { + by = append(by, typeCOPY) + by = varint(by, uint(copyOffs)) + return by + } + // save for later + strTable[string(byt)] = len(by) + } + + if l := len(byt); l < 32 { + by = append(by, typeSHORT_BINARY_0+byte(l)) + } else { + by = append(by, typeBINARY) + by = varint(by, uint(l)) + } + + return append(by, byt...) +} + +func (e *Encoder) encodeIntfArray(by []byte, arr []interface{}, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + if e.PerlCompat && !isRefNext { + by = append(by, typeREFN) + } + + // TODO implement ARRAYREF for small arrays + + l := len(arr) + by = append(by, typeARRAY) + by = varint(by, uint(l)) + + var err error + for i := 0; i < l; i++ { + if by, err = e.encode(by, arr[i], false, false, strTable, ptrTable); err != nil { + return nil, err + } + } + + return by, nil +} + +func (e *Encoder) encodeStrMap(by []byte, m map[string]interface{}, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + if e.PerlCompat && !isRefNext { + by = append(by, typeREFN) + } + + // TODO implement HASHREF for small maps + + by = append(by, typeHASH) + by = varint(by, uint(len(m))) + + var err error + for k, v := range m { + by = e.encodeString(by, k, true, strTable) + if by, err = e.encode(by, v, false, false, strTable, ptrTable); err != nil { + return by, err + } + } + + return by, nil +} + +/************************************* + * Encode via reflection + *************************************/ +func (e *Encoder) encodeViaReflection(b []byte, rv reflect.Value, isKeyOrClass bool, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + if !e.DisableFREEZE && rv.Kind() != reflect.Invalid && rv.Kind() != reflect.Ptr { + if m, ok := rv.Interface().(encoding.BinaryMarshaler); ok { + by, err := m.MarshalBinary() + if err != nil { + return nil, err + } + + b = append(b, typeOBJECT_FREEZE) + b = e.encodeString(b, concreteName(rv), true, strTable) + b = append(b, typeREFN) + b = append(b, typeARRAY) + b = varint(b, uint(1)) + return e.encode(b, reflect.ValueOf(by), false, false, strTable, ptrTable) + } + } + + // make sure we're looking at a real type and not an interface + for rv.Kind() == reflect.Interface { + rv = rv.Elem() + } + + var err error + switch rk := rv.Kind(); rk { + case reflect.Slice: + // uint8 case is handled in encode() + fallthrough + + case reflect.Array: + b, err = e.encodeArray(b, rv, isRefNext, strTable, ptrTable) + + case reflect.Map: + b, err = e.encodeMap(b, rv, isRefNext, strTable, ptrTable) + + case reflect.Struct: + b, err = e.encodeStruct(b, rv, strTable, ptrTable) + + case reflect.Ptr: + b, err = e.encodePointer(b, rv, strTable, ptrTable) + + default: + panic(fmt.Sprintf("no support for type '%s' (%s)", rk.String(), rv.Type())) + } + + return b, err +} + +func (e *Encoder) encodeArray(by []byte, arr reflect.Value, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + if e.PerlCompat && !isRefNext { + by = append(by, typeREFN) + } + + l := arr.Len() + by = append(by, typeARRAY) + by = varint(by, uint(l)) + + var err error + for i := 0; i < l; i++ { + if by, err = e.encode(by, arr.Index(i), false, false, strTable, ptrTable); err != nil { + return nil, err + } + } + + return by, nil +} + +func (e *Encoder) encodeMap(by []byte, m reflect.Value, isRefNext bool, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + if e.PerlCompat && !isRefNext { + by = append(by, typeREFN) + } + + keys := m.MapKeys() + by = append(by, typeHASH) + by = varint(by, uint(len(keys))) + + if e.PerlCompat { + var err error + for _, k := range keys { + by = e.encodeString(by, k.String(), true, strTable) + if by, err = e.encode(by, m.MapIndex(k), false, false, strTable, ptrTable); err != nil { + return by, err + } + } + } else { + var err error + for _, k := range keys { + if by, err = e.encode(by, k, true, false, strTable, ptrTable); err != nil { + return by, err + } + + if by, err = e.encode(by, m.MapIndex(k), false, false, strTable, ptrTable); err != nil { + return by, err + } + } + } + + return by, nil +} + +func (e *Encoder) encodeStruct(by []byte, st reflect.Value, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + tags := e.tcache.Get(st) + + by = append(by, typeOBJECT) + by = e.encodeBytes(by, []byte(st.Type().Name()), true, strTable) + + if e.PerlCompat { + // must be a reference + by = append(by, typeREFN) + } + + by = append(by, typeHASH) + by = varint(by, uint(len(tags))) + + var err error + for f, i := range tags { + by = e.encodeString(by, f, true, strTable) + if by, err = e.encode(by, st.Field(i), false, false, strTable, ptrTable); err != nil { + return nil, err + } + } + + return by, nil +} + +func (e *Encoder) encodePointer(by []byte, rv reflect.Value, strTable map[string]int, ptrTable map[uintptr]int) ([]byte, error) { + // ikruglov + // I don't fully understand this logic, so leave it as is :-) + + if rv.Elem().Kind() == reflect.Struct { + switch rv.Elem().Interface().(type) { + case PerlRegexp: + return e.encode(by, rv.Elem(), false, false, strTable, ptrTable) + case PerlUndef: + return e.encode(by, rv.Elem(), false, false, strTable, ptrTable) + case PerlObject: + return e.encode(by, rv.Elem(), false, false, strTable, ptrTable) + case PerlWeakRef: + return e.encode(by, rv.Elem(), false, false, strTable, ptrTable) + } + } + + rvptr := rv.Pointer() + rvptr2 := getPointer(rv.Elem()) + + offs, ok := ptrTable[rvptr] + + if !ok && rvptr2 != 0 { + offs, ok = ptrTable[rvptr2] + if ok { + rvptr = rvptr2 + } + } + + if ok { // seen this before + by = append(by, typeREFP) + by = varint(by, uint(offs)) + by[offs] |= trackFlag // original offset now tracked + } else { + lenbOrig := len(by) + + by = append(by, typeREFN) + + if rvptr != 0 { + ptrTable[rvptr] = lenbOrig + } + + var err error + by, err = e.encode(by, rv.Elem(), false, true, strTable, ptrTable) + if err != nil { + return nil, err + } + + if rvptr2 != 0 { + // The thing this this points to starts one after the current pointer + ptrTable[rvptr2] = lenbOrig + 1 + } + } + + return by, nil +} + +func varint(by []byte, n uint) []uint8 { + for n >= 0x80 { + b := byte(n) | 0x80 + by = append(by, b) + n >>= 7 + } + + return append(by, byte(n)) +} + +func getPointer(rv reflect.Value) uintptr { + var rvptr uintptr + + switch rv.Kind() { + case reflect.Map, reflect.Slice: + rvptr = rv.Pointer() + case reflect.Interface: + // FIXME: still needed? + return getPointer(rv.Elem()) + case reflect.Ptr: + rvptr = rv.Pointer() + case reflect.String: + ps := (*reflect.StringHeader)(unsafe.Pointer(rv.UnsafeAddr())) + rvptr = ps.Data + } + + return rvptr +} + +func concreteName(value reflect.Value) string { + return value.Type().PkgPath() + "." + value.Type().Name() +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/errors.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/errors.go new file mode 100644 index 0000000..c41fd4a --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/errors.go @@ -0,0 +1,41 @@ +package sereal + +import "errors" + +// Errors +var ( + ErrBadHeaderUTF8 = errors.New("bad header: it seems your document was accidentally UTF-8 encoded") + ErrBadHeader = errors.New("bad header: not a valid Sereal document") + ErrBadSnappy = errors.New("snappy compression only valid for v1 documents") + ErrBadZlibV3 = errors.New("zlib compression only valid for v3 documents and up") + + ErrHeaderPointer = errors.New("expected pointer for header") + ErrBodyPointer = errors.New("expected pointer for body") + + ErrTruncated = errors.New("truncated document") + ErrUnknownTag = errors.New("unknown tag byte") + + ErrTooLarge = errors.New("sereal: document too large to be compressed with snappy") +) + +// ErrCorrupt is returned if the sereal document was corrupt +type ErrCorrupt struct{ Err string } + +// internal constants used for corrupt +var ( + errBadSliceSize = "bad size for slice" + errBadStringSize = "bad size for string" + errBadOffset = "bad offset" + errUntrackedOffsetREFP = "untracked offset for REFP" + errBadHashSize = "bad size for hash" + errStringish = "expected stringish for classname" + errUntrackedOffsetAlias = "untracked offset for alias" + errNestedCOPY = "bad nested copy tag" + errBadVarint = "bad varint" + errFreezeNotRefnArray = "OBJECT_FREEZE value not REFN+ARRAY" + errFreezeNotArray = "OBJECT_FREEZE value not an array" + errFreezeMultipleElts = "OBJECT_FREEZE array contains multiple elements" + errFreezeNotByteSlice = "OBJECT_FREEZE array not []byte" +) + +func (c ErrCorrupt) Error() string { return "sereal: corrupt document" } diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/fuzz.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/fuzz.go new file mode 100644 index 0000000..fe98121 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/fuzz.go @@ -0,0 +1,39 @@ +// +build gofuzz + +package sereal + +func Fuzz(data []byte) int { + var m interface{} + + header, err := readHeader(data) + if err != nil { + return 0 + } + + bodyStart := headerSize + header.suffixSize + + if bodyStart > len(data) || bodyStart < 0 { + return 0 + } + + switch header.version { + case 1, 2, 3: + break + default: + return 0 + } + + switch header.doctype { + case serealRaw: + break + case serealSnappy, serealSnappyIncremental, serealZlib: + // ignore compressed data + return 0 + } + + if err := Unmarshal(data, &m); err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/merge.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/merge.go new file mode 100644 index 0000000..204aadf --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/merge.go @@ -0,0 +1,692 @@ +package sereal + +import ( + "encoding/binary" + "errors" + "fmt" + "math" + "sort" +) + +type topLevelElementType int + +// Top-level data structures for merged documents +const ( + TopLevelArray topLevelElementType = iota + TopLevelArrayRef + // TopLevelHash + // TopLevelHashRef +) + +const hashKeysValuesFlag = uint32(1 << 31) + +// Merger merges multiple sereal documents without reconstructing them +type Merger struct { + buf []byte + strTable map[string]int + objTable map[string]int + version int + length int + lenOffset int + bodyOffset int // 1-based + + // public arguments + + // TopLevelElement allows a user to choose what container will be used + // at top level. Available options: array, arrayref, hash, hashref + TopLevelElement topLevelElementType + + // optionally compress the main payload of the document using SnappyCompressor or ZlibCompressor + // CompressionThreshold specifies threshold in bytes above which compression is attempted: 1024 bytes by default + Compression compressor + CompressionThreshold int + + // If enabled, merger will deduplicate all strings it meets. + // Otherwise, only hash key and class names will be deduplicated + DedupeStrings bool + + // If enabled, KeepFlat keeps flat structture of final document. + // Specifically, consider two arrays [A,B,C] and [D,E,F]: + // - when KeepFlat == false, the result of merging is [[A,B,C],[D,E,F]] + // - when KeepFlat == true, the result is [A,B,C,D,E,F] + // This mode is relevant only to top level elements + KeepFlat bool + + // give a hint to encoder about expected size of encoded data + ExpectedSize uint + + // moved bool fields here to make struct smaller + inited bool + finished bool +} + +type mergerDoc struct { + buf []byte + trackIdxs []int + trackTable map[int]int + version int + startIdx int // 0-based + bodyOffset int // 1-based +} + +// NewMerger returns a merger using the latest sereal version +func NewMerger() *Merger { + return &Merger{ + TopLevelElement: TopLevelArrayRef, + CompressionThreshold: 1024, + } +} + +// NewMergerV2 returns a merger for processing sereal v2 documents +func NewMergerV2() *Merger { + return &Merger{ + version: 2, + TopLevelElement: TopLevelArrayRef, + CompressionThreshold: 1024, + } +} + +// NewMergerV3 returns a merger for processing sereal v3 documents +func NewMergerV3() *Merger { + return &Merger{ + version: 3, + TopLevelElement: TopLevelArrayRef, + CompressionThreshold: 1024, + } +} + +func (m *Merger) initMerger() error { + if m.inited { + return nil + } + + // initialize internal fields + m.strTable = make(map[string]int) + m.objTable = make(map[string]int) + + if m.ExpectedSize > 0 { + m.buf = make([]byte, headerSize, m.ExpectedSize) + } else { + m.buf = make([]byte, headerSize) + } + + if m.version == 0 { + m.version = ProtocolVersion + } + + switch { + case m.version > ProtocolVersion: + return fmt.Errorf("protocol version '%v' not yet supported", m.version) + case m.version < 3: + binary.LittleEndian.PutUint32(m.buf[:4], magicHeaderBytes) + default: + binary.LittleEndian.PutUint32(m.buf[:4], magicHeaderBytesHighBit) + } + + m.buf[4] = byte(m.version) // fill version + m.buf = append(m.buf, 0) // no header + m.bodyOffset = len(m.buf) - 1 // remember body offset + + // append top level tags + switch m.TopLevelElement { + case TopLevelArray: + m.buf = append(m.buf, typeARRAY) + case TopLevelArrayRef: + m.buf = append(m.buf, typeREFN, typeARRAY) + default: + return errors.New("invalid TopLevelElement") + } + + // remember len offset + pad bytes for length + m.lenOffset = len(m.buf) + for i := 0; i < binary.MaxVarintLen32; i++ { + m.buf = append(m.buf, typePAD) + } + + m.inited = true + return nil +} + +// Append adds the sereal document b and returns the number of elements added to the top-level structure +func (m *Merger) Append(b []byte) (int, error) { + if err := m.initMerger(); err != nil { + return 0, err + } + + if m.finished { + return 0, errors.New("finished document") + } + + docHeader, err := readHeader(b) + if err != nil { + return 0, err + } + + doc := mergerDoc{ + buf: b[headerSize+docHeader.suffixSize:], + version: int(docHeader.version), + startIdx: 0, + bodyOffset: -1, // 1-based offsets + } + + var decomp decompressor + switch docHeader.doctype { + case serealRaw: + // nothing + + case serealSnappy: + if doc.version != 1 { + return 0, errors.New("snappy compression only valid for v1 documents") + } + + decomp = SnappyCompressor{Incremental: false} + + case serealSnappyIncremental: + decomp = SnappyCompressor{Incremental: true} + + case serealZlib: + if doc.version < 3 { + return 0, errors.New("zlib compression only valid for v3 documents and up") + } + + decomp = ZlibCompressor{} + + default: + return 0, fmt.Errorf("document type '%d' not yet supported", docHeader.doctype) + } + + if decomp != nil { + if doc.buf, err = decomp.decompress(doc.buf); err != nil { + return 0, err + } + } + + oldLength := m.length + lastElementOffset := len(m.buf) + + // first pass: build table of tracked tags + if err := m.buildTrackTable(&doc); err != nil { + return 0, err + } + + // preallocate memory + // copying data from doc.buf might seem to be unefficient, + // but profiling/benchmarking shows that there is no + // difference between growing slice by append() or via new() + copy() + m.buf = append(m.buf, doc.buf...) + m.buf = m.buf[:lastElementOffset] + + // second pass: do the work + if err := m.mergeItems(&doc); err != nil { + m.buf = m.buf[0:lastElementOffset] // remove appended stuff + return 0, err + } + + return m.length - oldLength, nil +} + +// Finish is called to terminate the merging process +func (m *Merger) Finish() ([]byte, error) { + if err := m.initMerger(); err != nil { + return m.buf, err + } + + if !m.finished { + m.finished = true + binary.PutUvarint(m.buf[m.lenOffset:], uint64(m.length)) + + if m.Compression != nil && (m.CompressionThreshold == 0 || len(m.buf) >= m.CompressionThreshold) { + compressed, err := m.Compression.compress(m.buf[m.bodyOffset+1:]) + if err != nil { + return m.buf, err + } + + // TODO think about some optimizations here + copy(m.buf[m.bodyOffset+1:], compressed) + m.buf = m.buf[:len(compressed)+m.bodyOffset+1] + + // verify compressor, there was little point in veryfing compressor in initMerger() + // because use can change it meanwhile + switch comp := m.Compression.(type) { + case SnappyCompressor: + if !comp.Incremental { + return nil, errors.New("non-incremental snappy compression is not supported") + } + + m.buf[4] |= byte(serealSnappyIncremental) << 4 + + case ZlibCompressor: + if m.version < 3 { + return nil, errors.New("zlib compression only valid for v3 documents and up") + } + + m.buf[4] |= byte(serealZlib) << 4 + + default: + return nil, errors.New("unknown compressor") + } + } + } + + return m.buf, nil +} + +func (m *Merger) buildTrackTable(doc *mergerDoc) error { + buf := doc.buf + idx := doc.startIdx + if idx < 0 || idx > len(buf) { + return errors.New("invalid index") + } + + doc.trackTable = make(map[int]int) + doc.trackIdxs = make([]int, 0) + + for idx < len(buf) { + tag := buf[idx] + + if (tag & trackFlag) == trackFlag { + doc.trackTable[idx-doc.bodyOffset] = -1 + tag &^= trackFlag + } + + //fmt.Printf("%x (%x) at %d (%d)\n", tag, buf[idx], idx, idx - doc.bodyOffset) + + switch { + case tag < typeVARINT, + tag == typePAD, tag == typeREFN, tag == typeWEAKEN, + tag == typeUNDEF, tag == typeCANONICAL_UNDEF, + tag == typeTRUE, tag == typeFALSE, tag == typeEXTEND, + tag == typeREGEXP, tag == typeOBJECT, tag == typeOBJECT_FREEZE: + idx++ + + case tag == typeVARINT, tag == typeZIGZAG: + _, sz, err := varintdecode(buf[idx+1:]) + if err != nil { + return err + } + idx += sz + 1 + + case tag == typeFLOAT: + idx += 5 // 4 bytes + tag + + case tag == typeDOUBLE: + idx += 9 // 8 bytes + tag + + case tag == typeLONG_DOUBLE: + idx += 17 // 16 bytes + tag + + case tag == typeBINARY, tag == typeSTR_UTF8: + ln, sz, err := varintdecode(buf[idx+1:]) + if err != nil { + return err + } + idx += sz + ln + 1 + + if ln < 0 || ln > math.MaxUint32 { + return fmt.Errorf("bad size for string: %d", ln) + } else if idx > len(buf) { + return fmt.Errorf("truncated document, expect %d bytes", len(buf)-idx) + } + + case tag == typeARRAY, tag == typeHASH: + _, sz, err := varintdecode(buf[idx+1:]) + if err != nil { + return err + } + idx += sz + 1 + + case tag == typeCOPY, tag == typeALIAS, tag == typeREFP, + tag == typeOBJECTV, tag == typeOBJECTV_FREEZE: + + offset, sz, err := varintdecode(buf[idx+1:]) + if err != nil { + return err + } + if offset < 0 || offset >= idx { + return fmt.Errorf("tag %d refers to invalid offset: %d", tag, offset) + } + + doc.trackTable[offset] = -1 + idx += sz + 1 + + case tag >= typeARRAYREF_0 && tag < typeARRAYREF_0+16: + idx++ + + case tag >= typeHASHREF_0 && tag < typeHASHREF_0+16: + idx++ + + case tag >= typeSHORT_BINARY_0 && tag < typeSHORT_BINARY_0+32: + idx += 1 + int(tag&0x1F) + + // case tag == typeMANY: TODO + case tag == typePACKET_START: + return errors.New("unexpected start of new document") + + default: + return fmt.Errorf("unknown tag: %d (0x%x) at offset %d", tag, tag, idx) + } + } + + for idx := range doc.trackTable { + doc.trackIdxs = append(doc.trackIdxs, idx) + } + + sort.Ints(doc.trackIdxs) + return nil +} + +func (m *Merger) mergeItems(doc *mergerDoc) error { + mbuf := m.buf + dbuf := doc.buf + didx := doc.startIdx + + expElements, offset, err := m.expectedElements(dbuf[didx:]) + if err != nil { + return err + } + if expElements < 0 || expElements > math.MaxUint32 { + return fmt.Errorf("bad amount of expected elements: %d", expElements) + } + + didx += offset + + // stack is needed for three things: + // - keep track of expected things + // - verify document consistency + // if a value put on stack has the highest significant bit on, + // it means that hash keys/values are processed + stack := make([]uint32, 0, 16) // preallocate 16 nested levels + stack = append(stack, uint32(expElements)) + +LOOP: + for didx < len(dbuf) { + tag := dbuf[didx] + tag &^= trackFlag + + docRelativeIdx := didx - doc.bodyOffset + mrgRelativeIdx := len(mbuf) - m.bodyOffset + trackme := len(doc.trackIdxs) > 0 && doc.trackIdxs[0] == docRelativeIdx + + level := len(stack) - 1 + for stack[level]&^hashKeysValuesFlag == 0 { + stack = stack[:level] + level-- + + if level < 0 { + break LOOP + } + } + + // If m.DedupeStrings is true - dedup all strings, otherwise dedup only hash keys and class names. + // The trick with stack[level] % 2 == 0 works because stack[level] for hashes is always even at + // the beggining (for each item in hash we expect key and value). In practise it means, + // that if stack[level] is even - a key is being processed, if stack[level] is odd - value is being processed + dedupString := m.DedupeStrings || ((stack[level]&hashKeysValuesFlag) == hashKeysValuesFlag && stack[level]%2 == 0) + + //fmt.Printf("0x%x (0x%x) at didx: %d (rlt: %d) len(dbuf): %d\n", tag, dbuf[didx], didx, didx-doc.bodyOffset, len(dbuf)) + //fmt.Printf("level: %d, value: %d len: %d\n", level, stack[level], len(stack)) + //fmt.Println("------") + + switch { + case tag < typeVARINT, tag == typeUNDEF, tag == typeCANONICAL_UNDEF, tag == typeTRUE, tag == typeFALSE, tag == typeSHORT_BINARY_0: + mbuf = append(mbuf, dbuf[didx]) + didx++ + + case tag == typePAD, tag == typeREFN, tag == typeWEAKEN, tag == typeEXTEND: + // this elemets are fake ones, so stack counter should not be decreased + // but, I don't want to create another if-branch, so fake it + stack[level]++ + mbuf = append(mbuf, dbuf[didx]) + didx++ + + case tag == typeVARINT, tag == typeZIGZAG: + _, sz, err := varintdecode(dbuf[didx+1:]) + if err != nil { + return err + } + mbuf = append(mbuf, dbuf[didx:didx+sz+1]...) + didx += sz + 1 + + case tag == typeFLOAT: + mbuf = append(mbuf, dbuf[didx:didx+5]...) + didx += 5 // 4 bytes + tag + + case tag == typeDOUBLE: + mbuf = append(mbuf, dbuf[didx:didx+9]...) + didx += 9 // 8 bytes + tag + + case tag == typeLONG_DOUBLE: + mbuf = append(mbuf, dbuf[didx:didx+17]...) + didx += 17 // 16 bytes + tag + + case tag == typeSHORT_BINARY_0+1: + mbuf = append(mbuf, dbuf[didx:didx+2]...) + didx += 2 + + case tag == typeBINARY, tag == typeSTR_UTF8, tag > typeSHORT_BINARY_0+1 && tag < typeSHORT_BINARY_0+32: + // I don't want to call readString here because of performance reasons: + // this path is the hot spot, so keep it overhead-free as much as possible + + var ln, sz int + if tag > typeSHORT_BINARY_0 { + ln = int(tag & 0x1F) // get length from tag + } else { + var err error + ln, sz, err = varintdecode(dbuf[didx+1:]) + if err != nil { + return err + } + } + + length := sz + ln + 1 + if ln < 0 || ln > math.MaxUint32 { + return fmt.Errorf("bad size for string: %d", ln) + } else if didx+length > len(dbuf) { + return fmt.Errorf("truncated document, expect %d bytes", len(dbuf)-didx-length) + } + + if dedupString { + val := dbuf[didx+sz+1 : didx+length] + if savedOffset, ok := m.strTable[string(val)]; ok { + mbuf = appendTagVarint(mbuf, typeCOPY, uint(savedOffset)) + mrgRelativeIdx = savedOffset + } else { + m.strTable[string(val)] = mrgRelativeIdx + mbuf = append(mbuf, dbuf[didx:didx+length]...) + } + } else { + mbuf = append(mbuf, dbuf[didx:didx+length]...) + } + + didx += length + + case tag == typeCOPY, tag == typeREFP, tag == typeALIAS, + tag == typeOBJECTV, tag == typeOBJECTV_FREEZE: + + offset, sz, err := varintdecode(dbuf[didx+1:]) + if err != nil { + return err + } + targetOffset, ok := doc.trackTable[offset] + + if !ok || targetOffset < 0 { + return errors.New("bad target offset at COPY, ALIAS or REFP tag") + } + + mbuf = appendTagVarint(mbuf, dbuf[didx], uint(targetOffset)) + didx += sz + 1 + + if tag == typeALIAS || tag == typeREFP { + mbuf[targetOffset] |= trackFlag + } else if tag == typeOBJECTV || tag == typeOBJECTV_FREEZE { + stack = append(stack, 1) + } + + case tag == typeARRAY, tag == typeHASH: + ln, sz, err := varintdecode(dbuf[didx+1:]) + if err != nil { + return err + + } + if ln < 0 { + return errors.New("bad array or hash length") + } + + mbuf = append(mbuf, dbuf[didx:didx+sz+1]...) + didx += sz + 1 + + if tag == typeHASH { + stack = append(stack, uint32(ln*2)|hashKeysValuesFlag) + } else { + stack = append(stack, uint32(ln)) + } + + case (tag >= typeARRAYREF_0 && tag < typeARRAYREF_0+16) || (tag >= typeHASHREF_0 && tag < typeHASHREF_0+16): + mbuf = append(mbuf, dbuf[didx]) + didx++ + + // for hash read 2*ln items + if tag >= typeHASHREF_0 { + stack = append(stack, uint32(tag&0xF*2)|hashKeysValuesFlag) + } else { + stack = append(stack, uint32(tag&0xF)) + } + + case tag == typeREGEXP: + offset, str, err := readString(dbuf[didx+1:]) + if err != nil { + return err + } + + sizeToCopy := offset + len(str) + 1 + offset, str, err = readString(dbuf[didx+sizeToCopy:]) + if err != nil { + return err + } + + sizeToCopy += offset + len(str) + mbuf = append(mbuf, dbuf[didx:didx+sizeToCopy]...) + didx += sizeToCopy + + case tag == typeOBJECT, tag == typeOBJECT_FREEZE: + // skip main tag for a second, and parse + offset, str, err := readString(dbuf[didx+1:]) + if err != nil { + return err + } + + length := offset + len(str) + 1 // respect typeOBJECT tag + if savedOffset, ok := m.objTable[string(str)]; ok { + if tag == typeOBJECT { + mbuf = appendTagVarint(mbuf, typeOBJECTV, uint(savedOffset)) + } else { + mbuf = appendTagVarint(mbuf, typeOBJECTV_FREEZE, uint(savedOffset)) + } + + mrgRelativeIdx = savedOffset + } else { + // +1 because we should refer to string tag, not object tag + mrgRelativeIdx++ + m.objTable[string(str)] = mrgRelativeIdx + mbuf = append(mbuf, dbuf[didx:didx+length]...) + } + + // parse + stack = append(stack, 1) + didx += length + + case tag == typePACKET_START: + return errors.New("unexpected start of new document") + + default: + // TODO typeMANY + return fmt.Errorf("unknown tag: %d (0x%x) at offset %d", tag, tag, didx) + } + + stack[level]-- + + if trackme { + // if tag is tracked, remember its offset + doc.trackTable[docRelativeIdx] = mrgRelativeIdx + doc.trackIdxs = doc.trackIdxs[1:] + } + } + + m.length += expElements + m.buf = mbuf + return nil +} + +func (m *Merger) expectedElements(b []byte) (int, int, error) { + if m.KeepFlat { + tag0 := b[0] &^ trackFlag + tag1 := b[1] &^ trackFlag + + switch m.TopLevelElement { + case TopLevelArray: + if tag0 == typeARRAY { + ln, sz, err := varintdecode(b[1:]) + return ln, sz + 1, err + } + + case TopLevelArrayRef: + if tag0 == typeREFN && tag1 == typeARRAY { + ln, sz, err := varintdecode(b[2:]) + return ln, sz + 2, err + } else if tag0 >= typeARRAYREF_0 && tag0 < typeARRAYREF_0+16 { + return int(tag0 & 0xF), 1, nil + } + } + } + + return 1, 0, nil // by default expect only one element +} + +func isShallowStringish(tag byte) bool { + return tag == typeBINARY || tag == typeSTR_UTF8 || (tag >= typeSHORT_BINARY_0 && tag < typeSHORT_BINARY_0+32) +} + +func readString(buf []byte) (int, []byte, error) { + tag := buf[0] + tag &^= trackFlag + + if !isShallowStringish(tag) { + return 0, nil, fmt.Errorf("expected stringish but found %d (0x%x)", int(tag), int(tag)) + } + + var ln, offset int + if tag > typeSHORT_BINARY_0 { + ln = int(tag & 0x1F) // get length from tag + } else { + var err error + ln, offset, err = varintdecode(buf[1:]) + if err != nil { + return 0, nil, err + } + } + + offset++ // respect tag itself + if ln < 0 || ln > math.MaxUint32 { + return 0, nil, fmt.Errorf("bad size for string: %d", ln) + } else if offset+ln > len(buf) { + return 0, nil, fmt.Errorf("truncated document, expect %d bytes", len(buf)-ln-offset) + } + + return offset, buf[offset : offset+ln], nil +} + +func appendTagVarint(by []byte, tag byte, n uint) []uint8 { + // the slice should be allocated on stack due to escape analysis + varintBuf := make([]byte, binary.MaxVarintLen64) + varintBuf[0] = tag + + idx := 1 + for n >= 0x80 { + varintBuf[idx] = byte(n) | 0x80 + n >>= 7 + idx++ + } + + varintBuf[idx] = byte(n) + return append(by, varintBuf[:idx+1]...) +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/merger_test.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/merger_test.go new file mode 100644 index 0000000..5febcf5 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/merger_test.go @@ -0,0 +1,39 @@ +package sereal + +import ( + "io/ioutil" + "math/rand" + "path/filepath" + "testing" + "time" +) + +func BenchmarkMerger(b *testing.B) { + files, _ := filepath.Glob("data/*.srl") + if files == nil { + b.Fatal("no files found") + } + + var data [][]byte + for _, file := range files { + buf, ok := ioutil.ReadFile(file) + if ok != nil { + b.Fatal("failed to read file: " + file) + } + + data = append(data, buf) + } + + b.ResetTimer() + + m := NewMerger() + r := rand.New(rand.NewSource(time.Now().UnixNano())) + + for i := 0; i < b.N; i++ { + buf := data[r.Int()%len(data)] + _, err := m.Append(buf) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/perl.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/perl.go new file mode 100644 index 0000000..f324e70 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/perl.go @@ -0,0 +1,49 @@ +package sereal + +// types for emulating perl data structure + +// PerlObject represents a perl blessed reference +type PerlObject struct { + Class string + Reference interface{} +} + +// PerlAlias represents an aliased value +type PerlAlias struct { + Alias interface{} +} + +// PerlWeakRef represents a weak reference +type PerlWeakRef struct { + Reference interface{} +} + +// PerlUndef represents perl's "undef" value +type PerlUndef struct { + canonical bool +} + +// perlCanonicalUndef is the value that represents the perl's PL_sv_undef and +// is encoded via the CANONICAL_UNDEF tag. It must be the only instance having +// the canonical field set to true. +var perlCanonicalUndef = &PerlUndef{canonical: true} + +// PerlCanonicalUndef returns a value that represents perl's shared undef (PL_sv_undef). +// +// For more details see +// https://github.com/Sereal/Sereal/blob/master/sereal_spec.pod#user-content-dealing-with-undefined-values +func PerlCanonicalUndef() *PerlUndef { + return perlCanonicalUndef +} + +// PerlRegexp represents a perl regular expression +type PerlRegexp struct { + Pattern []byte + Modifiers []byte +} + +// PerlFreeze represents an object's custom Freeze implementation +type PerlFreeze struct { + Class string + Data []byte +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/sereal_test.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/sereal_test.go new file mode 100644 index 0000000..c18fe7c --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/sereal_test.go @@ -0,0 +1,904 @@ +package sereal + +import ( + "bytes" + "encoding/hex" + "errors" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "strconv" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" +) + +var roundtrips = []interface{}{ + true, + false, + 1, + 10, + 100, + 200, + 300, + 0, + -1, + -15, + 15, + -16, + 16, + 17, + -17, + -2613115362782646504, + uint(0xdbbc596c24396f18), + "hello", + "hello, world", + "twas brillig and the slithy toves and gyre and gimble in the wabe", + float32(2.2), + float32(9891234567890.098), + float64(2.2), + float64(9891234567890.098), + []interface{}{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, + []interface{}{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + []interface{}{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + []interface{}{1, 100, 1000, 2000, 0xdeadbeef, float32(2.2), "hello, world", map[string]interface{}{"foo": []interface{}{1, 2, 3}}}, + map[string]interface{}{"foo": 1, "bar": 2, "baz": "qux"}, +} + +func TestRoundtripGo(t *testing.T) { + testRoundtrip(t, false, 1) + testRoundtrip(t, false, 2) +} + +func TestRoundtripPerl(t *testing.T) { + testRoundtrip(t, true, 1) + testRoundtrip(t, true, 2) +} + +func testRoundtrip(t *testing.T, perlCompat bool, version int) { + + e := &Encoder{PerlCompat: perlCompat, version: version} + d := &Decoder{PerlCompat: false} + + for _, v := range roundtrips { + b, err := e.Marshal(v) + if err != nil { + t.Errorf("failed marshalling with perlCompat=%t : %v: %s\n", perlCompat, v, err) + } + var unp interface{} + + err = d.Unmarshal(b, &unp) + if err != nil { + t.Errorf("perl compat: error during unmarshall: %s\n", err) + } + if !reflect.DeepEqual(v, unp) { + t.Errorf("failed roundtripping with perlCompat=%t: %#v: got %#v\n", perlCompat, v, unp) + } + } +} + +func TestRoundtripCompat(t *testing.T) { + + input := []interface{}{map[string]interface{}{"foo": []interface{}{1, 2, 3}}} + expectGo := []interface{}{map[string]interface{}{"foo": []interface{}{1, 2, 3}}} + expectPerlCompat := &[]interface{}{&map[string]interface{}{"foo": &[]interface{}{1, 2, 3}}} + + e := &Encoder{} + d := &Decoder{} + + noCompat, _ := e.Marshal(input) + + e.PerlCompat = true + perlCompat, _ := e.Marshal(input) + + // no perl compat on encode, no perl compat on decode + var nono interface{} + err := d.Unmarshal(noCompat, &nono) + if err != nil { + t.Errorf("perl compat: error during unmarshall: %s\n", err) + } + if !reflect.DeepEqual(expectGo, nono) { + t.Errorf("perl compat: no no failed: got %#v\n", nono) + } + + // perl compat on encode, no perl compat on decode + var yesno interface{} + err = d.Unmarshal(perlCompat, &yesno) + if err != nil { + t.Errorf("perl compat: error during unmarshall: %s\n", err) + } + if !reflect.DeepEqual(expectGo, yesno) { + t.Errorf("perl compat: yes no failed: got %#v\n", yesno) + } + + d.PerlCompat = true + + // no perl compat on encode, perl compat on decode + var noyes interface{} + err = d.Unmarshal(noCompat, &noyes) + if err != nil { + t.Errorf("perl compat: error during unmarshall: %s\n", err) + } + + if !reflect.DeepEqual(expectGo, noyes) { + t.Errorf("perl compat: no yes failed: got %#v\n", noyes) + } + + // perl compat on encode, yes perl compat on decode + var yesyes interface{} + + err = d.Unmarshal(perlCompat, &yesyes) + if err != nil { + t.Errorf("perl compat: error during unmarshall: %s\n", err) + } + + if !reflect.DeepEqual(expectPerlCompat, yesyes) { + t.Errorf("perl compat: yes yes failed: got %#v\n", yesyes) + } +} + +/* + * To make the corpus of test files: + * perl -I Perl/shared/t/lib/ -MSereal::TestSet -MSereal::Encoder -e'Sereal::TestSet::write_test_files("test_dir")' + * + * This runs the Decoder/Encoder over every file in the supplied directory and tells you when the bytes the encoder + * outputs do not match the bytes in the test file. The purpose is to check if roundtripping to Perl type + * datastructures works. + * + * If you pass a file as parameter it will do the same but do more detailed logging. + * + */ +func TestCorpus(t *testing.T) { + + e := &Encoder{PerlCompat: true} + d := &Decoder{PerlCompat: true} + + _ = e + + debug := false + + corpusFiles, err := filepath.Glob("test_dir/test_data_?????") + + // corpusFiles, err = filepath.Glob("test_dir/test_data_00028") + // debug = true + + if err != nil { + t.Errorf("error opening test_dir: %v", err) + return + } + + for _, corpusFile := range corpusFiles { + + contents, err := ioutil.ReadFile(corpusFile) + + if err != nil { + t.Errorf("error opening test_dir/%s: %v", corpusFile, err) + return + } + + var value interface{} + + if debug { + t.Log("unmarshalling..") + t.Log(hex.Dump(contents)) + } + err = d.Unmarshal(contents, &value) + + if debug { + t.Log("done") + } + + if err != nil { + t.Errorf("unpacking %s generated an error: %v", corpusFile, err) + continue + } + + if debug { + t.Log("marshalling") + t.Log("value=", spew.Sdump(value)) + t.Logf(" =%#v\n", value) + } + b, err := e.Marshal(value) + + if debug { + t.Log("done") + t.Log(hex.Dump(b)) + } + + if err != nil { + t.Errorf("packing %s generated an error: %v", corpusFile, err) + continue + } + + ioutil.WriteFile(corpusFile+"-go.out", b, 0600) + } +} + +func TestSnappyArray(t *testing.T) { + + e := &Encoder{} + d := &Decoder{} + + // test many duplicated strings -- this uses both the string table and snappy compressiong + // this ensures we're not messing up the offsets when decoding + + manydups := make([]string, 2048) + for i := 0; i < len(manydups); i++ { + manydups[i] = "hello, world " + strconv.Itoa(i%10) + } + + encoded, err := e.Marshal(manydups) + if err != nil { + t.Errorf("encoding a large array generated an error: %v", err) + return + } + + e.Compression = SnappyCompressor{Incremental: true} + e.CompressionThreshold = 0 // always compress + snencoded, err := e.Marshal(manydups) + + if err != nil { + t.Fatalf("snappy encoding a large array generated an error: %v", err) + } + + if len(encoded) <= len(snencoded) { + t.Fatalf("snappy failed to compress redundant array: encoded=%d snappy=%d\n", len(encoded), len(snencoded)) + } + + var decoded []string + err = d.Unmarshal(snencoded, &decoded) + if err != nil { + t.Fatalf("snappy decoding generated error: %v", err) + } + + if len(decoded) != 2048 { + t.Fatalf("got wrong number of elements back: wanted=%d got=%d\n", len(manydups), len(decoded)) + } + + for i := 0; i < 2048; i++ { + s := decoded[i] + expected := "hello, world " + strconv.Itoa(i%10) + if s != expected { + t.Errorf("failed decompressing many-dup string: s=%s expected=%s", s, expected) + } + } +} + +func TestStructs(t *testing.T) { + + type A struct { + Name string + Phone string + Siblings int + Spouse bool + Money float64 + } + + // some people + Afoo := A{"mr foo", "12345", 10, true, 123.45} + Abar := A{"mr bar", "54321", 5, false, 321.45} + Abaz := A{"mr baz", "15243", 20, true, 543.21} + + type nested1 struct { + Person A + } + + type nested struct { + Nested1 nested1 + } + + type private struct { + pbool bool + pstr string + pint int + } + + type semiprivate struct { + Bool bool + pbool bool + String string + pstr string + pint int + } + + type ATags struct { + Name string `sereal:"Phone"` + Phone string `sereal:"Name"` + Siblings int // no tag, isn't unpacked + } + + type ALowerTags struct { + Name string `sereal:"name"` + Phone string `sereal:"phone"` + } + + tests := []struct { + what string + input interface{} + outvar interface{} + expected interface{} + }{ + { + "struct with fields", + Afoo, + A{}, + Afoo, + }, + { + "struct with fields into map", + Afoo, + map[string]interface{}{}, + map[string]interface{}{ + "Name": "mr foo", + "Phone": "12345", + "Siblings": 10, + "Spouse": true, + "Money": 123.45, + }, + }, + { + "decode struct with tags", + Afoo, + ATags{}, + ATags{Name: "12345", Phone: "mr foo", Siblings: 0}, + }, + { + "encode struct with tags", + ATags{Name: "12345", Phone: "mr foo", Siblings: 10}, + A{}, + A{Name: "mr foo", Phone: "12345"}, + }, + { + "decode struct with lower-case field names", + ALowerTags{Name: "mr foo", Phone: "12345"}, + A{}, + A{Name: "mr foo", Phone: "12345"}, + }, + { + "struct with private fields", + private{false, "hello", 3}, + private{}, // zero value for struct + private{}, + }, + { + "semi-private struct", + semiprivate{Bool: true, pbool: false, String: "world", pstr: "hello", pint: 3}, + semiprivate{}, + semiprivate{Bool: true, String: "world"}, + }, + { + "nil slice of structs", + []A{Afoo, Abar, Abaz}, + []A(nil), + []A{Afoo, Abar, Abaz}, + }, + { + "0-length slice of structs", + []A{Afoo, Abar, Abaz}, + []A{}, + []A{Afoo, Abar, Abaz}, + }, + { + "1-length slice of structs", + []A{Afoo, Abar, Abaz}, + []A{A{}}, + []A{Afoo}, + }, + { + "nested", + nested{nested1{Afoo}}, + nested{}, + nested{nested1{Afoo}}, + }, + } + + e := &Encoder{} + d := &Decoder{} + + for _, v := range tests { + + rinput := reflect.ValueOf(v.input) + + x, err := e.Marshal(rinput.Interface()) + if err != nil { + t.Errorf("error marshalling %s: %s\n", v.what, err) + continue + } + + routvar := reflect.New(reflect.TypeOf(v.outvar)) + routvar.Elem().Set(reflect.ValueOf(v.outvar)) + + err = d.Unmarshal(x, routvar.Interface()) + if err != nil { + t.Errorf("error unmarshalling %s: %s\n", v.what, err) + continue + } + + if !reflect.DeepEqual(routvar.Elem().Interface(), v.expected) { + t.Errorf("roundtrip mismatch for %s: got: %#v expected: %#v\n", v.what, routvar.Elem().Interface(), v.expected) + } + } +} + +func TestDecodeToStruct(t *testing.T) { + type obj struct { + ValueStr string + ValueByte []byte + ValueInt int + ValueSlice []float32 + ValueHash map[string][]byte + } + + exp := make([]obj, 3) + exp[0] = obj{ + ValueStr: "string as string value which actually should be 32+ characters", + ValueByte: []byte("string as binary value"), + ValueInt: 10, + ValueSlice: []float32{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0}, + ValueHash: map[string][]byte{ + "key1": []byte("unique value"), + "key2": []byte("duplicate value"), + "key3": []byte("deplicate value"), + }, + } + + exp[1] = obj{ + ValueStr: "another string as string value which actually should be 32+ characters", + ValueByte: []byte("another string as binary value"), + ValueInt: -10, + ValueSlice: []float32{18.0, 19.0, 20.0}, + ValueHash: map[string][]byte{ + "key1": []byte("unique value"), + "key2": []byte("duplicate value"), + "key3": []byte("deplicate value"), + }, + } + + exp[2] = exp[0] + + filename := "test_dir/test-decode-struct.srl" + content, err := ioutil.ReadFile(filename) + + if err != nil { + t.Skip("run 'make test_files' and try again") + return + } + + var slice []obj + d := NewDecoder() + + if err := d.Unmarshal(content, &slice); err != nil { + t.Errorf("error unmarshalling: %s", err) + } + + if !reflect.DeepEqual(exp, slice) { + t.Errorf("failed decode into struct:\n\nexp: %#v:\n\ngot %#v\n", exp, slice) + } +} + +func TestStructsWithPtrs(t *testing.T) { + type First struct{ I int } + type Second struct{ S string } + type NestedPtr struct { + A *First + B *Second + } + tests := []struct { + what string + input interface{} + outvar interface{} + expected interface{} + }{ + { + "struct with two fields of different types", + NestedPtr{&First{1}, &Second{"two"}}, + NestedPtr{}, + NestedPtr{&First{1}, &Second{"two"}}, + }, + { + "struct with two nils of different types", + NestedPtr{}, + NestedPtr{}, + NestedPtr{}, + }, + } + + e := &Encoder{} + d := &Decoder{} + + for _, v := range tests { + + rinput := reflect.ValueOf(v.input) + + x, err := e.Marshal(rinput.Interface()) + if err != nil { + t.Errorf("error marshalling %s: %s\n", v.what, err) + continue + } + + routvar := reflect.New(reflect.TypeOf(v.outvar)) + routvar.Elem().Set(reflect.ValueOf(v.outvar)) + + err = d.Unmarshal(x, routvar.Interface()) + if err != nil { + t.Errorf("error unmarshalling %s: %s\n", v.what, err) + continue + } + + for i := 0; i < routvar.Elem().NumField(); i++ { + outfield := routvar.Elem().Field(i) + outfield.Interface() + expfield := reflect.ValueOf(v.expected).Field(i) + + if !reflect.DeepEqual(outfield.Interface(), expfield.Interface()) { + t.Errorf("roundtrip mismatch for %s: got: %#v expected: %#v\n", v.what, outfield.Interface(), expfield.Interface()) + } + } + } +} + +type ErrorBinaryUnmarshaler int + +var errUnmarshaler = errors.New("error binary unmarshaler") + +func (e *ErrorBinaryUnmarshaler) UnmarshalBinary(data []byte) error { + return errUnmarshaler +} + +func TestBinaryMarshaller(t *testing.T) { + + // our data + now := time.Now() + + e := &Encoder{} + d := &Decoder{} + + x, err := e.Marshal(now) + if err != nil { + t.Errorf("error marshalling %s", err) + } + + var tm time.Time + + // unpack into something that expects the bytes + err = d.Unmarshal(x, &tm) + + if err != nil { + t.Errorf("error unmarshalling: %s", err) + } + + if !now.Equal(tm) { + t.Errorf("failed unpacking: got=%v wanted=%v\n", tm, now) + } + + // unpack into something that produces an error + var errunmarshaler ErrorBinaryUnmarshaler + err = d.Unmarshal(x, &errunmarshaler) + if err == nil { + t.Errorf("failed propagating error from unmarshaler") + } + + // unpack into something that isn't a marshaller + var i int + err = d.Unmarshal(x, &i) + if err == nil { + t.Errorf("failed to generate error trying to unpack into non-slice/unmashaler") + } + + // unpack into a byte slice + bdata, _ := now.MarshalBinary() + + var data []byte + err = d.Unmarshal(x, &data) + + if !bytes.Equal(bdata, data) { + t.Errorf("failed unpacking into byte-slice: got=%v wanted=%v\n", tm, now) + } + + // unpack into a nil interface + var intf interface{} + err = d.Unmarshal(x, &intf) + + var pfreeze *PerlFreeze + var ok bool + + if pfreeze, ok = intf.(*PerlFreeze); !ok { + t.Errorf("failed unpacking into nil interface : got=%v", intf) + } + + if pfreeze.Class != "time.Time" || !bytes.Equal(pfreeze.Data, bdata) { + t.Errorf("failed unpacking into nil interface : got=%v", pfreeze) + } + + // check that registering a type works + var registerTime time.Time + d.RegisterName("time.Time", ®isterTime) + + // unpack into a nil interface should return a time.Time + var tintf interface{} + err = d.Unmarshal(x, &tintf) + if err != nil { + t.Errorf("error unpacking registered type: %s", err) + } + + var rtime *time.Time + if rtime, ok = tintf.(*time.Time); ok { + if !now.Equal(*rtime) { + t.Errorf("failed unpacking registered type: got=%v wanted=%v\n", rtime, now) + } + } else { + t.Errorf("failed unpacking registered nil interface : got=%v", tintf) + } + + // overwrite with our error type + d.RegisterName("time.Time", &errunmarshaler) + var eintf interface{} + + err = d.Unmarshal(x, &eintf) + if err != errUnmarshaler { + t.Errorf("failed to error unpacking registered error type: %s", err) + } +} + +func TestUnmarshalHeaderError(t *testing.T) { + + testcases := []struct { + docHex string + err error + }{ + // Garbage + {"badbadbadbad", ErrBadHeader}, + // Version 1 and 2, "=srl" + {"3d73726c0100", nil}, + {"3d73726c0200", nil}, + // Version 3, "=srl" with a high-bit-set-on-the-"s" + {"3df3726c0300", nil}, + // Version 3, "=srl" corrupted by accidental UTF8 encoding + {"3dc3b3726c0300", ErrBadHeaderUTF8}, + // Forbidden version 2 and high-bit-set-on-the-"s" combination + {"3df3726c0200", ErrBadHeader}, + // Forbidden version 3 and obsolete "=srl" magic string + {"3d73726c0300", ErrBadHeader}, + // Non-existing (yet) version 4, "=srl" with a high-bit-set-on-the-"s" + {"3df3726c0400", errors.New("document version '4' not yet supported")}, + } + + d := NewDecoder() + + for i, tc := range testcases { + doc, err := hex.DecodeString(tc.docHex) + if err != nil { + t.Error(err) + continue + } + + got := d.UnmarshalHeaderBody(doc, nil, nil) + wanted := tc.err + + ok := false + ok = ok || (got == nil && wanted == nil) + ok = ok || (got != nil && wanted != nil && got.Error() == wanted.Error()) + if !ok { + t.Errorf("test case #%v:\ngot : %v\nwanted: %v", i, got, wanted) + continue + } + } +} + +func TestPrepareFreezeRoundtrip(t *testing.T) { + _, err := os.Stat("test_freeze") + if os.IsNotExist(err) { + return + } + + now := time.Now() + + type StructWithTime struct{ time.Time } + + tests := []struct { + what string + input interface{} + outvar interface{} + expected interface{} + }{ + + { + "Time", + now, + time.Time{}, + now, + }, + { + "Time_ptr", + &now, + &time.Time{}, + &now, + }, + { + "struct_Time", + StructWithTime{now}, + StructWithTime{}, + StructWithTime{now}, + }, + { + "struct_Time_ptr", + &StructWithTime{now}, + &StructWithTime{}, + &StructWithTime{now}, + }, + } + + for _, compat := range []bool{false, true} { + for _, v := range tests { + e := Encoder{PerlCompat: compat} + d := Decoder{} + + var name string + if compat { + name = "compat_" + v.what + } else { + name = v.what + } + + rinput := reflect.ValueOf(v.input) + + x, err := e.Marshal(rinput.Interface()) + if err != nil { + t.Errorf("error marshalling %s: %s\n", v.what, err) + continue + } + + err = ioutil.WriteFile("test_freeze/"+name+"-go.out", x, 0600) + if err != nil { + t.Error(err) + } + + routvar := reflect.New(reflect.TypeOf(v.outvar)) + routvar.Elem().Set(reflect.ValueOf(v.outvar)) + + err = d.Unmarshal(x, routvar.Interface()) + if err != nil { + t.Errorf("error unmarshalling %s: %s\n", v.what, err) + continue + } + + if !reflect.DeepEqual(routvar.Elem().Interface(), v.expected) { + t.Errorf("roundtrip mismatch for %s: got: %#v expected: %#v\n", v.what, routvar.Elem().Interface(), v.expected) + } + } + } +} + +func TestFreezeRoundtrip(t *testing.T) { + if os.Getenv("RUN_FREEZE") == "1" { + d := Decoder{} + + buf, err := ioutil.ReadFile("test_freeze/Time-go.out") + if err != nil { + t.Error(err) + } + var then time.Time + d.Unmarshal(buf, &then) + + type StructWithTime struct{ time.Time } + tests := []struct { + what string + outvar interface{} + expected interface{} + }{ + + { + "Time", + time.Time{}, + then, + }, + { + "Time_ptr", + &time.Time{}, + &then, + }, + { + "struct_Time", + StructWithTime{}, + StructWithTime{then}, + }, + { + "struct_Time_ptr", + &StructWithTime{}, + &StructWithTime{then}, + }, + } + + for _, v := range tests { + for _, compat := range []string{"", "compat_"} { + x, err := ioutil.ReadFile("test_freeze/" + compat + v.what + "-perl.out") + if err != nil { + t.Error(err) + } + + routvar := reflect.New(reflect.TypeOf(v.outvar)) + routvar.Elem().Set(reflect.ValueOf(v.outvar)) + + err = d.Unmarshal(x, routvar.Interface()) + if err != nil { + t.Errorf("error unmarshalling %s: %s\n", v.what, err) + continue + } + + if !reflect.DeepEqual(routvar.Elem().Interface(), v.expected) { + t.Errorf("roundtrip mismatch for %s: got: %#v expected: %#v\n", v.what, routvar.Elem().Interface(), v.expected) + } + } + } + + } +} + +func TestIssue130(t *testing.T) { + t.Skip("Issue 130") + + type AStructType struct { + EmptySlice []*AStructType + EmptySlice2 []AStructType + } + + t1 := &AStructType{} + + b, err := Marshal(t1) + if err != nil { + t.Fatal("failed to marshal:", err) + } + + t12 := &AStructType{} + err = Unmarshal(b, &t12) + if err != nil { + t.Fatal("failed to unmarshal:", err) + } + + if !reflect.DeepEqual(t1, t12) { + t.Errorf("roundtrip slice pointers failed\nwant\n%#v\ngot\n%#v", t1, t12) + } +} + +func TestIssue131(t *testing.T) { + type A struct { + T *time.Time + } + + t0 := time.Now() + a := A{T: &t0} + + b, err := Marshal(&a) + if err != nil { + t.Fatal(err) + } + + var decoded A + err = Unmarshal(b, &decoded) + if err != nil { + t.Fatal(err) + } +} + +func TestIssue135(t *testing.T) { + type A struct { + M map[string][]int + } + + u := A{M: make(map[string][]int)} + + u.M["k99"] = []int{1, 2, 3} + + b, err := Marshal(&u) + if err != nil { + t.Fatal(err) + } + + var decoded A + err = Unmarshal(b, &decoded) + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy.go new file mode 100644 index 0000000..14cf9a2 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy.go @@ -0,0 +1,53 @@ +package sereal + +import "math" + +// SnappyCompressor compresses a Sereal document using the Snappy format. +type SnappyCompressor struct { + Incremental bool // enable incremental parsing +} + +func (c SnappyCompressor) compress(b []byte) ([]byte, error) { + // XXX this could be more efficient! I'm creating a new buffer to + // store the compressed document, which isn't necessary. You + // could probably write directly to the slice after the header + // and after the varint holding the length + + if len(b) >= math.MaxUint32 { + return nil, ErrTooLarge + } + + compressed := snappyEncode(nil, b) + + if c.Incremental { + // shrink down b to reuse the allocated buffer + b = b[:0] + b = varint(b, uint(len(compressed))) + b = append(b, compressed...) + } else { + b = compressed + } + + return b, nil +} + +func (c SnappyCompressor) decompress(b []byte) ([]byte, error) { + if c.Incremental { + ln, sz, err := varintdecode(b) + if err != nil { + return nil, err + } + + if ln < 0 || sz+ln > len(b) || ln > math.MaxInt32 { + return nil, ErrCorrupt{errBadOffset} + } + b = b[sz : sz+ln] + } + + decompressed, err := snappyDecode(nil, b) + if err != nil { + return nil, err + } + + return decompressed, nil +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_cgo.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_cgo.go new file mode 100644 index 0000000..63f48b3 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_cgo.go @@ -0,0 +1,9 @@ +// +build clibs + +package sereal + +import snappy "github.com/dgryski/go-csnappy" + +func snappyEncode(dst, src []byte) []byte { return snappy.Encode(dst, src) } + +func snappyDecode(dst, src []byte) ([]byte, error) { return snappy.Decode(dst, src) } diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_purego.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_purego.go new file mode 100644 index 0000000..8bc5e0a --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/snappy_purego.go @@ -0,0 +1,9 @@ +// +build !clibs + +package sereal + +import "github.com/golang/snappy" + +func snappyEncode(dst, src []byte) []byte { return snappy.Encode(dst, src) } + +func snappyDecode(dst, src []byte) ([]byte, error) { return snappy.Decode(dst, src) } diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/tagscache.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/tagscache.go new file mode 100644 index 0000000..41fb132 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/tagscache.go @@ -0,0 +1,57 @@ +package sereal + +import "reflect" + +type tagsCache struct { + cmap map[reflect.Type]map[string]int +} + +func (tc *tagsCache) Get(ptr reflect.Value) map[string]int { + if ptr.Kind() != reflect.Struct { + return nil + } + + if tc.cmap == nil { + tc.cmap = make(map[reflect.Type]map[string]int) + } + + ptrType := ptr.Type() + if m, ok := tc.cmap[ptrType]; ok { + return m + } + + numTags := 0 + m := make(map[string]int) + + l := ptrType.NumField() + for i := 0; i < l; i++ { + field := ptrType.Field(i).Tag.Get("sereal") + if field != "" { + m[field] = i + numTags++ + } + } + + if numTags != 0 { + tc.cmap[ptrType] = m + return m + } + + // build one from the public names + for i := 0; i < l; i++ { + pkgpath := ptrType.Field(i).PkgPath + if pkgpath == "" { // exported + field := ptrType.Field(i).Name + m[field] = i + numTags++ + } + } + + if numTags != 0 { + tc.cmap[ptrType] = m + return m + } + + tc.cmap[ptrType] = nil + return nil +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/test-compat.pl b/vendor/src/github.com/Sereal/Sereal/Go/sereal/test-compat.pl new file mode 100644 index 0000000..dd53284 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/test-compat.pl @@ -0,0 +1,346 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use blib "../../Perl/Decoder/blib/"; +use blib "../../Perl/Encoder/blib/"; +use lib "../../Perl/shared/t/lib/"; + +use Sereal::Decoder qw(decode_sereal); +use Sereal::Encoder qw(encode_sereal); +use Test::More; +use Data::Dumper; + +$Data::Dumper::Indent = 0; +$Data::Dumper::Sortkeys = 1; + +sub slurp { + my $n = shift; + open (my $fh, "<", $n) or die "can't open $n: $!\n"; + local $/ = undef; + my $d = <$fh>; + return $d; +} + +# Some parts of the Sereal specification (like aliases) are deliberately not +# implemented in Go. As a result a set of tests checking omitted functionality +# will fail. To reduce a level of false negatives here we list names of all +# tests that are supposed to fail and skip them later. +# +# Multiple original tests share the same name making the following list not +# 100% reliable and accurate. To mitigate it we also maintain a counter holding +# a total number of tests to be skipped. +# +my $skip_total = 216; +my %skip = map { $_ => 1 } ( + 'array ref to aliases blessed array', + 'array ref to aliases complex hash', + 'array ref to aliases deep nest', + 'array ref to aliases double ref to foo', + 'array ref to aliases empty hash', + 'array ref to aliases empty string', + 'array ref to aliases eng-ref', + 'array ref to aliases escaped string', + 'array ref to aliases float', + 'array ref to aliases integer: -1', + 'array ref to aliases integer: -127', + 'array ref to aliases integer: -128', + 'array ref to aliases integer: -129', + 'array ref to aliases integer: -2147483647', + 'array ref to aliases integer: -2147483648', + 'array ref to aliases integer: -2147483649', + 'array ref to aliases integer: -9223372036854775807', + 'array ref to aliases integer: -9223372036854775808', + 'array ref to aliases integer: 0', + 'array ref to aliases integer: 0e0', + 'array ref to aliases integer: 0e1', + 'array ref to aliases integer: 1', + 'array ref to aliases integer: 11285066962739960988', + 'array ref to aliases integer: 126', + 'array ref to aliases integer: 127', + 'array ref to aliases integer: 128', + 'array ref to aliases integer: 129', + 'array ref to aliases integer: 18446744073709551614', + 'array ref to aliases integer: 18446744073709551615', + 'array ref to aliases integer: 1e3', + 'array ref to aliases integer: 2147483646', + 'array ref to aliases integer: 2147483647', + 'array ref to aliases integer: 2147483648', + 'array ref to aliases integer: 2147483649', + 'array ref to aliases integer: 254', + 'array ref to aliases integer: 255', + 'array ref to aliases integer: 256', + 'array ref to aliases integer: 257', + 'array ref to aliases integer: 3735928559', + 'array ref to aliases integer: 42', + 'array ref to aliases integer: 4294967295', + 'array ref to aliases integer: 9223372036854775806', + 'array ref to aliases integer: 9223372036854775807', + 'array ref to aliases integer: 9223372036854775808', + 'array ref to aliases largeish int', + 'array ref to aliases largeish negative int', + 'array ref to aliases long ascii string', + 'array ref to aliases long latin1 string', + 'array ref to aliases long utf8 string with only ascii', + 'array ref to aliases long utf8 string with only latin1 subset', + 'array ref to aliases long utf8 string', + 'array ref to aliases more complex', + 'array ref to aliases more escapes', + 'array ref to aliases negative big num', + 'array ref to aliases negative float', + 'array ref to aliases negative small float', + 'array ref to aliases float 0.1', + 'array ref to aliases float 0.2', + 'array ref to aliases float 0.3', + 'array ref to aliases float 0.4', + 'array ref to aliases float 0.5', + 'array ref to aliases float 0.6', + 'array ref to aliases float 0.7', + 'array ref to aliases float 0.8', + 'array ref to aliases float 0.9', + 'array ref to aliases small float 0.41', + 'array ref to aliases negative small float -0.13', + 'array ref to aliases complex hash with float', + 'array ref to aliases more complex with float', + 'array ref to aliases nested simple', + 'array ref to aliases positive big num', + 'array ref to aliases quote keys', + 'array ref to aliases ref to foo', + 'array ref to aliases ref to undef', + 'array ref to aliases reffy hash', + 'array ref to aliases refy array', + 'array ref to aliases regexp with inline modifiers', + 'array ref to aliases regexp with modifiers', + 'array ref to aliases short ascii string', + 'array ref to aliases short latin1 string', + 'array ref to aliases short utf8 string', + 'array ref to aliases simple array', + 'array ref to aliases simple hash', + 'array ref to aliases simple regexp', + 'array ref to aliases small float', + 'array ref to aliases small int', + 'array ref to aliases small negative int', + 'array ref to aliases undef value', + 'array ref to aliases undef', + 'array ref to aliases utf8 string', + 'array ref to aliases var strings', + 'array ref to aliases troublesome num/strs', + "array ref to aliases troublesome num/strs ' 1 '", + "array ref to aliases troublesome num/strs '0.0'", + "array ref to aliases troublesome num/strs '00000.0000'", + "array ref to aliases troublesome num/strs '0.0.0.0'", + "array ref to aliases troublesome num/strs '.0'", + "array ref to aliases troublesome num/strs ' .0'", + "array ref to aliases troublesome num/strs ' 22'", + "array ref to aliases troublesome num/strs '01'", + "array ref to aliases troublesome num/strs '01.1'", + "array ref to aliases troublesome num/strs ' 0 '", + "array ref to aliases troublesome num/strs '.0'", + "array ref to aliases troublesome num/strs '0.001'", + "array ref to aliases troublesome num/strs '.1'", + "array ref to aliases troublesome num/strs ' .1'", + "array ref to aliases troublesome num/strs '.2'", + "array ref to aliases troublesome num/strs '00'", + "array ref to aliases troublesome num/strs '.00'", + "array ref to aliases troublesome num/strs '0 but true'", + "array ref to aliases troublesome num/strs '0E0'", + "array ref to aliases largeish negative int -302001", + "array ref to aliases largeish negative int -1234567", + "array ref to aliases largeish negative int -12345678", + "array ref to aliases long ascii string 'a' x 9999", + "array ref to aliases long ascii string 'a' x 10000", + "array ref to aliases long ascii string 'a' x 10001", + "array ref to aliases long ascii string 'a' x 1023", + "array ref to aliases long ascii string 'a' x 1024", + "array ref to aliases long ascii string 'a' x 1025", + "array ref to aliases long ascii string 'a' x 8191", + "array ref to aliases long ascii string 'a' x 8192", + "array ref to aliases long ascii string 'a' x 8193", + "array ref to aliases long ascii string 'ab' x 9999", + "array ref to aliases long ascii string 'ab' x 10000", + "array ref to aliases long ascii string 'ab' x 10001", + "array ref to aliases long ascii string 'ab' x 1023", + "array ref to aliases long ascii string 'ab' x 1024", + "array ref to aliases long ascii string 'ab' x 1025", + "array ref to aliases long ascii string 'ab' x 8191", + "array ref to aliases long ascii string 'ab' x 8192", + "array ref to aliases long ascii string 'ab' x 8193", + "array ref to aliases long ascii string 'abc' x 9999", + "array ref to aliases long ascii string 'abc' x 10000", + "array ref to aliases long ascii string 'abc' x 10001", + "array ref to aliases long ascii string 'abc' x 1023", + "array ref to aliases long ascii string 'abc' x 1024", + "array ref to aliases long ascii string 'abc' x 1025", + "array ref to aliases long ascii string 'abc' x 8191", + "array ref to aliases long ascii string 'abc' x 8192", + "array ref to aliases long ascii string 'abc' x 8193", + "array ref to aliases long ascii string 'abcd' x 9999", + "array ref to aliases long ascii string 'abcd' x 10000", + "array ref to aliases long ascii string 'abcd' x 10001", + "array ref to aliases long ascii string 'abcd' x 1023", + "array ref to aliases long ascii string 'abcd' x 1024", + "array ref to aliases long ascii string 'abcd' x 1025", + "array ref to aliases long ascii string 'abcd' x 8191", + "array ref to aliases long ascii string 'abcd' x 8192", + "array ref to aliases long ascii string 'abcd' x 8193", + 'array ref to scalar refs to same largeish negative int -302001', + 'array ref to scalar refs to same largeish negative int -1234567', + 'array ref to scalar refs to same largeish negative int -12345678', + 'array ref to scalar refs to same float', + 'array ref to scalar refs to same integer: -1', + 'array ref to scalar refs to same integer: -127', + 'array ref to scalar refs to same integer: -128', + 'array ref to scalar refs to same integer: -129', + 'array ref to scalar refs to same integer: -2147483647', + 'array ref to scalar refs to same integer: -2147483648', + 'array ref to scalar refs to same integer: -2147483649', + 'array ref to scalar refs to same integer: -9223372036854775807', + 'array ref to scalar refs to same integer: -9223372036854775808', + 'array ref to scalar refs to same integer: 0', + 'array ref to scalar refs to same integer: 1', + 'array ref to scalar refs to same integer: 11285066962739960988', + 'array ref to scalar refs to same integer: 126', + 'array ref to scalar refs to same integer: 127', + 'array ref to scalar refs to same integer: 128', + 'array ref to scalar refs to same integer: 129', + 'array ref to scalar refs to same integer: 18446744073709551614', + 'array ref to scalar refs to same integer: 18446744073709551615', + 'array ref to scalar refs to same integer: 2147483646', + 'array ref to scalar refs to same integer: 2147483647', + 'array ref to scalar refs to same integer: 2147483648', + 'array ref to scalar refs to same integer: 2147483649', + 'array ref to scalar refs to same integer: 254', + 'array ref to scalar refs to same integer: 255', + 'array ref to scalar refs to same integer: 256', + 'array ref to scalar refs to same integer: 257', + 'array ref to scalar refs to same integer: 3735928559', + 'array ref to scalar refs to same integer: 42', + 'array ref to scalar refs to same integer: 4294967295', + 'array ref to scalar refs to same integer: 9223372036854775806', + 'array ref to scalar refs to same integer: 9223372036854775807', + 'array ref to scalar refs to same integer: 9223372036854775808', + 'array ref to scalar refs to same integer: 0e0', + 'array ref to scalar refs to same integer: 0e1', + 'array ref to scalar refs to same integer: 1e3', + 'array ref to scalar refs to same largeish int', + 'array ref to scalar refs to same largeish negative int', + 'array ref to scalar refs to same negative big num', + 'array ref to scalar refs to same float 0.1', + 'array ref to scalar refs to same float 0.2', + 'array ref to scalar refs to same float 0.3', + 'array ref to scalar refs to same float 0.4', + 'array ref to scalar refs to same float 0.5', + 'array ref to scalar refs to same float 0.6', + 'array ref to scalar refs to same float 0.7', + 'array ref to scalar refs to same float 0.8', + 'array ref to scalar refs to same float 0.9', + 'array ref to scalar refs to same small float 0.41', + 'array ref to scalar refs to same negative small float -0.13', + 'array ref to scalar refs to same negative float', + 'array ref to scalar refs to same negative small float', + 'array ref to scalar refs to same positive big num', + 'array ref to scalar refs to same small float', + 'array ref to scalar refs to same small int', + 'array ref to scalar refs to same small negative int', + 'repeated substructure (REFP): scalar ref', + 'scalar cross', + 'weak scalar cross', + 'weak thing copy (requires PAD)', + 'BlessedArrayCheck 1', + 'BlessedArrayCheck 2', + 'Scalar Cross Blessed Array', +); + +my $skipped = 0; + +for my $n (glob("test_dir/test_data_?????")) { + + (my $test_number = $n) =~ s/.*test_data_0*//; + + chomp(my $name = slurp(sprintf("test_dir/test_name_%05d", $test_number))); + + if ($skip{$name}) { + SKIP: { skip "$name ($n) not implemented", 1; }; + $skipped++; + next; + } + + if (not -f "$n-go.out") { + fail($name); + diag("No Go test output for $n"); +# die; + next; + } + + my $testdata = slurp($n); + my $p; + eval { + $p = decode_sereal($testdata); + 1; + } or do { + my $err = $@; + fail($name); + diag("Failed unpacking perl $n: $err"); + next; + }; + + $testdata = slurp("$n-go.out"); + my $g; + + eval { + $g = decode_sereal($testdata); + 1; + } or do { + my $err = $@; + fail($name); + diag("Failed unpacking go $n: $err"); + next; + }; + + my $dg = Dumper($g); + my $dp = Dumper($p); + + if (!ok($dg eq $dp, $name)) { + diag("$n\nGot: $dg\nExp: $dp"); +# die; + next; + } +} + +is($skipped, $skip_total, "skipped expected number of tests"); + +{ + foreach my $class ("time.Time", "github.com/Sereal/Sereal/Go/sereal.StructWithTime", "_/home/travis/build/Sereal/Sereal/Go/sereal.StructWithTime") { + no strict 'refs'; + *{"${class}::THAW"} = sub { my ( $pkg, $srl, $val ) = @_; bless \$val, $pkg }; + *{"${class}::FREEZE"} = sub { ${$_[0]} }; + } + + for my $n (glob("test_freeze/*-go.out")) { + my $testdata = slurp($n); + my ( $name ) = ( $n =~ m{([^/]+)-go\.out$} ); + my $g; + + eval { + $g = decode_sereal($testdata); + 1; + } or do { + my $err = $@; + fail($name); + diag("Failed unpacking go $n: $err"); + next; + }; + + ( my $perl = $n ) =~ s{-go\.out$}{-perl.out}; + + open my $fh, ">", $perl or die "Can't open $perl for writing: $!"; + print $fh encode_sereal($g, { freeze_callbacks => 1 }) or die "print($perl): $!"; + close $fh or die "close($perl): $!"; + + pass($name); + } +} + +done_testing(); + diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/v2_test.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/v2_test.go new file mode 100644 index 0000000..cb74302 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/v2_test.go @@ -0,0 +1,76 @@ +package sereal + +import ( + "encoding/hex" + "reflect" + "testing" +) + +func TestV2(t *testing.T) { + + h := map[string]interface{}{ + "type": "web", + "count": []interface{}{12, 14, 12}, + } + + b := map[string]interface{}{ + "hello": "world", + "foo": []interface{}{ + map[string]interface{}{"bar": 1}, + map[string]interface{}{"bar": 2}, + }, + } + + e := NewEncoderV2() + + enc, err := e.MarshalWithHeader(h, b) + if err != nil { + t.Fatal(err) + } + + d := NewDecoder() + + var dh map[string]interface{} + var db map[string]interface{} + + err = d.UnmarshalHeaderBody(enc, &dh, &db) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(h, dh) { + t.Errorf("failed to decode header:\ngot : %#v\nexpect: %#v\n", dh, h) + } + + if !reflect.DeepEqual(b, db) { + t.Errorf("failed to decode body:\ngot : %#v\nexpect: %#v\n", db, b) + } + +} + +func TestV2Compat(t *testing.T) { + + // ugly because the hash values aren't typed as strings but as SHORT_BINARY + h := map[string]interface{}{"type": []uint8{0x77, 0x65, 0x62}, "counts": []interface{}{12, 14, 12}} + b := map[string]interface{}{"hello": []uint8{0x77, 0x6f, 0x72, 0x6c, 0x64}, "foo": []interface{}{map[string]interface{}{"bar": 1}, map[string]interface{}{"bar": 2}}} + + enc, _ := hex.DecodeString("3d73726c0216015264747970656377656266636f756e7473430c0e0c526568656c6c6f65776f726c6463666f6f42516362617201512f1402") + + var dh map[string]interface{} + var db map[string]interface{} + + d := NewDecoder() + + err := d.UnmarshalHeaderBody(enc, &dh, &db) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(h, dh) { + t.Errorf("failed to decode header:\ngot : %#v\nexpect: %#v\n", dh, h) + } + + if !reflect.DeepEqual(b, db) { + t.Errorf("failed to decode body:\ngot : %#v\nexpect: %#v\n", db, b) + } +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib.go new file mode 100644 index 0000000..d95d6d4 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib.go @@ -0,0 +1,69 @@ +package sereal + +import ( + "compress/zlib" + "math" +) + +// ZlibCompressor compresses a Sereal document using the zlib format. +type ZlibCompressor struct { + Level int // compression level, set to ZlibDefaultCompression by default +} + +// Zlib constants +const ( + ZlibBestSpeed = zlib.BestSpeed + ZlibBestCompression = zlib.BestCompression + ZlibDefaultCompression = zlib.DefaultCompression +) + +func (c ZlibCompressor) compress(buf []byte) ([]byte, error) { + // Prepend a compressed block with its length, i.e.: + // + // + // 1st varint indicates the length of the uncompressed document, + // 2nd varint indicates the length of the compressed document. + // + // XXX It's the naive implementation, better to rework as described in the spec: + // https://github.com/Sereal/Sereal/blob/master/sereal_spec.pod#encoding-the-length-of-compressed-documents + + if c.Level == 0 { + c.Level = ZlibDefaultCompression + } + + tail, err := zlibEncode(buf, c.Level) + if err != nil { + return nil, err + } + + var head []byte + head = varint(head, uint(len(buf))) + head = varint(head, uint(len(tail))) + + return append(head, tail...), nil +} + +func (c ZlibCompressor) decompress(buf []byte) ([]byte, error) { + // Read the claimed length of the uncompressed document + uln, usz, err := varintdecode(buf) + if err != nil { + return nil, err + } + buf = buf[usz:] + + // Read the claimed length of the compressed document + cln, csz, err := varintdecode(buf) + if err != nil { + return nil, err + } + + if cln < 0 || cln > math.MaxInt32 || csz+cln > len(buf) { + return nil, ErrCorrupt{errBadOffset} + } + + buf = buf[csz : csz+cln] + + // XXX Perhaps check if len(buf) == cln + + return zlibDecode(uln, buf) +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_cgo.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_cgo.go new file mode 100644 index 0000000..8855cf5 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_cgo.go @@ -0,0 +1,51 @@ +// +build clibs + +package sereal + +/* +#cgo LDFLAGS: -lz + +#include + +*/ +import "C" + +import ( + "errors" + "unsafe" +) + +func zlibEncode(buf []byte, level int) ([]byte, error) { + + dLen := C.compressBound(C.uLong(len(buf))) + + dst := make([]byte, dLen) + + err := C.compress2((*C.Bytef)(unsafe.Pointer(&dst[0])), (*C.uLongf)(unsafe.Pointer(&dLen)), + (*C.Bytef)(unsafe.Pointer(&buf[0])), C.uLong(len(buf)), + C.int(level)) + + // compression failed :( + if err != C.Z_OK { + return nil, errors.New("zlib error") + } + + return dst[:dLen], nil +} + +func zlibDecode(uln int, buf []byte) ([]byte, error) { + + dst := make([]byte, uln) + + dLen := uln + + err := C.uncompress((*C.Bytef)(unsafe.Pointer(&dst[0])), (*C.uLongf)(unsafe.Pointer(&dLen)), + (*C.Bytef)(unsafe.Pointer(&buf[0])), C.uLong(len(buf))) + + // compression failed :( + if err != C.Z_OK || uln != dLen { + return nil, errors.New("zlib error") + } + + return dst, nil +} diff --git a/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_purego.go b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_purego.go new file mode 100644 index 0000000..65c1b12 --- /dev/null +++ b/vendor/src/github.com/Sereal/Sereal/Go/sereal/zlib_purego.go @@ -0,0 +1,62 @@ +// +build !clibs + +package sereal + +import ( + "bytes" + "compress/zlib" + "sync" +) + +var zlibWriterPools = make(map[int]*sync.Pool) + +func init() { + // -1 => 9 + for i := zlib.DefaultCompression; i <= zlib.BestCompression; i++ { + zlibWriterPools[i] = &sync.Pool{ + New: func() interface{} { + zw, _ := zlib.NewWriterLevel(nil, i) + return zw + }, + } + } + +} + +func zlibEncode(buf []byte, level int) ([]byte, error) { + + var comp bytes.Buffer + + zw := zlibWriterPools[level].Get().(*zlib.Writer) + defer zlibWriterPools[level].Put(zw) + zw.Reset(&comp) + + _, err := zw.Write(buf) + if err != nil { + return nil, err + } + + err = zw.Close() + if err != nil { + return nil, err + } + + return comp.Bytes(), nil +} + +func zlibDecode(uln int, buf []byte) ([]byte, error) { + zr, err := zlib.NewReader(bytes.NewReader(buf)) + if err != nil { + return nil, err + } + defer zr.Close() + + dec := bytes.NewBuffer(make([]byte, 0, uln)) + _, err = dec.ReadFrom(zr) + if err != nil { + return nil, err + } + + // XXX Perhaps check if the number of read bytes == uln + return dec.Bytes(), nil +} diff --git a/vendor/src/github.com/Xe/Tetra/1459/README.markdown b/vendor/src/github.com/Xe/Tetra/1459/README.markdown new file mode 100644 index 0000000..ef652c7 --- /dev/null +++ b/vendor/src/github.com/Xe/Tetra/1459/README.markdown @@ -0,0 +1,37 @@ +# r1459 +-- + import "github.com/Xe/Tetra/1459" + +Package r1459 implements a base structure to scrape out and utilize an RFC 1459 +frame in high level Go code. + +## Usage + +#### type RawLine + +```go +type RawLine struct { + Source string `json: "source"` + Verb string `json:"verb"` + Args []string `json:"args"` + Tags map[string]string `json:"tags"` + Raw string `json:"-"` // Deprecated +} +``` + +IRC line + +#### func NewRawLine + +```go +func NewRawLine(input string) (line *RawLine) +``` +Create a new line and split out an RFC 1459 frame to a RawLine. This will not +return an error if it fails. TODO: fix this. + +#### func (*RawLine) String + +```go +func (r *RawLine) String() (res string) +``` +String returns the serialized form of a RawLine as an RFC 1459 frame. diff --git a/vendor/src/github.com/Xe/Tetra/1459/line.go b/vendor/src/github.com/Xe/Tetra/1459/line.go new file mode 100644 index 0000000..016a2e0 --- /dev/null +++ b/vendor/src/github.com/Xe/Tetra/1459/line.go @@ -0,0 +1,78 @@ +// Package r1459 implements a base structure to scrape out and utilize an RFC 1459 +// frame in high level Go code. +package r1459 + +import ( + "fmt" + "strings" +) + +// RawLine represents an IRC line. +type RawLine struct { + Source string `json:"source"` + Verb string `json:"verb"` + Args []string `json:"args"` + Tags map[string]string `json:"tags"` + Raw string `json:"-"` // Deprecated +} + +// NewRawLine creates a new line and split out an RFC 1459 frame to a RawLine. This will +// not return an error if it fails. +func NewRawLine(input string) (line *RawLine) { + line = &RawLine{ + Raw: input, + } + + split := strings.Split(input, " ") + + if split[0][0] == ':' { + line.Source = split[0][1:] + line.Verb = split[1] + split = split[2:] + } else { + line.Source = "" + line.Verb = split[0] + split = split[1:] + } + + argstring := strings.Join(split, " ") + extparam := strings.Split(argstring, " :") + + if len(extparam) > 1 { + ext := strings.Join(extparam[1:], " :") + args := strings.Split(extparam[0], " ") + + line.Args = append(args, ext) + } else { + line.Args = split + } + + if len(line.Args) == 0 { + line.Args = []string{""} + } else if line.Args[0][0] == ':' { + line.Args[0] = strings.TrimPrefix(line.Args[0], ":") + } + + return +} + +// String returns the serialized form of a RawLine as an RFC 1459 frame. +func (r *RawLine) String() (res string) { + if r.Source != "" { + res = res + fmt.Sprintf(":%s ", r.Source) + } + + res = res + fmt.Sprintf("%s", r.Verb) + + for i, arg := range r.Args { + res = res + " " + + if i == len(r.Args)-1 { // Make the last part of the line an extparam + res = res + ":" + } + + res = res + arg + } + + return +} diff --git a/vendor/src/github.com/Xe/Tetra/1459/line_test.go b/vendor/src/github.com/Xe/Tetra/1459/line_test.go new file mode 100644 index 0000000..30e6480 --- /dev/null +++ b/vendor/src/github.com/Xe/Tetra/1459/line_test.go @@ -0,0 +1,79 @@ +package r1459 + +import ( + "testing" +) + +func TestBaseParse(t *testing.T) { + line := "FOO" + + lineStruct := NewRawLine(line) + + if lineStruct.Verb != "FOO" { + t.Fatalf("Line verb expected to be FOO, it is %s", lineStruct.Verb) + } +} + +func TestPRIVMSGParse(t *testing.T) { + line := ":Xena!oper@yolo-swag.com PRIVMSG #niichan :Why hello there" + + lineStruct := NewRawLine(line) + + if lineStruct.Verb != "PRIVMSG" { + t.Fatalf("Line verb expected to be PRIVMSG, it is %s", lineStruct.Verb) + } + + if lineStruct.Source != "Xena!oper@yolo-swag.com" { + t.Fatalf("Line source expected to be PRIVMSG, it is %s", lineStruct.Source) + } + + if len(lineStruct.Args) != 2 { + t.Fatalf("Line arg count expected to be 2, it is %s", len(lineStruct.Args)) + } + + if lineStruct.Args[0] != "#niichan" { + t.Fatalf("Line arg 0 expected to be #niichan, it is %s", lineStruct.Args[0]) + } + + if lineStruct.Args[1] != "Why hello there" { + t.Fatalf("Line arg 1 expected to be 'Why hello there', it is %s", lineStruct.Args[1]) + } +} + +// This test case has previously been known to crash this library. +func TestPreviouslyBreakingLine(t *testing.T) { + line := ":649AAAABS AWAY" + + lineStruct := NewRawLine(line) + + if lineStruct.Source != "649AAAABS" { + t.Fatalf("Line source expected to be 649AAAABS, it is %s", lineStruct.Source) + } + + if lineStruct.Verb != "AWAY" { + t.Fatalf("Line verb expected to be AWAY, it is %s", lineStruct.Verb) + } +} + +func TestStringWithSource(t *testing.T) { + line := &RawLine{ + Source: "Foo", + Verb: "BAR", + Args: []string{"#bar", "fozbroz arg with spaces"}, + } + + if res := line.String(); res != ":Foo BAR #bar :fozbroz arg with spaces" { + t.Fatalf("Expected :Foo BAR #bar :fozbroz arg with spaces and got %s", res) + } +} + +func TestStringWithoutSource(t *testing.T) { + line := &RawLine{ + Verb: "BAR", + Args: []string{"#bar", "fozbroz arg with spaces"}, + } + + if res := line.String(); res != "BAR #bar :fozbroz arg with spaces" { + t.Fatalf("Expected BAR #bar :fozbroz arg with spaces and got %s", res) + } +} diff --git a/vendor/src/github.com/asdine/storm/LICENSE b/vendor/src/github.com/asdine/storm/LICENSE new file mode 100644 index 0000000..8796079 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) [2016] [Asdine El Hrychy] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/src/github.com/asdine/storm/README.md b/vendor/src/github.com/asdine/storm/README.md new file mode 100644 index 0000000..1d6815c --- /dev/null +++ b/vendor/src/github.com/asdine/storm/README.md @@ -0,0 +1,350 @@ +# Storm + +[![Build Status](https://travis-ci.org/asdine/storm.svg)](https://travis-ci.org/asdine/storm) +[![GoDoc](https://godoc.org/github.com/asdine/storm?status.svg)](https://godoc.org/github.com/asdine/storm) +[![Go Report Card](https://goreportcard.com/badge/github.com/asdine/storm)](https://goreportcard.com/report/github.com/asdine/storm) +[![Coverage](http://gocover.io/_badge/github.com/asdine/storm)](http://gocover.io/github.com/asdine/storm) + +Storm is simple and powerful ORM for [BoltDB](https://github.com/boltdb/bolt). The goal of this project is to provide a simple way to save any object in BoltDB and to easily retrieve it. + +## Getting Started + +```bash +go get -u github.com/asdine/storm +``` + +## Import Storm + +```go +import "github.com/asdine/storm" +``` + +## Open a database + +Quick way of opening a database +```go +db, err := storm.Open("my.db") + +defer db.Close() +``` + +`Open` can receive multiple options to customize the way it behaves. See [Options](#options) below + +## Simple ORM + +### Declare your structures + +```go +type User struct { + ID int // primary key + Group string `storm:"index"` // this field will be indexed + Email string `storm:"unique"` // this field will be indexed with a unique constraint + Name string // this field will not be indexed + Age int `storm:"index"` +} +``` + +The primary key can be of any type as long as it is not a zero value. Storm will search for the tag `id`, if not present Storm will search for a field named `ID`. + +```go +type User struct { + ThePrimaryKey string `storm:"id"`// primary key + Group string `storm:"index"` // this field will be indexed + Email string `storm:"unique"` // this field will be indexed with a unique constraint + Name string // this field will not be indexed +} +``` + +Storm handles tags in nested structures with the `inline` tag + +```go +type Base struct { + Ident bson.ObjectId `storm:"id"` +} + +type User struct { + Base `storm:"inline"` + Group string `storm:"index"` + Email string `storm:"unique"` + Name string + CreatedAt time.Time `storm:"index"` +} +``` + +### Save your object + +```go +user := User{ + ID: 10, + Group: "staff", + Email: "john@provider.com", + Name: "John", + Age: 21, + CreatedAt: time.Now(), +} + +err := db.Save(&user) +// err == nil + +user.ID++ +err = db.Save(&user) +// err == "already exists" +``` + +That's it. + +`Save` creates or updates all the required indexes and buckets, checks the unique constraints and saves the object to the store. + +### Fetch your object + +Only indexed fields can be used to find a record + +```go +var user User +err := db.One("Email", "john@provider.com", &user) +// err == nil + +err = db.One("Name", "John", &user) +// err == "not found" +``` + +### Fetch multiple objects + +```go +var users []User +err := db.Find("Group", "staff", &users) +``` + +### Fetch all objects + +```go +var users []User +err := db.All(&users) +``` + +### Fetch all objects sorted by index + +```go +var users []User +err := db.AllByIndex("CreatedAt", &users) +``` + +### Fetch a range of objects + +```go +var users []User +err := db.Range("Age", 10, 21, &users) +``` + +### Skip and Limit + +```go +var users []User +err := db.Find("Group", "staff", &users, storm.Skip(10)) +err = db.Find("Group", "staff", &users, storm.Limit(10)) +err = db.Find("Group", "staff", &users, storm.Limit(10), storm.Skip(10)) + +err = db.All(&users, storm.Limit(10), storm.Skip(10)) +err = db.AllByIndex("CreatedAt", &users, storm.Limit(10), storm.Skip(10)) +err = db.Range("Age", 10, 21, &users, storm.Limit(10), storm.Skip(10)) +``` + +### Remove an object + +```go +err := db.Remove(&user) +``` + +### Initialize buckets and indexes before saving an object + +```go +err := db.Init(&User{}) +``` + +Useful when starting your application + +### Transactions + +```go +tx, err := db.Begin(true) + +accountA.Amount -= 100 +accountB.Amount += 100 + +err = tx.Save(accountA) +if err != nil { + tx.Rollback() + return err +} + +err = tx.Save(accountB) +if err != nil { + tx.Rollback() + return err +} + +tx.Commit() +``` +### Options + +Storm options are functions that can be passed when constructing you Storm instance. You can pass it any number of options. + +#### BoltOptions + +By default, Storm opens a database with the mode `0600` and a timeout of one second. +You can change this behavior by using `BoltOptions` + +```go +db, err := storm.Open("my.db", storm.BoltOptions(0600, &bolt.Options{Timeout: 1 * time.Second})) +``` + +#### EncodeDecoder + +To store the data in BoltDB, Storm encodes it in GOB by default. If you wish to change this behavior you can pass a codec that implements [`codec.EncodeDecoder`](https://godoc.org/github.com/asdine/storm/codec#EncodeDecoder) via the [`storm.Codec`](https://godoc.org/github.com/asdine/storm#Codec) option: + +```go +db := storm.Open("my.db", storm.Codec(myCodec)) +``` + +##### Provided Codecs + +You can easily implement your own `EncodeDecoder`, but Storm comes with built-in support for [GOB](https://godoc.org/github.com/asdine/storm/codec/gob) (default), [JSON](https://godoc.org/github.com/asdine/storm/codec/json), [Sereal](https://godoc.org/github.com/asdine/storm/codec/sereal) and [Protocol Buffers](https://godoc.org/github.com/asdine/storm/codec/protobuf) + +These can be used by importing the relevant package and use that codec to configure Storm. The example below shows all three (without proper error handling): + +```go +import ( + "github.com/asdine/storm" + "github.com/asdine/storm/codec/gob" + "github.com/asdine/storm/codec/json" + "github.com/asdine/storm/codec/sereal" + "github.com/asdine/storm/codec/protobuf" +) + +var gobDb, _ = storm.Open("gob.db", storm.Codec(gob.Codec)) +var jsonDb, _ = storm.Open("json.db", storm.Codec(json.Codec)) +var serealDb, _ = storm.Open("sereal.db", storm.Codec(sereal.Codec)) +var protobufDb, _ = storm.Open("protobuf.db", storm.Codec(protobuf.Codec)) +``` + +#### Auto Increment + +Storm can auto increment integer IDs so you don't have to worry about that when saving your objects. + +```go +db := storm.Open("my.db", storm.AutoIncrement()) +``` + +## Nodes and nested buckets + +Storm takes advantage of BoltDB nested buckets feature by using `storm.Node`. +A `storm.Node` is the underlying object used by `storm.DB` to manipulate a bucket. +To create a nested bucket and use the same API as `storm.DB`, you can use the `DB.From` method. + +```go +repo := db.From("repo") + +err := repo.Save(&Issue{ + Title: "I want more features", + Author: user.ID, +}) + +err = repo.Save(newRelease("0.10")) + +var issues []Issue +err = repo.Find("Author", user.ID, &issues) + +var release Release +err = repo.One("Tag", "0.10", &release) +``` + +You can also chain the nodes to create a hierarchy + +```go +chars := db.From("characters") +heroes := chars.From("heroes") +enemies := chars.From("enemies") + +items := db.From("items") +potions := items.From("consumables").From("medicine").From("potions") +``` +You can even pass the entire hierarchy as arguments to `From`: + +```go +privateNotes := db.From("notes", "private") +workNotes := db.From("notes", "work") +``` + +## Simple Key/Value store + +Storm can be used as a simple, robust, key/value store that can store anything. +The key and the value can be of any type as long as the key is not a zero value. + +Saving data : +```go +db.Set("logs", time.Now(), "I'm eating my breakfast man") +db.Set("sessions", bson.NewObjectId(), &someUser) +db.Set("weird storage", "754-3010", map[string]interface{}{ + "hair": "blonde", + "likes": []string{"cheese", "star wars"}, +}) +``` + +Fetching data : +```go +user := User{} +db.Get("sessions", someObjectId, &user) + +var details map[string]interface{} +db.Get("weird storage", "754-3010", &details) + +db.Get("sessions", someObjectId, &details) +``` + +Deleting data : +```go +db.Delete("sessions", someObjectId) +db.Delete("weird storage", "754-3010") +``` + +## BoltDB + +BoltDB is still easily accessible and can be used as usual + +```go +db.Bolt.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte("my bucket")) + val := bucket.Get([]byte("any id")) + fmt.Println(string(val)) + return nil +}) +``` + +A transaction can be also be passed to Storm + +```go +db.Bolt.Update(func(tx *bolt.Tx) error { + ... + dbx := db.WithTransaction(tx) + err = dbx.Save(&user) + ... + return nil +}) +``` + +## TODO + +- Search +- Reverse order +- More indexes + +## License + +MIT + +## Author + +**Asdine El Hrychy** + +- [Twitter](https://twitter.com/asdine_) +- [Github](https://github.com/asdine) diff --git a/vendor/src/github.com/asdine/storm/all.go b/vendor/src/github.com/asdine/storm/all.go new file mode 100644 index 0000000..206963a --- /dev/null +++ b/vendor/src/github.com/asdine/storm/all.go @@ -0,0 +1,180 @@ +package storm + +import ( + "fmt" + "reflect" + + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" +) + +// AllByIndex gets all the records of a bucket that are indexed in the specified index +func (n *Node) AllByIndex(fieldName string, to interface{}, options ...func(*index.Options)) error { + if fieldName == "" { + return n.All(to, options...) + } + + ref := reflect.ValueOf(to) + + if ref.Kind() != reflect.Ptr || reflect.Indirect(ref).Kind() != reflect.Slice { + return ErrSlicePtrNeeded + } + + typ := reflect.Indirect(ref).Type().Elem() + + if typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + + newElem := reflect.New(typ) + + info, err := extract(newElem.Interface()) + if err != nil { + return err + } + + if info.ID.Field.Name() == fieldName { + return n.All(to, options...) + } + + opts := index.NewOptions() + for _, fn := range options { + fn(opts) + } + + if n.tx != nil { + return n.allByIndex(n.tx, fieldName, info, &ref, opts) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.allByIndex(tx, fieldName, info, &ref, opts) + }) +} + +func (n *Node) allByIndex(tx *bolt.Tx, fieldName string, info *modelInfo, ref *reflect.Value, opts *index.Options) error { + bucket := n.GetBucket(tx, info.Name) + if bucket == nil { + return fmt.Errorf("bucket %s not found", info.Name) + } + + idxInfo, ok := info.Indexes[fieldName] + if !ok { + return ErrNotFound + } + + idx, err := getIndex(bucket, idxInfo.Type, fieldName) + if err != nil { + return err + } + + list, err := idx.AllRecords(opts) + if err != nil { + return err + } + + results := reflect.MakeSlice(reflect.Indirect(*ref).Type(), len(list), len(list)) + + for i := range list { + raw := bucket.Get(list[i]) + if raw == nil { + return ErrNotFound + } + + err = n.s.Codec.Decode(raw, results.Index(i).Addr().Interface()) + if err != nil { + return err + } + } + + reflect.Indirect(*ref).Set(results) + return nil +} + +// All gets all the records of a bucket +func (n *Node) All(to interface{}, options ...func(*index.Options)) error { + ref := reflect.ValueOf(to) + + if ref.Kind() != reflect.Ptr || reflect.Indirect(ref).Kind() != reflect.Slice { + return ErrSlicePtrNeeded + } + + rtyp := reflect.Indirect(ref).Type().Elem() + typ := rtyp + + if rtyp.Kind() == reflect.Ptr { + typ = typ.Elem() + } + + newElem := reflect.New(typ) + + info, err := extract(newElem.Interface()) + if err != nil { + return err + } + + opts := index.NewOptions() + for _, fn := range options { + fn(opts) + } + + if n.tx != nil { + return n.all(n.tx, info, &ref, rtyp, typ, opts) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.all(tx, info, &ref, rtyp, typ, opts) + }) +} + +func (n *Node) all(tx *bolt.Tx, info *modelInfo, ref *reflect.Value, rtyp, typ reflect.Type, opts *index.Options) error { + bucket := n.GetBucket(tx, info.Name) + if bucket == nil { + return fmt.Errorf("bucket %s not found", info.Name) + } + + results := reflect.MakeSlice(reflect.Indirect(*ref).Type(), 0, 0) + c := bucket.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if v == nil { + continue + } + + if opts != nil && opts.Skip > 0 { + opts.Skip-- + continue + } + + if opts != nil && opts.Limit == 0 { + break + } + + if opts != nil && opts.Limit > 0 { + opts.Limit-- + } + + newElem := reflect.New(typ) + err := n.s.Codec.Decode(v, newElem.Interface()) + if err != nil { + return err + } + + if rtyp.Kind() == reflect.Ptr { + results = reflect.Append(results, newElem) + } else { + results = reflect.Append(results, reflect.Indirect(newElem)) + } + } + + reflect.Indirect(*ref).Set(results) + return nil +} + +// AllByIndex gets all the records of a bucket that are indexed in the specified index +func (s *DB) AllByIndex(fieldName string, to interface{}, options ...func(*index.Options)) error { + return s.root.AllByIndex(fieldName, to, options...) +} + +// All get all the records of a bucket +func (s *DB) All(to interface{}, options ...func(*index.Options)) error { + return s.root.All(to, options...) +} diff --git a/vendor/src/github.com/asdine/storm/all_test.go b/vendor/src/github.com/asdine/storm/all_test.go new file mode 100644 index 0000000..2d195e2 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/all_test.go @@ -0,0 +1,177 @@ +package storm + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestAllByIndex(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + for i := 0; i < 100; i++ { + w := User{Name: "John", ID: i + 1, Slug: fmt.Sprintf("John%d", i+1), DateOfBirth: time.Now().Add(-time.Duration(i*10) * time.Minute)} + err := db.Save(&w) + assert.NoError(t, err) + } + + err := db.AllByIndex("", nil) + assert.Error(t, err) + assert.Equal(t, ErrSlicePtrNeeded, err) + + var users []User + + err = db.AllByIndex("DateOfBirth", &users) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 100, users[0].ID) + assert.Equal(t, 1, users[99].ID) + + err = db.AllByIndex("Name", &users) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + y := UniqueNameUser{Name: "Jake", ID: 200} + err = db.Save(&y) + assert.NoError(t, err) + + var y2 []UniqueNameUser + err = db.AllByIndex("ID", &y2) + assert.NoError(t, err) + assert.Len(t, y2, 1) + + n := NestedID{} + n.ID = "100" + n.Name = "John" + + err = db.Save(&n) + assert.NoError(t, err) + + var n2 []NestedID + err = db.AllByIndex("ID", &n2) + assert.NoError(t, err) + assert.Len(t, n2, 1) + + err = db.AllByIndex("Name", &users, Limit(10)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 10, users[9].ID) + + err = db.AllByIndex("Name", &users, Limit(200)) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + err = db.AllByIndex("Name", &users, Limit(-10)) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + err = db.AllByIndex("Name", &users, Skip(200)) + assert.NoError(t, err) + assert.Len(t, users, 0) + + err = db.AllByIndex("Name", &users, Skip(-10)) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + err = db.AllByIndex("ID", &users) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + err = db.AllByIndex("ID", &users, Limit(10)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 10, users[9].ID) + + err = db.AllByIndex("ID", &users, Skip(10)) + assert.NoError(t, err) + assert.Len(t, users, 90) + assert.Equal(t, 11, users[0].ID) + assert.Equal(t, 100, users[89].ID) + + err = db.AllByIndex("Name", &users, Limit(10), Skip(10)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 11, users[0].ID) + assert.Equal(t, 20, users[9].ID) +} + +func TestAll(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + for i := 0; i < 100; i++ { + w := User{Name: "John", ID: i + 1, Slug: fmt.Sprintf("John%d", i+1), DateOfBirth: time.Now().Add(-time.Duration(i*10) * time.Minute)} + err := db.Save(&w) + assert.NoError(t, err) + } + + var users []User + + err := db.All(&users) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + var users2 []*User + + err = db.All(&users2) + assert.NoError(t, err) + assert.Len(t, users2, 100) + assert.Equal(t, 1, users2[0].ID) + assert.Equal(t, 100, users2[99].ID) + + var unknowns []UserWithNoID + err = db.All(&unknowns) + assert.Error(t, err) + assert.Equal(t, ErrNoID, err) + + err = db.Save(&NestedID{ + ToEmbed: ToEmbed{ID: "id1"}, + Name: "John", + }) + assert.NoError(t, err) + + err = db.Save(&NestedID{ + ToEmbed: ToEmbed{ID: "id2"}, + Name: "Mike", + }) + assert.NoError(t, err) + + db.Save(&NestedID{ + ToEmbed: ToEmbed{ID: "id3"}, + Name: "Steve", + }) + assert.NoError(t, err) + + var nested []NestedID + err = db.All(&nested) + assert.NoError(t, err) + assert.Len(t, nested, 3) + + err = db.All(&users, Limit(10), Skip(10)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 11, users[0].ID) + assert.Equal(t, 20, users[9].ID) +} diff --git a/vendor/src/github.com/asdine/storm/bucket.go b/vendor/src/github.com/asdine/storm/bucket.go new file mode 100644 index 0000000..8bc671f --- /dev/null +++ b/vendor/src/github.com/asdine/storm/bucket.go @@ -0,0 +1,47 @@ +package storm + +import "github.com/boltdb/bolt" + +// CreateBucketIfNotExists creates the bucket below the current node if it doesn't +// already exist. +func (n *Node) CreateBucketIfNotExists(tx *bolt.Tx, bucket string) (*bolt.Bucket, error) { + var b *bolt.Bucket + var err error + + bucketNames := append(n.rootBucket, bucket) + + for _, bucketName := range bucketNames { + if b != nil { + if b, err = b.CreateBucketIfNotExists([]byte(bucketName)); err != nil { + return nil, err + } + + } else { + if b, err = tx.CreateBucketIfNotExists([]byte(bucketName)); err != nil { + return nil, err + } + } + } + + return b, nil +} + +// GetBucket returns the given bucket below the current node. +func (n *Node) GetBucket(tx *bolt.Tx, children ...string) *bolt.Bucket { + var b *bolt.Bucket + + bucketNames := append(n.rootBucket, children...) + for _, bucketName := range bucketNames { + if b != nil { + if b = b.Bucket([]byte(bucketName)); b == nil { + return nil + } + } else { + if b = tx.Bucket([]byte(bucketName)); b == nil { + return nil + } + } + } + + return b +} diff --git a/vendor/src/github.com/asdine/storm/bucket_test.go b/vendor/src/github.com/asdine/storm/bucket_test.go new file mode 100644 index 0000000..0bbf239 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/bucket_test.go @@ -0,0 +1,73 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBucket(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + // Read tx + readTx, err := db.Bolt.Begin(false) + if err != nil { + t.Fatal(err) + } + + assert.Nil(t, db.root.GetBucket(readTx, "none")) + + b, err := db.root.CreateBucketIfNotExists(readTx, "new") + + // Cannot create buckets in a read transaction + assert.Error(t, err) + assert.Nil(t, b) + + // Read transactions in Bolt needs a rollback and not a commit + readTx.Rollback() + + // End read tx + + // Write tx + writeTx, err := db.Bolt.Begin(true) + + if err != nil { + t.Fatal(err) + } + + assert.Nil(t, db.root.GetBucket(writeTx, "none")) + + b, err = db.root.CreateBucketIfNotExists(writeTx, "new") + + assert.NoError(t, err) + assert.NotNil(t, b) + + n2 := db.From("a", "b") + b, err = n2.CreateBucketIfNotExists(writeTx, "c") + + assert.NoError(t, err) + assert.NotNil(t, b) + + writeTx.Commit() + + // End write tx + + // Read tx + readTx, err = db.Bolt.Begin(false) + if err != nil { + t.Fatal(err) + } + + assert.NotNil(t, db.root.GetBucket(readTx, "new")) + assert.Nil(t, db.root.GetBucket(readTx, "c")) + assert.NotNil(t, n2.GetBucket(readTx, "c")) + + readTx.Rollback() + // End read tx +} diff --git a/vendor/src/github.com/asdine/storm/close.go b/vendor/src/github.com/asdine/storm/close.go new file mode 100644 index 0000000..b8ef06d --- /dev/null +++ b/vendor/src/github.com/asdine/storm/close.go @@ -0,0 +1,6 @@ +package storm + +// Close the database +func (s *DB) Close() error { + return s.Bolt.Close() +} diff --git a/vendor/src/github.com/asdine/storm/codec.go b/vendor/src/github.com/asdine/storm/codec.go new file mode 100644 index 0000000..9b2b32b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec.go @@ -0,0 +1,6 @@ +package storm + +import "github.com/asdine/storm/codec/gob" + +// Defaults to gob +var defaultCodec = gob.Codec diff --git a/vendor/src/github.com/asdine/storm/codec/codec.go b/vendor/src/github.com/asdine/storm/codec/codec.go new file mode 100644 index 0000000..7c6070a --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/codec.go @@ -0,0 +1,9 @@ +// Package codec contains sub-packages with different codecs that can be used +// to encode and decode entities in Storm. +package codec + +// EncodeDecoder represents a codec used to encode and decode entities. +type EncodeDecoder interface { + Encode(v interface{}) ([]byte, error) + Decode(b []byte, v interface{}) error +} diff --git a/vendor/src/github.com/asdine/storm/codec/example_test.go b/vendor/src/github.com/asdine/storm/codec/example_test.go new file mode 100644 index 0000000..fed0011 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/example_test.go @@ -0,0 +1,31 @@ +package codec_test + +import ( + "fmt" + + "github.com/asdine/storm" + "github.com/asdine/storm/codec/gob" + "github.com/asdine/storm/codec/json" + "github.com/asdine/storm/codec/protobuf" + "github.com/asdine/storm/codec/sereal" +) + +func Example() { + // The examples below show how to set up all the codecs shipped with Storm. + // Proper error handling left out to make it simple. + var gobDb, _ = storm.Open("gob.db", storm.Codec(gob.Codec)) + var jsonDb, _ = storm.Open("json.db", storm.Codec(json.Codec)) + var serealDb, _ = storm.Open("sereal.db", storm.Codec(sereal.Codec)) + var protobufDb, _ = storm.Open("protobuf.db", storm.Codec(protobuf.Codec)) + + fmt.Printf("%T\n", gobDb.Codec) + fmt.Printf("%T\n", jsonDb.Codec) + fmt.Printf("%T\n", serealDb.Codec) + fmt.Printf("%T\n", protobufDb.Codec) + + // Output: + // *gob.gobCodec + // *json.jsonCodec + // *sereal.serealCodec + // *protobuf.protobufCodec +} diff --git a/vendor/src/github.com/asdine/storm/codec/gob/gob.go b/vendor/src/github.com/asdine/storm/codec/gob/gob.go new file mode 100644 index 0000000..02160c1 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/gob/gob.go @@ -0,0 +1,28 @@ +package gob + +import ( + "bytes" + "encoding/gob" +) + +// Codec serializing objects using the gob package. +// See https://golang.org/pkg/encoding/gob/ +var Codec = new(gobCodec) + +type gobCodec int + +func (c gobCodec) Encode(v interface{}) ([]byte, error) { + var b bytes.Buffer + enc := gob.NewEncoder(&b) + err := enc.Encode(v) + if err != nil { + return nil, err + } + return b.Bytes(), nil +} + +func (c gobCodec) Decode(b []byte, v interface{}) error { + r := bytes.NewReader(b) + dec := gob.NewDecoder(r) + return dec.Decode(v) +} diff --git a/vendor/src/github.com/asdine/storm/codec/gob/gob_test.go b/vendor/src/github.com/asdine/storm/codec/gob/gob_test.go new file mode 100644 index 0000000..376fd9d --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/gob/gob_test.go @@ -0,0 +1,11 @@ +package gob + +import ( + "testing" + + "github.com/asdine/storm/codec/internal" +) + +func TestGob(t *testing.T) { + internal.RoundtripTester(t, Codec) +} diff --git a/vendor/src/github.com/asdine/storm/codec/internal/test_helpers.go b/vendor/src/github.com/asdine/storm/codec/internal/test_helpers.go new file mode 100644 index 0000000..37e76ce --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/internal/test_helpers.go @@ -0,0 +1,44 @@ +package internal + +import ( + "encoding/gob" + "reflect" + "testing" + + "github.com/asdine/storm/codec" +) + +type testStruct struct { + Name string +} + +// RoundtripTester is a test helper to test a EncodeDecoder +func RoundtripTester(t *testing.T, c codec.EncodeDecoder, vals ...interface{}) { + var val, to interface{} + if len(vals) > 0 { + if len(vals) != 2 { + panic("Wrong number of vals, expected 2") + } + val = vals[0] + to = vals[1] + } else { + val = &testStruct{Name: "test"} + to = &testStruct{} + } + + encoded, err := c.Encode(val) + if err != nil { + t.Fatal("Encode error:", err) + } + err = c.Decode(encoded, to) + if err != nil { + t.Fatal("Decode error:", err) + } + if !reflect.DeepEqual(val, to) { + t.Fatalf("Roundtrip codec mismatch, expected\n%#v\ngot\n%#v", val, to) + } +} + +func init() { + gob.Register(&testStruct{}) +} diff --git a/vendor/src/github.com/asdine/storm/codec/json/json.go b/vendor/src/github.com/asdine/storm/codec/json/json.go new file mode 100644 index 0000000..bb27e49 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/json/json.go @@ -0,0 +1,18 @@ +package json + +import ( + "encoding/json" +) + +// Codec that encodes to and decodes from JSON. +var Codec = new(jsonCodec) + +type jsonCodec int + +func (j jsonCodec) Encode(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func (j jsonCodec) Decode(b []byte, v interface{}) error { + return json.Unmarshal(b, v) +} diff --git a/vendor/src/github.com/asdine/storm/codec/json/json_test.go b/vendor/src/github.com/asdine/storm/codec/json/json_test.go new file mode 100644 index 0000000..c172849 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/json/json_test.go @@ -0,0 +1,11 @@ +package json + +import ( + "testing" + + "github.com/asdine/storm/codec/internal" +) + +func TestJSON(t *testing.T) { + internal.RoundtripTester(t, Codec) +} diff --git a/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf.go b/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf.go new file mode 100644 index 0000000..126a8fc --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf.go @@ -0,0 +1,31 @@ +package protobuf + +import ( + "errors" + + "github.com/golang/protobuf/proto" +) + +// More details on Protocol Buffers https://github.com/golang/protobuf +var ( + Codec = new(protobufCodec) + errNotProtocolBufferMessage = errors.New("value isn't a Protocol Buffers Message") +) + +type protobufCodec int + +func (c protobufCodec) Encode(v interface{}) ([]byte, error) { + message, ok := v.(proto.Message) + if !ok { + return nil, errNotProtocolBufferMessage + } + return proto.Marshal(message) +} + +func (c protobufCodec) Decode(b []byte, v interface{}) error { + message, ok := v.(proto.Message) + if !ok { + return errNotProtocolBufferMessage + } + return proto.Unmarshal(b, message) +} diff --git a/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf_test.go b/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf_test.go new file mode 100644 index 0000000..35f1900 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/protobuf/protobuf_test.go @@ -0,0 +1,19 @@ +package protobuf + +import ( + "testing" + + "github.com/golang/protobuf/proto" + "github.com/asdine/storm/codec/internal" + "github.com/stretchr/testify/assert" +) + +func TestProtobuf(t *testing.T) { + u1 := SimpleUser{ + Id: proto.Uint64(1), + Name: proto.String("John"), + } + u2 := SimpleUser{} + internal.RoundtripTester(t, Codec, &u1, &u2) + assert.True(t, u1.GetId() == u2.GetId()) +} diff --git a/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.pb.go b/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.pb.go new file mode 100644 index 0000000..0aaa44c --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.pb.go @@ -0,0 +1,77 @@ +// Code generated by protoc-gen-go. +// source: simple_user.proto +// DO NOT EDIT! + +/* +Package protobuf is a generated protocol buffer package. + +It is generated from these files: + simple_user.proto + +It has these top-level messages: + SimpleUser +*/ +package protobuf + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + +type SimpleUser struct { + Id *uint64 `protobuf:"varint,1,req,name=id" json:"id,omitempty"` + Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` + Age *int32 `protobuf:"varint,3,opt,name=age,def=0" json:"age,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SimpleUser) Reset() { *m = SimpleUser{} } +func (m *SimpleUser) String() string { return proto.CompactTextString(m) } +func (*SimpleUser) ProtoMessage() {} +func (*SimpleUser) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +const Default_SimpleUser_Age int32 = 0 + +func (m *SimpleUser) GetId() uint64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *SimpleUser) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *SimpleUser) GetAge() int32 { + if m != nil && m.Age != nil { + return *m.Age + } + return Default_SimpleUser_Age +} + +func init() { + proto.RegisterType((*SimpleUser)(nil), "protobuf.SimpleUser") +} + +var fileDescriptor0 = []byte{ + // 100 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x12, 0x2c, 0xce, 0xcc, 0x2d, + 0xc8, 0x49, 0x8d, 0x2f, 0x2d, 0x4e, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, + 0x53, 0x49, 0xa5, 0x69, 0x4a, 0x66, 0x5c, 0x5c, 0xc1, 0x60, 0xe9, 0x50, 0xa0, 0xac, 0x10, 0x17, + 0x17, 0x53, 0x66, 0x8a, 0x04, 0xa3, 0x02, 0x93, 0x06, 0x8b, 0x10, 0x0f, 0x17, 0x4b, 0x5e, 0x62, + 0x6e, 0xaa, 0x04, 0x13, 0x90, 0xc7, 0x29, 0xc4, 0xc7, 0xc5, 0x9c, 0x98, 0x9e, 0x2a, 0xc1, 0xac, + 0xc0, 0xa8, 0xc1, 0x6a, 0xc5, 0x68, 0x00, 0x08, 0x00, 0x00, 0xff, 0xff, 0x64, 0x21, 0x66, 0x4d, + 0x55, 0x00, 0x00, 0x00, +} diff --git a/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.proto b/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.proto new file mode 100644 index 0000000..e730d6b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/protobuf/simple_user.proto @@ -0,0 +1,7 @@ +package protobuf; + +message SimpleUser { + required uint64 id = 1; + required string name = 2; + optional int32 age = 3 [default=0]; +} diff --git a/vendor/src/github.com/asdine/storm/codec/sereal/sereal.go b/vendor/src/github.com/asdine/storm/codec/sereal/sereal.go new file mode 100644 index 0000000..1984835 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/sereal/sereal.go @@ -0,0 +1,20 @@ +package sereal + +import ( + "github.com/Sereal/Sereal/Go/sereal" +) + +// The Sereal codec has some interesting features, one of them being +// serialization of object references, including circular references. +// See https://github.com/Sereal/Sereal +var Codec = new(serealCodec) + +type serealCodec int + +func (c serealCodec) Encode(v interface{}) ([]byte, error) { + return sereal.Marshal(v) +} + +func (c serealCodec) Decode(b []byte, v interface{}) error { + return sereal.Unmarshal(b, v) +} diff --git a/vendor/src/github.com/asdine/storm/codec/sereal/sereal_test.go b/vendor/src/github.com/asdine/storm/codec/sereal/sereal_test.go new file mode 100644 index 0000000..c0e59e7 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec/sereal/sereal_test.go @@ -0,0 +1,21 @@ +package sereal + +import ( + "testing" + + "github.com/asdine/storm/codec/internal" + "github.com/stretchr/testify/assert" +) + +type SerealUser struct { + Name string + Self *SerealUser +} + +func TestSereal(t *testing.T) { + u1 := &SerealUser{Name: "Sereal"} + u1.Self = u1 // cyclic ref + u2 := &SerealUser{} + internal.RoundtripTester(t, Codec, &u1, &u2) + assert.True(t, u2 == u2.Self) +} diff --git a/vendor/src/github.com/asdine/storm/codec_test.go b/vendor/src/github.com/asdine/storm/codec_test.go new file mode 100644 index 0000000..3315587 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/codec_test.go @@ -0,0 +1,21 @@ +package storm + +import ( + "testing" + + "reflect" + + "github.com/stretchr/testify/assert" +) + +func TestCodec(t *testing.T) { + u1 := &SimpleUser{Name: "John"} + encoded, err := defaultCodec.Encode(u1) + assert.Nil(t, err) + u2 := &SimpleUser{} + err = defaultCodec.Decode(encoded, u2) + assert.Nil(t, err) + if !reflect.DeepEqual(u1, u2) { + t.Fatal("Codec mismatch") + } +} diff --git a/vendor/src/github.com/asdine/storm/count.go b/vendor/src/github.com/asdine/storm/count.go new file mode 100644 index 0000000..d6ef3d4 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/count.go @@ -0,0 +1,54 @@ +package storm + +import ( + "fmt" + + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Count counts all the records of a bucket +func (n *Node) Count(data interface{}) (int, error) { + if !structs.IsStruct(data) { + return 0, ErrBadType + } + + info, err := extract(data) + if err != nil { + return 0, err + } + + var count int + if n.tx != nil { + err = n.count(n.tx, info, &count) + return count, err + } + + err = n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.count(tx, info, &count) + }) + return count, err +} + +func (n *Node) count(tx *bolt.Tx, info *modelInfo, count *int) error { + bucket := n.GetBucket(tx, info.Name) + if bucket == nil { + return fmt.Errorf("bucket %s not found", info.Name) + } + + *count = 0 + c := bucket.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if v == nil { + continue + } + (*count)++ + } + + return nil +} + +// Count counts all the records of a bucket +func (s *DB) Count(data interface{}) (int, error) { + return s.root.Count(data) +} diff --git a/vendor/src/github.com/asdine/storm/count_test.go b/vendor/src/github.com/asdine/storm/count_test.go new file mode 100644 index 0000000..0ff1dad --- /dev/null +++ b/vendor/src/github.com/asdine/storm/count_test.go @@ -0,0 +1,53 @@ +package storm + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestCount(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + for i := 0; i < 100; i++ { + w := User{Name: "John", ID: i + 1, Slug: fmt.Sprintf("John%d", i+1), DateOfBirth: time.Now().Add(-time.Duration(i*10) * time.Minute)} + err := db.Save(&w) + assert.NoError(t, err) + } + + count, err := db.Count(&User{}) + assert.NoError(t, err) + assert.Equal(t, 100, count) + + w := User{Name: "John", ID: 101, Slug: fmt.Sprintf("John%d", 101), DateOfBirth: time.Now().Add(-time.Duration(101*10) * time.Minute)} + err = db.Save(&w) + assert.NoError(t, err) + + count, err = db.Count(&User{}) + assert.NoError(t, err) + assert.Equal(t, 101, count) + + tx, err := db.Begin(true) + assert.NoError(t, err) + + count, err = tx.Count(&User{}) + assert.NoError(t, err) + assert.Equal(t, 101, count) + + w = User{Name: "John", ID: 102, Slug: fmt.Sprintf("John%d", 102), DateOfBirth: time.Now().Add(-time.Duration(101*10) * time.Minute)} + err = tx.Save(&w) + assert.NoError(t, err) + + count, err = tx.Count(&User{}) + assert.NoError(t, err) + assert.Equal(t, 102, count) + + tx.Commit() +} diff --git a/vendor/src/github.com/asdine/storm/delete.go b/vendor/src/github.com/asdine/storm/delete.go new file mode 100644 index 0000000..204fdb9 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/delete.go @@ -0,0 +1,33 @@ +package storm + +import "github.com/boltdb/bolt" + +// Delete deletes a key from a bucket +func (n *Node) Delete(bucketName string, key interface{}) error { + id, err := toBytes(key, n.s.Codec) + if err != nil { + return err + } + + if n.tx != nil { + return n.delete(n.tx, bucketName, id) + } + + return n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.delete(tx, bucketName, id) + }) +} + +func (n *Node) delete(tx *bolt.Tx, bucketName string, id []byte) error { + bucket := n.GetBucket(tx, bucketName) + if bucket == nil { + return ErrNotFound + } + + return bucket.Delete(id) +} + +// Delete deletes a key from a bucket +func (s *DB) Delete(bucketName string, key interface{}) error { + return s.root.Delete(bucketName, key) +} diff --git a/vendor/src/github.com/asdine/storm/delete_test.go b/vendor/src/github.com/asdine/storm/delete_test.go new file mode 100644 index 0000000..2d3ca8c --- /dev/null +++ b/vendor/src/github.com/asdine/storm/delete_test.go @@ -0,0 +1,27 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDelete(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Set("files", "myfile.csv", "a,b,c,d") + assert.NoError(t, err) + err = db.Delete("files", "myfile.csv") + assert.NoError(t, err) + err = db.Delete("files", "myfile.csv") + assert.NoError(t, err) + err = db.Delete("i don't exist", "myfile.csv") + assert.Equal(t, ErrNotFound, err) + err = db.Delete("", nil) + assert.Equal(t, ErrNotFound, err) +} diff --git a/vendor/src/github.com/asdine/storm/drop.go b/vendor/src/github.com/asdine/storm/drop.go new file mode 100644 index 0000000..26926be --- /dev/null +++ b/vendor/src/github.com/asdine/storm/drop.go @@ -0,0 +1,28 @@ +package storm + +import "github.com/boltdb/bolt" + +// Drop a bucket +func (n *Node) Drop(bucketName string) error { + if n.tx != nil { + return n.drop(n.tx, bucketName) + } + + return n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.drop(tx, bucketName) + }) +} + +func (n *Node) drop(tx *bolt.Tx, bucketName string) error { + bucket := n.GetBucket(tx) + if bucket == nil { + return tx.DeleteBucket([]byte(bucketName)) + } + + return bucket.DeleteBucket([]byte(bucketName)) +} + +// Drop a bucket +func (s *DB) Drop(bucketName string) error { + return s.root.Drop(bucketName) +} diff --git a/vendor/src/github.com/asdine/storm/drop_test.go b/vendor/src/github.com/asdine/storm/drop_test.go new file mode 100644 index 0000000..c884fb9 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/drop_test.go @@ -0,0 +1,45 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestDrop(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + n := db.From("b1", "b2", "b3") + err := n.Save(&SimpleUser{ID: 10, Name: "John"}) + assert.NoError(t, err) + + err = db.From("b1").Drop("b2") + assert.NoError(t, err) + + err = db.From("b1").Drop("b2") + assert.Error(t, err) + + n.From("b4").Drop("b5") + assert.Error(t, err) + + err = db.Drop("b1") + assert.NoError(t, err) + + db.Bolt.Update(func(tx *bolt.Tx) error { + d := db.WithTransaction(tx) + n := d.From("a1") + err = n.Save(&SimpleUser{ID: 10, Name: "John"}) + assert.NoError(t, err) + + err = d.Drop("a1") + assert.NoError(t, err) + + return nil + }) +} diff --git a/vendor/src/github.com/asdine/storm/errors.go b/vendor/src/github.com/asdine/storm/errors.go new file mode 100644 index 0000000..7c20412 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/errors.go @@ -0,0 +1,45 @@ +package storm + +import "errors" + +// Errors +var ( + // ErrNoID is returned when no ID field or id tag is found in the struct. + ErrNoID = errors.New("missing struct tag id or ID field") + + // ErrZeroID is returned when the ID field is a zero value. + ErrZeroID = errors.New("id field must not be a zero value") + + // ErrBadType is returned when a method receives an unexpected value type. + ErrBadType = errors.New("provided data must be a struct or a pointer to struct") + + // ErrAlreadyExists is returned uses when trying to set an existing value on a field that has a unique index. + ErrAlreadyExists = errors.New("already exists") + + // ErrNilParam is returned when the specified param is expected to be not nil. + ErrNilParam = errors.New("param must not be nil") + + // ErrUnknownTag is returned when an unexpected tag is specified. + ErrUnknownTag = errors.New("unknown tag") + + // ErrIdxNotFound is returned when the specified index is not found. + ErrIdxNotFound = errors.New("index not found") + + // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer to slice. + ErrSlicePtrNeeded = errors.New("provided target must be a pointer to slice") + + // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer to struct. + ErrStructPtrNeeded = errors.New("provided target must be a pointer to struct") + + // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer. + ErrPtrNeeded = errors.New("provided target must be a pointer to a valid variable") + + // ErrNoName is returned when the specified struct has no name. + ErrNoName = errors.New("provided target must have a name") + + // ErrNotFound is returned when the specified record is not saved in the bucket. + ErrNotFound = errors.New("not found") + + // ErrNotInTransaction is returned when trying to rollback or commit when not in transaction. + ErrNotInTransaction = errors.New("not in transaction") +) diff --git a/vendor/src/github.com/asdine/storm/examples_test.go b/vendor/src/github.com/asdine/storm/examples_test.go new file mode 100644 index 0000000..81b3bb6 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/examples_test.go @@ -0,0 +1,391 @@ +package storm_test + +import ( + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + "time" + + "github.com/asdine/storm" +) + +func ExampleDB_Save() { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + + type User struct { + ID int `storm:"id"` + Group string `storm:"index"` + Email string `storm:"unique"` + Name string + Age int `storm:"index"` + CreatedAt time.Time `storm:"index"` + } + + // Open takes an optional list of options as the last argument. + // AutoIncrement will auto-increment integer IDs without existing values. + db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.AutoIncrement()) + defer db.Close() + + user := User{ + Group: "staff", + Email: "john@provider.com", + Name: "John", + Age: 21, + CreatedAt: time.Now(), + } + + err := db.Save(&user) + + if err != nil { + log.Fatal(err) + } + + user2 := user + user2.ID = 0 + + // Save will fail because of the unique constraint on Email + err = db.Save(&user2) + fmt.Println(err) + + // Output: + // already exists +} + +func ExampleDB_One() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var user User + + err := db.One("Email", "john@provider.com", &user) + + if err != nil { + log.Fatal(err) + } + + // One only works for indexed fields. + err = db.One("Name", "John", &user) + fmt.Println(err) + + // Output: + // not found +} + +func ExampleDB_Find() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.Find("Group", "staff", &users) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 3 +} + +func ExampleDB_All() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.All(&users) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 3 +} + +func ExampleDB_AllByIndex() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.AllByIndex("CreatedAt", &users) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 3 +} + +func ExampleDB_Range() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.Range("Age", 21, 22, &users) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 2 +} + +func ExampleLimit() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.All(&users, storm.Limit(2)) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 2 +} + +func ExampleSkip() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var users []User + err := db.All(&users, storm.Skip(1)) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Found", len(users)) + + // Output: + // Found 2 +} + +func ExampleDB_Remove() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + var user User + + err := db.One("ID", 1, &user) + + if err != nil { + log.Fatal(err) + } + + err = db.Remove(user) + fmt.Println(err) + + // Output: + // +} + +func ExampleDB_Begin() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + // both start out with a balance of 10000 cents + var account1, account2 Account + + tx, err := db.Begin(true) + + if err != nil { + log.Fatal(err) + } + + err = tx.One("ID", 1, &account1) + + if err != nil { + log.Fatal(err) + } + + err = tx.One("ID", 2, &account2) + + if err != nil { + log.Fatal(err) + } + + account1.Amount -= 1000 + account2.Amount += 1000 + + err = tx.Save(account1) + + if err != nil { + tx.Rollback() + log.Fatal(err) + } + + err = tx.Save(account2) + + if err != nil { + tx.Rollback() + log.Fatal(err) + } + + tx.Commit() + + var account1Reloaded, account2Reloaded Account + + err = db.One("ID", 1, &account1Reloaded) + + if err != nil { + log.Fatal(err) + } + + err = db.One("ID", 2, &account2Reloaded) + + if err != nil { + log.Fatal(err) + } + + fmt.Println("Amount in account 1:", account1Reloaded.Amount) + fmt.Println("Amount in account 2:", account2Reloaded.Amount) + + // Output: + // Amount in account 1: 9000 + // Amount in account 2: 11000 +} + +func ExampleDB_From() { + dir, db := prepareDB() + defer os.RemoveAll(dir) + defer db.Close() + + // Create some sub buckets to partition the data. + privateNotes := db.From("notes", "private") + workNotes := db.From("notes", "work") + + err := privateNotes.Save(&Note{ID: "private1", Text: "This is some private text."}) + + if err != nil { + log.Fatal(err) + } + + err = workNotes.Save(&Note{ID: "work1", Text: "Work related."}) + + if err != nil { + log.Fatal(err) + } + + var privateNote, workNote, personalNote Note + + err = privateNotes.One("ID", "work1", &workNote) + + // Not found: Wrong bucket. + fmt.Println(err) + + err = workNotes.One("ID", "work1", &workNote) + + if err != nil { + log.Fatal(err) + } + + err = privateNotes.One("ID", "private1", &privateNote) + + if err != nil { + log.Fatal(err) + } + + fmt.Println(workNote.Text) + fmt.Println(privateNote.Text) + + // These can be nested further if needed: + personalNotes := privateNotes.From("personal") + err = personalNotes.Save(&Note{ID: "personal1", Text: "This is some very personal text."}) + + if err != nil { + log.Fatal(err) + } + + err = personalNotes.One("ID", "personal1", &personalNote) + + if err != nil { + log.Fatal(err) + } + + fmt.Println(personalNote.Text) + + // Output: + // not found + // Work related. + // This is some private text. + // This is some very personal text. +} + +type User struct { + ID int `storm:"id"` + Group string `storm:"index"` + Email string `storm:"unique"` + Name string + Age int `storm:"index"` + CreatedAt time.Time `storm:"index"` +} + +type Account struct { + ID int `storm:"id"` + Amount int64 // amount in cents +} + +type Note struct { + ID string `storm:"id"` + Text string +} + +func prepareDB() (string, *storm.DB) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.AutoIncrement()) + + for i, name := range []string{"John", "Eric", "Dilbert"} { + email := strings.ToLower(name + "@provider.com") + user := User{ + Group: "staff", + Email: email, + Name: name, + Age: 21 + i, + CreatedAt: time.Now(), + } + err := db.Save(&user) + + if err != nil { + log.Fatal(err) + } + } + + for i := int64(0); i < 10; i++ { + account := Account{Amount: 10000} + + err := db.Save(&account) + + if err != nil { + log.Fatal(err) + } + } + + return dir, db + +} diff --git a/vendor/src/github.com/asdine/storm/extract.go b/vendor/src/github.com/asdine/storm/extract.go new file mode 100644 index 0000000..83a5ecf --- /dev/null +++ b/vendor/src/github.com/asdine/storm/extract.go @@ -0,0 +1,166 @@ +package storm + +import ( + "reflect" + + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Storm tags +const ( + tagID = "id" + tagIdx = "index" + tagUniqueIdx = "unique" + tagInline = "inline" + indexPrefix = "__storm_index_" +) + +type indexInfo struct { + Type string + Field *structs.Field +} + +// modelInfo is a structure gathering all the relevant informations about a model +type modelInfo struct { + Name string + Indexes map[string]indexInfo + ID identInfo + data interface{} +} + +func (m *modelInfo) AddIndex(f *structs.Field, indexType string, override bool) { + fieldName := f.Name() + if _, ok := m.Indexes[fieldName]; !ok || override { + m.Indexes[fieldName] = indexInfo{ + Type: indexType, + Field: f, + } + } +} + +func (m *modelInfo) AllByType(indexType string) []indexInfo { + var idx []indexInfo + for k := range m.Indexes { + if m.Indexes[k].Type == indexType { + idx = append(idx, m.Indexes[k]) + } + } + + return idx +} + +func extract(data interface{}, mi ...*modelInfo) (*modelInfo, error) { + s := structs.New(data) + fields := s.Fields() + + var child bool + + var m *modelInfo + if len(mi) > 0 { + m = mi[0] + child = true + } else { + m = &modelInfo{} + m.Indexes = make(map[string]indexInfo) + m.data = data + } + + if m.Name == "" { + m.Name = s.Name() + } + + for _, f := range fields { + if !f.IsExported() { + continue + } + + err := extractField(f, m, child) + if err != nil { + return nil, err + } + } + + // ID field or tag detected + if m.ID.Field != nil { + if m.ID.Field.IsZero() { + m.ID.IsZero = true + } else { + m.ID.Value = m.ID.Field.Value() + } + } + + if child { + return m, nil + } + + if m.ID.Field == nil { + return nil, ErrNoID + } + + if m.Name == "" { + return nil, ErrNoName + } + + return m, nil +} + +func extractField(f *structs.Field, m *modelInfo, isChild bool) error { + tag := f.Tag("storm") + if tag != "" { + switch tag { + case "id": + m.ID.Field = f + case tagUniqueIdx, tagIdx: + m.AddIndex(f, tag, !isChild) + case tagInline: + if structs.IsStruct(f.Value()) { + _, err := extract(f.Value(), m) + if err != nil { + return err + } + } + default: + return ErrUnknownTag + } + } + + // the field is named ID and no ID field has been detected before + if f.Name() == "ID" && m.ID.Field == nil { + m.ID.Field = f + } + + return nil +} + +// Prefill the most requested informations +type identInfo struct { + Field *structs.Field + IsZero bool + Value interface{} +} + +func (i *identInfo) Type() reflect.Type { + return reflect.TypeOf(i.Field.Value()) +} + +func (i *identInfo) IsOfIntegerFamily() bool { + return i.Field != nil && i.Field.Kind() >= reflect.Int && i.Field.Kind() <= reflect.Uint64 +} + +func getIndex(bucket *bolt.Bucket, idxKind string, fieldName string) (index.Index, error) { + var idx index.Index + var err error + + switch idxKind { + case tagUniqueIdx: + idx, err = index.NewUniqueIndex(bucket, []byte(indexPrefix+fieldName)) + case tagIdx: + idx, err = index.NewListIndex(bucket, []byte(indexPrefix+fieldName)) + default: + err = ErrIdxNotFound + } + + return idx, err +} diff --git a/vendor/src/github.com/asdine/storm/extract_test.go b/vendor/src/github.com/asdine/storm/extract_test.go new file mode 100644 index 0000000..9f81408 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/extract_test.go @@ -0,0 +1,57 @@ +package storm + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtractNoTags(t *testing.T) { + s := ClassicNoTags{} + _, err := extract(&s) + assert.Error(t, err) + assert.Equal(t, ErrNoID, err) +} + +func TestExtractBadTags(t *testing.T) { + s := ClassicBadTags{} + infos, err := extract(&s) + assert.Error(t, err) + assert.Equal(t, ErrUnknownTag, err) + assert.Nil(t, infos) +} + +func TestExtractUniqueTags(t *testing.T) { + s := ClassicUnique{ID: "id"} + infos, err := extract(&s) + assert.NoError(t, err) + assert.NotNil(t, infos) + assert.NotNil(t, infos.ID) + assert.False(t, infos.ID.IsZero) + assert.Equal(t, "ClassicUnique", infos.Name) + assert.Len(t, infos.AllByType("index"), 0) + assert.Len(t, infos.AllByType("unique"), 4) +} + +func TestExtractIndexTags(t *testing.T) { + s := ClassicIndex{ID: "id"} + infos, err := extract(&s) + assert.NoError(t, err) + assert.NotNil(t, infos) + assert.NotNil(t, infos.ID) + assert.False(t, infos.ID.IsZero) + assert.Equal(t, "ClassicIndex", infos.Name) + assert.Len(t, infos.AllByType("index"), 5) + assert.Len(t, infos.AllByType("unique"), 0) +} + +func TestExtractInlineWithIndex(t *testing.T) { + s := ClassicInline{ToEmbed: &ToEmbed{ID: "50"}} + infos, err := extract(&s) + assert.NoError(t, err) + assert.NotNil(t, infos) + assert.NotNil(t, infos.ID) + assert.Equal(t, "ClassicInline", infos.Name) + assert.Len(t, infos.AllByType("index"), 3) + assert.Len(t, infos.AllByType("unique"), 2) +} diff --git a/vendor/src/github.com/asdine/storm/find.go b/vendor/src/github.com/asdine/storm/find.go new file mode 100644 index 0000000..1943e39 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/find.go @@ -0,0 +1,95 @@ +package storm + +import ( + "fmt" + "reflect" + + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Find returns one or more records by the specified index +func (n *Node) Find(fieldName string, value interface{}, to interface{}, options ...func(q *index.Options)) error { + ref := reflect.ValueOf(to) + + if ref.Kind() != reflect.Ptr || reflect.Indirect(ref).Kind() != reflect.Slice { + return ErrSlicePtrNeeded + } + + typ := reflect.Indirect(ref).Type().Elem() + newElem := reflect.New(typ) + + d := structs.New(newElem.Interface()) + bucketName := d.Name() + if bucketName == "" { + return ErrNoName + } + + field, ok := d.FieldOk(fieldName) + if !ok { + return fmt.Errorf("field %s not found", fieldName) + } + + tag := field.Tag("storm") + if tag == "" { + return fmt.Errorf("index %s not found", fieldName) + } + + val, err := toBytes(value, n.s.Codec) + if err != nil { + return err + } + + opts := index.NewOptions() + for _, fn := range options { + fn(opts) + } + + if n.tx != nil { + return n.find(n.tx, bucketName, fieldName, tag, &ref, val, opts) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.find(tx, bucketName, fieldName, tag, &ref, val, opts) + }) +} + +func (n *Node) find(tx *bolt.Tx, bucketName, fieldName, tag string, ref *reflect.Value, val []byte, opts *index.Options) error { + bucket := n.GetBucket(tx, bucketName) + if bucket == nil { + return fmt.Errorf("bucket %s not found", bucketName) + } + + idx, err := getIndex(bucket, tag, fieldName) + if err != nil { + return err + } + + list, err := idx.All(val, opts) + if err != nil { + return err + } + + results := reflect.MakeSlice(reflect.Indirect(*ref).Type(), len(list), len(list)) + + for i := range list { + raw := bucket.Get(list[i]) + if raw == nil { + return ErrNotFound + } + + err = n.s.Codec.Decode(raw, results.Index(i).Addr().Interface()) + if err != nil { + return err + } + } + + reflect.Indirect(*ref).Set(results) + return nil +} + +// Find returns one or more records by the specified index +func (s *DB) Find(fieldName string, value interface{}, to interface{}, options ...func(q *index.Options)) error { + return s.root.Find(fieldName, value, to, options...) +} diff --git a/vendor/src/github.com/asdine/storm/find_test.go b/vendor/src/github.com/asdine/storm/find_test.go new file mode 100644 index 0000000..4d6be01 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/find_test.go @@ -0,0 +1,77 @@ +package storm + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFind(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + for i := 0; i < 100; i++ { + w := User{Name: "John", ID: i + 1, Slug: fmt.Sprintf("John%d", i+1)} + err := db.Save(&w) + assert.NoError(t, err) + } + + err := db.Find("Name", "John", &User{}) + assert.Error(t, err) + assert.Equal(t, ErrSlicePtrNeeded, err) + + err = db.Find("Name", "John", &[]struct { + Name string + ID int + }{}) + assert.Error(t, err) + assert.Equal(t, ErrNoName, err) + + notTheRightUsers := []UniqueNameUser{} + + err = db.Find("Name", "John", ¬TheRightUsers) + assert.Error(t, err) + assert.EqualError(t, err, "bucket UniqueNameUser not found") + + users := []User{} + + err = db.Find("Age", "John", &users) + assert.Error(t, err) + assert.EqualError(t, err, "field Age not found") + + err = db.Find("DateOfBirth", "John", &users) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.Find("Group", "John", &users) + assert.Error(t, err) + assert.EqualError(t, err, "index Group not found") + + err = db.Find("Name", "John", &users) + assert.NoError(t, err) + assert.Len(t, users, 100) + assert.Equal(t, 1, users[0].ID) + assert.Equal(t, 100, users[99].ID) + + users = []User{} + err = db.Find("Slug", "John10", &users) + assert.NoError(t, err) + assert.Len(t, users, 1) + assert.Equal(t, 10, users[0].ID) + + users = []User{} + err = db.Find("Name", nil, &users) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.Find("Name", "John", &users, Limit(10), Skip(20)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 21, users[0].ID) + assert.Equal(t, 30, users[9].ID) +} diff --git a/vendor/src/github.com/asdine/storm/get.go b/vendor/src/github.com/asdine/storm/get.go new file mode 100644 index 0000000..e42501c --- /dev/null +++ b/vendor/src/github.com/asdine/storm/get.go @@ -0,0 +1,48 @@ +package storm + +import ( + "reflect" + + "github.com/boltdb/bolt" +) + +// Get a value from a bucket +func (n *Node) Get(bucketName string, key interface{}, to interface{}) error { + ref := reflect.ValueOf(to) + + if !ref.IsValid() || ref.Kind() != reflect.Ptr { + return ErrPtrNeeded + } + + id, err := toBytes(key, n.s.Codec) + if err != nil { + return err + } + + if n.tx != nil { + return n.get(n.tx, bucketName, id, to) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.get(tx, bucketName, id, to) + }) +} + +func (n *Node) get(tx *bolt.Tx, bucketName string, id []byte, to interface{}) error { + bucket := n.GetBucket(tx, bucketName) + if bucket == nil { + return ErrNotFound + } + + raw := bucket.Get(id) + if raw == nil { + return ErrNotFound + } + + return n.s.Codec.Decode(raw, to) +} + +// Get a value from a bucket +func (s *DB) Get(bucketName string, key interface{}, to interface{}) error { + return s.root.Get(bucketName, key, to) +} diff --git a/vendor/src/github.com/asdine/storm/get_test.go b/vendor/src/github.com/asdine/storm/get_test.go new file mode 100644 index 0000000..43d3d40 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/get_test.go @@ -0,0 +1,53 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestGet(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Set("trash", 10, 100) + assert.NoError(t, err) + + var nb int + err = db.Get("trash", 10, &nb) + assert.NoError(t, err) + assert.Equal(t, 100, nb) + + tm := time.Now() + err = db.Set("logs", tm, "I'm hungry") + assert.NoError(t, err) + + var message string + err = db.Get("logs", tm, &message) + assert.NoError(t, err) + assert.Equal(t, "I'm hungry", message) + + var hand int + err = db.Get("wallet", "100 bucks", &hand) + assert.Equal(t, ErrNotFound, err) + + err = db.Set("wallet", "10 bucks", 10) + assert.NoError(t, err) + + err = db.Get("wallet", "100 bucks", &hand) + assert.Equal(t, ErrNotFound, err) + + err = db.Get("logs", tm, nil) + assert.Equal(t, ErrPtrNeeded, err) + + err = db.Get("", nil, nil) + assert.Equal(t, ErrPtrNeeded, err) + + err = db.Get("", "100 bucks", &hand) + assert.Equal(t, ErrNotFound, err) +} diff --git a/vendor/src/github.com/asdine/storm/helpers.go b/vendor/src/github.com/asdine/storm/helpers.go new file mode 100644 index 0000000..5c8b309 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/helpers.go @@ -0,0 +1,18 @@ +package storm + +import "github.com/asdine/storm/codec" + +// toBytes turns an interface into a slice of bytes +func toBytes(key interface{}, encoder codec.EncodeDecoder) ([]byte, error) { + if key == nil { + return nil, nil + } + if k, ok := key.([]byte); ok { + return k, nil + } + if k, ok := key.(string); ok { + return []byte(k), nil + } + + return encoder.Encode(key) +} diff --git a/vendor/src/github.com/asdine/storm/helpers_test.go b/vendor/src/github.com/asdine/storm/helpers_test.go new file mode 100644 index 0000000..4a5928b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/helpers_test.go @@ -0,0 +1,41 @@ +package storm + +import ( + "testing" + + "github.com/asdine/storm/codec/gob" + "github.com/asdine/storm/codec/json" + "github.com/stretchr/testify/assert" +) + +func TestToBytes(t *testing.T) { + b, err := toBytes([]byte("a slice of bytes"), gob.Codec) + assert.NoError(t, err) + assert.Equal(t, []byte("a slice of bytes"), b) + + b, err = toBytes("a string", gob.Codec) + assert.NoError(t, err) + assert.Equal(t, []byte("a string"), b) + + b, err = toBytes(5, gob.Codec) + assert.NoError(t, err) + assert.NotNil(t, b) + + b, err = toBytes([]byte("Hey"), gob.Codec) + assert.NoError(t, err) + assert.Equal(t, []byte("Hey"), b) +} + +func TestToBytesWithCodec(t *testing.T) { + b, err := toBytes([]byte("a slice of bytes"), json.Codec) + assert.NoError(t, err) + assert.Equal(t, []byte("a slice of bytes"), b) + + b, err = toBytes("a string", json.Codec) + assert.NoError(t, err) + assert.Equal(t, []byte("a string"), b) + + b, err = toBytes(&SimpleUser{ID: 10, Name: "John", age: 100}, json.Codec) + assert.NoError(t, err) + assert.Equal(t, `{"ID":10,"Name":"John"}`, string(b)) +} diff --git a/vendor/src/github.com/asdine/storm/index/errors.go b/vendor/src/github.com/asdine/storm/index/errors.go new file mode 100644 index 0000000..b8c66c6 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/errors.go @@ -0,0 +1,14 @@ +package index + +import "errors" + +var ( + // ErrNotFound is returned when the specified record is not saved in the bucket. + ErrNotFound = errors.New("not found") + + // ErrAlreadyExists is returned uses when trying to set an existing value on a field that has a unique index. + ErrAlreadyExists = errors.New("already exists") + + // ErrNilParam is returned when the specified param is expected to be not nil. + ErrNilParam = errors.New("param must not be nil") +) diff --git a/vendor/src/github.com/asdine/storm/index/indexes.go b/vendor/src/github.com/asdine/storm/index/indexes.go new file mode 100644 index 0000000..6564840 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/indexes.go @@ -0,0 +1,12 @@ +package index + +// Index interface +type Index interface { + Add(value []byte, targetID []byte) error + Remove(value []byte) error + RemoveID(id []byte) error + Get(value []byte) []byte + All(value []byte, opts *Options) ([][]byte, error) + AllRecords(opts *Options) ([][]byte, error) + Range(min []byte, max []byte, opts *Options) ([][]byte, error) +} diff --git a/vendor/src/github.com/asdine/storm/index/list.go b/vendor/src/github.com/asdine/storm/index/list.go new file mode 100644 index 0000000..3bedce3 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/list.go @@ -0,0 +1,183 @@ +package index + +import ( + "bytes" + + "github.com/boltdb/bolt" +) + +// NewListIndex loads a ListIndex +func NewListIndex(parent *bolt.Bucket, indexName []byte) (*ListIndex, error) { + var err error + b := parent.Bucket(indexName) + if b == nil { + if !parent.Writable() { + return nil, ErrNotFound + } + b, err = parent.CreateBucket(indexName) + if err != nil { + return nil, err + } + } + + ids, err := NewUniqueIndex(b, []byte("storm__ids")) + if err != nil { + return nil, err + } + + return &ListIndex{ + IndexBucket: b, + Parent: parent, + IDs: ids, + }, nil +} + +// ListIndex is an index that references values and the corresponding IDs. +type ListIndex struct { + Parent *bolt.Bucket + IndexBucket *bolt.Bucket + IDs *UniqueIndex +} + +// Add a value to the list index +func (idx *ListIndex) Add(value []byte, targetID []byte) error { + if value == nil || len(value) == 0 { + return ErrNilParam + } + if targetID == nil || len(targetID) == 0 { + return ErrNilParam + } + + oldValue := idx.IDs.Get(targetID) + if oldValue != nil { + uni, err := NewUniqueIndex(idx.IndexBucket, oldValue) + if err != nil { + return err + } + + err = uni.Remove(targetID) + if err != nil { + return err + } + + err = idx.IDs.Remove(targetID) + if err != nil { + return err + } + } + + uni, err := NewUniqueIndex(idx.IndexBucket, value) + if err != nil { + return err + } + + err = uni.Add(targetID, targetID) + if err != nil { + return err + } + + return idx.IDs.Add(targetID, value) +} + +// Remove a value from the unique index +func (idx *ListIndex) Remove(value []byte) error { + err := idx.IDs.RemoveID(value) + if err != nil { + return err + } + return idx.IndexBucket.DeleteBucket(value) +} + +// RemoveID removes an ID from the list index +func (idx *ListIndex) RemoveID(targetID []byte) error { + c := idx.IndexBucket.Cursor() + + for bucketName, val := c.First(); bucketName != nil; bucketName, val = c.Next() { + if val != nil { + continue + } + + uni, err := NewUniqueIndex(idx.IndexBucket, bucketName) + if err != nil { + return err + } + + err = uni.Remove(targetID) + if err != nil { + return err + } + } + + return idx.IDs.Remove(targetID) +} + +// Get the first ID corresponding to the given value +func (idx *ListIndex) Get(value []byte) []byte { + uni, err := NewUniqueIndex(idx.IndexBucket, value) + if err != nil { + return nil + } + return uni.first() +} + +// All the IDs corresponding to the given value +func (idx *ListIndex) All(value []byte, opts *Options) ([][]byte, error) { + uni, err := NewUniqueIndex(idx.IndexBucket, value) + if err != nil { + return nil, err + } + return uni.AllRecords(opts) +} + +// AllRecords returns all the IDs of this index +func (idx *ListIndex) AllRecords(opts *Options) ([][]byte, error) { + var list [][]byte + + c := idx.IndexBucket.Cursor() + + for bucketName, val := c.First(); bucketName != nil; bucketName, val = c.Next() { + if val != nil || bytes.Equal(bucketName, []byte("storm__ids")) { + continue + } + + uni, err := NewUniqueIndex(idx.IndexBucket, bucketName) + if err != nil { + return nil, err + } + + all, err := uni.AllRecords(opts) + if err != nil { + return nil, err + } + list = append(list, all...) + } + + return list, nil +} + +// Range returns the ids corresponding to the given range of values +func (idx *ListIndex) Range(min []byte, max []byte, opts *Options) ([][]byte, error) { + var list [][]byte + + c := idx.IndexBucket.Cursor() + + for bucketName, val := c.Seek(min); bucketName != nil && bytes.Compare(bucketName, max) <= 0; bucketName, val = c.Next() { + if val != nil || bytes.Equal(bucketName, []byte("storm__ids")) { + continue + } + + uni, err := NewUniqueIndex(idx.IndexBucket, bucketName) + if err != nil { + return nil, err + } + + all, err := uni.AllRecords(opts) + if err != nil { + return nil, err + } + + list = append(list, all...) + } + + return list, nil +} diff --git a/vendor/src/github.com/asdine/storm/index/list_test.go b/vendor/src/github.com/asdine/storm/index/list_test.go new file mode 100644 index 0000000..45c7417 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/list_test.go @@ -0,0 +1,127 @@ +package index_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/asdine/storm" + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestListIndex(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := storm.Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + err := db.Bolt.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("test")) + assert.NoError(t, err) + + idx, err := index.NewListIndex(b, []byte("lindex1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id2")) + assert.NoError(t, err) + + err = idx.Add([]byte("goodbye"), []byte("id2")) + assert.NoError(t, err) + + err = idx.Add(nil, []byte("id2")) + assert.Error(t, err) + assert.Equal(t, index.ErrNilParam, err) + + err = idx.Add([]byte("hi"), nil) + assert.Error(t, err) + assert.Equal(t, index.ErrNilParam, err) + + ids, err := idx.All([]byte("hello"), nil) + assert.Len(t, ids, 1) + assert.Equal(t, []byte("id1"), ids[0]) + + ids, err = idx.All([]byte("goodbye"), nil) + assert.Len(t, ids, 1) + assert.Equal(t, []byte("id2"), ids[0]) + + ids, err = idx.All([]byte("yo"), nil) + assert.Nil(t, ids) + + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + + ids, err = idx.All([]byte("goodbye"), nil) + assert.Len(t, ids, 0) + + err = idx.RemoveID(nil) + assert.NoError(t, err) + + err = idx.RemoveID([]byte("id1")) + assert.NoError(t, err) + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + err = idx.RemoveID([]byte("id3")) + assert.NoError(t, err) + + ids, err = idx.All([]byte("hello"), nil) + assert.NoError(t, err) + assert.Nil(t, ids) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hi"), []byte("id2")) + assert.NoError(t, err) + + err = idx.Add([]byte("yo"), []byte("id3")) + assert.NoError(t, err) + + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + + ids, err = idx.All([]byte("hello"), nil) + assert.Len(t, ids, 1) + assert.Equal(t, []byte("id1"), ids[0]) + ids, err = idx.All([]byte("hi"), nil) + assert.Len(t, ids, 0) + ids, err = idx.All([]byte("yo"), nil) + assert.Len(t, ids, 1) + assert.Equal(t, []byte("id3"), ids[0]) + + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + err = idx.RemoveID([]byte("id4")) + assert.NoError(t, err) + + err = idx.Add([]byte("hey"), []byte("id1")) + err = idx.Add([]byte("hey"), []byte("id2")) + err = idx.Add([]byte("hey"), []byte("id3")) + err = idx.Add([]byte("hey"), []byte("id4")) + ids, err = idx.All([]byte("hey"), nil) + assert.Len(t, ids, 4) + + id := idx.Get([]byte("hey")) + assert.Equal(t, []byte("id1"), id) + + idx.Remove([]byte("hey")) + ids, err = idx.All([]byte("hey"), nil) + assert.NoError(t, err) + assert.Len(t, ids, 0) + + ids, err = idx.All([]byte("hey"), nil) + assert.NoError(t, err) + assert.Len(t, ids, 0) + return nil + }) + + assert.NoError(t, err) +} diff --git a/vendor/src/github.com/asdine/storm/index/options.go b/vendor/src/github.com/asdine/storm/index/options.go new file mode 100644 index 0000000..18fdc4c --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/options.go @@ -0,0 +1,15 @@ +package index + +// NewOptions creates initialized Options +func NewOptions() *Options { + return &Options{ + Limit: -1, + Skip: 0, + } +} + +// Options are used to customize queries +type Options struct { + Limit int + Skip int +} diff --git a/vendor/src/github.com/asdine/storm/index/unique.go b/vendor/src/github.com/asdine/storm/index/unique.go new file mode 100644 index 0000000..16126c6 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/unique.go @@ -0,0 +1,145 @@ +package index + +import ( + "bytes" + + "github.com/boltdb/bolt" +) + +// NewUniqueIndex loads a UniqueIndex +func NewUniqueIndex(parent *bolt.Bucket, indexName []byte) (*UniqueIndex, error) { + var err error + b := parent.Bucket(indexName) + if b == nil { + if !parent.Writable() { + return nil, ErrNotFound + } + b, err = parent.CreateBucket(indexName) + if err != nil { + return nil, err + } + } + + return &UniqueIndex{ + IndexBucket: b, + Parent: parent, + }, nil +} + +// UniqueIndex is an index that references unique values and the corresponding ID. +type UniqueIndex struct { + Parent *bolt.Bucket + IndexBucket *bolt.Bucket +} + +// Add a value to the unique index +func (idx *UniqueIndex) Add(value []byte, targetID []byte) error { + if value == nil || len(value) == 0 { + return ErrNilParam + } + if targetID == nil || len(targetID) == 0 { + return ErrNilParam + } + + exists := idx.IndexBucket.Get(value) + if exists != nil { + if bytes.Equal(exists, targetID) { + return nil + } + return ErrAlreadyExists + } + + return idx.IndexBucket.Put(value, targetID) +} + +// Remove a value from the unique index +func (idx *UniqueIndex) Remove(value []byte) error { + return idx.IndexBucket.Delete(value) +} + +// RemoveID removes an ID from the unique index +func (idx *UniqueIndex) RemoveID(id []byte) error { + c := idx.IndexBucket.Cursor() + + for val, ident := c.First(); val != nil; val, ident = c.Next() { + if bytes.Equal(ident, id) { + return idx.Remove(val) + } + } + return nil +} + +// Get the id corresponding to the given value +func (idx *UniqueIndex) Get(value []byte) []byte { + return idx.IndexBucket.Get(value) +} + +// All returns all the ids corresponding to the given value +func (idx *UniqueIndex) All(value []byte, opts *Options) ([][]byte, error) { + id := idx.IndexBucket.Get(value) + if id != nil { + return [][]byte{id}, nil + } + + return nil, nil +} + +// AllRecords returns all the IDs of this index +func (idx *UniqueIndex) AllRecords(opts *Options) ([][]byte, error) { + var list [][]byte + + c := idx.IndexBucket.Cursor() + + for val, ident := c.First(); val != nil; val, ident = c.Next() { + if opts != nil && opts.Skip > 0 { + opts.Skip-- + continue + } + + if opts != nil && opts.Limit == 0 { + break + } + + if opts != nil && opts.Limit > 0 { + opts.Limit-- + } + + list = append(list, ident) + } + return list, nil +} + +// Range returns the ids corresponding to the given range of values +func (idx *UniqueIndex) Range(min []byte, max []byte, opts *Options) ([][]byte, error) { + var list [][]byte + + c := idx.IndexBucket.Cursor() + + for val, ident := c.Seek(min); val != nil && bytes.Compare(val, max) <= 0; val, ident = c.Next() { + if opts != nil && opts.Skip > 0 { + opts.Skip-- + continue + } + + if opts != nil && opts.Limit == 0 { + break + } + + if opts != nil && opts.Limit > 0 { + opts.Limit-- + } + + list = append(list, ident) + } + return list, nil +} + +// first returns the first ID of this index +func (idx *UniqueIndex) first() []byte { + c := idx.IndexBucket.Cursor() + + for val, ident := c.First(); val != nil; val, ident = c.Next() { + return ident + } + return nil +} diff --git a/vendor/src/github.com/asdine/storm/index/unique_test.go b/vendor/src/github.com/asdine/storm/index/unique_test.go new file mode 100644 index 0000000..b7e1dd2 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/index/unique_test.go @@ -0,0 +1,152 @@ +package index_test + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/asdine/storm" + "github.com/asdine/storm/codec/gob" + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestUniqueIndex(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := storm.Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + err := db.Bolt.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("test")) + assert.NoError(t, err) + + idx, err := index.NewUniqueIndex(b, []byte("uindex1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hello"), []byte("id2")) + assert.Error(t, err) + assert.Equal(t, index.ErrAlreadyExists, err) + + err = idx.Add(nil, []byte("id2")) + assert.Error(t, err) + assert.Equal(t, index.ErrNilParam, err) + + err = idx.Add([]byte("hi"), nil) + assert.Error(t, err) + assert.Equal(t, index.ErrNilParam, err) + + id := idx.Get([]byte("hello")) + assert.Equal(t, []byte("id1"), id) + + id = idx.Get([]byte("goodbye")) + assert.Nil(t, id) + + err = idx.Remove([]byte("hello")) + assert.NoError(t, err) + + err = idx.Remove(nil) + assert.NoError(t, err) + + id = idx.Get([]byte("hello")) + assert.Nil(t, id) + + err = idx.Add([]byte("hello"), []byte("id1")) + assert.NoError(t, err) + + err = idx.Add([]byte("hi"), []byte("id2")) + assert.NoError(t, err) + + err = idx.Add([]byte("yo"), []byte("id3")) + assert.NoError(t, err) + + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + + id = idx.Get([]byte("hello")) + assert.Equal(t, []byte("id1"), id) + id = idx.Get([]byte("hi")) + assert.Nil(t, id) + id = idx.Get([]byte("yo")) + assert.Equal(t, []byte("id3"), id) + ids, err := idx.All([]byte("yo"), nil) + assert.NoError(t, err) + assert.Len(t, ids, 1) + assert.Equal(t, []byte("id3"), ids[0]) + + err = idx.RemoveID([]byte("id2")) + assert.NoError(t, err) + err = idx.RemoveID([]byte("id4")) + assert.NoError(t, err) + return nil + }) + + assert.NoError(t, err) +} + +func TestUniqueIndexRange(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := storm.Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + db.Bolt.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("test")) + assert.NoError(t, err) + + idx, err := index.NewUniqueIndex(b, []byte("uindex1")) + assert.NoError(t, err) + + for i := 0; i < 10; i++ { + val, _ := gob.Codec.Encode(i) + err = idx.Add(val, val) + assert.NoError(t, err) + } + + min, _ := gob.Codec.Encode(3) + max, _ := gob.Codec.Encode(5) + list, err := idx.Range(min, max, nil) + assert.Len(t, list, 3) + assert.NoError(t, err) + + min, _ = gob.Codec.Encode(11) + max, _ = gob.Codec.Encode(20) + list, err = idx.Range(min, max, nil) + assert.Len(t, list, 0) + assert.NoError(t, err) + + min, _ = gob.Codec.Encode(7) + max, _ = gob.Codec.Encode(2) + list, err = idx.Range(min, max, nil) + assert.Len(t, list, 0) + assert.NoError(t, err) + + min, _ = gob.Codec.Encode(-5) + max, _ = gob.Codec.Encode(2) + list, err = idx.Range(min, max, nil) + assert.Len(t, list, 0) + assert.NoError(t, err) + + min, _ = gob.Codec.Encode(3) + max, _ = gob.Codec.Encode(7) + opts := index.NewOptions() + opts.Skip = 2 + list, err = idx.Range(min, max, opts) + assert.Len(t, list, 3) + assert.NoError(t, err) + + opts.Limit = 2 + list, err = idx.Range(min, max, opts) + assert.Len(t, list, 2) + assert.NoError(t, err) + return nil + }) +} diff --git a/vendor/src/github.com/asdine/storm/init.go b/vendor/src/github.com/asdine/storm/init.go new file mode 100644 index 0000000..5c73b4d --- /dev/null +++ b/vendor/src/github.com/asdine/storm/init.go @@ -0,0 +1,57 @@ +package storm + +import ( + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Init creates the indexes and buckets for a given structure +func (n *Node) Init(data interface{}) error { + if !structs.IsStruct(data) { + return ErrBadType + } + + info, err := extract(data) + if err != nil { + return err + } + + if n.tx != nil { + return n.init(n.tx, info) + } + + err = n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.init(tx, info) + }) + return err +} + +func (n *Node) init(tx *bolt.Tx, info *modelInfo) error { + bucket, err := n.CreateBucketIfNotExists(tx, info.Name) + if err != nil { + return err + } + + for fieldName, idxInfo := range info.Indexes { + switch idxInfo.Type { + case tagUniqueIdx: + _, err = index.NewUniqueIndex(bucket, []byte(indexPrefix+fieldName)) + case tagIdx: + _, err = index.NewListIndex(bucket, []byte(indexPrefix+fieldName)) + default: + err = ErrIdxNotFound + } + + if err != nil { + return err + } + } + + return nil +} + +// Init creates the indexes and buckets for a given structure +func (s *DB) Init(data interface{}) error { + return s.root.Init(data) +} diff --git a/vendor/src/github.com/asdine/storm/init_test.go b/vendor/src/github.com/asdine/storm/init_test.go new file mode 100644 index 0000000..df595f4 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/init_test.go @@ -0,0 +1,45 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInit(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + var u IndexedNameUser + err := db.One("Name", "John", &u) + assert.Error(t, err) + assert.EqualError(t, err, "bucket IndexedNameUser doesn't exist") + + err = db.Init(&u) + assert.NoError(t, err) + + err = db.One("Name", "John", &u) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.Init(&ClassicBadTags{}) + assert.Error(t, err) + assert.Equal(t, ErrUnknownTag, err) + + err = db.Init(10) + assert.Error(t, err) + assert.Equal(t, ErrBadType, err) + + err = db.Init(&ClassicNoTags{}) + assert.Error(t, err) + assert.Equal(t, ErrNoID, err) + + err = db.Init(&struct{ ID string }{}) + assert.Error(t, err) + assert.Equal(t, ErrNoName, err) +} diff --git a/vendor/src/github.com/asdine/storm/node.go b/vendor/src/github.com/asdine/storm/node.go new file mode 100644 index 0000000..e6e5b4b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/node.go @@ -0,0 +1,27 @@ +package storm + +import "github.com/boltdb/bolt" + +// A Node in Storm represents the API to a BoltDB bucket. +type Node struct { + s *DB + + // The root bucket. In the normal, simple case this will be empty. + rootBucket []string + + // Transaction object. Nil if not in transaction + tx *bolt.Tx +} + +// From returns a new Storm node with a new bucket root below the current. +// All DB operations on the new node will be executed relative to this bucket. +func (n Node) From(addend ...string) *Node { + n.rootBucket = append(n.rootBucket, addend...) + return &n +} + +// WithTransaction returns a New Storm node that will use the given transaction. +func (n Node) WithTransaction(tx *bolt.Tx) *Node { + n.tx = tx + return &n +} diff --git a/vendor/src/github.com/asdine/storm/node_test.go b/vendor/src/github.com/asdine/storm/node_test.go new file mode 100644 index 0000000..cd62541 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/node_test.go @@ -0,0 +1,48 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestNode(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db"), Root("a")) + defer db.Close() + + n1 := db.From("b", "c") + assert.Equal(t, db, n1.s) + assert.NotEqual(t, db.root, n1) + assert.Equal(t, db.root.rootBucket, []string{"a"}) + assert.Equal(t, []string{"b", "c"}, n1.rootBucket) + n2 := n1.From("d", "e") + assert.Equal(t, []string{"b", "c", "d", "e"}, n2.rootBucket) +} + +func TestNodeWithTransaction(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db"), Root("a")) + defer db.Close() + + var user User + db.Bolt.Update(func(tx *bolt.Tx) error { + dbx := db.WithTransaction(tx) + err := dbx.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + err = dbx.One("ID", 10, &user) + assert.NoError(t, err) + assert.Equal(t, "John", user.Name) + return nil + }) + + err := db.One("ID", 10, &user) + assert.NoError(t, err) + +} diff --git a/vendor/src/github.com/asdine/storm/one.go b/vendor/src/github.com/asdine/storm/one.go new file mode 100644 index 0000000..4d31d2e --- /dev/null +++ b/vendor/src/github.com/asdine/storm/one.go @@ -0,0 +1,80 @@ +package storm + +import ( + "fmt" + "reflect" + + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// One returns one record by the specified index +func (n *Node) One(fieldName string, value interface{}, to interface{}) error { + ref := reflect.ValueOf(to) + + if !ref.IsValid() || (ref.Kind() != reflect.Ptr && structs.IsStruct(to)) { + return ErrStructPtrNeeded + } + + if fieldName == "" { + return ErrNotFound + } + + info, err := extract(to) + if err != nil { + return err + } + + val, err := toBytes(value, n.s.Codec) + if err != nil { + return err + } + + if n.tx != nil { + return n.one(n.tx, fieldName, info, to, val, fieldName == info.ID.Field.Name()) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.one(tx, fieldName, info, to, val, fieldName == info.ID.Field.Name()) + }) +} + +func (n *Node) one(tx *bolt.Tx, fieldName string, info *modelInfo, to interface{}, val []byte, skipIndex bool) error { + bucket := n.GetBucket(tx, info.Name) + if bucket == nil { + return fmt.Errorf("bucket %s doesn't exist", info.Name) + } + + var id []byte + if !skipIndex { + idxInfo, ok := info.Indexes[fieldName] + if !ok { + return ErrNotFound + } + + idx, err := getIndex(bucket, idxInfo.Type, fieldName) + if err != nil { + return err + } + + id = idx.Get(val) + } else { + id = val + } + + if id == nil { + return ErrNotFound + } + + raw := bucket.Get(id) + if raw == nil { + return ErrNotFound + } + + return n.s.Codec.Decode(raw, to) +} + +// One returns one record by the specified index +func (s *DB) One(fieldName string, value interface{}, to interface{}) error { + return s.root.One(fieldName, value, to) +} diff --git a/vendor/src/github.com/asdine/storm/one_test.go b/vendor/src/github.com/asdine/storm/one_test.go new file mode 100644 index 0000000..fbe62c0 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/one_test.go @@ -0,0 +1,108 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestOne(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + u := UniqueNameUser{Name: "John", ID: 10} + err := db.Save(&u) + assert.NoError(t, err) + + v := UniqueNameUser{} + err = db.One("Name", "John", &v) + assert.NoError(t, err) + assert.Equal(t, u, v) + + for i := 0; i < 10; i++ { + w := IndexedNameUser{Name: "John", ID: i + 1} + err := db.Save(&w) + assert.NoError(t, err) + } + + x := IndexedNameUser{} + err = db.One("Name", "John", &x) + assert.NoError(t, err) + assert.Equal(t, "John", x.Name) + assert.Equal(t, 1, x.ID) + assert.Zero(t, x.age) + assert.True(t, x.DateOfBirth.IsZero()) + + err = db.One("Name", "Mike", &x) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.One("", nil, &x) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.One("", "Mike", nil) + assert.Error(t, err) + assert.Equal(t, ErrStructPtrNeeded, err) + + err = db.One("", nil, nil) + assert.Error(t, err) + assert.Equal(t, ErrStructPtrNeeded, err) + + y := UniqueNameUser{Name: "Jake", ID: 200} + err = db.Save(&y) + assert.NoError(t, err) + + var y2 UniqueNameUser + err = db.One("ID", 200, &y2) + assert.NoError(t, err) + assert.Equal(t, y, y2) + + n := NestedID{} + n.ID = "100" + n.Name = "John" + + err = db.Save(&n) + assert.NoError(t, err) + + var n2 NestedID + err = db.One("ID", "100", &n2) + assert.NoError(t, err) + assert.Equal(t, n, n2) +} + +func TestOneNotWritable(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + + db.Close() + + db, _ = Open(filepath.Join(dir, "storm.db"), BoltOptions(0660, &bolt.Options{ + ReadOnly: true, + })) + defer db.Close() + + err = db.Save(&User{ID: 20, Name: "John"}) + assert.Error(t, err) + + var u User + err = db.One("ID", 10, &u) + assert.NoError(t, err) + assert.Equal(t, 10, u.ID) + assert.Equal(t, "John", u.Name) + + err = db.One("Name", "John", &u) + assert.NoError(t, err) + assert.Equal(t, 10, u.ID) + assert.Equal(t, "John", u.Name) +} diff --git a/vendor/src/github.com/asdine/storm/options.go b/vendor/src/github.com/asdine/storm/options.go new file mode 100644 index 0000000..68383cf --- /dev/null +++ b/vendor/src/github.com/asdine/storm/options.go @@ -0,0 +1,56 @@ +package storm + +import ( + "os" + + "github.com/asdine/storm/codec" + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" +) + +// BoltOptions used to pass options to BoltDB. +func BoltOptions(mode os.FileMode, options *bolt.Options) func(*DB) error { + return func(d *DB) error { + d.boltMode = mode + d.boltOptions = options + return nil + } +} + +// Codec used to set a custom encoder and decoder. The default is GOB. +func Codec(c codec.EncodeDecoder) func(*DB) error { + return func(d *DB) error { + d.Codec = c + return nil + } +} + +// AutoIncrement used to enable bolt.NextSequence on empty integer ids. +func AutoIncrement() func(*DB) error { + return func(d *DB) error { + d.autoIncrement = true + return nil + } +} + +// Root used to set the root bucket. See also the From method. +func Root(root ...string) func(*DB) error { + return func(d *DB) error { + d.rootBucket = root + return nil + } +} + +// Limit sets the maximum number of records to return +func Limit(limit int) func(*index.Options) { + return func(opts *index.Options) { + opts.Limit = limit + } +} + +// Skip sets the number of records to skip +func Skip(offset int) func(*index.Options) { + return func(opts *index.Options) { + opts.Skip = offset + } +} diff --git a/vendor/src/github.com/asdine/storm/range.go b/vendor/src/github.com/asdine/storm/range.go new file mode 100644 index 0000000..7287c25 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/range.go @@ -0,0 +1,100 @@ +package storm + +import ( + "fmt" + "reflect" + + "github.com/asdine/storm/index" + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Range returns one or more records by the specified index within the specified range +func (n *Node) Range(fieldName string, min, max, to interface{}, options ...func(*index.Options)) error { + ref := reflect.ValueOf(to) + + if ref.Kind() != reflect.Ptr || reflect.Indirect(ref).Kind() != reflect.Slice { + return ErrSlicePtrNeeded + } + + typ := reflect.Indirect(ref).Type().Elem() + newElem := reflect.New(typ) + + d := structs.New(newElem.Interface()) + bucketName := d.Name() + if bucketName == "" { + return ErrNoName + } + + field, ok := d.FieldOk(fieldName) + if !ok { + return fmt.Errorf("field %s not found", fieldName) + } + + tag := field.Tag("storm") + if tag == "" { + return fmt.Errorf("index %s not found", fieldName) + } + + mn, err := toBytes(min, n.s.Codec) + if err != nil { + return err + } + + mx, err := toBytes(max, n.s.Codec) + if err != nil { + return err + } + + opts := index.NewOptions() + for _, fn := range options { + fn(opts) + } + + if n.tx != nil { + return n.rnge(n.tx, bucketName, fieldName, tag, &ref, mn, mx, opts) + } + + return n.s.Bolt.View(func(tx *bolt.Tx) error { + return n.rnge(tx, bucketName, fieldName, tag, &ref, mn, mx, opts) + }) +} + +func (n *Node) rnge(tx *bolt.Tx, bucketName, fieldName, tag string, ref *reflect.Value, min, max []byte, opts *index.Options) error { + bucket := n.GetBucket(tx, bucketName) + if bucket == nil { + return fmt.Errorf("bucket %s not found", bucketName) + } + + idx, err := getIndex(bucket, tag, fieldName) + if err != nil { + return err + } + + list, err := idx.Range(min, max, opts) + if err != nil { + return err + } + + results := reflect.MakeSlice(reflect.Indirect(*ref).Type(), len(list), len(list)) + + for i := range list { + raw := bucket.Get(list[i]) + if raw == nil { + return ErrNotFound + } + + err = n.s.Codec.Decode(raw, results.Index(i).Addr().Interface()) + if err != nil { + return err + } + } + + reflect.Indirect(*ref).Set(results) + return nil +} + +// Range returns one or more records by the specified index within the specified range +func (s *DB) Range(fieldName string, min, max, to interface{}, options ...func(*index.Options)) error { + return s.root.Range(fieldName, min, max, to, options...) +} diff --git a/vendor/src/github.com/asdine/storm/range_test.go b/vendor/src/github.com/asdine/storm/range_test.go new file mode 100644 index 0000000..a7ac560 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/range_test.go @@ -0,0 +1,84 @@ +package storm + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestRange(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + for i := 0; i < 100; i++ { + w := User{ + Name: "John", + ID: i + 1, + Slug: fmt.Sprintf("John%03d", i+1), + DateOfBirth: time.Now().Add(-time.Duration(i) * time.Hour), + } + err := db.Save(&w) + assert.NoError(t, err) + z := User{Name: fmt.Sprintf("Zach%03d", i+1), ID: i + 101, Slug: fmt.Sprintf("Zach%03d", i+1)} + err = db.Save(&z) + assert.NoError(t, err) + } + + min := "John010" + max := "John020" + var users []User + err := db.Range("Slug", min, max, &users) + assert.NoError(t, err) + assert.Len(t, users, 11) + assert.Equal(t, "John010", users[0].Slug) + assert.Equal(t, "John020", users[10].Slug) + + min = "Zach010" + max = "Zach020" + users = nil + err = db.Range("Name", min, max, &users) + assert.NoError(t, err) + assert.Len(t, users, 11) + assert.Equal(t, "Zach010", users[0].Name) + assert.Equal(t, "Zach020", users[10].Name) + + err = db.Range("Name", min, max, &User{}) + assert.Error(t, err) + assert.Equal(t, ErrSlicePtrNeeded, err) + + notTheRightUsers := []UniqueNameUser{} + + err = db.Range("Name", min, max, ¬TheRightUsers) + assert.Error(t, err) + assert.EqualError(t, err, "bucket UniqueNameUser not found") + + users = nil + + err = db.Range("Age", min, max, &users) + assert.Error(t, err) + assert.EqualError(t, err, "field Age not found") + + dateMin := time.Now().Add(-time.Duration(50) * time.Hour) + dateMax := dateMin.Add(time.Duration(3) * time.Hour) + err = db.Range("DateOfBirth", dateMin, dateMax, &users) + assert.NoError(t, err) + assert.Len(t, users, 3) + assert.Equal(t, "John050", users[0].Slug) + assert.Equal(t, "John048", users[2].Slug) + + err = db.Range("Slug", "John010", "John040", &users, Limit(10), Skip(20)) + assert.NoError(t, err) + assert.Len(t, users, 10) + assert.Equal(t, 30, users[0].ID) + assert.Equal(t, 39, users[9].ID) + + err = db.Range("Group", min, max, &users) + assert.Error(t, err) + assert.EqualError(t, err, "index Group not found") +} diff --git a/vendor/src/github.com/asdine/storm/remove.go b/vendor/src/github.com/asdine/storm/remove.go new file mode 100644 index 0000000..060f4aa --- /dev/null +++ b/vendor/src/github.com/asdine/storm/remove.go @@ -0,0 +1,64 @@ +package storm + +import ( + "fmt" + + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Remove removes a structure from the associated bucket +func (n *Node) Remove(data interface{}) error { + if !structs.IsStruct(data) { + return ErrBadType + } + + info, err := extract(data) + if err != nil { + return err + } + + id, err := toBytes(info.ID.Value, n.s.Codec) + if err != nil { + return err + } + + if n.tx != nil { + return n.remove(n.tx, info, id) + } + + return n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.remove(tx, info, id) + }) +} + +func (n *Node) remove(tx *bolt.Tx, info *modelInfo, id []byte) error { + bucket := n.GetBucket(tx, info.Name) + if bucket == nil { + return fmt.Errorf("bucket %s doesn't exist", info.Name) + } + + for fieldName, idxInfo := range info.Indexes { + idx, err := getIndex(bucket, idxInfo.Type, fieldName) + if err != nil { + return err + } + + err = idx.RemoveID(id) + if err != nil { + return err + } + } + + raw := bucket.Get(id) + if raw == nil { + return ErrNotFound + } + + return bucket.Delete(id) +} + +// Remove removes a structure from the associated bucket +func (s *DB) Remove(data interface{}) error { + return s.root.Remove(data) +} diff --git a/vendor/src/github.com/asdine/storm/remove_test.go b/vendor/src/github.com/asdine/storm/remove_test.go new file mode 100644 index 0000000..b16a72f --- /dev/null +++ b/vendor/src/github.com/asdine/storm/remove_test.go @@ -0,0 +1,54 @@ +package storm + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestRemove(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + u1 := IndexedNameUser{ID: 10, Name: "John", age: 10} + err := db.Save(&u1) + assert.NoError(t, err) + + err = db.Remove(&u1) + assert.NoError(t, err) + + err = db.Remove(&u1) + assert.Equal(t, ErrNotFound, err) + + u2 := IndexedNameUser{} + err = db.Get("IndexedNameUser", 10, &u2) + assert.Equal(t, ErrNotFound, err) + + err = db.Remove(nil) + assert.Equal(t, ErrBadType, err) + + var users []User + for i := 0; i < 10; i++ { + user := User{Name: "John", ID: i + 1, Slug: fmt.Sprintf("John%d", i+1), DateOfBirth: time.Now().Add(-time.Duration(i*10) * time.Minute)} + err := db.Save(&user) + assert.NoError(t, err) + users = append(users, user) + } + + err = db.Remove(&users[0]) + assert.NoError(t, err) + err = db.Remove(&users[1]) + assert.NoError(t, err) + + users = nil + err = db.All(&users) + assert.NoError(t, err) + assert.Len(t, users, 8) + assert.Equal(t, 3, users[0].ID) +} diff --git a/vendor/src/github.com/asdine/storm/save.go b/vendor/src/github.com/asdine/storm/save.go new file mode 100644 index 0000000..147be1e --- /dev/null +++ b/vendor/src/github.com/asdine/storm/save.go @@ -0,0 +1,113 @@ +package storm + +import ( + "reflect" + + "github.com/boltdb/bolt" + "github.com/fatih/structs" +) + +// Save a structure +func (n *Node) Save(data interface{}) error { + if !structs.IsStruct(data) { + return ErrBadType + } + + info, err := extract(data) + if err != nil { + return err + } + + var id []byte + + if info.ID.IsZero { + if !info.ID.IsOfIntegerFamily() || !n.s.autoIncrement { + return ErrZeroID + } + } else { + id, err = toBytes(info.ID.Value, n.s.Codec) + if err != nil { + return err + } + } + + var raw []byte + // postpone encoding if AutoIncrement mode if enabled + if !n.s.autoIncrement { + raw, err = n.s.Codec.Encode(data) + if err != nil { + return err + } + } + + if n.tx != nil { + return n.save(n.tx, info, id, raw) + } + + return n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.save(tx, info, id, raw) + }) +} + +func (n *Node) save(tx *bolt.Tx, info *modelInfo, id []byte, raw []byte) error { + bucket, err := n.CreateBucketIfNotExists(tx, info.Name) + if err != nil { + return err + } + + if info.ID.IsZero { + // isZero and integer, generate next sequence + intID, _ := bucket.NextSequence() + + // convert to the right integer size + err = info.ID.Field.Set(reflect.ValueOf(intID).Convert(info.ID.Type()).Interface()) + if err != nil { + return err + } + + id, err = toBytes(info.ID.Field.Value(), n.s.Codec) + if err != nil { + return err + } + } + + if n.s.autoIncrement { + raw, err = n.s.Codec.Encode(info.data) + if err != nil { + return err + } + } + + for fieldName, idxInfo := range info.Indexes { + idx, err := getIndex(bucket, idxInfo.Type, fieldName) + if err != nil { + return err + } + + err = idx.RemoveID(id) + if err != nil { + return err + } + + if idxInfo.Field.IsZero() { + continue + } + + value, err := toBytes(idxInfo.Field.Value(), n.s.Codec) + if err != nil { + return err + } + + err = idx.Add(value, id) + if err != nil { + return err + } + } + + return bucket.Put(id, raw) +} + +// Save a structure +func (s *DB) Save(data interface{}) error { + return s.root.Save(data) +} diff --git a/vendor/src/github.com/asdine/storm/save_test.go b/vendor/src/github.com/asdine/storm/save_test.go new file mode 100644 index 0000000..81c9a6f --- /dev/null +++ b/vendor/src/github.com/asdine/storm/save_test.go @@ -0,0 +1,269 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/asdine/storm/codec/gob" + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestSave(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Save(&SimpleUser{ID: 10, Name: "John"}) + assert.NoError(t, err) + + err = db.Save(&SimpleUser{Name: "John"}) + assert.Error(t, err) + assert.Equal(t, ErrZeroID, err) + + err = db.Save(&ClassicBadTags{ID: "id", PublicField: 100}) + assert.Error(t, err) + assert.Equal(t, ErrUnknownTag, err) + + err = db.Save(&UserWithNoID{Name: "John"}) + assert.Error(t, err) + assert.Equal(t, ErrNoID, err) + + err = db.Save(&UserWithIDField{ID: 10, Name: "John"}) + assert.NoError(t, err) + + u := UserWithEmbeddedIDField{} + u.ID = 150 + u.Name = "Pete" + u.Age = 10 + err = db.Save(&u) + assert.NoError(t, err) + + v := UserWithIDField{ID: 10, Name: "John"} + err = db.Save(&v) + assert.NoError(t, err) + + w := UserWithEmbeddedField{} + w.ID = 150 + w.Name = "John" + err = db.Save(&w) + assert.NoError(t, err) + + db.Bolt.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte("UserWithIDField")) + assert.NotNil(t, bucket) + + i, err := toBytes(10, gob.Codec) + assert.NoError(t, err) + + val := bucket.Get(i) + assert.NotNil(t, val) + + content, err := db.Codec.Encode(&v) + assert.NoError(t, err) + assert.Equal(t, content, val) + return nil + }) +} + +func TestSaveUnique(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + u1 := UniqueNameUser{ID: 10, Name: "John", age: 10} + err := db.Save(&u1) + assert.NoError(t, err) + + u2 := UniqueNameUser{ID: 11, Name: "John", age: 100} + err = db.Save(&u2) + assert.Error(t, err) + assert.Equal(t, ErrAlreadyExists, err) + + // same id + u3 := UniqueNameUser{ID: 10, Name: "Jake", age: 100} + err = db.Save(&u3) + assert.NoError(t, err) + + db.Bolt.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte("UniqueNameUser")) + + uniqueBucket := bucket.Bucket([]byte(indexPrefix + "Name")) + assert.NotNil(t, uniqueBucket) + + id := uniqueBucket.Get([]byte("Jake")) + i, err := toBytes(10, gob.Codec) + assert.NoError(t, err) + assert.Equal(t, i, id) + + id = uniqueBucket.Get([]byte("John")) + assert.Nil(t, id) + return nil + }) +} + +func TestSaveIndex(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + u1 := IndexedNameUser{ID: 10, Name: "John", age: 10} + err := db.Save(&u1) + assert.NoError(t, err) + + u1 = IndexedNameUser{ID: 10, Name: "John", age: 10} + err = db.Save(&u1) + assert.NoError(t, err) + + u2 := IndexedNameUser{ID: 11, Name: "John", age: 100} + err = db.Save(&u2) + assert.NoError(t, err) + + name1 := "Jake" + name2 := "Jane" + name3 := "James" + + for i := 0; i < 1000; i++ { + u := IndexedNameUser{ID: i + 1} + + if i%2 == 0 { + u.Name = name1 + } else { + u.Name = name2 + } + + db.Save(&u) + } + + var users []IndexedNameUser + err = db.Find("Name", name1, &users) + assert.NoError(t, err) + assert.Len(t, users, 500) + + err = db.Find("Name", name2, &users) + assert.NoError(t, err) + assert.Len(t, users, 500) + + err = db.Find("Name", name3, &users) + assert.Error(t, err) + assert.Equal(t, ErrNotFound, err) + + err = db.Save(nil) + assert.Error(t, err) + assert.Equal(t, ErrBadType, err) +} + +func TestSaveEmptyValues(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + defer db.Close() + + u := User{ + ID: 10, + } + err := db.Save(&u) + assert.NoError(t, err) + + var v User + err = db.One("ID", 10, &v) + assert.NoError(t, err) + assert.Equal(t, 10, v.ID) + + u.Name = "John" + u.Slug = "john" + err = db.Save(&u) + assert.NoError(t, err) + + err = db.One("Name", "John", &v) + assert.NoError(t, err) + assert.Equal(t, "John", v.Name) + assert.Equal(t, "john", v.Slug) + err = db.One("Slug", "john", &v) + assert.NoError(t, err) + assert.Equal(t, "John", v.Name) + assert.Equal(t, "john", v.Slug) + + u.Name = "" + u.Slug = "" + err = db.Save(&u) + assert.NoError(t, err) + + err = db.One("Name", "John", &v) + assert.Error(t, err) + err = db.One("Slug", "john", &v) + assert.Error(t, err) +} + +func TestSaveAutoIncrement(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db"), AutoIncrement()) + defer db.Close() + + for i := 1; i < 10; i++ { + s := SimpleUser{Name: "John"} + err := db.Save(&s) + assert.NoError(t, err) + assert.Equal(t, i, s.ID) + } + + u := UserWithUint64IDField{Name: "John"} + err := db.Save(&u) + assert.NoError(t, err) + assert.Equal(t, uint64(1), u.ID) + v := UserWithUint64IDField{} + err = db.One("ID", uint64(1), &v) + assert.NoError(t, err) + assert.Equal(t, u, v) + + ui := UserWithIDField{Name: "John"} + err = db.Save(&ui) + assert.NoError(t, err) + assert.Equal(t, 1, ui.ID) + vi := UserWithIDField{} + err = db.One("ID", 1, &vi) + assert.NoError(t, err) + assert.Equal(t, ui, vi) + + us := UserWithStringIDField{Name: "John"} + err = db.Save(&us) + assert.Error(t, err) + assert.Equal(t, ErrZeroID, err) +} + +func TestSaveDifferentBucketRoot(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db"), AutoIncrement()) + defer db.Close() + + assert.Len(t, db.rootBucket, 0) + + dbSub := db.From("sub") + + assert.NotEqual(t, dbSub, db) + assert.Len(t, dbSub.rootBucket, 1) + + err := db.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + err = dbSub.Save(&User{ID: 11, Name: "Paul"}) + assert.NoError(t, err) + + var ( + john User + paul User + ) + + err = db.One("Name", "John", &john) + assert.NoError(t, err) + err = db.One("Name", "Paul", &paul) + assert.Error(t, err) + + err = dbSub.One("Name", "Paul", &paul) + assert.NoError(t, err) + err = dbSub.One("Name", "John", &john) + assert.Error(t, err) +} diff --git a/vendor/src/github.com/asdine/storm/set.go b/vendor/src/github.com/asdine/storm/set.go new file mode 100644 index 0000000..59421ee --- /dev/null +++ b/vendor/src/github.com/asdine/storm/set.go @@ -0,0 +1,46 @@ +package storm + +import ( + "github.com/boltdb/bolt" +) + +// Set a key/value pair into a bucket +func (n *Node) Set(bucketName string, key interface{}, value interface{}) error { + if key == nil { + return ErrNilParam + } + + id, err := toBytes(key, n.s.Codec) + if err != nil { + return err + } + + var data []byte + if value != nil { + data, err = n.s.Codec.Encode(value) + if err != nil { + return err + } + } + + if n.tx != nil { + return n.set(n.tx, bucketName, id, data) + } + + return n.s.Bolt.Update(func(tx *bolt.Tx) error { + return n.set(tx, bucketName, id, data) + }) +} + +func (n *Node) set(tx *bolt.Tx, bucketName string, id, data []byte) error { + bucket, err := n.CreateBucketIfNotExists(tx, bucketName) + if err != nil { + return err + } + return bucket.Put(id, data) +} + +// Set a key/value pair into a bucket +func (s *DB) Set(bucketName string, key interface{}, value interface{}) error { + return s.root.Set(bucketName, key, value) +} diff --git a/vendor/src/github.com/asdine/storm/set_test.go b/vendor/src/github.com/asdine/storm/set_test.go new file mode 100644 index 0000000..00024a2 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/set_test.go @@ -0,0 +1,67 @@ +package storm + +import ( + "io/ioutil" + "net/mail" + "os" + "path/filepath" + "testing" + + "github.com/asdine/storm/codec/gob" + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestSet(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Set("b1", 10, 10) + assert.NoError(t, err) + err = db.Set("b1", "best friend's mail", &mail.Address{Name: "Gandalf", Address: "gandalf@lorien.ma"}) + assert.NoError(t, err) + err = db.Set("b2", []byte("i'm already a slice of bytes"), "a value") + assert.NoError(t, err) + err = db.Set("b2", []byte("i'm already a slice of bytes"), nil) + assert.NoError(t, err) + err = db.Set("b1", 0, 100) + assert.NoError(t, err) + err = db.Set("b1", nil, 100) + assert.Error(t, err) + + db.Bolt.View(func(tx *bolt.Tx) error { + b1 := tx.Bucket([]byte("b1")) + assert.NotNil(t, b1) + b2 := tx.Bucket([]byte("b2")) + assert.NotNil(t, b2) + + k1, err := toBytes(10, gob.Codec) + assert.NoError(t, err) + val := b1.Get(k1) + assert.NotNil(t, val) + + k2 := []byte("best friend's mail") + val = b1.Get(k2) + assert.NotNil(t, val) + + k3, err := toBytes(0, gob.Codec) + assert.NoError(t, err) + val = b1.Get(k3) + assert.NotNil(t, val) + + return nil + }) + + err = db.Set("", 0, 100) + assert.Error(t, err) + + err = db.Set("b", nil, 100) + assert.Error(t, err) + + err = db.Set("b", 10, nil) + assert.NoError(t, err) + + err = db.Set("b", nil, nil) + assert.Error(t, err) +} diff --git a/vendor/src/github.com/asdine/storm/storm.go b/vendor/src/github.com/asdine/storm/storm.go new file mode 100644 index 0000000..421b514 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/storm.go @@ -0,0 +1,106 @@ +package storm + +import ( + "os" + "time" + + "github.com/asdine/storm/codec" + "github.com/boltdb/bolt" +) + +// Open opens a database at the given path with optional Storm options. +func Open(path string, stormOptions ...func(*DB) error) (*DB, error) { + var err error + + s := &DB{ + Path: path, + Codec: defaultCodec, + } + + for _, option := range stormOptions { + option(s) + } + + if s.boltMode == 0 { + s.boltMode = 0600 + } + + if s.boltOptions == nil { + s.boltOptions = &bolt.Options{Timeout: 1 * time.Second} + } + + s.Bolt, err = bolt.Open(path, s.boltMode, s.boltOptions) + if err != nil { + return nil, err + } + + s.root = &Node{s: s, rootBucket: s.rootBucket} + + return s, nil +} + +// OpenWithOptions opens a database with the given boltDB options and optional Storm options. +// Deprecated: Use storm.Open with storm.BoltOptions instead. +func OpenWithOptions(path string, mode os.FileMode, boltOptions *bolt.Options, stormOptions ...func(*DB)) (*DB, error) { + db, err := bolt.Open(path, mode, boltOptions) + + if err != nil { + return nil, err + } + + s := &DB{ + Path: path, + Bolt: db, + Codec: defaultCodec, + } + + for _, option := range stormOptions { + option(s) + } + + s.root = &Node{s: s, rootBucket: s.rootBucket} + + return s, nil +} + +// DB is the wrapper around BoltDB. It contains an instance of BoltDB and uses it to perform all the +// needed operations +type DB struct { + // Path of the database file + Path string + + // Handles encoding and decoding of objects + Codec codec.EncodeDecoder + + // Bolt is still easily accessible + Bolt *bolt.DB + + // Bolt file mode + boltMode os.FileMode + + // Bolt options + boltOptions *bolt.Options + + // Enable auto increment on empty integer fields + autoIncrement bool + + // The root node that points to the root bucket. + root *Node + + // The root bucket name + rootBucket []string +} + +// From returns a new Storm node with a new bucket root. +// All DB operations on the new node will be executed relative to the given +// bucket. +func (s *DB) From(root ...string) *Node { + newNode := *s.root + newNode.rootBucket = root + return &newNode +} + +// WithTransaction returns a New Storm node that will use the given transaction. +func (s *DB) WithTransaction(tx *bolt.Tx) *Node { + return s.root.WithTransaction(tx) +} diff --git a/vendor/src/github.com/asdine/storm/storm_test.go b/vendor/src/github.com/asdine/storm/storm_test.go new file mode 100644 index 0000000..d93a49b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/storm_test.go @@ -0,0 +1,72 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/assert" +) + +func TestNewStorm(t *testing.T) { + db, err := Open("") + + assert.Error(t, err) + assert.Nil(t, db) + + dir, err := ioutil.TempDir(os.TempDir(), "storm") + assert.NoError(t, err) + defer os.RemoveAll(dir) + + file := filepath.Join(dir, "storm.db") + db, err = Open(file) + defer db.Close() + + assert.NoError(t, err) + assert.Equal(t, file, db.Path) + assert.NotNil(t, db.Bolt) + assert.Equal(t, defaultCodec, db.Codec) +} + +func TestNewStormWithOptions(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := OpenWithOptions(filepath.Join(dir, "storm.db"), 0600, nil) + defer db.Close() + + err := db.Save(&SimpleUser{ID: 10}) + assert.NoError(t, err) +} + +func TestNewStormWithStormOptions(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + + dc := new(dummyCodec) + db1, _ := Open(filepath.Join(dir, "storm1.db"), BoltOptions(0660, &bolt.Options{Timeout: 10 * time.Second}), Codec(dc), AutoIncrement(), Root("a", "b")) + assert.Equal(t, dc, db1.Codec) + assert.True(t, db1.autoIncrement) + assert.Equal(t, os.FileMode(0660), db1.boltMode) + assert.Equal(t, 10*time.Second, db1.boltOptions.Timeout) + assert.Equal(t, []string{"a", "b"}, db1.rootBucket) + assert.Equal(t, []string{"a", "b"}, db1.root.rootBucket) + + err := db1.Save(&SimpleUser{ID: 1}) + assert.NoError(t, err) + + db2, _ := Open(filepath.Join(dir, "storm2.db"), Codec(dc)) + assert.Equal(t, dc, db2.Codec) +} + +type dummyCodec int + +func (c dummyCodec) Encode(v interface{}) ([]byte, error) { + return []byte("dummy"), nil +} + +func (c dummyCodec) Decode(b []byte, v interface{}) error { + return nil +} diff --git a/vendor/src/github.com/asdine/storm/structs_test.go b/vendor/src/github.com/asdine/storm/structs_test.go new file mode 100644 index 0000000..6a94ae9 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/structs_test.go @@ -0,0 +1,129 @@ +package storm + +import ( + "io" + "time" +) + +type ClassicNoTags struct { + PublicField int + privateField string + Date time.Time + InlineStruct struct { + a float32 + B float64 + } + Interf io.Writer +} + +type ClassicBadTags struct { + ID string + PublicField int `storm:"mrots"` + privateField string + Date time.Time + InlineStruct struct { + a float32 + B float64 + } + Interf io.Writer +} + +type ClassicUnique struct { + ID string + PublicField int `storm:"unique"` + privateField string `storm:"unique"` + privateField2 string `storm:"unique"` + Date time.Time `storm:"unique"` + InlineStruct struct { + a float32 + B float64 + } `storm:"unique"` + Interf io.Writer `storm:"unique"` +} + +type ClassicIndex struct { + ID string + PublicField int `storm:"index"` + privateField string `storm:"index"` + Date time.Time `storm:"index"` + InlineStruct struct { + a float32 + B float64 + } `storm:"index"` + InlineStructPtr *UserWithNoID `storm:"index"` + Interf io.Writer `storm:"index"` +} + +type ClassicInline struct { + PublicField int `storm:"unique"` + ClassicIndex `storm:"inline"` + *ToEmbed `storm:"inline"` + Date time.Time `storm:"unique"` +} + +type User struct { + ID int `storm:"id"` + Name string `storm:"index"` + age int + DateOfBirth time.Time `storm:"index"` + Group string + Slug string `storm:"unique"` +} + +type ToEmbed struct { + ID string +} + +type NestedID struct { + ToEmbed `storm:"inline"` + Name string +} + +type SimpleUser struct { + ID int `storm:"id"` + Name string + age int +} + +type UserWithNoID struct { + Name string +} + +type UserWithIDField struct { + ID int + Name string +} + +type UserWithUint64IDField struct { + ID uint64 + Name string +} + +type UserWithStringIDField struct { + ID string + Name string +} + +type UserWithEmbeddedIDField struct { + UserWithIDField `storm:"inline"` + Age int +} + +type UserWithEmbeddedField struct { + UserWithNoID `storm:"inline"` + ID uint64 +} + +type IndexedNameUser struct { + ID int `storm:"id"` + Name string `storm:"index"` + age int + DateOfBirth time.Time `storm:"index"` + Group string +} + +type UniqueNameUser struct { + ID int `storm:"id"` + Name string `storm:"unique"` + age int +} diff --git a/vendor/src/github.com/asdine/storm/transaction.go b/vendor/src/github.com/asdine/storm/transaction.go new file mode 100644 index 0000000..2bb2b8b --- /dev/null +++ b/vendor/src/github.com/asdine/storm/transaction.go @@ -0,0 +1,52 @@ +package storm + +// Begin starts a new transaction. +func (n Node) Begin(writable bool) (*Node, error) { + var err error + + n.tx, err = n.s.Bolt.Begin(writable) + if err != nil { + return nil, err + } + + return &n, nil +} + +// Rollback closes the transaction and ignores all previous updates. +func (n *Node) Rollback() error { + if n.tx == nil { + return ErrNotInTransaction + } + + err := n.tx.Rollback() + n.tx = nil + + return err +} + +// Commit writes all changes to disk. +func (n *Node) Commit() error { + if n.tx == nil { + return ErrNotInTransaction + } + + err := n.tx.Commit() + n.tx = nil + + return err +} + +// Begin starts a new transaction. +func (s *DB) Begin(writable bool) (*Node, error) { + return s.root.Begin(writable) +} + +// Rollback closes the transaction and ignores all previous updates. +func (s *DB) Rollback() error { + return s.root.Rollback() +} + +// Commit writes all changes to disk. +func (s *DB) Commit() error { + return s.root.Rollback() +} diff --git a/vendor/src/github.com/asdine/storm/transaction_test.go b/vendor/src/github.com/asdine/storm/transaction_test.go new file mode 100644 index 0000000..3847418 --- /dev/null +++ b/vendor/src/github.com/asdine/storm/transaction_test.go @@ -0,0 +1,130 @@ +package storm + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTransaction(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Rollback() + assert.Error(t, err) + + err = db.Commit() + assert.Error(t, err) + + tx, err := db.Begin(true) + assert.NoError(t, err) + + assert.NotNil(t, tx.tx) + + err = tx.Init(&SimpleUser{}) + assert.NoError(t, err) + + err = tx.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + + err = tx.Save(&User{ID: 20, Name: "John"}) + assert.NoError(t, err) + + err = tx.Save(&User{ID: 30, Name: "Steve"}) + assert.NoError(t, err) + + var user User + err = tx.One("ID", 10, &user) + assert.NoError(t, err) + + var users []User + err = tx.AllByIndex("Name", &users) + assert.NoError(t, err) + assert.Len(t, users, 3) + + err = tx.All(&users) + assert.NoError(t, err) + assert.Len(t, users, 3) + + err = tx.Find("Name", "Steve", &users) + assert.NoError(t, err) + assert.Len(t, users, 1) + + err = tx.Remove(&user) + assert.NoError(t, err) + + err = tx.One("ID", 10, &user) + assert.Error(t, err) + + err = tx.Set("b1", "best friend's mail", "mail@provider.com") + assert.NoError(t, err) + + var str string + err = tx.Get("b1", "best friend's mail", &str) + assert.NoError(t, err) + assert.Equal(t, "mail@provider.com", str) + + err = tx.Delete("b1", "best friend's mail") + assert.NoError(t, err) + + err = tx.Get("b1", "best friend's mail", &str) + assert.Error(t, err) + + err = tx.Commit() + assert.NoError(t, err) + + assert.Nil(t, tx.tx) + + err = db.One("ID", 30, &user) + assert.NoError(t, err) + assert.Equal(t, 30, user.ID) +} + +func TestTransactionRollback(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + tx, err := db.Begin(true) + assert.NoError(t, err) + + err = tx.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + + var user User + err = tx.One("ID", 10, &user) + assert.NoError(t, err) + assert.Equal(t, 10, user.ID) + + err = tx.Rollback() + assert.NoError(t, err) + + err = db.One("ID", 10, &user) + assert.Error(t, err) +} + +func TestTransactionNotWritable(t *testing.T) { + dir, _ := ioutil.TempDir(os.TempDir(), "storm") + defer os.RemoveAll(dir) + db, _ := Open(filepath.Join(dir, "storm.db")) + + err := db.Save(&User{ID: 10, Name: "John"}) + assert.NoError(t, err) + + tx, err := db.Begin(false) + assert.NoError(t, err) + + err = tx.Save(&User{ID: 20, Name: "John"}) + assert.Error(t, err) + + var user User + err = tx.One("ID", 10, &user) + assert.NoError(t, err) + + err = tx.Rollback() + assert.NoError(t, err) +} diff --git a/vendor/src/github.com/boltdb/bolt/LICENSE b/vendor/src/github.com/boltdb/bolt/LICENSE new file mode 100644 index 0000000..004e77f --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ben Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/src/github.com/boltdb/bolt/Makefile b/vendor/src/github.com/boltdb/bolt/Makefile new file mode 100644 index 0000000..e035e63 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/Makefile @@ -0,0 +1,18 @@ +BRANCH=`git rev-parse --abbrev-ref HEAD` +COMMIT=`git rev-parse --short HEAD` +GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" + +default: build + +race: + @go test -v -race -test.run="TestSimulate_(100op|1000op)" + +# go get github.com/kisielk/errcheck +errcheck: + @errcheck -ignorepkg=bytes -ignore=os:Remove github.com/boltdb/bolt + +test: + @go test -v -cover . + @go test -v ./cmd/bolt + +.PHONY: fmt test diff --git a/vendor/src/github.com/boltdb/bolt/README.md b/vendor/src/github.com/boltdb/bolt/README.md new file mode 100644 index 0000000..3bff3cc --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/README.md @@ -0,0 +1,850 @@ +Bolt [![Coverage Status](https://coveralls.io/repos/boltdb/bolt/badge.svg?branch=master)](https://coveralls.io/r/boltdb/bolt?branch=master) [![GoDoc](https://godoc.org/github.com/boltdb/bolt?status.svg)](https://godoc.org/github.com/boltdb/bolt) ![Version](https://img.shields.io/badge/version-1.0-green.svg) +==== + +Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] +[LMDB project][lmdb]. The goal of the project is to provide a simple, +fast, and reliable database for projects that don't require a full database +server such as Postgres or MySQL. + +Since Bolt is meant to be used as such a low-level piece of functionality, +simplicity is key. The API will be small and only focus on getting values +and setting values. That's it. + +[hyc_symas]: https://twitter.com/hyc_symas +[lmdb]: http://symas.com/mdb/ + +## Project Status + +Bolt is stable and the API is fixed. Full unit test coverage and randomized +black box testing are used to ensure database consistency and thread safety. +Bolt is currently in high-load production environments serving databases as +large as 1TB. Many companies such as Shopify and Heroku use Bolt-backed +services every day. + +## Table of Contents + +- [Getting Started](#getting-started) + - [Installing](#installing) + - [Opening a database](#opening-a-database) + - [Transactions](#transactions) + - [Read-write transactions](#read-write-transactions) + - [Read-only transactions](#read-only-transactions) + - [Batch read-write transactions](#batch-read-write-transactions) + - [Managing transactions manually](#managing-transactions-manually) + - [Using buckets](#using-buckets) + - [Using key/value pairs](#using-keyvalue-pairs) + - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) + - [Iterating over keys](#iterating-over-keys) + - [Prefix scans](#prefix-scans) + - [Range scans](#range-scans) + - [ForEach()](#foreach) + - [Nested buckets](#nested-buckets) + - [Database backups](#database-backups) + - [Statistics](#statistics) + - [Read-Only Mode](#read-only-mode) + - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) +- [Resources](#resources) +- [Comparison with other databases](#comparison-with-other-databases) + - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) + - [LevelDB, RocksDB](#leveldb-rocksdb) + - [LMDB](#lmdb) +- [Caveats & Limitations](#caveats--limitations) +- [Reading the Source](#reading-the-source) +- [Other Projects Using Bolt](#other-projects-using-bolt) + +## Getting Started + +### Installing + +To start using Bolt, install Go and run `go get`: + +```sh +$ go get github.com/boltdb/bolt/... +``` + +This will retrieve the library and install the `bolt` command line utility into +your `$GOBIN` path. + + +### Opening a database + +The top-level object in Bolt is a `DB`. It is represented as a single file on +your disk and represents a consistent snapshot of your data. + +To open your database, simply use the `bolt.Open()` function: + +```go +package main + +import ( + "log" + + "github.com/boltdb/bolt" +) + +func main() { + // Open the my.db data file in your current directory. + // It will be created if it doesn't exist. + db, err := bolt.Open("my.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + ... +} +``` + +Please note that Bolt obtains a file lock on the data file so multiple processes +cannot open the same database at the same time. Opening an already open Bolt +database will cause it to hang until the other process closes it. To prevent +an indefinite wait you can pass a timeout option to the `Open()` function: + +```go +db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second}) +``` + + +### Transactions + +Bolt allows only one read-write transaction at a time but allows as many +read-only transactions as you want at a time. Each transaction has a consistent +view of the data as it existed when the transaction started. + +Individual transactions and all objects created from them (e.g. buckets, keys) +are not thread safe. To work with data in multiple goroutines you must start +a transaction for each one or use locking to ensure only one goroutine accesses +a transaction at a time. Creating transaction from the `DB` is thread safe. + +Read-only transactions and read-write transactions should not depend on one +another and generally shouldn't be opened simultaneously in the same goroutine. +This can cause a deadlock as the read-write transaction needs to periodically +re-map the data file but it cannot do so while a read-only transaction is open. + + +#### Read-write transactions + +To start a read-write transaction, you can use the `DB.Update()` function: + +```go +err := db.Update(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Inside the closure, you have a consistent view of the database. You commit the +transaction by returning `nil` at the end. You can also rollback the transaction +at any point by returning an error. All database operations are allowed inside +a read-write transaction. + +Always check the return error as it will report any disk failures that can cause +your transaction to not complete. If you return an error within your closure +it will be passed through. + + +#### Read-only transactions + +To start a read-only transaction, you can use the `DB.View()` function: + +```go +err := db.View(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +You also get a consistent view of the database within this closure, however, +no mutating operations are allowed within a read-only transaction. You can only +retrieve buckets, retrieve values, and copy the database within a read-only +transaction. + + +#### Batch read-write transactions + +Each `DB.Update()` waits for disk to commit the writes. This overhead +can be minimized by combining multiple updates with the `DB.Batch()` +function: + +```go +err := db.Batch(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Concurrent Batch calls are opportunistically combined into larger +transactions. Batch is only useful when there are multiple goroutines +calling it. + +The trade-off is that `Batch` can call the given +function multiple times, if parts of the transaction fail. The +function must be idempotent and side effects must take effect only +after a successful return from `DB.Batch()`. + +For example: don't display messages from inside the function, instead +set variables in the enclosing scope: + +```go +var id uint64 +err := db.Batch(func(tx *bolt.Tx) error { + // Find last key in bucket, decode as bigendian uint64, increment + // by one, encode back to []byte, and add new key. + ... + id = newValue + return nil +}) +if err != nil { + return ... +} +fmt.Println("Allocated ID %d", id) +``` + + +#### Managing transactions manually + +The `DB.View()` and `DB.Update()` functions are wrappers around the `DB.Begin()` +function. These helper functions will start the transaction, execute a function, +and then safely close your transaction if an error is returned. This is the +recommended way to use Bolt transactions. + +However, sometimes you may want to manually start and end your transactions. +You can use the `Tx.Begin()` function directly but **please** be sure to close +the transaction. + +```go +// Start a writable transaction. +tx, err := db.Begin(true) +if err != nil { + return err +} +defer tx.Rollback() + +// Use the transaction... +_, err := tx.CreateBucket([]byte("MyBucket")) +if err != nil { + return err +} + +// Commit the transaction and check for error. +if err := tx.Commit(); err != nil { + return err +} +``` + +The first argument to `DB.Begin()` is a boolean stating if the transaction +should be writable. + + +### Using buckets + +Buckets are collections of key/value pairs within the database. All keys in a +bucket must be unique. You can create a bucket using the `DB.CreateBucket()` +function: + +```go +db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("MyBucket")) + if err != nil { + return fmt.Errorf("create bucket: %s", err) + } + return nil +}) +``` + +You can also create a bucket only if it doesn't exist by using the +`Tx.CreateBucketIfNotExists()` function. It's a common pattern to call this +function for all your top-level buckets after you open your database so you can +guarantee that they exist for future transactions. + +To delete a bucket, simply call the `Tx.DeleteBucket()` function. + + +### Using key/value pairs + +To save a key/value pair to a bucket, use the `Bucket.Put()` function: + +```go +db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + err := b.Put([]byte("answer"), []byte("42")) + return err +}) +``` + +This will set the value of the `"answer"` key to `"42"` in the `MyBucket` +bucket. To retrieve this value, we can use the `Bucket.Get()` function: + +```go +db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + v := b.Get([]byte("answer")) + fmt.Printf("The answer is: %s\n", v) + return nil +}) +``` + +The `Get()` function does not return an error because its operation is +guaranteed to work (unless there is some kind of system failure). If the key +exists then it will return its byte slice value. If it doesn't exist then it +will return `nil`. It's important to note that you can have a zero-length value +set to a key which is different than the key not existing. + +Use the `Bucket.Delete()` function to delete a key from the bucket. + +Please note that values returned from `Get()` are only valid while the +transaction is open. If you need to use a value outside of the transaction +then you must use `copy()` to copy it to another byte slice. + + +### Autoincrementing integer for the bucket +By using the `NextSequence()` function, you can let Bolt determine a sequence +which can be used as the unique identifier for your key/value pairs. See the +example below. + +```go +// CreateUser saves u to the store. The new user ID is set on u once the data is persisted. +func (s *Store) CreateUser(u *User) error { + return s.db.Update(func(tx *bolt.Tx) error { + // Retrieve the users bucket. + // This should be created when the DB is first opened. + b := tx.Bucket([]byte("users")) + + // Generate ID for the user. + // This returns an error only if the Tx is closed or not writeable. + // That can't happen in an Update() call so I ignore the error check. + id, _ = b.NextSequence() + u.ID = int(id) + + // Marshal user data into bytes. + buf, err := json.Marshal(u) + if err != nil { + return err + } + + // Persist bytes to users bucket. + return b.Put(itob(u.ID), buf) + }) +} + +// itob returns an 8-byte big endian representation of v. +func itob(v int) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, uint64(v)) + return b +} + +type User struct { + ID int + ... +} +``` + +### Iterating over keys + +Bolt stores its keys in byte-sorted order within a bucket. This makes sequential +iteration over these keys extremely fast. To iterate over keys we'll use a +`Cursor`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + c := b.Cursor() + + for k, v := c.First(); k != nil; k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +The cursor allows you to move to a specific point in the list of keys and move +forward or backward through the keys one at a time. + +The following functions are available on the cursor: + +``` +First() Move to the first key. +Last() Move to the last key. +Seek() Move to a specific key. +Next() Move to the next key. +Prev() Move to the previous key. +``` + +Each of those functions has a return signature of `(key []byte, value []byte)`. +When you have iterated to the end of the cursor then `Next()` will return a +`nil` key. You must seek to a position using `First()`, `Last()`, or `Seek()` +before calling `Next()` or `Prev()`. If you do not seek to a position then +these functions will return a `nil` key. + +During iteration, if the key is non-`nil` but the value is `nil`, that means +the key refers to a bucket rather than a value. Use `Bucket.Bucket()` to +access the sub-bucket. + + +#### Prefix scans + +To iterate over a key prefix, you can combine `Seek()` and `bytes.HasPrefix()`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + c := tx.Bucket([]byte("MyBucket")).Cursor() + + prefix := []byte("1234") + for k, v := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +#### Range scans + +Another common use case is scanning over a range such as a time range. If you +use a sortable time encoding such as RFC3339 then you can query a specific +date range like this: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume our events bucket exists and has RFC3339 encoded time keys. + c := tx.Bucket([]byte("Events")).Cursor() + + // Our time range spans the 90's decade. + min := []byte("1990-01-01T00:00:00Z") + max := []byte("2000-01-01T00:00:00Z") + + // Iterate over the 90's. + for k, v := c.Seek(min); k != nil && bytes.Compare(k, max) <= 0; k, v = c.Next() { + fmt.Printf("%s: %s\n", k, v) + } + + return nil +}) +``` + +Note that, while RFC3339 is sortable, the Golang implementation of RFC3339Nano does not use a fixed number of digits after the decimal point and is therefore not sortable. + + +#### ForEach() + +You can also use the function `ForEach()` if you know you'll be iterating over +all the keys in a bucket: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + b.ForEach(func(k, v []byte) error { + fmt.Printf("key=%s, value=%s\n", k, v) + return nil + }) + return nil +}) +``` + + +### Nested buckets + +You can also store a bucket in a key to create nested buckets. The API is the +same as the bucket management API on the `DB` object: + +```go +func (*Bucket) CreateBucket(key []byte) (*Bucket, error) +func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) +func (*Bucket) DeleteBucket(key []byte) error +``` + + +### Database backups + +Bolt is a single file so it's easy to backup. You can use the `Tx.WriteTo()` +function to write a consistent view of the database to a writer. If you call +this from a read-only transaction, it will perform a hot backup and not block +your other database reads and writes. + +By default, it will use a regular file handle which will utilize the operating +system's page cache. See the [`Tx`](https://godoc.org/github.com/boltdb/bolt#Tx) +documentation for information about optimizing for larger-than-RAM datasets. + +One common use case is to backup over HTTP so you can use tools like `cURL` to +do database backups: + +```go +func BackupHandleFunc(w http.ResponseWriter, req *http.Request) { + err := db.View(func(tx *bolt.Tx) error { + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Disposition", `attachment; filename="my.db"`) + w.Header().Set("Content-Length", strconv.Itoa(int(tx.Size()))) + _, err := tx.WriteTo(w) + return err + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} +``` + +Then you can backup using this command: + +```sh +$ curl http://localhost/backup > my.db +``` + +Or you can open your browser to `http://localhost/backup` and it will download +automatically. + +If you want to backup to another file you can use the `Tx.CopyFile()` helper +function. + + +### Statistics + +The database keeps a running count of many of the internal operations it +performs so you can better understand what's going on. By grabbing a snapshot +of these stats at two points in time we can see what operations were performed +in that time range. + +For example, we could start a goroutine to log stats every 10 seconds: + +```go +go func() { + // Grab the initial stats. + prev := db.Stats() + + for { + // Wait for 10s. + time.Sleep(10 * time.Second) + + // Grab the current stats and diff them. + stats := db.Stats() + diff := stats.Sub(&prev) + + // Encode stats to JSON and print to STDERR. + json.NewEncoder(os.Stderr).Encode(diff) + + // Save stats for the next loop. + prev = stats + } +}() +``` + +It's also useful to pipe these stats to a service such as statsd for monitoring +or to provide an HTTP endpoint that will perform a fixed-length sample. + + +### Read-Only Mode + +Sometimes it is useful to create a shared, read-only Bolt database. To this, +set the `Options.ReadOnly` flag when opening your database. Read-only mode +uses a shared lock to allow multiple processes to read from the database but +it will block any processes from opening the database in read-write mode. + +```go +db, err := bolt.Open("my.db", 0666, &bolt.Options{ReadOnly: true}) +if err != nil { + log.Fatal(err) +} +``` + +### Mobile Use (iOS/Android) + +Bolt is able to run on mobile devices by leveraging the binding feature of the +[gomobile](https://github.com/golang/mobile) tool. Create a struct that will +contain your database logic and a reference to a `*bolt.DB` with a initializing +contstructor that takes in a filepath where the database file will be stored. +Neither Android nor iOS require extra permissions or cleanup from using this method. + +```go +func NewBoltDB(filepath string) *BoltDB { + db, err := bolt.Open(filepath+"/demo.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + + return &BoltDB{db} +} + +type BoltDB struct { + db *bolt.DB + ... +} + +func (b *BoltDB) Path() string { + return b.db.Path() +} + +func (b *BoltDB) Close() { + b.db.Close() +} +``` + +Database logic should be defined as methods on this wrapper struct. + +To initialize this struct from the native language (both platforms now sync +their local storage to the cloud. These snippets disable that functionality for the +database file): + +#### Android + +```java +String path; +if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP){ + path = getNoBackupFilesDir().getAbsolutePath(); +} else{ + path = getFilesDir().getAbsolutePath(); +} +Boltmobiledemo.BoltDB boltDB = Boltmobiledemo.NewBoltDB(path) +``` + +#### iOS + +```objc +- (void)demo { + NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, + NSUserDomainMask, + YES) objectAtIndex:0]; + GoBoltmobiledemoBoltDB * demo = GoBoltmobiledemoNewBoltDB(path); + [self addSkipBackupAttributeToItemAtPath:demo.path]; + //Some DB Logic would go here + [demo close]; +} + +- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString +{ + NSURL* URL= [NSURL fileURLWithPath: filePathString]; + assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); + + NSError *error = nil; + BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] + forKey: NSURLIsExcludedFromBackupKey error: &error]; + if(!success){ + NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); + } + return success; +} + +``` + +## Resources + +For more information on getting started with Bolt, check out the following articles: + +* [Intro to BoltDB: Painless Performant Persistence](http://npf.io/2014/07/intro-to-boltdb-painless-performant-persistence/) by [Nate Finch](https://github.com/natefinch). +* [Bolt -- an embedded key/value database for Go](https://www.progville.com/go/bolt-embedded-db-golang/) by Progville + + +## Comparison with other databases + +### Postgres, MySQL, & other relational databases + +Relational databases structure data into rows and are only accessible through +the use of SQL. This approach provides flexibility in how you store and query +your data but also incurs overhead in parsing and planning SQL statements. Bolt +accesses all data by a byte slice key. This makes Bolt fast to read and write +data by key but provides no built-in support for joining values together. + +Most relational databases (with the exception of SQLite) are standalone servers +that run separately from your application. This gives your systems +flexibility to connect multiple application servers to a single database +server but also adds overhead in serializing and transporting data over the +network. Bolt runs as a library included in your application so all data access +has to go through your application's process. This brings data closer to your +application but limits multi-process access to the data. + + +### LevelDB, RocksDB + +LevelDB and its derivatives (RocksDB, HyperLevelDB) are similar to Bolt in that +they are libraries bundled into the application, however, their underlying +structure is a log-structured merge-tree (LSM tree). An LSM tree optimizes +random writes by using a write ahead log and multi-tiered, sorted files called +SSTables. Bolt uses a B+tree internally and only a single file. Both approaches +have trade-offs. + +If you require a high random write throughput (>10,000 w/sec) or you need to use +spinning disks then LevelDB could be a good choice. If your application is +read-heavy or does a lot of range scans then Bolt could be a good choice. + +One other important consideration is that LevelDB does not have transactions. +It supports batch writing of key/values pairs and it supports read snapshots +but it will not give you the ability to do a compare-and-swap operation safely. +Bolt supports fully serializable ACID transactions. + + +### LMDB + +Bolt was originally a port of LMDB so it is architecturally similar. Both use +a B+tree, have ACID semantics with fully serializable transactions, and support +lock-free MVCC using a single writer and multiple readers. + +The two projects have somewhat diverged. LMDB heavily focuses on raw performance +while Bolt has focused on simplicity and ease of use. For example, LMDB allows +several unsafe actions such as direct writes for the sake of performance. Bolt +opts to disallow actions which can leave the database in a corrupted state. The +only exception to this in Bolt is `DB.NoSync`. + +There are also a few differences in API. LMDB requires a maximum mmap size when +opening an `mdb_env` whereas Bolt will handle incremental mmap resizing +automatically. LMDB overloads the getter and setter functions with multiple +flags whereas Bolt splits these specialized cases into their own functions. + + +## Caveats & Limitations + +It's important to pick the right tool for the job and Bolt is no exception. +Here are a few things to note when evaluating and using Bolt: + +* Bolt is good for read intensive workloads. Sequential write performance is + also fast but random writes can be slow. You can use `DB.Batch()` or add a + write-ahead log to help mitigate this issue. + +* Bolt uses a B+tree internally so there can be a lot of random page access. + SSDs provide a significant performance boost over spinning disks. + +* Try to avoid long running read transactions. Bolt uses copy-on-write so + old pages cannot be reclaimed while an old transaction is using them. + +* Byte slices returned from Bolt are only valid during a transaction. Once the + transaction has been committed or rolled back then the memory they point to + can be reused by a new page or can be unmapped from virtual memory and you'll + see an `unexpected fault address` panic when accessing it. + +* Be careful when using `Bucket.FillPercent`. Setting a high fill percent for + buckets that have random inserts will cause your database to have very poor + page utilization. + +* Use larger buckets in general. Smaller buckets causes poor page utilization + once they become larger than the page size (typically 4KB). + +* Bulk loading a lot of random writes into a new bucket can be slow as the + page will not split until the transaction is committed. Randomly inserting + more than 100,000 key/value pairs into a single new bucket in a single + transaction is not advised. + +* Bolt uses a memory-mapped file so the underlying operating system handles the + caching of the data. Typically, the OS will cache as much of the file as it + can in memory and will release memory as needed to other processes. This means + that Bolt can show very high memory usage when working with large databases. + However, this is expected and the OS will release memory as needed. Bolt can + handle databases much larger than the available physical RAM, provided its + memory-map fits in the process virtual address space. It may be problematic + on 32-bits systems. + +* The data structures in the Bolt database are memory mapped so the data file + will be endian specific. This means that you cannot copy a Bolt file from a + little endian machine to a big endian machine and have it work. For most + users this is not a concern since most modern CPUs are little endian. + +* Because of the way pages are laid out on disk, Bolt cannot truncate data files + and return free pages back to the disk. Instead, Bolt maintains a free list + of unused pages within its data file. These free pages can be reused by later + transactions. This works well for many use cases as databases generally tend + to grow. However, it's important to note that deleting large chunks of data + will not allow you to reclaim that space on disk. + + For more information on page allocation, [see this comment][page-allocation]. + +[page-allocation]: https://github.com/boltdb/bolt/issues/308#issuecomment-74811638 + + +## Reading the Source + +Bolt is a relatively small code base (<3KLOC) for an embedded, serializable, +transactional key/value database so it can be a good starting point for people +interested in how databases work. + +The best places to start are the main entry points into Bolt: + +- `Open()` - Initializes the reference to the database. It's responsible for + creating the database if it doesn't exist, obtaining an exclusive lock on the + file, reading the meta pages, & memory-mapping the file. + +- `DB.Begin()` - Starts a read-only or read-write transaction depending on the + value of the `writable` argument. This requires briefly obtaining the "meta" + lock to keep track of open transactions. Only one read-write transaction can + exist at a time so the "rwlock" is acquired during the life of a read-write + transaction. + +- `Bucket.Put()` - Writes a key/value pair into a bucket. After validating the + arguments, a cursor is used to traverse the B+tree to the page and position + where they key & value will be written. Once the position is found, the bucket + materializes the underlying page and the page's parent pages into memory as + "nodes". These nodes are where mutations occur during read-write transactions. + These changes get flushed to disk during commit. + +- `Bucket.Get()` - Retrieves a key/value pair from a bucket. This uses a cursor + to move to the page & position of a key/value pair. During a read-only + transaction, the key and value data is returned as a direct reference to the + underlying mmap file so there's no allocation overhead. For read-write + transactions, this data may reference the mmap file or one of the in-memory + node values. + +- `Cursor` - This object is simply for traversing the B+tree of on-disk pages + or in-memory nodes. It can seek to a specific key, move to the first or last + value, or it can move forward or backward. The cursor handles the movement up + and down the B+tree transparently to the end user. + +- `Tx.Commit()` - Converts the in-memory dirty nodes and the list of free pages + into pages to be written to disk. Writing to disk then occurs in two phases. + First, the dirty pages are written to disk and an `fsync()` occurs. Second, a + new meta page with an incremented transaction ID is written and another + `fsync()` occurs. This two phase write ensures that partially written data + pages are ignored in the event of a crash since the meta page pointing to them + is never written. Partially written meta pages are invalidated because they + are written with a checksum. + +If you have additional notes that could be helpful for others, please submit +them via pull request. + + +## Other Projects Using Bolt + +Below is a list of public, open source projects that use Bolt: + +* [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. +* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. +* [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. +* [Skybox Analytics](https://github.com/skybox/skybox) - A standalone funnel analysis tool for web analytics. +* [Scuttlebutt](https://github.com/benbjohnson/scuttlebutt) - Uses Bolt to store and process all Twitter mentions of GitHub projects. +* [Wiki](https://github.com/peterhellberg/wiki) - A tiny wiki using Goji, BoltDB and Blackfriday. +* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. +* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. +* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". +* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. +* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. +* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. +* [photosite/session](https://godoc.org/bitbucket.org/kardianos/photosite/session) - Sessions for a photo viewing site. +* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. +* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. +* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. +* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. +* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. +* [SkyDB](https://github.com/skydb/sky) - Behavioral analytics database. +* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. +* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. +* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. +* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. +* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. +* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. +* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. +* [stow](https://github.com/djherbis/stow) - a persistence manager for objects + backed by boltdb. +* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining + simple tx and key scans. +* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. +* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service +* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. +* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. +* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. +* [Storm](https://github.com/asdine/storm) - A simple ORM around BoltDB. +* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. +* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. +* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. + +If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/src/github.com/boltdb/bolt/appveyor.yml b/vendor/src/github.com/boltdb/bolt/appveyor.yml new file mode 100644 index 0000000..6e26e94 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/appveyor.yml @@ -0,0 +1,18 @@ +version: "{build}" + +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\boltdb\bolt + +environment: + GOPATH: c:\gopath + +install: + - echo %PATH% + - echo %GOPATH% + - go version + - go env + - go get -v -t ./... + +build_script: + - go test -v ./... diff --git a/vendor/src/github.com/boltdb/bolt/bolt_386.go b/vendor/src/github.com/boltdb/bolt/bolt_386.go new file mode 100644 index 0000000..e659bfb --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_386.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_amd64.go b/vendor/src/github.com/boltdb/bolt/bolt_amd64.go new file mode 100644 index 0000000..cca6b7e --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_amd64.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_arm.go b/vendor/src/github.com/boltdb/bolt/bolt_arm.go new file mode 100644 index 0000000..e659bfb --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_arm.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_arm64.go b/vendor/src/github.com/boltdb/bolt/bolt_arm64.go new file mode 100644 index 0000000..6d23093 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_arm64.go @@ -0,0 +1,9 @@ +// +build arm64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_linux.go b/vendor/src/github.com/boltdb/bolt/bolt_linux.go new file mode 100644 index 0000000..2b67666 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_linux.go @@ -0,0 +1,10 @@ +package bolt + +import ( + "syscall" +) + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return syscall.Fdatasync(int(db.file.Fd())) +} diff --git a/vendor/src/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/src/github.com/boltdb/bolt/bolt_openbsd.go new file mode 100644 index 0000000..7058c3d --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_openbsd.go @@ -0,0 +1,27 @@ +package bolt + +import ( + "syscall" + "unsafe" +) + +const ( + msAsync = 1 << iota // perform asynchronous writes + msSync // perform synchronous writes + msInvalidate // invalidate cached data +) + +func msync(db *DB) error { + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) + if errno != 0 { + return errno + } + return nil +} + +func fdatasync(db *DB) error { + if db.data != nil { + return msync(db) + } + return db.file.Sync() +} diff --git a/vendor/src/github.com/boltdb/bolt/bolt_ppc.go b/vendor/src/github.com/boltdb/bolt/bolt_ppc.go new file mode 100644 index 0000000..645ddc3 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_ppc.go @@ -0,0 +1,9 @@ +// +build ppc + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/src/github.com/boltdb/bolt/bolt_ppc64.go new file mode 100644 index 0000000..2dc6be0 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_ppc64.go @@ -0,0 +1,9 @@ +// +build ppc64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/src/github.com/boltdb/bolt/bolt_ppc64le.go new file mode 100644 index 0000000..8351e12 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_ppc64le.go @@ -0,0 +1,9 @@ +// +build ppc64le + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_s390x.go b/vendor/src/github.com/boltdb/bolt/bolt_s390x.go new file mode 100644 index 0000000..f4dd26b --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_s390x.go @@ -0,0 +1,9 @@ +// +build s390x + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/src/github.com/boltdb/bolt/bolt_unix.go b/vendor/src/github.com/boltdb/bolt/bolt_unix.go new file mode 100644 index 0000000..cad62dd --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_unix.go @@ -0,0 +1,89 @@ +// +build !windows,!plan9,!solaris + +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + flag := syscall.LOCK_SH + if exclusive { + flag = syscall.LOCK_EX + } + + // Otherwise attempt to obtain an exclusive lock. + err := syscall.Flock(int(db.file.Fd()), flag|syscall.LOCK_NB) + if err == nil { + return nil + } else if err != syscall.EWOULDBLOCK { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + return syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := syscall.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} + +// NOTE: This function is copied from stdlib because it is not available on darwin. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/src/github.com/boltdb/bolt/bolt_unix_solaris.go b/vendor/src/github.com/boltdb/bolt/bolt_unix_solaris.go new file mode 100644 index 0000000..307bf2b --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_unix_solaris.go @@ -0,0 +1,90 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Pid = 0 + lock.Whence = 0 + lock.Pid = 0 + if exclusive { + lock.Type = syscall.F_WRLCK + } else { + lock.Type = syscall.F_RDLCK + } + err := syscall.FcntlFlock(db.file.Fd(), syscall.F_SETLK, &lock) + if err == nil { + return nil + } else if err != syscall.EAGAIN { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Type = syscall.F_UNLCK + lock.Whence = 0 + return syscall.FcntlFlock(uintptr(db.file.Fd()), syscall.F_SETLK, &lock) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := unix.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := unix.Madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := unix.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} diff --git a/vendor/src/github.com/boltdb/bolt/bolt_windows.go b/vendor/src/github.com/boltdb/bolt/bolt_windows.go new file mode 100644 index 0000000..d538e6a --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bolt_windows.go @@ -0,0 +1,144 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") +) + +const ( + lockExt = ".lock" + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx + flagLockExclusive = 2 + flagLockFailImmediately = 1 + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx + errLockViolation syscall.Errno = 0x21 +) + +func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) + if r == 0 { + return err + } + return nil +} + +func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) + if r == 0 { + return err + } + return nil +} + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + // Create a separate lock file on windows because a process + // cannot share an exclusive lock on the same file. This is + // needed during Tx.WriteTo(). + f, err := os.OpenFile(db.path+lockExt, os.O_CREATE, mode) + if err != nil { + return err + } + db.lockfile = f + + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + + var flag uint32 = flagLockFailImmediately + if exclusive { + flag |= flagLockExclusive + } + + err := lockFileEx(syscall.Handle(db.lockfile.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}) + if err == nil { + return nil + } else if err != errLockViolation { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) + db.lockfile.Close() + os.Remove(db.path+lockExt) + return err +} + +// mmap memory maps a DB's data file. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(db *DB, sz int) error { + if !db.readOnly { + // Truncate the database to the size of the mmap. + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("truncate: %s", err) + } + } + + // Open a file mapping handle. + sizelo := uint32(sz >> 32) + sizehi := uint32(sz) & 0xffffffff + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte array. + db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr))) + db.datasz = sz + + return nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(db *DB) error { + if db.data == nil { + return nil + } + + addr := (uintptr)(unsafe.Pointer(&db.data[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/src/github.com/boltdb/bolt/boltsync_unix.go b/vendor/src/github.com/boltdb/bolt/boltsync_unix.go new file mode 100644 index 0000000..f504425 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/boltsync_unix.go @@ -0,0 +1,8 @@ +// +build !windows,!plan9,!linux,!openbsd + +package bolt + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} diff --git a/vendor/src/github.com/boltdb/bolt/bucket.go b/vendor/src/github.com/boltdb/bolt/bucket.go new file mode 100644 index 0000000..d2f8c52 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bucket.go @@ -0,0 +1,748 @@ +package bolt + +import ( + "bytes" + "fmt" + "unsafe" +) + +const ( + // MaxKeySize is the maximum length of a key, in bytes. + MaxKeySize = 32768 + + // MaxValueSize is the maximum length of a value, in bytes. + MaxValueSize = (1 << 31) - 2 +) + +const ( + maxUint = ^uint(0) + minUint = 0 + maxInt = int(^uint(0) >> 1) + minInt = -maxInt - 1 +) + +const bucketHeaderSize = int(unsafe.Sizeof(bucket{})) + +const ( + minFillPercent = 0.1 + maxFillPercent = 1.0 +) + +// DefaultFillPercent is the percentage that split pages are filled. +// This value can be changed by setting Bucket.FillPercent. +const DefaultFillPercent = 0.5 + +// Bucket represents a collection of key/value pairs inside the database. +type Bucket struct { + *bucket + tx *Tx // the associated transaction + buckets map[string]*Bucket // subbucket cache + page *page // inline page reference + rootNode *node // materialized node for the root page. + nodes map[pgid]*node // node cache + + // Sets the threshold for filling nodes when they split. By default, + // the bucket will fill to 50% but it can be useful to increase this + // amount if you know that your write workloads are mostly append-only. + // + // This is non-persisted across transactions so it must be set in every Tx. + FillPercent float64 +} + +// bucket represents the on-file representation of a bucket. +// This is stored as the "value" of a bucket key. If the bucket is small enough, +// then its root page can be stored inline in the "value", after the bucket +// header. In the case of inline buckets, the "root" will be 0. +type bucket struct { + root pgid // page id of the bucket's root-level page + sequence uint64 // monotonically incrementing, used by NextSequence() +} + +// newBucket returns a new bucket associated with a transaction. +func newBucket(tx *Tx) Bucket { + var b = Bucket{tx: tx, FillPercent: DefaultFillPercent} + if tx.writable { + b.buckets = make(map[string]*Bucket) + b.nodes = make(map[pgid]*node) + } + return b +} + +// Tx returns the tx of the bucket. +func (b *Bucket) Tx() *Tx { + return b.tx +} + +// Root returns the root of the bucket. +func (b *Bucket) Root() pgid { + return b.root +} + +// Writable returns whether the bucket is writable. +func (b *Bucket) Writable() bool { + return b.tx.writable +} + +// Cursor creates a cursor associated with the bucket. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (b *Bucket) Cursor() *Cursor { + // Update transaction statistics. + b.tx.stats.CursorCount++ + + // Allocate and return a cursor. + return &Cursor{ + bucket: b, + stack: make([]elemRef, 0), + } +} + +// Bucket retrieves a nested bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) Bucket(name []byte) *Bucket { + if b.buckets != nil { + if child := b.buckets[string(name)]; child != nil { + return child + } + } + + // Move cursor to key. + c := b.Cursor() + k, v, flags := c.seek(name) + + // Return nil if the key doesn't exist or it is not a bucket. + if !bytes.Equal(name, k) || (flags&bucketLeafFlag) == 0 { + return nil + } + + // Otherwise create a bucket and cache it. + var child = b.openBucket(v) + if b.buckets != nil { + b.buckets[string(name)] = child + } + + return child +} + +// Helper method that re-interprets a sub-bucket value +// from a parent into a Bucket +func (b *Bucket) openBucket(value []byte) *Bucket { + var child = newBucket(b.tx) + + // If this is a writable transaction then we need to copy the bucket entry. + // Read-only transactions can point directly at the mmap entry. + if b.tx.writable { + child.bucket = &bucket{} + *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) + } else { + child.bucket = (*bucket)(unsafe.Pointer(&value[0])) + } + + // Save a reference to the inline page if the bucket is inline. + if child.root == 0 { + child.page = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + } + + return &child +} + +// CreateBucket creates a new bucket at the given key and returns the new bucket. +// Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { + if b.tx.db == nil { + return nil, ErrTxClosed + } else if !b.tx.writable { + return nil, ErrTxNotWritable + } else if len(key) == 0 { + return nil, ErrBucketNameRequired + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key. + if bytes.Equal(key, k) { + if (flags & bucketLeafFlag) != 0 { + return nil, ErrBucketExists + } else { + return nil, ErrIncompatibleValue + } + } + + // Create empty, inline bucket. + var bucket = Bucket{ + bucket: &bucket{}, + rootNode: &node{isLeaf: true}, + FillPercent: DefaultFillPercent, + } + var value = bucket.write() + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, bucketLeafFlag) + + // Since subbuckets are not allowed on inline buckets, we need to + // dereference the inline page, if it exists. This will cause the bucket + // to be treated as a regular, non-inline bucket for the rest of the tx. + b.page = nil + + return b.Bucket(key), nil +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) { + child, err := b.CreateBucket(key) + if err == ErrBucketExists { + return b.Bucket(key), nil + } else if err != nil { + return nil, err + } + return child, nil +} + +// DeleteBucket deletes a bucket at the given key. +// Returns an error if the bucket does not exists, or if the key represents a non-bucket value. +func (b *Bucket) DeleteBucket(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if bucket doesn't exist or is not a bucket. + if !bytes.Equal(key, k) { + return ErrBucketNotFound + } else if (flags & bucketLeafFlag) == 0 { + return ErrIncompatibleValue + } + + // Recursively delete all child buckets. + child := b.Bucket(key) + err := child.ForEach(func(k, v []byte) error { + if v == nil { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) + } + } + return nil + }) + if err != nil { + return err + } + + // Remove cached copy. + delete(b.buckets, string(key)) + + // Release all bucket pages to freelist. + child.nodes = nil + child.rootNode = nil + child.free() + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Get retrieves the value for a key in the bucket. +// Returns a nil value if the key does not exist or if the key is a nested bucket. +// The returned value is only valid for the life of the transaction. +func (b *Bucket) Get(key []byte) []byte { + k, v, flags := b.Cursor().seek(key) + + // Return nil if this is a bucket. + if (flags & bucketLeafFlag) != 0 { + return nil + } + + // If our target node isn't the same key as what's passed in then return nil. + if !bytes.Equal(key, k) { + return nil + } + return v +} + +// Put sets the value for a key in the bucket. +// If the key exist then its previous value will be overwritten. +// Supplied value must remain valid for the life of the transaction. +// Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. +func (b *Bucket) Put(key []byte, value []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } else if len(key) == 0 { + return ErrKeyRequired + } else if len(key) > MaxKeySize { + return ErrKeyTooLarge + } else if int64(len(value)) > MaxValueSize { + return ErrValueTooLarge + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key with a bucket value. + if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, 0) + + return nil +} + +// Delete removes a key from the bucket. +// If the key does not exist then nothing is done and a nil error is returned. +// Returns an error if the bucket was created from a read-only transaction. +func (b *Bucket) Delete(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + _, _, flags := c.seek(key) + + // Return an error if there is already existing bucket value. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// NextSequence returns an autoincrementing integer for the bucket. +func (b *Bucket) NextSequence() (uint64, error) { + if b.tx.db == nil { + return 0, ErrTxClosed + } else if !b.Writable() { + return 0, ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence++ + return b.bucket.sequence, nil +} + +// ForEach executes a function for each key/value pair in a bucket. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. The provided function must not modify +// the bucket; this will result in undefined behavior. +func (b *Bucket) ForEach(fn func(k, v []byte) error) error { + if b.tx.db == nil { + return ErrTxClosed + } + c := b.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if err := fn(k, v); err != nil { + return err + } + } + return nil +} + +// Stat returns stats on a bucket. +func (b *Bucket) Stats() BucketStats { + var s, subStats BucketStats + pageSize := b.tx.db.pageSize + s.BucketN += 1 + if b.root == 0 { + s.InlineBucketN += 1 + } + b.forEachPage(func(p *page, depth int) { + if (p.flags & leafPageFlag) != 0 { + s.KeyN += int(p.count) + + // used totals the used bytes for the page + used := pageHeaderSize + + if p.count != 0 { + // If page has any elements, add all element headers. + used += leafPageElementSize * int(p.count-1) + + // Add all element key, value sizes. + // The computation takes advantage of the fact that the position + // of the last element's key/value equals to the total of the sizes + // of all previous elements' keys and values. + // It also includes the last element's header. + lastElement := p.leafPageElement(p.count - 1) + used += int(lastElement.pos + lastElement.ksize + lastElement.vsize) + } + + if b.root == 0 { + // For inlined bucket just update the inline stats + s.InlineBucketInuse += used + } else { + // For non-inlined bucket update all the leaf stats + s.LeafPageN++ + s.LeafInuse += used + s.LeafOverflowN += int(p.overflow) + + // Collect stats from sub-buckets. + // Do that by iterating over all element headers + // looking for the ones with the bucketLeafFlag. + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + if (e.flags & bucketLeafFlag) != 0 { + // For any bucket element, open the element value + // and recursively call Stats on the contained bucket. + subStats.Add(b.openBucket(e.value()).Stats()) + } + } + } + } else if (p.flags & branchPageFlag) != 0 { + s.BranchPageN++ + lastElement := p.branchPageElement(p.count - 1) + + // used totals the used bytes for the page + // Add header and all element headers. + used := pageHeaderSize + (branchPageElementSize * int(p.count-1)) + + // Add size of all keys and values. + // Again, use the fact that last element's position equals to + // the total of key, value sizes of all previous elements. + used += int(lastElement.pos + lastElement.ksize) + s.BranchInuse += used + s.BranchOverflowN += int(p.overflow) + } + + // Keep track of maximum page depth. + if depth+1 > s.Depth { + s.Depth = (depth + 1) + } + }) + + // Alloc stats can be computed from page counts and pageSize. + s.BranchAlloc = (s.BranchPageN + s.BranchOverflowN) * pageSize + s.LeafAlloc = (s.LeafPageN + s.LeafOverflowN) * pageSize + + // Add the max depth of sub-buckets to get total nested depth. + s.Depth += subStats.Depth + // Add the stats for all sub-buckets + s.Add(subStats) + return s +} + +// forEachPage iterates over every page in a bucket, including inline pages. +func (b *Bucket) forEachPage(fn func(*page, int)) { + // If we have an inline page then just use that. + if b.page != nil { + fn(b.page, 0) + return + } + + // Otherwise traverse the page hierarchy. + b.tx.forEachPage(b.root, 0, fn) +} + +// forEachPageNode iterates over every page (or node) in a bucket. +// This also includes inline pages. +func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { + // If we have an inline page or root node then just use that. + if b.page != nil { + fn(b.page, nil, 0) + return + } + b._forEachPageNode(b.root, 0, fn) +} + +func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgid) + + // Execute function. + fn(p, n, depth) + + // Recursively loop over children. + if p != nil { + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + b._forEachPageNode(elem.pgid, depth+1, fn) + } + } + } else { + if !n.isLeaf { + for _, inode := range n.inodes { + b._forEachPageNode(inode.pgid, depth+1, fn) + } + } + } +} + +// spill writes all the nodes for this bucket to dirty pages. +func (b *Bucket) spill() error { + // Spill all child buckets first. + for name, child := range b.buckets { + // If the child bucket is small enough and it has no child buckets then + // write it inline into the parent bucket's page. Otherwise spill it + // like a normal bucket and make the parent value a pointer to the page. + var value []byte + if child.inlineable() { + child.free() + value = child.write() + } else { + if err := child.spill(); err != nil { + return err + } + + // Update the child bucket header in this bucket. + value = make([]byte, unsafe.Sizeof(bucket{})) + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *child.bucket + } + + // Skip writing the bucket if there are no materialized nodes. + if child.rootNode == nil { + continue + } + + // Update parent node. + var c = b.Cursor() + k, _, flags := c.seek([]byte(name)) + if !bytes.Equal([]byte(name), k) { + panic(fmt.Sprintf("misplaced bucket header: %x -> %x", []byte(name), k)) + } + if flags&bucketLeafFlag == 0 { + panic(fmt.Sprintf("unexpected bucket header flag: %x", flags)) + } + c.node().put([]byte(name), []byte(name), value, 0, bucketLeafFlag) + } + + // Ignore if there's not a materialized root node. + if b.rootNode == nil { + return nil + } + + // Spill nodes. + if err := b.rootNode.spill(); err != nil { + return err + } + b.rootNode = b.rootNode.root() + + // Update the root node for this bucket. + if b.rootNode.pgid >= b.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid)) + } + b.root = b.rootNode.pgid + + return nil +} + +// inlineable returns true if a bucket is small enough to be written inline +// and if it contains no subbuckets. Otherwise returns false. +func (b *Bucket) inlineable() bool { + var n = b.rootNode + + // Bucket must only contain a single leaf node. + if n == nil || !n.isLeaf { + return false + } + + // Bucket is not inlineable if it contains subbuckets or if it goes beyond + // our threshold for inline bucket size. + var size = pageHeaderSize + for _, inode := range n.inodes { + size += leafPageElementSize + len(inode.key) + len(inode.value) + + if inode.flags&bucketLeafFlag != 0 { + return false + } else if size > b.maxInlineBucketSize() { + return false + } + } + + return true +} + +// Returns the maximum total size of a bucket to make it a candidate for inlining. +func (b *Bucket) maxInlineBucketSize() int { + return b.tx.db.pageSize / 4 +} + +// write allocates and writes a bucket to a byte slice. +func (b *Bucket) write() []byte { + // Allocate the appropriate size. + var n = b.rootNode + var value = make([]byte, bucketHeaderSize+n.size()) + + // Write a bucket header. + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *b.bucket + + // Convert byte slice to a fake page and write the root node. + var p = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + n.write(p) + + return value +} + +// rebalance attempts to balance all nodes. +func (b *Bucket) rebalance() { + for _, n := range b.nodes { + n.rebalance() + } + for _, child := range b.buckets { + child.rebalance() + } +} + +// node creates a node from a page and associates it with a given parent. +func (b *Bucket) node(pgid pgid, parent *node) *node { + _assert(b.nodes != nil, "nodes map expected") + + // Retrieve node if it's already been created. + if n := b.nodes[pgid]; n != nil { + return n + } + + // Otherwise create a node and cache it. + n := &node{bucket: b, parent: parent} + if parent == nil { + b.rootNode = n + } else { + parent.children = append(parent.children, n) + } + + // Use the inline page if this is an inline bucket. + var p = b.page + if p == nil { + p = b.tx.page(pgid) + } + + // Read the page into the node and cache it. + n.read(p) + b.nodes[pgid] = n + + // Update statistics. + b.tx.stats.NodeCount++ + + return n +} + +// free recursively frees all pages in the bucket. +func (b *Bucket) free() { + if b.root == 0 { + return + } + + var tx = b.tx + b.forEachPageNode(func(p *page, n *node, _ int) { + if p != nil { + tx.db.freelist.free(tx.meta.txid, p) + } else { + n.free() + } + }) + b.root = 0 +} + +// dereference removes all references to the old mmap. +func (b *Bucket) dereference() { + if b.rootNode != nil { + b.rootNode.root().dereference() + } + + for _, child := range b.buckets { + child.dereference() + } +} + +// pageNode returns the in-memory node, if it exists. +// Otherwise returns the underlying page. +func (b *Bucket) pageNode(id pgid) (*page, *node) { + // Inline buckets have a fake page embedded in their value so treat them + // differently. We'll return the rootNode (if available) or the fake page. + if b.root == 0 { + if id != 0 { + panic(fmt.Sprintf("inline bucket non-zero page access(2): %d != 0", id)) + } + if b.rootNode != nil { + return nil, b.rootNode + } + return b.page, nil + } + + // Check the node cache for non-inline buckets. + if b.nodes != nil { + if n := b.nodes[id]; n != nil { + return nil, n + } + } + + // Finally lookup the page from the transaction if no node is materialized. + return b.tx.page(id), nil +} + +// BucketStats records statistics about resources used by a bucket. +type BucketStats struct { + // Page count statistics. + BranchPageN int // number of logical branch pages + BranchOverflowN int // number of physical branch overflow pages + LeafPageN int // number of logical leaf pages + LeafOverflowN int // number of physical leaf overflow pages + + // Tree statistics. + KeyN int // number of keys/value pairs + Depth int // number of levels in B+tree + + // Page size utilization. + BranchAlloc int // bytes allocated for physical branch pages + BranchInuse int // bytes actually used for branch data + LeafAlloc int // bytes allocated for physical leaf pages + LeafInuse int // bytes actually used for leaf data + + // Bucket statistics + BucketN int // total number of buckets including the top bucket + InlineBucketN int // total number on inlined buckets + InlineBucketInuse int // bytes used for inlined buckets (also accounted for in LeafInuse) +} + +func (s *BucketStats) Add(other BucketStats) { + s.BranchPageN += other.BranchPageN + s.BranchOverflowN += other.BranchOverflowN + s.LeafPageN += other.LeafPageN + s.LeafOverflowN += other.LeafOverflowN + s.KeyN += other.KeyN + if s.Depth < other.Depth { + s.Depth = other.Depth + } + s.BranchAlloc += other.BranchAlloc + s.BranchInuse += other.BranchInuse + s.LeafAlloc += other.LeafAlloc + s.LeafInuse += other.LeafInuse + + s.BucketN += other.BucketN + s.InlineBucketN += other.InlineBucketN + s.InlineBucketInuse += other.InlineBucketInuse +} + +// cloneBytes returns a copy of a given slice. +func cloneBytes(v []byte) []byte { + var clone = make([]byte, len(v)) + copy(clone, v) + return clone +} diff --git a/vendor/src/github.com/boltdb/bolt/bucket_test.go b/vendor/src/github.com/boltdb/bolt/bucket_test.go new file mode 100644 index 0000000..528fec2 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/bucket_test.go @@ -0,0 +1,1867 @@ +package bolt_test + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "log" + "math/rand" + "os" + "strconv" + "strings" + "testing" + "testing/quick" + + "github.com/boltdb/bolt" +) + +// Ensure that a bucket that gets a non-existent key returns nil. +func TestBucket_Get_NonExistent(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if v := b.Get([]byte("foo")); v != nil { + t.Fatal("expected nil value") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can read a value that is not flushed yet. +func TestBucket_Get_FromNode(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if v := b.Get([]byte("foo")); !bytes.Equal(v, []byte("bar")) { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket retrieved via Get() returns a nil. +func TestBucket_Get_IncompatibleValue(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if _, err := tx.Bucket([]byte("widgets")).CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + + if tx.Bucket([]byte("widgets")).Get([]byte("foo")) != nil { + t.Fatal("expected nil value") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a slice returned from a bucket has a capacity equal to its length. +// This also allows slices to be appended to since it will require a realloc by Go. +// +// https://github.com/boltdb/bolt/issues/544 +func TestBucket_Get_Capacity(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Write key to a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("bucket")) + if err != nil { + return err + } + return b.Put([]byte("key"), []byte("val")) + }); err != nil { + t.Fatal(err) + } + + // Retrieve value and attempt to append to it. + if err := db.Update(func(tx *bolt.Tx) error { + k, v := tx.Bucket([]byte("bucket")).Cursor().First() + + // Verify capacity. + if len(k) != cap(k) { + t.Fatalf("unexpected key slice capacity: %d", cap(k)) + } else if len(v) != cap(v) { + t.Fatalf("unexpected value slice capacity: %d", cap(v)) + } + + // Ensure slice can be appended to without a segfault. + k = append(k, []byte("123")...) + v = append(v, []byte("123")...) + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can write a key/value. +func TestBucket_Put(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + + v := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + if !bytes.Equal([]byte("bar"), v) { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can rewrite a key in the same transaction. +func TestBucket_Put_Repeat(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("baz")); err != nil { + t.Fatal(err) + } + + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + if !bytes.Equal([]byte("baz"), value) { + t.Fatalf("unexpected value: %v", value) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can write a bunch of large values. +func TestBucket_Put_Large(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + count, factor := 100, 200 + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for i := 1; i < count; i++ { + if err := b.Put([]byte(strings.Repeat("0", i*factor)), []byte(strings.Repeat("X", (count-i)*factor))); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 1; i < count; i++ { + value := b.Get([]byte(strings.Repeat("0", i*factor))) + if !bytes.Equal(value, []byte(strings.Repeat("X", (count-i)*factor))) { + t.Fatalf("unexpected value: %v", value) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a database can perform multiple large appends safely. +func TestDB_Put_VeryLarge(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + n, batchN := 400000, 200000 + ksize, vsize := 8, 500 + + db := MustOpenDB() + defer db.MustClose() + + for i := 0; i < n; i += batchN { + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for j := 0; j < batchN; j++ { + k, v := make([]byte, ksize), make([]byte, vsize) + binary.BigEndian.PutUint32(k, uint32(i+j)) + if err := b.Put(k, v); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + } +} + +// Ensure that a setting a value on a key with a bucket value returns an error. +func TestBucket_Put_IncompatibleValue(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b0, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if _, err := tx.Bucket([]byte("widgets")).CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + if err := b0.Put([]byte("foo"), []byte("bar")); err != bolt.ErrIncompatibleValue { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a setting a value while the transaction is closed returns an error. +func TestBucket_Put_Closed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + + if err := b.Put([]byte("foo"), []byte("bar")); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that setting a value on a read-only bucket returns an error. +func TestBucket_Put_ReadOnly(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + if err := b.Put([]byte("foo"), []byte("bar")); err != bolt.ErrTxNotWritable { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can delete an existing key. +func TestBucket_Delete(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Delete([]byte("foo")); err != nil { + t.Fatal(err) + } + if v := b.Get([]byte("foo")); v != nil { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a large set of keys will work correctly. +func TestBucket_Delete_Large(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 100; i++ { + if err := b.Put([]byte(strconv.Itoa(i)), []byte(strings.Repeat("*", 1024))); err != nil { + t.Fatal(err) + } + } + + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 0; i < 100; i++ { + if err := b.Delete([]byte(strconv.Itoa(i))); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 0; i < 100; i++ { + if v := b.Get([]byte(strconv.Itoa(i))); v != nil { + t.Fatalf("unexpected value: %v, i=%d", v, i) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Deleting a very large list of keys will cause the freelist to use overflow. +func TestBucket_Delete_FreelistOverflow(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + db := MustOpenDB() + defer db.MustClose() + + k := make([]byte, 16) + for i := uint64(0); i < 10000; i++ { + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("0")) + if err != nil { + t.Fatalf("bucket error: %s", err) + } + + for j := uint64(0); j < 1000; j++ { + binary.BigEndian.PutUint64(k[:8], i) + binary.BigEndian.PutUint64(k[8:], j) + if err := b.Put(k, nil); err != nil { + t.Fatalf("put error: %s", err) + } + } + + return nil + }); err != nil { + t.Fatal(err) + } + } + + // Delete all of them in one large transaction + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("0")) + c := b.Cursor() + for k, _ := c.First(); k != nil; k, _ = c.Next() { + if err := c.Delete(); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that accessing and updating nested buckets is ok across transactions. +func TestBucket_Nested(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + // Create a widgets bucket. + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + // Create a widgets/foo bucket. + _, err = b.CreateBucket([]byte("foo")) + if err != nil { + t.Fatal(err) + } + + // Create a widgets/bar key. + if err := b.Put([]byte("bar"), []byte("0000")); err != nil { + t.Fatal(err) + } + + return nil + }); err != nil { + t.Fatal(err) + } + db.MustCheck() + + // Update widgets/bar. + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + if err := b.Put([]byte("bar"), []byte("xxxx")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + db.MustCheck() + + // Cause a split. + if err := db.Update(func(tx *bolt.Tx) error { + var b = tx.Bucket([]byte("widgets")) + for i := 0; i < 10000; i++ { + if err := b.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + db.MustCheck() + + // Insert into widgets/foo/baz. + if err := db.Update(func(tx *bolt.Tx) error { + var b = tx.Bucket([]byte("widgets")) + if err := b.Bucket([]byte("foo")).Put([]byte("baz"), []byte("yyyy")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + db.MustCheck() + + // Verify. + if err := db.View(func(tx *bolt.Tx) error { + var b = tx.Bucket([]byte("widgets")) + if v := b.Bucket([]byte("foo")).Get([]byte("baz")); !bytes.Equal(v, []byte("yyyy")) { + t.Fatalf("unexpected value: %v", v) + } + if v := b.Get([]byte("bar")); !bytes.Equal(v, []byte("xxxx")) { + t.Fatalf("unexpected value: %v", v) + } + for i := 0; i < 10000; i++ { + if v := b.Get([]byte(strconv.Itoa(i))); !bytes.Equal(v, []byte(strconv.Itoa(i))) { + t.Fatalf("unexpected value: %v", v) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a bucket using Delete() returns an error. +func TestBucket_Delete_Bucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + if err := b.Delete([]byte("foo")); err != bolt.ErrIncompatibleValue { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a key on a read-only bucket returns an error. +func TestBucket_Delete_ReadOnly(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("widgets")).Delete([]byte("foo")); err != bolt.ErrTxNotWritable { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a deleting value while the transaction is closed returns an error. +func TestBucket_Delete_Closed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + if err := b.Delete([]byte("foo")); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that deleting a bucket causes nested buckets to be deleted. +func TestBucket_DeleteBucket_Nested(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + foo, err := widgets.CreateBucket([]byte("foo")) + if err != nil { + t.Fatal(err) + } + + bar, err := foo.CreateBucket([]byte("bar")) + if err != nil { + t.Fatal(err) + } + if err := bar.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + if err := tx.Bucket([]byte("widgets")).DeleteBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a bucket causes nested buckets to be deleted after they have been committed. +func TestBucket_DeleteBucket_Nested2(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + foo, err := widgets.CreateBucket([]byte("foo")) + if err != nil { + t.Fatal(err) + } + + bar, err := foo.CreateBucket([]byte("bar")) + if err != nil { + t.Fatal(err) + } + + if err := bar.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + widgets := tx.Bucket([]byte("widgets")) + if widgets == nil { + t.Fatal("expected widgets bucket") + } + + foo := widgets.Bucket([]byte("foo")) + if foo == nil { + t.Fatal("expected foo bucket") + } + + bar := foo.Bucket([]byte("bar")) + if bar == nil { + t.Fatal("expected bar bucket") + } + + if v := bar.Get([]byte("baz")); !bytes.Equal(v, []byte("bat")) { + t.Fatalf("unexpected value: %v", v) + } + if err := tx.DeleteBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) != nil { + t.Fatal("expected bucket to be deleted") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a child bucket with multiple pages causes all pages to get collected. +// NOTE: Consistency check in bolt_test.DB.Close() will panic if pages not freed properly. +func TestBucket_DeleteBucket_Large(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + foo, err := widgets.CreateBucket([]byte("foo")) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 1000; i++ { + if err := foo.Put([]byte(fmt.Sprintf("%d", i)), []byte(fmt.Sprintf("%0100d", i))); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.DeleteBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a simple value retrieved via Bucket() returns a nil. +func TestBucket_Bucket_IncompatibleValue(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := widgets.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if b := tx.Bucket([]byte("widgets")).Bucket([]byte("foo")); b != nil { + t.Fatal("expected nil bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that creating a bucket on an existing non-bucket key returns an error. +func TestBucket_CreateBucket_IncompatibleValue(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := widgets.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if _, err := widgets.CreateBucket([]byte("foo")); err != bolt.ErrIncompatibleValue { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a bucket on an existing non-bucket key returns an error. +func TestBucket_DeleteBucket_IncompatibleValue(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := widgets.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := tx.Bucket([]byte("widgets")).DeleteBucket([]byte("foo")); err != bolt.ErrIncompatibleValue { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can return an autoincrementing sequence. +func TestBucket_NextSequence(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + widgets, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + woojits, err := tx.CreateBucket([]byte("woojits")) + if err != nil { + t.Fatal(err) + } + + // Make sure sequence increments. + if seq, err := widgets.NextSequence(); err != nil { + t.Fatal(err) + } else if seq != 1 { + t.Fatalf("unexpecte sequence: %d", seq) + } + + if seq, err := widgets.NextSequence(); err != nil { + t.Fatal(err) + } else if seq != 2 { + t.Fatalf("unexpected sequence: %d", seq) + } + + // Buckets should be separate. + if seq, err := woojits.NextSequence(); err != nil { + t.Fatal(err) + } else if seq != 1 { + t.Fatalf("unexpected sequence: %d", 1) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket will persist an autoincrementing sequence even if its +// the only thing updated on the bucket. +// https://github.com/boltdb/bolt/issues/296 +func TestBucket_NextSequence_Persist(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.Bucket([]byte("widgets")).NextSequence(); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + seq, err := tx.Bucket([]byte("widgets")).NextSequence() + if err != nil { + t.Fatalf("unexpected error: %s", err) + } else if seq != 2 { + t.Fatalf("unexpected sequence: %d", seq) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that retrieving the next sequence on a read-only bucket returns an error. +func TestBucket_NextSequence_ReadOnly(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + _, err := tx.Bucket([]byte("widgets")).NextSequence() + if err != bolt.ErrTxNotWritable { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that retrieving the next sequence for a bucket on a closed database return an error. +func TestBucket_NextSequence_Closed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + if _, err := b.NextSequence(); err != bolt.ErrTxClosed { + t.Fatal(err) + } +} + +// Ensure a user can loop over all key/value pairs in a bucket. +func TestBucket_ForEach(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("0000")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("0001")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte("0002")); err != nil { + t.Fatal(err) + } + + var index int + if err := b.ForEach(func(k, v []byte) error { + switch index { + case 0: + if !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0002")) { + t.Fatalf("unexpected value: %v", v) + } + case 1: + if !bytes.Equal(k, []byte("baz")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0001")) { + t.Fatalf("unexpected value: %v", v) + } + case 2: + if !bytes.Equal(k, []byte("foo")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0000")) { + t.Fatalf("unexpected value: %v", v) + } + } + index++ + return nil + }); err != nil { + t.Fatal(err) + } + + if index != 3 { + t.Fatalf("unexpected index: %d", index) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a database can stop iteration early. +func TestBucket_ForEach_ShortCircuit(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte("0000")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("0000")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("0000")); err != nil { + t.Fatal(err) + } + + var index int + if err := tx.Bucket([]byte("widgets")).ForEach(func(k, v []byte) error { + index++ + if bytes.Equal(k, []byte("baz")) { + return errors.New("marker") + } + return nil + }); err == nil || err.Error() != "marker" { + t.Fatalf("unexpected error: %s", err) + } + if index != 2 { + t.Fatalf("unexpected index: %d", index) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that looping over a bucket on a closed database returns an error. +func TestBucket_ForEach_Closed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + + if err := b.ForEach(func(k, v []byte) error { return nil }); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that an error is returned when inserting with an empty key. +func TestBucket_Put_EmptyKey(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte(""), []byte("bar")); err != bolt.ErrKeyRequired { + t.Fatalf("unexpected error: %s", err) + } + if err := b.Put(nil, []byte("bar")); err != bolt.ErrKeyRequired { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that an error is returned when inserting with a key that's too large. +func TestBucket_Put_KeyTooLarge(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put(make([]byte, 32769), []byte("bar")); err != bolt.ErrKeyTooLarge { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that an error is returned when inserting a value that's too large. +func TestBucket_Put_ValueTooLarge(t *testing.T) { + // Skip this test on DroneCI because the machine is resource constrained. + if os.Getenv("DRONE") == "true" { + t.Skip("not enough RAM for test") + } + + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), make([]byte, bolt.MaxValueSize+1)); err != bolt.ErrValueTooLarge { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a bucket can calculate stats. +func TestBucket_Stats(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Add bucket with fewer keys but one big value. + bigKey := []byte("really-big-value") + for i := 0; i < 500; i++ { + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("woojits")) + if err != nil { + t.Fatal(err) + } + + if err := b.Put([]byte(fmt.Sprintf("%03d", i)), []byte(strconv.Itoa(i))); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + } + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("woojits")).Put(bigKey, []byte(strings.Repeat("*", 10000))); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + stats := tx.Bucket([]byte("woojits")).Stats() + if stats.BranchPageN != 1 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.LeafPageN != 7 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 2 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.KeyN != 501 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } else if stats.Depth != 2 { + t.Fatalf("unexpected Depth: %d", stats.Depth) + } + + branchInuse := 16 // branch page header + branchInuse += 7 * 16 // branch elements + branchInuse += 7 * 3 // branch keys (6 3-byte keys) + if stats.BranchInuse != branchInuse { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } + + leafInuse := 7 * 16 // leaf page header + leafInuse += 501 * 16 // leaf elements + leafInuse += 500*3 + len(bigKey) // leaf keys + leafInuse += 1*10 + 2*90 + 3*400 + 10000 // leaf values + if stats.LeafInuse != leafInuse { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } + + // Only check allocations for 4KB pages. + if os.Getpagesize() == 4096 { + if stats.BranchAlloc != 4096 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } else if stats.LeafAlloc != 36864 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + } + + if stats.BucketN != 1 { + t.Fatalf("unexpected BucketN: %d", stats.BucketN) + } else if stats.InlineBucketN != 0 { + t.Fatalf("unexpected InlineBucketN: %d", stats.InlineBucketN) + } else if stats.InlineBucketInuse != 0 { + t.Fatalf("unexpected InlineBucketInuse: %d", stats.InlineBucketInuse) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a bucket with random insertion utilizes fill percentage correctly. +func TestBucket_Stats_RandomFill(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } else if os.Getpagesize() != 4096 { + t.Skip("invalid page size for test") + } + + db := MustOpenDB() + defer db.MustClose() + + // Add a set of values in random order. It will be the same random + // order so we can maintain consistency between test runs. + var count int + rand := rand.New(rand.NewSource(42)) + for _, i := range rand.Perm(1000) { + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("woojits")) + if err != nil { + t.Fatal(err) + } + b.FillPercent = 0.9 + for _, j := range rand.Perm(100) { + index := (j * 10000) + i + if err := b.Put([]byte(fmt.Sprintf("%d000000000000000", index)), []byte("0000000000")); err != nil { + t.Fatal(err) + } + count++ + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + stats := tx.Bucket([]byte("woojits")).Stats() + if stats.KeyN != 100000 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } + + if stats.BranchPageN != 98 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.BranchInuse != 130984 { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } else if stats.BranchAlloc != 401408 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } + + if stats.LeafPageN != 3412 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 0 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.LeafInuse != 4742482 { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } else if stats.LeafAlloc != 13975552 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a bucket can calculate stats. +func TestBucket_Stats_Small(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + // Add a bucket that fits on a single root leaf. + b, err := tx.CreateBucket([]byte("whozawhats")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + + return nil + }); err != nil { + t.Fatal(err) + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("whozawhats")) + stats := b.Stats() + if stats.BranchPageN != 0 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.LeafPageN != 0 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 0 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.KeyN != 1 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } else if stats.Depth != 1 { + t.Fatalf("unexpected Depth: %d", stats.Depth) + } else if stats.BranchInuse != 0 { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } else if stats.LeafInuse != 0 { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } + + if os.Getpagesize() == 4096 { + if stats.BranchAlloc != 0 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } else if stats.LeafAlloc != 0 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + } + + if stats.BucketN != 1 { + t.Fatalf("unexpected BucketN: %d", stats.BucketN) + } else if stats.InlineBucketN != 1 { + t.Fatalf("unexpected InlineBucketN: %d", stats.InlineBucketN) + } else if stats.InlineBucketInuse != 16+16+6 { + t.Fatalf("unexpected InlineBucketInuse: %d", stats.InlineBucketInuse) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +func TestBucket_Stats_EmptyBucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + // Add a bucket that fits on a single root leaf. + if _, err := tx.CreateBucket([]byte("whozawhats")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("whozawhats")) + stats := b.Stats() + if stats.BranchPageN != 0 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.LeafPageN != 0 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 0 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.KeyN != 0 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } else if stats.Depth != 1 { + t.Fatalf("unexpected Depth: %d", stats.Depth) + } else if stats.BranchInuse != 0 { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } else if stats.LeafInuse != 0 { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } + + if os.Getpagesize() == 4096 { + if stats.BranchAlloc != 0 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } else if stats.LeafAlloc != 0 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + } + + if stats.BucketN != 1 { + t.Fatalf("unexpected BucketN: %d", stats.BucketN) + } else if stats.InlineBucketN != 1 { + t.Fatalf("unexpected InlineBucketN: %d", stats.InlineBucketN) + } else if stats.InlineBucketInuse != 16 { + t.Fatalf("unexpected InlineBucketInuse: %d", stats.InlineBucketInuse) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a bucket can calculate stats. +func TestBucket_Stats_Nested(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("foo")) + if err != nil { + t.Fatal(err) + } + for i := 0; i < 100; i++ { + if err := b.Put([]byte(fmt.Sprintf("%02d", i)), []byte(fmt.Sprintf("%02d", i))); err != nil { + t.Fatal(err) + } + } + + bar, err := b.CreateBucket([]byte("bar")) + if err != nil { + t.Fatal(err) + } + for i := 0; i < 10; i++ { + if err := bar.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { + t.Fatal(err) + } + } + + baz, err := bar.CreateBucket([]byte("baz")) + if err != nil { + t.Fatal(err) + } + for i := 0; i < 10; i++ { + if err := baz.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { + t.Fatal(err) + } + } + + return nil + }); err != nil { + t.Fatal(err) + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("foo")) + stats := b.Stats() + if stats.BranchPageN != 0 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.LeafPageN != 2 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 0 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.KeyN != 122 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } else if stats.Depth != 3 { + t.Fatalf("unexpected Depth: %d", stats.Depth) + } else if stats.BranchInuse != 0 { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } + + foo := 16 // foo (pghdr) + foo += 101 * 16 // foo leaf elements + foo += 100*2 + 100*2 // foo leaf key/values + foo += 3 + 16 // foo -> bar key/value + + bar := 16 // bar (pghdr) + bar += 11 * 16 // bar leaf elements + bar += 10 + 10 // bar leaf key/values + bar += 3 + 16 // bar -> baz key/value + + baz := 16 // baz (inline) (pghdr) + baz += 10 * 16 // baz leaf elements + baz += 10 + 10 // baz leaf key/values + + if stats.LeafInuse != foo+bar+baz { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } + + if os.Getpagesize() == 4096 { + if stats.BranchAlloc != 0 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } else if stats.LeafAlloc != 8192 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + } + + if stats.BucketN != 3 { + t.Fatalf("unexpected BucketN: %d", stats.BucketN) + } else if stats.InlineBucketN != 1 { + t.Fatalf("unexpected InlineBucketN: %d", stats.InlineBucketN) + } else if stats.InlineBucketInuse != baz { + t.Fatalf("unexpected InlineBucketInuse: %d", stats.InlineBucketInuse) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a large bucket can calculate stats. +func TestBucket_Stats_Large(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + db := MustOpenDB() + defer db.MustClose() + + var index int + for i := 0; i < 100; i++ { + // Add bucket with lots of keys. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for i := 0; i < 1000; i++ { + if err := b.Put([]byte(strconv.Itoa(index)), []byte(strconv.Itoa(index))); err != nil { + t.Fatal(err) + } + index++ + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + db.MustCheck() + + if err := db.View(func(tx *bolt.Tx) error { + stats := tx.Bucket([]byte("widgets")).Stats() + if stats.BranchPageN != 13 { + t.Fatalf("unexpected BranchPageN: %d", stats.BranchPageN) + } else if stats.BranchOverflowN != 0 { + t.Fatalf("unexpected BranchOverflowN: %d", stats.BranchOverflowN) + } else if stats.LeafPageN != 1196 { + t.Fatalf("unexpected LeafPageN: %d", stats.LeafPageN) + } else if stats.LeafOverflowN != 0 { + t.Fatalf("unexpected LeafOverflowN: %d", stats.LeafOverflowN) + } else if stats.KeyN != 100000 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } else if stats.Depth != 3 { + t.Fatalf("unexpected Depth: %d", stats.Depth) + } else if stats.BranchInuse != 25257 { + t.Fatalf("unexpected BranchInuse: %d", stats.BranchInuse) + } else if stats.LeafInuse != 2596916 { + t.Fatalf("unexpected LeafInuse: %d", stats.LeafInuse) + } + + if os.Getpagesize() == 4096 { + if stats.BranchAlloc != 53248 { + t.Fatalf("unexpected BranchAlloc: %d", stats.BranchAlloc) + } else if stats.LeafAlloc != 4898816 { + t.Fatalf("unexpected LeafAlloc: %d", stats.LeafAlloc) + } + } + + if stats.BucketN != 1 { + t.Fatalf("unexpected BucketN: %d", stats.BucketN) + } else if stats.InlineBucketN != 0 { + t.Fatalf("unexpected InlineBucketN: %d", stats.InlineBucketN) + } else if stats.InlineBucketInuse != 0 { + t.Fatalf("unexpected InlineBucketInuse: %d", stats.InlineBucketInuse) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can write random keys and values across multiple transactions. +func TestBucket_Put_Single(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + index := 0 + if err := quick.Check(func(items testdata) bool { + db := MustOpenDB() + defer db.MustClose() + + m := make(map[string][]byte) + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + for _, item := range items { + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("widgets")).Put(item.Key, item.Value); err != nil { + panic("put error: " + err.Error()) + } + m[string(item.Key)] = item.Value + return nil + }); err != nil { + t.Fatal(err) + } + + // Verify all key/values so far. + if err := db.View(func(tx *bolt.Tx) error { + i := 0 + for k, v := range m { + value := tx.Bucket([]byte("widgets")).Get([]byte(k)) + if !bytes.Equal(value, v) { + t.Logf("value mismatch [run %d] (%d of %d):\nkey: %x\ngot: %x\nexp: %x", index, i, len(m), []byte(k), value, v) + db.CopyTempFile() + t.FailNow() + } + i++ + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + index++ + return true + }, nil); err != nil { + t.Error(err) + } +} + +// Ensure that a transaction can insert multiple key/value pairs at once. +func TestBucket_Put_Multiple(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + if err := quick.Check(func(items testdata) bool { + db := MustOpenDB() + defer db.MustClose() + + // Bulk insert all values. + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for _, item := range items { + if err := b.Put(item.Key, item.Value); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Verify all items exist. + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for _, item := range items { + value := b.Get(item.Key) + if !bytes.Equal(item.Value, value) { + db.CopyTempFile() + t.Fatalf("exp=%x; got=%x", item.Value, value) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + return true + }, qconfig()); err != nil { + t.Error(err) + } +} + +// Ensure that a transaction can delete all key/value pairs and return to a single leaf page. +func TestBucket_Delete_Quick(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + if err := quick.Check(func(items testdata) bool { + db := MustOpenDB() + defer db.MustClose() + + // Bulk insert all values. + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for _, item := range items { + if err := b.Put(item.Key, item.Value); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Remove items one at a time and check consistency. + for _, item := range items { + if err := db.Update(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Delete(item.Key) + }); err != nil { + t.Fatal(err) + } + } + + // Anything before our deletion index should be nil. + if err := db.View(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("widgets")).ForEach(func(k, v []byte) error { + t.Fatalf("bucket should be empty; found: %06x", trunc(k, 3)) + return nil + }); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + return true + }, qconfig()); err != nil { + t.Error(err) + } +} + +func ExampleBucket_Put() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Start a write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + // Create a bucket. + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + return err + } + + // Set the value "bar" for the key "foo". + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + return err + } + return nil + }); err != nil { + log.Fatal(err) + } + + // Read value back in a different read-only transaction. + if err := db.View(func(tx *bolt.Tx) error { + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + fmt.Printf("The value of 'foo' is: %s\n", value) + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // The value of 'foo' is: bar +} + +func ExampleBucket_Delete() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Start a write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + // Create a bucket. + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + return err + } + + // Set the value "bar" for the key "foo". + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + return err + } + + // Retrieve the key back from the database and verify it. + value := b.Get([]byte("foo")) + fmt.Printf("The value of 'foo' was: %s\n", value) + + return nil + }); err != nil { + log.Fatal(err) + } + + // Delete the key in a different write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Delete([]byte("foo")) + }); err != nil { + log.Fatal(err) + } + + // Retrieve the key again. + if err := db.View(func(tx *bolt.Tx) error { + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + if value == nil { + fmt.Printf("The value of 'foo' is now: nil\n") + } + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // The value of 'foo' was: bar + // The value of 'foo' is now: nil +} + +func ExampleBucket_ForEach() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Insert data into a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("animals")) + if err != nil { + return err + } + + if err := b.Put([]byte("dog"), []byte("fun")); err != nil { + return err + } + if err := b.Put([]byte("cat"), []byte("lame")); err != nil { + return err + } + if err := b.Put([]byte("liger"), []byte("awesome")); err != nil { + return err + } + + // Iterate over items in sorted key order. + if err := b.ForEach(func(k, v []byte) error { + fmt.Printf("A %s is %s.\n", k, v) + return nil + }); err != nil { + return err + } + + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // A cat is lame. + // A dog is fun. + // A liger is awesome. +} diff --git a/vendor/src/github.com/boltdb/bolt/cmd/bolt/main.go b/vendor/src/github.com/boltdb/bolt/cmd/bolt/main.go new file mode 100644 index 0000000..b96e6f7 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/cmd/bolt/main.go @@ -0,0 +1,1532 @@ +package main + +import ( + "bytes" + "encoding/binary" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "runtime" + "runtime/pprof" + "strconv" + "strings" + "time" + "unicode" + "unicode/utf8" + "unsafe" + + "github.com/boltdb/bolt" +) + +var ( + // ErrUsage is returned when a usage message was printed and the process + // should simply exit with an error. + ErrUsage = errors.New("usage") + + // ErrUnknownCommand is returned when a CLI command is not specified. + ErrUnknownCommand = errors.New("unknown command") + + // ErrPathRequired is returned when the path to a Bolt database is not specified. + ErrPathRequired = errors.New("path required") + + // ErrFileNotFound is returned when a Bolt database does not exist. + ErrFileNotFound = errors.New("file not found") + + // ErrInvalidValue is returned when a benchmark reads an unexpected value. + ErrInvalidValue = errors.New("invalid value") + + // ErrCorrupt is returned when a checking a data file finds errors. + ErrCorrupt = errors.New("invalid value") + + // ErrNonDivisibleBatchSize is returned when the batch size can't be evenly + // divided by the iteration count. + ErrNonDivisibleBatchSize = errors.New("number of iterations must be divisible by the batch size") + + // ErrPageIDRequired is returned when a required page id is not specified. + ErrPageIDRequired = errors.New("page id required") + + // ErrPageNotFound is returned when specifying a page above the high water mark. + ErrPageNotFound = errors.New("page not found") + + // ErrPageFreed is returned when reading a page that has already been freed. + ErrPageFreed = errors.New("page freed") +) + +// PageHeaderSize represents the size of the bolt.page header. +const PageHeaderSize = 16 + +func main() { + m := NewMain() + if err := m.Run(os.Args[1:]...); err == ErrUsage { + os.Exit(2) + } else if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } +} + +// Main represents the main program execution. +type Main struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewMain returns a new instance of Main connect to the standard input/output. +func NewMain() *Main { + return &Main{ + Stdin: os.Stdin, + Stdout: os.Stdout, + Stderr: os.Stderr, + } +} + +// Run executes the program. +func (m *Main) Run(args ...string) error { + // Require a command at the beginning. + if len(args) == 0 || strings.HasPrefix(args[0], "-") { + fmt.Fprintln(m.Stderr, m.Usage()) + return ErrUsage + } + + // Execute command. + switch args[0] { + case "help": + fmt.Fprintln(m.Stderr, m.Usage()) + return ErrUsage + case "bench": + return newBenchCommand(m).Run(args[1:]...) + case "check": + return newCheckCommand(m).Run(args[1:]...) + case "dump": + return newDumpCommand(m).Run(args[1:]...) + case "info": + return newInfoCommand(m).Run(args[1:]...) + case "page": + return newPageCommand(m).Run(args[1:]...) + case "pages": + return newPagesCommand(m).Run(args[1:]...) + case "stats": + return newStatsCommand(m).Run(args[1:]...) + default: + return ErrUnknownCommand + } +} + +// Usage returns the help message. +func (m *Main) Usage() string { + return strings.TrimLeft(` +Bolt is a tool for inspecting bolt databases. + +Usage: + + bolt command [arguments] + +The commands are: + + bench run synthetic benchmark against bolt + check verifies integrity of bolt database + info print basic info + help print this screen + pages print list of pages with their types + stats iterate over all pages and generate usage stats + +Use "bolt [command] -h" for more information about a command. +`, "\n") +} + +// CheckCommand represents the "check" command execution. +type CheckCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewCheckCommand returns a CheckCommand. +func newCheckCommand(m *Main) *CheckCommand { + return &CheckCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *CheckCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path. + path := fs.Arg(0) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Open database. + db, err := bolt.Open(path, 0666, nil) + if err != nil { + return err + } + defer db.Close() + + // Perform consistency check. + return db.View(func(tx *bolt.Tx) error { + var count int + ch := tx.Check() + loop: + for { + select { + case err, ok := <-ch: + if !ok { + break loop + } + fmt.Fprintln(cmd.Stdout, err) + count++ + } + } + + // Print summary of errors. + if count > 0 { + fmt.Fprintf(cmd.Stdout, "%d errors found\n", count) + return ErrCorrupt + } + + // Notify user that database is valid. + fmt.Fprintln(cmd.Stdout, "OK") + return nil + }) +} + +// Usage returns the help message. +func (cmd *CheckCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt check PATH + +Check opens a database at PATH and runs an exhaustive check to verify that +all pages are accessible or are marked as freed. It also verifies that no +pages are double referenced. + +Verification errors will stream out as they are found and the process will +return after all pages have been checked. +`, "\n") +} + +// InfoCommand represents the "info" command execution. +type InfoCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewInfoCommand returns a InfoCommand. +func newInfoCommand(m *Main) *InfoCommand { + return &InfoCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *InfoCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path. + path := fs.Arg(0) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Open the database. + db, err := bolt.Open(path, 0666, nil) + if err != nil { + return err + } + defer db.Close() + + // Print basic database info. + info := db.Info() + fmt.Fprintf(cmd.Stdout, "Page Size: %d\n", info.PageSize) + + return nil +} + +// Usage returns the help message. +func (cmd *InfoCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt info PATH + +Info prints basic information about the Bolt database at PATH. +`, "\n") +} + +// DumpCommand represents the "dump" command execution. +type DumpCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// newDumpCommand returns a DumpCommand. +func newDumpCommand(m *Main) *DumpCommand { + return &DumpCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *DumpCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path and page id. + path := fs.Arg(0) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Read page ids. + pageIDs, err := atois(fs.Args()[1:]) + if err != nil { + return err + } else if len(pageIDs) == 0 { + return ErrPageIDRequired + } + + // Open database to retrieve page size. + pageSize, err := ReadPageSize(path) + if err != nil { + return err + } + + // Open database file handler. + f, err := os.Open(path) + if err != nil { + return err + } + defer func() { _ = f.Close() }() + + // Print each page listed. + for i, pageID := range pageIDs { + // Print a separator. + if i > 0 { + fmt.Fprintln(cmd.Stdout, "===============================================") + } + + // Print page to stdout. + if err := cmd.PrintPage(cmd.Stdout, f, pageID, pageSize); err != nil { + return err + } + } + + return nil +} + +// PrintPage prints a given page as hexidecimal. +func (cmd *DumpCommand) PrintPage(w io.Writer, r io.ReaderAt, pageID int, pageSize int) error { + const bytesPerLineN = 16 + + // Read page into buffer. + buf := make([]byte, pageSize) + addr := pageID * pageSize + if n, err := r.ReadAt(buf, int64(addr)); err != nil { + return err + } else if n != pageSize { + return io.ErrUnexpectedEOF + } + + // Write out to writer in 16-byte lines. + var prev []byte + var skipped bool + for offset := 0; offset < pageSize; offset += bytesPerLineN { + // Retrieve current 16-byte line. + line := buf[offset : offset+bytesPerLineN] + isLastLine := (offset == (pageSize - bytesPerLineN)) + + // If it's the same as the previous line then print a skip. + if bytes.Equal(line, prev) && !isLastLine { + if !skipped { + fmt.Fprintf(w, "%07x *\n", addr+offset) + skipped = true + } + } else { + // Print line as hexadecimal in 2-byte groups. + fmt.Fprintf(w, "%07x %04x %04x %04x %04x %04x %04x %04x %04x\n", addr+offset, + line[0:2], line[2:4], line[4:6], line[6:8], + line[8:10], line[10:12], line[12:14], line[14:16], + ) + + skipped = false + } + + // Save the previous line. + prev = line + } + fmt.Fprint(w, "\n") + + return nil +} + +// Usage returns the help message. +func (cmd *DumpCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt dump -page PAGEID PATH + +Dump prints a hexidecimal dump of a single page. +`, "\n") +} + +// PageCommand represents the "page" command execution. +type PageCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// newPageCommand returns a PageCommand. +func newPageCommand(m *Main) *PageCommand { + return &PageCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *PageCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path and page id. + path := fs.Arg(0) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Read page ids. + pageIDs, err := atois(fs.Args()[1:]) + if err != nil { + return err + } else if len(pageIDs) == 0 { + return ErrPageIDRequired + } + + // Open database file handler. + f, err := os.Open(path) + if err != nil { + return err + } + defer func() { _ = f.Close() }() + + // Print each page listed. + for i, pageID := range pageIDs { + // Print a separator. + if i > 0 { + fmt.Fprintln(cmd.Stdout, "===============================================") + } + + // Retrieve page info and page size. + p, buf, err := ReadPage(path, pageID) + if err != nil { + return err + } + + // Print basic page info. + fmt.Fprintf(cmd.Stdout, "Page ID: %d\n", p.id) + fmt.Fprintf(cmd.Stdout, "Page Type: %s\n", p.Type()) + fmt.Fprintf(cmd.Stdout, "Total Size: %d bytes\n", len(buf)) + + // Print type-specific data. + switch p.Type() { + case "meta": + err = cmd.PrintMeta(cmd.Stdout, buf) + case "leaf": + err = cmd.PrintLeaf(cmd.Stdout, buf) + case "branch": + err = cmd.PrintBranch(cmd.Stdout, buf) + case "freelist": + err = cmd.PrintFreelist(cmd.Stdout, buf) + } + if err != nil { + return err + } + } + + return nil +} + +// PrintMeta prints the data from the meta page. +func (cmd *PageCommand) PrintMeta(w io.Writer, buf []byte) error { + m := (*meta)(unsafe.Pointer(&buf[PageHeaderSize])) + fmt.Fprintf(w, "Version: %d\n", m.version) + fmt.Fprintf(w, "Page Size: %d bytes\n", m.pageSize) + fmt.Fprintf(w, "Flags: %08x\n", m.flags) + fmt.Fprintf(w, "Root: \n", m.root.root) + fmt.Fprintf(w, "Freelist: \n", m.freelist) + fmt.Fprintf(w, "HWM: \n", m.pgid) + fmt.Fprintf(w, "Txn ID: %d\n", m.txid) + fmt.Fprintf(w, "Checksum: %016x\n", m.checksum) + fmt.Fprintf(w, "\n") + return nil +} + +// PrintLeaf prints the data for a leaf page. +func (cmd *PageCommand) PrintLeaf(w io.Writer, buf []byte) error { + p := (*page)(unsafe.Pointer(&buf[0])) + + // Print number of items. + fmt.Fprintf(w, "Item Count: %d\n", p.count) + fmt.Fprintf(w, "\n") + + // Print each key/value. + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + + // Format key as string. + var k string + if isPrintable(string(e.key())) { + k = fmt.Sprintf("%q", string(e.key())) + } else { + k = fmt.Sprintf("%x", string(e.key())) + } + + // Format value as string. + var v string + if (e.flags & uint32(bucketLeafFlag)) != 0 { + b := (*bucket)(unsafe.Pointer(&e.value()[0])) + v = fmt.Sprintf("", b.root, b.sequence) + } else if isPrintable(string(e.value())) { + k = fmt.Sprintf("%q", string(e.value())) + } else { + k = fmt.Sprintf("%x", string(e.value())) + } + + fmt.Fprintf(w, "%s: %s\n", k, v) + } + fmt.Fprintf(w, "\n") + return nil +} + +// PrintBranch prints the data for a leaf page. +func (cmd *PageCommand) PrintBranch(w io.Writer, buf []byte) error { + p := (*page)(unsafe.Pointer(&buf[0])) + + // Print number of items. + fmt.Fprintf(w, "Item Count: %d\n", p.count) + fmt.Fprintf(w, "\n") + + // Print each key/value. + for i := uint16(0); i < p.count; i++ { + e := p.branchPageElement(i) + + // Format key as string. + var k string + if isPrintable(string(e.key())) { + k = fmt.Sprintf("%q", string(e.key())) + } else { + k = fmt.Sprintf("%x", string(e.key())) + } + + fmt.Fprintf(w, "%s: \n", k, e.pgid) + } + fmt.Fprintf(w, "\n") + return nil +} + +// PrintFreelist prints the data for a freelist page. +func (cmd *PageCommand) PrintFreelist(w io.Writer, buf []byte) error { + p := (*page)(unsafe.Pointer(&buf[0])) + + // Print number of items. + fmt.Fprintf(w, "Item Count: %d\n", p.count) + fmt.Fprintf(w, "\n") + + // Print each page in the freelist. + ids := (*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)) + for i := uint16(0); i < p.count; i++ { + fmt.Fprintf(w, "%d\n", ids[i]) + } + fmt.Fprintf(w, "\n") + return nil +} + +// PrintPage prints a given page as hexidecimal. +func (cmd *PageCommand) PrintPage(w io.Writer, r io.ReaderAt, pageID int, pageSize int) error { + const bytesPerLineN = 16 + + // Read page into buffer. + buf := make([]byte, pageSize) + addr := pageID * pageSize + if n, err := r.ReadAt(buf, int64(addr)); err != nil { + return err + } else if n != pageSize { + return io.ErrUnexpectedEOF + } + + // Write out to writer in 16-byte lines. + var prev []byte + var skipped bool + for offset := 0; offset < pageSize; offset += bytesPerLineN { + // Retrieve current 16-byte line. + line := buf[offset : offset+bytesPerLineN] + isLastLine := (offset == (pageSize - bytesPerLineN)) + + // If it's the same as the previous line then print a skip. + if bytes.Equal(line, prev) && !isLastLine { + if !skipped { + fmt.Fprintf(w, "%07x *\n", addr+offset) + skipped = true + } + } else { + // Print line as hexadecimal in 2-byte groups. + fmt.Fprintf(w, "%07x %04x %04x %04x %04x %04x %04x %04x %04x\n", addr+offset, + line[0:2], line[2:4], line[4:6], line[6:8], + line[8:10], line[10:12], line[12:14], line[14:16], + ) + + skipped = false + } + + // Save the previous line. + prev = line + } + fmt.Fprint(w, "\n") + + return nil +} + +// Usage returns the help message. +func (cmd *PageCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt page -page PATH pageid [pageid...] + +Page prints one or more pages in human readable format. +`, "\n") +} + +// PagesCommand represents the "pages" command execution. +type PagesCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewPagesCommand returns a PagesCommand. +func newPagesCommand(m *Main) *PagesCommand { + return &PagesCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *PagesCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path. + path := fs.Arg(0) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Open database. + db, err := bolt.Open(path, 0666, nil) + if err != nil { + return err + } + defer func() { _ = db.Close() }() + + // Write header. + fmt.Fprintln(cmd.Stdout, "ID TYPE ITEMS OVRFLW") + fmt.Fprintln(cmd.Stdout, "======== ========== ====== ======") + + return db.Update(func(tx *bolt.Tx) error { + var id int + for { + p, err := tx.Page(id) + if err != nil { + return &PageError{ID: id, Err: err} + } else if p == nil { + break + } + + // Only display count and overflow if this is a non-free page. + var count, overflow string + if p.Type != "free" { + count = strconv.Itoa(p.Count) + if p.OverflowCount > 0 { + overflow = strconv.Itoa(p.OverflowCount) + } + } + + // Print table row. + fmt.Fprintf(cmd.Stdout, "%-8d %-10s %-6s %-6s\n", p.ID, p.Type, count, overflow) + + // Move to the next non-overflow page. + id += 1 + if p.Type != "free" { + id += p.OverflowCount + } + } + return nil + }) +} + +// Usage returns the help message. +func (cmd *PagesCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt pages PATH + +Pages prints a table of pages with their type (meta, leaf, branch, freelist). +Leaf and branch pages will show a key count in the "items" column while the +freelist will show the number of free pages in the "items" column. + +The "overflow" column shows the number of blocks that the page spills over +into. Normally there is no overflow but large keys and values can cause +a single page to take up multiple blocks. +`, "\n") +} + +// StatsCommand represents the "stats" command execution. +type StatsCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewStatsCommand returns a StatsCommand. +func newStatsCommand(m *Main) *StatsCommand { + return &StatsCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the command. +func (cmd *StatsCommand) Run(args ...string) error { + // Parse flags. + fs := flag.NewFlagSet("", flag.ContinueOnError) + help := fs.Bool("h", false, "") + if err := fs.Parse(args); err != nil { + return err + } else if *help { + fmt.Fprintln(cmd.Stderr, cmd.Usage()) + return ErrUsage + } + + // Require database path. + path, prefix := fs.Arg(0), fs.Arg(1) + if path == "" { + return ErrPathRequired + } else if _, err := os.Stat(path); os.IsNotExist(err) { + return ErrFileNotFound + } + + // Open database. + db, err := bolt.Open(path, 0666, nil) + if err != nil { + return err + } + defer db.Close() + + return db.View(func(tx *bolt.Tx) error { + var s bolt.BucketStats + var count int + if err := tx.ForEach(func(name []byte, b *bolt.Bucket) error { + if bytes.HasPrefix(name, []byte(prefix)) { + s.Add(b.Stats()) + count += 1 + } + return nil + }); err != nil { + return err + } + + fmt.Fprintf(cmd.Stdout, "Aggregate statistics for %d buckets\n\n", count) + + fmt.Fprintln(cmd.Stdout, "Page count statistics") + fmt.Fprintf(cmd.Stdout, "\tNumber of logical branch pages: %d\n", s.BranchPageN) + fmt.Fprintf(cmd.Stdout, "\tNumber of physical branch overflow pages: %d\n", s.BranchOverflowN) + fmt.Fprintf(cmd.Stdout, "\tNumber of logical leaf pages: %d\n", s.LeafPageN) + fmt.Fprintf(cmd.Stdout, "\tNumber of physical leaf overflow pages: %d\n", s.LeafOverflowN) + + fmt.Fprintln(cmd.Stdout, "Tree statistics") + fmt.Fprintf(cmd.Stdout, "\tNumber of keys/value pairs: %d\n", s.KeyN) + fmt.Fprintf(cmd.Stdout, "\tNumber of levels in B+tree: %d\n", s.Depth) + + fmt.Fprintln(cmd.Stdout, "Page size utilization") + fmt.Fprintf(cmd.Stdout, "\tBytes allocated for physical branch pages: %d\n", s.BranchAlloc) + var percentage int + if s.BranchAlloc != 0 { + percentage = int(float32(s.BranchInuse) * 100.0 / float32(s.BranchAlloc)) + } + fmt.Fprintf(cmd.Stdout, "\tBytes actually used for branch data: %d (%d%%)\n", s.BranchInuse, percentage) + fmt.Fprintf(cmd.Stdout, "\tBytes allocated for physical leaf pages: %d\n", s.LeafAlloc) + percentage = 0 + if s.LeafAlloc != 0 { + percentage = int(float32(s.LeafInuse) * 100.0 / float32(s.LeafAlloc)) + } + fmt.Fprintf(cmd.Stdout, "\tBytes actually used for leaf data: %d (%d%%)\n", s.LeafInuse, percentage) + + fmt.Fprintln(cmd.Stdout, "Bucket statistics") + fmt.Fprintf(cmd.Stdout, "\tTotal number of buckets: %d\n", s.BucketN) + percentage = 0 + if s.BucketN != 0 { + percentage = int(float32(s.InlineBucketN) * 100.0 / float32(s.BucketN)) + } + fmt.Fprintf(cmd.Stdout, "\tTotal number on inlined buckets: %d (%d%%)\n", s.InlineBucketN, percentage) + percentage = 0 + if s.LeafInuse != 0 { + percentage = int(float32(s.InlineBucketInuse) * 100.0 / float32(s.LeafInuse)) + } + fmt.Fprintf(cmd.Stdout, "\tBytes used for inlined buckets: %d (%d%%)\n", s.InlineBucketInuse, percentage) + + return nil + }) +} + +// Usage returns the help message. +func (cmd *StatsCommand) Usage() string { + return strings.TrimLeft(` +usage: bolt stats PATH + +Stats performs an extensive search of the database to track every page +reference. It starts at the current meta page and recursively iterates +through every accessible bucket. + +The following errors can be reported: + + already freed + The page is referenced more than once in the freelist. + + unreachable unfreed + The page is not referenced by a bucket or in the freelist. + + reachable freed + The page is referenced by a bucket but is also in the freelist. + + out of bounds + A page is referenced that is above the high water mark. + + multiple references + A page is referenced by more than one other page. + + invalid type + The page type is not "meta", "leaf", "branch", or "freelist". + +No errors should occur in your database. However, if for some reason you +experience corruption, please submit a ticket to the Bolt project page: + + https://github.com/boltdb/bolt/issues +`, "\n") +} + +var benchBucketName = []byte("bench") + +// BenchCommand represents the "bench" command execution. +type BenchCommand struct { + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer +} + +// NewBenchCommand returns a BenchCommand using the +func newBenchCommand(m *Main) *BenchCommand { + return &BenchCommand{ + Stdin: m.Stdin, + Stdout: m.Stdout, + Stderr: m.Stderr, + } +} + +// Run executes the "bench" command. +func (cmd *BenchCommand) Run(args ...string) error { + // Parse CLI arguments. + options, err := cmd.ParseFlags(args) + if err != nil { + return err + } + + // Remove path if "-work" is not set. Otherwise keep path. + if options.Work { + fmt.Fprintf(cmd.Stdout, "work: %s\n", options.Path) + } else { + defer os.Remove(options.Path) + } + + // Create database. + db, err := bolt.Open(options.Path, 0666, nil) + if err != nil { + return err + } + db.NoSync = options.NoSync + defer db.Close() + + // Write to the database. + var results BenchResults + if err := cmd.runWrites(db, options, &results); err != nil { + return fmt.Errorf("write: %v", err) + } + + // Read from the database. + if err := cmd.runReads(db, options, &results); err != nil { + return fmt.Errorf("bench: read: %s", err) + } + + // Print results. + fmt.Fprintf(os.Stderr, "# Write\t%v\t(%v/op)\t(%v op/sec)\n", results.WriteDuration, results.WriteOpDuration(), results.WriteOpsPerSecond()) + fmt.Fprintf(os.Stderr, "# Read\t%v\t(%v/op)\t(%v op/sec)\n", results.ReadDuration, results.ReadOpDuration(), results.ReadOpsPerSecond()) + fmt.Fprintln(os.Stderr, "") + return nil +} + +// ParseFlags parses the command line flags. +func (cmd *BenchCommand) ParseFlags(args []string) (*BenchOptions, error) { + var options BenchOptions + + // Parse flagset. + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.StringVar(&options.ProfileMode, "profile-mode", "rw", "") + fs.StringVar(&options.WriteMode, "write-mode", "seq", "") + fs.StringVar(&options.ReadMode, "read-mode", "seq", "") + fs.IntVar(&options.Iterations, "count", 1000, "") + fs.IntVar(&options.BatchSize, "batch-size", 0, "") + fs.IntVar(&options.KeySize, "key-size", 8, "") + fs.IntVar(&options.ValueSize, "value-size", 32, "") + fs.StringVar(&options.CPUProfile, "cpuprofile", "", "") + fs.StringVar(&options.MemProfile, "memprofile", "", "") + fs.StringVar(&options.BlockProfile, "blockprofile", "", "") + fs.Float64Var(&options.FillPercent, "fill-percent", bolt.DefaultFillPercent, "") + fs.BoolVar(&options.NoSync, "no-sync", false, "") + fs.BoolVar(&options.Work, "work", false, "") + fs.StringVar(&options.Path, "path", "", "") + fs.SetOutput(cmd.Stderr) + if err := fs.Parse(args); err != nil { + return nil, err + } + + // Set batch size to iteration size if not set. + // Require that batch size can be evenly divided by the iteration count. + if options.BatchSize == 0 { + options.BatchSize = options.Iterations + } else if options.Iterations%options.BatchSize != 0 { + return nil, ErrNonDivisibleBatchSize + } + + // Generate temp path if one is not passed in. + if options.Path == "" { + f, err := ioutil.TempFile("", "bolt-bench-") + if err != nil { + return nil, fmt.Errorf("temp file: %s", err) + } + f.Close() + os.Remove(f.Name()) + options.Path = f.Name() + } + + return &options, nil +} + +// Writes to the database. +func (cmd *BenchCommand) runWrites(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + // Start profiling for writes. + if options.ProfileMode == "rw" || options.ProfileMode == "w" { + cmd.startProfiling(options) + } + + t := time.Now() + + var err error + switch options.WriteMode { + case "seq": + err = cmd.runWritesSequential(db, options, results) + case "rnd": + err = cmd.runWritesRandom(db, options, results) + case "seq-nest": + err = cmd.runWritesSequentialNested(db, options, results) + case "rnd-nest": + err = cmd.runWritesRandomNested(db, options, results) + default: + return fmt.Errorf("invalid write mode: %s", options.WriteMode) + } + + // Save time to write. + results.WriteDuration = time.Since(t) + + // Stop profiling for writes only. + if options.ProfileMode == "w" { + cmd.stopProfiling() + } + + return err +} + +func (cmd *BenchCommand) runWritesSequential(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + var i = uint32(0) + return cmd.runWritesWithSource(db, options, results, func() uint32 { i++; return i }) +} + +func (cmd *BenchCommand) runWritesRandom(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + return cmd.runWritesWithSource(db, options, results, func() uint32 { return r.Uint32() }) +} + +func (cmd *BenchCommand) runWritesSequentialNested(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + var i = uint32(0) + return cmd.runWritesWithSource(db, options, results, func() uint32 { i++; return i }) +} + +func (cmd *BenchCommand) runWritesRandomNested(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + return cmd.runWritesWithSource(db, options, results, func() uint32 { return r.Uint32() }) +} + +func (cmd *BenchCommand) runWritesWithSource(db *bolt.DB, options *BenchOptions, results *BenchResults, keySource func() uint32) error { + results.WriteOps = options.Iterations + + for i := 0; i < options.Iterations; i += options.BatchSize { + if err := db.Update(func(tx *bolt.Tx) error { + b, _ := tx.CreateBucketIfNotExists(benchBucketName) + b.FillPercent = options.FillPercent + + for j := 0; j < options.BatchSize; j++ { + key := make([]byte, options.KeySize) + value := make([]byte, options.ValueSize) + + // Write key as uint32. + binary.BigEndian.PutUint32(key, keySource()) + + // Insert key/value. + if err := b.Put(key, value); err != nil { + return err + } + } + + return nil + }); err != nil { + return err + } + } + return nil +} + +func (cmd *BenchCommand) runWritesNestedWithSource(db *bolt.DB, options *BenchOptions, results *BenchResults, keySource func() uint32) error { + results.WriteOps = options.Iterations + + for i := 0; i < options.Iterations; i += options.BatchSize { + if err := db.Update(func(tx *bolt.Tx) error { + top, err := tx.CreateBucketIfNotExists(benchBucketName) + if err != nil { + return err + } + top.FillPercent = options.FillPercent + + // Create bucket key. + name := make([]byte, options.KeySize) + binary.BigEndian.PutUint32(name, keySource()) + + // Create bucket. + b, err := top.CreateBucketIfNotExists(name) + if err != nil { + return err + } + b.FillPercent = options.FillPercent + + for j := 0; j < options.BatchSize; j++ { + var key = make([]byte, options.KeySize) + var value = make([]byte, options.ValueSize) + + // Generate key as uint32. + binary.BigEndian.PutUint32(key, keySource()) + + // Insert value into subbucket. + if err := b.Put(key, value); err != nil { + return err + } + } + + return nil + }); err != nil { + return err + } + } + return nil +} + +// Reads from the database. +func (cmd *BenchCommand) runReads(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + // Start profiling for reads. + if options.ProfileMode == "r" { + cmd.startProfiling(options) + } + + t := time.Now() + + var err error + switch options.ReadMode { + case "seq": + switch options.WriteMode { + case "seq-nest", "rnd-nest": + err = cmd.runReadsSequentialNested(db, options, results) + default: + err = cmd.runReadsSequential(db, options, results) + } + default: + return fmt.Errorf("invalid read mode: %s", options.ReadMode) + } + + // Save read time. + results.ReadDuration = time.Since(t) + + // Stop profiling for reads. + if options.ProfileMode == "rw" || options.ProfileMode == "r" { + cmd.stopProfiling() + } + + return err +} + +func (cmd *BenchCommand) runReadsSequential(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + return db.View(func(tx *bolt.Tx) error { + t := time.Now() + + for { + var count int + + c := tx.Bucket(benchBucketName).Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if v == nil { + return errors.New("invalid value") + } + count++ + } + + if options.WriteMode == "seq" && count != options.Iterations { + return fmt.Errorf("read seq: iter mismatch: expected %d, got %d", options.Iterations, count) + } + + results.ReadOps += count + + // Make sure we do this for at least a second. + if time.Since(t) >= time.Second { + break + } + } + + return nil + }) +} + +func (cmd *BenchCommand) runReadsSequentialNested(db *bolt.DB, options *BenchOptions, results *BenchResults) error { + return db.View(func(tx *bolt.Tx) error { + t := time.Now() + + for { + var count int + var top = tx.Bucket(benchBucketName) + if err := top.ForEach(func(name, _ []byte) error { + c := top.Bucket(name).Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if v == nil { + return ErrInvalidValue + } + count++ + } + return nil + }); err != nil { + return err + } + + if options.WriteMode == "seq-nest" && count != options.Iterations { + return fmt.Errorf("read seq-nest: iter mismatch: expected %d, got %d", options.Iterations, count) + } + + results.ReadOps += count + + // Make sure we do this for at least a second. + if time.Since(t) >= time.Second { + break + } + } + + return nil + }) +} + +// File handlers for the various profiles. +var cpuprofile, memprofile, blockprofile *os.File + +// Starts all profiles set on the options. +func (cmd *BenchCommand) startProfiling(options *BenchOptions) { + var err error + + // Start CPU profiling. + if options.CPUProfile != "" { + cpuprofile, err = os.Create(options.CPUProfile) + if err != nil { + fmt.Fprintf(cmd.Stderr, "bench: could not create cpu profile %q: %v\n", options.CPUProfile, err) + os.Exit(1) + } + pprof.StartCPUProfile(cpuprofile) + } + + // Start memory profiling. + if options.MemProfile != "" { + memprofile, err = os.Create(options.MemProfile) + if err != nil { + fmt.Fprintf(cmd.Stderr, "bench: could not create memory profile %q: %v\n", options.MemProfile, err) + os.Exit(1) + } + runtime.MemProfileRate = 4096 + } + + // Start fatal profiling. + if options.BlockProfile != "" { + blockprofile, err = os.Create(options.BlockProfile) + if err != nil { + fmt.Fprintf(cmd.Stderr, "bench: could not create block profile %q: %v\n", options.BlockProfile, err) + os.Exit(1) + } + runtime.SetBlockProfileRate(1) + } +} + +// Stops all profiles. +func (cmd *BenchCommand) stopProfiling() { + if cpuprofile != nil { + pprof.StopCPUProfile() + cpuprofile.Close() + cpuprofile = nil + } + + if memprofile != nil { + pprof.Lookup("heap").WriteTo(memprofile, 0) + memprofile.Close() + memprofile = nil + } + + if blockprofile != nil { + pprof.Lookup("block").WriteTo(blockprofile, 0) + blockprofile.Close() + blockprofile = nil + runtime.SetBlockProfileRate(0) + } +} + +// BenchOptions represents the set of options that can be passed to "bolt bench". +type BenchOptions struct { + ProfileMode string + WriteMode string + ReadMode string + Iterations int + BatchSize int + KeySize int + ValueSize int + CPUProfile string + MemProfile string + BlockProfile string + StatsInterval time.Duration + FillPercent float64 + NoSync bool + Work bool + Path string +} + +// BenchResults represents the performance results of the benchmark. +type BenchResults struct { + WriteOps int + WriteDuration time.Duration + ReadOps int + ReadDuration time.Duration +} + +// Returns the duration for a single write operation. +func (r *BenchResults) WriteOpDuration() time.Duration { + if r.WriteOps == 0 { + return 0 + } + return r.WriteDuration / time.Duration(r.WriteOps) +} + +// Returns average number of write operations that can be performed per second. +func (r *BenchResults) WriteOpsPerSecond() int { + var op = r.WriteOpDuration() + if op == 0 { + return 0 + } + return int(time.Second) / int(op) +} + +// Returns the duration for a single read operation. +func (r *BenchResults) ReadOpDuration() time.Duration { + if r.ReadOps == 0 { + return 0 + } + return r.ReadDuration / time.Duration(r.ReadOps) +} + +// Returns average number of read operations that can be performed per second. +func (r *BenchResults) ReadOpsPerSecond() int { + var op = r.ReadOpDuration() + if op == 0 { + return 0 + } + return int(time.Second) / int(op) +} + +type PageError struct { + ID int + Err error +} + +func (e *PageError) Error() string { + return fmt.Sprintf("page error: id=%d, err=%s", e.ID, e.Err) +} + +// isPrintable returns true if the string is valid unicode and contains only printable runes. +func isPrintable(s string) bool { + if !utf8.ValidString(s) { + return false + } + for _, ch := range s { + if !unicode.IsPrint(ch) { + return false + } + } + return true +} + +// ReadPage reads page info & full page data from a path. +// This is not transactionally safe. +func ReadPage(path string, pageID int) (*page, []byte, error) { + // Find page size. + pageSize, err := ReadPageSize(path) + if err != nil { + return nil, nil, fmt.Errorf("read page size: %s", err) + } + + // Open database file. + f, err := os.Open(path) + if err != nil { + return nil, nil, err + } + defer f.Close() + + // Read one block into buffer. + buf := make([]byte, pageSize) + if n, err := f.ReadAt(buf, int64(pageID*pageSize)); err != nil { + return nil, nil, err + } else if n != len(buf) { + return nil, nil, io.ErrUnexpectedEOF + } + + // Determine total number of blocks. + p := (*page)(unsafe.Pointer(&buf[0])) + overflowN := p.overflow + + // Re-read entire page (with overflow) into buffer. + buf = make([]byte, (int(overflowN)+1)*pageSize) + if n, err := f.ReadAt(buf, int64(pageID*pageSize)); err != nil { + return nil, nil, err + } else if n != len(buf) { + return nil, nil, io.ErrUnexpectedEOF + } + p = (*page)(unsafe.Pointer(&buf[0])) + + return p, buf, nil +} + +// ReadPageSize reads page size a path. +// This is not transactionally safe. +func ReadPageSize(path string) (int, error) { + // Open database file. + f, err := os.Open(path) + if err != nil { + return 0, err + } + defer f.Close() + + // Read 4KB chunk. + buf := make([]byte, 4096) + if _, err := io.ReadFull(f, buf); err != nil { + return 0, err + } + + // Read page size from metadata. + m := (*meta)(unsafe.Pointer(&buf[PageHeaderSize])) + return int(m.pageSize), nil +} + +// atois parses a slice of strings into integers. +func atois(strs []string) ([]int, error) { + var a []int + for _, str := range strs { + i, err := strconv.Atoi(str) + if err != nil { + return nil, err + } + a = append(a, i) + } + return a, nil +} + +// DO NOT EDIT. Copied from the "bolt" package. +const maxAllocSize = 0xFFFFFFF + +// DO NOT EDIT. Copied from the "bolt" package. +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +// DO NOT EDIT. Copied from the "bolt" package. +const bucketLeafFlag = 0x01 + +// DO NOT EDIT. Copied from the "bolt" package. +type pgid uint64 + +// DO NOT EDIT. Copied from the "bolt" package. +type txid uint64 + +// DO NOT EDIT. Copied from the "bolt" package. +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// DO NOT EDIT. Copied from the "bolt" package. +type bucket struct { + root pgid + sequence uint64 +} + +// DO NOT EDIT. Copied from the "bolt" package. +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (p *page) Type() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// DO NOT EDIT. Copied from the "bolt" package. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return buf[n.pos : n.pos+n.ksize] +} + +// DO NOT EDIT. Copied from the "bolt" package. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return buf[n.pos : n.pos+n.ksize] +} + +// DO NOT EDIT. Copied from the "bolt" package. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return buf[n.pos+n.ksize : n.pos+n.ksize+n.vsize] +} diff --git a/vendor/src/github.com/boltdb/bolt/cmd/bolt/main_test.go b/vendor/src/github.com/boltdb/bolt/cmd/bolt/main_test.go new file mode 100644 index 0000000..c378b79 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/cmd/bolt/main_test.go @@ -0,0 +1,185 @@ +package main_test + +import ( + "bytes" + "io/ioutil" + "os" + "strconv" + "testing" + + "github.com/boltdb/bolt" + "github.com/boltdb/bolt/cmd/bolt" +) + +// Ensure the "info" command can print information about a database. +func TestInfoCommand_Run(t *testing.T) { + db := MustOpen(0666, nil) + db.DB.Close() + defer db.Close() + + // Run the info command. + m := NewMain() + if err := m.Run("info", db.Path); err != nil { + t.Fatal(err) + } +} + +// Ensure the "stats" command executes correctly with an empty database. +func TestStatsCommand_Run_EmptyDatabase(t *testing.T) { + // Ignore + if os.Getpagesize() != 4096 { + t.Skip("system does not use 4KB page size") + } + + db := MustOpen(0666, nil) + defer db.Close() + db.DB.Close() + + // Generate expected result. + exp := "Aggregate statistics for 0 buckets\n\n" + + "Page count statistics\n" + + "\tNumber of logical branch pages: 0\n" + + "\tNumber of physical branch overflow pages: 0\n" + + "\tNumber of logical leaf pages: 0\n" + + "\tNumber of physical leaf overflow pages: 0\n" + + "Tree statistics\n" + + "\tNumber of keys/value pairs: 0\n" + + "\tNumber of levels in B+tree: 0\n" + + "Page size utilization\n" + + "\tBytes allocated for physical branch pages: 0\n" + + "\tBytes actually used for branch data: 0 (0%)\n" + + "\tBytes allocated for physical leaf pages: 0\n" + + "\tBytes actually used for leaf data: 0 (0%)\n" + + "Bucket statistics\n" + + "\tTotal number of buckets: 0\n" + + "\tTotal number on inlined buckets: 0 (0%)\n" + + "\tBytes used for inlined buckets: 0 (0%)\n" + + // Run the command. + m := NewMain() + if err := m.Run("stats", db.Path); err != nil { + t.Fatal(err) + } else if m.Stdout.String() != exp { + t.Fatalf("unexpected stdout:\n\n%s", m.Stdout.String()) + } +} + +// Ensure the "stats" command can execute correctly. +func TestStatsCommand_Run(t *testing.T) { + // Ignore + if os.Getpagesize() != 4096 { + t.Skip("system does not use 4KB page size") + } + + db := MustOpen(0666, nil) + defer db.Close() + + if err := db.Update(func(tx *bolt.Tx) error { + // Create "foo" bucket. + b, err := tx.CreateBucket([]byte("foo")) + if err != nil { + return err + } + for i := 0; i < 10; i++ { + if err := b.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { + return err + } + } + + // Create "bar" bucket. + b, err = tx.CreateBucket([]byte("bar")) + if err != nil { + return err + } + for i := 0; i < 100; i++ { + if err := b.Put([]byte(strconv.Itoa(i)), []byte(strconv.Itoa(i))); err != nil { + return err + } + } + + // Create "baz" bucket. + b, err = tx.CreateBucket([]byte("baz")) + if err != nil { + return err + } + if err := b.Put([]byte("key"), []byte("value")); err != nil { + return err + } + + return nil + }); err != nil { + t.Fatal(err) + } + db.DB.Close() + + // Generate expected result. + exp := "Aggregate statistics for 3 buckets\n\n" + + "Page count statistics\n" + + "\tNumber of logical branch pages: 0\n" + + "\tNumber of physical branch overflow pages: 0\n" + + "\tNumber of logical leaf pages: 1\n" + + "\tNumber of physical leaf overflow pages: 0\n" + + "Tree statistics\n" + + "\tNumber of keys/value pairs: 111\n" + + "\tNumber of levels in B+tree: 1\n" + + "Page size utilization\n" + + "\tBytes allocated for physical branch pages: 0\n" + + "\tBytes actually used for branch data: 0 (0%)\n" + + "\tBytes allocated for physical leaf pages: 4096\n" + + "\tBytes actually used for leaf data: 1996 (48%)\n" + + "Bucket statistics\n" + + "\tTotal number of buckets: 3\n" + + "\tTotal number on inlined buckets: 2 (66%)\n" + + "\tBytes used for inlined buckets: 236 (11%)\n" + + // Run the command. + m := NewMain() + if err := m.Run("stats", db.Path); err != nil { + t.Fatal(err) + } else if m.Stdout.String() != exp { + t.Fatalf("unexpected stdout:\n\n%s", m.Stdout.String()) + } +} + +// Main represents a test wrapper for main.Main that records output. +type Main struct { + *main.Main + Stdin bytes.Buffer + Stdout bytes.Buffer + Stderr bytes.Buffer +} + +// NewMain returns a new instance of Main. +func NewMain() *Main { + m := &Main{Main: main.NewMain()} + m.Main.Stdin = &m.Stdin + m.Main.Stdout = &m.Stdout + m.Main.Stderr = &m.Stderr + return m +} + +// MustOpen creates a Bolt database in a temporary location. +func MustOpen(mode os.FileMode, options *bolt.Options) *DB { + // Create temporary path. + f, _ := ioutil.TempFile("", "bolt-") + f.Close() + os.Remove(f.Name()) + + db, err := bolt.Open(f.Name(), mode, options) + if err != nil { + panic(err.Error()) + } + return &DB{DB: db, Path: f.Name()} +} + +// DB is a test wrapper for bolt.DB. +type DB struct { + *bolt.DB + Path string +} + +// Close closes and removes the database. +func (db *DB) Close() error { + defer os.Remove(db.Path) + return db.DB.Close() +} diff --git a/vendor/src/github.com/boltdb/bolt/cursor.go b/vendor/src/github.com/boltdb/bolt/cursor.go new file mode 100644 index 0000000..1be9f35 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/cursor.go @@ -0,0 +1,400 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" +) + +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. +// Cursors see nested buckets with value == nil. +// Cursors can be obtained from a transaction and are valid as long as the transaction is open. +// +// Keys and values returned from the cursor are only valid for the life of the transaction. +// +// Changing data while traversing with a cursor may cause it to be invalidated +// and return unexpected keys and/or values. You must reposition your cursor +// after mutating data. +type Cursor struct { + bucket *Bucket + stack []elemRef +} + +// Bucket returns the bucket that this cursor was created from. +func (c *Cursor) Bucket() *Bucket { + return c.bucket +} + +// First moves the cursor to the first item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) First() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + c.first() + + // If we land on an empty page then move to the next value. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + c.next() + } + + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v + +} + +// Last moves the cursor to the last item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Last() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + ref := elemRef{page: p, node: n} + ref.index = ref.count() - 1 + c.stack = append(c.stack, ref) + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Next moves the cursor to the next item in the bucket and returns its key and value. +// If the cursor is at the end of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Next() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.next() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Prev moves the cursor to the previous item in the bucket and returns its key and value. +// If the cursor is at the beginning of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Prev() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. If no keys +// follow, a nil key is returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { + k, v, flags := c.seek(seek) + + // If we ended up after the last element of a page then move to the next one. + if ref := &c.stack[len(c.stack)-1]; ref.index >= ref.count() { + k, v, flags = c.next() + } + + if k == nil { + return nil, nil + } else if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Delete removes the current key/value under the cursor from the bucket. +// Delete fails if current key/value is a bucket or if the transaction is not writable. +func (c *Cursor) Delete() error { + if c.bucket.tx.db == nil { + return ErrTxClosed + } else if !c.bucket.Writable() { + return ErrTxNotWritable + } + + key, _, flags := c.keyValue() + // Return an error if current value is a bucket. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + c.node().del(key) + + return nil +} + +// seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. +func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Start from root page/node and traverse to correct page. + c.stack = c.stack[:0] + c.search(seek, c.bucket.root) + ref := &c.stack[len(c.stack)-1] + + // If the cursor is pointing to the end of page/node then return nil. + if ref.index >= ref.count() { + return nil, nil, 0 + } + + // If this is a bucket then return a nil value. + return c.keyValue() +} + +// first moves the cursor to the first leaf element under the last page in the stack. +func (c *Cursor) first() { + for { + // Exit when we hit a leaf page. + var ref = &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the first element to the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + } +} + +// last moves the cursor to the last leaf element under the last page in the stack. +func (c *Cursor) last() { + for { + // Exit when we hit a leaf page. + ref := &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the last element in the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + + var nextRef = elemRef{page: p, node: n} + nextRef.index = nextRef.count() - 1 + c.stack = append(c.stack, nextRef) + } +} + +// next moves to the next leaf element and returns the key and value. +// If the cursor is at the last leaf element then it stays there and returns nil. +func (c *Cursor) next() (key []byte, value []byte, flags uint32) { + for { + // Attempt to move over one element until we're successful. + // Move up the stack as we hit the end of each page in our stack. + var i int + for i = len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index < elem.count()-1 { + elem.index++ + break + } + } + + // If we've hit the root page then stop and return. This will leave the + // cursor on the last element of the last page. + if i == -1 { + return nil, nil, 0 + } + + // Otherwise start from where we left off in the stack and find the + // first element of the first leaf page. + c.stack = c.stack[:i+1] + c.first() + + // If this is an empty page then restart and move back up the stack. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + continue + } + + return c.keyValue() + } +} + +// search recursively performs a binary search against a given page/node until it finds a given key. +func (c *Cursor) search(key []byte, pgid pgid) { + p, n := c.bucket.pageNode(pgid) + if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { + panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) + } + e := elemRef{page: p, node: n} + c.stack = append(c.stack, e) + + // If we're on a leaf page/node then find the specific node. + if e.isLeaf() { + c.nsearch(key) + return + } + + if n != nil { + c.searchNode(key, n) + return + } + c.searchPage(key, p) +} + +func (c *Cursor) searchNode(key []byte, n *node) { + var exact bool + index := sort.Search(len(n.inodes), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(n.inodes[i].key, key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, n.inodes[index].pgid) +} + +func (c *Cursor) searchPage(key []byte, p *page) { + // Binary search for the correct range. + inodes := p.branchPageElements() + + var exact bool + index := sort.Search(int(p.count), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(inodes[i].key(), key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, inodes[index].pgid) +} + +// nsearch searches the leaf node on the top of the stack for a key. +func (c *Cursor) nsearch(key []byte) { + e := &c.stack[len(c.stack)-1] + p, n := e.page, e.node + + // If we have a node then search its inodes. + if n != nil { + index := sort.Search(len(n.inodes), func(i int) bool { + return bytes.Compare(n.inodes[i].key, key) != -1 + }) + e.index = index + return + } + + // If we have a page then search its leaf elements. + inodes := p.leafPageElements() + index := sort.Search(int(p.count), func(i int) bool { + return bytes.Compare(inodes[i].key(), key) != -1 + }) + e.index = index +} + +// keyValue returns the key and value of the current leaf element. +func (c *Cursor) keyValue() ([]byte, []byte, uint32) { + ref := &c.stack[len(c.stack)-1] + if ref.count() == 0 || ref.index >= ref.count() { + return nil, nil, 0 + } + + // Retrieve value from node. + if ref.node != nil { + inode := &ref.node.inodes[ref.index] + return inode.key, inode.value, inode.flags + } + + // Or retrieve value from page. + elem := ref.page.leafPageElement(uint16(ref.index)) + return elem.key(), elem.value(), elem.flags +} + +// node returns the node that the cursor is currently positioned on. +func (c *Cursor) node() *node { + _assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") + + // If the top of the stack is a leaf node then just return it. + if ref := &c.stack[len(c.stack)-1]; ref.node != nil && ref.isLeaf() { + return ref.node + } + + // Start from root and traverse down the hierarchy. + var n = c.stack[0].node + if n == nil { + n = c.bucket.node(c.stack[0].page.id, nil) + } + for _, ref := range c.stack[:len(c.stack)-1] { + _assert(!n.isLeaf, "expected branch node") + n = n.childAt(int(ref.index)) + } + _assert(n.isLeaf, "expected leaf node") + return n +} + +// elemRef represents a reference to an element on a given page/node. +type elemRef struct { + page *page + node *node + index int +} + +// isLeaf returns whether the ref is pointing at a leaf page/node. +func (r *elemRef) isLeaf() bool { + if r.node != nil { + return r.node.isLeaf + } + return (r.page.flags & leafPageFlag) != 0 +} + +// count returns the number of inodes or page elements. +func (r *elemRef) count() int { + if r.node != nil { + return len(r.node.inodes) + } + return int(r.page.count) +} diff --git a/vendor/src/github.com/boltdb/bolt/cursor_test.go b/vendor/src/github.com/boltdb/bolt/cursor_test.go new file mode 100644 index 0000000..562d60f --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/cursor_test.go @@ -0,0 +1,817 @@ +package bolt_test + +import ( + "bytes" + "encoding/binary" + "fmt" + "log" + "os" + "reflect" + "sort" + "testing" + "testing/quick" + + "github.com/boltdb/bolt" +) + +// Ensure that a cursor can return a reference to the bucket that created it. +func TestCursor_Bucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if cb := b.Cursor().Bucket(); !reflect.DeepEqual(cb, b) { + t.Fatal("cursor bucket mismatch") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can seek to the appropriate keys. +func TestCursor_Seek(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("0001")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte("0002")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("0003")); err != nil { + t.Fatal(err) + } + + if _, err := b.CreateBucket([]byte("bkt")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + c := tx.Bucket([]byte("widgets")).Cursor() + + // Exact match should go to the key. + if k, v := c.Seek([]byte("bar")); !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0002")) { + t.Fatalf("unexpected value: %v", v) + } + + // Inexact match should go to the next key. + if k, v := c.Seek([]byte("bas")); !bytes.Equal(k, []byte("baz")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0003")) { + t.Fatalf("unexpected value: %v", v) + } + + // Low key should go to the first key. + if k, v := c.Seek([]byte("")); !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte("0002")) { + t.Fatalf("unexpected value: %v", v) + } + + // High key should return no key. + if k, v := c.Seek([]byte("zzz")); k != nil { + t.Fatalf("expected nil key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + // Buckets should return their key but no value. + if k, v := c.Seek([]byte("bkt")); !bytes.Equal(k, []byte("bkt")) { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +func TestCursor_Delete(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + const count = 1000 + + // Insert every other key between 0 and $count. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for i := 0; i < count; i += 1 { + k := make([]byte, 8) + binary.BigEndian.PutUint64(k, uint64(i)) + if err := b.Put(k, make([]byte, 100)); err != nil { + t.Fatal(err) + } + } + if _, err := b.CreateBucket([]byte("sub")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + c := tx.Bucket([]byte("widgets")).Cursor() + bound := make([]byte, 8) + binary.BigEndian.PutUint64(bound, uint64(count/2)) + for key, _ := c.First(); bytes.Compare(key, bound) < 0; key, _ = c.Next() { + if err := c.Delete(); err != nil { + t.Fatal(err) + } + } + + c.Seek([]byte("sub")) + if err := c.Delete(); err != bolt.ErrIncompatibleValue { + t.Fatalf("unexpected error: %s", err) + } + + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + stats := tx.Bucket([]byte("widgets")).Stats() + if stats.KeyN != count/2+1 { + t.Fatalf("unexpected KeyN: %d", stats.KeyN) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can seek to the appropriate keys when there are a +// large number of keys. This test also checks that seek will always move +// forward to the next key. +// +// Related: https://github.com/boltdb/bolt/pull/187 +func TestCursor_Seek_Large(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var count = 10000 + + // Insert every other key between 0 and $count. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < count; i += 100 { + for j := i; j < i+100; j += 2 { + k := make([]byte, 8) + binary.BigEndian.PutUint64(k, uint64(j)) + if err := b.Put(k, make([]byte, 100)); err != nil { + t.Fatal(err) + } + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + c := tx.Bucket([]byte("widgets")).Cursor() + for i := 0; i < count; i++ { + seek := make([]byte, 8) + binary.BigEndian.PutUint64(seek, uint64(i)) + + k, _ := c.Seek(seek) + + // The last seek is beyond the end of the the range so + // it should return nil. + if i == count-1 { + if k != nil { + t.Fatal("expected nil key") + } + continue + } + + // Otherwise we should seek to the exact key or the next key. + num := binary.BigEndian.Uint64(k) + if i%2 == 0 { + if num != uint64(i) { + t.Fatalf("unexpected num: %d", num) + } + } else { + if num != uint64(i+1) { + t.Fatalf("unexpected num: %d", num) + } + } + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a cursor can iterate over an empty bucket without error. +func TestCursor_EmptyBucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + c := tx.Bucket([]byte("widgets")).Cursor() + k, v := c.First() + if k != nil { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can reverse iterate over an empty bucket without error. +func TestCursor_EmptyBucketReverse(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + if err := db.View(func(tx *bolt.Tx) error { + c := tx.Bucket([]byte("widgets")).Cursor() + k, v := c.Last() + if k != nil { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can iterate over a single root with a couple elements. +func TestCursor_Iterate_Leaf(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte{}); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte{0}); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte{1}); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + tx, err := db.Begin(false) + if err != nil { + t.Fatal(err) + } + defer func() { _ = tx.Rollback() }() + + c := tx.Bucket([]byte("widgets")).Cursor() + + k, v := c.First() + if !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{1}) { + t.Fatalf("unexpected value: %v", v) + } + + k, v = c.Next() + if !bytes.Equal(k, []byte("baz")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{}) { + t.Fatalf("unexpected value: %v", v) + } + + k, v = c.Next() + if !bytes.Equal(k, []byte("foo")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{0}) { + t.Fatalf("unexpected value: %v", v) + } + + k, v = c.Next() + if k != nil { + t.Fatalf("expected nil key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + k, v = c.Next() + if k != nil { + t.Fatalf("expected nil key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can iterate in reverse over a single root with a couple elements. +func TestCursor_LeafRootReverse(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte{}); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte{0}); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte{1}); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + tx, err := db.Begin(false) + if err != nil { + t.Fatal(err) + } + c := tx.Bucket([]byte("widgets")).Cursor() + + if k, v := c.Last(); !bytes.Equal(k, []byte("foo")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{0}) { + t.Fatalf("unexpected value: %v", v) + } + + if k, v := c.Prev(); !bytes.Equal(k, []byte("baz")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{}) { + t.Fatalf("unexpected value: %v", v) + } + + if k, v := c.Prev(); !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, []byte{1}) { + t.Fatalf("unexpected value: %v", v) + } + + if k, v := c.Prev(); k != nil { + t.Fatalf("expected nil key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + if k, v := c.Prev(); k != nil { + t.Fatalf("expected nil key: %v", k) + } else if v != nil { + t.Fatalf("expected nil value: %v", v) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can restart from the beginning. +func TestCursor_Restart(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("bar"), []byte{}); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte{}); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + tx, err := db.Begin(false) + if err != nil { + t.Fatal(err) + } + c := tx.Bucket([]byte("widgets")).Cursor() + + if k, _ := c.First(); !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } + if k, _ := c.Next(); !bytes.Equal(k, []byte("foo")) { + t.Fatalf("unexpected key: %v", k) + } + + if k, _ := c.First(); !bytes.Equal(k, []byte("bar")) { + t.Fatalf("unexpected key: %v", k) + } + if k, _ := c.Next(); !bytes.Equal(k, []byte("foo")) { + t.Fatalf("unexpected key: %v", k) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } +} + +// Ensure that a cursor can skip over empty pages that have been deleted. +func TestCursor_First_EmptyPages(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Create 1000 keys in the "widgets" bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + for i := 0; i < 1000; i++ { + if err := b.Put(u64tob(uint64(i)), []byte{}); err != nil { + t.Fatal(err) + } + } + + return nil + }); err != nil { + t.Fatal(err) + } + + // Delete half the keys and then try to iterate. + if err := db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 0; i < 600; i++ { + if err := b.Delete(u64tob(uint64(i))); err != nil { + t.Fatal(err) + } + } + + c := b.Cursor() + var n int + for k, _ := c.First(); k != nil; k, _ = c.Next() { + n++ + } + if n != 400 { + t.Fatalf("unexpected key count: %d", n) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx can iterate over all elements in a bucket. +func TestCursor_QuickCheck(t *testing.T) { + f := func(items testdata) bool { + db := MustOpenDB() + defer db.MustClose() + + // Bulk insert all values. + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for _, item := range items { + if err := b.Put(item.Key, item.Value); err != nil { + t.Fatal(err) + } + } + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + + // Sort test data. + sort.Sort(items) + + // Iterate over all items and check consistency. + var index = 0 + tx, err = db.Begin(false) + if err != nil { + t.Fatal(err) + } + + c := tx.Bucket([]byte("widgets")).Cursor() + for k, v := c.First(); k != nil && index < len(items); k, v = c.Next() { + if !bytes.Equal(k, items[index].Key) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, items[index].Value) { + t.Fatalf("unexpected value: %v", v) + } + index++ + } + if len(items) != index { + t.Fatalf("unexpected item count: %v, expected %v", len(items), index) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + + return true + } + if err := quick.Check(f, qconfig()); err != nil { + t.Error(err) + } +} + +// Ensure that a transaction can iterate over all elements in a bucket in reverse. +func TestCursor_QuickCheck_Reverse(t *testing.T) { + f := func(items testdata) bool { + db := MustOpenDB() + defer db.MustClose() + + // Bulk insert all values. + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + for _, item := range items { + if err := b.Put(item.Key, item.Value); err != nil { + t.Fatal(err) + } + } + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + + // Sort test data. + sort.Sort(revtestdata(items)) + + // Iterate over all items and check consistency. + var index = 0 + tx, err = db.Begin(false) + if err != nil { + t.Fatal(err) + } + c := tx.Bucket([]byte("widgets")).Cursor() + for k, v := c.Last(); k != nil && index < len(items); k, v = c.Prev() { + if !bytes.Equal(k, items[index].Key) { + t.Fatalf("unexpected key: %v", k) + } else if !bytes.Equal(v, items[index].Value) { + t.Fatalf("unexpected value: %v", v) + } + index++ + } + if len(items) != index { + t.Fatalf("unexpected item count: %v, expected %v", len(items), index) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + + return true + } + if err := quick.Check(f, qconfig()); err != nil { + t.Error(err) + } +} + +// Ensure that a Tx cursor can iterate over subbuckets. +func TestCursor_QuickCheck_BucketsOnly(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("bar")); err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("baz")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + var names []string + c := tx.Bucket([]byte("widgets")).Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + names = append(names, string(k)) + if v != nil { + t.Fatalf("unexpected value: %v", v) + } + } + if !reflect.DeepEqual(names, []string{"bar", "baz", "foo"}) { + t.Fatalf("unexpected names: %+v", names) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx cursor can reverse iterate over subbuckets. +func TestCursor_QuickCheck_BucketsOnly_Reverse(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("bar")); err != nil { + t.Fatal(err) + } + if _, err := b.CreateBucket([]byte("baz")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + var names []string + c := tx.Bucket([]byte("widgets")).Cursor() + for k, v := c.Last(); k != nil; k, v = c.Prev() { + names = append(names, string(k)) + if v != nil { + t.Fatalf("unexpected value: %v", v) + } + } + if !reflect.DeepEqual(names, []string{"foo", "baz", "bar"}) { + t.Fatalf("unexpected names: %+v", names) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +func ExampleCursor() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Start a read-write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + // Create a new bucket. + b, err := tx.CreateBucket([]byte("animals")) + if err != nil { + return err + } + + // Insert data into a bucket. + if err := b.Put([]byte("dog"), []byte("fun")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("cat"), []byte("lame")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("liger"), []byte("awesome")); err != nil { + log.Fatal(err) + } + + // Create a cursor for iteration. + c := b.Cursor() + + // Iterate over items in sorted key order. This starts from the + // first key/value pair and updates the k/v variables to the + // next key/value on each iteration. + // + // The loop finishes at the end of the cursor when a nil key is returned. + for k, v := c.First(); k != nil; k, v = c.Next() { + fmt.Printf("A %s is %s.\n", k, v) + } + + return nil + }); err != nil { + log.Fatal(err) + } + + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // A cat is lame. + // A dog is fun. + // A liger is awesome. +} + +func ExampleCursor_reverse() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Start a read-write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + // Create a new bucket. + b, err := tx.CreateBucket([]byte("animals")) + if err != nil { + return err + } + + // Insert data into a bucket. + if err := b.Put([]byte("dog"), []byte("fun")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("cat"), []byte("lame")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("liger"), []byte("awesome")); err != nil { + log.Fatal(err) + } + + // Create a cursor for iteration. + c := b.Cursor() + + // Iterate over items in reverse sorted key order. This starts + // from the last key/value pair and updates the k/v variables to + // the previous key/value on each iteration. + // + // The loop finishes at the beginning of the cursor when a nil key + // is returned. + for k, v := c.Last(); k != nil; k, v = c.Prev() { + fmt.Printf("A %s is %s.\n", k, v) + } + + return nil + }); err != nil { + log.Fatal(err) + } + + // Close the database to release the file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // A liger is awesome. + // A dog is fun. + // A cat is lame. +} diff --git a/vendor/src/github.com/boltdb/bolt/db.go b/vendor/src/github.com/boltdb/bolt/db.go new file mode 100644 index 0000000..1223493 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/db.go @@ -0,0 +1,1036 @@ +package bolt + +import ( + "errors" + "fmt" + "hash/fnv" + "log" + "os" + "runtime" + "runtime/debug" + "strings" + "sync" + "time" + "unsafe" +) + +// The largest step that can be taken when remapping the mmap. +const maxMmapStep = 1 << 30 // 1GB + +// The data file format version. +const version = 2 + +// Represents a marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// IgnoreNoSync specifies whether the NoSync field of a DB is ignored when +// syncing changes to a file. This is required as some operating systems, +// such as OpenBSD, do not have a unified buffer cache (UBC) and writes +// must be synchronized using the msync(2) syscall. +const IgnoreNoSync = runtime.GOOS == "openbsd" + +// Default values if not set in a DB instance. +const ( + DefaultMaxBatchSize int = 1000 + DefaultMaxBatchDelay = 10 * time.Millisecond + DefaultAllocSize = 16 * 1024 * 1024 +) + +// default page size for db is set to the OS page size. +var defaultPageSize = os.Getpagesize() + +// DB represents a collection of buckets persisted to a file on disk. +// All data access is performed through transactions which can be obtained through the DB. +// All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. +type DB struct { + // When enabled, the database will perform a Check() after every commit. + // A panic is issued if the database is in an inconsistent state. This + // flag has a large performance impact so it should only be used for + // debugging purposes. + StrictMode bool + + // Setting the NoSync flag will cause the database to skip fsync() + // calls after each commit. This can be useful when bulk loading data + // into a database and you can restart the bulk load in the event of + // a system failure or database corruption. Do not set this flag for + // normal use. + // + // If the package global IgnoreNoSync constant is true, this value is + // ignored. See the comment on that constant for more details. + // + // THIS IS UNSAFE. PLEASE USE WITH CAUTION. + NoSync bool + + // When true, skips the truncate call when growing the database. + // Setting this to true is only safe on non-ext3/ext4 systems. + // Skipping truncation avoids preallocation of hard drive space and + // bypasses a truncate() and fsync() syscall on remapping. + // + // https://github.com/boltdb/bolt/issues/284 + NoGrowSync bool + + // If you want to read the entire database fast, you can set MmapFlag to + // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. + MmapFlags int + + // MaxBatchSize is the maximum size of a batch. Default value is + // copied from DefaultMaxBatchSize in Open. + // + // If <=0, disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchSize int + + // MaxBatchDelay is the maximum delay before a batch starts. + // Default value is copied from DefaultMaxBatchDelay in Open. + // + // If <=0, effectively disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchDelay time.Duration + + // AllocSize is the amount of space allocated when the database + // needs to create new pages. This is done to amortize the cost + // of truncate() and fsync() when growing the data file. + AllocSize int + + path string + file *os.File + lockfile *os.File // windows only + dataref []byte // mmap'ed readonly, write throws SEGV + data *[maxMapSize]byte + datasz int + filesz int // current on disk file size + meta0 *meta + meta1 *meta + pageSize int + opened bool + rwtx *Tx + txs []*Tx + freelist *freelist + stats Stats + + pagePool sync.Pool + + batchMu sync.Mutex + batch *batch + + rwlock sync.Mutex // Allows only one writer at a time. + metalock sync.Mutex // Protects meta page access. + mmaplock sync.RWMutex // Protects mmap access during remapping. + statlock sync.RWMutex // Protects stats access. + + ops struct { + writeAt func(b []byte, off int64) (n int, err error) + } + + // Read only mode. + // When true, Update() and Begin(true) return ErrDatabaseReadOnly immediately. + readOnly bool +} + +// Path returns the path to currently open database file. +func (db *DB) Path() string { + return db.path +} + +// GoString returns the Go string representation of the database. +func (db *DB) GoString() string { + return fmt.Sprintf("bolt.DB{path:%q}", db.path) +} + +// String returns the string representation of the database. +func (db *DB) String() string { + return fmt.Sprintf("DB<%q>", db.path) +} + +// Open creates and opens a database at the given path. +// If the file does not exist then it will be created automatically. +// Passing in nil options will cause Bolt to open the database with the default options. +func Open(path string, mode os.FileMode, options *Options) (*DB, error) { + var db = &DB{opened: true} + + // Set default options if no options are provided. + if options == nil { + options = DefaultOptions + } + db.NoGrowSync = options.NoGrowSync + db.MmapFlags = options.MmapFlags + + // Set default values for later DB operations. + db.MaxBatchSize = DefaultMaxBatchSize + db.MaxBatchDelay = DefaultMaxBatchDelay + db.AllocSize = DefaultAllocSize + + flag := os.O_RDWR + if options.ReadOnly { + flag = os.O_RDONLY + db.readOnly = true + } + + // Open data file and separate sync handler for metadata writes. + db.path = path + var err error + if db.file, err = os.OpenFile(db.path, flag|os.O_CREATE, mode); err != nil { + _ = db.close() + return nil, err + } + + // Lock file so that other processes using Bolt in read-write mode cannot + // use the database at the same time. This would cause corruption since + // the two processes would write meta pages and free pages separately. + // The database file is locked exclusively (only one process can grab the lock) + // if !options.ReadOnly. + // The database file is locked using the shared lock (more than one process may + // hold a lock at the same time) otherwise (options.ReadOnly is set). + if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil { + _ = db.close() + return nil, err + } + + // Default values for test hooks + db.ops.writeAt = db.file.WriteAt + + // Initialize the database if it doesn't exist. + if info, err := db.file.Stat(); err != nil { + return nil, err + } else if info.Size() == 0 { + // Initialize new files with meta pages. + if err := db.init(); err != nil { + return nil, err + } + } else { + // Read the first meta page to determine the page size. + var buf [0x1000]byte + if _, err := db.file.ReadAt(buf[:], 0); err == nil { + m := db.pageInBuffer(buf[:], 0).meta() + if err := m.validate(); err != nil { + // If we can't read the page size, we can assume it's the same + // as the OS -- since that's how the page size was chosen in the + // first place. + // + // If the first page is invalid and this OS uses a different + // page size than what the database was created with then we + // are out of luck and cannot access the database. + db.pageSize = os.Getpagesize() + } else { + db.pageSize = int(m.pageSize) + } + } + } + + // Initialize page pool. + db.pagePool = sync.Pool{ + New: func() interface{} { + return make([]byte, db.pageSize) + }, + } + + // Memory map the data file. + if err := db.mmap(options.InitialMmapSize); err != nil { + _ = db.close() + return nil, err + } + + // Read in the freelist. + db.freelist = newFreelist() + db.freelist.read(db.page(db.meta().freelist)) + + // Mark the database as opened and return. + return db, nil +} + +// mmap opens the underlying memory-mapped file and initializes the meta references. +// minsz is the minimum size that the new mmap can be. +func (db *DB) mmap(minsz int) error { + db.mmaplock.Lock() + defer db.mmaplock.Unlock() + + info, err := db.file.Stat() + if err != nil { + return fmt.Errorf("mmap stat error: %s", err) + } else if int(info.Size()) < db.pageSize*2 { + return fmt.Errorf("file size too small") + } + + // Ensure the size is at least the minimum size. + var size = int(info.Size()) + if size < minsz { + size = minsz + } + size, err = db.mmapSize(size) + if err != nil { + return err + } + + // Dereference all mmap references before unmapping. + if db.rwtx != nil { + db.rwtx.root.dereference() + } + + // Unmap existing data before continuing. + if err := db.munmap(); err != nil { + return err + } + + // Memory-map the data file as a byte slice. + if err := mmap(db, size); err != nil { + return err + } + + // Save references to the meta pages. + db.meta0 = db.page(0).meta() + db.meta1 = db.page(1).meta() + + // Validate the meta pages. We only return an error if both meta pages fail + // validation, since meta0 failing validation means that it wasn't saved + // properly -- but we can recover using meta1. And vice-versa. + err0 := db.meta0.validate() + err1 := db.meta1.validate() + if err0 != nil && err1 != nil { + return err0 + } + + return nil +} + +// munmap unmaps the data file from memory. +func (db *DB) munmap() error { + if err := munmap(db); err != nil { + return fmt.Errorf("unmap error: " + err.Error()) + } + return nil +} + +// mmapSize determines the appropriate size for the mmap given the current size +// of the database. The minimum size is 32KB and doubles until it reaches 1GB. +// Returns an error if the new mmap size is greater than the max allowed. +func (db *DB) mmapSize(size int) (int, error) { + // Double the size from 32KB until 1GB. + for i := uint(15); i <= 30; i++ { + if size <= 1< maxMapSize { + return 0, fmt.Errorf("mmap too large") + } + + // If larger than 1GB then grow by 1GB at a time. + sz := int64(size) + if remainder := sz % int64(maxMmapStep); remainder > 0 { + sz += int64(maxMmapStep) - remainder + } + + // Ensure that the mmap size is a multiple of the page size. + // This should always be true since we're incrementing in MBs. + pageSize := int64(db.pageSize) + if (sz % pageSize) != 0 { + sz = ((sz / pageSize) + 1) * pageSize + } + + // If we've exceeded the max size then only grow up to the max size. + if sz > maxMapSize { + sz = maxMapSize + } + + return int(sz), nil +} + +// init creates a new database file and initializes its meta pages. +func (db *DB) init() error { + // Set the page size to the OS page size. + db.pageSize = os.Getpagesize() + + // Create two meta pages on a buffer. + buf := make([]byte, db.pageSize*4) + for i := 0; i < 2; i++ { + p := db.pageInBuffer(buf[:], pgid(i)) + p.id = pgid(i) + p.flags = metaPageFlag + + // Initialize the meta page. + m := p.meta() + m.magic = magic + m.version = version + m.pageSize = uint32(db.pageSize) + m.freelist = 2 + m.root = bucket{root: 3} + m.pgid = 4 + m.txid = txid(i) + m.checksum = m.sum64() + } + + // Write an empty freelist at page 3. + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(2) + p.flags = freelistPageFlag + p.count = 0 + + // Write an empty leaf page at page 4. + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(3) + p.flags = leafPageFlag + p.count = 0 + + // Write the buffer to our data file. + if _, err := db.ops.writeAt(buf, 0); err != nil { + return err + } + if err := fdatasync(db); err != nil { + return err + } + + return nil +} + +// Close releases all database resources. +// All transactions must be closed before closing the database. +func (db *DB) Close() error { + db.rwlock.Lock() + defer db.rwlock.Unlock() + + db.metalock.Lock() + defer db.metalock.Unlock() + + db.mmaplock.RLock() + defer db.mmaplock.RUnlock() + + return db.close() +} + +func (db *DB) close() error { + if !db.opened { + return nil + } + + db.opened = false + + db.freelist = nil + + // Clear ops. + db.ops.writeAt = nil + + // Close the mmap. + if err := db.munmap(); err != nil { + return err + } + + // Close file handles. + if db.file != nil { + // No need to unlock read-only file. + if !db.readOnly { + // Unlock the file. + if err := funlock(db); err != nil { + log.Printf("bolt.Close(): funlock error: %s", err) + } + } + + // Close the file descriptor. + if err := db.file.Close(); err != nil { + return fmt.Errorf("db file close: %s", err) + } + db.file = nil + } + + db.path = "" + return nil +} + +// Begin starts a new transaction. +// Multiple read-only transactions can be used concurrently but only one +// write transaction can be used at a time. Starting multiple write transactions +// will cause the calls to block and be serialized until the current write +// transaction finishes. +// +// Transactions should not be dependent on one another. Opening a read +// transaction and a write transaction in the same goroutine can cause the +// writer to deadlock because the database periodically needs to re-mmap itself +// as it grows and it cannot do that while a read transaction is open. +// +// If a long running read transaction (for example, a snapshot transaction) is +// needed, you might want to set DB.InitialMmapSize to a large enough value +// to avoid potential blocking of write transaction. +// +// IMPORTANT: You must close read-only transactions after you are finished or +// else the database will not reclaim old pages. +func (db *DB) Begin(writable bool) (*Tx, error) { + if writable { + return db.beginRWTx() + } + return db.beginTx() +} + +func (db *DB) beginTx() (*Tx, error) { + // Lock the meta pages while we initialize the transaction. We obtain + // the meta lock before the mmap lock because that's the order that the + // write transaction will obtain them. + db.metalock.Lock() + + // Obtain a read-only lock on the mmap. When the mmap is remapped it will + // obtain a write lock so all transactions must finish before it can be + // remapped. + db.mmaplock.RLock() + + // Exit if the database is not open yet. + if !db.opened { + db.mmaplock.RUnlock() + db.metalock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{} + t.init(db) + + // Keep track of transaction until it closes. + db.txs = append(db.txs, t) + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Update the transaction stats. + db.statlock.Lock() + db.stats.TxN++ + db.stats.OpenTxN = n + db.statlock.Unlock() + + return t, nil +} + +func (db *DB) beginRWTx() (*Tx, error) { + // If the database was opened with Options.ReadOnly, return an error. + if db.readOnly { + return nil, ErrDatabaseReadOnly + } + + // Obtain writer lock. This is released by the transaction when it closes. + // This enforces only one writer transaction at a time. + db.rwlock.Lock() + + // Once we have the writer lock then we can lock the meta pages so that + // we can set up the transaction. + db.metalock.Lock() + defer db.metalock.Unlock() + + // Exit if the database is not open yet. + if !db.opened { + db.rwlock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{writable: true} + t.init(db) + db.rwtx = t + + // Free any pages associated with closed read-only transactions. + var minid txid = 0xFFFFFFFFFFFFFFFF + for _, t := range db.txs { + if t.meta.txid < minid { + minid = t.meta.txid + } + } + if minid > 0 { + db.freelist.release(minid - 1) + } + + return t, nil +} + +// removeTx removes a transaction from the database. +func (db *DB) removeTx(tx *Tx) { + // Release the read lock on the mmap. + db.mmaplock.RUnlock() + + // Use the meta lock to restrict access to the DB object. + db.metalock.Lock() + + // Remove the transaction. + for i, t := range db.txs { + if t == tx { + db.txs = append(db.txs[:i], db.txs[i+1:]...) + break + } + } + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Merge statistics. + db.statlock.Lock() + db.stats.OpenTxN = n + db.stats.TxStats.add(&tx.stats) + db.statlock.Unlock() +} + +// Update executes a function within the context of a read-write managed transaction. +// If no error is returned from the function then the transaction is committed. +// If an error is returned then the entire transaction is rolled back. +// Any error that is returned from the function or returned from the commit is +// returned from the Update() method. +// +// Attempting to manually commit or rollback within the function will cause a panic. +func (db *DB) Update(fn func(*Tx) error) error { + t, err := db.Begin(true) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually commit. + t.managed = true + + // If an error is returned from the function then rollback and return error. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + return t.Commit() +} + +// View executes a function within the context of a managed read-only transaction. +// Any error that is returned from the function is returned from the View() method. +// +// Attempting to manually rollback within the function will cause a panic. +func (db *DB) View(fn func(*Tx) error) error { + t, err := db.Begin(false) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually rollback. + t.managed = true + + // If an error is returned from the function then pass it through. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + if err := t.Rollback(); err != nil { + return err + } + + return nil +} + +// Batch calls fn as part of a batch. It behaves similar to Update, +// except: +// +// 1. concurrent Batch calls can be combined into a single Bolt +// transaction. +// +// 2. the function passed to Batch may be called multiple times, +// regardless of whether it returns error or not. +// +// This means that Batch function side effects must be idempotent and +// take permanent effect only after a successful return is seen in +// caller. +// +// The maximum batch size and delay can be adjusted with DB.MaxBatchSize +// and DB.MaxBatchDelay, respectively. +// +// Batch is only useful when there are multiple goroutines calling it. +func (db *DB) Batch(fn func(*Tx) error) error { + errCh := make(chan error, 1) + + db.batchMu.Lock() + if (db.batch == nil) || (db.batch != nil && len(db.batch.calls) >= db.MaxBatchSize) { + // There is no existing batch, or the existing batch is full; start a new one. + db.batch = &batch{ + db: db, + } + db.batch.timer = time.AfterFunc(db.MaxBatchDelay, db.batch.trigger) + } + db.batch.calls = append(db.batch.calls, call{fn: fn, err: errCh}) + if len(db.batch.calls) >= db.MaxBatchSize { + // wake up batch, it's ready to run + go db.batch.trigger() + } + db.batchMu.Unlock() + + err := <-errCh + if err == trySolo { + err = db.Update(fn) + } + return err +} + +type call struct { + fn func(*Tx) error + err chan<- error +} + +type batch struct { + db *DB + timer *time.Timer + start sync.Once + calls []call +} + +// trigger runs the batch if it hasn't already been run. +func (b *batch) trigger() { + b.start.Do(b.run) +} + +// run performs the transactions in the batch and communicates results +// back to DB.Batch. +func (b *batch) run() { + b.db.batchMu.Lock() + b.timer.Stop() + // Make sure no new work is added to this batch, but don't break + // other batches. + if b.db.batch == b { + b.db.batch = nil + } + b.db.batchMu.Unlock() + +retry: + for len(b.calls) > 0 { + var failIdx = -1 + err := b.db.Update(func(tx *Tx) error { + for i, c := range b.calls { + if err := safelyCall(c.fn, tx); err != nil { + failIdx = i + return err + } + } + return nil + }) + + if failIdx >= 0 { + // take the failing transaction out of the batch. it's + // safe to shorten b.calls here because db.batch no longer + // points to us, and we hold the mutex anyway. + c := b.calls[failIdx] + b.calls[failIdx], b.calls = b.calls[len(b.calls)-1], b.calls[:len(b.calls)-1] + // tell the submitter re-run it solo, continue with the rest of the batch + c.err <- trySolo + continue retry + } + + // pass success, or bolt internal errors, to all callers + for _, c := range b.calls { + if c.err != nil { + c.err <- err + } + } + break retry + } +} + +// trySolo is a special sentinel error value used for signaling that a +// transaction function should be re-run. It should never be seen by +// callers. +var trySolo = errors.New("batch function returned an error and should be re-run solo") + +type panicked struct { + reason interface{} +} + +func (p panicked) Error() string { + if err, ok := p.reason.(error); ok { + return err.Error() + } + return fmt.Sprintf("panic: %v", p.reason) +} + +func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { + defer func() { + if p := recover(); p != nil { + err = panicked{p} + } + }() + return fn(tx) +} + +// Sync executes fdatasync() against the database file handle. +// +// This is not necessary under normal operation, however, if you use NoSync +// then it allows you to force the database file to sync against the disk. +func (db *DB) Sync() error { return fdatasync(db) } + +// Stats retrieves ongoing performance stats for the database. +// This is only updated when a transaction closes. +func (db *DB) Stats() Stats { + db.statlock.RLock() + defer db.statlock.RUnlock() + return db.stats +} + +// This is for internal access to the raw data bytes from the C cursor, use +// carefully, or not at all. +func (db *DB) Info() *Info { + return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} +} + +// page retrieves a page reference from the mmap based on the current page size. +func (db *DB) page(id pgid) *page { + pos := id * pgid(db.pageSize) + return (*page)(unsafe.Pointer(&db.data[pos])) +} + +// pageInBuffer retrieves a page reference from a given byte array based on the current page size. +func (db *DB) pageInBuffer(b []byte, id pgid) *page { + return (*page)(unsafe.Pointer(&b[id*pgid(db.pageSize)])) +} + +// meta retrieves the current meta page reference. +func (db *DB) meta() *meta { + // We have to return the meta with the highest txid which doesn't fail + // validation. Otherwise, we can cause errors when in fact the database is + // in a consistent state. metaA is the one with the higher txid. + metaA := db.meta0 + metaB := db.meta1 + if db.meta1.txid > db.meta0.txid { + metaA = db.meta1 + metaB = db.meta0 + } + + // Use higher meta page if valid. Otherwise fallback to previous, if valid. + if err := metaA.validate(); err == nil { + return metaA + } else if err := metaB.validate(); err == nil { + return metaB + } + + // This should never be reached, because both meta1 and meta0 were validated + // on mmap() and we do fsync() on every write. + panic("bolt.DB.meta(): invalid meta pages") +} + +// allocate returns a contiguous block of memory starting at a given page. +func (db *DB) allocate(count int) (*page, error) { + // Allocate a temporary buffer for the page. + var buf []byte + if count == 1 { + buf = db.pagePool.Get().([]byte) + } else { + buf = make([]byte, count*db.pageSize) + } + p := (*page)(unsafe.Pointer(&buf[0])) + p.overflow = uint32(count - 1) + + // Use pages from the freelist if they are available. + if p.id = db.freelist.allocate(count); p.id != 0 { + return p, nil + } + + // Resize mmap() if we're at the end. + p.id = db.rwtx.meta.pgid + var minsz = int((p.id+pgid(count))+1) * db.pageSize + if minsz >= db.datasz { + if err := db.mmap(minsz); err != nil { + return nil, fmt.Errorf("mmap allocate error: %s", err) + } + } + + // Move the page id high water mark. + db.rwtx.meta.pgid += pgid(count) + + return p, nil +} + +// grow grows the size of the database to the given sz. +func (db *DB) grow(sz int) error { + // Ignore if the new size is less than available file size. + if sz <= db.filesz { + return nil + } + + // If the data is smaller than the alloc size then only allocate what's needed. + // Once it goes over the allocation size then allocate in chunks. + if db.datasz < db.AllocSize { + sz = db.datasz + } else { + sz += db.AllocSize + } + + // Truncate and fsync to ensure file size metadata is flushed. + // https://github.com/boltdb/bolt/issues/284 + if !db.NoGrowSync && !db.readOnly { + if runtime.GOOS != "windows" { + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("file resize error: %s", err) + } + } + if err := db.file.Sync(); err != nil { + return fmt.Errorf("file sync error: %s", err) + } + } + + db.filesz = sz + return nil +} + +func (db *DB) IsReadOnly() bool { + return db.readOnly +} + +// Options represents the options that can be set when opening a database. +type Options struct { + // Timeout is the amount of time to wait to obtain a file lock. + // When set to zero it will wait indefinitely. This option is only + // available on Darwin and Linux. + Timeout time.Duration + + // Sets the DB.NoGrowSync flag before memory mapping the file. + NoGrowSync bool + + // Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to + // grab a shared lock (UNIX). + ReadOnly bool + + // Sets the DB.MmapFlags flag before memory mapping the file. + MmapFlags int + + // InitialMmapSize is the initial mmap size of the database + // in bytes. Read transactions won't block write transaction + // if the InitialMmapSize is large enough to hold database mmap + // size. (See DB.Begin for more information) + // + // If <=0, the initial map size is 0. + // If initialMmapSize is smaller than the previous database size, + // it takes no effect. + InitialMmapSize int +} + +// DefaultOptions represent the options used if nil options are passed into Open(). +// No timeout is used which will cause Bolt to wait indefinitely for a lock. +var DefaultOptions = &Options{ + Timeout: 0, + NoGrowSync: false, +} + +// Stats represents statistics about the database. +type Stats struct { + // Freelist stats + FreePageN int // total number of free pages on the freelist + PendingPageN int // total number of pending pages on the freelist + FreeAlloc int // total bytes allocated in free pages + FreelistInuse int // total bytes used by the freelist + + // Transaction stats + TxN int // total number of started read transactions + OpenTxN int // number of currently open read transactions + + TxStats TxStats // global, ongoing stats. +} + +// Sub calculates and returns the difference between two sets of database stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *Stats) Sub(other *Stats) Stats { + if other == nil { + return *s + } + var diff Stats + diff.FreePageN = s.FreePageN + diff.PendingPageN = s.PendingPageN + diff.FreeAlloc = s.FreeAlloc + diff.FreelistInuse = s.FreelistInuse + diff.TxN = other.TxN - s.TxN + diff.TxStats = s.TxStats.Sub(&other.TxStats) + return diff +} + +func (s *Stats) add(other *Stats) { + s.TxStats.add(&other.TxStats) +} + +type Info struct { + Data uintptr + PageSize int +} + +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// validate checks the marker bytes and version of the meta page to ensure it matches this binary. +func (m *meta) validate() error { + if m.magic != magic { + return ErrInvalid + } else if m.version != version { + return ErrVersionMismatch + } else if m.checksum != 0 && m.checksum != m.sum64() { + return ErrChecksum + } + return nil +} + +// copy copies one meta object to another. +func (m *meta) copy(dest *meta) { + *dest = *m +} + +// write writes the meta onto a page. +func (m *meta) write(p *page) { + if m.root.root >= m.pgid { + panic(fmt.Sprintf("root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid)) + } else if m.freelist >= m.pgid { + panic(fmt.Sprintf("freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid)) + } + + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. + p.id = pgid(m.txid % 2) + p.flags |= metaPageFlag + + // Calculate the checksum. + m.checksum = m.sum64() + + m.copy(p.meta()) +} + +// generates the checksum for the meta. +func (m *meta) sum64() uint64 { + var h = fnv.New64a() + _, _ = h.Write((*[unsafe.Offsetof(meta{}.checksum)]byte)(unsafe.Pointer(m))[:]) + return h.Sum64() +} + +// _assert will panic with a given formatted message if the given condition is false. +func _assert(condition bool, msg string, v ...interface{}) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +func printstack() { + stack := strings.Join(strings.Split(string(debug.Stack()), "\n")[2:], "\n") + fmt.Fprintln(os.Stderr, stack) +} diff --git a/vendor/src/github.com/boltdb/bolt/db_test.go b/vendor/src/github.com/boltdb/bolt/db_test.go new file mode 100644 index 0000000..74ff93a --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/db_test.go @@ -0,0 +1,1706 @@ +package bolt_test + +import ( + "bytes" + "encoding/binary" + "errors" + "flag" + "fmt" + "hash/fnv" + "io/ioutil" + "log" + "os" + "path/filepath" + "regexp" + "runtime" + "sort" + "strings" + "sync" + "testing" + "time" + "unsafe" + + "github.com/boltdb/bolt" +) + +var statsFlag = flag.Bool("stats", false, "show performance stats") + +// version is the data file format version. +const version = 2 + +// magic is the marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// pageSize is the size of one page in the data file. +const pageSize = 4096 + +// pageHeaderSize is the size of a page header. +const pageHeaderSize = 16 + +// meta represents a simplified version of a database meta page for testing. +type meta struct { + magic uint32 + version uint32 + _ uint32 + _ uint32 + _ [16]byte + _ uint64 + pgid uint64 + _ uint64 + checksum uint64 +} + +// Ensure that a database can be opened without error. +func TestOpen(t *testing.T) { + path := tempfile() + db, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } else if db == nil { + t.Fatal("expected db") + } + + if s := db.Path(); s != path { + t.Fatalf("unexpected path: %s", s) + } + + if err := db.Close(); err != nil { + t.Fatal(err) + } +} + +// Ensure that opening a database with a blank path returns an error. +func TestOpen_ErrPathRequired(t *testing.T) { + _, err := bolt.Open("", 0666, nil) + if err == nil { + t.Fatalf("expected error") + } +} + +// Ensure that opening a database with a bad path returns an error. +func TestOpen_ErrNotExists(t *testing.T) { + _, err := bolt.Open(filepath.Join(tempfile(), "bad-path"), 0666, nil) + if err == nil { + t.Fatal("expected error") + } +} + +// Ensure that opening a file that is not a Bolt database returns ErrInvalid. +func TestOpen_ErrInvalid(t *testing.T) { + path := tempfile() + + f, err := os.Create(path) + if err != nil { + t.Fatal(err) + } + if _, err := fmt.Fprintln(f, "this is not a bolt database"); err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + defer os.Remove(path) + + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrInvalid { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that opening a file with two invalid versions returns ErrVersionMismatch. +func TestOpen_ErrVersionMismatch(t *testing.T) { + if pageSize != os.Getpagesize() { + t.Skip("page size mismatch") + } + + // Create empty database. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + // Close database. + if err := db.DB.Close(); err != nil { + t.Fatal(err) + } + + // Read data file. + buf, err := ioutil.ReadFile(path) + if err != nil { + t.Fatal(err) + } + + // Rewrite meta pages. + meta0 := (*meta)(unsafe.Pointer(&buf[pageHeaderSize])) + meta0.version++ + meta1 := (*meta)(unsafe.Pointer(&buf[pageSize+pageHeaderSize])) + meta1.version++ + if err := ioutil.WriteFile(path, buf, 0666); err != nil { + t.Fatal(err) + } + + // Reopen data file. + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrVersionMismatch { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that opening a file with two invalid checksums returns ErrChecksum. +func TestOpen_ErrChecksum(t *testing.T) { + if pageSize != os.Getpagesize() { + t.Skip("page size mismatch") + } + + // Create empty database. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + // Close database. + if err := db.DB.Close(); err != nil { + t.Fatal(err) + } + + // Read data file. + buf, err := ioutil.ReadFile(path) + if err != nil { + t.Fatal(err) + } + + // Rewrite meta pages. + meta0 := (*meta)(unsafe.Pointer(&buf[pageHeaderSize])) + meta0.pgid++ + meta1 := (*meta)(unsafe.Pointer(&buf[pageSize+pageHeaderSize])) + meta1.pgid++ + if err := ioutil.WriteFile(path, buf, 0666); err != nil { + t.Fatal(err) + } + + // Reopen data file. + if _, err := bolt.Open(path, 0666, nil); err != bolt.ErrChecksum { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that opening an already open database file will timeout. +func TestOpen_Timeout(t *testing.T) { + if runtime.GOOS == "solaris" { + t.Skip("solaris fcntl locks don't support intra-process locking") + } + + path := tempfile() + + // Open a data file. + db0, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } else if db0 == nil { + t.Fatal("expected database") + } + + // Attempt to open the database again. + start := time.Now() + db1, err := bolt.Open(path, 0666, &bolt.Options{Timeout: 100 * time.Millisecond}) + if err != bolt.ErrTimeout { + t.Fatalf("unexpected timeout: %s", err) + } else if db1 != nil { + t.Fatal("unexpected database") + } else if time.Since(start) <= 100*time.Millisecond { + t.Fatal("expected to wait at least timeout duration") + } + + if err := db0.Close(); err != nil { + t.Fatal(err) + } +} + +// Ensure that opening an already open database file will wait until its closed. +func TestOpen_Wait(t *testing.T) { + if runtime.GOOS == "solaris" { + t.Skip("solaris fcntl locks don't support intra-process locking") + } + + path := tempfile() + + // Open a data file. + db0, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + + // Close it in just a bit. + time.AfterFunc(100*time.Millisecond, func() { _ = db0.Close() }) + + // Attempt to open the database again. + start := time.Now() + db1, err := bolt.Open(path, 0666, &bolt.Options{Timeout: 200 * time.Millisecond}) + if err != nil { + t.Fatal(err) + } else if time.Since(start) <= 100*time.Millisecond { + t.Fatal("expected to wait at least timeout duration") + } + + if err := db1.Close(); err != nil { + t.Fatal(err) + } +} + +// Ensure that opening a database does not increase its size. +// https://github.com/boltdb/bolt/issues/291 +func TestOpen_Size(t *testing.T) { + // Open a data file. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + pagesize := db.Info().PageSize + + // Insert until we get above the minimum 4MB size. + if err := db.Update(func(tx *bolt.Tx) error { + b, _ := tx.CreateBucketIfNotExists([]byte("data")) + for i := 0; i < 10000; i++ { + if err := b.Put([]byte(fmt.Sprintf("%04d", i)), make([]byte, 1000)); err != nil { + t.Fatal(err) + } + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Close database and grab the size. + if err := db.DB.Close(); err != nil { + t.Fatal(err) + } + sz := fileSize(path) + if sz == 0 { + t.Fatalf("unexpected new file size: %d", sz) + } + + // Reopen database, update, and check size again. + db0, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + if err := db0.Update(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("data")).Put([]byte{0}, []byte{0}); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + if err := db0.Close(); err != nil { + t.Fatal(err) + } + newSz := fileSize(path) + if newSz == 0 { + t.Fatalf("unexpected new file size: %d", newSz) + } + + // Compare the original size with the new size. + // db size might increase by a few page sizes due to the new small update. + if sz < newSz-5*int64(pagesize) { + t.Fatalf("unexpected file growth: %d => %d", sz, newSz) + } +} + +// Ensure that opening a database beyond the max step size does not increase its size. +// https://github.com/boltdb/bolt/issues/303 +func TestOpen_Size_Large(t *testing.T) { + if testing.Short() { + t.Skip("short mode") + } + + // Open a data file. + db := MustOpenDB() + path := db.Path() + defer db.MustClose() + + pagesize := db.Info().PageSize + + // Insert until we get above the minimum 4MB size. + var index uint64 + for i := 0; i < 10000; i++ { + if err := db.Update(func(tx *bolt.Tx) error { + b, _ := tx.CreateBucketIfNotExists([]byte("data")) + for j := 0; j < 1000; j++ { + if err := b.Put(u64tob(index), make([]byte, 50)); err != nil { + t.Fatal(err) + } + index++ + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + // Close database and grab the size. + if err := db.DB.Close(); err != nil { + t.Fatal(err) + } + sz := fileSize(path) + if sz == 0 { + t.Fatalf("unexpected new file size: %d", sz) + } else if sz < (1 << 30) { + t.Fatalf("expected larger initial size: %d", sz) + } + + // Reopen database, update, and check size again. + db0, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + if err := db0.Update(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("data")).Put([]byte{0}, []byte{0}) + }); err != nil { + t.Fatal(err) + } + if err := db0.Close(); err != nil { + t.Fatal(err) + } + + newSz := fileSize(path) + if newSz == 0 { + t.Fatalf("unexpected new file size: %d", newSz) + } + + // Compare the original size with the new size. + // db size might increase by a few page sizes due to the new small update. + if sz < newSz-5*int64(pagesize) { + t.Fatalf("unexpected file growth: %d => %d", sz, newSz) + } +} + +// Ensure that a re-opened database is consistent. +func TestOpen_Check(t *testing.T) { + path := tempfile() + + db, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + if err := db.View(func(tx *bolt.Tx) error { return <-tx.Check() }); err != nil { + t.Fatal(err) + } + if err := db.Close(); err != nil { + t.Fatal(err) + } + + db, err = bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + if err := db.View(func(tx *bolt.Tx) error { return <-tx.Check() }); err != nil { + t.Fatal(err) + } + if err := db.Close(); err != nil { + t.Fatal(err) + } +} + +// Ensure that write errors to the meta file handler during initialization are returned. +func TestOpen_MetaInitWriteError(t *testing.T) { + t.Skip("pending") +} + +// Ensure that a database that is too small returns an error. +func TestOpen_FileTooSmall(t *testing.T) { + path := tempfile() + + db, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } + if err := db.Close(); err != nil { + t.Fatal(err) + } + + // corrupt the database + if err := os.Truncate(path, int64(os.Getpagesize())); err != nil { + t.Fatal(err) + } + + db, err = bolt.Open(path, 0666, nil) + if err == nil || err.Error() != "file size too small" { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that a database can be opened in read-only mode by multiple processes +// and that a database can not be opened in read-write mode and in read-only +// mode at the same time. +func TestOpen_ReadOnly(t *testing.T) { + if runtime.GOOS == "solaris" { + t.Skip("solaris fcntl locks don't support intra-process locking") + } + + bucket, key, value := []byte(`bucket`), []byte(`key`), []byte(`value`) + + path := tempfile() + + // Open in read-write mode. + db, err := bolt.Open(path, 0666, nil) + if err != nil { + t.Fatal(err) + } else if db.IsReadOnly() { + t.Fatal("db should not be in read only mode") + } + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket(bucket) + if err != nil { + return err + } + if err := b.Put(key, value); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + if err := db.Close(); err != nil { + t.Fatal(err) + } + + // Open in read-only mode. + db0, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true}) + if err != nil { + t.Fatal(err) + } + + // Opening in read-write mode should return an error. + if _, err = bolt.Open(path, 0666, &bolt.Options{Timeout: time.Millisecond * 100}); err == nil { + t.Fatal("expected error") + } + + // And again (in read-only mode). + db1, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true}) + if err != nil { + t.Fatal(err) + } + + // Verify both read-only databases are accessible. + for _, db := range []*bolt.DB{db0, db1} { + // Verify is is in read only mode indeed. + if !db.IsReadOnly() { + t.Fatal("expected read only mode") + } + + // Read-only databases should not allow updates. + if err := db.Update(func(*bolt.Tx) error { + panic(`should never get here`) + }); err != bolt.ErrDatabaseReadOnly { + t.Fatalf("unexpected error: %s", err) + } + + // Read-only databases should not allow beginning writable txns. + if _, err := db.Begin(true); err != bolt.ErrDatabaseReadOnly { + t.Fatalf("unexpected error: %s", err) + } + + // Verify the data. + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket(bucket) + if b == nil { + return fmt.Errorf("expected bucket `%s`", string(bucket)) + } + + got := string(b.Get(key)) + expected := string(value) + if got != expected { + return fmt.Errorf("expected `%s`, got `%s`", expected, got) + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + if err := db0.Close(); err != nil { + t.Fatal(err) + } + if err := db1.Close(); err != nil { + t.Fatal(err) + } +} + +// TestDB_Open_InitialMmapSize tests if having InitialMmapSize large enough +// to hold data from concurrent write transaction resolves the issue that +// read transaction blocks the write transaction and causes deadlock. +// This is a very hacky test since the mmap size is not exposed. +func TestDB_Open_InitialMmapSize(t *testing.T) { + path := tempfile() + defer os.Remove(path) + + initMmapSize := 1 << 31 // 2GB + testWriteSize := 1 << 27 // 134MB + + db, err := bolt.Open(path, 0666, &bolt.Options{InitialMmapSize: initMmapSize}) + if err != nil { + t.Fatal(err) + } + + // create a long-running read transaction + // that never gets closed while writing + rtx, err := db.Begin(false) + if err != nil { + t.Fatal(err) + } + + // create a write transaction + wtx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + b, err := wtx.CreateBucket([]byte("test")) + if err != nil { + t.Fatal(err) + } + + // and commit a large write + err = b.Put([]byte("foo"), make([]byte, testWriteSize)) + if err != nil { + t.Fatal(err) + } + + done := make(chan struct{}) + + go func() { + if err := wtx.Commit(); err != nil { + t.Fatal(err) + } + done <- struct{}{} + }() + + select { + case <-time.After(5 * time.Second): + t.Errorf("unexpected that the reader blocks writer") + case <-done: + } + + if err := rtx.Rollback(); err != nil { + t.Fatal(err) + } +} + +// Ensure that a database cannot open a transaction when it's not open. +func TestDB_Begin_ErrDatabaseNotOpen(t *testing.T) { + var db bolt.DB + if _, err := db.Begin(false); err != bolt.ErrDatabaseNotOpen { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that a read-write transaction can be retrieved. +func TestDB_BeginRW(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } else if tx == nil { + t.Fatal("expected tx") + } + + if tx.DB() != db.DB { + t.Fatal("unexpected tx database") + } else if !tx.Writable() { + t.Fatal("expected writable tx") + } + + if err := tx.Commit(); err != nil { + t.Fatal(err) + } +} + +// Ensure that opening a transaction while the DB is closed returns an error. +func TestDB_BeginRW_Closed(t *testing.T) { + var db bolt.DB + if _, err := db.Begin(true); err != bolt.ErrDatabaseNotOpen { + t.Fatalf("unexpected error: %s", err) + } +} + +func TestDB_Close_PendingTx_RW(t *testing.T) { testDB_Close_PendingTx(t, true) } +func TestDB_Close_PendingTx_RO(t *testing.T) { testDB_Close_PendingTx(t, false) } + +// Ensure that a database cannot close while transactions are open. +func testDB_Close_PendingTx(t *testing.T, writable bool) { + db := MustOpenDB() + defer db.MustClose() + + // Start transaction. + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + // Open update in separate goroutine. + done := make(chan struct{}) + go func() { + if err := db.Close(); err != nil { + t.Fatal(err) + } + close(done) + }() + + // Ensure database hasn't closed. + time.Sleep(100 * time.Millisecond) + select { + case <-done: + t.Fatal("database closed too early") + default: + } + + // Commit transaction. + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + + // Ensure database closed now. + time.Sleep(100 * time.Millisecond) + select { + case <-done: + default: + t.Fatal("database did not close") + } +} + +// Ensure a database can provide a transactional block. +func TestDB_Update(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + if err := b.Delete([]byte("foo")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + if v := b.Get([]byte("foo")); v != nil { + t.Fatalf("expected nil value, got: %v", v) + } + if v := b.Get([]byte("baz")); !bytes.Equal(v, []byte("bat")) { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a closed database returns an error while running a transaction block +func TestDB_Update_Closed(t *testing.T) { + var db bolt.DB + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != bolt.ErrDatabaseNotOpen { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure a panic occurs while trying to commit a managed transaction. +func TestDB_Update_ManualCommit(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var panicked bool + if err := db.Update(func(tx *bolt.Tx) error { + func() { + defer func() { + if r := recover(); r != nil { + panicked = true + } + }() + + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + }() + return nil + }); err != nil { + t.Fatal(err) + } else if !panicked { + t.Fatal("expected panic") + } +} + +// Ensure a panic occurs while trying to rollback a managed transaction. +func TestDB_Update_ManualRollback(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var panicked bool + if err := db.Update(func(tx *bolt.Tx) error { + func() { + defer func() { + if r := recover(); r != nil { + panicked = true + } + }() + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + }() + return nil + }); err != nil { + t.Fatal(err) + } else if !panicked { + t.Fatal("expected panic") + } +} + +// Ensure a panic occurs while trying to commit a managed transaction. +func TestDB_View_ManualCommit(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var panicked bool + if err := db.View(func(tx *bolt.Tx) error { + func() { + defer func() { + if r := recover(); r != nil { + panicked = true + } + }() + + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + }() + return nil + }); err != nil { + t.Fatal(err) + } else if !panicked { + t.Fatal("expected panic") + } +} + +// Ensure a panic occurs while trying to rollback a managed transaction. +func TestDB_View_ManualRollback(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var panicked bool + if err := db.View(func(tx *bolt.Tx) error { + func() { + defer func() { + if r := recover(); r != nil { + panicked = true + } + }() + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + }() + return nil + }); err != nil { + t.Fatal(err) + } else if !panicked { + t.Fatal("expected panic") + } +} + +// Ensure a write transaction that panics does not hold open locks. +func TestDB_Update_Panic(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Panic during update but recover. + func() { + defer func() { + if r := recover(); r != nil { + t.Log("recover: update", r) + } + }() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + panic("omg") + }); err != nil { + t.Fatal(err) + } + }() + + // Verify we can update again. + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Verify that our change persisted. + if err := db.Update(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure a database can return an error through a read-only transactional block. +func TestDB_View_Error(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.View(func(tx *bolt.Tx) error { + return errors.New("xxx") + }); err == nil || err.Error() != "xxx" { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure a read transaction that panics does not hold open locks. +func TestDB_View_Panic(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Panic during view transaction but recover. + func() { + defer func() { + if r := recover(); r != nil { + t.Log("recover: view", r) + } + }() + + if err := db.View(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + panic("omg") + }); err != nil { + t.Fatal(err) + } + }() + + // Verify that we can still use read transactions. + if err := db.View(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that DB stats can be returned. +func TestDB_Stats(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + + stats := db.Stats() + if stats.TxStats.PageCount != 2 { + t.Fatalf("unexpected TxStats.PageCount: %d", stats.TxStats.PageCount) + } else if stats.FreePageN != 0 { + t.Fatalf("unexpected FreePageN != 0: %d", stats.FreePageN) + } else if stats.PendingPageN != 2 { + t.Fatalf("unexpected PendingPageN != 2: %d", stats.PendingPageN) + } +} + +// Ensure that database pages are in expected order and type. +func TestDB_Consistency(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + + for i := 0; i < 10; i++ { + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.Bucket([]byte("widgets")).Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + } + + if err := db.Update(func(tx *bolt.Tx) error { + if p, _ := tx.Page(0); p == nil { + t.Fatal("expected page") + } else if p.Type != "meta" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(1); p == nil { + t.Fatal("expected page") + } else if p.Type != "meta" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(2); p == nil { + t.Fatal("expected page") + } else if p.Type != "free" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(3); p == nil { + t.Fatal("expected page") + } else if p.Type != "free" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(4); p == nil { + t.Fatal("expected page") + } else if p.Type != "leaf" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(5); p == nil { + t.Fatal("expected page") + } else if p.Type != "freelist" { + t.Fatalf("unexpected page type: %s", p.Type) + } + + if p, _ := tx.Page(6); p != nil { + t.Fatal("unexpected page") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that DB stats can be subtracted from one another. +func TestDBStats_Sub(t *testing.T) { + var a, b bolt.Stats + a.TxStats.PageCount = 3 + a.FreePageN = 4 + b.TxStats.PageCount = 10 + b.FreePageN = 14 + diff := b.Sub(&a) + if diff.TxStats.PageCount != 7 { + t.Fatalf("unexpected TxStats.PageCount: %d", diff.TxStats.PageCount) + } + + // free page stats are copied from the receiver and not subtracted + if diff.FreePageN != 14 { + t.Fatalf("unexpected FreePageN: %d", diff.FreePageN) + } +} + +// Ensure two functions can perform updates in a single batch. +func TestDB_Batch(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Iterate over multiple updates in separate goroutines. + n := 2 + ch := make(chan error) + for i := 0; i < n; i++ { + go func(i int) { + ch <- db.Batch(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Put(u64tob(uint64(i)), []byte{}) + }) + }(i) + } + + // Check all responses to make sure there's no error. + for i := 0; i < n; i++ { + if err := <-ch; err != nil { + t.Fatal(err) + } + } + + // Ensure data is correct. + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 0; i < n; i++ { + if v := b.Get(u64tob(uint64(i))); v == nil { + t.Errorf("key not found: %d", i) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +func TestDB_Batch_Panic(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var sentinel int + var bork = &sentinel + var problem interface{} + var err error + + // Execute a function inside a batch that panics. + func() { + defer func() { + if p := recover(); p != nil { + problem = p + } + }() + err = db.Batch(func(tx *bolt.Tx) error { + panic(bork) + }) + }() + + // Verify there is no error. + if g, e := err, error(nil); g != e { + t.Fatalf("wrong error: %v != %v", g, e) + } + // Verify the panic was captured. + if g, e := problem, bork; g != e { + t.Fatalf("wrong error: %v != %v", g, e) + } +} + +func TestDB_BatchFull(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + + const size = 3 + // buffered so we never leak goroutines + ch := make(chan error, size) + put := func(i int) { + ch <- db.Batch(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Put(u64tob(uint64(i)), []byte{}) + }) + } + + db.MaxBatchSize = size + // high enough to never trigger here + db.MaxBatchDelay = 1 * time.Hour + + go put(1) + go put(2) + + // Give the batch a chance to exhibit bugs. + time.Sleep(10 * time.Millisecond) + + // not triggered yet + select { + case <-ch: + t.Fatalf("batch triggered too early") + default: + } + + go put(3) + + // Check all responses to make sure there's no error. + for i := 0; i < size; i++ { + if err := <-ch; err != nil { + t.Fatal(err) + } + } + + // Ensure data is correct. + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 1; i <= size; i++ { + if v := b.Get(u64tob(uint64(i))); v == nil { + t.Errorf("key not found: %d", i) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +func TestDB_BatchTime(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + t.Fatal(err) + } + + const size = 1 + // buffered so we never leak goroutines + ch := make(chan error, size) + put := func(i int) { + ch <- db.Batch(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Put(u64tob(uint64(i)), []byte{}) + }) + } + + db.MaxBatchSize = 1000 + db.MaxBatchDelay = 0 + + go put(1) + + // Batch must trigger by time alone. + + // Check all responses to make sure there's no error. + for i := 0; i < size; i++ { + if err := <-ch; err != nil { + t.Fatal(err) + } + } + + // Ensure data is correct. + if err := db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("widgets")) + for i := 1; i <= size; i++ { + if v := b.Get(u64tob(uint64(i))); v == nil { + t.Errorf("key not found: %d", i) + } + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +func ExampleDB_Update() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Execute several commands within a read-write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + return err + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + return err + } + return nil + }); err != nil { + log.Fatal(err) + } + + // Read the value back from a separate read-only transaction. + if err := db.View(func(tx *bolt.Tx) error { + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + fmt.Printf("The value of 'foo' is: %s\n", value) + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release the file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // The value of 'foo' is: bar +} + +func ExampleDB_View() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Insert data into a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("people")) + if err != nil { + return err + } + if err := b.Put([]byte("john"), []byte("doe")); err != nil { + return err + } + if err := b.Put([]byte("susy"), []byte("que")); err != nil { + return err + } + return nil + }); err != nil { + log.Fatal(err) + } + + // Access data from within a read-only transactional block. + if err := db.View(func(tx *bolt.Tx) error { + v := tx.Bucket([]byte("people")).Get([]byte("john")) + fmt.Printf("John's last name is %s.\n", v) + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release the file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // John's last name is doe. +} + +func ExampleDB_Begin_ReadOnly() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Create a bucket using a read-write transaction. + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + log.Fatal(err) + } + + // Create several keys in a transaction. + tx, err := db.Begin(true) + if err != nil { + log.Fatal(err) + } + b := tx.Bucket([]byte("widgets")) + if err := b.Put([]byte("john"), []byte("blue")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("abby"), []byte("red")); err != nil { + log.Fatal(err) + } + if err := b.Put([]byte("zephyr"), []byte("purple")); err != nil { + log.Fatal(err) + } + if err := tx.Commit(); err != nil { + log.Fatal(err) + } + + // Iterate over the values in sorted key order. + tx, err = db.Begin(false) + if err != nil { + log.Fatal(err) + } + c := tx.Bucket([]byte("widgets")).Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + fmt.Printf("%s likes %s\n", k, v) + } + + if err := tx.Rollback(); err != nil { + log.Fatal(err) + } + + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // abby likes red + // john likes blue + // zephyr likes purple +} + +func BenchmarkDBBatchAutomatic(b *testing.B) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("bench")) + return err + }); err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + start := make(chan struct{}) + var wg sync.WaitGroup + + for round := 0; round < 1000; round++ { + wg.Add(1) + + go func(id uint32) { + defer wg.Done() + <-start + + h := fnv.New32a() + buf := make([]byte, 4) + binary.LittleEndian.PutUint32(buf, id) + _, _ = h.Write(buf[:]) + k := h.Sum(nil) + insert := func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("bench")) + return b.Put(k, []byte("filler")) + } + if err := db.Batch(insert); err != nil { + b.Error(err) + return + } + }(uint32(round)) + } + close(start) + wg.Wait() + } + + b.StopTimer() + validateBatchBench(b, db) +} + +func BenchmarkDBBatchSingle(b *testing.B) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("bench")) + return err + }); err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + start := make(chan struct{}) + var wg sync.WaitGroup + + for round := 0; round < 1000; round++ { + wg.Add(1) + go func(id uint32) { + defer wg.Done() + <-start + + h := fnv.New32a() + buf := make([]byte, 4) + binary.LittleEndian.PutUint32(buf, id) + _, _ = h.Write(buf[:]) + k := h.Sum(nil) + insert := func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("bench")) + return b.Put(k, []byte("filler")) + } + if err := db.Update(insert); err != nil { + b.Error(err) + return + } + }(uint32(round)) + } + close(start) + wg.Wait() + } + + b.StopTimer() + validateBatchBench(b, db) +} + +func BenchmarkDBBatchManual10x100(b *testing.B) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("bench")) + return err + }); err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + start := make(chan struct{}) + var wg sync.WaitGroup + + for major := 0; major < 10; major++ { + wg.Add(1) + go func(id uint32) { + defer wg.Done() + <-start + + insert100 := func(tx *bolt.Tx) error { + h := fnv.New32a() + buf := make([]byte, 4) + for minor := uint32(0); minor < 100; minor++ { + binary.LittleEndian.PutUint32(buf, uint32(id*100+minor)) + h.Reset() + _, _ = h.Write(buf[:]) + k := h.Sum(nil) + b := tx.Bucket([]byte("bench")) + if err := b.Put(k, []byte("filler")); err != nil { + return err + } + } + return nil + } + if err := db.Update(insert100); err != nil { + b.Fatal(err) + } + }(uint32(major)) + } + close(start) + wg.Wait() + } + + b.StopTimer() + validateBatchBench(b, db) +} + +func validateBatchBench(b *testing.B, db *DB) { + var rollback = errors.New("sentinel error to cause rollback") + validate := func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte("bench")) + h := fnv.New32a() + buf := make([]byte, 4) + for id := uint32(0); id < 1000; id++ { + binary.LittleEndian.PutUint32(buf, id) + h.Reset() + _, _ = h.Write(buf[:]) + k := h.Sum(nil) + v := bucket.Get(k) + if v == nil { + b.Errorf("not found id=%d key=%x", id, k) + continue + } + if g, e := v, []byte("filler"); !bytes.Equal(g, e) { + b.Errorf("bad value for id=%d key=%x: %s != %q", id, k, g, e) + } + if err := bucket.Delete(k); err != nil { + return err + } + } + // should be empty now + c := bucket.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + b.Errorf("unexpected key: %x = %q", k, v) + } + return rollback + } + if err := db.Update(validate); err != nil && err != rollback { + b.Error(err) + } +} + +// DB is a test wrapper for bolt.DB. +type DB struct { + *bolt.DB +} + +// MustOpenDB returns a new, open DB at a temporary location. +func MustOpenDB() *DB { + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + panic(err) + } + return &DB{db} +} + +// Close closes the database and deletes the underlying file. +func (db *DB) Close() error { + // Log statistics. + if *statsFlag { + db.PrintStats() + } + + // Check database consistency after every test. + db.MustCheck() + + // Close database and remove file. + defer os.Remove(db.Path()) + return db.DB.Close() +} + +// MustClose closes the database and deletes the underlying file. Panic on error. +func (db *DB) MustClose() { + if err := db.Close(); err != nil { + panic(err) + } +} + +// PrintStats prints the database stats +func (db *DB) PrintStats() { + var stats = db.Stats() + fmt.Printf("[db] %-20s %-20s %-20s\n", + fmt.Sprintf("pg(%d/%d)", stats.TxStats.PageCount, stats.TxStats.PageAlloc), + fmt.Sprintf("cur(%d)", stats.TxStats.CursorCount), + fmt.Sprintf("node(%d/%d)", stats.TxStats.NodeCount, stats.TxStats.NodeDeref), + ) + fmt.Printf(" %-20s %-20s %-20s\n", + fmt.Sprintf("rebal(%d/%v)", stats.TxStats.Rebalance, truncDuration(stats.TxStats.RebalanceTime)), + fmt.Sprintf("spill(%d/%v)", stats.TxStats.Spill, truncDuration(stats.TxStats.SpillTime)), + fmt.Sprintf("w(%d/%v)", stats.TxStats.Write, truncDuration(stats.TxStats.WriteTime)), + ) +} + +// MustCheck runs a consistency check on the database and panics if any errors are found. +func (db *DB) MustCheck() { + if err := db.Update(func(tx *bolt.Tx) error { + // Collect all the errors. + var errors []error + for err := range tx.Check() { + errors = append(errors, err) + if len(errors) > 10 { + break + } + } + + // If errors occurred, copy the DB and print the errors. + if len(errors) > 0 { + var path = tempfile() + if err := tx.CopyFile(path, 0600); err != nil { + panic(err) + } + + // Print errors. + fmt.Print("\n\n") + fmt.Printf("consistency check failed (%d errors)\n", len(errors)) + for _, err := range errors { + fmt.Println(err) + } + fmt.Println("") + fmt.Println("db saved to:") + fmt.Println(path) + fmt.Print("\n\n") + os.Exit(-1) + } + + return nil + }); err != nil && err != bolt.ErrDatabaseNotOpen { + panic(err) + } +} + +// CopyTempFile copies a database to a temporary file. +func (db *DB) CopyTempFile() { + path := tempfile() + if err := db.View(func(tx *bolt.Tx) error { + return tx.CopyFile(path, 0600) + }); err != nil { + panic(err) + } + fmt.Println("db copied to: ", path) +} + +// tempfile returns a temporary file path. +func tempfile() string { + f, err := ioutil.TempFile("", "bolt-") + if err != nil { + panic(err) + } + if err := f.Close(); err != nil { + panic(err) + } + if err := os.Remove(f.Name()); err != nil { + panic(err) + } + return f.Name() +} + +// mustContainKeys checks that a bucket contains a given set of keys. +func mustContainKeys(b *bolt.Bucket, m map[string]string) { + found := make(map[string]string) + if err := b.ForEach(func(k, _ []byte) error { + found[string(k)] = "" + return nil + }); err != nil { + panic(err) + } + + // Check for keys found in bucket that shouldn't be there. + var keys []string + for k, _ := range found { + if _, ok := m[string(k)]; !ok { + keys = append(keys, k) + } + } + if len(keys) > 0 { + sort.Strings(keys) + panic(fmt.Sprintf("keys found(%d): %s", len(keys), strings.Join(keys, ","))) + } + + // Check for keys not found in bucket that should be there. + for k, _ := range m { + if _, ok := found[string(k)]; !ok { + keys = append(keys, k) + } + } + if len(keys) > 0 { + sort.Strings(keys) + panic(fmt.Sprintf("keys not found(%d): %s", len(keys), strings.Join(keys, ","))) + } +} + +func trunc(b []byte, length int) []byte { + if length < len(b) { + return b[:length] + } + return b +} + +func truncDuration(d time.Duration) string { + return regexp.MustCompile(`^(\d+)(\.\d+)`).ReplaceAllString(d.String(), "$1") +} + +func fileSize(path string) int64 { + fi, err := os.Stat(path) + if err != nil { + return 0 + } + return fi.Size() +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +// u64tob converts a uint64 into an 8-byte slice. +func u64tob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, v) + return b +} + +// btou64 converts an 8-byte slice into an uint64. +func btou64(b []byte) uint64 { return binary.BigEndian.Uint64(b) } diff --git a/vendor/src/github.com/boltdb/bolt/doc.go b/vendor/src/github.com/boltdb/bolt/doc.go new file mode 100644 index 0000000..cc93784 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/doc.go @@ -0,0 +1,44 @@ +/* +Package bolt implements a low-level key/value store in pure Go. It supports +fully serializable transactions, ACID semantics, and lock-free MVCC with +multiple readers and a single writer. Bolt can be used for projects that +want a simple data store without the need to add large dependencies such as +Postgres or MySQL. + +Bolt is a single-level, zero-copy, B+tree data store. This means that Bolt is +optimized for fast read access and does not require recovery in the event of a +system crash. Transactions which have not finished committing will simply be +rolled back in the event of a crash. + +The design of Bolt is based on Howard Chu's LMDB database project. + +Bolt currently works on Windows, Mac OS X, and Linux. + + +Basics + +There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is +a collection of buckets and is represented by a single file on disk. A bucket is +a collection of unique keys that are associated with values. + +Transactions provide either read-only or read-write access to the database. +Read-only transactions can retrieve key/value pairs and can use Cursors to +iterate over the dataset sequentially. Read-write transactions can create and +delete buckets and can insert and remove keys. Only one read-write transaction +is allowed at a time. + + +Caveats + +The database uses a read-only, memory-mapped data file to ensure that +applications cannot corrupt the database, however, this means that keys and +values returned from Bolt cannot be changed. Writing to a read-only byte slice +will cause Go to panic. + +Keys and values retrieved from the database are only valid for the life of +the transaction. When used outside the transaction, these byte slices can +point to different data or can point to invalid memory which will cause a panic. + + +*/ +package bolt diff --git a/vendor/src/github.com/boltdb/bolt/errors.go b/vendor/src/github.com/boltdb/bolt/errors.go new file mode 100644 index 0000000..a3620a3 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/errors.go @@ -0,0 +1,71 @@ +package bolt + +import "errors" + +// These errors can be returned when opening or calling methods on a DB. +var ( + // ErrDatabaseNotOpen is returned when a DB instance is accessed before it + // is opened or after it is closed. + ErrDatabaseNotOpen = errors.New("database not open") + + // ErrDatabaseOpen is returned when opening a database that is + // already open. + ErrDatabaseOpen = errors.New("database already open") + + // ErrInvalid is returned when both meta pages on a database are invalid. + // This typically occurs when a file is not a bolt database. + ErrInvalid = errors.New("invalid database") + + // ErrVersionMismatch is returned when the data file was created with a + // different version of Bolt. + ErrVersionMismatch = errors.New("version mismatch") + + // ErrChecksum is returned when either meta page checksum does not match. + ErrChecksum = errors.New("checksum error") + + // ErrTimeout is returned when a database cannot obtain an exclusive lock + // on the data file after the timeout passed to Open(). + ErrTimeout = errors.New("timeout") +) + +// These errors can occur when beginning or committing a Tx. +var ( + // ErrTxNotWritable is returned when performing a write operation on a + // read-only transaction. + ErrTxNotWritable = errors.New("tx not writable") + + // ErrTxClosed is returned when committing or rolling back a transaction + // that has already been committed or rolled back. + ErrTxClosed = errors.New("tx closed") + + // ErrDatabaseReadOnly is returned when a mutating transaction is started on a + // read-only database. + ErrDatabaseReadOnly = errors.New("database is in read-only mode") +) + +// These errors can occur when putting or deleting a value or a bucket. +var ( + // ErrBucketNotFound is returned when trying to access a bucket that has + // not been created yet. + ErrBucketNotFound = errors.New("bucket not found") + + // ErrBucketExists is returned when creating a bucket that already exists. + ErrBucketExists = errors.New("bucket already exists") + + // ErrBucketNameRequired is returned when creating a bucket with a blank name. + ErrBucketNameRequired = errors.New("bucket name required") + + // ErrKeyRequired is returned when inserting a zero-length key. + ErrKeyRequired = errors.New("key required") + + // ErrKeyTooLarge is returned when inserting a key that is larger than MaxKeySize. + ErrKeyTooLarge = errors.New("key too large") + + // ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize. + ErrValueTooLarge = errors.New("value too large") + + // ErrIncompatibleValue is returned when trying create or delete a bucket + // on an existing non-bucket key or when trying to create or delete a + // non-bucket key on an existing bucket key. + ErrIncompatibleValue = errors.New("incompatible value") +) diff --git a/vendor/src/github.com/boltdb/bolt/freelist.go b/vendor/src/github.com/boltdb/bolt/freelist.go new file mode 100644 index 0000000..0161948 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/freelist.go @@ -0,0 +1,242 @@ +package bolt + +import ( + "fmt" + "sort" + "unsafe" +) + +// freelist represents a list of all pages that are available for allocation. +// It also tracks pages that have been freed but are still in use by open transactions. +type freelist struct { + ids []pgid // all free and available free page ids. + pending map[txid][]pgid // mapping of soon-to-be free page ids by tx. + cache map[pgid]bool // fast lookup of all free and pending page ids. +} + +// newFreelist returns an empty, initialized freelist. +func newFreelist() *freelist { + return &freelist{ + pending: make(map[txid][]pgid), + cache: make(map[pgid]bool), + } +} + +// size returns the size of the page after serialization. +func (f *freelist) size() int { + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * f.count()) +} + +// count returns count of pages on the freelist +func (f *freelist) count() int { + return f.free_count() + f.pending_count() +} + +// free_count returns count of free pages +func (f *freelist) free_count() int { + return len(f.ids) +} + +// pending_count returns count of pending pages +func (f *freelist) pending_count() int { + var count int + for _, list := range f.pending { + count += len(list) + } + return count +} + +// all returns a list of all free ids and all pending ids in one sorted list. +func (f *freelist) all() []pgid { + m := make(pgids, 0) + + for _, list := range f.pending { + m = append(m, list...) + } + + sort.Sort(m) + return pgids(f.ids).merge(m) +} + +// allocate returns the starting page id of a contiguous list of pages of a given size. +// If a contiguous block cannot be found then 0 is returned. +func (f *freelist) allocate(n int) pgid { + if len(f.ids) == 0 { + return 0 + } + + var initial, previd pgid + for i, id := range f.ids { + if id <= 1 { + panic(fmt.Sprintf("invalid page allocation: %d", id)) + } + + // Reset initial page if this is not contiguous. + if previd == 0 || id-previd != 1 { + initial = id + } + + // If we found a contiguous block then remove it and return it. + if (id-initial)+1 == pgid(n) { + // If we're allocating off the beginning then take the fast path + // and just adjust the existing slice. This will use extra memory + // temporarily but the append() in free() will realloc the slice + // as is necessary. + if (i + 1) == n { + f.ids = f.ids[i+1:] + } else { + copy(f.ids[i-n+1:], f.ids[i+1:]) + f.ids = f.ids[:len(f.ids)-n] + } + + // Remove from the free cache. + for i := pgid(0); i < pgid(n); i++ { + delete(f.cache, initial+i) + } + + return initial + } + + previd = id + } + return 0 +} + +// free releases a page and its overflow for a given transaction id. +// If the page is already free then a panic will occur. +func (f *freelist) free(txid txid, p *page) { + if p.id <= 1 { + panic(fmt.Sprintf("cannot free page 0 or 1: %d", p.id)) + } + + // Free page and all its overflow pages. + var ids = f.pending[txid] + for id := p.id; id <= p.id+pgid(p.overflow); id++ { + // Verify that page is not already free. + if f.cache[id] { + panic(fmt.Sprintf("page %d already freed", id)) + } + + // Add to the freelist and cache. + ids = append(ids, id) + f.cache[id] = true + } + f.pending[txid] = ids +} + +// release moves all page ids for a transaction id (or older) to the freelist. +func (f *freelist) release(txid txid) { + m := make(pgids, 0) + for tid, ids := range f.pending { + if tid <= txid { + // Move transaction's pending pages to the available freelist. + // Don't remove from the cache since the page is still free. + m = append(m, ids...) + delete(f.pending, tid) + } + } + sort.Sort(m) + f.ids = pgids(f.ids).merge(m) +} + +// rollback removes the pages from a given pending tx. +func (f *freelist) rollback(txid txid) { + // Remove page ids from cache. + for _, id := range f.pending[txid] { + delete(f.cache, id) + } + + // Remove pages from pending list. + delete(f.pending, txid) +} + +// freed returns whether a given page is in the free list. +func (f *freelist) freed(pgid pgid) bool { + return f.cache[pgid] +} + +// read initializes the freelist from a freelist page. +func (f *freelist) read(p *page) { + // If the page.count is at the max uint16 value (64k) then it's considered + // an overflow and the size of the freelist is stored as the first element. + idx, count := 0, int(p.count) + if count == 0xFFFF { + idx = 1 + count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0]) + } + + // Copy the list of page ids from the freelist. + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + f.ids = make([]pgid, len(ids)) + copy(f.ids, ids) + + // Make sure they're sorted. + sort.Sort(pgids(f.ids)) + + // Rebuild the page cache. + f.reindex() +} + +// write writes the page ids onto a freelist page. All free and pending ids are +// saved to disk since in the event of a program crash, all pending ids will +// become free. +func (f *freelist) write(p *page) error { + // Combine the old free pgids and pgids waiting on an open transaction. + ids := f.all() + + // Update the header flag. + p.flags |= freelistPageFlag + + // The page.count can only hold up to 64k elements so if we overflow that + // number then we handle it by putting the size in the first element. + if len(ids) < 0xFFFF { + p.count = uint16(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids) + } else { + p.count = 0xFFFF + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:], ids) + } + + return nil +} + +// reload reads the freelist from a page and filters out pending items. +func (f *freelist) reload(p *page) { + f.read(p) + + // Build a cache of only pending pages. + pcache := make(map[pgid]bool) + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + pcache[pendingID] = true + } + } + + // Check each page in the freelist and build a new available freelist + // with any pages not in the pending lists. + var a []pgid + for _, id := range f.ids { + if !pcache[id] { + a = append(a, id) + } + } + f.ids = a + + // Once the available list is rebuilt then rebuild the free cache so that + // it includes the available and pending free pages. + f.reindex() +} + +// reindex rebuilds the free cache based on available and pending free lists. +func (f *freelist) reindex() { + f.cache = make(map[pgid]bool) + for _, id := range f.ids { + f.cache[id] = true + } + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + f.cache[pendingID] = true + } + } +} diff --git a/vendor/src/github.com/boltdb/bolt/freelist_test.go b/vendor/src/github.com/boltdb/bolt/freelist_test.go new file mode 100644 index 0000000..4e9b3a8 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/freelist_test.go @@ -0,0 +1,158 @@ +package bolt + +import ( + "math/rand" + "reflect" + "sort" + "testing" + "unsafe" +) + +// Ensure that a page is added to a transaction's freelist. +func TestFreelist_free(t *testing.T) { + f := newFreelist() + f.free(100, &page{id: 12}) + if !reflect.DeepEqual([]pgid{12}, f.pending[100]) { + t.Fatalf("exp=%v; got=%v", []pgid{12}, f.pending[100]) + } +} + +// Ensure that a page and its overflow is added to a transaction's freelist. +func TestFreelist_free_overflow(t *testing.T) { + f := newFreelist() + f.free(100, &page{id: 12, overflow: 3}) + if exp := []pgid{12, 13, 14, 15}; !reflect.DeepEqual(exp, f.pending[100]) { + t.Fatalf("exp=%v; got=%v", exp, f.pending[100]) + } +} + +// Ensure that a transaction's free pages can be released. +func TestFreelist_release(t *testing.T) { + f := newFreelist() + f.free(100, &page{id: 12, overflow: 1}) + f.free(100, &page{id: 9}) + f.free(102, &page{id: 39}) + f.release(100) + f.release(101) + if exp := []pgid{9, 12, 13}; !reflect.DeepEqual(exp, f.ids) { + t.Fatalf("exp=%v; got=%v", exp, f.ids) + } + + f.release(102) + if exp := []pgid{9, 12, 13, 39}; !reflect.DeepEqual(exp, f.ids) { + t.Fatalf("exp=%v; got=%v", exp, f.ids) + } +} + +// Ensure that a freelist can find contiguous blocks of pages. +func TestFreelist_allocate(t *testing.T) { + f := &freelist{ids: []pgid{3, 4, 5, 6, 7, 9, 12, 13, 18}} + if id := int(f.allocate(3)); id != 3 { + t.Fatalf("exp=3; got=%v", id) + } + if id := int(f.allocate(1)); id != 6 { + t.Fatalf("exp=6; got=%v", id) + } + if id := int(f.allocate(3)); id != 0 { + t.Fatalf("exp=0; got=%v", id) + } + if id := int(f.allocate(2)); id != 12 { + t.Fatalf("exp=12; got=%v", id) + } + if id := int(f.allocate(1)); id != 7 { + t.Fatalf("exp=7; got=%v", id) + } + if id := int(f.allocate(0)); id != 0 { + t.Fatalf("exp=0; got=%v", id) + } + if id := int(f.allocate(0)); id != 0 { + t.Fatalf("exp=0; got=%v", id) + } + if exp := []pgid{9, 18}; !reflect.DeepEqual(exp, f.ids) { + t.Fatalf("exp=%v; got=%v", exp, f.ids) + } + + if id := int(f.allocate(1)); id != 9 { + t.Fatalf("exp=9; got=%v", id) + } + if id := int(f.allocate(1)); id != 18 { + t.Fatalf("exp=18; got=%v", id) + } + if id := int(f.allocate(1)); id != 0 { + t.Fatalf("exp=0; got=%v", id) + } + if exp := []pgid{}; !reflect.DeepEqual(exp, f.ids) { + t.Fatalf("exp=%v; got=%v", exp, f.ids) + } +} + +// Ensure that a freelist can deserialize from a freelist page. +func TestFreelist_read(t *testing.T) { + // Create a page. + var buf [4096]byte + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = freelistPageFlag + page.count = 2 + + // Insert 2 page ids. + ids := (*[3]pgid)(unsafe.Pointer(&page.ptr)) + ids[0] = 23 + ids[1] = 50 + + // Deserialize page into a freelist. + f := newFreelist() + f.read(page) + + // Ensure that there are two page ids in the freelist. + if exp := []pgid{23, 50}; !reflect.DeepEqual(exp, f.ids) { + t.Fatalf("exp=%v; got=%v", exp, f.ids) + } +} + +// Ensure that a freelist can serialize into a freelist page. +func TestFreelist_write(t *testing.T) { + // Create a freelist and write it to a page. + var buf [4096]byte + f := &freelist{ids: []pgid{12, 39}, pending: make(map[txid][]pgid)} + f.pending[100] = []pgid{28, 11} + f.pending[101] = []pgid{3} + p := (*page)(unsafe.Pointer(&buf[0])) + if err := f.write(p); err != nil { + t.Fatal(err) + } + + // Read the page back out. + f2 := newFreelist() + f2.read(p) + + // Ensure that the freelist is correct. + // All pages should be present and in reverse order. + if exp := []pgid{3, 11, 12, 28, 39}; !reflect.DeepEqual(exp, f2.ids) { + t.Fatalf("exp=%v; got=%v", exp, f2.ids) + } +} + +func Benchmark_FreelistRelease10K(b *testing.B) { benchmark_FreelistRelease(b, 10000) } +func Benchmark_FreelistRelease100K(b *testing.B) { benchmark_FreelistRelease(b, 100000) } +func Benchmark_FreelistRelease1000K(b *testing.B) { benchmark_FreelistRelease(b, 1000000) } +func Benchmark_FreelistRelease10000K(b *testing.B) { benchmark_FreelistRelease(b, 10000000) } + +func benchmark_FreelistRelease(b *testing.B, size int) { + ids := randomPgids(size) + pending := randomPgids(len(ids) / 400) + b.ResetTimer() + for i := 0; i < b.N; i++ { + f := &freelist{ids: ids, pending: map[txid][]pgid{1: pending}} + f.release(1) + } +} + +func randomPgids(n int) []pgid { + rand.Seed(42) + pgids := make(pgids, n) + for i := range pgids { + pgids[i] = pgid(rand.Int63()) + } + sort.Sort(pgids) + return pgids +} diff --git a/vendor/src/github.com/boltdb/bolt/node.go b/vendor/src/github.com/boltdb/bolt/node.go new file mode 100644 index 0000000..e9d64af --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/node.go @@ -0,0 +1,599 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" + "unsafe" +) + +// node represents an in-memory, deserialized page. +type node struct { + bucket *Bucket + isLeaf bool + unbalanced bool + spilled bool + key []byte + pgid pgid + parent *node + children nodes + inodes inodes +} + +// root returns the top-level node this node is attached to. +func (n *node) root() *node { + if n.parent == nil { + return n + } + return n.parent.root() +} + +// minKeys returns the minimum number of inodes this node should have. +func (n *node) minKeys() int { + if n.isLeaf { + return 1 + } + return 2 +} + +// size returns the size of the node after serialization. +func (n *node) size() int { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + } + return sz +} + +// sizeLessThan returns true if the node is less than a given size. +// This is an optimization to avoid calculating a large node when we only need +// to know if it fits inside a certain page size. +func (n *node) sizeLessThan(v int) bool { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + if sz >= v { + return false + } + } + return true +} + +// pageElementSize returns the size of each page element based on the type of node. +func (n *node) pageElementSize() int { + if n.isLeaf { + return leafPageElementSize + } + return branchPageElementSize +} + +// childAt returns the child node at a given index. +func (n *node) childAt(index int) *node { + if n.isLeaf { + panic(fmt.Sprintf("invalid childAt(%d) on a leaf node", index)) + } + return n.bucket.node(n.inodes[index].pgid, n) +} + +// childIndex returns the index of a given child node. +func (n *node) childIndex(child *node) int { + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, child.key) != -1 }) + return index +} + +// numChildren returns the number of children. +func (n *node) numChildren() int { + return len(n.inodes) +} + +// nextSibling returns the next node with the same parent. +func (n *node) nextSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index >= n.parent.numChildren()-1 { + return nil + } + return n.parent.childAt(index + 1) +} + +// prevSibling returns the previous node with the same parent. +func (n *node) prevSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index == 0 { + return nil + } + return n.parent.childAt(index - 1) +} + +// put inserts a key/value. +func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + if pgid >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) + } else if len(oldKey) <= 0 { + panic("put: zero-length old key") + } else if len(newKey) <= 0 { + panic("put: zero-length new key") + } + + // Find insertion index. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) + + // Add capacity and shift nodes if we don't have an exact match and need to insert. + exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey)) + if !exact { + n.inodes = append(n.inodes, inode{}) + copy(n.inodes[index+1:], n.inodes[index:]) + } + + inode := &n.inodes[index] + inode.flags = flags + inode.key = newKey + inode.value = value + inode.pgid = pgid + _assert(len(inode.key) > 0, "put: zero-length inode key") +} + +// del removes a key from the node. +func (n *node) del(key []byte) { + // Find index of key. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, key) != -1 }) + + // Exit if the key isn't found. + if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].key, key) { + return + } + + // Delete inode from the node. + n.inodes = append(n.inodes[:index], n.inodes[index+1:]...) + + // Mark the node as needing rebalancing. + n.unbalanced = true +} + +// read initializes the node from a page. +func (n *node) read(p *page) { + n.pgid = p.id + n.isLeaf = ((p.flags & leafPageFlag) != 0) + n.inodes = make(inodes, int(p.count)) + + for i := 0; i < int(p.count); i++ { + inode := &n.inodes[i] + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + inode.flags = elem.flags + inode.key = elem.key() + inode.value = elem.value() + } else { + elem := p.branchPageElement(uint16(i)) + inode.pgid = elem.pgid + inode.key = elem.key() + } + _assert(len(inode.key) > 0, "read: zero-length inode key") + } + + // Save first key so we can find the node in the parent when we spill. + if len(n.inodes) > 0 { + n.key = n.inodes[0].key + _assert(len(n.key) > 0, "read: zero-length node key") + } else { + n.key = nil + } +} + +// write writes the items onto one or more pages. +func (n *node) write(p *page) { + // Initialize page. + if n.isLeaf { + p.flags |= leafPageFlag + } else { + p.flags |= branchPageFlag + } + + if len(n.inodes) >= 0xFFFF { + panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.id)) + } + p.count = uint16(len(n.inodes)) + + // Loop over each item and write it to the page. + b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):] + for i, item := range n.inodes { + _assert(len(item.key) > 0, "write: zero-length inode key") + + // Write the page element. + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.flags = item.flags + elem.ksize = uint32(len(item.key)) + elem.vsize = uint32(len(item.value)) + } else { + elem := p.branchPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.ksize = uint32(len(item.key)) + elem.pgid = item.pgid + _assert(elem.pgid != p.id, "write: circular dependency occurred") + } + + // If the length of key+value is larger than the max allocation size + // then we need to reallocate the byte array pointer. + // + // See: https://github.com/boltdb/bolt/pull/335 + klen, vlen := len(item.key), len(item.value) + if len(b) < klen+vlen { + b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:] + } + + // Write data for the element to the end of the page. + copy(b[0:], item.key) + b = b[klen:] + copy(b[0:], item.value) + b = b[vlen:] + } + + // DEBUG ONLY: n.dump() +} + +// split breaks up a node into multiple smaller nodes, if appropriate. +// This should only be called from the spill() function. +func (n *node) split(pageSize int) []*node { + var nodes []*node + + node := n + for { + // Split node into two. + a, b := node.splitTwo(pageSize) + nodes = append(nodes, a) + + // If we can't split then exit the loop. + if b == nil { + break + } + + // Set node to b so it gets split on the next iteration. + node = b + } + + return nodes +} + +// splitTwo breaks up a node into two smaller nodes, if appropriate. +// This should only be called from the split() function. +func (n *node) splitTwo(pageSize int) (*node, *node) { + // Ignore the split if the page doesn't have at least enough nodes for + // two pages or if the nodes can fit in a single page. + if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) { + return n, nil + } + + // Determine the threshold before starting a new node. + var fillPercent = n.bucket.FillPercent + if fillPercent < minFillPercent { + fillPercent = minFillPercent + } else if fillPercent > maxFillPercent { + fillPercent = maxFillPercent + } + threshold := int(float64(pageSize) * fillPercent) + + // Determine split position and sizes of the two pages. + splitIndex, _ := n.splitIndex(threshold) + + // Split node into two separate nodes. + // If there's no parent then we'll need to create one. + if n.parent == nil { + n.parent = &node{bucket: n.bucket, children: []*node{n}} + } + + // Create a new node and add it to the parent. + next := &node{bucket: n.bucket, isLeaf: n.isLeaf, parent: n.parent} + n.parent.children = append(n.parent.children, next) + + // Split inodes across two nodes. + next.inodes = n.inodes[splitIndex:] + n.inodes = n.inodes[:splitIndex] + + // Update the statistics. + n.bucket.tx.stats.Split++ + + return n, next +} + +// splitIndex finds the position where a page will fill a given threshold. +// It returns the index as well as the size of the first page. +// This is only be called from split(). +func (n *node) splitIndex(threshold int) (index, sz int) { + sz = pageHeaderSize + + // Loop until we only have the minimum number of keys required for the second page. + for i := 0; i < len(n.inodes)-minKeysPerPage; i++ { + index = i + inode := n.inodes[i] + elsize := n.pageElementSize() + len(inode.key) + len(inode.value) + + // If we have at least the minimum number of keys and adding another + // node would put us over the threshold then exit and return. + if i >= minKeysPerPage && sz+elsize > threshold { + break + } + + // Add the element size to the total size. + sz += elsize + } + + return +} + +// spill writes the nodes to dirty pages and splits nodes as it goes. +// Returns an error if dirty pages cannot be allocated. +func (n *node) spill() error { + var tx = n.bucket.tx + if n.spilled { + return nil + } + + // Spill child nodes first. Child nodes can materialize sibling nodes in + // the case of split-merge so we cannot use a range loop. We have to check + // the children size on every loop iteration. + sort.Sort(n.children) + for i := 0; i < len(n.children); i++ { + if err := n.children[i].spill(); err != nil { + return err + } + } + + // We no longer need the child list because it's only used for spill tracking. + n.children = nil + + // Split nodes into appropriate sizes. The first node will always be n. + var nodes = n.split(tx.db.pageSize) + for _, node := range nodes { + // Add node's page to the freelist if it's not new. + if node.pgid > 0 { + tx.db.freelist.free(tx.meta.txid, tx.page(node.pgid)) + node.pgid = 0 + } + + // Allocate contiguous space for the node. + p, err := tx.allocate((node.size() / tx.db.pageSize) + 1) + if err != nil { + return err + } + + // Write the node. + if p.id >= tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid)) + } + node.pgid = p.id + node.write(p) + node.spilled = true + + // Insert into parent inodes. + if node.parent != nil { + var key = node.key + if key == nil { + key = node.inodes[0].key + } + + node.parent.put(key, node.inodes[0].key, nil, node.pgid, 0) + node.key = node.inodes[0].key + _assert(len(node.key) > 0, "spill: zero-length node key") + } + + // Update the statistics. + tx.stats.Spill++ + } + + // If the root node split and created a new root then we need to spill that + // as well. We'll clear out the children to make sure it doesn't try to respill. + if n.parent != nil && n.parent.pgid == 0 { + n.children = nil + return n.parent.spill() + } + + return nil +} + +// rebalance attempts to combine the node with sibling nodes if the node fill +// size is below a threshold or if there are not enough keys. +func (n *node) rebalance() { + if !n.unbalanced { + return + } + n.unbalanced = false + + // Update statistics. + n.bucket.tx.stats.Rebalance++ + + // Ignore if node is above threshold (25%) and has enough keys. + var threshold = n.bucket.tx.db.pageSize / 4 + if n.size() > threshold && len(n.inodes) > n.minKeys() { + return + } + + // Root node has special handling. + if n.parent == nil { + // If root node is a branch and only has one node then collapse it. + if !n.isLeaf && len(n.inodes) == 1 { + // Move root's child up. + child := n.bucket.node(n.inodes[0].pgid, n) + n.isLeaf = child.isLeaf + n.inodes = child.inodes[:] + n.children = child.children + + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent = n + } + } + + // Remove old child. + child.parent = nil + delete(n.bucket.nodes, child.pgid) + child.free() + } + + return + } + + // If node has no keys then just remove it. + if n.numChildren() == 0 { + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + n.parent.rebalance() + return + } + + _assert(n.parent.numChildren() > 1, "parent must have at least 2 children") + + // Destination node is right sibling if idx == 0, otherwise left sibling. + var target *node + var useNextSibling = (n.parent.childIndex(n) == 0) + if useNextSibling { + target = n.nextSibling() + } else { + target = n.prevSibling() + } + + // If both this node and the target node are too small then merge them. + if useNextSibling { + // Reparent all child nodes being moved. + for _, inode := range target.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = n + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes from target and remove target. + n.inodes = append(n.inodes, target.inodes...) + n.parent.del(target.key) + n.parent.removeChild(target) + delete(n.bucket.nodes, target.pgid) + target.free() + } else { + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = target + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes to target and remove node. + target.inodes = append(target.inodes, n.inodes...) + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + } + + // Either this node or the target node was deleted from the parent so rebalance it. + n.parent.rebalance() +} + +// removes a node from the list of in-memory children. +// This does not affect the inodes. +func (n *node) removeChild(target *node) { + for i, child := range n.children { + if child == target { + n.children = append(n.children[:i], n.children[i+1:]...) + return + } + } +} + +// dereference causes the node to copy all its inode key/value references to heap memory. +// This is required when the mmap is reallocated so inodes are not pointing to stale data. +func (n *node) dereference() { + if n.key != nil { + key := make([]byte, len(n.key)) + copy(key, n.key) + n.key = key + _assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") + } + + for i := range n.inodes { + inode := &n.inodes[i] + + key := make([]byte, len(inode.key)) + copy(key, inode.key) + inode.key = key + _assert(len(inode.key) > 0, "dereference: zero-length inode key") + + value := make([]byte, len(inode.value)) + copy(value, inode.value) + inode.value = value + } + + // Recursively dereference children. + for _, child := range n.children { + child.dereference() + } + + // Update statistics. + n.bucket.tx.stats.NodeDeref++ +} + +// free adds the node's underlying page to the freelist. +func (n *node) free() { + if n.pgid != 0 { + n.bucket.tx.db.freelist.free(n.bucket.tx.meta.txid, n.bucket.tx.page(n.pgid)) + n.pgid = 0 + } +} + +// dump writes the contents of the node to STDERR for debugging purposes. +/* +func (n *node) dump() { + // Write node header. + var typ = "branch" + if n.isLeaf { + typ = "leaf" + } + warnf("[NODE %d {type=%s count=%d}]", n.pgid, typ, len(n.inodes)) + + // Write out abbreviated version of each item. + for _, item := range n.inodes { + if n.isLeaf { + if item.flags&bucketLeafFlag != 0 { + bucket := (*bucket)(unsafe.Pointer(&item.value[0])) + warnf("+L %08x -> (bucket root=%d)", trunc(item.key, 4), bucket.root) + } else { + warnf("+L %08x -> %08x", trunc(item.key, 4), trunc(item.value, 4)) + } + } else { + warnf("+B %08x -> pgid=%d", trunc(item.key, 4), item.pgid) + } + } + warn("") +} +*/ + +type nodes []*node + +func (s nodes) Len() int { return len(s) } +func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 } + +// inode represents an internal node inside of a node. +// It can be used to point to elements in a page or point +// to an element which hasn't been added to a page yet. +type inode struct { + flags uint32 + pgid pgid + key []byte + value []byte +} + +type inodes []inode diff --git a/vendor/src/github.com/boltdb/bolt/node_test.go b/vendor/src/github.com/boltdb/bolt/node_test.go new file mode 100644 index 0000000..fa5d10f --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/node_test.go @@ -0,0 +1,156 @@ +package bolt + +import ( + "testing" + "unsafe" +) + +// Ensure that a node can insert a key/value. +func TestNode_put(t *testing.T) { + n := &node{inodes: make(inodes, 0), bucket: &Bucket{tx: &Tx{meta: &meta{pgid: 1}}}} + n.put([]byte("baz"), []byte("baz"), []byte("2"), 0, 0) + n.put([]byte("foo"), []byte("foo"), []byte("0"), 0, 0) + n.put([]byte("bar"), []byte("bar"), []byte("1"), 0, 0) + n.put([]byte("foo"), []byte("foo"), []byte("3"), 0, leafPageFlag) + + if len(n.inodes) != 3 { + t.Fatalf("exp=3; got=%d", len(n.inodes)) + } + if k, v := n.inodes[0].key, n.inodes[0].value; string(k) != "bar" || string(v) != "1" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if k, v := n.inodes[1].key, n.inodes[1].value; string(k) != "baz" || string(v) != "2" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if k, v := n.inodes[2].key, n.inodes[2].value; string(k) != "foo" || string(v) != "3" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if n.inodes[2].flags != uint32(leafPageFlag) { + t.Fatalf("not a leaf: %d", n.inodes[2].flags) + } +} + +// Ensure that a node can deserialize from a leaf page. +func TestNode_read_LeafPage(t *testing.T) { + // Create a page. + var buf [4096]byte + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = leafPageFlag + page.count = 2 + + // Insert 2 elements at the beginning. sizeof(leafPageElement) == 16 + nodes := (*[3]leafPageElement)(unsafe.Pointer(&page.ptr)) + nodes[0] = leafPageElement{flags: 0, pos: 32, ksize: 3, vsize: 4} // pos = sizeof(leafPageElement) * 2 + nodes[1] = leafPageElement{flags: 0, pos: 23, ksize: 10, vsize: 3} // pos = sizeof(leafPageElement) + 3 + 4 + + // Write data for the nodes at the end. + data := (*[4096]byte)(unsafe.Pointer(&nodes[2])) + copy(data[:], []byte("barfooz")) + copy(data[7:], []byte("helloworldbye")) + + // Deserialize page into a leaf. + n := &node{} + n.read(page) + + // Check that there are two inodes with correct data. + if !n.isLeaf { + t.Fatal("expected leaf") + } + if len(n.inodes) != 2 { + t.Fatalf("exp=2; got=%d", len(n.inodes)) + } + if k, v := n.inodes[0].key, n.inodes[0].value; string(k) != "bar" || string(v) != "fooz" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if k, v := n.inodes[1].key, n.inodes[1].value; string(k) != "helloworld" || string(v) != "bye" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } +} + +// Ensure that a node can serialize into a leaf page. +func TestNode_write_LeafPage(t *testing.T) { + // Create a node. + n := &node{isLeaf: true, inodes: make(inodes, 0), bucket: &Bucket{tx: &Tx{db: &DB{}, meta: &meta{pgid: 1}}}} + n.put([]byte("susy"), []byte("susy"), []byte("que"), 0, 0) + n.put([]byte("ricki"), []byte("ricki"), []byte("lake"), 0, 0) + n.put([]byte("john"), []byte("john"), []byte("johnson"), 0, 0) + + // Write it to a page. + var buf [4096]byte + p := (*page)(unsafe.Pointer(&buf[0])) + n.write(p) + + // Read the page back in. + n2 := &node{} + n2.read(p) + + // Check that the two pages are the same. + if len(n2.inodes) != 3 { + t.Fatalf("exp=3; got=%d", len(n2.inodes)) + } + if k, v := n2.inodes[0].key, n2.inodes[0].value; string(k) != "john" || string(v) != "johnson" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if k, v := n2.inodes[1].key, n2.inodes[1].value; string(k) != "ricki" || string(v) != "lake" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } + if k, v := n2.inodes[2].key, n2.inodes[2].value; string(k) != "susy" || string(v) != "que" { + t.Fatalf("exp=; got=<%s,%s>", k, v) + } +} + +// Ensure that a node can split into appropriate subgroups. +func TestNode_split(t *testing.T) { + // Create a node. + n := &node{inodes: make(inodes, 0), bucket: &Bucket{tx: &Tx{db: &DB{}, meta: &meta{pgid: 1}}}} + n.put([]byte("00000001"), []byte("00000001"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000002"), []byte("00000002"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000003"), []byte("00000003"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000004"), []byte("00000004"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000005"), []byte("00000005"), []byte("0123456701234567"), 0, 0) + + // Split between 2 & 3. + n.split(100) + + var parent = n.parent + if len(parent.children) != 2 { + t.Fatalf("exp=2; got=%d", len(parent.children)) + } + if len(parent.children[0].inodes) != 2 { + t.Fatalf("exp=2; got=%d", len(parent.children[0].inodes)) + } + if len(parent.children[1].inodes) != 3 { + t.Fatalf("exp=3; got=%d", len(parent.children[1].inodes)) + } +} + +// Ensure that a page with the minimum number of inodes just returns a single node. +func TestNode_split_MinKeys(t *testing.T) { + // Create a node. + n := &node{inodes: make(inodes, 0), bucket: &Bucket{tx: &Tx{db: &DB{}, meta: &meta{pgid: 1}}}} + n.put([]byte("00000001"), []byte("00000001"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000002"), []byte("00000002"), []byte("0123456701234567"), 0, 0) + + // Split. + n.split(20) + if n.parent != nil { + t.Fatalf("expected nil parent") + } +} + +// Ensure that a node that has keys that all fit on a page just returns one leaf. +func TestNode_split_SinglePage(t *testing.T) { + // Create a node. + n := &node{inodes: make(inodes, 0), bucket: &Bucket{tx: &Tx{db: &DB{}, meta: &meta{pgid: 1}}}} + n.put([]byte("00000001"), []byte("00000001"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000002"), []byte("00000002"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000003"), []byte("00000003"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000004"), []byte("00000004"), []byte("0123456701234567"), 0, 0) + n.put([]byte("00000005"), []byte("00000005"), []byte("0123456701234567"), 0, 0) + + // Split. + n.split(4096) + if n.parent != nil { + t.Fatalf("expected nil parent") + } +} diff --git a/vendor/src/github.com/boltdb/bolt/page.go b/vendor/src/github.com/boltdb/bolt/page.go new file mode 100644 index 0000000..4a55528 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/page.go @@ -0,0 +1,172 @@ +package bolt + +import ( + "fmt" + "os" + "sort" + "unsafe" +) + +const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr)) + +const minKeysPerPage = 2 + +const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{})) +const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{})) + +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +const ( + bucketLeafFlag = 0x01 +) + +type pgid uint64 + +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// typ returns a human readable page type string used for debugging. +func (p *page) typ() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// meta returns a pointer to the metadata section of the page. +func (p *page) meta() *meta { + return (*meta)(unsafe.Pointer(&p.ptr)) +} + +// leafPageElement retrieves the leaf node by index +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// leafPageElements retrieves a list of leaf nodes. +func (p *page) leafPageElements() []leafPageElement { + return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// branchPageElement retrieves the branch node by index +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// branchPageElements retrieves a list of branch nodes. +func (p *page) branchPageElements() []branchPageElement { + return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// dump writes n bytes of the page to STDERR as hex output. +func (p *page) hexdump(n int) { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n] + fmt.Fprintf(os.Stderr, "%x\n", buf) +} + +type pages []*page + +func (s pages) Len() int { return len(s) } +func (s pages) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pages) Less(i, j int) bool { return s[i].id < s[j].id } + +// branchPageElement represents a node on a branch page. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// key returns a byte slice of the node key. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] +} + +// leafPageElement represents a node on a leaf page. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// key returns a byte slice of the node key. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] +} + +// value returns a byte slice of the node value. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] +} + +// PageInfo represents human readable information about a page. +type PageInfo struct { + ID int + Type string + Count int + OverflowCount int +} + +type pgids []pgid + +func (s pgids) Len() int { return len(s) } +func (s pgids) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pgids) Less(i, j int) bool { return s[i] < s[j] } + +// merge returns the sorted union of a and b. +func (a pgids) merge(b pgids) pgids { + // Return the opposite slice if one is nil. + if len(a) == 0 { + return b + } else if len(b) == 0 { + return a + } + + // Create a list to hold all elements from both lists. + merged := make(pgids, 0, len(a)+len(b)) + + // Assign lead to the slice with a lower starting value, follow to the higher value. + lead, follow := a, b + if b[0] < a[0] { + lead, follow = b, a + } + + // Continue while there are elements in the lead. + for len(lead) > 0 { + // Merge largest prefix of lead that is ahead of follow[0]. + n := sort.Search(len(lead), func(i int) bool { return lead[i] > follow[0] }) + merged = append(merged, lead[:n]...) + if n >= len(lead) { + break + } + + // Swap lead and follow. + lead, follow = follow, lead[n:] + } + + // Append what's left in follow. + merged = append(merged, follow...) + + return merged +} diff --git a/vendor/src/github.com/boltdb/bolt/page_test.go b/vendor/src/github.com/boltdb/bolt/page_test.go new file mode 100644 index 0000000..59f4a30 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/page_test.go @@ -0,0 +1,72 @@ +package bolt + +import ( + "reflect" + "sort" + "testing" + "testing/quick" +) + +// Ensure that the page type can be returned in human readable format. +func TestPage_typ(t *testing.T) { + if typ := (&page{flags: branchPageFlag}).typ(); typ != "branch" { + t.Fatalf("exp=branch; got=%v", typ) + } + if typ := (&page{flags: leafPageFlag}).typ(); typ != "leaf" { + t.Fatalf("exp=leaf; got=%v", typ) + } + if typ := (&page{flags: metaPageFlag}).typ(); typ != "meta" { + t.Fatalf("exp=meta; got=%v", typ) + } + if typ := (&page{flags: freelistPageFlag}).typ(); typ != "freelist" { + t.Fatalf("exp=freelist; got=%v", typ) + } + if typ := (&page{flags: 20000}).typ(); typ != "unknown<4e20>" { + t.Fatalf("exp=unknown<4e20>; got=%v", typ) + } +} + +// Ensure that the hexdump debugging function doesn't blow up. +func TestPage_dump(t *testing.T) { + (&page{id: 256}).hexdump(16) +} + +func TestPgids_merge(t *testing.T) { + a := pgids{4, 5, 6, 10, 11, 12, 13, 27} + b := pgids{1, 3, 8, 9, 25, 30} + c := a.merge(b) + if !reflect.DeepEqual(c, pgids{1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 25, 27, 30}) { + t.Errorf("mismatch: %v", c) + } + + a = pgids{4, 5, 6, 10, 11, 12, 13, 27, 35, 36} + b = pgids{8, 9, 25, 30} + c = a.merge(b) + if !reflect.DeepEqual(c, pgids{4, 5, 6, 8, 9, 10, 11, 12, 13, 25, 27, 30, 35, 36}) { + t.Errorf("mismatch: %v", c) + } +} + +func TestPgids_merge_quick(t *testing.T) { + if err := quick.Check(func(a, b pgids) bool { + // Sort incoming lists. + sort.Sort(a) + sort.Sort(b) + + // Merge the two lists together. + got := a.merge(b) + + // The expected value should be the two lists combined and sorted. + exp := append(a, b...) + sort.Sort(exp) + + if !reflect.DeepEqual(exp, got) { + t.Errorf("\nexp=%+v\ngot=%+v\n", exp, got) + return false + } + + return true + }, nil); err != nil { + t.Fatal(err) + } +} diff --git a/vendor/src/github.com/boltdb/bolt/quick_test.go b/vendor/src/github.com/boltdb/bolt/quick_test.go new file mode 100644 index 0000000..4da5817 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/quick_test.go @@ -0,0 +1,79 @@ +package bolt_test + +import ( + "bytes" + "flag" + "fmt" + "math/rand" + "os" + "reflect" + "testing/quick" + "time" +) + +// testing/quick defaults to 5 iterations and a random seed. +// You can override these settings from the command line: +// +// -quick.count The number of iterations to perform. +// -quick.seed The seed to use for randomizing. +// -quick.maxitems The maximum number of items to insert into a DB. +// -quick.maxksize The maximum size of a key. +// -quick.maxvsize The maximum size of a value. +// + +var qcount, qseed, qmaxitems, qmaxksize, qmaxvsize int + +func init() { + flag.IntVar(&qcount, "quick.count", 5, "") + flag.IntVar(&qseed, "quick.seed", int(time.Now().UnixNano())%100000, "") + flag.IntVar(&qmaxitems, "quick.maxitems", 1000, "") + flag.IntVar(&qmaxksize, "quick.maxksize", 1024, "") + flag.IntVar(&qmaxvsize, "quick.maxvsize", 1024, "") + flag.Parse() + fmt.Fprintln(os.Stderr, "seed:", qseed) + fmt.Fprintf(os.Stderr, "quick settings: count=%v, items=%v, ksize=%v, vsize=%v\n", qcount, qmaxitems, qmaxksize, qmaxvsize) +} + +func qconfig() *quick.Config { + return &quick.Config{ + MaxCount: qcount, + Rand: rand.New(rand.NewSource(int64(qseed))), + } +} + +type testdata []testdataitem + +func (t testdata) Len() int { return len(t) } +func (t testdata) Swap(i, j int) { t[i], t[j] = t[j], t[i] } +func (t testdata) Less(i, j int) bool { return bytes.Compare(t[i].Key, t[j].Key) == -1 } + +func (t testdata) Generate(rand *rand.Rand, size int) reflect.Value { + n := rand.Intn(qmaxitems-1) + 1 + items := make(testdata, n) + for i := 0; i < n; i++ { + item := &items[i] + item.Key = randByteSlice(rand, 1, qmaxksize) + item.Value = randByteSlice(rand, 0, qmaxvsize) + } + return reflect.ValueOf(items) +} + +type revtestdata []testdataitem + +func (t revtestdata) Len() int { return len(t) } +func (t revtestdata) Swap(i, j int) { t[i], t[j] = t[j], t[i] } +func (t revtestdata) Less(i, j int) bool { return bytes.Compare(t[i].Key, t[j].Key) == 1 } + +type testdataitem struct { + Key []byte + Value []byte +} + +func randByteSlice(rand *rand.Rand, minSize, maxSize int) []byte { + n := rand.Intn(maxSize-minSize) + minSize + b := make([]byte, n) + for i := 0; i < n; i++ { + b[i] = byte(rand.Intn(255)) + } + return b +} diff --git a/vendor/src/github.com/boltdb/bolt/simulation_test.go b/vendor/src/github.com/boltdb/bolt/simulation_test.go new file mode 100644 index 0000000..3831016 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/simulation_test.go @@ -0,0 +1,329 @@ +package bolt_test + +import ( + "bytes" + "fmt" + "math/rand" + "sync" + "testing" + + "github.com/boltdb/bolt" +) + +func TestSimulate_1op_1p(t *testing.T) { testSimulate(t, 1, 1) } +func TestSimulate_10op_1p(t *testing.T) { testSimulate(t, 10, 1) } +func TestSimulate_100op_1p(t *testing.T) { testSimulate(t, 100, 1) } +func TestSimulate_1000op_1p(t *testing.T) { testSimulate(t, 1000, 1) } +func TestSimulate_10000op_1p(t *testing.T) { testSimulate(t, 10000, 1) } + +func TestSimulate_10op_10p(t *testing.T) { testSimulate(t, 10, 10) } +func TestSimulate_100op_10p(t *testing.T) { testSimulate(t, 100, 10) } +func TestSimulate_1000op_10p(t *testing.T) { testSimulate(t, 1000, 10) } +func TestSimulate_10000op_10p(t *testing.T) { testSimulate(t, 10000, 10) } + +func TestSimulate_100op_100p(t *testing.T) { testSimulate(t, 100, 100) } +func TestSimulate_1000op_100p(t *testing.T) { testSimulate(t, 1000, 100) } +func TestSimulate_10000op_100p(t *testing.T) { testSimulate(t, 10000, 100) } + +func TestSimulate_10000op_1000p(t *testing.T) { testSimulate(t, 10000, 1000) } + +// Randomly generate operations on a given database with multiple clients to ensure consistency and thread safety. +func testSimulate(t *testing.T, threadCount, parallelism int) { + if testing.Short() { + t.Skip("skipping test in short mode.") + } + + rand.Seed(int64(qseed)) + + // A list of operations that readers and writers can perform. + var readerHandlers = []simulateHandler{simulateGetHandler} + var writerHandlers = []simulateHandler{simulateGetHandler, simulatePutHandler} + + var versions = make(map[int]*QuickDB) + versions[1] = NewQuickDB() + + db := MustOpenDB() + defer db.MustClose() + + var mutex sync.Mutex + + // Run n threads in parallel, each with their own operation. + var wg sync.WaitGroup + var threads = make(chan bool, parallelism) + var i int + for { + threads <- true + wg.Add(1) + writable := ((rand.Int() % 100) < 20) // 20% writers + + // Choose an operation to execute. + var handler simulateHandler + if writable { + handler = writerHandlers[rand.Intn(len(writerHandlers))] + } else { + handler = readerHandlers[rand.Intn(len(readerHandlers))] + } + + // Execute a thread for the given operation. + go func(writable bool, handler simulateHandler) { + defer wg.Done() + + // Start transaction. + tx, err := db.Begin(writable) + if err != nil { + t.Fatal("tx begin: ", err) + } + + // Obtain current state of the dataset. + mutex.Lock() + var qdb = versions[tx.ID()] + if writable { + qdb = versions[tx.ID()-1].Copy() + } + mutex.Unlock() + + // Make sure we commit/rollback the tx at the end and update the state. + if writable { + defer func() { + mutex.Lock() + versions[tx.ID()] = qdb + mutex.Unlock() + + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + }() + } else { + defer func() { _ = tx.Rollback() }() + } + + // Ignore operation if we don't have data yet. + if qdb == nil { + return + } + + // Execute handler. + handler(tx, qdb) + + // Release a thread back to the scheduling loop. + <-threads + }(writable, handler) + + i++ + if i > threadCount { + break + } + } + + // Wait until all threads are done. + wg.Wait() +} + +type simulateHandler func(tx *bolt.Tx, qdb *QuickDB) + +// Retrieves a key from the database and verifies that it is what is expected. +func simulateGetHandler(tx *bolt.Tx, qdb *QuickDB) { + // Randomly retrieve an existing exist. + keys := qdb.Rand() + if len(keys) == 0 { + return + } + + // Retrieve root bucket. + b := tx.Bucket(keys[0]) + if b == nil { + panic(fmt.Sprintf("bucket[0] expected: %08x\n", trunc(keys[0], 4))) + } + + // Drill into nested buckets. + for _, key := range keys[1 : len(keys)-1] { + b = b.Bucket(key) + if b == nil { + panic(fmt.Sprintf("bucket[n] expected: %v -> %v\n", keys, key)) + } + } + + // Verify key/value on the final bucket. + expected := qdb.Get(keys) + actual := b.Get(keys[len(keys)-1]) + if !bytes.Equal(actual, expected) { + fmt.Println("=== EXPECTED ===") + fmt.Println(expected) + fmt.Println("=== ACTUAL ===") + fmt.Println(actual) + fmt.Println("=== END ===") + panic("value mismatch") + } +} + +// Inserts a key into the database. +func simulatePutHandler(tx *bolt.Tx, qdb *QuickDB) { + var err error + keys, value := randKeys(), randValue() + + // Retrieve root bucket. + b := tx.Bucket(keys[0]) + if b == nil { + b, err = tx.CreateBucket(keys[0]) + if err != nil { + panic("create bucket: " + err.Error()) + } + } + + // Create nested buckets, if necessary. + for _, key := range keys[1 : len(keys)-1] { + child := b.Bucket(key) + if child != nil { + b = child + } else { + b, err = b.CreateBucket(key) + if err != nil { + panic("create bucket: " + err.Error()) + } + } + } + + // Insert into database. + if err := b.Put(keys[len(keys)-1], value); err != nil { + panic("put: " + err.Error()) + } + + // Insert into in-memory database. + qdb.Put(keys, value) +} + +// QuickDB is an in-memory database that replicates the functionality of the +// Bolt DB type except that it is entirely in-memory. It is meant for testing +// that the Bolt database is consistent. +type QuickDB struct { + sync.RWMutex + m map[string]interface{} +} + +// NewQuickDB returns an instance of QuickDB. +func NewQuickDB() *QuickDB { + return &QuickDB{m: make(map[string]interface{})} +} + +// Get retrieves the value at a key path. +func (db *QuickDB) Get(keys [][]byte) []byte { + db.RLock() + defer db.RUnlock() + + m := db.m + for _, key := range keys[:len(keys)-1] { + value := m[string(key)] + if value == nil { + return nil + } + switch value := value.(type) { + case map[string]interface{}: + m = value + case []byte: + return nil + } + } + + // Only return if it's a simple value. + if value, ok := m[string(keys[len(keys)-1])].([]byte); ok { + return value + } + return nil +} + +// Put inserts a value into a key path. +func (db *QuickDB) Put(keys [][]byte, value []byte) { + db.Lock() + defer db.Unlock() + + // Build buckets all the way down the key path. + m := db.m + for _, key := range keys[:len(keys)-1] { + if _, ok := m[string(key)].([]byte); ok { + return // Keypath intersects with a simple value. Do nothing. + } + + if m[string(key)] == nil { + m[string(key)] = make(map[string]interface{}) + } + m = m[string(key)].(map[string]interface{}) + } + + // Insert value into the last key. + m[string(keys[len(keys)-1])] = value +} + +// Rand returns a random key path that points to a simple value. +func (db *QuickDB) Rand() [][]byte { + db.RLock() + defer db.RUnlock() + if len(db.m) == 0 { + return nil + } + var keys [][]byte + db.rand(db.m, &keys) + return keys +} + +func (db *QuickDB) rand(m map[string]interface{}, keys *[][]byte) { + i, index := 0, rand.Intn(len(m)) + for k, v := range m { + if i == index { + *keys = append(*keys, []byte(k)) + if v, ok := v.(map[string]interface{}); ok { + db.rand(v, keys) + } + return + } + i++ + } + panic("quickdb rand: out-of-range") +} + +// Copy copies the entire database. +func (db *QuickDB) Copy() *QuickDB { + db.RLock() + defer db.RUnlock() + return &QuickDB{m: db.copy(db.m)} +} + +func (db *QuickDB) copy(m map[string]interface{}) map[string]interface{} { + clone := make(map[string]interface{}, len(m)) + for k, v := range m { + switch v := v.(type) { + case map[string]interface{}: + clone[k] = db.copy(v) + default: + clone[k] = v + } + } + return clone +} + +func randKey() []byte { + var min, max = 1, 1024 + n := rand.Intn(max-min) + min + b := make([]byte, n) + for i := 0; i < n; i++ { + b[i] = byte(rand.Intn(255)) + } + return b +} + +func randKeys() [][]byte { + var keys [][]byte + var count = rand.Intn(2) + 2 + for i := 0; i < count; i++ { + keys = append(keys, randKey()) + } + return keys +} + +func randValue() []byte { + n := rand.Intn(8192) + b := make([]byte, n) + for i := 0; i < n; i++ { + b[i] = byte(rand.Intn(255)) + } + return b +} diff --git a/vendor/src/github.com/boltdb/bolt/tx.go b/vendor/src/github.com/boltdb/bolt/tx.go new file mode 100644 index 0000000..1cfb4cd --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/tx.go @@ -0,0 +1,682 @@ +package bolt + +import ( + "fmt" + "io" + "os" + "sort" + "strings" + "time" + "unsafe" +) + +// txid represents the internal transaction identifier. +type txid uint64 + +// Tx represents a read-only or read/write transaction on the database. +// Read-only transactions can be used for retrieving values for keys and creating cursors. +// Read/write transactions can create and remove buckets and create and remove keys. +// +// IMPORTANT: You must commit or rollback transactions when you are done with +// them. Pages can not be reclaimed by the writer until no more transactions +// are using them. A long running read transaction can cause the database to +// quickly grow. +type Tx struct { + writable bool + managed bool + db *DB + meta *meta + root Bucket + pages map[pgid]*page + stats TxStats + commitHandlers []func() + + // WriteFlag specifies the flag for write-related methods like WriteTo(). + // Tx opens the database file with the specified flag to copy the data. + // + // By default, the flag is unset, which works well for mostly in-memory + // workloads. For databases that are much larger than available RAM, + // set the flag to syscall.O_DIRECT to avoid trashing the page cache. + WriteFlag int +} + +// init initializes the transaction. +func (tx *Tx) init(db *DB) { + tx.db = db + tx.pages = nil + + // Copy the meta page since it can be changed by the writer. + tx.meta = &meta{} + db.meta().copy(tx.meta) + + // Copy over the root bucket. + tx.root = newBucket(tx) + tx.root.bucket = &bucket{} + *tx.root.bucket = tx.meta.root + + // Increment the transaction id and add a page cache for writable transactions. + if tx.writable { + tx.pages = make(map[pgid]*page) + tx.meta.txid += txid(1) + } +} + +// ID returns the transaction id. +func (tx *Tx) ID() int { + return int(tx.meta.txid) +} + +// DB returns a reference to the database that created the transaction. +func (tx *Tx) DB() *DB { + return tx.db +} + +// Size returns current database size in bytes as seen by this transaction. +func (tx *Tx) Size() int64 { + return int64(tx.meta.pgid) * int64(tx.db.pageSize) +} + +// Writable returns whether the transaction can perform write operations. +func (tx *Tx) Writable() bool { + return tx.writable +} + +// Cursor creates a cursor associated with the root bucket. +// All items in the cursor will return a nil value because all root bucket keys point to buckets. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (tx *Tx) Cursor() *Cursor { + return tx.root.Cursor() +} + +// Stats retrieves a copy of the current transaction statistics. +func (tx *Tx) Stats() TxStats { + return tx.stats +} + +// Bucket retrieves a bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) Bucket(name []byte) *Bucket { + return tx.root.Bucket(name) +} + +// CreateBucket creates a new bucket. +// Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucket(name []byte) (*Bucket, error) { + return tx.root.CreateBucket(name) +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucketIfNotExists(name []byte) (*Bucket, error) { + return tx.root.CreateBucketIfNotExists(name) +} + +// DeleteBucket deletes a bucket. +// Returns an error if the bucket cannot be found or if the key represents a non-bucket value. +func (tx *Tx) DeleteBucket(name []byte) error { + return tx.root.DeleteBucket(name) +} + +// ForEach executes a function for each bucket in the root. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. +func (tx *Tx) ForEach(fn func(name []byte, b *Bucket) error) error { + return tx.root.ForEach(func(k, v []byte) error { + if err := fn(k, tx.root.Bucket(k)); err != nil { + return err + } + return nil + }) +} + +// OnCommit adds a handler function to be executed after the transaction successfully commits. +func (tx *Tx) OnCommit(fn func()) { + tx.commitHandlers = append(tx.commitHandlers, fn) +} + +// Commit writes all changes to disk and updates the meta page. +// Returns an error if a disk write error occurs, or if Commit is +// called on a read-only transaction. +func (tx *Tx) Commit() error { + _assert(!tx.managed, "managed tx commit not allowed") + if tx.db == nil { + return ErrTxClosed + } else if !tx.writable { + return ErrTxNotWritable + } + + // TODO(benbjohnson): Use vectorized I/O to write out dirty pages. + + // Rebalance nodes which have had deletions. + var startTime = time.Now() + tx.root.rebalance() + if tx.stats.Rebalance > 0 { + tx.stats.RebalanceTime += time.Since(startTime) + } + + // spill data onto dirty pages. + startTime = time.Now() + if err := tx.root.spill(); err != nil { + tx.rollback() + return err + } + tx.stats.SpillTime += time.Since(startTime) + + // Free the old root bucket. + tx.meta.root.root = tx.root.root + + opgid := tx.meta.pgid + + // Free the freelist and allocate new pages for it. This will overestimate + // the size of the freelist but not underestimate the size (which would be bad). + tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist)) + p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) + if err != nil { + tx.rollback() + return err + } + if err := tx.db.freelist.write(p); err != nil { + tx.rollback() + return err + } + tx.meta.freelist = p.id + + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + + // Write dirty pages to disk. + startTime = time.Now() + if err := tx.write(); err != nil { + tx.rollback() + return err + } + + // If strict mode is enabled then perform a consistency check. + // Only the first consistency error is reported in the panic. + if tx.db.StrictMode { + ch := tx.Check() + var errs []string + for { + err, ok := <-ch + if !ok { + break + } + errs = append(errs, err.Error()) + } + if len(errs) > 0 { + panic("check fail: " + strings.Join(errs, "\n")) + } + } + + // Write meta to disk. + if err := tx.writeMeta(); err != nil { + tx.rollback() + return err + } + tx.stats.WriteTime += time.Since(startTime) + + // Finalize the transaction. + tx.close() + + // Execute commit handlers now that the locks have been removed. + for _, fn := range tx.commitHandlers { + fn() + } + + return nil +} + +// Rollback closes the transaction and ignores all previous updates. Read-only +// transactions must be rolled back and not committed. +func (tx *Tx) Rollback() error { + _assert(!tx.managed, "managed tx rollback not allowed") + if tx.db == nil { + return ErrTxClosed + } + tx.rollback() + return nil +} + +func (tx *Tx) rollback() { + if tx.db == nil { + return + } + if tx.writable { + tx.db.freelist.rollback(tx.meta.txid) + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } + tx.close() +} + +func (tx *Tx) close() { + if tx.db == nil { + return + } + if tx.writable { + // Grab freelist stats. + var freelistFreeN = tx.db.freelist.free_count() + var freelistPendingN = tx.db.freelist.pending_count() + var freelistAlloc = tx.db.freelist.size() + + // Remove transaction ref & writer lock. + tx.db.rwtx = nil + tx.db.rwlock.Unlock() + + // Merge statistics. + tx.db.statlock.Lock() + tx.db.stats.FreePageN = freelistFreeN + tx.db.stats.PendingPageN = freelistPendingN + tx.db.stats.FreeAlloc = (freelistFreeN + freelistPendingN) * tx.db.pageSize + tx.db.stats.FreelistInuse = freelistAlloc + tx.db.stats.TxStats.add(&tx.stats) + tx.db.statlock.Unlock() + } else { + tx.db.removeTx(tx) + } + + // Clear all references. + tx.db = nil + tx.meta = nil + tx.root = Bucket{tx: tx} + tx.pages = nil +} + +// Copy writes the entire database to a writer. +// This function exists for backwards compatibility. Use WriteTo() instead. +func (tx *Tx) Copy(w io.Writer) error { + _, err := tx.WriteTo(w) + return err +} + +// WriteTo writes the entire database to a writer. +// If err == nil then exactly tx.Size() bytes will be written into the writer. +func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { + // Attempt to open reader with WriteFlag + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0) + if err != nil { + return 0, err + } + defer func() { _ = f.Close() }() + + // Generate a meta page. We use the same page data for both meta pages. + buf := make([]byte, tx.db.pageSize) + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = metaPageFlag + *page.meta() = *tx.meta + + // Write meta 0. + page.id = 0 + page.meta().checksum = page.meta().sum64() + nn, err := w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 0 copy: %s", err) + } + + // Write meta 1 with a lower transaction id. + page.id = 1 + page.meta().txid -= 1 + page.meta().checksum = page.meta().sum64() + nn, err = w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 1 copy: %s", err) + } + + // Move past the meta pages in the file. + if _, err := f.Seek(int64(tx.db.pageSize*2), os.SEEK_SET); err != nil { + return n, fmt.Errorf("seek: %s", err) + } + + // Copy data pages. + wn, err := io.CopyN(w, f, tx.Size()-int64(tx.db.pageSize*2)) + n += wn + if err != nil { + return n, err + } + + return n, f.Close() +} + +// CopyFile copies the entire database to file at the given path. +// A reader transaction is maintained during the copy so it is safe to continue +// using the database while a copy is in progress. +func (tx *Tx) CopyFile(path string, mode os.FileMode) error { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode) + if err != nil { + return err + } + + err = tx.Copy(f) + if err != nil { + _ = f.Close() + return err + } + return f.Close() +} + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + ch := make(chan error) + go tx.check(ch) + return ch +} + +func (tx *Tx) check(ch chan error) { + // Check if any pages are double freed. + freed := make(map[pgid]bool) + for _, id := range tx.db.freelist.all() { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, 0, func(p *page, _ int) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references", int(id)) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) + } + }) + + // Check each bucket within this bucket. + _ = b.ForEach(func(k, v []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, ch) + } + return nil + }) +} + +// allocate returns a contiguous block of memory starting at a given page. +func (tx *Tx) allocate(count int) (*page, error) { + p, err := tx.db.allocate(count) + if err != nil { + return nil, err + } + + // Save to our page cache. + tx.pages[p.id] = p + + // Update statistics. + tx.stats.PageCount++ + tx.stats.PageAlloc += count * tx.db.pageSize + + return p, nil +} + +// write writes any dirty pages to disk. +func (tx *Tx) write() error { + // Sort pages by id. + pages := make(pages, 0, len(tx.pages)) + for _, p := range tx.pages { + pages = append(pages, p) + } + // Clear out page cache early. + tx.pages = make(map[pgid]*page) + sort.Sort(pages) + + // Write pages to disk in order. + for _, p := range pages { + size := (int(p.overflow) + 1) * tx.db.pageSize + offset := int64(p.id) * int64(tx.db.pageSize) + + // Write out page in "max allocation" sized chunks. + ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p)) + for { + // Limit our write to our max allocation size. + sz := size + if sz > maxAllocSize-1 { + sz = maxAllocSize - 1 + } + + // Write chunk to disk. + buf := ptr[:sz] + if _, err := tx.db.ops.writeAt(buf, offset); err != nil { + return err + } + + // Update statistics. + tx.stats.Write++ + + // Exit inner for loop if we've written all the chunks. + size -= sz + if size == 0 { + break + } + + // Otherwise move offset forward and move pointer to next chunk. + offset += int64(sz) + ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz])) + } + } + + // Ignore file sync if flag is set on DB. + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Put small pages back to page pool. + for _, p := range pages { + // Ignore page sizes over 1 page. + // These are allocated using make() instead of the page pool. + if int(p.overflow) != 0 { + continue + } + + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize] + + // See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1 + for i := range buf { + buf[i] = 0 + } + tx.db.pagePool.Put(buf) + } + + return nil +} + +// writeMeta writes the meta to the disk. +func (tx *Tx) writeMeta() error { + // Create a temporary buffer for the meta page. + buf := make([]byte, tx.db.pageSize) + p := tx.db.pageInBuffer(buf, 0) + tx.meta.write(p) + + // Write the meta page to file. + if _, err := tx.db.ops.writeAt(buf, int64(p.id)*int64(tx.db.pageSize)); err != nil { + return err + } + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Update statistics. + tx.stats.Write++ + + return nil +} + +// page returns a reference to the page with a given id. +// If page has been written to then a temporary buffered page is returned. +func (tx *Tx) page(id pgid) *page { + // Check the dirty pages first. + if tx.pages != nil { + if p, ok := tx.pages[id]; ok { + return p + } + } + + // Otherwise return directly from the mmap. + return tx.db.page(id) +} + +// forEachPage iterates over every page within a given page and executes a function. +func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { + p := tx.page(pgid) + + // Execute function. + fn(p, depth) + + // Recursively loop over children. + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + tx.forEachPage(elem.pgid, depth+1, fn) + } + } +} + +// Page returns page information for a given page number. +// This is only safe for concurrent use when used by a writable transaction. +func (tx *Tx) Page(id int) (*PageInfo, error) { + if tx.db == nil { + return nil, ErrTxClosed + } else if pgid(id) >= tx.meta.pgid { + return nil, nil + } + + // Build the page info. + p := tx.db.page(pgid(id)) + info := &PageInfo{ + ID: id, + Count: int(p.count), + OverflowCount: int(p.overflow), + } + + // Determine the type (or if it's free). + if tx.db.freelist.freed(pgid(id)) { + info.Type = "free" + } else { + info.Type = p.typ() + } + + return info, nil +} + +// TxStats represents statistics about the actions performed by the transaction. +type TxStats struct { + // Page statistics. + PageCount int // number of page allocations + PageAlloc int // total bytes allocated + + // Cursor statistics. + CursorCount int // number of cursors created + + // Node statistics + NodeCount int // number of node allocations + NodeDeref int // number of node dereferences + + // Rebalance statistics. + Rebalance int // number of node rebalances + RebalanceTime time.Duration // total time spent rebalancing + + // Split/Spill statistics. + Split int // number of nodes split + Spill int // number of nodes spilled + SpillTime time.Duration // total time spent spilling + + // Write statistics. + Write int // number of writes performed + WriteTime time.Duration // total time spent writing to disk +} + +func (s *TxStats) add(other *TxStats) { + s.PageCount += other.PageCount + s.PageAlloc += other.PageAlloc + s.CursorCount += other.CursorCount + s.NodeCount += other.NodeCount + s.NodeDeref += other.NodeDeref + s.Rebalance += other.Rebalance + s.RebalanceTime += other.RebalanceTime + s.Split += other.Split + s.Spill += other.Spill + s.SpillTime += other.SpillTime + s.Write += other.Write + s.WriteTime += other.WriteTime +} + +// Sub calculates and returns the difference between two sets of transaction stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *TxStats) Sub(other *TxStats) TxStats { + var diff TxStats + diff.PageCount = s.PageCount - other.PageCount + diff.PageAlloc = s.PageAlloc - other.PageAlloc + diff.CursorCount = s.CursorCount - other.CursorCount + diff.NodeCount = s.NodeCount - other.NodeCount + diff.NodeDeref = s.NodeDeref - other.NodeDeref + diff.Rebalance = s.Rebalance - other.Rebalance + diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime + diff.Split = s.Split - other.Split + diff.Spill = s.Spill - other.Spill + diff.SpillTime = s.SpillTime - other.SpillTime + diff.Write = s.Write - other.Write + diff.WriteTime = s.WriteTime - other.WriteTime + return diff +} diff --git a/vendor/src/github.com/boltdb/bolt/tx_test.go b/vendor/src/github.com/boltdb/bolt/tx_test.go new file mode 100644 index 0000000..2201e79 --- /dev/null +++ b/vendor/src/github.com/boltdb/bolt/tx_test.go @@ -0,0 +1,716 @@ +package bolt_test + +import ( + "bytes" + "errors" + "fmt" + "log" + "os" + "testing" + + "github.com/boltdb/bolt" +) + +// Ensure that committing a closed transaction returns an error. +func TestTx_Commit_ErrTxClosed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + if _, err := tx.CreateBucket([]byte("foo")); err != nil { + t.Fatal(err) + } + + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + + if err := tx.Commit(); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that rolling back a closed transaction returns an error. +func TestTx_Rollback_ErrTxClosed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + + if err := tx.Rollback(); err != nil { + t.Fatal(err) + } + if err := tx.Rollback(); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that committing a read-only transaction returns an error. +func TestTx_Commit_ErrTxNotWritable(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(false) + if err != nil { + t.Fatal(err) + } + if err := tx.Commit(); err != bolt.ErrTxNotWritable { + t.Fatal(err) + } +} + +// Ensure that a transaction can retrieve a cursor on the root bucket. +func TestTx_Cursor(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + + if _, err := tx.CreateBucket([]byte("woojits")); err != nil { + t.Fatal(err) + } + + c := tx.Cursor() + if k, v := c.First(); !bytes.Equal(k, []byte("widgets")) { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("unexpected value: %v", v) + } + + if k, v := c.Next(); !bytes.Equal(k, []byte("woojits")) { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("unexpected value: %v", v) + } + + if k, v := c.Next(); k != nil { + t.Fatalf("unexpected key: %v", k) + } else if v != nil { + t.Fatalf("unexpected value: %v", k) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that creating a bucket with a read-only transaction returns an error. +func TestTx_CreateBucket_ErrTxNotWritable(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.View(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("foo")) + if err != bolt.ErrTxNotWritable { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that creating a bucket on a closed transaction returns an error. +func TestTx_CreateBucket_ErrTxClosed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + + if _, err := tx.CreateBucket([]byte("foo")); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that a Tx can retrieve a bucket. +func TestTx_Bucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a Tx retrieving a non-existent key returns nil. +func TestTx_Get_NotFound(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if b.Get([]byte("no_such_key")) != nil { + t.Fatal("expected nil value") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can be created and retrieved. +func TestTx_CreateBucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Create a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } else if b == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Read the bucket through a separate transaction. + if err := db.View(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can be created if it doesn't already exist. +func TestTx_CreateBucketIfNotExists(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + // Create bucket. + if b, err := tx.CreateBucketIfNotExists([]byte("widgets")); err != nil { + t.Fatal(err) + } else if b == nil { + t.Fatal("expected bucket") + } + + // Create bucket again. + if b, err := tx.CreateBucketIfNotExists([]byte("widgets")); err != nil { + t.Fatal(err) + } else if b == nil { + t.Fatal("expected bucket") + } + + return nil + }); err != nil { + t.Fatal(err) + } + + // Read the bucket through a separate transaction. + if err := db.View(func(tx *bolt.Tx) error { + if tx.Bucket([]byte("widgets")) == nil { + t.Fatal("expected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure transaction returns an error if creating an unnamed bucket. +func TestTx_CreateBucketIfNotExists_ErrBucketNameRequired(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucketIfNotExists([]byte{}); err != bolt.ErrBucketNameRequired { + t.Fatalf("unexpected error: %s", err) + } + + if _, err := tx.CreateBucketIfNotExists(nil); err != bolt.ErrBucketNameRequired { + t.Fatalf("unexpected error: %s", err) + } + + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket cannot be created twice. +func TestTx_CreateBucket_ErrBucketExists(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Create a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Create the same bucket again. + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket([]byte("widgets")); err != bolt.ErrBucketExists { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket is created with a non-blank name. +func TestTx_CreateBucket_ErrBucketNameRequired(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + if _, err := tx.CreateBucket(nil); err != bolt.ErrBucketNameRequired { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that a bucket can be deleted. +func TestTx_DeleteBucket(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + // Create a bucket and add a value. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + // Delete the bucket and make sure we can't get the value. + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.DeleteBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + if tx.Bucket([]byte("widgets")) != nil { + t.Fatal("unexpected bucket") + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.Update(func(tx *bolt.Tx) error { + // Create the bucket again and make sure there's not a phantom value. + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if v := b.Get([]byte("foo")); v != nil { + t.Fatalf("unexpected phantom value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that deleting a bucket on a closed transaction returns an error. +func TestTx_DeleteBucket_ErrTxClosed(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + tx, err := db.Begin(true) + if err != nil { + t.Fatal(err) + } + if err := tx.Commit(); err != nil { + t.Fatal(err) + } + if err := tx.DeleteBucket([]byte("foo")); err != bolt.ErrTxClosed { + t.Fatalf("unexpected error: %s", err) + } +} + +// Ensure that deleting a bucket with a read-only transaction returns an error. +func TestTx_DeleteBucket_ReadOnly(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.View(func(tx *bolt.Tx) error { + if err := tx.DeleteBucket([]byte("foo")); err != bolt.ErrTxNotWritable { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that nothing happens when deleting a bucket that doesn't exist. +func TestTx_DeleteBucket_NotFound(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + if err := tx.DeleteBucket([]byte("widgets")); err != bolt.ErrBucketNotFound { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that no error is returned when a tx.ForEach function does not return +// an error. +func TestTx_ForEach_NoError(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + + if err := tx.ForEach(func(name []byte, b *bolt.Bucket) error { + return nil + }); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that an error is returned when a tx.ForEach function returns an error. +func TestTx_ForEach_WithError(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + + marker := errors.New("marker") + if err := tx.ForEach(func(name []byte, b *bolt.Bucket) error { + return marker + }); err != marker { + t.Fatalf("unexpected error: %s", err) + } + return nil + }); err != nil { + t.Fatal(err) + } +} + +// Ensure that Tx commit handlers are called after a transaction successfully commits. +func TestTx_OnCommit(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var x int + if err := db.Update(func(tx *bolt.Tx) error { + tx.OnCommit(func() { x += 1 }) + tx.OnCommit(func() { x += 2 }) + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } else if x != 3 { + t.Fatalf("unexpected x: %d", x) + } +} + +// Ensure that Tx commit handlers are NOT called after a transaction rolls back. +func TestTx_OnCommit_Rollback(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + var x int + if err := db.Update(func(tx *bolt.Tx) error { + tx.OnCommit(func() { x += 1 }) + tx.OnCommit(func() { x += 2 }) + if _, err := tx.CreateBucket([]byte("widgets")); err != nil { + t.Fatal(err) + } + return errors.New("rollback this commit") + }); err == nil || err.Error() != "rollback this commit" { + t.Fatalf("unexpected error: %s", err) + } else if x != 0 { + t.Fatalf("unexpected x: %d", x) + } +} + +// Ensure that the database can be copied to a file path. +func TestTx_CopyFile(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + + path := tempfile() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + return tx.CopyFile(path, 0600) + }); err != nil { + t.Fatal(err) + } + + db2, err := bolt.Open(path, 0600, nil) + if err != nil { + t.Fatal(err) + } + + if err := db2.View(func(tx *bolt.Tx) error { + if v := tx.Bucket([]byte("widgets")).Get([]byte("foo")); !bytes.Equal(v, []byte("bar")) { + t.Fatalf("unexpected value: %v", v) + } + if v := tx.Bucket([]byte("widgets")).Get([]byte("baz")); !bytes.Equal(v, []byte("bat")) { + t.Fatalf("unexpected value: %v", v) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db2.Close(); err != nil { + t.Fatal(err) + } +} + +type failWriterError struct{} + +func (failWriterError) Error() string { + return "error injected for tests" +} + +type failWriter struct { + // fail after this many bytes + After int +} + +func (f *failWriter) Write(p []byte) (n int, err error) { + n = len(p) + if n > f.After { + n = f.After + err = failWriterError{} + } + f.After -= n + return n, err +} + +// Ensure that Copy handles write errors right. +func TestTx_CopyFile_Error_Meta(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + return tx.Copy(&failWriter{}) + }); err == nil || err.Error() != "meta 0 copy: error injected for tests" { + t.Fatalf("unexpected error: %v", err) + } +} + +// Ensure that Copy handles write errors right. +func TestTx_CopyFile_Error_Normal(t *testing.T) { + db := MustOpenDB() + defer db.MustClose() + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + t.Fatal(err) + } + if err := b.Put([]byte("baz"), []byte("bat")); err != nil { + t.Fatal(err) + } + return nil + }); err != nil { + t.Fatal(err) + } + + if err := db.View(func(tx *bolt.Tx) error { + return tx.Copy(&failWriter{3 * db.Info().PageSize}) + }); err == nil || err.Error() != "error injected for tests" { + t.Fatalf("unexpected error: %v", err) + } +} + +func ExampleTx_Rollback() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Create a bucket. + if err := db.Update(func(tx *bolt.Tx) error { + _, err := tx.CreateBucket([]byte("widgets")) + return err + }); err != nil { + log.Fatal(err) + } + + // Set a value for a key. + if err := db.Update(func(tx *bolt.Tx) error { + return tx.Bucket([]byte("widgets")).Put([]byte("foo"), []byte("bar")) + }); err != nil { + log.Fatal(err) + } + + // Update the key but rollback the transaction so it never saves. + tx, err := db.Begin(true) + if err != nil { + log.Fatal(err) + } + b := tx.Bucket([]byte("widgets")) + if err := b.Put([]byte("foo"), []byte("baz")); err != nil { + log.Fatal(err) + } + if err := tx.Rollback(); err != nil { + log.Fatal(err) + } + + // Ensure that our original value is still set. + if err := db.View(func(tx *bolt.Tx) error { + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + fmt.Printf("The value for 'foo' is still: %s\n", value) + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // The value for 'foo' is still: bar +} + +func ExampleTx_CopyFile() { + // Open the database. + db, err := bolt.Open(tempfile(), 0666, nil) + if err != nil { + log.Fatal(err) + } + defer os.Remove(db.Path()) + + // Create a bucket and a key. + if err := db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("widgets")) + if err != nil { + return err + } + if err := b.Put([]byte("foo"), []byte("bar")); err != nil { + return err + } + return nil + }); err != nil { + log.Fatal(err) + } + + // Copy the database to another file. + toFile := tempfile() + if err := db.View(func(tx *bolt.Tx) error { + return tx.CopyFile(toFile, 0666) + }); err != nil { + log.Fatal(err) + } + defer os.Remove(toFile) + + // Open the cloned database. + db2, err := bolt.Open(toFile, 0666, nil) + if err != nil { + log.Fatal(err) + } + + // Ensure that the key exists in the copy. + if err := db2.View(func(tx *bolt.Tx) error { + value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) + fmt.Printf("The value for 'foo' in the clone is: %s\n", value) + return nil + }); err != nil { + log.Fatal(err) + } + + // Close database to release file lock. + if err := db.Close(); err != nil { + log.Fatal(err) + } + + if err := db2.Close(); err != nil { + log.Fatal(err) + } + + // Output: + // The value for 'foo' in the clone is: bar +} diff --git a/vendor/src/github.com/dchest/blake2b/README b/vendor/src/github.com/dchest/blake2b/README new file mode 100644 index 0000000..09f0143 --- /dev/null +++ b/vendor/src/github.com/dchest/blake2b/README @@ -0,0 +1,23 @@ +Go implementation of BLAKE2b collision-resistant cryptographic hash function +created by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, and +Christian Winnerlein (https://blake2.net). + +INSTALLATION + + $ go get github.com/dchest/blake2b + + +DOCUMENTATION + + See http://godoc.org/github.com/dchest/blake2b + + +PUBLIC DOMAIN DEDICATION + +Written in 2012 by Dmitry Chestnykh. + +To the extent possible under law, the author have dedicated all copyright +and related and neighboring rights to this software to the public domain +worldwide. This software is distributed without any warranty. +http://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/vendor/src/github.com/dchest/blake2b/blake2b.go b/vendor/src/github.com/dchest/blake2b/blake2b.go new file mode 100644 index 0000000..f3eb388 --- /dev/null +++ b/vendor/src/github.com/dchest/blake2b/blake2b.go @@ -0,0 +1,299 @@ +// Written in 2012 by Dmitry Chestnykh. +// +// To the extent possible under law, the author have dedicated all copyright +// and related and neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// Package blake2b implements BLAKE2b cryptographic hash function. +package blake2b + +import ( + "encoding/binary" + "errors" + "hash" +) + +const ( + BlockSize = 128 // block size of algorithm + Size = 64 // maximum digest size + SaltSize = 16 // maximum salt size + PersonSize = 16 // maximum personalization string size + KeySize = 64 // maximum size of key +) + +type digest struct { + h [8]uint64 // current chain value + t [2]uint64 // message bytes counter + f [2]uint64 // finalization flags + x [BlockSize]byte // buffer for data not yet compressed + nx int // number of bytes in buffer + + ih [8]uint64 // initial chain value (after config) + paddedKey [BlockSize]byte // copy of key, padded with zeros + isKeyed bool // indicates whether hash was keyed + size uint8 // digest size in bytes + isLastNode bool // indicates processing of the last node in tree hashing +} + +// Initialization values. +var iv = [8]uint64{ + 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, +} + +// Config is used to configure hash function parameters and keying. +// All parameters are optional. +type Config struct { + Size uint8 // digest size (if zero, default size of 64 bytes is used) + Key []byte // key for prefix-MAC + Salt []byte // salt (if < 16 bytes, padded with zeros) + Person []byte // personalization (if < 16 bytes, padded with zeros) + Tree *Tree // parameters for tree hashing +} + +// Tree represents parameters for tree hashing. +type Tree struct { + Fanout uint8 // fanout + MaxDepth uint8 // maximal depth + LeafSize uint32 // leaf maximal byte length (0 for unlimited) + NodeOffset uint64 // node offset (0 for first, leftmost or leaf) + NodeDepth uint8 // node depth (0 for leaves) + InnerHashSize uint8 // inner hash byte length + IsLastNode bool // indicates processing of the last node of layer +} + +var ( + defaultConfig = &Config{Size: Size} + config256 = &Config{Size: 32} +) + +func verifyConfig(c *Config) error { + if c.Size > Size { + return errors.New("digest size is too large") + } + if len(c.Key) > KeySize { + return errors.New("key is too large") + } + if len(c.Salt) > SaltSize { + // Smaller salt is okay: it will be padded with zeros. + return errors.New("salt is too large") + } + if len(c.Person) > PersonSize { + // Smaller personalization is okay: it will be padded with zeros. + return errors.New("personalization is too large") + } + if c.Tree != nil { + if c.Tree.Fanout == 1 { + return errors.New("fanout of 1 is not allowed in tree mode") + } + if c.Tree.MaxDepth < 2 { + return errors.New("incorrect tree depth") + } + if c.Tree.InnerHashSize < 1 || c.Tree.InnerHashSize > Size { + return errors.New("incorrect tree inner hash size") + } + } + return nil +} + +// New returns a new hash.Hash configured with the given Config. +// Config can be nil, in which case the default one is used, calculating 64-byte digest. +// Returns non-nil error if Config contains invalid parameters. +func New(c *Config) (hash.Hash, error) { + if c == nil { + c = defaultConfig + } else { + if c.Size == 0 { + // Set default size if it's zero. + c.Size = Size + } + if err := verifyConfig(c); err != nil { + return nil, err + } + } + d := new(digest) + d.initialize(c) + return d, nil +} + +// initialize initializes digest with the given +// config, which must be non-nil and verified. +func (d *digest) initialize(c *Config) { + // Create parameter block. + var p [BlockSize]byte + p[0] = c.Size + p[1] = uint8(len(c.Key)) + if c.Salt != nil { + copy(p[32:], c.Salt) + } + if c.Person != nil { + copy(p[48:], c.Person) + } + if c.Tree != nil { + p[2] = c.Tree.Fanout + p[3] = c.Tree.MaxDepth + binary.LittleEndian.PutUint32(p[4:], c.Tree.LeafSize) + binary.LittleEndian.PutUint64(p[8:], c.Tree.NodeOffset) + p[16] = c.Tree.NodeDepth + p[17] = c.Tree.InnerHashSize + } else { + p[2] = 1 + p[3] = 1 + } + // Initialize. + d.size = c.Size + for i := 0; i < 8; i++ { + d.h[i] = iv[i] ^ binary.LittleEndian.Uint64(p[i*8:]) + } + if c.Tree != nil && c.Tree.IsLastNode { + d.isLastNode = true + } + // Process key. + if c.Key != nil { + copy(d.paddedKey[:], c.Key) + d.Write(d.paddedKey[:]) + d.isKeyed = true + } + // Save a copy of initialized state. + copy(d.ih[:], d.h[:]) +} + +// New512 returns a new hash.Hash computing the BLAKE2b 64-byte checksum. +func New512() hash.Hash { + d := new(digest) + d.initialize(defaultConfig) + return d +} + +// New256 returns a new hash.Hash computing the BLAKE2b 32-byte checksum. +func New256() hash.Hash { + d := new(digest) + d.initialize(config256) + return d +} + +// NewMAC returns a new hash.Hash computing BLAKE2b prefix- +// Message Authentication Code of the given size in bytes +// (up to 64) with the given key (up to 64 bytes in length). +func NewMAC(outBytes uint8, key []byte) hash.Hash { + d, err := New(&Config{Size: outBytes, Key: key}) + if err != nil { + panic(err.Error()) + } + return d +} + +// Reset resets the state of digest to the initial state +// after configuration and keying. +func (d *digest) Reset() { + copy(d.h[:], d.ih[:]) + d.t[0] = 0 + d.t[1] = 0 + d.f[0] = 0 + d.f[1] = 0 + d.nx = 0 + if d.isKeyed { + d.Write(d.paddedKey[:]) + } +} + +// Size returns the digest size in bytes. +func (d *digest) Size() int { return int(d.size) } + +// BlockSize returns the algorithm block size in bytes. +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + left := BlockSize - d.nx + if len(p) > left { + // Process buffer. + copy(d.x[d.nx:], p[:left]) + p = p[left:] + blocks(d, d.x[:]) + d.nx = 0 + } + // Process full blocks except for the last one. + if len(p) > BlockSize { + n := len(p) &^ (BlockSize - 1) + if n == len(p) { + n -= BlockSize + } + blocks(d, p[:n]) + p = p[n:] + } + // Fill buffer. + d.nx += copy(d.x[d.nx:], p) + return +} + +// Sum returns the calculated checksum. +func (d0 *digest) Sum(in []byte) []byte { + // Make a copy of d0 so that caller can keep writing and summing. + d := *d0 + hash := d.checkSum() + return append(in, hash[:d.size]...) +} + +func (d *digest) checkSum() [Size]byte { + // Do not create unnecessary copies of the key. + if d.isKeyed { + for i := 0; i < len(d.paddedKey); i++ { + d.paddedKey[i] = 0 + } + } + + dec := BlockSize - uint64(d.nx) + if d.t[0] < dec { + d.t[1]-- + } + d.t[0] -= dec + + // Pad buffer with zeros. + for i := d.nx; i < len(d.x); i++ { + d.x[i] = 0 + } + // Set last block flag. + d.f[0] = 0xffffffffffffffff + if d.isLastNode { + d.f[1] = 0xffffffffffffffff + } + // Compress last block. + blocks(d, d.x[:]) + + var out [Size]byte + j := 0 + for _, s := range d.h[:(d.size-1)/8+1] { + out[j+0] = byte(s >> 0) + out[j+1] = byte(s >> 8) + out[j+2] = byte(s >> 16) + out[j+3] = byte(s >> 24) + out[j+4] = byte(s >> 32) + out[j+5] = byte(s >> 40) + out[j+6] = byte(s >> 48) + out[j+7] = byte(s >> 56) + j += 8 + } + return out +} + +// Sum512 returns a 64-byte BLAKE2b hash of data. +func Sum512(data []byte) [64]byte { + var d digest + d.initialize(defaultConfig) + d.Write(data) + return d.checkSum() +} + +// Sum256 returns a 32-byte BLAKE2b hash of data. +func Sum256(data []byte) (out [32]byte) { + var d digest + d.initialize(config256) + d.Write(data) + sum := d.checkSum() + copy(out[:], sum[:32]) + return +} diff --git a/vendor/src/github.com/dchest/blake2b/blake2b_test.go b/vendor/src/github.com/dchest/blake2b/blake2b_test.go new file mode 100644 index 0000000..38e4c28 --- /dev/null +++ b/vendor/src/github.com/dchest/blake2b/blake2b_test.go @@ -0,0 +1,625 @@ +// Written in 2012 by Dmitry Chestnykh. +// +// To the extent possible under law, the author have dedicated all copyright +// and related and neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package blake2b + +import ( + "fmt" + "testing" +) + +func TestSum(t *testing.T) { + buf := make([]byte, len(golden)) + for i := range buf { + buf[i] = byte(i) + } + h := New512() + for i, v := range golden { + if v != fmt.Sprintf("%x", Sum512(buf[:i])) { + t.Errorf("%d: Sum512(): \nexpected %s\ngot %x", i, v, Sum512(buf[:i])) + } + h.Reset() + h.Write(buf[:i]) + sum := h.Sum(nil) + if fmt.Sprintf("%x", sum) != v { + t.Errorf("%d:\nexpected %s\ngot %x", i, v, sum) + } + + } +} + +func TestSum256(t *testing.T) { + // Simple one-hash test. + in := "The cryptographic hash function BLAKE2 is an improved version of the SHA-3 finalist BLAKE" + good := "e5866d0c42b4e27e89a316fa5c3ba8cacae754e53d8267da37ba1893c2fcd92c" + if good != fmt.Sprintf("%x", Sum256([]byte(in))) { + t.Errorf("Sum256(): \nexpected %s\ngot %x", good, Sum256([]byte(in))) + } + +} + +func TestSumLength(t *testing.T) { + h, _ := New(&Config{Size: 19}) + sum := h.Sum(nil) + if len(sum) != 19 { + t.Fatalf("Sum() returned a slice larger than the given hash size") + } +} + +func TestKeyedSum(t *testing.T) { + buf := make([]byte, len(goldenKeyed)) + for i := range buf { + buf[i] = byte(i) + } + h := NewMAC(64, buf[:64]) + for i, v := range goldenKeyed { + h.Reset() + h.Write(buf[:i]) + sum := h.Sum(nil) + if fmt.Sprintf("%x", sum) != v { + t.Errorf("%d:\nexpected %s\ngot %x", i, v, sum) + } + + } +} + +var bench = New512() +var buf = make([]byte, 8<<10) + +func BenchmarkWrite1K(b *testing.B) { + b.SetBytes(1024) + for i := 0; i < b.N; i++ { + bench.Write(buf[:1024]) + } +} + +func BenchmarkWrite8K(b *testing.B) { + b.SetBytes(int64(len(buf))) + for i := 0; i < b.N; i++ { + bench.Write(buf) + } +} + +func BenchmarkHash64(b *testing.B) { + b.SetBytes(64) + for i := 0; i < b.N; i++ { + Sum512(buf[:64]) + } +} + +func BenchmarkHash128(b *testing.B) { + b.SetBytes(128) + for i := 0; i < b.N; i++ { + Sum512(buf[:128]) + } +} + +func BenchmarkHash1K(b *testing.B) { + b.SetBytes(1024) + for i := 0; i < b.N; i++ { + Sum512(buf[:1024]) + } +} + +// Test vectors taken from reference implementation in C#. +var golden = []string{ + "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", + "2fa3f686df876995167e7c2e5d74c4c7b6e48f8068fe0e44208344d480f7904c36963e44115fe3eb2a3ac8694c28bcb4f5a0f3276f2e79487d8219057a506e4b", + "1c08798dc641aba9dee435e22519a4729a09b2bfe0ff00ef2dcd8ed6f8a07d15eaf4aee52bbf18ab5608a6190f70b90486c8a7d4873710b1115d3debbb4327b5", + "40a374727302d9a4769c17b5f409ff32f58aa24ff122d7603e4fda1509e919d4107a52c57570a6d94e50967aea573b11f86f473f537565c66f7039830a85d186", + "77ddf4b14425eb3d053c1e84e3469d92c4cd910ed20f92035e0c99d8a7a86cecaf69f9663c20a7aa230bc82f60d22fb4a00b09d3eb8fc65ef547fe63c8d3ddce", + "cbaa0ba7d482b1f301109ae41051991a3289bc1198005af226c5e4f103b66579f461361044c8ba3439ff12c515fb29c52161b7eb9c2837b76a5dc33f7cb2e2e8", + "f95d45cf69af5c2023bdb505821e62e85d7caedf7beda12c0248775b0c88205eeb35af3a90816f6608ce7dd44ec28db1140614e1ddebf3aa9cd1843e0fad2c36", + "8f945ba700f2530e5c2a7df7d5dce0f83f9efc78c073fe71ae1f88204a4fd1cf70a073f5d1f942ed623aa16e90a871246c90c45b621b3401a5ddbd9df6264165", + "e998e0dc03ec30eb99bb6bfaaf6618acc620320d7220b3af2b23d112d8e9cb1262f3c0d60d183b1ee7f096d12dae42c958418600214d04f5ed6f5e718be35566", + "6a9a090c61b3410aede7ec9138146ceb2c69662f460c3da53c6515c1eb31f41ca3d280e567882f95cf664a94147d78f42cfc714a40d22ef19470e053493508a2", + "29102511d749db3cc9b4e335fa1f5e8faca8421d558f6a3f3321d50d044a248ba595cfc3efd3d2adc97334da732413f5cbf4751c362ba1d53862ac1e8dabeee8", + "c97a4779d47e6f77729b5917d0138abb35980ab641bd73a8859eb1ac98c05362ed7d608f2e9587d6ba9e271d343125d40d933a8ed04ec1fe75ec407c7a53c34e", + "10f0dc91b9f845fb95fad6860e6ce1adfa002c7fc327116d44d047cd7d5870d772bb12b5fac00e02b08ac2a0174d0446c36ab35f14ca31894cd61c78c849b48a", + "dea9101cac62b8f6a3c650f90eea5bfae2653a4eafd63a6d1f0f132db9e4f2b1b662432ec85b17bcac41e775637881f6aab38dd66dcbd080f0990a7a6e9854fe", + "441ffaa08cd79dff4afc9b9e5b5620eec086730c25f661b1d6fbfbd1cec3148dd72258c65641f2fca5eb155fadbcabb13c6e21dc11faf72c2a281b7d56145f19", + "444b240fe3ed86d0e2ef4ce7d851edde22155582aa0914797b726cd058b6f45932e0e129516876527b1dd88fc66d7119f4ab3bed93a61a0e2d2d2aeac336d958", + "bfbabbef45554ccfa0dc83752a19cc35d5920956b301d558d772282bc867009168e9e98606bb5ba73a385de5749228c925a85019b71f72fe29b3cd37ca52efe6", + "9c4d0c3e1cdbbf485bec86f41cec7c98373f0e09f392849aaa229ebfbf397b22085529cb7ef39f9c7c2222a514182b1effaa178cc3687b1b2b6cbcb6fdeb96f8", + "477176b3bfcbadd7657c23c24625e4d0d674d1868f006006398af97aa41877c8e70d3d14c3bbc9bbcdcea801bd0e1599af1f3eec67405170f4e26c964a57a8b7", + "a78c490eda3173bb3f10dee52f110fb1c08e0302230b85ddd7c11257d92de148785ef00c039c0bb8eb9808a35b2d8c080f572859714c9d4069c5bcaf090e898e", + "58d023397beb5b4145cb2255b07d74290b36d9fd1e594afbd8eea47c205b2efbfe6f46190faf95af504ab072e36f6c85d767a321bfd7f22687a4abbf494a689c", + "4001ec74d5a46fd29c2c3cdbe5d1b9f20e51a941be98d2a4e1e2fbf866a672121db6f81a514cfd10e7358d571bdba48e4ce708b9d124894bc0b5ed554935f73a", + "ccd1b22dab6511225d2401ea2d8625d206a12473cc732b615e5640cefff0a4adf971b0e827a619e0a80f5db9ccd0962329010d07e34a2064e731c520817b2183", + "b4a0a9e3574edb9e1e72aa31e39cc5f30dbf943f8cabc408449654a39131e66d718a18819143e3ea96b4a1895988a1c0056cf2b6e04f9ac19d657383c2910c44", + "447becab16630608d39f4f058b16f7af95b85a76aa0fa7cea2b80755fb76e9c804f2ca78f02643c915fbf2fce5e19de86000de03b18861815a83126071f8a37b", + "54e6dab9977380a5665822db93374eda528d9beb626f9b94027071cb26675e112b4a7fec941ee60a81e4d2ea3ff7bc52cfc45dfbfe735a1c646b2cf6d6a49b62", + "3ea62625949e3646704d7e3c906f82f6c028f540f5f72a794b0c57bf97b7649bfeb90b01d3ca3e829de21b3826e6f87014d3c77350cb5a15ff5d468a81bec160", + "213cfe145c54a33691569980e5938c8883a46d84d149c8ff1a67cd287b4d49c6da69d3a035443db085983d0efe63706bd5b6f15a7da459e8d50a19093db55e80", + "5716c4a38f38db104e494a0a27cbe89a26a6bb6f499ec01c8c01aa7cb88497e75148cd6eee12a7168b6f78ab74e4be749251a1a74c38c86d6129177e2889e0b6", + "030460a98bdf9ff17cd96404f28fc304f2b7c04eaade53677fd28f788ca22186b8bc80dd21d17f8549c711aff0e514e19d4e15f5990252a03e082f28dc2052f6", + "19e7f1ccee88a10672333e390cf22013a8c734c6cb9eab41f17c3c8032a2e4aca0569ea36f0860c7a1af28fa476840d66011168859334a9e4ef9cc2e61a0e29e", + "29f8b8c78c80f2fcb4bdf7825ed90a70d625ff785d262677e250c04f3720c888d03f8045e4edf3f5285bd39d928a10a7d0a5df00b8484ac2868142a1e8bea351", + "5c52920a7263e39d57920ca0cb752ac6d79a04fef8a7a216a1ecb7115ce06d89fd7d735bd6f4272555dba22c2d1c96e6352322c62c5630fde0f4777a76c3de2c", + "83b098f262251bf660064a9d3511ce7687a09e6dfbb878299c30e93dfb43a9314db9a600337db26ebeedaf2256a96dabe9b29e7573ad11c3523d874dde5be7ed", + "9447d98aa5c9331352f43d3e56d0a9a9f9581865998e2885cc56dd0a0bd5a7b50595bd10f7529bcd31f37dc16a1465d594079667da2a3fcb70401498837cedeb", + "867732f2feeb23893097561ac710a4bff453be9cfbedba8ba324f9d312a82d732e1b83b829fdcd177b882ca0c1bf544b223be529924a246a63cf059bfdc50a1b", + "f15ab26d4cdfcf56e196bb6ba170a8fccc414de9285afd98a3d3cf2fb88fcbc0f19832ac433a5b2cc2392a4ce34332987d8d2c2bef6c3466138db0c6e42fa47b", + "2813516d68ed4a08b39d648aa6aacd81e9d655ecd5f0c13556c60fdf0d333ea38464b36c02baccd746e9575e96c63014f074ae34a0a25b320f0fbedd6acf7665", + "d3259afca8a48962fa892e145acf547f26923ae8d4924c8a531581526b04b44c7af83c643ef5a0bc282d36f3fb04c84e28b351f40c74b69dc7840bc717b6f15f", + "f14b061ae359fa31b989e30332bfe8de8cc8cdb568e14be214a2223b84caab7419549ecfcc96ce2acec119485d87d157d3a8734fc426597d64f36570ceaf224d", + "55e70b01d1fbf8b23b57fb62e26c2ce54f13f8fa2464e6eb98d16a6117026d8b90819012496d4071ebe2e59557ece3519a7aa45802f9615374877332b73490b3", + "25261eb296971d6e4a71b2928e64839c67d422872bf9f3c31993615222de9f8f0b2c4be8548559b4b354e736416e3218d4e8a1e219a4a6d43e1a9a521d0e75fc", + "08307f347c41294e34bb54cb42b1522d22f824f7b6e5db50fda096798e181a8f026fa27b4ae45d52a62caf9d5198e24a4913c6671775b2d723c1239bfbf016d7", + "1e5c62e7e9bfa1b118747a2de08b3ca10112af96a46e4b22c3fc06f9bfee4eb5c49e057a4a4886234324572576bb9b5ecfde0d99b0de4f98ec16e4d1b85fa947", + "c74a77395fb8bc126447454838e561e962853dc7eb49a1e3cb67c3d0851f3e39517be8c350ac910903d49cd2bfdf545c99316d0346170b739f0add5d533c2cfc", + "0dd57b423cc01eb2861391eb886a0d17079b933fc76eb3fc08a19f8a74952cb68f6bcdc644f77370966e4d13e80560bcf082ef0479d48fbbab4df03b53a4e178", + "4d8dc3923edccdfce70072398b8a3da5c31fcb3ee3b645c85f717cbaeb4b673a19394425a585bfb464d92f1597d0b754d163f97ced343b25db5a70ef48ebb34f", + "f0a50553e4dfb0c4e3e3d3ba82034857e3b1e50918f5b8a7d698e10d242b0fb544af6c92d0c3aaf9932220416117b4e78ecb8a8f430e13b82a5915290a5819c5", + "b15543f3f736086627cc5365e7e8988c2ef155c0fd4f428961b00d1526f04d6d6a658b4b8ed32c5d8621e7f4f8e8a933d9ecc9dd1b8333cbe28cfc37d9719e1c", + "7b4fa158e415fef023247264cbbe15d16d91a44424a8db707eb1e2033c30e9e1e7c8c0864595d2cb8c580eb47e9d16abbd7e44e824f7cedb7def57130e52cfe9", + "60424ff23234c34dc9687ad502869372cc31a59380186bc2361c835d972f49666eb1ac69629de646f03f9b4db9e2ace093fbfdf8f20ab5f98541978be8ef549f", + "7406018ce704d84f5eb9c79fea97da345699468a350ee0b2d0f3a4bf2070304ea862d72a51c57d3064947286f531e0eaf7563702262e6c724abf5ed8c8398d17", + "14ef5c6d647b3bd1e6e32006c231199810de5c4dc88e70240273b0ea18e651a3eb4f5ca3114b8a56716969c7cda27e0c8db832ad5e89a2dc6cb0adbe7d93abd1", + "38cf6c24e3e08bcf1f6cf3d1b1f65b905239a3118033249e448113ec632ea6dc346feeb2571c38bd9a7398b2221280328002b23e1a45adaffe66d93f6564eaa2", + "6cd7208a4bc7e7e56201bbba02a0f489cd384abe40afd4222f158b3d986ee72a54c50fb64fd4ed2530eda2c8af2928a0da6d4f830ae1c9db469dfd970f12a56f", + "659858f0b5c9edab5b94fd732f6e6b17c51cc096104f09beb3afc3aa467c2ecf885c4c6541effa9023d3b5738ae5a14d867e15db06fe1f9d1127b77e1aabb516", + "26cca0126f5d1a813c62e5c71001c046f9c92095704550be5873a495a999ad010a4f79491f24f286500adce1a137bc2084e4949f5b7294cefe51ecaff8e95cba", + "4147c1f55172788c5567c561feef876f621fff1ce87786b8467637e70dfbcd0dbdb6415cb600954ab9c04c0e457e625b407222c0fe1ae21b2143688ada94dc58", + "5b1bf154c62a8af6e93d35f18f7f90abb16a6ef0e8d1aecd118bf70167bab2af08935c6fdc0663ce74482d17a8e54b546d1c296631c65f3b522a515839d43d71", + "9f600419a4e8f4fb834c24b0f7fc13bf4e279d98e8a3c765ee934917403e3a66097182ea21453cb63ebbe8b73a9c2167596446438c57627f330badd4f569f7d6", + "457ef6466a8924fd8011a34471a5a1ac8ccd9bd0d07a97414ac943021ce4b9e4b9c8db0a28f016ed43b1542481990022147b313e194671131e708dd43a3ed7dc", + "9997b2194d9af6dfcb9143f41c0ed83d3a3f4388361103d38c2a49b280a581212715fd908d41c651f5c715ca38c0ce2830a37e00e508ced1bcdc320e5e4d1e2e", + "5c6bbf16baa180f986bd40a1287ed4c549770e7284858fc47bc21ab95ebbf3374b4ee3fd9f2af60f3395221b2acc76f2d34c132954049f8a3a996f1e32ec84e5", + "d10bf9a15b1c9fc8d41f89bb140bf0be08d2f3666176d13baac4d381358ad074c9d4748c300520eb026daeaea7c5b158892fde4e8ec17dc998dcd507df26eb63", + "2fc6e69fa26a89a5ed269092cb9b2a449a4409a7a44011eecad13d7c4b0456602d402fa5844f1a7a758136ce3d5d8d0e8b86921ffff4f692dd95bdc8e5ff0052", + "fcbe8be7dcb49a32dbdf239459e26308b84dff1ea480df8d104eeff34b46fae98627b450c2267d48c0946a697c5b59531452ac0484f1c84e3a33d0c339bb2e28", + "a19093a6e3bcf5952f850f2030f69b9606f147f90b8baee3362da71d9f35b44ef9d8f0a7712ba1877fddcd2d8ea8f1e5a773d0b745d4725605983a2de901f803", + "3c2006423f73e268fa59d2920377eb29a4f9a8b462be15983ee3b85ae8a78e992633581a9099893b63db30241c34f643027dc878279af5850d7e2d4a2653073a", + "d0f2f2e3787653f77cce2fa24835785bbd0c433fc779465a115149905a9dd1cb827a628506d457fcf124a0c2aef9ce2d2a0a0f63545570d8667ff9e2eba07334", + "78a9fc048e25c6dcb5de45667de8ffdd3a93711141d594e9fa62a959475da6075ea8f0916e84e45ad911b75467077ee52d2c9aebf4d58f20ce4a3a00458b05d4", + "45813f441769ab6ed37d349ff6e72267d76ae6bb3e3c612ec05c6e02a12af5a37c918b52bf74267c3f6a3f183a8064ff84c07b193d08066789a01accdb6f9340", + "956da1c68d83a7b881e01b9a966c3c0bf27f68606a8b71d457bd016d4c41dd8a380c709a296cb4c6544792920fd788835771a07d4a16fb52ed48050331dc4c8b", + "df186c2dc09caa48e14e942f75de5ac1b7a21e4f9f072a5b371e09e07345b0740c76177b01278808fec025eded9822c122afd1c63e6f0ce2e32631041063145c", + "87475640966a9fdcd6d3a3b5a2cca5c08f0d882b10243c0ec1bf3c6b1c37f2cd3212f19a057864477d5eaf8faed73f2937c768a0af415e84bbce6bd7de23b660", + "c3b573bbe10949a0fbd4ff884c446f2229b76902f9dfdbb8a0353da5c83ca14e8151bbaac82fd1576a009adc6f1935cf26edd4f1fb8da483e6c5cd9d8923adc3", + "b09d8d0bba8a7286e43568f7907550e42036d674e3c8fc34d8ca46f771d6466b70fb605875f6a863c877d12f07063fdc2e90ccd459b1910dcd52d8f10b2b0a15", + "af3a22bf75b21abfb0acd54422ba1b7300a952eff02ebeb65b5c234471a98df32f4f9643ce1904108a168767924280bd76c83f8c82d9a79d9259b195362a2a04", + "bf4ff2221b7e6957a724cd964aa3d5d0d9941f540413752f4699d8101b3e537508bf09f8508b317736ffd265f2847aa7d84bd2d97569c49d632aed9945e5fa5e", + "9c6b6b78199b1bdacb4300e31479fa622a6b5bc80d4678a6078f88a8268cd7206a2799e8d4621a464ef6b43dd8adffe97caf221b22b6b8778b149a822aefbb09", + "890656f09c99d280b5ecb381f56427b813751bc652c7828078b23a4af83b4e3a61fdbac61f89bee84ea6bee760c047f25c6b0a201c69a38fd6fd971af18588bb", + "31a046f7882ffe6f83ce472e9a0701832ec7b3f76fbcfd1df60fe3ea48fde1651254247c3fd95e100f9172731e17fd5297c11f4bb328363ca361624a81af797c", + "27a60b2d00e7a671d47d0aec2a686a0ac04b52f40ab6629028eb7d13f4baa99ac0fe46ee6c814944f2f4b4d20e9378e4847ea44c13178091e277b87ea7a55711", + "8b5ccef194162c1f19d68f91e0b0928f289ec5283720840c2f73d253111238dcfe94af2b59c2c1ca2591901a7bc060e7459b6c47df0f71701a35cc0aa831b5b6", + "57ab6c4b2229aeb3b70476d803cd63812f107ce6da17fed9b17875e8f86c724f49e024cbf3a1b8b119c50357652b81879d2ade2d588b9e4f7cedba0e4644c9ee", + "0190a8dac320a739f322e15731aa140ddaf5bed294d5c82e54fef29f214e18aafaa84f8be99af62950266b8f901f15dd4c5d35516fc35b4cab2e96e4695bbe1c", + "d14d7c4c415eeb0e10b159224bea127ebd84f9591c702a330f5bb7bb7aa44ea39de6ed01f18da7adf40cfb97c5d152c27528824b21e239526af8f36b214e0cfb", + "be28c4be706970488fac7d29c3bd5c4e986085c4c3332f1f3fd30973db614164ba2f31a78875ffdc150325c88327a9443ed04fdfe5be93876d1628560c764a80", + "031da1069e3a2e9c3382e436ffd79df74b1ca6a8adb2deabe676ab45994cbc054f037d2f0eace858d32c14e2d1c8b46077308e3bdc2c1b53172ecf7a8c14e349", + "4665cef8ba4db4d0acb118f2987f0bb09f8f86aa445aa3d5fc9a8b346864787489e8fcecc125d17e9b56e12988eac5ecc7286883db0661b8ff05da2afff30fe4", + "63b7032e5f930cc9939517f9e986816cfbec2be59b9568b13f2ead05bae7777cab620c6659404f7409e4199a3be5f7865aa7cbdf8c4253f7e8219b1bd5f46fea", + "9f09bf093a2b0ff8c2634b49e37f1b2135b447aa9144c9787dbfd92129316c99e88aab8a21fdef2372d1189aec500f95775f1f92bfb45545e4259fb9b7b02d14", + "f9f8493c68088807df7f6a2693d64ea59f03e9e05a223e68524ca32195a4734b654fcea4d2734c866cf95c889fb10c49159be2f5043dc98bb55e02ef7bdcb082", + "3c9a7359ab4febce07b20ac447b06a240b7fe1dae5439c49b60b5819f7812e4c172406c1aac316713cf0dded1038077258e2eff5b33913d9d95caeb4e6c6b970", + "ad6aab8084510e822cfce8625d62cf4de655f4763884c71e80bab9ac9d5318dba4a6033ed29084e65216c031606ca17615dcfe3ba11d26851ae0999ca6e232cf", + "156e9e6261374c9dc884f36e70f0fe1ab9297997b836fa7d170a9c9ebf575b881e7bcea44d6c0248d35597907154828955be19135852f9228815eca024a8adfb", + "4215407633f4cca9b6788be93e6aa3d963c7d6ce4b147247099f46a3acb500a30038cb3e788c3d29f132ad844e80e9e99251f6db96acd8a091cfc770af53847b", + "1c077e279de6548523502b6df800ffdab5e2c3e9442eb838f58c295f3b147cef9d701c41c321283f00c71affa0619310399126295b78dd4d1a74572ef9ed5135", + "f07a555f49fe481cf4cd0a87b71b82e4a95064d06677fdd90a0eb598877ba1c83d4677b393c3a3b6661c421f5b12cb99d20376ba7275c2f3a8f5a9b7821720da", + "b5911b380d20c7b04323e4026b38e200f534259233b581e02c1e3e2d8438d6c66d5a4eb201d5a8b75072c4ec29106334da70bc79521b0ced2cfd533f5ff84f95", + "01f070a09bae911296361f91aa0e8e0d09a7725478536d9d48c5fe1e5e7c3c5b9b9d6eb07796f6da57ae562a7d70e882e37adfde83f0c433c2cd363536bb22c8", + "6f793eb4374a48b0775acaf9adcf8e45e54270c9475f004ad8d5973e2aca52747ff4ed04ae967275b9f9eb0e1ff75fb4f794fa8be9add7a41304868d103fab10", + "965f20f139765fcc4ce4ba3794675863cac24db472cd2b799d035bce3dbea502da7b524865f6b811d8c5828d3a889646fe64a380da1aa7c7044e9f245dced128", + "ec295b5783601244c30e4641e3b45be222c4dce77a58700f53bc8ec52a941690b4d0b087fb6fcb3f39832b9de8f75ec20bd43079811749cdc907edb94157d180", + "61c72f8ccc91dbb54ca6750bc489672de09faedb8fdd4f94ff2320909a303f5d5a98481c0bc1a625419fb4debfbf7f8a53bb07ec3d985e8ea11e72d559940780", + "afd8145b259eefc8d12620c3c5b03e1ed8fd2ccefe0365078c80fd42c1770e28b44948f27e65a1886690110db814397b68e43d80d1ba16dfa358e739c898cfa3", + "552fc7893cf1ce933ada35c0da98844e41545e244c3157a1428d7b4c21f9cd7e4071aed77b7ca9f1c38fba32237412ef21a342742ec8324378f21e507fafdd88", + "467a33fbadf5ebc52596ef86aaaefc6faba8ee651b1ce04de368a03a5a9040ef2835e00adb09abb3fbd2bce818a2413d0b0253b5bda4fc5b2f6f85f3fd5b55f2", + "22eff8e6dd5236f5f57d94ede874d6c9428e8f5d566f17cd6d1848cd752fe13c655cb10fbaaff76872f2bf2da99e15dc624075e1ec2f58a3f64072121838569e", + "9cec6bbf62c4bce4138abae1cbec8dad31950444e90321b1347196834c114b864af3f3cc3508f83751ffb4eda7c84d140734bb4263c3625c00f04f4c8068981b", + "a8b60fa4fc2442f6f1514ad7402626920cc7c2c9f72124b8cba8ee2cb7c4586f658a4410cffcc0ab88343955e094c6af0d20d0c714fb0a988f543f300f58d389", + "8271cc45dfa5e4170e847e8630b952cf9c2aa777d06f26a7585b8381f188dacc7337391cfcc94b053dc4ec29cc17f077870428f1ac23fddda165ef5a3f155f39", + "bf23c0c25c8060e4f6995f1623a3bebecaa96e308680000a8aa3cd56bb1a6da099e10d9231b37f4519b2efd2c24de72f31a5f19535241b4a59fa3c03ceb790e7", + "877fd652c05281009c0a5250e7a3a671f8b18c108817fe4a874de22da8e45db11958a600c5f62e67d36cbf84474cf244a9c2b03a9fb9dc711cd1a2cab6f3fae0", + "29df4d87ea444baf5bcdf5f4e41579e28a67de84149f06c03f110ea84f572a9f676addd04c4878f49c5c00accda441b1a387caceb2e993bb7a10cd8c2d6717e1", + "710dacb166844639cd7b637c274209424e2449dc35d790bbfa4f76177054a36b3b76fac0ca6e61df1e687000678ac0746df75d0a3954897681fd393a155a1bb4", + "c1d5f93b8dea1f2571babccbc01764541a0cda87e444d673c50966ca559c33354b3acb26e5d5781ffb28847a4b4754d77008c62a835835f500dea7c3b58bdae2", + "a41e41271cdab8af4d72b104bfb2ad041ac4df14677da671d85640c4b187f50c2b66513c4619fbd5d5dc4fe65dd37b9042e9848dda556a504caa2b1c6afe4730", + "e7bcbacdc379c43d81ebadcb37781552fc1d753e8cf310d968392d06c91f1d64cc9e90ce1d22c32d277fc6cda433a4d442c762e9eacf2c259f32d64cf9da3a22", + "51755b4ac5456b13218a19c5b9242f57c4a981e4d4ecdce09a3193362b808a579345d4881c2607a56534dd7f21956aff72c2f4173a6e7b6cc2212ba0e3daee1f", + "dcc2c4beb9c1f2607b786c20c631972347034c1cc02fcc7d02ff01099cfe1c6989840ac213923629113aa8bad713ccf0fe4ce13264fb32b8b0fe372da382544a", + "3d55176acea4a7e3a65ffa9fb10a7a1767199cf077cee9f71532d67cd7c73c9f93cfc37ccdcc1fdef50aad46a504a650d298d597a3a9fa95c6c40cb71fa5e725", + "d07713c005de96dd21d2eb8bbeca66746ea51a31ae922a3e74864889540a48db27d7e4c90311638b224bf0201b501891754848113c266108d0adb13db71909c7", + "58983c21433d950caa23e4bc18543b8e601c204318532152daf5e159a0cd1480183d29285c05f129cb0cc3164687928086ffe380158df1d394c6ac0d4288bca8", + "8100a8dc528d2b682ab4250801ba33f02a3e94c54dac0ae1482aa21f51ef3a82f3807e6facb0aeb05947bf7aa2adcb034356f90fa4560ede02201a37e411ec1a", + "07025f1bb6c784f3fe49de5c14b936a5acacacaab33f6ac4d0e00ab6a12483d6bec00b4fe67c7ca5cc508c2a53efb5bfa5398769d843ff0d9e8b14d36a01a77f", + "ba6aefd972b6186e027a76273a4a723321a3f580cfa894da5a9ce8e721c828552c64dacee3a7fd2d743b5c35ad0c8efa71f8ce99bf96334710e2c2346e8f3c52", + "e0721e02517aedfa4e7e9ba503e025fd46e714566dc889a84cbfe56a55dfbe2fc4938ac4120588335deac8ef3fa229adc9647f54ad2e3472234f9b34efc46543", + "b6292669ccd38d5f01caae96ba272c76a879a45743afa0725d83b9ebb26665b731f1848c52f11972b6644f554c064fa90780dbbbf3a89d4fc31f67df3e5857ef", + "2319e3789c47e2daa5fe807f61bec2a1a6537fa03f19ff32e87eecbfd64b7e0e8ccff439ac333b040f19b0c4ddd11a61e24ac1fe0f10a039806c5dcc0da3d115", + "f59711d44a031d5f97a9413c065d1e614c417ede998590325f49bad2fd444d3e4418be19aec4e11449ac1a57207898bc57d76a1bcf3566292c20c683a5c4648f", + "df0a9d0c212843a6a934e3902b2dd30d17fba5f969d2030b12a546d8a6a45e80cf5635f071f0452e9c919275da99bed51eb1173c1af0518726b75b0ec3bae2b5", + "a3eb6e6c7bf2fb8b28bfe8b15e15bb500f781ecc86f778c3a4e655fc5869bf2846a245d4e33b7b14436a17e63be79b36655c226a50ffbc7124207b0202342db5", + "56d4cbcd070563426a017069425c2cd2ae540668287a5fb9dac432eb8ab1a353a30f2fe1f40d83333afe696a267795408a92fe7da07a0c1814cf77f36e105ee8", + "e59b9987d428b3eda37d80abdb16cd2b0aef674c2b1dda4432ea91ee6c935c684b48b4428a8cc740e579a30deff35a803013820dd23f14ae1d8413b5c8672aec", + "cd9fcc99f99d4cc16d031900b2a736e1508db4b586814e6345857f354a70ccecb1df3b50a19adaf43c278efa423ff4bb6c523ec7fd7859b97b168a7ebff8467c", + "0602185d8c3a78738b99164b8bc6ffb21c7debebbf806372e0da44d121545597b9c662a255dc31542cf995ecbe6a50fb5e6e0ee4ef240fe557eded1188087e86", + "c08afa5b927bf08097afc5fff9ca4e7800125c1f52f2af3553fa2b89e1e3015c4f87d5e0a48956ad31450b083dad147ffb5ec03434a26830cf37d103ab50c5da", + "36f1e1c11d6ef6bc3b536d505d544a871522c5c2a253067ec9933b6ec25464daf985525f5b9560a16d890259ac1bb5cc67c0c469cde133def000ea1d686f4f5d", + "bf2ab2e2470f5438c3b689e66e7686fffa0cb1e1798ad3a86ff99075bf6138e33d9c0ce59afb24ac67a02af34428191a9a0a6041c07471b7c3b1a752d6fc0b8b", + "d400601f9728ccc4c92342d9787d8d28ab323af375ca5624b4bb91d17271fbae862e413be73f1f68e615b8c5c391be0dbd9144746eb339ad541547ba9c468a17", + "79fe2fe157eb85a038abb8ebbc647731d2c83f51b0ac6ee14aa284cb6a3549a4dcceb300740a825f52f5fb30b03b8c4d8b0f4aa67a63f4a94e3303c4eda4c02b", + "75351313b52a8529298d8c186b1768666dcca8595317d7a4816eb88c062020c0c8efc554bb341b64688db5ccafc35f3c3cd09d6564b36d7b04a248e146980d4b", + "e3128b1d311d02179d7f25f97a5a8bee2cc8c86303644fcd664e157d1fef00f23e46f9a5e8e5c890ce565bb6abd4302ce06469d52a5bd53e1c5a54d04649dc03", + "c2382a72d2d3ace9d5933d00b60827ed380cda08d0ba5f6dd41e29ee6dbe8ecb9235f06be95d83b6816a2fb7a5ad47035e8a4b69a4884b99e4bece58cab25d44", + "6b1c69460bbd50ac2ed6f32e6e887cfed407d47dcf0aaa60387fe320d780bd03eab6d7baeb2a07d10cd552a300341354ea9a5f03183a623f92a2d4d9f00926af", + "6cda206c80cdc9c44ba990e0328c314f819b142d00630404c48c05dc76d1b00ce4d72fc6a48e1469ddef609412c364820854214b4869af090f00d3c1ba443e1b", + "7ffc8c26fbd6a0f7a609e6e1939f6a9edf1b0b066641fb76c4f9602ed748d11602496b35355b1aa255850a509d2f8ee18c8f3e1d7dcbc37a136598f56a59ed17", + "70de1f08dd4e09d5fc151f17fc991a23abfc05104290d50468882efaf582b6ec2f14f577c0d68c3ad06626916e3c86e6daab6c53e5163e82b6bd0ce49fc0d8df", + "4f81935756ed35ee2058ee0c6a6110d6fac5cb6a4f46aa9411603f99965823b6da4838276c5c06bc7880e376d92758369ee7305bcec8d3cfd28ccabb7b4f0579", + "abcb61cb3683d18f27ad527908ed2d32a0426cb7bb4bf18061903a7dc42e7e76f982382304d18af8c80d91dd58dd47af76f8e2c36e28af2476b4bccf82e89fdf", + "02d261ad56a526331b643dd2186de9a82e72a58223cd1e723686c53d869b83b94632b7b647ab2afc0d522e29da3a5615b741d82852e0df41b66007dbcba90543", + "c5832741fa30c5436823015383d297ff4c4a5d7276c3f902122066e04be5431b1a85faf73b918434f9300963d1dea9e8ac3924ef490226edeea5f743e410669f", + "cfaeab268cd075a5a6aed515023a032d54f2f2ff733ce0cbc78db51db4504d675923f82746d6594606ad5d67734b11a67cc6a468c2032e43ca1a94c6273a985e", + "860850f92eb268272b67d133609bd64e34f61bf03f4c1738645c17fec818465d7ecd2be2907641130025fda79470ab731646e7f69440e8367ea76ac4cee8a1df", + "84b154ed29bbedefa648286839046f4b5aa34430e2d67f7496e4c39f2c7ea78995f69e1292200016f16ac3b37700e6c7e7861afc396b64a59a1dbf47a55c4bbc", + "aeeec260a5d8eff5ccab8b95da435a63ed7a21ea7fc7559413fd617e33609f8c290e64bbacc528f6c080262288b0f0a3219be223c991bee92e72349593e67638", + "8ad78a9f26601d127e8d2f2f976e63d19a054a17dcf59e0f013ab54a6887bbdffde7aaae117e0fbf3271016595b9d9c712c01b2c53e9655a382bc4522e616645", + "8934159dade1ac74147dfa282c75954fcef443ef25f80dfe9fb6ea633b8545111d08b34ef43fff17026c7964f5deac6d2b3c29dacf2747f022df5967dfdc1a0a", + "cd36dd0b240614cf2fa2b9e959679dcdd72ec0cd58a43da3790a92f6cdeb9e1e795e478a0a47d371100d340c5cedcdbbc9e68b3f460818e5bdff7b4cda4c2744", + "00df4e099b807137a85990f49d3a94315e5a5f7f7a6076b303e96b056fb93800111f479628e2f8db59aeb6ac70c3b61f51f9b46e80ffdeae25ebddb4af6cb4ee", + "2b9c955e6caed4b7c9e246b86f9a1726e810c59d126cee66ed71bf015b83558a4b6d84d18dc3ff4620c2ffb722359fdef85ba0d4e2d22ecbe0ed784f99afe587", + "181df0a261a2f7d29ea5a15772715105d450a4b6c236f699f462d60ca76487feedfc9f5eb92df838e8fb5dc3694e84c5e0f4a10b761f506762be052c745a6ee8", + "21fb203458bf3a7e9a80439f9a902899cd5de0139dfd56f7110c9dec8437b26bda63de2f565926d85edb1d6c6825669743dd9992653d13979544d5dc8228bfaa", + "ef021f29c5ffb830e64b9aa9058dd660fd2fcb81c497a7e698bcfbf59de5ad4a86ff93c10a4b9d1ae5774725f9072dcde9e1f199bab91f8bff921864aa502eee", + "b3cfda40526b7f1d37569bdfcdf911e5a6efe6b2ec90a0454c47b2c046bf130fc3b352b34df4813d48d33ab8e269b69b075676cb6d00a8dcf9e1f967ec191b2c", + "b4c6c3b267071eefb9c8c72e0e2b941293641f8673cb70c1cc26ad1e73cf141755860ad19b34c2f34ed35bb52ec4507cc1fe59047743a5f0c6febde625e26091", + "57a34f2bcca60d4b85103b830c9d7952a416be5263ae429c9e5e53fe8590a8f78ec65a51109ea85dcdf7b6223f9f2b340539fad81923dbf8edabf95129e4dff6", + "9cf46662fcd61a232277b685663b8b5da832dfd9a3b8ccfeec993ec6ac415ad07e048adfe414df272770dba867da5c1224c6fd0aa0c2187d426ac647e9887361", + "5ce1042ab4d542c2f9ee9d17262af8164098935bef173d0e18489b04841746cd2f2df866bd7da6e5ef9024c648023ec723ab9c62fd80285739d84f15d2ab515a", + "8488396bd4a8729b7a473178f232dadf3f0f8e22678ba5a43e041e72da1e2cf82194c307207a54cb8156293339eaec693ff66bfcd5efc65e95e4ecaf54530abd", + "f598da901c3835bca560779037dfde9f0c51dc61c0b760fc1522d7b470ee63f5bdc6498476e86049ad86e4e21af2854a984cc905427d2f17f66b1f41c3da6f61", + "5f93269798cf02132107337660a8d7a177354c0212eb93e555e7c37a08aef3d8dce01217011cd965c04dd2c105f2e2b6cae5e4e6bcaf09dfbee3e0a6a6357c37", + "0ecf581d47bac9230986faabd70c2f5b80e91066f0ec55a842937882286d2ca007bb4e973b0b091d52167ff7c4009c7ab4ad38fff1dceacdb7be81ef4a452952", + "5aeca8abe1528582b2a307b4009585498a3d467ca6101cb0c5126f9976056e9ffc123cc20c302b2a737f492c75d21f01512c90ca0541dfa56e950a321dcb28d8", + "732fbf8f1cb2b8329263ede27858fe46f8d3354d376bcda0548e7ce1fa9dd11f85eb661fe950b543aa635ca4d3f04ede5b32d6b656e5ce1c44d35c4a6c56cff8", + "d5e938735d63788c80100aefd18648d18cf272f69f20ff24cfe2895c088ad08b0104da1672a4eb26fc52545cc7d7a01b266cf546c403c45bd129eb41bdd9200b", + "65a245b49352ee297d91af8c8be00528ac6e046dd83ac7bd465a98816dd68f3e00e1ae8f895327a7e9a8c9326598379a29c9fc91ec0c6eef08f3e2b216c11008", + "c95654b63019130ab45dd0fb4941b98aeb3af2a123913eca2ce99b3e97410a7bf8661cc7fbaa2bc1cf2b13113b1ed40a0118b88e5fffc3542759ea007ed4c58d", + "1eb262f38fa494431f017dad44c0dfb69324ac032f04b657fc91a88647bb74760f24e7c956514f0cf002990b182c1642b9b2426e96a61187e4e012f00e217d84", + "3b955aeebfa5151ac1ab8e3f5cc1e3767084c842a575d36269836e97353d41622b731dddcd5f269550a3a5b87be1e90326340b6e0e62555815d9600597ac6ef9", + "68289f6605473ba0e4f241baf7477a9885426a858f19ef2a18b0d40ef8e41282ed5526b519799e270f13881327918278755711071d8511fe963e3b5606aa3716", + "80a33787542612c38f6bcd7cd86cab460227509b1cbad5ec408a91413d51155a0476dadbf3a2518e4a6e77cc346622e347a469bf8baa5f04eb2d98705355d063", + "34629bc6d831391c4cdf8af1b4b7b6b8e8ee17cf98c70e5dd586cd99f14b11df945166236a9571e6d591bb83ee4d164d46f6b9d8ef86ff865a81bfb91b00424b", + "8b7cc339163863bb4383e542b0ef0e7cf36b84ad932cdf5a80419ec9ad692e7a7e784d2c7cb3796a18b8f800035f3aa06c824100611120a7bdeb35618ccb81b7", + "4f084e4939dd5a7f5a658fad58a18a15c25c32ec1c7fd5c5c6c3e892b3971aeaac308304ef17b1c47239ea4bb398b3fd6d4528d8de8e768ae0f1a5a5c6b5c297", + "48f407a1af5b8009b2051742e8cf5cd5656669e7d722ee8e7bd202060849442168d8facc117c012bfb7bf449d99befff6a34aea203f1d8d352722be5014ec818", + "a6aa82cd1e426f9a73bfa39a29037876114655b8c22d6d3ff8b638ae7dea6b17843e09e52eb66fa1e475e4a8a3de429b7d0f4a776fcb8bdc9b9fede7d52e815f", + "5817027d6bdd00c5dd10ac593cd560372270775a18526d7e6f13872a2e20eab664625be7168ac4bd7c9e0ce7fc4099e0f48442e2c767191c6e1284e9b2ccea8c", + "08e41028340a45c74e4052b3a8d6389e22e043a1adab5e28d97619450d723469b620caa519b81c14523854f619fd3027e3847bd03276e60604a80ddb4de876d6", + "130b8420537eb07d72abda07c85acbd8b9a44f16321dd0422145f809673d30f2b5321326e2bff317ef3fef983c51c4f8ab24a325d298e34afce569a82555774c", + "ac49b844afaa012e31c474ca263648844fd2f6307992c2f752aca02c3828965175794deee2d2ee95c61cd284f6b5a2d75e2ef2b29ee8149e77fb81447b2fd04b", + "b9d7ca81cc60bb9578e44024e5a0a0be80f27336a6a9f4e53df3999cb191280b090e2ac2d29c5baad9d71415bdc129e69aa2667af6a7fd5e189fccdcee817340", + "a755e113386572c75ced61d719706070b9146048e42a9f8cd35667a088b42f08808abdf77e618abd959afc757379ca2c00bcc1a48390fa2bff618b1e0078a613", + "a73c7debed326f1c0db0795ee7d6e3946894b826b1f8101c56c823ba17168312e7f53fc7dbe52c3e11e69852c40485e2ef182477862ea6a34ec136e2dfeea6f4", + "6cb8f9d52c56d82cac28f39ea1593e8bb2506293ac0d68376a1709b62a46df14a4ae64b2d8fab76733a1ced2d548e3f3c6fcb49d40c3d5808e449cd83d1c2aa2", + "683fa2b2369a10162c1c1c7b24bc970ee67da220564f32203f625696c0352a0b9ad96624362d952d84463c1106a2dba7a092599884b35a0b89c8f1b6a9b5a61e", + "aad9ad44610118b77d508aeb1bbcd1c1b7d0171397fb510a401bbc0ec34623670d86a2dc3c8f3ab5a2044df730256727545f0860ce21a1eac717dfc48f5d228e", + "c42578de23b4c987d5e1ac4d689ed5de4b0417f9704bc6bce969fa13471585d62c2cb1212a944f397fc9ca2c3747c3beb694ec4c5be68828dda53ef43faec6c0", + "470f00841ee8244e63ed2c7ea30e2e419897c197462ecccecf713b42a5065fff5914bc9b79affe8f6b657875e789ae213bd914cd35bd174d46e9d18bd843773d", + "34fc4213730f47a5e9a3580f643e12945cfcb31bf206f6ad450ce528da3fa432e005d6b0ecce10dca7c5995f6aacc5150e1b009e19751e8309f8859531844374", + "fb3c1f0f56a56f8e316fdf5d853c8c872c39635d083634c3904fc3ac07d1b578e85ff0e480e92d44ade33b62e893ee32343e79ddf6ef292e89b582d312502314", + "c7c97fc65dd2b9e3d3d607d31598d3f84261e9919251e9c8e57bb5f829377d5f73eabbed55c6c381180f29ad02e5be797ffec7e57bdecbc50ad3d062f0993ab0", + "a57a49cdbe67ae7d9f797bb5cc7efc2df07f4e1b15955f85dae74b76e2ecb85afb6cd9eeed8888d5ca3ec5ab65d27a7b19e578475760a045ac3c92e13a938e77", + "c7143fce9614a17fd653aeb140726dc9c3dbb1de6cc581b2726897ec24b7a50359ad492243be66d9edd8c933b5b80e0b91bb61ea98056006516976fae8d99a35", + "65bb58d07f937e2d3c7e65385f9c54730b704105ccdb691f6e146d4ee8f6c086f49511035110a9ad6031fdceb943e0f9613bcb276dd40f0624ef0f924f809783", + "e540277f683b1186dd3b5b3f61433396581a35feb12002be8c6a6231fc40ffa70f08081bc58b2d94f7649543614a435faa2d62110e13dabc7b86629b63af9c24", + "418500878c5fbcb584c432f4285e05e49f2e3e075399a0dbfcf874ebf8c03d02bf16bc6989d161c77ca0786b05053c6c709433712319192128835cf0b660595b", + "889090dbb1944bdc9433ee5ef1010c7a4a24a8e71ecea8e12a31318ce49dcab0aca5c3802334aab2cc84b14c6b9321fe586bf3f876f19cd406eb1127fb944801", + "53b6a28910aa92e27e536fb549cf9b9918791060898e0b9fe183577ff43b5e9c7689c745b32e412269837c31b89e6cc12bf76e13cad366b74ece48bb85fd09e9", + "7c092080c6a80d672409d081d3d177106bcd63567785140719490950ae07ae8fcaabbaaab330cfbcf7374482c220af2eadeeb73dcbb35ed823344e144e7d4899", + "9ccde566d2400509181111f32dde4cd63209fe59a30c114546ad2776d889a41bad8fa1bb468cb2f9d42ca9928a7770fef8e8ba4d0c812d9a1e75c3d8d2ccd75a", + "6e293bf5d03fe43977cfe3f57ccdb3ae282a85455dca33f37f4b74f8398cc612433d755cbec412f8f82a3bd3bc4a278f7ecd0dfa9bbdc40be7a787c8f159b2df", + "c56546fb2178456f336164c18b90deffc83ae2b5a3aca77b6884d36d2c1db39501b3e65e36c758c66e3188451fdb3515ee162c001f06c3e8cb573adf30f7a101", + "6f82f89f299ebca2fe014b59bffe1aa84e88b1915fe256afb646fd8448af2b8891a7fab37a4ea6f9a50e6c317039d8cf878f4c8e1a0dd464f0b4d6ff1c7ea853", + "2b8599ff9c3d6198637ad51e57d1998b0d75313fe2dd61a533c964a6dd9607c6f723e9452ce46e014b1c1d6de77ba5b88c914d1c597bf1eae13474b4290e89b2", + "08bf346d38e1df06c8260edb1da75579275948d5c0a0aa9ed2886f8856de5417a156998758f5b17e52f101ca957a71137473dfd18d7d209c4c10d9233c93691d", + "6df2156d773114d310b63db9ee5350d77e6bcf25b05fcd910f9b31bc42bb13fe8225ebcb2a23a62280777b6bf74e2cd0917c7640b43defe468cd1e18c943c66a", + "7c7038bc13a91151828a5ba82b4a96040f258a4dfb1b1373f0d359168afb0517a20b28a12d3644046be66b8d08d8ae7f6a923ea1c00187c6d11dc502bac71305", + "bcd1b30d808fb739b987cbf154bea00da9d40380b861d4c1d6377122dadd61c0e59018b71941cfb62e00dcd70aeb9abf0473e80f0a7eca6b6dea246ab229dd2b", + "7ed4468d968530fe7ab2c33540b26d8c3bd3ed44b34fbe8c2a9d7f805b5ada0ea252eeade4fce97f89728ad85bc8bb2430b1bef2cddd32c8446e59b8e8ba3c67", + "6d30b7c6ce8a3236c0ca2f8d728b1088ca06983a8043e621d5dcf0c537d13b08791edeb01a3cf0943ec1c890ab6e29b146a236cd46bcb9d93bf516fb67c63fe5", + "97fe03cef31438508911bded975980a66029305dc5e3fa8ad1b4fb22fcdf5a19a733320327d8f71ccf496cb3a44a77af56e3dde73d3a5f176896cc57c9a5ad99", + "785a9d0fbd21136dbce8fa7eafd63c9dad220052978416b31d9753eaa149097847ed9b30a65c70507eff01879149ed5cf0471d37798edc05abd56ad4a2cccb1d", + "ad408d2abddfd37b3bf34794c1a3371d928ed7fc8d966225333584c5665817832a37c07f0dc7cb5aa874cd7d20fe8fab8eabcb9b33d2e0841f6e200960899d95", + "97668f745b6032fc815d9579322769dccd9501a5080029b8ae826befb6742331bd9f76efeb3e2b8e81a9786b282f5068a3a2424697a77c41876b7e753f4c7767", + "26bb985f47e7fee0cfd252d4ef96bed42b9c370c1c6a3e8c9eb04ef7f7818b833a0d1f043ebafb911dc779e02740a02a44d3a1ea45ed4ad55e686c927cafe97e", + "5bfe2b1dcf7fe9b95088acedb575c19016c743b2e763bf5851ac407c9eda43715edfa48b4825492c5179593fff21351b76e8b7e034e4c53c79f61f29c479bd08", + "c76509ef72f4a6f9c9c40618ed52b2084f83502232e0ac8bdaf3264368e4d0180f6854c4abf4f6509c79caafc44cf3194afc57bd077bd7b3c9bda3d4b8775816", + "d66f2beab990e354ccb910e4e9c7ac618c7b63ef292a96b552341de78dc46d3ec8cfabc699b50af41fda39cf1b0173660923510ad67faedef5207cffe8641d20", + "7d8f0672992b79be3a364d8e5904f4ab713bbc8ab01b4f309ad8ccf223ce1034a860dcb0b00550612cc2fa17f2969e18f22e1427d254b4a82b3a03a3eb394adf", + "a56d6725bfb3de47c1414adf25fc8f0fc9846f6987722bc06366d5ca4e89722925ebbc881418844075397a0ca89842c7b9e9e07e1d9d183ebeb39e120b483bf7", + "af5e03d7fe60c67e10313344434e79485a03a758d6dce985574745763c1c5c77d4fb3e6fb12230368370993bf90feed0c5d1607524562d7c09c0c210ed393d7c", + "7a20540cc07bf72b582421fc342e82f52134b69841ec28ed189e2ea6a29dd2f82a640352d222b52f2911dc72a7dab31caadd80c6118f13c56b2a1e4373be0ea3", + "486f02c63e5467ea1fdde7e82bfacc2c1ba5d636d9f3d08b210da3f372f706ec218cc17ff60aef703bbe0c15c38ae55d286a684f864c78211ccab4178c92adba", + "1c7a5c1dedcd04a921788f7eb23361ca1953b04b9c7aec35d65ea3e4996db26f281278ea4ae666ad81027d98af57262cdbfa4c085f4210568c7e15eec7805114", + "9ce3fa9a860bdbd5378fd6d7b8b671c6cb7692910ce8f9b6cb4122cbcbe6ac06ca0422cef1225935053b7d193a81b9e972eb85a1d3074f14cbb5ec9f0573892d", + "a91187be5c371c4265c174fd4653b8ab708551f83d1fee1cc1479581bc006d6fb78fcc9a5dee1db3666f508f9780a37593ebcccf5fbed39667dc6361e921f779", + "4625767d7b1d3d3ed2fbc674af14e0244152f2a4021fcf3311505d89bd81e2f9f9a500c3b199914db49500b3c98d03ea93286751a686a3b875daab0ccd63b44f", + "43dfdfe1b014fed3a2acabb7f3e9a182f2aa18019d27e3e6cdcf31a15b428e91e7b08cf5e5c376fce2d8a28ff85ab0a0a1656edb4a0a91532620096d9a5a652d", + "279e3202be3989ba3112772585177487e4fe3ee3eab49c2f7fa7fe87cfe7b80d3e0355edff6d031e6c96c795db1c6f041880ec3824defacf9263820a8e7327de", + "ea2d066ac229d4d4b616a8bedec734325224e4b4e58f1ae6dad7e40c2da29196c3b1ea9571dacc81e87328caa0211e09027b0524aa3f4a849917b3586747ebbb", + "49f014f5c61822c899ab5cae51be4044a4495e777deb7da9b6d8490efbb87530adf293daf079f94c33b7044ef62e2e5bb3eb11e17304f8453ee6ce24f033ddb0", + "9233490344e5b0dc5912671b7ae54cee7730dbe1f4c7d92a4d3e3aab50571708db51dcf9c2944591db651db32d22935b86944969be77d5b5feae6c3840a8db26", + "b6e75e6f4c7f453b7465d25b5ac8c7196902eaa953875228c8634e16e2ae1f38bc3275304335f5989eccc1e34167d4e68d7719968fba8e2fe67947c35c48e806", + "cc14ca665af1483efbc3af80080e650d5046a3932f4f51f3fe90a0705ec25104adf07839265dc51d43401411246e474f0d5e5637af94767283d53e0617e981f4", + "230a1c857cb2e7852e41b647e90e4585d2d881e1734dc38955356e8dd7bff39053092c6b38e236e1899525647073dddf6895d64206325e7647f275567b255909", + "cbb65321ac436e2ffdab2936359ce49023f7dee7614ef28d173c3d27c5d1bffa51553d433f8ee3c9e49c05a2b883cce954c9a8093b80612a0cdd4732e041f995", + "3e7e570074337275efb51315588034c3cf0dddca20b4612e0bd5b881e7e5476d319ce4fe9f19186e4c0826f44f131eb048e65be242b1172c63badb123ab0cbe8", + "d32e9ec02d38d4e1b8249df8dcb00c5b9c68eb8922672e3505393b6a210ba56f9496e5ee0490ef387c3cdec061f06bc0382d9304cafbb8e0cd33d57029e62df2", + "8c1512466089f05b3775c262b62d22b83854a83218130b4ec91b3ccbd293d2a54302cecaab9b100c68d1e6ddc8f07cddbdfe6fdaaaf099cc09d6b725879c6369", + "91a7f61c97c2911e4c812ef71d780ad8fa788794561d08303fd1c1cb608a46a12563086ec5b39d471aed94fb0f6c678a43b8792932f9028d772a22768ea23a9b", + "4f6bb222a395e8b18f6ba155477aed3f0729ac9e83e16d31a2a8bc655422b837c891c6199e6f0d75799e3b691525c581953517f252c4b9e3a27a28fbaf49644c", + "5d06c07e7a646c413a501c3f4bb2fc38127de7509b7077c4d9b5613201c1aa02fd5f79d2745915dd57fbcb4ce08695f6efc0cb3d2d330e19b4b0e6004ea6471e", + "b96756e57909968f14b796a5d30f4c9d671472cf82c8cfb2caca7ac7a44ca0a14c9842d00c82e337502c94d5960aca4c492ea7b0df919ddf1aada2a275bb10d4", + "ff0a015e98db9c99f03977710aac3e658c0d896f6d71d618ba79dc6cf72ac75b7c038eb6862dede4543e145413a6368d69f5722c827ba3ef25b6ae6440d39276", + "5b21c5fd8868367612474fa2e70e9cfa2201ffeee8fafab5797ad58fefa17c9b5b107da4a3db6320baaf2c8617d5a51df914ae88da3867c2d41f0cc14fa67928", +} + +var goldenKeyed = []string{ + "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568", + "961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd", + "da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965", + "33d0825dddf7ada99b0e7e307104ad07ca9cfd9692214f1561356315e784f3e5a17e364ae9dbb14cb2036df932b77f4b292761365fb328de7afdc6d8998f5fc1", + "beaa5a3d08f3807143cf621d95cd690514d0b49efff9c91d24b59241ec0eefa5f60196d407048bba8d2146828ebcb0488d8842fd56bb4f6df8e19c4b4daab8ac", + "098084b51fd13deae5f4320de94a688ee07baea2800486689a8636117b46c1f4c1f6af7f74ae7c857600456a58a3af251dc4723a64cc7c0a5ab6d9cac91c20bb", + "6044540d560853eb1c57df0077dd381094781cdb9073e5b1b3d3f6c7829e12066bbaca96d989a690de72ca3133a83652ba284a6d62942b271ffa2620c9e75b1f", + "7a8cfe9b90f75f7ecb3acc053aaed6193112b6f6a4aeeb3f65d3de541942deb9e2228152a3c4bbbe72fc3b12629528cfbb09fe630f0474339f54abf453e2ed52", + "380beaf6ea7cc9365e270ef0e6f3a64fb902acae51dd5512f84259ad2c91f4bc4108db73192a5bbfb0cbcf71e46c3e21aee1c5e860dc96e8eb0b7b8426e6abe9", + "60fe3c4535e1b59d9a61ea8500bfac41a69dffb1ceadd9aca323e9a625b64da5763bad7226da02b9c8c4f1a5de140ac5a6c1124e4f718ce0b28ea47393aa6637", + "4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd", + "f228773ce3f3a42b5f144d63237a72d99693adb8837d0e112a8a0f8ffff2c362857ac49c11ec740d1500749dac9b1f4548108bf3155794dcc9e4082849e2b85b", + "962452a8455cc56c8511317e3b1f3b2c37df75f588e94325fdd77070359cf63a9ae6e930936fdf8e1e08ffca440cfb72c28f06d89a2151d1c46cd5b268ef8563", + "43d44bfa18768c59896bf7ed1765cb2d14af8c260266039099b25a603e4ddc5039d6ef3a91847d1088d401c0c7e847781a8a590d33a3c6cb4df0fab1c2f22355", + "dcffa9d58c2a4ca2cdbb0c7aa4c4c1d45165190089f4e983bb1c2cab4aaeff1fa2b5ee516fecd780540240bf37e56c8bcca7fab980e1e61c9400d8a9a5b14ac6", + "6fbf31b45ab0c0b8dad1c0f5f4061379912dde5aa922099a030b725c73346c524291adef89d2f6fd8dfcda6d07dad811a9314536c2915ed45da34947e83de34e", + "a0c65bddde8adef57282b04b11e7bc8aab105b99231b750c021f4a735cb1bcfab87553bba3abb0c3e64a0b6955285185a0bd35fb8cfde557329bebb1f629ee93", + "f99d815550558e81eca2f96718aed10d86f3f1cfb675cce06b0eff02f617c5a42c5aa760270f2679da2677c5aeb94f1142277f21c7f79f3c4f0cce4ed8ee62b1", + "95391da8fc7b917a2044b3d6f5374e1ca072b41454d572c7356c05fd4bc1e0f40b8bb8b4a9f6bce9be2c4623c399b0dca0dab05cb7281b71a21b0ebcd9e55670", + "04b9cd3d20d221c09ac86913d3dc63041989a9a1e694f1e639a3ba7e451840f750c2fc191d56ad61f2e7936bc0ac8e094b60caeed878c18799045402d61ceaf9", + "ec0e0ef707e4ed6c0c66f9e089e4954b058030d2dd86398fe84059631f9ee591d9d77375355149178c0cf8f8e7c49ed2a5e4f95488a2247067c208510fadc44c", + "9a37cce273b79c09913677510eaf7688e89b3314d3532fd2764c39de022a2945b5710d13517af8ddc0316624e73bec1ce67df15228302036f330ab0cb4d218dd", + "4cf9bb8fb3d4de8b38b2f262d3c40f46dfe747e8fc0a414c193d9fcf753106ce47a18f172f12e8a2f1c26726545358e5ee28c9e2213a8787aafbc516d2343152", + "64e0c63af9c808fd893137129867fd91939d53f2af04be4fa268006100069b2d69daa5c5d8ed7fddcb2a70eeecdf2b105dd46a1e3b7311728f639ab489326bc9", + "5e9c93158d659b2def06b0c3c7565045542662d6eee8a96a89b78ade09fe8b3dcc096d4fe48815d88d8f82620156602af541955e1f6ca30dce14e254c326b88f", + "7775dff889458dd11aef417276853e21335eb88e4dec9cfb4e9edb49820088551a2ca60339f12066101169f0dfe84b098fddb148d9da6b3d613df263889ad64b", + "f0d2805afbb91f743951351a6d024f9353a23c7ce1fc2b051b3a8b968c233f46f50f806ecb1568ffaa0b60661e334b21dde04f8fa155ac740eeb42e20b60d764", + "86a2af316e7d7754201b942e275364ac12ea8962ab5bd8d7fb276dc5fbffc8f9a28cae4e4867df6780d9b72524160927c855da5b6078e0b554aa91e31cb9ca1d", + "10bdf0caa0802705e706369baf8a3f79d72c0a03a80675a7bbb00be3a45e516424d1ee88efb56f6d5777545ae6e27765c3a8f5e493fc308915638933a1dfee55", + "b01781092b1748459e2e4ec178696627bf4ebafebba774ecf018b79a68aeb84917bf0b84bb79d17b743151144cd66b7b33a4b9e52c76c4e112050ff5385b7f0b", + "c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e", + "eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7", + "86221f3ada52037b72224f105d7999231c5e5534d03da9d9c0a12acb68460cd375daf8e24386286f9668f72326dbf99ba094392437d398e95bb8161d717f8991", + "5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347", + "ce0f4f6aca89590a37fe034dd74dd5fa65eb1cbd0a41508aaddc09351a3cea6d18cb2189c54b700c009f4cbf0521c7ea01be61c5ae09cb54f27bc1b44d658c82", + "7ee80b06a215a3bca970c77cda8761822bc103d44fa4b33f4d07dcb997e36d55298bceae12241b3fa07fa63be5576068da387b8d5859aeab701369848b176d42", + "940a84b6a84d109aab208c024c6ce9647676ba0aaa11f86dbb7018f9fd2220a6d901a9027f9abcf935372727cbf09ebd61a2a2eeb87653e8ecad1bab85dc8327", + "2020b78264a82d9f4151141adba8d44bf20c5ec062eee9b595a11f9e84901bf148f298e0c9f8777dcdbc7cc4670aac356cc2ad8ccb1629f16f6a76bcefbee760", + "d1b897b0e075ba68ab572adf9d9c436663e43eb3d8e62d92fc49c9be214e6f27873fe215a65170e6bea902408a25b49506f47babd07cecf7113ec10c5dd31252", + "b14d0c62abfa469a357177e594c10c194243ed2025ab8aa5ad2fa41ad318e0ff48cd5e60bec07b13634a711d2326e488a985f31e31153399e73088efc86a5c55", + "4169c5cc808d2697dc2a82430dc23e3cd356dc70a94566810502b8d655b39abf9e7f902fe717e0389219859e1945df1af6ada42e4ccda55a197b7100a30c30a1", + "258a4edb113d66c839c8b1c91f15f35ade609f11cd7f8681a4045b9fef7b0b24c82cda06a5f2067b368825e3914e53d6948ede92efd6e8387fa2e537239b5bee", + "79d2d8696d30f30fb34657761171a11e6c3f1e64cbe7bebee159cb95bfaf812b4f411e2f26d9c421dc2c284a3342d823ec293849e42d1e46b0a4ac1e3c86abaa", + "8b9436010dc5dee992ae38aea97f2cd63b946d94fedd2ec9671dcde3bd4ce9564d555c66c15bb2b900df72edb6b891ebcadfeff63c9ea4036a998be7973981e7", + "c8f68e696ed28242bf997f5b3b34959508e42d613810f1e2a435c96ed2ff560c7022f361a9234b9837feee90bf47922ee0fd5f8ddf823718d86d1e16c6090071", + "b02d3eee4860d5868b2c39ce39bfe81011290564dd678c85e8783f29302dfc1399ba95b6b53cd9ebbf400cca1db0ab67e19a325f2d115812d25d00978ad1bca4", + "7693ea73af3ac4dad21ca0d8da85b3118a7d1c6024cfaf557699868217bc0c2f44a199bc6c0edd519798ba05bd5b1b4484346a47c2cadf6bf30b785cc88b2baf", + "a0e5c1c0031c02e48b7f09a5e896ee9aef2f17fc9e18e997d7f6cac7ae316422c2b1e77984e5f3a73cb45deed5d3f84600105e6ee38f2d090c7d0442ea34c46d", + "41daa6adcfdb69f1440c37b596440165c15ada596813e2e22f060fcd551f24dee8e04ba6890387886ceec4a7a0d7fc6b44506392ec3822c0d8c1acfc7d5aebe8", + "14d4d40d5984d84c5cf7523b7798b254e275a3a8cc0a1bd06ebc0bee726856acc3cbf516ff667cda2058ad5c3412254460a82c92187041363cc77a4dc215e487", + "d0e7a1e2b9a447fee83e2277e9ff8010c2f375ae12fa7aaa8ca5a6317868a26a367a0b69fbc1cf32a55d34eb370663016f3d2110230eba754028a56f54acf57c", + "e771aa8db5a3e043e8178f39a0857ba04a3f18e4aa05743cf8d222b0b095825350ba422f63382a23d92e4149074e816a36c1cd28284d146267940b31f8818ea2", + "feb4fd6f9e87a56bef398b3284d2bda5b5b0e166583a66b61e538457ff0584872c21a32962b9928ffab58de4af2edd4e15d8b35570523207ff4e2a5aa7754caa", + "462f17bf005fb1c1b9e671779f665209ec2873e3e411f98dabf240a1d5ec3f95ce6796b6fc23fe171903b502023467dec7273ff74879b92967a2a43a5a183d33", + "d3338193b64553dbd38d144bea71c5915bb110e2d88180dbc5db364fd6171df317fc7268831b5aef75e4342b2fad8797ba39eddcef80e6ec08159350b1ad696d", + "e1590d585a3d39f7cb599abd479070966409a6846d4377acf4471d065d5db94129cc9be92573b05ed226be1e9b7cb0cabe87918589f80dadd4ef5ef25a93d28e", + "f8f3726ac5a26cc80132493a6fedcb0e60760c09cfc84cad178175986819665e76842d7b9fedf76dddebf5d3f56faaad4477587af21606d396ae570d8e719af2", + "30186055c07949948183c850e9a756cc09937e247d9d928e869e20bafc3cd9721719d34e04a0899b92c736084550186886efba2e790d8be6ebf040b209c439a4", + "f3c4276cb863637712c241c444c5cc1e3554e0fddb174d035819dd83eb700b4ce88df3ab3841ba02085e1a99b4e17310c5341075c0458ba376c95a6818fbb3e2", + "0aa007c4dd9d5832393040a1583c930bca7dc5e77ea53add7e2b3f7c8e231368043520d4a3ef53c969b6bbfd025946f632bd7f765d53c21003b8f983f75e2a6a", + "08e9464720533b23a04ec24f7ae8c103145f765387d738777d3d343477fd1c58db052142cab754ea674378e18766c53542f71970171cc4f81694246b717d7564", + "d37ff7ad297993e7ec21e0f1b4b5ae719cdc83c5db687527f27516cbffa822888a6810ee5c1ca7bfe3321119be1ab7bfa0a502671c8329494df7ad6f522d440f", + "dd9042f6e464dcf86b1262f6accfafbd8cfd902ed3ed89abf78ffa482dbdeeb6969842394c9a1168ae3d481a017842f660002d42447c6b22f7b72f21aae021c9", + "bd965bf31e87d70327536f2a341cebc4768eca275fa05ef98f7f1b71a0351298de006fba73fe6733ed01d75801b4a928e54231b38e38c562b2e33ea1284992fa", + "65676d800617972fbd87e4b9514e1c67402b7a331096d3bfac22f1abb95374abc942f16e9ab0ead33b87c91968a6e509e119ff07787b3ef483e1dcdccf6e3022", + "939fa189699c5d2c81ddd1ffc1fa207c970b6a3685bb29ce1d3e99d42f2f7442da53e95a72907314f4588399a3ff5b0a92beb3f6be2694f9f86ecf2952d5b41c", + "c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc", + "987fd6e0d6857c553eaebb3d34970a2c2f6e89a3548f492521722b80a1c21a153892346d2cba6444212d56da9a26e324dccbc0dcde85d4d2ee4399eec5a64e8f", + "ae56deb1c2328d9c4017706bce6e99d41349053ba9d336d677c4c27d9fd50ae6aee17e853154e1f4fe7672346da2eaa31eea53fcf24a22804f11d03da6abfc2b", + "49d6a608c9bde4491870498572ac31aac3fa40938b38a7818f72383eb040ad39532bc06571e13d767e6945ab77c0bdc3b0284253343f9f6c1244ebf2ff0df866", + "da582ad8c5370b4469af862aa6467a2293b2b28bd80ae0e91f425ad3d47249fdf98825cc86f14028c3308c9804c78bfeeeee461444ce243687e1a50522456a1d", + "d5266aa3331194aef852eed86d7b5b2633a0af1c735906f2e13279f14931a9fc3b0eac5ce9245273bd1aa92905abe16278ef7efd47694789a7283b77da3c70f8", + "2962734c28252186a9a1111c732ad4de4506d4b4480916303eb7991d659ccda07a9911914bc75c418ab7a4541757ad054796e26797feaf36e9f6ad43f14b35a4", + "e8b79ec5d06e111bdfafd71e9f5760f00ac8ac5d8bf768f9ff6f08b8f026096b1cc3a4c973333019f1e3553e77da3f98cb9f542e0a90e5f8a940cc58e59844b3", + "dfb320c44f9d41d1efdcc015f08dd5539e526e39c87d509ae6812a969e5431bf4fa7d91ffd03b981e0d544cf72d7b1c0374f8801482e6dea2ef903877eba675e", + "d88675118fdb55a5fb365ac2af1d217bf526ce1ee9c94b2f0090b2c58a06ca58187d7fe57c7bed9d26fca067b4110eefcd9a0a345de872abe20de368001b0745", + "b893f2fc41f7b0dd6e2f6aa2e0370c0cff7df09e3acfcc0e920b6e6fad0ef747c40668417d342b80d2351e8c175f20897a062e9765e6c67b539b6ba8b9170545", + "6c67ec5697accd235c59b486d7b70baeedcbd4aa64ebd4eef3c7eac189561a726250aec4d48cadcafbbe2ce3c16ce2d691a8cce06e8879556d4483ed7165c063", + "f1aa2b044f8f0c638a3f362e677b5d891d6fd2ab0765f6ee1e4987de057ead357883d9b405b9d609eea1b869d97fb16d9b51017c553f3b93c0a1e0f1296fedcd", + "cbaa259572d4aebfc1917acddc582b9f8dfaa928a198ca7acd0f2aa76a134a90252e6298a65b08186a350d5b7626699f8cb721a3ea5921b753ae3a2dce24ba3a", + "fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed", + "5cf2ac897ab444dcb5c8d87c495dbdb34e1838b6b629427caa51702ad0f9688525f13bec503a3c3a2c80a65e0b5715e8afab00ffa56ec455a49a1ad30aa24fcd", + "9aaf80207bace17bb7ab145757d5696bde32406ef22b44292ef65d4519c3bb2ad41a59b62cc3e94b6fa96d32a7faadae28af7d35097219aa3fd8cda31e40c275", + "af88b163402c86745cb650c2988fb95211b94b03ef290eed9662034241fd51cf398f8073e369354c43eae1052f9b63b08191caa138aa54fea889cc7024236897", + "48fa7d64e1ceee27b9864db5ada4b53d00c9bc7626555813d3cd6730ab3cc06ff342d727905e33171bde6e8476e77fb1720861e94b73a2c538d254746285f430", + "0e6fd97a85e904f87bfe85bbeb34f69e1f18105cf4ed4f87aec36c6e8b5f68bd2a6f3dc8a9ecb2b61db4eedb6b2ea10bf9cb0251fb0f8b344abf7f366b6de5ab", + "06622da5787176287fdc8fed440bad187d830099c94e6d04c8e9c954cda70c8bb9e1fc4a6d0baa831b9b78ef6648681a4867a11da93ee36e5e6a37d87fc63f6f", + "1da6772b58fabf9c61f68d412c82f182c0236d7d575ef0b58dd22458d643cd1dfc93b03871c316d8430d312995d4197f0874c99172ba004a01ee295abac24e46", + "3cd2d9320b7b1d5fb9aab951a76023fa667be14a9124e394513918a3f44096ae4904ba0ffc150b63bc7ab1eeb9a6e257e5c8f000a70394a5afd842715de15f29", + "04cdc14f7434e0b4be70cb41db4c779a88eaef6accebcb41f2d42fffe7f32a8e281b5c103a27021d0d08362250753cdf70292195a53a48728ceb5844c2d98bab", + "9071b7a8a075d0095b8fb3ae5113785735ab98e2b52faf91d5b89e44aac5b5d4ebbf91223b0ff4c71905da55342e64655d6ef8c89a4768c3f93a6dc0366b5bc8", + "ebb30240dd96c7bc8d0abe49aa4edcbb4afdc51ff9aaf720d3f9e7fbb0f9c6d6571350501769fc4ebd0b2141247ff400d4fd4be414edf37757bb90a32ac5c65a", + "8532c58bf3c8015d9d1cbe00eef1f5082f8f3632fbe9f1ed4f9dfb1fa79e8283066d77c44c4af943d76b300364aecbd0648c8a8939bd204123f4b56260422dec", + "fe9846d64f7c7708696f840e2d76cb4408b6595c2f81ec6a28a7f2f20cb88cfe6ac0b9e9b8244f08bd7095c350c1d0842f64fb01bb7f532dfcd47371b0aeeb79", + "28f17ea6fb6c42092dc264257e29746321fb5bdaea9873c2a7fa9d8f53818e899e161bc77dfe8090afd82bf2266c5c1bc930a8d1547624439e662ef695f26f24", + "ec6b7d7f030d4850acae3cb615c21dd25206d63e84d1db8d957370737ba0e98467ea0ce274c66199901eaec18a08525715f53bfdb0aacb613d342ebdceeddc3b", + "b403d3691c03b0d3418df327d5860d34bbfcc4519bfbce36bf33b208385fadb9186bc78a76c489d89fd57e7dc75412d23bcd1dae8470ce9274754bb8585b13c5", + "31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463", + "bb2039ec287091bcc9642fc90049e73732e02e577e2862b32216ae9bedcd730c4c284ef3968c368b7d37584f97bd4b4dc6ef6127acfe2e6ae2509124e66c8af4", + "f53d68d13f45edfcb9bd415e2831e938350d5380d3432278fc1c0c381fcb7c65c82dafe051d8c8b0d44e0974a0e59ec7bf7ed0459f86e96f329fc79752510fd3", + "8d568c7984f0ecdf7640fbc483b5d8c9f86634f6f43291841b309a350ab9c1137d24066b09da9944bac54d5bb6580d836047aac74ab724b887ebf93d4b32eca9", + "c0b65ce5a96ff774c456cac3b5f2c4cd359b4ff53ef93a3da0778be4900d1e8da1601e769e8f1b02d2a2f8c5b9fa10b44f1c186985468feeb008730283a6657d", + "4900bba6f5fb103ece8ec96ada13a5c3c85488e05551da6b6b33d988e611ec0fe2e3c2aa48ea6ae8986a3a231b223c5d27cec2eadde91ce07981ee652862d1e4", + "c7f5c37c7285f927f76443414d4357ff789647d7a005a5a787e03c346b57f49f21b64fa9cf4b7e45573e23049017567121a9c3d4b2b73ec5e9413577525db45a", + "ec7096330736fdb2d64b5653e7475da746c23a4613a82687a28062d3236364284ac01720ffb406cfe265c0df626a188c9e5963ace5d3d5bb363e32c38c2190a6", + "82e744c75f4649ec52b80771a77d475a3bc091989556960e276a5f9ead92a03f718742cdcfeaee5cb85c44af198adc43a4a428f5f0c2ddb0be36059f06d7df73", + "2834b7a7170f1f5b68559ab78c1050ec21c919740b784a9072f6e5d69f828d70c919c5039fb148e39e2c8a52118378b064ca8d5001cd10a5478387b966715ed6", + "16b4ada883f72f853bb7ef253efcab0c3e2161687ad61543a0d2824f91c1f81347d86be709b16996e17f2dd486927b0288ad38d13063c4a9672c39397d3789b6", + "78d048f3a69d8b54ae0ed63a573ae350d89f7c6cf1f3688930de899afa037697629b314e5cd303aa62feea72a25bf42b304b6c6bcb27fae21c16d925e1fbdac3", + "0f746a48749287ada77a82961f05a4da4abdb7d77b1220f836d09ec814359c0ec0239b8c7b9ff9e02f569d1b301ef67c4612d1de4f730f81c12c40cc063c5caa", + "f0fc859d3bd195fbdc2d591e4cdac15179ec0f1dc821c11df1f0c1d26e6260aaa65b79fafacafd7d3ad61e600f250905f5878c87452897647a35b995bcadc3a3", + "2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b", + "227e3aed8d2cb10b918fcb04f9de3e6d0a57e08476d93759cd7b2ed54a1cbf0239c528fb04bbf288253e601d3bc38b21794afef90b17094a182cac557745e75f", + "1a929901b09c25f27d6b35be7b2f1c4745131fdebca7f3e2451926720434e0db6e74fd693ad29b777dc3355c592a361c4873b01133a57c2e3b7075cbdb86f4fc", + "5fd7968bc2fe34f220b5e3dc5af9571742d73b7d60819f2888b629072b96a9d8ab2d91b82d0a9aaba61bbd39958132fcc4257023d1eca591b3054e2dc81c8200", + "dfcce8cf32870cc6a503eadafc87fd6f78918b9b4d0737db6810be996b5497e7e5cc80e312f61e71ff3e9624436073156403f735f56b0b01845c18f6caf772e6", + "02f7ef3a9ce0fff960f67032b296efca3061f4934d690749f2d01c35c81c14f39a67fa350bc8a0359bf1724bffc3bca6d7c7bba4791fd522a3ad353c02ec5aa8", + "64be5c6aba65d594844ae78bb022e5bebe127fd6b6ffa5a13703855ab63b624dcd1a363f99203f632ec386f3ea767fc992e8ed9686586aa27555a8599d5b808f", + "f78585505c4eaa54a8b5be70a61e735e0ff97af944ddb3001e35d86c4e2199d976104b6ae31750a36a726ed285064f5981b503889fef822fcdc2898dddb7889a", + "e4b5566033869572edfd87479a5bb73c80e8759b91232879d96b1dda36c012076ee5a2ed7ae2de63ef8406a06aea82c188031b560beafb583fb3de9e57952a7e", + "e1b3e7ed867f6c9484a2a97f7715f25e25294e992e41f6a7c161ffc2adc6daaeb7113102d5e6090287fe6ad94ce5d6b739c6ca240b05c76fb73f25dd024bf935", + "85fd085fdc12a080983df07bd7012b0d402a0f4043fcb2775adf0bad174f9b08d1676e476985785c0a5dcc41dbff6d95ef4d66a3fbdc4a74b82ba52da0512b74", + "aed8fa764b0fbff821e05233d2f7b0900ec44d826f95e93c343c1bc3ba5a24374b1d616e7e7aba453a0ada5e4fab5382409e0d42ce9c2bc7fb39a99c340c20f0", + "7ba3b2e297233522eeb343bd3ebcfd835a04007735e87f0ca300cbee6d416565162171581e4020ff4cf176450f1291ea2285cb9ebffe4c56660627685145051c", + "de748bcf89ec88084721e16b85f30adb1a6134d664b5843569babc5bbd1a15ca9b61803c901a4fef32965a1749c9f3a4e243e173939dc5a8dc495c671ab52145", + "aaf4d2bdf200a919706d9842dce16c98140d34bc433df320aba9bd429e549aa7a3397652a4d768277786cf993cde2338673ed2e6b66c961fefb82cd20c93338f", + "c408218968b788bf864f0997e6bc4c3dba68b276e2125a4843296052ff93bf5767b8cdce7131f0876430c1165fec6c4f47adaa4fd8bcfacef463b5d3d0fa61a0", + "76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb", + "72065ee4dd91c2d8509fa1fc28a37c7fc9fa7d5b3f8ad3d0d7a25626b57b1b44788d4caf806290425f9890a3a2a35a905ab4b37acfd0da6e4517b2525c9651e4", + "64475dfe7600d7171bea0b394e27c9b00d8e74dd1e416a79473682ad3dfdbb706631558055cfc8a40e07bd015a4540dcdea15883cbbf31412df1de1cd4152b91", + "12cd1674a4488a5d7c2b3160d2e2c4b58371bedad793418d6f19c6ee385d70b3e06739369d4df910edb0b0a54cbff43d54544cd37ab3a06cfa0a3ddac8b66c89", + "60756966479dedc6dd4bcff8ea7d1d4ce4d4af2e7b097e32e3763518441147cc12b3c0ee6d2ecabf1198cec92e86a3616fba4f4e872f5825330adbb4c1dee444", + "a7803bcb71bc1d0f4383dde1e0612e04f872b715ad30815c2249cf34abb8b024915cb2fc9f4e7cc4c8cfd45be2d5a91eab0941c7d270e2da4ca4a9f7ac68663a", + "b84ef6a7229a34a750d9a98ee2529871816b87fbe3bc45b45fa5ae82d5141540211165c3c5d7a7476ba5a4aa06d66476f0d9dc49a3f1ee72c3acabd498967414", + "fae4b6d8efc3f8c8e64d001dabec3a21f544e82714745251b2b4b393f2f43e0da3d403c64db95a2cb6e23ebb7b9e94cdd5ddac54f07c4a61bd3cb10aa6f93b49", + "34f7286605a122369540141ded79b8957255da2d4155abbf5a8dbb89c8eb7ede8eeef1daa46dc29d751d045dc3b1d658bb64b80ff8589eddb3824b13da235a6b", + "3b3b48434be27b9eababba43bf6b35f14b30f6a88dc2e750c358470d6b3aa3c18e47db4017fa55106d8252f016371a00f5f8b070b74ba5f23cffc5511c9f09f0", + "ba289ebd6562c48c3e10a8ad6ce02e73433d1e93d7c9279d4d60a7e879ee11f441a000f48ed9f7c4ed87a45136d7dccdca482109c78a51062b3ba4044ada2469", + "022939e2386c5a37049856c850a2bb10a13dfea4212b4c732a8840a9ffa5faf54875c5448816b2785a007da8a8d2bc7d71a54e4e6571f10b600cbdb25d13ede3", + "e6fec19d89ce8717b1a087024670fe026f6c7cbda11caef959bb2d351bf856f8055d1c0ebdaaa9d1b17886fc2c562b5e99642fc064710c0d3488a02b5ed7f6fd", + "94c96f02a8f576aca32ba61c2b206f907285d9299b83ac175c209a8d43d53bfe683dd1d83e7549cb906c28f59ab7c46f8751366a28c39dd5fe2693c9019666c8", + "31a0cd215ebd2cb61de5b9edc91e6195e31c59a5648d5c9f737e125b2605708f2e325ab3381c8dce1a3e958886f1ecdc60318f882cfe20a24191352e617b0f21", + "91ab504a522dce78779f4c6c6ba2e6b6db5565c76d3e7e7c920caf7f757ef9db7c8fcf10e57f03379ea9bf75eb59895d96e149800b6aae01db778bb90afbc989", + "d85cabc6bd5b1a01a5afd8c6734740da9fd1c1acc6db29bfc8a2e5b668b028b6b3154bfb8703fa3180251d589ad38040ceb707c4bad1b5343cb426b61eaa49c1", + "d62efbec2ca9c1f8bd66ce8b3f6a898cb3f7566ba6568c618ad1feb2b65b76c3ce1dd20f7395372faf28427f61c9278049cf0140df434f5633048c86b81e0399", + "7c8fdc6175439e2c3db15bafa7fb06143a6a23bc90f449e79deef73c3d492a671715c193b6fea9f036050b946069856b897e08c00768f5ee5ddcf70b7cd6d0e0", + "58602ee7468e6bc9df21bd51b23c005f72d6cb013f0a1b48cbec5eca299299f97f09f54a9a01483eaeb315a6478bad37ba47ca1347c7c8fc9e6695592c91d723", + "27f5b79ed256b050993d793496edf4807c1d85a7b0a67c9c4fa99860750b0ae66989670a8ffd7856d7ce411599e58c4d77b232a62bef64d15275be46a68235ff", + "3957a976b9f1887bf004a8dca942c92d2b37ea52600f25e0c9bc5707d0279c00c6e85a839b0d2d8eb59c51d94788ebe62474a791cadf52cccf20f5070b6573fc", + "eaa2376d55380bf772ecca9cb0aa4668c95c707162fa86d518c8ce0ca9bf7362b9f2a0adc3ff59922df921b94567e81e452f6c1a07fc817cebe99604b3505d38", + "c1e2c78b6b2734e2480ec550434cb5d613111adcc21d475545c3b1b7e6ff12444476e5c055132e2229dc0f807044bb919b1a5662dd38a9ee65e243a3911aed1a", + "8ab48713389dd0fcf9f965d3ce66b1e559a1f8c58741d67683cd971354f452e62d0207a65e436c5d5d8f8ee71c6abfe50e669004c302b31a7ea8311d4a916051", + "24ce0addaa4c65038bd1b1c0f1452a0b128777aabc94a29df2fd6c7e2f85f8ab9ac7eff516b0e0a825c84a24cfe492eaad0a6308e46dd42fe8333ab971bb30ca", + "5154f929ee03045b6b0c0004fa778edee1d139893267cc84825ad7b36c63de32798e4a166d24686561354f63b00709a1364b3c241de3febf0754045897467cd4", + "e74e907920fd87bd5ad636dd11085e50ee70459c443e1ce5809af2bc2eba39f9e6d7128e0e3712c316da06f4705d78a4838e28121d4344a2c79c5e0db307a677", + "bf91a22334bac20f3fd80663b3cd06c4e8802f30e6b59f90d3035cc9798a217ed5a31abbda7fa6842827bdf2a7a1c21f6fcfccbb54c6c52926f32da816269be1", + "d9d5c74be5121b0bd742f26bffb8c89f89171f3f934913492b0903c271bbe2b3395ef259669bef43b57f7fcc3027db01823f6baee66e4f9fead4d6726c741fce", + "50c8b8cf34cd879f80e2faab3230b0c0e1cc3e9dcadeb1b9d97ab923415dd9a1fe38addd5c11756c67990b256e95ad6d8f9fedce10bf1c90679cde0ecf1be347", + "0a386e7cd5dd9b77a035e09fe6fee2c8ce61b5383c87ea43205059c5e4cd4f4408319bb0a82360f6a58e6c9ce3f487c446063bf813bc6ba535e17fc1826cfc91", + "1f1459cb6b61cbac5f0efe8fc487538f42548987fcd56221cfa7beb22504769e792c45adfb1d6b3d60d7b749c8a75b0bdf14e8ea721b95dca538ca6e25711209", + "e58b3836b7d8fedbb50ca5725c6571e74c0785e97821dab8b6298c10e4c079d4a6cdf22f0fedb55032925c16748115f01a105e77e00cee3d07924dc0d8f90659", + "b929cc6505f020158672deda56d0db081a2ee34c00c1100029bdf8ea98034fa4bf3e8655ec697fe36f40553c5bb46801644a627d3342f4fc92b61f03290fb381", + "72d353994b49d3e03153929a1e4d4f188ee58ab9e72ee8e512f29bc773913819ce057ddd7002c0433ee0a16114e3d156dd2c4a7e80ee53378b8670f23e33ef56", + "c70ef9bfd775d408176737a0736d68517ce1aaad7e81a93c8c1ed967ea214f56c8a377b1763e676615b60f3988241eae6eab9685a5124929d28188f29eab06f7", + "c230f0802679cb33822ef8b3b21bf7a9a28942092901d7dac3760300831026cf354c9232df3e084d9903130c601f63c1f4a4a4b8106e468cd443bbe5a734f45f", + "6f43094cafb5ebf1f7a4937ec50f56a4c9da303cbb55ac1f27f1f1976cd96beda9464f0e7b9c54620b8a9fba983164b8be3578425a024f5fe199c36356b88972", + "3745273f4c38225db2337381871a0c6aafd3af9b018c88aa02025850a5dc3a42a1a3e03e56cbf1b0876d63a441f1d2856a39b8801eb5af325201c415d65e97fe", + "c50c44cca3ec3edaae779a7e179450ebdda2f97067c690aa6c5a4ac7c30139bb27c0df4db3220e63cb110d64f37ffe078db72653e2daacf93ae3f0a2d1a7eb2e", + "8aef263e385cbc61e19b28914243262af5afe8726af3ce39a79c27028cf3ecd3f8d2dfd9cfc9ad91b58f6f20778fd5f02894a3d91c7d57d1e4b866a7f364b6be", + "28696141de6e2d9bcb3235578a66166c1448d3e905a1b482d423be4bc5369bc8c74dae0acc9cc123e1d8ddce9f97917e8c019c552da32d39d2219b9abf0fa8c8", + "2fb9eb2085830181903a9dafe3db428ee15be7662224efd643371fb25646aee716e531eca69b2bdc8233f1a8081fa43da1500302975a77f42fa592136710e9dc", + "66f9a7143f7a3314a669bf2e24bbb35014261d639f495b6c9c1f104fe8e320aca60d4550d69d52edbd5a3cdeb4014ae65b1d87aa770b69ae5c15f4330b0b0ad8", + "f4c4dd1d594c3565e3e25ca43dad82f62abea4835ed4cd811bcd975e46279828d44d4c62c3679f1b7f7b9dd4571d7b49557347b8c5460cbdc1bef690fb2a08c0", + "8f1dc9649c3a84551f8f6e91cac68242a43b1f8f328ee92280257387fa7559aa6db12e4aeadc2d26099178749c6864b357f3f83b2fb3efa8d2a8db056bed6bcc", + "3139c1a7f97afd1675d460ebbc07f2728aa150df849624511ee04b743ba0a833092f18c12dc91b4dd243f333402f59fe28abdbbbae301e7b659c7a26d5c0f979", + "06f94a2996158a819fe34c40de3cf0379fd9fb85b3e363ba3926a0e7d960e3f4c2e0c70c7ce0ccb2a64fc29869f6e7ab12bd4d3f14fce943279027e785fb5c29", + "c29c399ef3eee8961e87565c1ce263925fc3d0ce267d13e48dd9e732ee67b0f69fad56401b0f10fcaac119201046cca28c5b14abdea3212ae65562f7f138db3d", + "4cec4c9df52eef05c3f6faaa9791bc7445937183224ecc37a1e58d0132d35617531d7e795f52af7b1eb9d147de1292d345fe341823f8e6bc1e5badca5c656108", + "898bfbae93b3e18d00697eab7d9704fa36ec339d076131cefdf30edbe8d9cc81c3a80b129659b163a323bab9793d4feed92d54dae966c77529764a09be88db45", + "ee9bd0469d3aaf4f14035be48a2c3b84d9b4b1fff1d945e1f1c1d38980a951be197b25fe22c731f20aeacc930ba9c4a1f4762227617ad350fdabb4e80273a0f4", + "3d4d3113300581cd96acbf091c3d0f3c310138cd6979e6026cde623e2dd1b24d4a8638bed1073344783ad0649cc6305ccec04beb49f31c633088a99b65130267", + "95c0591ad91f921ac7be6d9ce37e0663ed8011c1cfd6d0162a5572e94368bac02024485e6a39854aa46fe38e97d6c6b1947cd272d86b06bb5b2f78b9b68d559d", + "227b79ded368153bf46c0a3ca978bfdbef31f3024a5665842468490b0ff748ae04e7832ed4c9f49de9b1706709d623e5c8c15e3caecae8d5e433430ff72f20eb", + "5d34f3952f0105eef88ae8b64c6ce95ebfade0e02c69b08762a8712d2e4911ad3f941fc4034dc9b2e479fdbcd279b902faf5d838bb2e0c6495d372b5b7029813", + "7f939bf8353abce49e77f14f3750af20b7b03902e1a1e7fb6aaf76d0259cd401a83190f15640e74f3e6c5a90e839c7821f6474757f75c7bf9002084ddc7a62dc", + "062b61a2f9a33a71d7d0a06119644c70b0716a504de7e5e1be49bd7b86e7ed6817714f9f0fc313d06129597e9a2235ec8521de36f7290a90ccfc1ffa6d0aee29", + "f29e01eeae64311eb7f1c6422f946bf7bea36379523e7b2bbaba7d1d34a22d5ea5f1c5a09d5ce1fe682cced9a4798d1a05b46cd72dff5c1b355440b2a2d476bc", + "ec38cd3bbab3ef35d7cb6d5c914298351d8a9dc97fcee051a8a02f58e3ed6184d0b7810a5615411ab1b95209c3c810114fdeb22452084e77f3f847c6dbaafe16", + "c2aef5e0ca43e82641565b8cb943aa8ba53550caef793b6532fafad94b816082f0113a3ea2f63608ab40437ecc0f0229cb8fa224dcf1c478a67d9b64162b92d1", + "15f534efff7105cd1c254d074e27d5898b89313b7d366dc2d7d87113fa7d53aae13f6dba487ad8103d5e854c91fdb6e1e74b2ef6d1431769c30767dde067a35c", + "89acbca0b169897a0a2714c2df8c95b5b79cb69390142b7d6018bb3e3076b099b79a964152a9d912b1b86412b7e372e9cecad7f25d4cbab8a317be36492a67d7", + "e3c0739190ed849c9c962fd9dbb55e207e624fcac1eb417691515499eea8d8267b7e8f1287a63633af5011fde8c4ddf55bfdf722edf88831414f2cfaed59cb9a", + "8d6cf87c08380d2d1506eee46fd4222d21d8c04e585fbfd08269c98f702833a156326a0724656400ee09351d57b440175e2a5de93cc5f80db6daf83576cf75fa", + "da24bede383666d563eeed37f6319baf20d5c75d1635a6ba5ef4cfa1ac95487e96f8c08af600aab87c986ebad49fc70a58b4890b9c876e091016daf49e1d322e", + "f9d1d1b1e87ea7ae753a029750cc1cf3d0157d41805e245c5617bb934e732f0ae3180b78e05bfe76c7c3051e3e3ac78b9b50c05142657e1e03215d6ec7bfd0fc", + "11b7bc1668032048aa43343de476395e814bbbc223678db951a1b03a021efac948cfbe215f97fe9a72a2f6bc039e3956bfa417c1a9f10d6d7ba5d3d32ff323e5", + "b8d9000e4fc2b066edb91afee8e7eb0f24e3a201db8b6793c0608581e628ed0bcc4e5aa6787992a4bcc44e288093e63ee83abd0bc3ec6d0934a674a4da13838a", + "ce325e294f9b6719d6b61278276ae06a2564c03bb0b783fafe785bdf89c7d5acd83e78756d301b445699024eaeb77b54d477336ec2a4f332f2b3f88765ddb0c3", + "29acc30e9603ae2fccf90bf97e6cc463ebe28c1b2f9b4b765e70537c25c702a29dcbfbf14c99c54345ba2b51f17b77b5f15db92bbad8fa95c471f5d070a137cc", + "3379cbaae562a87b4c0425550ffdd6bfe1203f0d666cc7ea095be407a5dfe61ee91441cd5154b3e53b4f5fb31ad4c7a9ad5c7af4ae679aa51a54003a54ca6b2d", + "3095a349d245708c7cf550118703d7302c27b60af5d4e67fc978f8a4e60953c7a04f92fcf41aee64321ccb707a895851552b1e37b00bc5e6b72fa5bcef9e3fff", + "07262d738b09321f4dbccec4bb26f48cb0f0ed246ce0b31b9a6e7bc683049f1f3e5545f28ce932dd985c5ab0f43bd6de0770560af329065ed2e49d34624c2cbb", + "b6405eca8ee3316c87061cc6ec18dba53e6c250c63ba1f3bae9e55dd3498036af08cd272aa24d713c6020d77ab2f3919af1a32f307420618ab97e73953994fb4", + "7ee682f63148ee45f6e5315da81e5c6e557c2c34641fc509c7a5701088c38a74756168e2cd8d351e88fd1a451f360a01f5b2580f9b5a2e8cfc138f3dd59a3ffc", + "1d263c179d6b268f6fa016f3a4f29e943891125ed8593c81256059f5a7b44af2dcb2030d175c00e62ecaf7ee96682aa07ab20a611024a28532b1c25b86657902", + "106d132cbdb4cd2597812846e2bc1bf732fec5f0a5f65dbb39ec4e6dc64ab2ce6d24630d0f15a805c3540025d84afa98e36703c3dbee713e72dde8465bc1be7e", + "0e79968226650667a8d862ea8da4891af56a4e3a8b6d1750e394f0dea76d640d85077bcec2cc86886e506751b4f6a5838f7f0b5fef765d9dc90dcdcbaf079f08", + "521156a82ab0c4e566e5844d5e31ad9aaf144bbd5a464fdca34dbd5717e8ff711d3ffebbfa085d67fe996a34f6d3e4e60b1396bf4b1610c263bdbb834d560816", + "1aba88befc55bc25efbce02db8b9933e46f57661baeabeb21cc2574d2a518a3cba5dc5a38e49713440b25f9c744e75f6b85c9d8f4681f676160f6105357b8406", + "5a9949fcb2c473cda968ac1b5d08566dc2d816d960f57e63b898fa701cf8ebd3f59b124d95bfbbedc5f1cf0e17d5eaed0c02c50b69d8a402cabcca4433b51fd4", + "b0cead09807c672af2eb2b0f06dde46cf5370e15a4096b1a7d7cbb36ec31c205fbefca00b7a4162fa89fb4fb3eb78d79770c23f44e7206664ce3cd931c291e5d", + "bb6664931ec97044e45b2ae420ae1c551a8874bc937d08e969399c3964ebdba8346cdd5d09caafe4c28ba7ec788191ceca65ddd6f95f18583e040d0f30d0364d", + "65bc770a5faa3792369803683e844b0be7ee96f29f6d6a35568006bd5590f9a4ef639b7a8061c7b0424b66b60ac34af3119905f33a9d8c3ae18382ca9b689900", + "ea9b4dca333336aaf839a45c6eaa48b8cb4c7ddabffea4f643d6357ea6628a480a5b45f2b052c1b07d1fedca918b6f1139d80f74c24510dcbaa4be70eacc1b06", + "e6342fb4a780ad975d0e24bce149989b91d360557e87994f6b457b895575cc02d0c15bad3ce7577f4c63927ff13f3e381ff7e72bdbe745324844a9d27e3f1c01", + "3e209c9b33e8e461178ab46b1c64b49a07fb745f1c8bc95fbfb94c6b87c69516651b264ef980937fad41238b91ddc011a5dd777c7efd4494b4b6ecd3a9c22ac0", + "fd6a3d5b1875d80486d6e69694a56dbb04a99a4d051f15db2689776ba1c4882e6d462a603b7015dc9f4b7450f05394303b8652cfb404a266962c41bae6e18a94", + "951e27517e6bad9e4195fc8671dee3e7e9be69cee1422cb9fecfce0dba875f7b310b93ee3a3d558f941f635f668ff832d2c1d033c5e2f0997e4c66f147344e02", + "8eba2f874f1ae84041903c7c4253c82292530fc8509550bfdc34c95c7e2889d5650b0ad8cb988e5c4894cb87fbfbb19612ea93ccc4c5cad17158b9763464b492", + "16f712eaa1b7c6354719a8e7dbdfaf55e4063a4d277d947550019b38dfb564830911057d50506136e2394c3b28945cc964967d54e3000c2181626cfb9b73efd2", + "c39639e7d5c7fb8cdd0fd3e6a52096039437122f21c78f1679cea9d78a734c56ecbeb28654b4f18e342c331f6f7229ec4b4bc281b2d80a6eb50043f31796c88c", + "72d081af99f8a173dcc9a0ac4eb3557405639a29084b54a40172912a2f8a395129d5536f0918e902f9e8fa6000995f4168ddc5f893011be6a0dbc9b8a1a3f5bb", + "c11aa81e5efd24d5fc27ee586cfd8847fbb0e27601ccece5ecca0198e3c7765393bb74457c7e7a27eb9170350e1fb53857177506be3e762cc0f14d8c3afe9077", + "c28f2150b452e6c0c424bcde6f8d72007f9310fed7f2f87de0dbb64f4479d6c1441ba66f44b2accee61609177ed340128b407ecec7c64bbe50d63d22d8627727", + "f63d88122877ec30b8c8b00d22e89000a966426112bd44166e2f525b769ccbe9b286d437a0129130dde1a86c43e04bedb594e671d98283afe64ce331de9828fd", + "348b0532880b88a6614a8d7408c3f913357fbb60e995c60205be9139e74998aede7f4581e42f6b52698f7fa1219708c14498067fd1e09502de83a77dd281150c", + "5133dc8bef725359dff59792d85eaf75b7e1dcd1978b01c35b1b85fcebc63388ad99a17b6346a217dc1a9622ebd122ecf6913c4d31a6b52a695b86af00d741a0", + "2753c4c0e98ecad806e88780ec27fccd0f5c1ab547f9e4bf1659d192c23aa2cc971b58b6802580baef8adc3b776ef7086b2545c2987f348ee3719cdef258c403", + "b1663573ce4b9d8caefc865012f3e39714b9898a5da6ce17c25a6a47931a9ddb9bbe98adaa553beed436e89578455416c2a52a525cf2862b8d1d49a2531b7391", + "64f58bd6bfc856f5e873b2a2956ea0eda0d6db0da39c8c7fc67c9f9feefcff3072cdf9e6ea37f69a44f0c61aa0da3693c2db5b54960c0281a088151db42b11e8", + "0764c7be28125d9065c4b98a69d60aede703547c66a12e17e1c618994132f5ef82482c1e3fe3146cc65376cc109f0138ed9a80e49f1f3c7d610d2f2432f20605", + "f748784398a2ff03ebeb07e155e66116a839741a336e32da71ec696001f0ad1b25cd48c69cfca7265eca1dd71904a0ce748ac4124f3571076dfa7116a9cf00e9", + "3f0dbc0186bceb6b785ba78d2a2a013c910be157bdaffae81bb6663b1a73722f7f1228795f3ecada87cf6ef0078474af73f31eca0cc200ed975b6893f761cb6d", + "d4762cd4599876ca75b2b8fe249944dbd27ace741fdab93616cbc6e425460feb51d4e7adcc38180e7fc47c89024a7f56191adb878dfde4ead62223f5a2610efe", + "cd36b3d5b4c91b90fcbba79513cfee1907d8645a162afd0cd4cf4192d4a5f4c892183a8eacdb2b6b6a9d9aa8c11ac1b261b380dbee24ca468f1bfd043c58eefe", + "98593452281661a53c48a9d8cd790826c1a1ce567738053d0bee4a91a3d5bd92eefdbabebe3204f2031ca5f781bda99ef5d8ae56e5b04a9e1ecd21b0eb05d3e1", + "771f57dd2775ccdab55921d3e8e30ccf484d61fe1c1b9c2ae819d0fb2a12fab9be70c4a7a138da84e8280435daade5bbe66af0836a154f817fb17f3397e725a3", + "c60897c6f828e21f16fbb5f15b323f87b6c8955eabf1d38061f707f608abdd993fac3070633e286cf8339ce295dd352df4b4b40b2f29da1dd50b3a05d079e6bb", + "8210cd2c2d3b135c2cf07fa0d1433cd771f325d075c6469d9c7f1ba0943cd4ab09808cabf4acb9ce5bb88b498929b4b847f681ad2c490d042db2aec94214b06b", + "1d4edfffd8fd80f7e4107840fa3aa31e32598491e4af7013c197a65b7f36dd3ac4b478456111cd4309d9243510782fa31b7c4c95fa951520d020eb7e5c36e4ef", + "af8e6e91fab46ce4873e1a50a8ef448cc29121f7f74deef34a71ef89cc00d9274bc6c2454bbb3230d8b2ec94c62b1dec85f3593bfa30ea6f7a44d7c09465a253", + "29fd384ed4906f2d13aa9fe7af905990938bed807f1832454a372ab412eea1f5625a1fcc9ac8343b7c67c5aba6e0b1cc4644654913692c6b39eb9187ceacd3ec", + "a268c7885d9874a51c44dffed8ea53e94f78456e0b2ed99ff5a3924760813826d960a15edbedbb5de5226ba4b074e71b05c55b9756bb79e55c02754c2c7b6c8a", + "0cf8545488d56a86817cd7ecb10f7116b7ea530a45b6ea497b6c72c997e09e3d0da8698f46bb006fc977c2cd3d1177463ac9057fdd1662c85d0c126443c10473", + "b39614268fdd8781515e2cfebf89b4d5402bab10c226e6344e6b9ae000fb0d6c79cb2f3ec80e80eaeb1980d2f8698916bd2e9f747236655116649cd3ca23a837", + "74bef092fc6f1e5dba3663a3fb003b2a5ba257496536d99f62b9d73f8f9eb3ce9ff3eec709eb883655ec9eb896b9128f2afc89cf7d1ab58a72f4a3bf034d2b4a", + "3a988d38d75611f3ef38b8774980b33e573b6c57bee0469ba5eed9b44f29945e7347967fba2c162e1c3be7f310f2f75ee2381e7bfd6b3f0baea8d95dfb1dafb1", + "58aedfce6f67ddc85a28c992f1c0bd0969f041e66f1ee88020a125cbfcfebcd61709c9c4eba192c15e69f020d462486019fa8dea0cd7a42921a19d2fe546d43d", + "9347bd291473e6b4e368437b8e561e065f649a6d8ada479ad09b1999a8f26b91cf6120fd3bfe014e83f23acfa4c0ad7b3712b2c3c0733270663112ccd9285cd9", + "b32163e7c5dbb5f51fdc11d2eac875efbbcb7e7699090a7e7ff8a8d50795af5d74d9ff98543ef8cdf89ac13d0485278756e0ef00c817745661e1d59fe38e7537", + "1085d78307b1c4b008c57a2e7e5b234658a0a82e4ff1e4aaac72b312fda0fe27d233bc5b10e9cc17fdc7697b540c7d95eb215a19a1a0e20e1abfa126efd568c7", + "4e5c734c7dde011d83eac2b7347b373594f92d7091b9ca34cb9c6f39bdf5a8d2f134379e16d822f6522170ccf2ddd55c84b9e6c64fc927ac4cf8dfb2a17701f2", + "695d83bd990a1117b3d0ce06cc888027d12a054c2677fd82f0d4fbfc93575523e7991a5e35a3752e9b70ce62992e268a877744cdd435f5f130869c9a2074b338", + "a6213743568e3b3158b9184301f3690847554c68457cb40fc9a4b8cfd8d4a118c301a07737aeda0f929c68913c5f51c80394f53bff1c3e83b2e40ca97eba9e15", + "d444bfa2362a96df213d070e33fa841f51334e4e76866b8139e8af3bb3398be2dfaddcbc56b9146de9f68118dc5829e74b0c28d7711907b121f9161cb92b69a9", + "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461", +} diff --git a/vendor/src/github.com/dchest/blake2b/block.go b/vendor/src/github.com/dchest/blake2b/block.go new file mode 100644 index 0000000..2f04bb7 --- /dev/null +++ b/vendor/src/github.com/dchest/blake2b/block.go @@ -0,0 +1,1420 @@ +// Written in 2012 by Dmitry Chestnykh. +// +// To the extent possible under law, the author have dedicated all copyright +// and related and neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// BLAKE2b compression of message blocks. + +package blake2b + +func blocks(d *digest, p []uint8) { + h0, h1, h2, h3, h4, h5, h6, h7 := d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] + + for len(p) >= BlockSize { + // Increment counter. + d.t[0] += BlockSize + if d.t[0] < BlockSize { + d.t[1]++ + } + // Initialize compression function. + v0, v1, v2, v3, v4, v5, v6, v7 := h0, h1, h2, h3, h4, h5, h6, h7 + v8 := iv[0] + v9 := iv[1] + v10 := iv[2] + v11 := iv[3] + v12 := iv[4] ^ d.t[0] + v13 := iv[5] ^ d.t[1] + v14 := iv[6] ^ d.f[0] + v15 := iv[7] ^ d.f[1] + var m [16]uint64 + + j := 0 + for i := 0; i < 16; i++ { + m[i] = uint64(p[j]) | uint64(p[j+1])<<8 | uint64(p[j+2])<<16 | uint64(p[j+3])<<24 | + uint64(p[j+4])<<32 | uint64(p[j+5])<<40 | uint64(p[j+6])<<48 | uint64(p[j+7])<<56 + j += 8 + } + + // Round 1. + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[2] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[7] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[1] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[8] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[14] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[13] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[9] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 2. + v0 += m[14] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[9] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[15] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[0] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[11] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[2] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 3. + v0 += m[11] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[12] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[15] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[2] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[0] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[8] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[10] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[3] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[9] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[1] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[4] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[6] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[14] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 4. + v0 += m[7] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[13] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[11] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[12] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[14] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[1] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[9] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[2] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[5] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[4] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[0] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[8] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[6] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 5. + v0 += m[9] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[5] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[2] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[10] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[15] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[7] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[14] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[6] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[8] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[13] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[12] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 6. + v0 += m[2] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[6] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[0] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[8] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[11] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[3] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[10] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[12] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[4] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[7] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[15] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[1] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[14] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[9] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[5] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[13] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 7. + v0 += m[12] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[1] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[14] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[4] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[13] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[10] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[15] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[5] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[0] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[6] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[9] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[8] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[2] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[11] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[3] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[7] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 8. + v0 += m[13] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[7] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[12] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[3] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[1] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[9] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[14] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[11] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[5] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[15] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[8] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[2] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[6] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[10] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[4] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[0] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 9. + v0 += m[6] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[14] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[11] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[0] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[3] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[8] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[9] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[15] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[13] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[1] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[10] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[4] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[7] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[2] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 10. + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[7] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[1] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[6] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[5] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[2] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[15] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[9] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[3] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[13] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[0] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[14] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[11] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 11. + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[2] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[7] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[1] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[8] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[14] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[13] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[9] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 12. + v0 += m[14] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[9] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[15] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[0] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[11] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[2] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + h0 ^= v0 ^ v8 + h1 ^= v1 ^ v9 + h2 ^= v2 ^ v10 + h3 ^= v3 ^ v11 + h4 ^= v4 ^ v12 + h5 ^= v5 ^ v13 + h6 ^= v6 ^ v14 + h7 ^= v7 ^ v15 + + p = p[BlockSize:] + } + d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 +} diff --git a/vendor/src/github.com/fatih/structs/LICENSE b/vendor/src/github.com/fatih/structs/LICENSE new file mode 100644 index 0000000..34504e4 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Fatih Arslan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/src/github.com/fatih/structs/README.md b/vendor/src/github.com/fatih/structs/README.md new file mode 100644 index 0000000..44e0100 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/README.md @@ -0,0 +1,163 @@ +# Structs [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/fatih/structs) [![Build Status](http://img.shields.io/travis/fatih/structs.svg?style=flat-square)](https://travis-ci.org/fatih/structs) [![Coverage Status](http://img.shields.io/coveralls/fatih/structs.svg?style=flat-square)](https://coveralls.io/r/fatih/structs) + +Structs contains various utilities to work with Go (Golang) structs. It was +initially used by me to convert a struct into a `map[string]interface{}`. With +time I've added other utilities for structs. It's basically a high level +package based on primitives from the reflect package. Feel free to add new +functions or improve the existing code. + +## Install + +```bash +go get github.com/fatih/structs +``` + +## Usage and Examples + +Just like the standard lib `strings`, `bytes` and co packages, `structs` has +many global functions to manipulate or organize your struct data. Lets define +and declare a struct: + +```go +type Server struct { + Name string `json:"name,omitempty"` + ID int + Enabled bool + users []string // not exported + http.Server // embedded +} + +server := &Server{ + Name: "gopher", + ID: 123456, + Enabled: true, +} +``` + +```go +// Convert a struct to a map[string]interface{} +// => {"Name":"gopher", "ID":123456, "Enabled":true} +m := structs.Map(server) + +// Convert the values of a struct to a []interface{} +// => ["gopher", 123456, true] +v := structs.Values(server) + +// Convert the names of a struct to a []string +// (see "Names methods" for more info about fields) +n := structs.Names(server) + +// Convert the values of a struct to a []*Field +// (see "Field methods" for more info about fields) +f := structs.Fields(server) + +// Return the struct name => "Server" +n := structs.Name(server) + +// Check if any field of a struct is initialized or not. +h := structs.HasZero(server) + +// Check if all fields of a struct is initialized or not. +z := structs.IsZero(server) + +// Check if server is a struct or a pointer to struct +i := structs.IsStruct(server) +``` + +### Struct methods + +The structs functions can be also used as independent methods by creating a new +`*structs.Struct`. This is handy if you want to have more control over the +structs (such as retrieving a single Field). + +```go +// Create a new struct type: +s := structs.New(server) + +m := s.Map() // Get a map[string]interface{} +v := s.Values() // Get a []interface{} +f := s.Fields() // Get a []*Field +n := s.Names() // Get a []string +f := s.Field(name) // Get a *Field based on the given field name +f, ok := s.FieldOk(name) // Get a *Field based on the given field name +n := s.Name() // Get the struct name +h := s.HasZero() // Check if any field is initialized +z := s.IsZero() // Check if all fields are initialized +``` + +### Field methods + +We can easily examine a single Field for more detail. Below you can see how we +get and interact with various field methods: + + +```go +s := structs.New(server) + +// Get the Field struct for the "Name" field +name := s.Field("Name") + +// Get the underlying value, value => "gopher" +value := name.Value().(string) + +// Set the field's value +name.Set("another gopher") + +// Get the field's kind, kind => "string" +name.Kind() + +// Check if the field is exported or not +if name.IsExported() { + fmt.Println("Name field is exported") +} + +// Check if the value is a zero value, such as "" for string, 0 for int +if !name.IsZero() { + fmt.Println("Name is initialized") +} + +// Check if the field is an anonymous (embedded) field +if !name.IsEmbedded() { + fmt.Println("Name is not an embedded field") +} + +// Get the Field's tag value for tag name "json", tag value => "name,omitempty" +tagValue := name.Tag("json") +``` + +Nested structs are supported too: + +```go +addrField := s.Field("Server").Field("Addr") + +// Get the value for addr +a := addrField.Value().(string) + +// Or get all fields +httpServer := s.Field("Server").Fields() +``` + +We can also get a slice of Fields from the Struct type to iterate over all +fields. This is handy if you wish to examine all fields: + +```go +s := structs.New(server) + +for _, f := range s.Fields() { + fmt.Printf("field name: %+v\n", f.Name()) + + if f.IsExported() { + fmt.Printf("value : %+v\n", f.Value()) + fmt.Printf("is zero : %+v\n", f.IsZero()) + } +} +``` + +## Credits + + * [Fatih Arslan](https://github.com/fatih) + * [Cihangir Savas](https://github.com/cihangir) + +## License + +The MIT License (MIT) - see LICENSE.md for more details diff --git a/vendor/src/github.com/fatih/structs/field.go b/vendor/src/github.com/fatih/structs/field.go new file mode 100644 index 0000000..ad705f0 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/field.go @@ -0,0 +1,132 @@ +package structs + +import ( + "errors" + "fmt" + "reflect" +) + +var ( + errNotExported = errors.New("field is not exported") + errNotSettable = errors.New("field is not settable") +) + +// Field represents a single struct field that encapsulates high level +// functions around the field. +type Field struct { + value reflect.Value + field reflect.StructField + defaultTag string +} + +// Tag returns the value associated with key in the tag string. If there is no +// such key in the tag, Tag returns the empty string. +func (f *Field) Tag(key string) string { + return f.field.Tag.Get(key) +} + +// Value returns the underlying value of the field. It panics if the field +// is not exported. +func (f *Field) Value() interface{} { + return f.value.Interface() +} + +// IsEmbedded returns true if the given field is an anonymous field (embedded) +func (f *Field) IsEmbedded() bool { + return f.field.Anonymous +} + +// IsExported returns true if the given field is exported. +func (f *Field) IsExported() bool { + return f.field.PkgPath == "" +} + +// IsZero returns true if the given field is not initialized (has a zero value). +// It panics if the field is not exported. +func (f *Field) IsZero() bool { + zero := reflect.Zero(f.value.Type()).Interface() + current := f.Value() + + return reflect.DeepEqual(current, zero) +} + +// Name returns the name of the given field +func (f *Field) Name() string { + return f.field.Name +} + +// Kind returns the fields kind, such as "string", "map", "bool", etc .. +func (f *Field) Kind() reflect.Kind { + return f.value.Kind() +} + +// Set sets the field to given value v. It returns an error if the field is not +// settable (not addressable or not exported) or if the given value's type +// doesn't match the fields type. +func (f *Field) Set(val interface{}) error { + // we can't set unexported fields, so be sure this field is exported + if !f.IsExported() { + return errNotExported + } + + // do we get here? not sure... + if !f.value.CanSet() { + return errNotSettable + } + + given := reflect.ValueOf(val) + + if f.value.Kind() != given.Kind() { + return fmt.Errorf("wrong kind. got: %s want: %s", given.Kind(), f.value.Kind()) + } + + f.value.Set(given) + return nil +} + +// Zero sets the field to its zero value. It returns an error if the field is not +// settable (not addressable or not exported). +func (f *Field) Zero() error { + zero := reflect.Zero(f.value.Type()).Interface() + return f.Set(zero) +} + +// Fields returns a slice of Fields. This is particular handy to get the fields +// of a nested struct . A struct tag with the content of "-" ignores the +// checking of that particular field. Example: +// +// // Field is ignored by this package. +// Field *http.Request `structs:"-"` +// +// It panics if field is not exported or if field's kind is not struct +func (f *Field) Fields() []*Field { + return getFields(f.value, f.defaultTag) +} + +// Field returns the field from a nested struct. It panics if the nested struct +// is not exported or if the field was not found. +func (f *Field) Field(name string) *Field { + field, ok := f.FieldOk(name) + if !ok { + panic("field not found") + } + + return field +} + +// FieldOk returns the field from a nested struct. The boolean returns whether +// the field was found (true) or not (false). +func (f *Field) FieldOk(name string) (*Field, bool) { + v := strctVal(f.value.Interface()) + t := v.Type() + + field, ok := t.FieldByName(name) + if !ok { + return nil, false + } + + return &Field{ + field: field, + value: v.FieldByName(name), + }, true +} diff --git a/vendor/src/github.com/fatih/structs/field_test.go b/vendor/src/github.com/fatih/structs/field_test.go new file mode 100644 index 0000000..b77e951 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/field_test.go @@ -0,0 +1,383 @@ +package structs + +import ( + "reflect" + "testing" +) + +// A test struct that defines all cases +type Foo struct { + A string + B int `structs:"y"` + C bool `json:"c"` + d string // not exported + E *Baz + x string `xml:"x"` // not exported, with tag + Y []string + Z map[string]interface{} + *Bar // embedded +} + +type Baz struct { + A string + B int +} + +type Bar struct { + E string + F int + g []string +} + +func newStruct() *Struct { + b := &Bar{ + E: "example", + F: 2, + g: []string{"zeynep", "fatih"}, + } + + // B and x is not initialized for testing + f := &Foo{ + A: "gopher", + C: true, + d: "small", + E: nil, + Y: []string{"example"}, + Z: nil, + } + f.Bar = b + + return New(f) +} + +func TestField_Set(t *testing.T) { + s := newStruct() + + f := s.Field("A") + err := f.Set("fatih") + if err != nil { + t.Error(err) + } + + if f.Value().(string) != "fatih" { + t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") + } + + f = s.Field("Y") + err = f.Set([]string{"override", "with", "this"}) + if err != nil { + t.Error(err) + } + + sliceLen := len(f.Value().([]string)) + if sliceLen != 3 { + t.Errorf("Setted values slice length is wrong: %d, want: %d", sliceLen, 3) + } + + f = s.Field("C") + err = f.Set(false) + if err != nil { + t.Error(err) + } + + if f.Value().(bool) { + t.Errorf("Setted value is wrong: %t want: %t", f.Value().(bool), false) + } + + // let's pass a different type + f = s.Field("A") + err = f.Set(123) // Field A is of type string, but we are going to pass an integer + if err == nil { + t.Error("Setting a field's value with a different type than the field's type should return an error") + } + + // old value should be still there :) + if f.Value().(string) != "fatih" { + t.Errorf("Setted value is wrong: %s want: %s", f.Value().(string), "fatih") + } + + // let's access an unexported field, which should give an error + f = s.Field("d") + err = f.Set("large") + if err != errNotExported { + t.Error(err) + } + + // let's set a pointer to struct + b := &Bar{ + E: "gopher", + F: 2, + } + + f = s.Field("Bar") + err = f.Set(b) + if err != nil { + t.Error(err) + } + + baz := &Baz{ + A: "helloWorld", + B: 42, + } + + f = s.Field("E") + err = f.Set(baz) + if err != nil { + t.Error(err) + } + + ba := s.Field("E").Value().(*Baz) + + if ba.A != "helloWorld" { + t.Errorf("could not set baz. Got: %s Want: helloWorld", ba.A) + } +} + +func TestField_Zero(t *testing.T) { + s := newStruct() + + f := s.Field("A") + err := f.Zero() + if err != nil { + t.Error(err) + } + + if f.Value().(string) != "" { + t.Errorf("Zeroed value is wrong: %s want: %s", f.Value().(string), "") + } + + f = s.Field("Y") + err = f.Zero() + if err != nil { + t.Error(err) + } + + sliceLen := len(f.Value().([]string)) + if sliceLen != 0 { + t.Errorf("Zeroed values slice length is wrong: %d, want: %d", sliceLen, 0) + } + + f = s.Field("C") + err = f.Zero() + if err != nil { + t.Error(err) + } + + if f.Value().(bool) { + t.Errorf("Zeroed value is wrong: %t want: %t", f.Value().(bool), false) + } + + // let's access an unexported field, which should give an error + f = s.Field("d") + err = f.Zero() + if err != errNotExported { + t.Error(err) + } + + f = s.Field("Bar") + err = f.Zero() + if err != nil { + t.Error(err) + } + + f = s.Field("E") + err = f.Zero() + if err != nil { + t.Error(err) + } + + v := s.Field("E").value + if !v.IsNil() { + t.Errorf("could not set baz. Got: %s Want: ", v.Interface()) + } +} + +func TestField(t *testing.T) { + s := newStruct() + + defer func() { + err := recover() + if err == nil { + t.Error("Retrieveing a non existing field from the struct should panic") + } + }() + + _ = s.Field("no-field") +} + +func TestField_Kind(t *testing.T) { + s := newStruct() + + f := s.Field("A") + if f.Kind() != reflect.String { + t.Errorf("Field A has wrong kind: %s want: %s", f.Kind(), reflect.String) + } + + f = s.Field("B") + if f.Kind() != reflect.Int { + t.Errorf("Field B has wrong kind: %s want: %s", f.Kind(), reflect.Int) + } + + // unexported + f = s.Field("d") + if f.Kind() != reflect.String { + t.Errorf("Field d has wrong kind: %s want: %s", f.Kind(), reflect.String) + } +} + +func TestField_Tag(t *testing.T) { + s := newStruct() + + v := s.Field("B").Tag("json") + if v != "" { + t.Errorf("Field's tag value of a non existing tag should return empty, got: %s", v) + } + + v = s.Field("C").Tag("json") + if v != "c" { + t.Errorf("Field's tag value of the existing field C should return 'c', got: %s", v) + } + + v = s.Field("d").Tag("json") + if v != "" { + t.Errorf("Field's tag value of a non exported field should return empty, got: %s", v) + } + + v = s.Field("x").Tag("xml") + if v != "x" { + t.Errorf("Field's tag value of a non exported field with a tag should return 'x', got: %s", v) + } + + v = s.Field("A").Tag("json") + if v != "" { + t.Errorf("Field's tag value of a existing field without a tag should return empty, got: %s", v) + } +} + +func TestField_Value(t *testing.T) { + s := newStruct() + + v := s.Field("A").Value() + val, ok := v.(string) + if !ok { + t.Errorf("Field's value of a A should be string") + } + + if val != "gopher" { + t.Errorf("Field's value of a existing tag should return 'gopher', got: %s", val) + } + + defer func() { + err := recover() + if err == nil { + t.Error("Value of a non exported field from the field should panic") + } + }() + + // should panic + _ = s.Field("d").Value() +} + +func TestField_IsEmbedded(t *testing.T) { + s := newStruct() + + if !s.Field("Bar").IsEmbedded() { + t.Errorf("Fields 'Bar' field is an embedded field") + } + + if s.Field("d").IsEmbedded() { + t.Errorf("Fields 'd' field is not an embedded field") + } +} + +func TestField_IsExported(t *testing.T) { + s := newStruct() + + if !s.Field("Bar").IsExported() { + t.Errorf("Fields 'Bar' field is an exported field") + } + + if !s.Field("A").IsExported() { + t.Errorf("Fields 'A' field is an exported field") + } + + if s.Field("d").IsExported() { + t.Errorf("Fields 'd' field is not an exported field") + } +} + +func TestField_IsZero(t *testing.T) { + s := newStruct() + + if s.Field("A").IsZero() { + t.Errorf("Fields 'A' field is an initialized field") + } + + if !s.Field("B").IsZero() { + t.Errorf("Fields 'B' field is not an initialized field") + } +} + +func TestField_Name(t *testing.T) { + s := newStruct() + + if s.Field("A").Name() != "A" { + t.Errorf("Fields 'A' field should have the name 'A'") + } +} + +func TestField_Field(t *testing.T) { + s := newStruct() + + e := s.Field("Bar").Field("E") + + val, ok := e.Value().(string) + if !ok { + t.Error("The value of the field 'e' inside 'Bar' struct should be string") + } + + if val != "example" { + t.Errorf("The value of 'e' should be 'example, got: %s", val) + } + + defer func() { + err := recover() + if err == nil { + t.Error("Field of a non existing nested struct should panic") + } + }() + + _ = s.Field("Bar").Field("e") +} + +func TestField_Fields(t *testing.T) { + s := newStruct() + fields := s.Field("Bar").Fields() + + if len(fields) != 3 { + t.Errorf("We expect 3 fields in embedded struct, was: %d", len(fields)) + } +} + +func TestField_FieldOk(t *testing.T) { + s := newStruct() + + b, ok := s.FieldOk("Bar") + if !ok { + t.Error("The field 'Bar' should exists.") + } + + e, ok := b.FieldOk("E") + if !ok { + t.Error("The field 'E' should exists.") + } + + val, ok := e.Value().(string) + if !ok { + t.Error("The value of the field 'e' inside 'Bar' struct should be string") + } + + if val != "example" { + t.Errorf("The value of 'e' should be 'example, got: %s", val) + } +} diff --git a/vendor/src/github.com/fatih/structs/structs.go b/vendor/src/github.com/fatih/structs/structs.go new file mode 100644 index 0000000..39eb083 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/structs.go @@ -0,0 +1,507 @@ +// Package structs contains various utilities functions to work with structs. +package structs + +import ( + "fmt" + + "reflect" +) + +var ( + // DefaultTagName is the default tag name for struct fields which provides + // a more granular to tweak certain structs. Lookup the necessary functions + // for more info. + DefaultTagName = "structs" // struct's field default tag name +) + +// Struct encapsulates a struct type to provide several high level functions +// around the struct. +type Struct struct { + raw interface{} + value reflect.Value + TagName string +} + +// New returns a new *Struct with the struct s. It panics if the s's kind is +// not struct. +func New(s interface{}) *Struct { + return &Struct{ + raw: s, + value: strctVal(s), + TagName: DefaultTagName, + } +} + +// Map converts the given struct to a map[string]interface{}, where the keys +// of the map are the field names and the values of the map the associated +// values of the fields. The default key string is the struct field name but +// can be changed in the struct field's tag value. The "structs" key in the +// struct's field tag value is the key name. Example: +// +// // Field appears in map as key "myName". +// Name string `structs:"myName"` +// +// A tag value with the content of "-" ignores that particular field. Example: +// +// // Field is ignored by this package. +// Field bool `structs:"-"` +// +// A tag value with the content of "string" uses the stringer to get the value. Example: +// +// // The value will be output of Animal's String() func. +// // Map will panic if Animal does not implement String(). +// Field *Animal `structs:"field,string"` +// +// A tag value with the option of "flatten" used in a struct field is to flatten its fields +// in the output map. Example: +// +// // The FieldStruct's fields will be flattened into the output map. +// FieldStruct time.Time `structs:"flatten"` +// +// A tag value with the option of "omitnested" stops iterating further if the type +// is a struct. Example: +// +// // Field is not processed further by this package. +// Field time.Time `structs:"myName,omitnested"` +// Field *http.Request `structs:",omitnested"` +// +// A tag value with the option of "omitempty" ignores that particular field if +// the field value is empty. Example: +// +// // Field appears in map as key "myName", but the field is +// // skipped if empty. +// Field string `structs:"myName,omitempty"` +// +// // Field appears in map as key "Field" (the default), but +// // the field is skipped if empty. +// Field string `structs:",omitempty"` +// +// Note that only exported fields of a struct can be accessed, non exported +// fields will be neglected. +func (s *Struct) Map() map[string]interface{} { + out := make(map[string]interface{}) + s.FillMap(out) + return out +} + +// FillMap is the same as Map. Instead of returning the output, it fills the +// given map. +func (s *Struct) FillMap(out map[string]interface{}) { + if out == nil { + return + } + + fields := s.structFields() + + for _, field := range fields { + name := field.Name + val := s.value.FieldByName(name) + isSubStruct := false + var finalVal interface{} + + tagName, tagOpts := parseTag(field.Tag.Get(s.TagName)) + if tagName != "" { + name = tagName + } + + // if the value is a zero value and the field is marked as omitempty do + // not include + if tagOpts.Has("omitempty") { + zero := reflect.Zero(val.Type()).Interface() + current := val.Interface() + + if reflect.DeepEqual(current, zero) { + continue + } + } + + if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { + // look out for embedded structs, and convert them to a + // map[string]interface{} too + n := New(val.Interface()) + n.TagName = s.TagName + m := n.Map() + isSubStruct = true + if len(m) == 0 { + finalVal = val.Interface() + } else { + finalVal = m + } + } else { + finalVal = val.Interface() + } + + if tagOpts.Has("string") { + s, ok := val.Interface().(fmt.Stringer) + if ok { + out[name] = s.String() + } + continue + } + + if isSubStruct && (tagOpts.Has("flatten")) { + for k := range finalVal.(map[string]interface{}) { + out[k] = finalVal.(map[string]interface{})[k] + } + } else { + out[name] = finalVal + } + } +} + +// Values converts the given s struct's field values to a []interface{}. A +// struct tag with the content of "-" ignores the that particular field. +// Example: +// +// // Field is ignored by this package. +// Field int `structs:"-"` +// +// A value with the option of "omitnested" stops iterating further if the type +// is a struct. Example: +// +// // Fields is not processed further by this package. +// Field time.Time `structs:",omitnested"` +// Field *http.Request `structs:",omitnested"` +// +// A tag value with the option of "omitempty" ignores that particular field and +// is not added to the values if the field value is empty. Example: +// +// // Field is skipped if empty +// Field string `structs:",omitempty"` +// +// Note that only exported fields of a struct can be accessed, non exported +// fields will be neglected. +func (s *Struct) Values() []interface{} { + fields := s.structFields() + + var t []interface{} + + for _, field := range fields { + val := s.value.FieldByName(field.Name) + + _, tagOpts := parseTag(field.Tag.Get(s.TagName)) + + // if the value is a zero value and the field is marked as omitempty do + // not include + if tagOpts.Has("omitempty") { + zero := reflect.Zero(val.Type()).Interface() + current := val.Interface() + + if reflect.DeepEqual(current, zero) { + continue + } + } + + if tagOpts.Has("string") { + s, ok := val.Interface().(fmt.Stringer) + if ok { + t = append(t, s.String()) + } + continue + } + + if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { + // look out for embedded structs, and convert them to a + // []interface{} to be added to the final values slice + for _, embeddedVal := range Values(val.Interface()) { + t = append(t, embeddedVal) + } + } else { + t = append(t, val.Interface()) + } + } + + return t +} + +// Fields returns a slice of Fields. A struct tag with the content of "-" +// ignores the checking of that particular field. Example: +// +// // Field is ignored by this package. +// Field bool `structs:"-"` +// +// It panics if s's kind is not struct. +func (s *Struct) Fields() []*Field { + return getFields(s.value, s.TagName) +} + +// Names returns a slice of field names. A struct tag with the content of "-" +// ignores the checking of that particular field. Example: +// +// // Field is ignored by this package. +// Field bool `structs:"-"` +// +// It panics if s's kind is not struct. +func (s *Struct) Names() []string { + fields := getFields(s.value, s.TagName) + + names := make([]string, len(fields)) + + for i, field := range fields { + names[i] = field.Name() + } + + return names +} + +func getFields(v reflect.Value, tagName string) []*Field { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + t := v.Type() + + var fields []*Field + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + + if tag := field.Tag.Get(tagName); tag == "-" { + continue + } + + f := &Field{ + field: field, + value: v.FieldByName(field.Name), + } + + fields = append(fields, f) + + } + + return fields +} + +// Field returns a new Field struct that provides several high level functions +// around a single struct field entity. It panics if the field is not found. +func (s *Struct) Field(name string) *Field { + f, ok := s.FieldOk(name) + if !ok { + panic("field not found") + } + + return f +} + +// FieldOk returns a new Field struct that provides several high level functions +// around a single struct field entity. The boolean returns true if the field +// was found. +func (s *Struct) FieldOk(name string) (*Field, bool) { + t := s.value.Type() + + field, ok := t.FieldByName(name) + if !ok { + return nil, false + } + + return &Field{ + field: field, + value: s.value.FieldByName(name), + defaultTag: s.TagName, + }, true +} + +// IsZero returns true if all fields in a struct is a zero value (not +// initialized) A struct tag with the content of "-" ignores the checking of +// that particular field. Example: +// +// // Field is ignored by this package. +// Field bool `structs:"-"` +// +// A value with the option of "omitnested" stops iterating further if the type +// is a struct. Example: +// +// // Field is not processed further by this package. +// Field time.Time `structs:"myName,omitnested"` +// Field *http.Request `structs:",omitnested"` +// +// Note that only exported fields of a struct can be accessed, non exported +// fields will be neglected. It panics if s's kind is not struct. +func (s *Struct) IsZero() bool { + fields := s.structFields() + + for _, field := range fields { + val := s.value.FieldByName(field.Name) + + _, tagOpts := parseTag(field.Tag.Get(s.TagName)) + + if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { + ok := IsZero(val.Interface()) + if !ok { + return false + } + + continue + } + + // zero value of the given field, such as "" for string, 0 for int + zero := reflect.Zero(val.Type()).Interface() + + // current value of the given field + current := val.Interface() + + if !reflect.DeepEqual(current, zero) { + return false + } + } + + return true +} + +// HasZero returns true if a field in a struct is not initialized (zero value). +// A struct tag with the content of "-" ignores the checking of that particular +// field. Example: +// +// // Field is ignored by this package. +// Field bool `structs:"-"` +// +// A value with the option of "omitnested" stops iterating further if the type +// is a struct. Example: +// +// // Field is not processed further by this package. +// Field time.Time `structs:"myName,omitnested"` +// Field *http.Request `structs:",omitnested"` +// +// Note that only exported fields of a struct can be accessed, non exported +// fields will be neglected. It panics if s's kind is not struct. +func (s *Struct) HasZero() bool { + fields := s.structFields() + + for _, field := range fields { + val := s.value.FieldByName(field.Name) + + _, tagOpts := parseTag(field.Tag.Get(s.TagName)) + + if IsStruct(val.Interface()) && !tagOpts.Has("omitnested") { + ok := HasZero(val.Interface()) + if ok { + return true + } + + continue + } + + // zero value of the given field, such as "" for string, 0 for int + zero := reflect.Zero(val.Type()).Interface() + + // current value of the given field + current := val.Interface() + + if reflect.DeepEqual(current, zero) { + return true + } + } + + return false +} + +// Name returns the structs's type name within its package. For more info refer +// to Name() function. +func (s *Struct) Name() string { + return s.value.Type().Name() +} + +// structFields returns the exported struct fields for a given s struct. This +// is a convenient helper method to avoid duplicate code in some of the +// functions. +func (s *Struct) structFields() []reflect.StructField { + t := s.value.Type() + + var f []reflect.StructField + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + // we can't access the value of unexported fields + if field.PkgPath != "" { + continue + } + + // don't check if it's omitted + if tag := field.Tag.Get(s.TagName); tag == "-" { + continue + } + + f = append(f, field) + } + + return f +} + +func strctVal(s interface{}) reflect.Value { + v := reflect.ValueOf(s) + + // if pointer get the underlying element≤ + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + if v.Kind() != reflect.Struct { + panic("not struct") + } + + return v +} + +// Map converts the given struct to a map[string]interface{}. For more info +// refer to Struct types Map() method. It panics if s's kind is not struct. +func Map(s interface{}) map[string]interface{} { + return New(s).Map() +} + +// FillMap is the same as Map. Instead of returning the output, it fills the +// given map. +func FillMap(s interface{}, out map[string]interface{}) { + New(s).FillMap(out) +} + +// Values converts the given struct to a []interface{}. For more info refer to +// Struct types Values() method. It panics if s's kind is not struct. +func Values(s interface{}) []interface{} { + return New(s).Values() +} + +// Fields returns a slice of *Field. For more info refer to Struct types +// Fields() method. It panics if s's kind is not struct. +func Fields(s interface{}) []*Field { + return New(s).Fields() +} + +// Names returns a slice of field names. For more info refer to Struct types +// Names() method. It panics if s's kind is not struct. +func Names(s interface{}) []string { + return New(s).Names() +} + +// IsZero returns true if all fields is equal to a zero value. For more info +// refer to Struct types IsZero() method. It panics if s's kind is not struct. +func IsZero(s interface{}) bool { + return New(s).IsZero() +} + +// HasZero returns true if any field is equal to a zero value. For more info +// refer to Struct types HasZero() method. It panics if s's kind is not struct. +func HasZero(s interface{}) bool { + return New(s).HasZero() +} + +// IsStruct returns true if the given variable is a struct or a pointer to +// struct. +func IsStruct(s interface{}) bool { + v := reflect.ValueOf(s) + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + // uninitialized zero value of a struct + if v.Kind() == reflect.Invalid { + return false + } + + return v.Kind() == reflect.Struct +} + +// Name returns the structs's type name within its package. It returns an +// empty string for unnamed types. It panics if s's kind is not struct. +func Name(s interface{}) string { + return New(s).Name() +} diff --git a/vendor/src/github.com/fatih/structs/structs_example_test.go b/vendor/src/github.com/fatih/structs/structs_example_test.go new file mode 100644 index 0000000..32bb829 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/structs_example_test.go @@ -0,0 +1,351 @@ +package structs + +import ( + "fmt" + "time" +) + +func ExampleNew() { + type Server struct { + Name string + ID int32 + Enabled bool + } + + server := &Server{ + Name: "Arslan", + ID: 123456, + Enabled: true, + } + + s := New(server) + + fmt.Printf("Name : %v\n", s.Name()) + fmt.Printf("Values : %v\n", s.Values()) + fmt.Printf("Value of ID : %v\n", s.Field("ID").Value()) + // Output: + // Name : Server + // Values : [Arslan 123456 true] + // Value of ID : 123456 + +} + +func ExampleMap() { + type Server struct { + Name string + ID int32 + Enabled bool + } + + s := &Server{ + Name: "Arslan", + ID: 123456, + Enabled: true, + } + + m := Map(s) + + fmt.Printf("%#v\n", m["Name"]) + fmt.Printf("%#v\n", m["ID"]) + fmt.Printf("%#v\n", m["Enabled"]) + // Output: + // "Arslan" + // 123456 + // true + +} + +func ExampleMap_tags() { + // Custom tags can change the map keys instead of using the fields name + type Server struct { + Name string `structs:"server_name"` + ID int32 `structs:"server_id"` + Enabled bool `structs:"enabled"` + } + + s := &Server{ + Name: "Zeynep", + ID: 789012, + } + + m := Map(s) + + // access them by the custom tags defined above + fmt.Printf("%#v\n", m["server_name"]) + fmt.Printf("%#v\n", m["server_id"]) + fmt.Printf("%#v\n", m["enabled"]) + // Output: + // "Zeynep" + // 789012 + // false + +} + +func ExampleMap_nested() { + // By default field with struct types are processed too. We can stop + // processing them via "omitnested" tag option. + type Server struct { + Name string `structs:"server_name"` + ID int32 `structs:"server_id"` + Time time.Time `structs:"time,omitnested"` // do not convert to map[string]interface{} + } + + const shortForm = "2006-Jan-02" + t, _ := time.Parse("2006-Jan-02", "2013-Feb-03") + + s := &Server{ + Name: "Zeynep", + ID: 789012, + Time: t, + } + + m := Map(s) + + // access them by the custom tags defined above + fmt.Printf("%v\n", m["server_name"]) + fmt.Printf("%v\n", m["server_id"]) + fmt.Printf("%v\n", m["time"].(time.Time)) + // Output: + // Zeynep + // 789012 + // 2013-02-03 00:00:00 +0000 UTC +} + +func ExampleMap_omitEmpty() { + // By default field with struct types of zero values are processed too. We + // can stop processing them via "omitempty" tag option. + type Server struct { + Name string `structs:",omitempty"` + ID int32 `structs:"server_id,omitempty"` + Location string + } + + // Only add location + s := &Server{ + Location: "Tokyo", + } + + m := Map(s) + + // map contains only the Location field + fmt.Printf("%v\n", m) + // Output: + // map[Location:Tokyo] +} + +func ExampleValues() { + type Server struct { + Name string + ID int32 + Enabled bool + } + + s := &Server{ + Name: "Fatih", + ID: 135790, + Enabled: false, + } + + m := Values(s) + + fmt.Printf("Values: %+v\n", m) + // Output: + // Values: [Fatih 135790 false] +} + +func ExampleValues_omitEmpty() { + // By default field with struct types of zero values are processed too. We + // can stop processing them via "omitempty" tag option. + type Server struct { + Name string `structs:",omitempty"` + ID int32 `structs:"server_id,omitempty"` + Location string + } + + // Only add location + s := &Server{ + Location: "Ankara", + } + + m := Values(s) + + // values contains only the Location field + fmt.Printf("Values: %+v\n", m) + // Output: + // Values: [Ankara] +} + +func ExampleValues_tags() { + type Location struct { + City string + Country string + } + + type Server struct { + Name string + ID int32 + Enabled bool + Location Location `structs:"-"` // values from location are not included anymore + } + + s := &Server{ + Name: "Fatih", + ID: 135790, + Enabled: false, + Location: Location{City: "Ankara", Country: "Turkey"}, + } + + // Let get all values from the struct s. Note that we don't include values + // from the Location field + m := Values(s) + + fmt.Printf("Values: %+v\n", m) + // Output: + // Values: [Fatih 135790 false] +} + +func ExampleFields() { + type Access struct { + Name string + LastAccessed time.Time + Number int + } + + s := &Access{ + Name: "Fatih", + LastAccessed: time.Now(), + Number: 1234567, + } + + fields := Fields(s) + + for i, field := range fields { + fmt.Printf("[%d] %+v\n", i, field.Name()) + } + + // Output: + // [0] Name + // [1] LastAccessed + // [2] Number +} + +func ExampleFields_nested() { + type Person struct { + Name string + Number int + } + + type Access struct { + Person Person + HasPermission bool + LastAccessed time.Time + } + + s := &Access{ + Person: Person{Name: "fatih", Number: 1234567}, + LastAccessed: time.Now(), + HasPermission: true, + } + + // Let's get all fields from the struct s. + fields := Fields(s) + + for _, field := range fields { + if field.Name() == "Person" { + fmt.Printf("Access.Person.Name: %+v\n", field.Field("Name").Value()) + } + } + + // Output: + // Access.Person.Name: fatih +} + +func ExampleField() { + type Person struct { + Name string + Number int + } + + type Access struct { + Person Person + HasPermission bool + LastAccessed time.Time + } + + access := &Access{ + Person: Person{Name: "fatih", Number: 1234567}, + LastAccessed: time.Now(), + HasPermission: true, + } + + // Create a new Struct type + s := New(access) + + // Get the Field type for "Person" field + p := s.Field("Person") + + // Get the underlying "Name field" and print the value of it + name := p.Field("Name") + + fmt.Printf("Value of Person.Access.Name: %+v\n", name.Value()) + + // Output: + // Value of Person.Access.Name: fatih + +} + +func ExampleIsZero() { + type Server struct { + Name string + ID int32 + Enabled bool + } + + // Nothing is initalized + a := &Server{} + isZeroA := IsZero(a) + + // Name and Enabled is initialized, but not ID + b := &Server{ + Name: "Golang", + Enabled: true, + } + isZeroB := IsZero(b) + + fmt.Printf("%#v\n", isZeroA) + fmt.Printf("%#v\n", isZeroB) + // Output: + // true + // false +} + +func ExampleHasZero() { + // Let's define an Access struct. Note that the "Enabled" field is not + // going to be checked because we added the "structs" tag to the field. + type Access struct { + Name string + LastAccessed time.Time + Number int + Enabled bool `structs:"-"` + } + + // Name and Number is not initialized. + a := &Access{ + LastAccessed: time.Now(), + } + hasZeroA := HasZero(a) + + // Name and Number is initialized. + b := &Access{ + Name: "Fatih", + LastAccessed: time.Now(), + Number: 12345, + } + hasZeroB := HasZero(b) + + fmt.Printf("%#v\n", hasZeroA) + fmt.Printf("%#v\n", hasZeroB) + // Output: + // true + // false +} diff --git a/vendor/src/github.com/fatih/structs/structs_test.go b/vendor/src/github.com/fatih/structs/structs_test.go new file mode 100644 index 0000000..b1b05a1 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/structs_test.go @@ -0,0 +1,1109 @@ +package structs + +import ( + "fmt" + "reflect" + "testing" + "time" +) + +func TestMapNonStruct(t *testing.T) { + foo := []string{"foo"} + + defer func() { + err := recover() + if err == nil { + t.Error("Passing a non struct into Map should panic") + } + }() + + // this should panic. We are going to recover and and test it + _ = Map(foo) +} + +func TestStructIndexes(t *testing.T) { + type C struct { + something int + Props map[string]interface{} + } + + defer func() { + err := recover() + if err != nil { + fmt.Printf("err %+v\n", err) + t.Error("Using mixed indexes should not panic") + } + }() + + // They should not panic + _ = Map(&C{}) + _ = Fields(&C{}) + _ = Values(&C{}) + _ = IsZero(&C{}) + _ = HasZero(&C{}) +} + +func TestMap(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + a := Map(T) + + if typ := reflect.TypeOf(a).Kind(); typ != reflect.Map { + t.Errorf("Map should return a map type, got: %v", typ) + } + + // we have three fields + if len(a) != 3 { + t.Errorf("Map should return a map of len 3, got: %d", len(a)) + } + + inMap := func(val interface{}) bool { + for _, v := range a { + if reflect.DeepEqual(v, val) { + return true + } + } + + return false + } + + for _, val := range []interface{}{"a-value", 2, true} { + if !inMap(val) { + t.Errorf("Map should have the value %v", val) + } + } + +} + +func TestMap_Tag(t *testing.T) { + var T = struct { + A string `structs:"x"` + B int `structs:"y"` + C bool `structs:"z"` + }{ + A: "a-value", + B: 2, + C: true, + } + + a := Map(T) + + inMap := func(key interface{}) bool { + for k := range a { + if reflect.DeepEqual(k, key) { + return true + } + } + return false + } + + for _, key := range []string{"x", "y", "z"} { + if !inMap(key) { + t.Errorf("Map should have the key %v", key) + } + } + +} + +func TestMap_CustomTag(t *testing.T) { + var T = struct { + A string `json:"x"` + B int `json:"y"` + C bool `json:"z"` + D struct { + E string `json:"jkl"` + } `json:"nested"` + }{ + A: "a-value", + B: 2, + C: true, + } + T.D.E = "e-value" + + s := New(T) + s.TagName = "json" + + a := s.Map() + + inMap := func(key interface{}) bool { + for k := range a { + if reflect.DeepEqual(k, key) { + return true + } + } + return false + } + + for _, key := range []string{"x", "y", "z"} { + if !inMap(key) { + t.Errorf("Map should have the key %v", key) + } + } + + nested, ok := a["nested"].(map[string]interface{}) + if !ok { + t.Fatalf("Map should contain the D field that is tagged as 'nested'") + } + + e, ok := nested["jkl"].(string) + if !ok { + t.Fatalf("Map should contain the D.E field that is tagged as 'jkl'") + } + + if e != "e-value" { + t.Errorf("D.E field should be equal to 'e-value', got: '%v'", e) + } + +} + +func TestMap_MultipleCustomTag(t *testing.T) { + var A = struct { + X string `aa:"ax"` + }{"a_value"} + + aStruct := New(A) + aStruct.TagName = "aa" + + var B = struct { + X string `bb:"bx"` + }{"b_value"} + + bStruct := New(B) + bStruct.TagName = "bb" + + a, b := aStruct.Map(), bStruct.Map() + if !reflect.DeepEqual(a, map[string]interface{}{"ax": "a_value"}) { + t.Error("Map should have field ax with value a_value") + } + + if !reflect.DeepEqual(b, map[string]interface{}{"bx": "b_value"}) { + t.Error("Map should have field bx with value b_value") + } +} + +func TestMap_OmitEmpty(t *testing.T) { + type A struct { + Name string + Value string `structs:",omitempty"` + Time time.Time `structs:",omitempty"` + } + a := A{} + + m := Map(a) + + _, ok := m["Value"].(map[string]interface{}) + if ok { + t.Error("Map should not contain the Value field that is tagged as omitempty") + } + + _, ok = m["Time"].(map[string]interface{}) + if ok { + t.Error("Map should not contain the Time field that is tagged as omitempty") + } +} + +func TestMap_OmitNested(t *testing.T) { + type A struct { + Name string + Value string + Time time.Time `structs:",omitnested"` + } + a := A{Time: time.Now()} + + type B struct { + Desc string + A A + } + b := &B{A: a} + + m := Map(b) + + in, ok := m["A"].(map[string]interface{}) + if !ok { + t.Error("Map nested structs is not available in the map") + } + + // should not happen + if _, ok := in["Time"].(map[string]interface{}); ok { + t.Error("Map nested struct should omit recursiving parsing of Time") + } + + if _, ok := in["Time"].(time.Time); !ok { + t.Error("Map nested struct should stop parsing of Time at is current value") + } +} + +func TestMap_Nested(t *testing.T) { + type A struct { + Name string + } + a := &A{Name: "example"} + + type B struct { + A *A + } + b := &B{A: a} + + m := Map(b) + + if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { + t.Errorf("Map should return a map type, got: %v", typ) + } + + in, ok := m["A"].(map[string]interface{}) + if !ok { + t.Error("Map nested structs is not available in the map") + } + + if name := in["Name"].(string); name != "example" { + t.Errorf("Map nested struct's name field should give example, got: %s", name) + } +} + +func TestMap_Anonymous(t *testing.T) { + type A struct { + Name string + } + a := &A{Name: "example"} + + type B struct { + *A + } + b := &B{} + b.A = a + + m := Map(b) + + if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map { + t.Errorf("Map should return a map type, got: %v", typ) + } + + in, ok := m["A"].(map[string]interface{}) + if !ok { + t.Error("Embedded structs is not available in the map") + } + + if name := in["Name"].(string); name != "example" { + t.Errorf("Embedded A struct's Name field should give example, got: %s", name) + } +} + +func TestMap_Flatnested(t *testing.T) { + type A struct { + Name string + } + a := A{Name: "example"} + + type B struct { + A `structs:",flatten"` + C int + } + b := &B{C: 123} + b.A = a + + m := Map(b) + + _, ok := m["A"].(map[string]interface{}) + if ok { + t.Error("Embedded A struct with tag flatten has to be flat in the map") + } + + expectedMap := map[string]interface{}{"Name": "example", "C": 123} + if !reflect.DeepEqual(m, expectedMap) { + t.Errorf("The exprected map %+v does't correspond to %+v", expectedMap, m) + } + +} + +func TestMap_FlatnestedOverwrite(t *testing.T) { + type A struct { + Name string + } + a := A{Name: "example"} + + type B struct { + A `structs:",flatten"` + Name string + C int + } + b := &B{C: 123, Name: "bName"} + b.A = a + + m := Map(b) + + _, ok := m["A"].(map[string]interface{}) + if ok { + t.Error("Embedded A struct with tag flatten has to be flat in the map") + } + + expectedMap := map[string]interface{}{"Name": "bName", "C": 123} + if !reflect.DeepEqual(m, expectedMap) { + t.Errorf("The exprected map %+v does't correspond to %+v", expectedMap, m) + } +} + +func TestMap_TimeField(t *testing.T) { + type A struct { + CreatedAt time.Time + } + + a := &A{CreatedAt: time.Now().UTC()} + m := Map(a) + + _, ok := m["CreatedAt"].(time.Time) + if !ok { + t.Error("Time field must be final") + } +} + +func TestFillMap(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + a := make(map[string]interface{}, 0) + FillMap(T, a) + + // we have three fields + if len(a) != 3 { + t.Errorf("FillMap should fill a map of len 3, got: %d", len(a)) + } + + inMap := func(val interface{}) bool { + for _, v := range a { + if reflect.DeepEqual(v, val) { + return true + } + } + + return false + } + + for _, val := range []interface{}{"a-value", 2, true} { + if !inMap(val) { + t.Errorf("FillMap should have the value %v", val) + } + } +} + +func TestFillMap_Nil(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + defer func() { + err := recover() + if err != nil { + t.Error("FillMap should not panic if a nil map is passed") + } + }() + + // nil should no + FillMap(T, nil) +} +func TestStruct(t *testing.T) { + var T = struct{}{} + + if !IsStruct(T) { + t.Errorf("T should be a struct, got: %T", T) + } + + if !IsStruct(&T) { + t.Errorf("T should be a struct, got: %T", T) + } + +} + +func TestValues(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + s := Values(T) + + if typ := reflect.TypeOf(s).Kind(); typ != reflect.Slice { + t.Errorf("Values should return a slice type, got: %v", typ) + } + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + } + + for _, val := range []interface{}{"a-value", 2, true} { + if !inSlice(val) { + t.Errorf("Values should have the value %v", val) + } + } +} + +func TestValues_OmitEmpty(t *testing.T) { + type A struct { + Name string + Value int `structs:",omitempty"` + } + + a := A{Name: "example"} + s := Values(a) + + if len(s) != 1 { + t.Errorf("Values of omitted empty fields should be not counted") + } + + if s[0].(string) != "example" { + t.Errorf("Values of omitted empty fields should left the value example") + } +} + +func TestValues_OmitNested(t *testing.T) { + type A struct { + Name string + Value int + } + + a := A{ + Name: "example", + Value: 123, + } + + type B struct { + A A `structs:",omitnested"` + C int + } + b := &B{A: a, C: 123} + + s := Values(b) + + if len(s) != 2 { + t.Errorf("Values of omitted nested struct should be not counted") + } + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + } + + for _, val := range []interface{}{123, a} { + if !inSlice(val) { + t.Errorf("Values should have the value %v", val) + } + } +} + +func TestValues_Nested(t *testing.T) { + type A struct { + Name string + } + a := A{Name: "example"} + + type B struct { + A A + C int + } + b := &B{A: a, C: 123} + + s := Values(b) + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + } + + for _, val := range []interface{}{"example", 123} { + if !inSlice(val) { + t.Errorf("Values should have the value %v", val) + } + } +} + +func TestValues_Anonymous(t *testing.T) { + type A struct { + Name string + } + a := A{Name: "example"} + + type B struct { + A + C int + } + b := &B{C: 123} + b.A = a + + s := Values(b) + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + } + + for _, val := range []interface{}{"example", 123} { + if !inSlice(val) { + t.Errorf("Values should have the value %v", val) + } + } +} + +func TestNames(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + s := Names(T) + + if len(s) != 3 { + t.Errorf("Names should return a slice of len 3, got: %d", len(s)) + } + + inSlice := func(val string) bool { + for _, v := range s { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + } + + for _, val := range []string{"A", "B", "C"} { + if !inSlice(val) { + t.Errorf("Names should have the value %v", val) + } + } +} + +func TestFields(t *testing.T) { + var T = struct { + A string + B int + C bool + }{ + A: "a-value", + B: 2, + C: true, + } + + s := Fields(T) + + if len(s) != 3 { + t.Errorf("Fields should return a slice of len 3, got: %d", len(s)) + } + + inSlice := func(val string) bool { + for _, v := range s { + if reflect.DeepEqual(v.Name(), val) { + return true + } + } + return false + } + + for _, val := range []string{"A", "B", "C"} { + if !inSlice(val) { + t.Errorf("Fields should have the value %v", val) + } + } +} + +func TestFields_OmitNested(t *testing.T) { + type A struct { + Name string + Enabled bool + } + a := A{Name: "example"} + + type B struct { + A A + C int + Value string `structs:"-"` + Number int + } + b := &B{A: a, C: 123} + + s := Fields(b) + + if len(s) != 3 { + t.Errorf("Fields should omit nested struct. Expecting 2 got: %d", len(s)) + } + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v.Name(), val) { + return true + } + } + return false + } + + for _, val := range []interface{}{"A", "C"} { + if !inSlice(val) { + t.Errorf("Fields should have the value %v", val) + } + } +} + +func TestFields_Anonymous(t *testing.T) { + type A struct { + Name string + } + a := A{Name: "example"} + + type B struct { + A + C int + } + b := &B{C: 123} + b.A = a + + s := Fields(b) + + inSlice := func(val interface{}) bool { + for _, v := range s { + if reflect.DeepEqual(v.Name(), val) { + return true + } + } + return false + } + + for _, val := range []interface{}{"A", "C"} { + if !inSlice(val) { + t.Errorf("Fields should have the value %v", val) + } + } +} + +func TestIsZero(t *testing.T) { + var T = struct { + A string + B int + C bool `structs:"-"` + D []string + }{} + + ok := IsZero(T) + if !ok { + t.Error("IsZero should return true because none of the fields are initialized.") + } + + var X = struct { + A string + F *bool + }{ + A: "a-value", + } + + ok = IsZero(X) + if ok { + t.Error("IsZero should return false because A is initialized") + } + + var Y = struct { + A string + B int + }{ + A: "a-value", + B: 123, + } + + ok = IsZero(Y) + if ok { + t.Error("IsZero should return false because A and B is initialized") + } +} + +func TestIsZero_OmitNested(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A A `structs:",omitnested"` + C int + } + b := &B{A: a, C: 123} + + ok := IsZero(b) + if ok { + t.Error("IsZero should return false because A, B and C are initialized") + } + + aZero := A{} + bZero := &B{A: aZero} + + ok = IsZero(bZero) + if !ok { + t.Error("IsZero should return true because neither A nor B is initialized") + } + +} + +func TestIsZero_Nested(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A A + C int + } + b := &B{A: a, C: 123} + + ok := IsZero(b) + if ok { + t.Error("IsZero should return false because A, B and C are initialized") + } + + aZero := A{} + bZero := &B{A: aZero} + + ok = IsZero(bZero) + if !ok { + t.Error("IsZero should return true because neither A nor B is initialized") + } + +} + +func TestIsZero_Anonymous(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A + C int + } + b := &B{C: 123} + b.A = a + + ok := IsZero(b) + if ok { + t.Error("IsZero should return false because A, B and C are initialized") + } + + aZero := A{} + bZero := &B{} + bZero.A = aZero + + ok = IsZero(bZero) + if !ok { + t.Error("IsZero should return true because neither A nor B is initialized") + } +} + +func TestHasZero(t *testing.T) { + var T = struct { + A string + B int + C bool `structs:"-"` + D []string + }{ + A: "a-value", + B: 2, + } + + ok := HasZero(T) + if !ok { + t.Error("HasZero should return true because A and B are initialized.") + } + + var X = struct { + A string + F *bool + }{ + A: "a-value", + } + + ok = HasZero(X) + if !ok { + t.Error("HasZero should return true because A is initialized") + } + + var Y = struct { + A string + B int + }{ + A: "a-value", + B: 123, + } + + ok = HasZero(Y) + if ok { + t.Error("HasZero should return false because A and B is initialized") + } +} + +func TestHasZero_OmitNested(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A A `structs:",omitnested"` + C int + } + b := &B{A: a, C: 123} + + // Because the Field A inside B is omitted HasZero should return false + // because it will stop iterating deeper andnot going to lookup for D + ok := HasZero(b) + if ok { + t.Error("HasZero should return false because A and C are initialized") + } +} + +func TestHasZero_Nested(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A A + C int + } + b := &B{A: a, C: 123} + + ok := HasZero(b) + if !ok { + t.Error("HasZero should return true because D is not initialized") + } +} + +func TestHasZero_Anonymous(t *testing.T) { + type A struct { + Name string + D string + } + a := A{Name: "example"} + + type B struct { + A + C int + } + b := &B{C: 123} + b.A = a + + ok := HasZero(b) + if !ok { + t.Error("HasZero should return false because D is not initialized") + } +} + +func TestName(t *testing.T) { + type Foo struct { + A string + B bool + } + f := &Foo{} + + n := Name(f) + if n != "Foo" { + t.Errorf("Name should return Foo, got: %s", n) + } + + unnamed := struct{ Name string }{Name: "Cihangir"} + m := Name(unnamed) + if m != "" { + t.Errorf("Name should return empty string for unnamed struct, got: %s", n) + } + + defer func() { + err := recover() + if err == nil { + t.Error("Name should panic if a non struct is passed") + } + }() + + Name([]string{}) +} + +func TestNestedNilPointer(t *testing.T) { + type Collar struct { + Engraving string + } + + type Dog struct { + Name string + Collar *Collar + } + + type Person struct { + Name string + Dog *Dog + } + + person := &Person{ + Name: "John", + } + + personWithDog := &Person{ + Name: "Ron", + Dog: &Dog{ + Name: "Rover", + }, + } + + personWithDogWithCollar := &Person{ + Name: "Kon", + Dog: &Dog{ + Name: "Ruffles", + Collar: &Collar{ + Engraving: "If lost, call Kon", + }, + }, + } + + defer func() { + err := recover() + if err != nil { + fmt.Printf("err %+v\n", err) + t.Error("Internal nil pointer should not panic") + } + }() + + _ = Map(person) // Panics + _ = Map(personWithDog) // Panics + _ = Map(personWithDogWithCollar) // Doesn't panic +} + +type Person struct { + Name string + Age int +} + +func (p *Person) String() string { + return fmt.Sprintf("%s(%d)", p.Name, p.Age) +} + +func TestTagWithStringOption(t *testing.T) { + + type Address struct { + Country string `json:"country"` + Person *Person `json:"person,string"` + } + + person := &Person{ + Name: "John", + Age: 23, + } + + address := &Address{ + Country: "EU", + Person: person, + } + + defer func() { + err := recover() + if err != nil { + fmt.Printf("err %+v\n", err) + t.Error("Internal nil pointer should not panic") + } + }() + + s := New(address) + + s.TagName = "json" + m := s.Map() + + if m["person"] != person.String() { + t.Errorf("Value for field person should be %s, got: %s", person.String(), m["person"]) + } + + vs := s.Values() + if vs[1] != person.String() { + t.Errorf("Value for 2nd field (person) should be %T, got: %T", person.String(), vs[1]) + } +} + +type Animal struct { + Name string + Age int +} + +type Dog struct { + Animal *Animal `json:"animal,string"` +} + +func TestNonStringerTagWithStringOption(t *testing.T) { + a := &Animal{ + Name: "Fluff", + Age: 4, + } + + d := &Dog{ + Animal: a, + } + + defer func() { + err := recover() + if err != nil { + fmt.Printf("err %+v\n", err) + t.Error("Internal nil pointer should not panic") + } + }() + + s := New(d) + + s.TagName = "json" + m := s.Map() + + if _, exists := m["animal"]; exists { + t.Errorf("Value for field Animal should not exist") + } +} diff --git a/vendor/src/github.com/fatih/structs/tags.go b/vendor/src/github.com/fatih/structs/tags.go new file mode 100644 index 0000000..8859341 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/tags.go @@ -0,0 +1,32 @@ +package structs + +import "strings" + +// tagOptions contains a slice of tag options +type tagOptions []string + +// Has returns true if the given optiton is available in tagOptions +func (t tagOptions) Has(opt string) bool { + for _, tagOpt := range t { + if tagOpt == opt { + return true + } + } + + return false +} + +// parseTag splits a struct field's tag into its name and a list of options +// which comes after a name. A tag is in the form of: "name,option1,option2". +// The name can be neglectected. +func parseTag(tag string) (string, tagOptions) { + // tag is one of followings: + // "" + // "name" + // "name,opt" + // "name,opt,opt2" + // ",opt" + + res := strings.Split(tag, ",") + return res[0], res[1:] +} diff --git a/vendor/src/github.com/fatih/structs/tags_test.go b/vendor/src/github.com/fatih/structs/tags_test.go new file mode 100644 index 0000000..5d12724 --- /dev/null +++ b/vendor/src/github.com/fatih/structs/tags_test.go @@ -0,0 +1,46 @@ +package structs + +import "testing" + +func TestParseTag_Name(t *testing.T) { + tags := []struct { + tag string + has bool + }{ + {"", false}, + {"name", true}, + {"name,opt", true}, + {"name , opt, opt2", false}, // has a single whitespace + {", opt, opt2", false}, + } + + for _, tag := range tags { + name, _ := parseTag(tag.tag) + + if (name != "name") && tag.has { + t.Errorf("Parse tag should return name: %#v", tag) + } + } +} + +func TestParseTag_Opts(t *testing.T) { + tags := []struct { + opts string + has bool + }{ + {"name", false}, + {"name,opt", true}, + {"name , opt, opt2", false}, // has a single whitespace + {",opt, opt2", true}, + {", opt3, opt4", false}, + } + + // search for "opt" + for _, tag := range tags { + _, opts := parseTag(tag.opts) + + if opts.Has("opt") != tag.has { + t.Errorf("Tag opts should have opt: %#v", tag) + } + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/Makefile b/vendor/src/github.com/golang/protobuf/proto/Makefile new file mode 100644 index 0000000..e2e0651 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/Makefile @@ -0,0 +1,43 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +install: + go install + +test: install generate-test-pbs + go test + + +generate-test-pbs: + make install + make -C testdata + protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto + make diff --git a/vendor/src/github.com/golang/protobuf/proto/all_test.go b/vendor/src/github.com/golang/protobuf/proto/all_test.go new file mode 100644 index 0000000..fd4a94e --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/all_test.go @@ -0,0 +1,2252 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "math/rand" + "reflect" + "runtime/debug" + "strings" + "testing" + "time" + + . "github.com/golang/protobuf/proto" + . "github.com/golang/protobuf/proto/testdata" +) + +var globalO *Buffer + +func old() *Buffer { + if globalO == nil { + globalO = NewBuffer(nil) + } + globalO.Reset() + return globalO +} + +func equalbytes(b1, b2 []byte, t *testing.T) { + if len(b1) != len(b2) { + t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) + return + } + for i := 0; i < len(b1); i++ { + if b1[i] != b2[i] { + t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) + } + } +} + +func initGoTestField() *GoTestField { + f := new(GoTestField) + f.Label = String("label") + f.Type = String("type") + return f +} + +// These are all structurally equivalent but the tag numbers differ. +// (It's remarkable that required, optional, and repeated all have +// 8 letters.) +func initGoTest_RequiredGroup() *GoTest_RequiredGroup { + return &GoTest_RequiredGroup{ + RequiredField: String("required"), + } +} + +func initGoTest_OptionalGroup() *GoTest_OptionalGroup { + return &GoTest_OptionalGroup{ + RequiredField: String("optional"), + } +} + +func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { + return &GoTest_RepeatedGroup{ + RequiredField: String("repeated"), + } +} + +func initGoTest(setdefaults bool) *GoTest { + pb := new(GoTest) + if setdefaults { + pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) + pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) + pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) + pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) + pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) + pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) + pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) + pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) + pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) + pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) + pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted + pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) + pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) + } + + pb.Kind = GoTest_TIME.Enum() + pb.RequiredField = initGoTestField() + pb.F_BoolRequired = Bool(true) + pb.F_Int32Required = Int32(3) + pb.F_Int64Required = Int64(6) + pb.F_Fixed32Required = Uint32(32) + pb.F_Fixed64Required = Uint64(64) + pb.F_Uint32Required = Uint32(3232) + pb.F_Uint64Required = Uint64(6464) + pb.F_FloatRequired = Float32(3232) + pb.F_DoubleRequired = Float64(6464) + pb.F_StringRequired = String("string") + pb.F_BytesRequired = []byte("bytes") + pb.F_Sint32Required = Int32(-32) + pb.F_Sint64Required = Int64(-64) + pb.Requiredgroup = initGoTest_RequiredGroup() + + return pb +} + +func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { + data := b.Bytes() + ld := len(data) + ls := len(s) / 2 + + fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) + + // find the interesting spot - n + n := ls + if ld < ls { + n = ld + } + j := 0 + for i := 0; i < n; i++ { + bs := hex(s[j])*16 + hex(s[j+1]) + j += 2 + if data[i] == bs { + continue + } + n = i + break + } + l := n - 10 + if l < 0 { + l = 0 + } + h := n + 10 + + // find the interesting spot - n + fmt.Printf("is[%d]:", l) + for i := l; i < h; i++ { + if i >= ld { + fmt.Printf(" --") + continue + } + fmt.Printf(" %.2x", data[i]) + } + fmt.Printf("\n") + + fmt.Printf("sb[%d]:", l) + for i := l; i < h; i++ { + if i >= ls { + fmt.Printf(" --") + continue + } + bs := hex(s[j])*16 + hex(s[j+1]) + j += 2 + fmt.Printf(" %.2x", bs) + } + fmt.Printf("\n") + + t.Fail() + + // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) + // Print the output in a partially-decoded format; can + // be helpful when updating the test. It produces the output + // that is pasted, with minor edits, into the argument to verify(). + // data := b.Bytes() + // nesting := 0 + // for b.Len() > 0 { + // start := len(data) - b.Len() + // var u uint64 + // u, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on varint:", err) + // return + // } + // wire := u & 0x7 + // tag := u >> 3 + // switch wire { + // case WireVarint: + // v, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on varint:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireFixed32: + // v, err := DecodeFixed32(b) + // if err != nil { + // fmt.Printf("decode error on fixed32:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireFixed64: + // v, err := DecodeFixed64(b) + // if err != nil { + // fmt.Printf("decode error on fixed64:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", + // data[start:len(data)-b.Len()], tag, wire, v) + // case WireBytes: + // nb, err := DecodeVarint(b) + // if err != nil { + // fmt.Printf("decode error on bytes:", err) + // return + // } + // after_tag := len(data) - b.Len() + // str := make([]byte, nb) + // _, err = b.Read(str) + // if err != nil { + // fmt.Printf("decode error on bytes:", err) + // return + // } + // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", + // data[start:after_tag], str, tag, wire) + // case WireStartGroup: + // nesting++ + // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", + // data[start:len(data)-b.Len()], tag, nesting) + // case WireEndGroup: + // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", + // data[start:len(data)-b.Len()], tag, nesting) + // nesting-- + // default: + // fmt.Printf("unrecognized wire type %d\n", wire) + // return + // } + // } +} + +func hex(c uint8) uint8 { + if '0' <= c && c <= '9' { + return c - '0' + } + if 'a' <= c && c <= 'f' { + return 10 + c - 'a' + } + if 'A' <= c && c <= 'F' { + return 10 + c - 'A' + } + return 0 +} + +func equal(b []byte, s string, t *testing.T) bool { + if 2*len(b) != len(s) { + // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) + fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) + return false + } + for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { + x := hex(s[j])*16 + hex(s[j+1]) + if b[i] != x { + // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) + fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) + return false + } + } + return true +} + +func overify(t *testing.T, pb *GoTest, expected string) { + o := old() + err := o.Marshal(pb) + if err != nil { + fmt.Printf("overify marshal-1 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 1", o.Bytes()) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = o.Unmarshal(pbd) + if err != nil { + t.Fatalf("overify unmarshal err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + o.Reset() + err = o.Marshal(pbd) + if err != nil { + t.Errorf("overify marshal-2 err = %v", err) + o.DebugPrint("", o.Bytes()) + t.Fatalf("string = %s", expected) + } + if !equal(o.Bytes(), expected, t) { + o.DebugPrint("overify neq 2", o.Bytes()) + t.Fatalf("string = %s", expected) + } +} + +// Simple tests for numeric encode/decode primitives (varint, etc.) +func TestNumericPrimitives(t *testing.T) { + for i := uint64(0); i < 1e6; i += 111 { + o := old() + if o.EncodeVarint(i) != nil { + t.Error("EncodeVarint") + break + } + x, e := o.DecodeVarint() + if e != nil { + t.Fatal("DecodeVarint") + } + if x != i { + t.Fatal("varint decode fail:", i, x) + } + + o = old() + if o.EncodeFixed32(i) != nil { + t.Fatal("encFixed32") + } + x, e = o.DecodeFixed32() + if e != nil { + t.Fatal("decFixed32") + } + if x != i { + t.Fatal("fixed32 decode fail:", i, x) + } + + o = old() + if o.EncodeFixed64(i*1234567) != nil { + t.Error("encFixed64") + break + } + x, e = o.DecodeFixed64() + if e != nil { + t.Error("decFixed64") + break + } + if x != i*1234567 { + t.Error("fixed64 decode fail:", i*1234567, x) + break + } + + o = old() + i32 := int32(i - 12345) + if o.EncodeZigzag32(uint64(i32)) != nil { + t.Fatal("EncodeZigzag32") + } + x, e = o.DecodeZigzag32() + if e != nil { + t.Fatal("DecodeZigzag32") + } + if x != uint64(uint32(i32)) { + t.Fatal("zigzag32 decode fail:", i32, x) + } + + o = old() + i64 := int64(i - 12345) + if o.EncodeZigzag64(uint64(i64)) != nil { + t.Fatal("EncodeZigzag64") + } + x, e = o.DecodeZigzag64() + if e != nil { + t.Fatal("DecodeZigzag64") + } + if x != uint64(i64) { + t.Fatal("zigzag64 decode fail:", i64, x) + } + } +} + +// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. +type fakeMarshaler struct { + b []byte + err error +} + +func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } +func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } +func (f *fakeMarshaler) ProtoMessage() {} +func (f *fakeMarshaler) Reset() {} + +type msgWithFakeMarshaler struct { + M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` +} + +func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } +func (m *msgWithFakeMarshaler) ProtoMessage() {} +func (m *msgWithFakeMarshaler) Reset() {} + +// Simple tests for proto messages that implement the Marshaler interface. +func TestMarshalerEncoding(t *testing.T) { + tests := []struct { + name string + m Message + want []byte + wantErr error + }{ + { + name: "Marshaler that fails", + m: &fakeMarshaler{ + err: errors.New("some marshal err"), + b: []byte{5, 6, 7}, + }, + // Since there's an error, nothing should be written to buffer. + want: nil, + wantErr: errors.New("some marshal err"), + }, + { + name: "Marshaler that fails with RequiredNotSetError", + m: &msgWithFakeMarshaler{ + M: &fakeMarshaler{ + err: &RequiredNotSetError{}, + b: []byte{5, 6, 7}, + }, + }, + // Since there's an error that can be continued after, + // the buffer should be written. + want: []byte{ + 10, 3, // for &msgWithFakeMarshaler + 5, 6, 7, // for &fakeMarshaler + }, + wantErr: &RequiredNotSetError{}, + }, + { + name: "Marshaler that succeeds", + m: &fakeMarshaler{ + b: []byte{0, 1, 2, 3, 4, 127, 255}, + }, + want: []byte{0, 1, 2, 3, 4, 127, 255}, + wantErr: nil, + }, + } + for _, test := range tests { + b := NewBuffer(nil) + err := b.Marshal(test.m) + if _, ok := err.(*RequiredNotSetError); ok { + // We're not in package proto, so we can only assert the type in this case. + err = &RequiredNotSetError{} + } + if !reflect.DeepEqual(test.wantErr, err) { + t.Errorf("%s: got err %v wanted %v", test.name, err, test.wantErr) + } + if !reflect.DeepEqual(test.want, b.Bytes()) { + t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) + } + } +} + +// Simple tests for bytes +func TestBytesPrimitives(t *testing.T) { + o := old() + bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} + if o.EncodeRawBytes(bytes) != nil { + t.Error("EncodeRawBytes") + } + decb, e := o.DecodeRawBytes(false) + if e != nil { + t.Error("DecodeRawBytes") + } + equalbytes(bytes, decb, t) +} + +// Simple tests for strings +func TestStringPrimitives(t *testing.T) { + o := old() + s := "now is the time" + if o.EncodeStringBytes(s) != nil { + t.Error("enc_string") + } + decs, e := o.DecodeStringBytes() + if e != nil { + t.Error("dec_string") + } + if s != decs { + t.Error("string encode/decode fail:", s, decs) + } +} + +// Do we catch the "required bit not set" case? +func TestRequiredBit(t *testing.T) { + o := old() + pb := new(GoTest) + err := o.Marshal(pb) + if err == nil { + t.Error("did not catch missing required fields") + } else if strings.Index(err.Error(), "Kind") < 0 { + t.Error("wrong error type:", err) + } +} + +// Check that all fields are nil. +// Clearly silly, and a residue from a more interesting test with an earlier, +// different initialization property, but it once caught a compiler bug so +// it lives. +func checkInitialized(pb *GoTest, t *testing.T) { + if pb.F_BoolDefaulted != nil { + t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) + } + if pb.F_Int32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) + } + if pb.F_Int64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) + } + if pb.F_Fixed32Defaulted != nil { + t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) + } + if pb.F_Fixed64Defaulted != nil { + t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) + } + if pb.F_Uint32Defaulted != nil { + t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) + } + if pb.F_Uint64Defaulted != nil { + t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) + } + if pb.F_FloatDefaulted != nil { + t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) + } + if pb.F_DoubleDefaulted != nil { + t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) + } + if pb.F_StringDefaulted != nil { + t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) + } + if pb.F_BytesDefaulted != nil { + t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) + } + if pb.F_Sint32Defaulted != nil { + t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) + } + if pb.F_Sint64Defaulted != nil { + t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) + } +} + +// Does Reset() reset? +func TestReset(t *testing.T) { + pb := initGoTest(true) + // muck with some values + pb.F_BoolDefaulted = Bool(false) + pb.F_Int32Defaulted = Int32(237) + pb.F_Int64Defaulted = Int64(12346) + pb.F_Fixed32Defaulted = Uint32(32000) + pb.F_Fixed64Defaulted = Uint64(666) + pb.F_Uint32Defaulted = Uint32(323232) + pb.F_Uint64Defaulted = nil + pb.F_FloatDefaulted = nil + pb.F_DoubleDefaulted = Float64(0) + pb.F_StringDefaulted = String("gotcha") + pb.F_BytesDefaulted = []byte("asdfasdf") + pb.F_Sint32Defaulted = Int32(123) + pb.F_Sint64Defaulted = Int64(789) + pb.Reset() + checkInitialized(pb, t) +} + +// All required fields set, no defaults provided. +func TestEncodeDecode1(t *testing.T) { + pb := initGoTest(false) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 0x20 + "714000000000000000"+ // field 14, encoding 1, value 0x40 + "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 + "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" + "b304"+ // field 70, encoding 3, start group + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // field 70, encoding 4, end group + "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f") // field 103, encoding 0, 0x7f zigzag64 +} + +// All required fields set, defaults provided. +func TestEncodeDecode2(t *testing.T) { + pb := initGoTest(true) + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All default fields set to their default value by hand +func TestEncodeDecode3(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolDefaulted = Bool(true) + pb.F_Int32Defaulted = Int32(32) + pb.F_Int64Defaulted = Int64(64) + pb.F_Fixed32Defaulted = Uint32(320) + pb.F_Fixed64Defaulted = Uint64(640) + pb.F_Uint32Defaulted = Uint32(3200) + pb.F_Uint64Defaulted = Uint64(6400) + pb.F_FloatDefaulted = Float32(314159) + pb.F_DoubleDefaulted = Float64(271828) + pb.F_StringDefaulted = String("hello, \"world!\"\n") + pb.F_BytesDefaulted = []byte("Bignose") + pb.F_Sint32Defaulted = Int32(-32) + pb.F_Sint64Defaulted = Int64(-64) + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, defaults provided, all non-defaulted optional fields have values. +func TestEncodeDecode4(t *testing.T) { + pb := initGoTest(true) + pb.Table = String("hello") + pb.Param = Int32(7) + pb.OptionalField = initGoTestField() + pb.F_BoolOptional = Bool(true) + pb.F_Int32Optional = Int32(32) + pb.F_Int64Optional = Int64(64) + pb.F_Fixed32Optional = Uint32(3232) + pb.F_Fixed64Optional = Uint64(6464) + pb.F_Uint32Optional = Uint32(323232) + pb.F_Uint64Optional = Uint64(646464) + pb.F_FloatOptional = Float32(32.) + pb.F_DoubleOptional = Float64(64.) + pb.F_StringOptional = String("hello") + pb.F_BytesOptional = []byte("Bignose") + pb.F_Sint32Optional = Int32(-32) + pb.F_Sint64Optional = Int64(-64) + pb.Optionalgroup = initGoTest_OptionalGroup() + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" + "1807"+ // field 3, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "f00101"+ // field 30, encoding 0, value 1 + "f80120"+ // field 31, encoding 0, value 32 + "800240"+ // field 32, encoding 0, value 64 + "8d02a00c0000"+ // field 33, encoding 5, value 3232 + "91024019000000000000"+ // field 34, encoding 1, value 6464 + "9802a0dd13"+ // field 35, encoding 0, value 323232 + "a002c0ba27"+ // field 36, encoding 0, value 646464 + "ad0200000042"+ // field 37, encoding 5, value 32.0 + "b1020000000000005040"+ // field 38, encoding 1, value 64.0 + "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "d305"+ // start group field 90 level 1 + "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" + "d405"+ // end group field 90 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" + "f0123f"+ // field 302, encoding 0, value 63 + "f8127f"+ // field 303, encoding 0, value 127 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestEncodeDecode5(t *testing.T) { + pb := initGoTest(true) + pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} + pb.F_BoolRepeated = []bool{false, true} + pb.F_Int32Repeated = []int32{32, 33} + pb.F_Int64Repeated = []int64{64, 65} + pb.F_Fixed32Repeated = []uint32{3232, 3333} + pb.F_Fixed64Repeated = []uint64{6464, 6565} + pb.F_Uint32Repeated = []uint32{323232, 333333} + pb.F_Uint64Repeated = []uint64{646464, 656565} + pb.F_FloatRepeated = []float32{32., 33.} + pb.F_DoubleRepeated = []float64{64., 65.} + pb.F_StringRepeated = []string{"hello", "sailor"} + pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} + pb.F_Sint32Repeated = []int32{32, -32} + pb.F_Sint64Repeated = []int64{64, -64} + pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "a00100"+ // field 20, encoding 0, value 0 + "a00101"+ // field 20, encoding 0, value 1 + "a80120"+ // field 21, encoding 0, value 32 + "a80121"+ // field 21, encoding 0, value 33 + "b00140"+ // field 22, encoding 0, value 64 + "b00141"+ // field 22, encoding 0, value 65 + "bd01a00c0000"+ // field 23, encoding 5, value 3232 + "bd01050d0000"+ // field 23, encoding 5, value 3333 + "c1014019000000000000"+ // field 24, encoding 1, value 6464 + "c101a519000000000000"+ // field 24, encoding 1, value 6565 + "c801a0dd13"+ // field 25, encoding 0, value 323232 + "c80195ac14"+ // field 25, encoding 0, value 333333 + "d001c0ba27"+ // field 26, encoding 0, value 646464 + "d001b58928"+ // field 26, encoding 0, value 656565 + "dd0100000042"+ // field 27, encoding 5, value 32.0 + "dd0100000442"+ // field 27, encoding 5, value 33.0 + "e1010000000000005040"+ // field 28, encoding 1, value 64.0 + "e1010000000000405040"+ // field 28, encoding 1, value 65.0 + "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" + "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" + "c00201"+ // field 40, encoding 0, value 1 + "c80220"+ // field 41, encoding 0, value 32 + "d00240"+ // field 42, encoding 0, value 64 + "dd0240010000"+ // field 43, encoding 5, value 320 + "e1028002000000000000"+ // field 44, encoding 1, value 640 + "e8028019"+ // field 45, encoding 0, value 3200 + "f0028032"+ // field 46, encoding 0, value 6400 + "fd02e0659948"+ // field 47, encoding 5, value 314159.0 + "81030000000050971041"+ // field 48, encoding 1, value 271828.0 + "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "8305"+ // start group field 80 level 1 + "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" + "8405"+ // end group field 80 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "ca0c03"+"626967"+ // field 201, encoding 2, string "big" + "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" + "d00c40"+ // field 202, encoding 0, value 32 + "d00c3f"+ // field 202, encoding 0, value -32 + "d80c8001"+ // field 203, encoding 0, value 64 + "d80c7f"+ // field 203, encoding 0, value -64 + "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" + "90193f"+ // field 402, encoding 0, value 63 + "98197f") // field 403, encoding 0, value 127 + +} + +// All required fields set, all packed repeated fields given two values. +func TestEncodeDecode6(t *testing.T) { + pb := initGoTest(false) + pb.F_BoolRepeatedPacked = []bool{false, true} + pb.F_Int32RepeatedPacked = []int32{32, 33} + pb.F_Int64RepeatedPacked = []int64{64, 65} + pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} + pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} + pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} + pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} + pb.F_FloatRepeatedPacked = []float32{32., 33.} + pb.F_DoubleRepeatedPacked = []float64{64., 65.} + pb.F_Sint32RepeatedPacked = []int32{32, -32} + pb.F_Sint64RepeatedPacked = []int64{64, -64} + + overify(t, pb, + "0807"+ // field 1, encoding 0, value 7 + "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) + "5001"+ // field 10, encoding 0, value 1 + "5803"+ // field 11, encoding 0, value 3 + "6006"+ // field 12, encoding 0, value 6 + "6d20000000"+ // field 13, encoding 5, value 32 + "714000000000000000"+ // field 14, encoding 1, value 64 + "78a019"+ // field 15, encoding 0, value 3232 + "8001c032"+ // field 16, encoding 0, value 6464 + "8d0100004a45"+ // field 17, encoding 5, value 3232.0 + "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 + "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" + "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 + "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 + "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 + "aa0308"+ // field 53, encoding 2, 8 bytes + "a00c0000050d0000"+ // value 3232, value 3333 + "b20310"+ // field 54, encoding 2, 16 bytes + "4019000000000000a519000000000000"+ // value 6464, value 6565 + "ba0306"+ // field 55, encoding 2, 6 bytes + "a0dd1395ac14"+ // value 323232, value 333333 + "c20306"+ // field 56, encoding 2, 6 bytes + "c0ba27b58928"+ // value 646464, value 656565 + "ca0308"+ // field 57, encoding 2, 8 bytes + "0000004200000442"+ // value 32.0, value 33.0 + "d20310"+ // field 58, encoding 2, 16 bytes + "00000000000050400000000000405040"+ // value 64.0, value 65.0 + "b304"+ // start group field 70 level 1 + "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" + "b404"+ // end group field 70 level 1 + "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" + "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 + "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 + "b21f02"+ // field 502, encoding 2, 2 bytes + "403f"+ // value 32, value -32 + "ba1f03"+ // field 503, encoding 2, 3 bytes + "80017f") // value 64, value -64 +} + +// Test that we can encode empty bytes fields. +func TestEncodeDecodeBytes1(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRequired = []byte{} + pb.F_BytesRepeated = [][]byte{{}} + pb.F_BytesOptional = []byte{} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { + t.Error("required empty bytes field is incorrect") + } + if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { + t.Error("repeated empty bytes field is incorrect") + } + if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { + t.Error("optional empty bytes field is incorrect") + } +} + +// Test that we encode nil-valued fields of a repeated bytes field correctly. +// Since entries in a repeated field cannot be nil, nil must mean empty value. +func TestEncodeDecodeBytes2(t *testing.T) { + pb := initGoTest(false) + + // Create our bytes + pb.F_BytesRepeated = [][]byte{nil} + + d, err := Marshal(pb) + if err != nil { + t.Error(err) + } + + pbd := new(GoTest) + if err := Unmarshal(d, pbd); err != nil { + t.Error(err) + } + + if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { + t.Error("Unexpected value for repeated bytes field") + } +} + +// All required fields set, defaults provided, all repeated fields given two values. +func TestSkippingUnrecognizedFields(t *testing.T) { + o := old() + pb := initGoTestField() + + // Marshal it normally. + o.Marshal(pb) + + // Now new a GoSkipTest record. + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + // Marshal it into same buffer. + o.Marshal(skip) + + pbd := new(GoTestField) + o.Unmarshal(pbd) + + // The __unrecognized field should be a marshaling of GoSkipTest + skipd := new(GoSkipTest) + + o.SetBuf(pbd.XXX_unrecognized) + o.Unmarshal(skipd) + + if *skipd.SkipInt32 != *skip.SkipInt32 { + t.Error("skip int32", skipd.SkipInt32) + } + if *skipd.SkipFixed32 != *skip.SkipFixed32 { + t.Error("skip fixed32", skipd.SkipFixed32) + } + if *skipd.SkipFixed64 != *skip.SkipFixed64 { + t.Error("skip fixed64", skipd.SkipFixed64) + } + if *skipd.SkipString != *skip.SkipString { + t.Error("skip string", *skipd.SkipString) + } + if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { + t.Error("skip group int32", skipd.Skipgroup.GroupInt32) + } + if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { + t.Error("skip group string", *skipd.Skipgroup.GroupString) + } +} + +// Check that unrecognized fields of a submessage are preserved. +func TestSubmessageUnrecognizedFields(t *testing.T) { + nm := &NewMessage{ + Nested: &NewMessage_Nested{ + Name: String("Nigel"), + FoodGroup: String("carbs"), + }, + } + b, err := Marshal(nm) + if err != nil { + t.Fatalf("Marshal of NewMessage: %v", err) + } + + // Unmarshal into an OldMessage. + om := new(OldMessage) + if err := Unmarshal(b, om); err != nil { + t.Fatalf("Unmarshal to OldMessage: %v", err) + } + exp := &OldMessage{ + Nested: &OldMessage_Nested{ + Name: String("Nigel"), + // normal protocol buffer users should not do this + XXX_unrecognized: []byte("\x12\x05carbs"), + }, + } + if !Equal(om, exp) { + t.Errorf("om = %v, want %v", om, exp) + } + + // Clone the OldMessage. + om = Clone(om).(*OldMessage) + if !Equal(om, exp) { + t.Errorf("Clone(om) = %v, want %v", om, exp) + } + + // Marshal the OldMessage, then unmarshal it into an empty NewMessage. + if b, err = Marshal(om); err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + t.Logf("Marshal(%v) -> %q", om, b) + nm2 := new(NewMessage) + if err := Unmarshal(b, nm2); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + if !Equal(nm, nm2) { + t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) + } +} + +// Check that an int32 field can be upgraded to an int64 field. +func TestNegativeInt32(t *testing.T) { + om := &OldMessage{ + Num: Int32(-1), + } + b, err := Marshal(om) + if err != nil { + t.Fatalf("Marshal of OldMessage: %v", err) + } + + // Check the size. It should be 11 bytes; + // 1 for the field/wire type, and 10 for the negative number. + if len(b) != 11 { + t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) + } + + // Unmarshal into a NewMessage. + nm := new(NewMessage) + if err := Unmarshal(b, nm); err != nil { + t.Fatalf("Unmarshal to NewMessage: %v", err) + } + want := &NewMessage{ + Num: Int64(-1), + } + if !Equal(nm, want) { + t.Errorf("nm = %v, want %v", nm, want) + } +} + +// Check that we can grow an array (repeated field) to have many elements. +// This test doesn't depend only on our encoding; for variety, it makes sure +// we create, encode, and decode the correct contents explicitly. It's therefore +// a bit messier. +// This test also uses (and hence tests) the Marshal/Unmarshal functions +// instead of the methods. +func TestBigRepeated(t *testing.T) { + pb := initGoTest(true) + + // Create the arrays + const N = 50 // Internally the library starts much smaller. + pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) + pb.F_Sint64Repeated = make([]int64, N) + pb.F_Sint32Repeated = make([]int32, N) + pb.F_BytesRepeated = make([][]byte, N) + pb.F_StringRepeated = make([]string, N) + pb.F_DoubleRepeated = make([]float64, N) + pb.F_FloatRepeated = make([]float32, N) + pb.F_Uint64Repeated = make([]uint64, N) + pb.F_Uint32Repeated = make([]uint32, N) + pb.F_Fixed64Repeated = make([]uint64, N) + pb.F_Fixed32Repeated = make([]uint32, N) + pb.F_Int64Repeated = make([]int64, N) + pb.F_Int32Repeated = make([]int32, N) + pb.F_BoolRepeated = make([]bool, N) + pb.RepeatedField = make([]*GoTestField, N) + + // Fill in the arrays with checkable values. + igtf := initGoTestField() + igtrg := initGoTest_RepeatedGroup() + for i := 0; i < N; i++ { + pb.Repeatedgroup[i] = igtrg + pb.F_Sint64Repeated[i] = int64(i) + pb.F_Sint32Repeated[i] = int32(i) + s := fmt.Sprint(i) + pb.F_BytesRepeated[i] = []byte(s) + pb.F_StringRepeated[i] = s + pb.F_DoubleRepeated[i] = float64(i) + pb.F_FloatRepeated[i] = float32(i) + pb.F_Uint64Repeated[i] = uint64(i) + pb.F_Uint32Repeated[i] = uint32(i) + pb.F_Fixed64Repeated[i] = uint64(i) + pb.F_Fixed32Repeated[i] = uint32(i) + pb.F_Int64Repeated[i] = int64(i) + pb.F_Int32Repeated[i] = int32(i) + pb.F_BoolRepeated[i] = i%2 == 0 + pb.RepeatedField[i] = igtf + } + + // Marshal. + buf, _ := Marshal(pb) + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + Unmarshal(buf, pbd) + + // Check the checkable values + for i := uint64(0); i < N; i++ { + if pbd.Repeatedgroup[i] == nil { // TODO: more checking? + t.Error("pbd.Repeatedgroup bad") + } + var x uint64 + x = uint64(pbd.F_Sint64Repeated[i]) + if x != i { + t.Error("pbd.F_Sint64Repeated bad", x, i) + } + x = uint64(pbd.F_Sint32Repeated[i]) + if x != i { + t.Error("pbd.F_Sint32Repeated bad", x, i) + } + s := fmt.Sprint(i) + equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) + if pbd.F_StringRepeated[i] != s { + t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) + } + x = uint64(pbd.F_DoubleRepeated[i]) + if x != i { + t.Error("pbd.F_DoubleRepeated bad", x, i) + } + x = uint64(pbd.F_FloatRepeated[i]) + if x != i { + t.Error("pbd.F_FloatRepeated bad", x, i) + } + x = pbd.F_Uint64Repeated[i] + if x != i { + t.Error("pbd.F_Uint64Repeated bad", x, i) + } + x = uint64(pbd.F_Uint32Repeated[i]) + if x != i { + t.Error("pbd.F_Uint32Repeated bad", x, i) + } + x = pbd.F_Fixed64Repeated[i] + if x != i { + t.Error("pbd.F_Fixed64Repeated bad", x, i) + } + x = uint64(pbd.F_Fixed32Repeated[i]) + if x != i { + t.Error("pbd.F_Fixed32Repeated bad", x, i) + } + x = uint64(pbd.F_Int64Repeated[i]) + if x != i { + t.Error("pbd.F_Int64Repeated bad", x, i) + } + x = uint64(pbd.F_Int32Repeated[i]) + if x != i { + t.Error("pbd.F_Int32Repeated bad", x, i) + } + if pbd.F_BoolRepeated[i] != (i%2 == 0) { + t.Error("pbd.F_BoolRepeated bad", x, i) + } + if pbd.RepeatedField[i] == nil { // TODO: more checking? + t.Error("pbd.RepeatedField bad") + } + } +} + +// Verify we give a useful message when decoding to the wrong structure type. +func TestTypeMismatch(t *testing.T) { + pb1 := initGoTest(true) + + // Marshal + o := old() + o.Marshal(pb1) + + // Now Unmarshal it to the wrong type. + pb2 := initGoTestField() + err := o.Unmarshal(pb2) + if err == nil { + t.Error("expected error, got no error") + } else if !strings.Contains(err.Error(), "bad wiretype") { + t.Error("expected bad wiretype error, got", err) + } +} + +func encodeDecode(t *testing.T, in, out Message, msg string) { + buf, err := Marshal(in) + if err != nil { + t.Fatalf("failed marshaling %v: %v", msg, err) + } + if err := Unmarshal(buf, out); err != nil { + t.Fatalf("failed unmarshaling %v: %v", msg, err) + } +} + +func TestPackedNonPackedDecoderSwitching(t *testing.T) { + np, p := new(NonPackedTest), new(PackedTest) + + // non-packed -> packed + np.A = []int32{0, 1, 1, 2, 3, 5} + encodeDecode(t, np, p, "non-packed -> packed") + if !reflect.DeepEqual(np.A, p.B) { + t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) + } + + // packed -> non-packed + np.Reset() + p.B = []int32{3, 1, 4, 1, 5, 9} + encodeDecode(t, p, np, "packed -> non-packed") + if !reflect.DeepEqual(p.B, np.A) { + t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) + } +} + +func TestProto1RepeatedGroup(t *testing.T) { + pb := &MessageList{ + Message: []*MessageList_Message{ + { + Name: String("blah"), + Count: Int32(7), + }, + // NOTE: pb.Message[1] is a nil + nil, + }, + } + + o := old() + err := o.Marshal(pb) + if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { + t.Fatalf("unexpected or no error when marshaling: %v", err) + } +} + +// Test that enums work. Checks for a bug introduced by making enums +// named types instead of int32: newInt32FromUint64 would crash with +// a type mismatch in reflect.PointTo. +func TestEnum(t *testing.T) { + pb := new(GoEnum) + pb.Foo = FOO_FOO1.Enum() + o := old() + if err := o.Marshal(pb); err != nil { + t.Fatal("error encoding enum:", err) + } + pb1 := new(GoEnum) + if err := o.Unmarshal(pb1); err != nil { + t.Fatal("error decoding enum:", err) + } + if *pb1.Foo != FOO_FOO1 { + t.Error("expected 7 but got ", *pb1.Foo) + } +} + +// Enum types have String methods. Check that enum fields can be printed. +// We don't care what the value actually is, just as long as it doesn't crash. +func TestPrintingNilEnumFields(t *testing.T) { + pb := new(GoEnum) + fmt.Sprintf("%+v", pb) +} + +// Verify that absent required fields cause Marshal/Unmarshal to return errors. +func TestRequiredFieldEnforcement(t *testing.T) { + pb := new(GoTestField) + _, err := Marshal(pb) + if err == nil { + t.Error("marshal: expected error, got nil") + } else if strings.Index(err.Error(), "Label") < 0 { + t.Errorf("marshal: bad error type: %v", err) + } + + // A slightly sneaky, yet valid, proto. It encodes the same required field twice, + // so simply counting the required fields is insufficient. + // field 1, encoding 2, value "hi" + buf := []byte("\x0A\x02hi\x0A\x02hi") + err = Unmarshal(buf, pb) + if err == nil { + t.Error("unmarshal: expected error, got nil") + } else if strings.Index(err.Error(), "{Unknown}") < 0 { + t.Errorf("unmarshal: bad error type: %v", err) + } +} + +func TestTypedNilMarshal(t *testing.T) { + // A typed nil should return ErrNil and not crash. + { + var m *GoEnum + if _, err := Marshal(m); err != ErrNil { + t.Errorf("Marshal(%#v): got %v, want ErrNil", m, err) + } + } + + { + m := &Communique{Union: &Communique_Msg{nil}} + if _, err := Marshal(m); err == nil || err == ErrNil { + t.Errorf("Marshal(%#v): got %v, want errOneofHasNil", m, err) + } + } +} + +// A type that implements the Marshaler interface, but is not nillable. +type nonNillableInt uint64 + +func (nni nonNillableInt) Marshal() ([]byte, error) { + return EncodeVarint(uint64(nni)), nil +} + +type NNIMessage struct { + nni nonNillableInt +} + +func (*NNIMessage) Reset() {} +func (*NNIMessage) String() string { return "" } +func (*NNIMessage) ProtoMessage() {} + +// A type that implements the Marshaler interface and is nillable. +type nillableMessage struct { + x uint64 +} + +func (nm *nillableMessage) Marshal() ([]byte, error) { + return EncodeVarint(nm.x), nil +} + +type NMMessage struct { + nm *nillableMessage +} + +func (*NMMessage) Reset() {} +func (*NMMessage) String() string { return "" } +func (*NMMessage) ProtoMessage() {} + +// Verify a type that uses the Marshaler interface, but has a nil pointer. +func TestNilMarshaler(t *testing.T) { + // Try a struct with a Marshaler field that is nil. + // It should be directly marshable. + nmm := new(NMMessage) + if _, err := Marshal(nmm); err != nil { + t.Error("unexpected error marshaling nmm: ", err) + } + + // Try a struct with a Marshaler field that is not nillable. + nnim := new(NNIMessage) + nnim.nni = 7 + var _ Marshaler = nnim.nni // verify it is truly a Marshaler + if _, err := Marshal(nnim); err != nil { + t.Error("unexpected error marshaling nnim: ", err) + } +} + +func TestAllSetDefaults(t *testing.T) { + // Exercise SetDefaults with all scalar field types. + m := &Defaults{ + // NaN != NaN, so override that here. + F_Nan: Float32(1.7), + } + expected := &Defaults{ + F_Bool: Bool(true), + F_Int32: Int32(32), + F_Int64: Int64(64), + F_Fixed32: Uint32(320), + F_Fixed64: Uint64(640), + F_Uint32: Uint32(3200), + F_Uint64: Uint64(6400), + F_Float: Float32(314159), + F_Double: Float64(271828), + F_String: String(`hello, "world!"` + "\n"), + F_Bytes: []byte("Bignose"), + F_Sint32: Int32(-32), + F_Sint64: Int64(-64), + F_Enum: Defaults_GREEN.Enum(), + F_Pinf: Float32(float32(math.Inf(1))), + F_Ninf: Float32(float32(math.Inf(-1))), + F_Nan: Float32(1.7), + StrZero: String(""), + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithSetField(t *testing.T) { + // Check that a set value is not overridden. + m := &Defaults{ + F_Int32: Int32(12), + } + SetDefaults(m) + if v := m.GetF_Int32(); v != 12 { + t.Errorf("m.FInt32 = %v, want 12", v) + } +} + +func TestSetDefaultsWithSubMessage(t *testing.T) { + m := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + }, + } + expected := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("gopher"), + Port: Int32(4000), + }, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { + m := &MyMessage{ + RepInner: []*InnerMessage{{}}, + } + expected := &MyMessage{ + RepInner: []*InnerMessage{{ + Port: Int32(4000), + }}, + } + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { + m := &MyMessage{ + Pet: []string{"turtle", "wombat"}, + } + expected := Clone(m) + SetDefaults(m) + if !Equal(m, expected) { + t.Errorf("\n got %v\nwant %v", m, expected) + } +} + +func TestMaximumTagNumber(t *testing.T) { + m := &MaxTag{ + LastField: String("natural goat essence"), + } + buf, err := Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal failed: %v", err) + } + m2 := new(MaxTag) + if err := Unmarshal(buf, m2); err != nil { + t.Fatalf("proto.Unmarshal failed: %v", err) + } + if got, want := m2.GetLastField(), *m.LastField; got != want { + t.Errorf("got %q, want %q", got, want) + } +} + +func TestJSON(t *testing.T) { + m := &MyMessage{ + Count: Int32(4), + Pet: []string{"bunny", "kitty"}, + Inner: &InnerMessage{ + Host: String("cauchy"), + }, + Bikeshed: MyMessage_GREEN.Enum(), + } + const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` + + b, err := json.Marshal(m) + if err != nil { + t.Fatalf("json.Marshal failed: %v", err) + } + s := string(b) + if s != expected { + t.Errorf("got %s\nwant %s", s, expected) + } + + received := new(MyMessage) + if err := json.Unmarshal(b, received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } + + // Test unmarshalling of JSON with symbolic enum name. + const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` + received.Reset() + if err := json.Unmarshal([]byte(old), received); err != nil { + t.Fatalf("json.Unmarshal failed: %v", err) + } + if !Equal(received, m) { + t.Fatalf("got %s, want %s", received, m) + } +} + +func TestBadWireType(t *testing.T) { + b := []byte{7<<3 | 6} // field 7, wire type 6 + pb := new(OtherMessage) + if err := Unmarshal(b, pb); err == nil { + t.Errorf("Unmarshal did not fail") + } else if !strings.Contains(err.Error(), "unknown wire type") { + t.Errorf("wrong error: %v", err) + } +} + +func TestBytesWithInvalidLength(t *testing.T) { + // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. + b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} + Unmarshal(b, new(MyMessage)) +} + +func TestLengthOverflow(t *testing.T) { + // Overflowing a length should not panic. + b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} + Unmarshal(b, new(MyMessage)) +} + +func TestVarintOverflow(t *testing.T) { + // Overflowing a 64-bit length should not be allowed. + b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} + if err := Unmarshal(b, new(MyMessage)); err == nil { + t.Fatalf("Overflowed uint64 length without error") + } +} + +func TestUnmarshalFuzz(t *testing.T) { + const N = 1000 + seed := time.Now().UnixNano() + t.Logf("RNG seed is %d", seed) + rng := rand.New(rand.NewSource(seed)) + buf := make([]byte, 20) + for i := 0; i < N; i++ { + for j := range buf { + buf[j] = byte(rng.Intn(256)) + } + fuzzUnmarshal(t, buf) + } +} + +func TestMergeMessages(t *testing.T) { + pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} + data, err := Marshal(pb) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + pb1 := new(MessageList) + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("first Unmarshal: %v", err) + } + if err := Unmarshal(data, pb1); err != nil { + t.Fatalf("second Unmarshal: %v", err) + } + if len(pb1.Message) != 1 { + t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) + } + + pb2 := new(MessageList) + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("first UnmarshalMerge: %v", err) + } + if err := UnmarshalMerge(data, pb2); err != nil { + t.Fatalf("second UnmarshalMerge: %v", err) + } + if len(pb2.Message) != 2 { + t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) + } +} + +func TestExtensionMarshalOrder(t *testing.T) { + m := &MyMessage{Count: Int(123)} + if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { + t.Fatalf("SetExtension: %v", err) + } + if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { + t.Fatalf("SetExtension: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + var orig []byte + for i := 0; i < 100; i++ { + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if i == 0 { + orig = b + continue + } + if !bytes.Equal(b, orig) { + t.Errorf("Bytes differ on attempt #%d", i) + } + } +} + +// Many extensions, because small maps might not iterate differently on each iteration. +var exts = []*ExtensionDesc{ + E_X201, + E_X202, + E_X203, + E_X204, + E_X205, + E_X206, + E_X207, + E_X208, + E_X209, + E_X210, + E_X211, + E_X212, + E_X213, + E_X214, + E_X215, + E_X216, + E_X217, + E_X218, + E_X219, + E_X220, + E_X221, + E_X222, + E_X223, + E_X224, + E_X225, + E_X226, + E_X227, + E_X228, + E_X229, + E_X230, + E_X231, + E_X232, + E_X233, + E_X234, + E_X235, + E_X236, + E_X237, + E_X238, + E_X239, + E_X240, + E_X241, + E_X242, + E_X243, + E_X244, + E_X245, + E_X246, + E_X247, + E_X248, + E_X249, + E_X250, +} + +func TestMessageSetMarshalOrder(t *testing.T) { + m := &MyMessageSet{} + for _, x := range exts { + if err := SetExtension(m, x, &Empty{}); err != nil { + t.Fatalf("SetExtension: %v", err) + } + } + + buf, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // Serialize m several times, and check we get the same bytes each time. + for i := 0; i < 10; i++ { + b1, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if !bytes.Equal(b1, buf) { + t.Errorf("Bytes differ on re-Marshal #%d", i) + } + + m2 := &MyMessageSet{} + if err := Unmarshal(buf, m2); err != nil { + t.Errorf("Unmarshal: %v", err) + } + b2, err := Marshal(m2) + if err != nil { + t.Errorf("re-Marshal: %v", err) + } + if !bytes.Equal(b2, buf) { + t.Errorf("Bytes differ on round-trip #%d", i) + } + } +} + +func TestUnmarshalMergesMessages(t *testing.T) { + // If a nested message occurs twice in the input, + // the fields should be merged when decoding. + a := &OtherMessage{ + Key: Int64(123), + Inner: &InnerMessage{ + Host: String("polhode"), + Port: Int32(1234), + }, + } + aData, err := Marshal(a) + if err != nil { + t.Fatalf("Marshal(a): %v", err) + } + b := &OtherMessage{ + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Connected: Bool(true), + }, + } + bData, err := Marshal(b) + if err != nil { + t.Fatalf("Marshal(b): %v", err) + } + want := &OtherMessage{ + Key: Int64(123), + Weight: Float32(1.2), + Inner: &InnerMessage{ + Host: String("herpolhode"), + Port: Int32(1234), + Connected: Bool(true), + }, + } + got := new(OtherMessage) + if err := Unmarshal(append(aData, bData...), got); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + if !Equal(got, want) { + t.Errorf("\n got %v\nwant %v", got, want) + } +} + +func TestEncodingSizes(t *testing.T) { + tests := []struct { + m Message + n int + }{ + {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, + {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, + {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, + {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, + } + for _, test := range tests { + b, err := Marshal(test.m) + if err != nil { + t.Errorf("Marshal(%v): %v", test.m, err) + continue + } + if len(b) != test.n { + t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) + } + } +} + +func TestRequiredNotSetError(t *testing.T) { + pb := initGoTest(false) + pb.RequiredField.Label = nil + pb.F_Int32Required = nil + pb.F_Int64Required = nil + + expected := "0807" + // field 1, encoding 0, value 7 + "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) + "5001" + // field 10, encoding 0, value 1 + "6d20000000" + // field 13, encoding 5, value 0x20 + "714000000000000000" + // field 14, encoding 1, value 0x40 + "78a019" + // field 15, encoding 0, value 0xca0 = 3232 + "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 + "8d0100004a45" + // field 17, encoding 5, value 3232.0 + "9101000000000040b940" + // field 18, encoding 1, value 6464.0 + "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" + "b304" + // field 70, encoding 3, start group + "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" + "b404" + // field 70, encoding 4, end group + "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" + "b0063f" + // field 102, encoding 0, 0x3f zigzag32 + "b8067f" // field 103, encoding 0, 0x7f zigzag64 + + o := old() + bytes, err := Marshal(pb) + if _, ok := err.(*RequiredNotSetError); !ok { + fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("expected = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.Label") < 0 { + t.Errorf("marshal-1 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 1", bytes) + t.Fatalf("expected = %s", expected) + } + + // Now test Unmarshal by recreating the original buffer. + pbd := new(GoTest) + err = Unmarshal(bytes, pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { + t.Errorf("unmarshal wrong err msg: %v", err) + } + bytes, err = Marshal(pbd) + if _, ok := err.(*RequiredNotSetError); !ok { + t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) + o.DebugPrint("", bytes) + t.Fatalf("string = %s", expected) + } + if strings.Index(err.Error(), "RequiredField.Label") < 0 { + t.Errorf("marshal-2 wrong err msg: %v", err) + } + if !equal(bytes, expected, t) { + o.DebugPrint("neq 2", bytes) + t.Fatalf("string = %s", expected) + } +} + +func fuzzUnmarshal(t *testing.T, data []byte) { + defer func() { + if e := recover(); e != nil { + t.Errorf("These bytes caused a panic: %+v", data) + t.Logf("Stack:\n%s", debug.Stack()) + t.FailNow() + } + }() + + pb := new(MyMessage) + Unmarshal(data, pb) +} + +func TestMapFieldMarshal(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + + // b should be the concatenation of these three byte sequences in some order. + parts := []string{ + "\n\a\b\x01\x12\x03Rob", + "\n\a\b\x04\x12\x03Ian", + "\n\b\b\x08\x12\x04Dave", + } + ok := false + for i := range parts { + for j := range parts { + if j == i { + continue + } + for k := range parts { + if k == i || k == j { + continue + } + try := parts[i] + parts[j] + parts[k] + if bytes.Equal(b, []byte(try)) { + ok = true + break + } + } + } + } + if !ok { + t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) + } + t.Logf("FYI b: %q", b) + + (new(Buffer)).DebugPrint("Dump of b", b) +} + +func TestMapFieldRoundTrips(t *testing.T) { + m := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Rob", + 4: "Ian", + 8: "Dave", + }, + MsgMapping: map[int64]*FloatingPoint{ + 0x7001: &FloatingPoint{F: Float64(2.0)}, + }, + ByteMapping: map[bool][]byte{ + false: []byte("that's not right!"), + true: []byte("aye, 'tis true!"), + }, + } + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("FYI b: %q", b) + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v", err) + } + for _, pair := range [][2]interface{}{ + {m.NameMapping, m2.NameMapping}, + {m.MsgMapping, m2.MsgMapping}, + {m.ByteMapping, m2.ByteMapping}, + } { + if !reflect.DeepEqual(pair[0], pair[1]) { + t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1]) + } + } +} + +func TestMapFieldWithNil(t *testing.T) { + m1 := &MessageWithMap{ + MsgMapping: map[int64]*FloatingPoint{ + 1: nil, + }, + } + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.MsgMapping[1]; !ok { + t.Error("msg_mapping[1] not present") + } else if v != nil { + t.Errorf("msg_mapping[1] not nil: %v", v) + } +} + +func TestMapFieldWithNilBytes(t *testing.T) { + m1 := &MessageWithMap{ + ByteMapping: map[bool][]byte{ + false: []byte{}, + true: nil, + }, + } + n := Size(m1) + b, err := Marshal(m1) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + if n != len(b) { + t.Errorf("Size(m1) = %d; want len(Marshal(m1)) = %d", n, len(b)) + } + m2 := new(MessageWithMap) + if err := Unmarshal(b, m2); err != nil { + t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) + } + if v, ok := m2.ByteMapping[false]; !ok { + t.Error("byte_mapping[false] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[false] not empty: %#v", v) + } + if v, ok := m2.ByteMapping[true]; !ok { + t.Error("byte_mapping[true] not present") + } else if len(v) != 0 { + t.Errorf("byte_mapping[true] not empty: %#v", v) + } +} + +func TestDecodeMapFieldMissingKey(t *testing.T) { + b := []byte{ + 0x0A, 0x03, // message, tag 1 (name_mapping), of length 3 bytes + // no key + 0x12, 0x01, 0x6D, // string value of length 1 byte, value "m" + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing key: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{0: "m"}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no key was not as expected. got: %v, want %v", got, want) + } +} + +func TestDecodeMapFieldMissingValue(t *testing.T) { + b := []byte{ + 0x0A, 0x02, // message, tag 1 (name_mapping), of length 2 bytes + 0x08, 0x01, // varint key, value 1 + // no value + } + got := &MessageWithMap{} + err := Unmarshal(b, got) + if err != nil { + t.Fatalf("failed to marshal map with missing value: %v", err) + } + want := &MessageWithMap{NameMapping: map[int32]string{1: ""}} + if !Equal(got, want) { + t.Errorf("Unmarshaled map with no value was not as expected. got: %v, want %v", got, want) + } +} + +func TestOneof(t *testing.T) { + m := &Communique{} + b, err := Marshal(m) + if err != nil { + t.Fatalf("Marshal of empty message with oneof: %v", err) + } + if len(b) != 0 { + t.Errorf("Marshal of empty message yielded too many bytes: %v", b) + } + + m = &Communique{ + Union: &Communique_Name{"Barry"}, + } + + // Round-trip. + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof: %v", err) + } + if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) + t.Errorf("Incorrect marshal of message with oneof: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof: %v", err) + } + if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { + t.Errorf("After round trip, Union = %+v", m.Union) + } + if name := m.GetName(); name != "Barry" { + t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") + } + + // Let's try with a message in the oneof. + m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} + b, err = Marshal(m) + if err != nil { + t.Fatalf("Marshal of message with oneof set to message: %v", err) + } + if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) + t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) + } + m.Reset() + if err := Unmarshal(b, m); err != nil { + t.Fatalf("Unmarshal of message with oneof set to message: %v", err) + } + ss, ok := m.Union.(*Communique_Msg) + if !ok || ss.Msg.GetStringField() != "deep deep string" { + t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) + } +} + +func TestInefficientPackedBool(t *testing.T) { + // https://github.com/golang/protobuf/issues/76 + inp := []byte{ + 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes + // Usually a bool should take a single byte, + // but it is permitted to be any varint. + 0xb9, 0x30, + } + if err := Unmarshal(inp, new(MoreRepeated)); err != nil { + t.Error(err) + } +} + +// Benchmarks + +func testMsg() *GoTest { + pb := initGoTest(true) + const N = 1000 // Internally the library starts much smaller. + pb.F_Int32Repeated = make([]int32, N) + pb.F_DoubleRepeated = make([]float64, N) + for i := 0; i < N; i++ { + pb.F_Int32Repeated[i] = int32(i) + pb.F_DoubleRepeated[i] = float64(i) + } + return pb +} + +func bytesMsg() *GoTest { + pb := initGoTest(true) + buf := make([]byte, 4000) + for i := range buf { + buf[i] = byte(i) + } + pb.F_BytesDefaulted = buf + return pb +} + +func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { + d, _ := marshal(pb) + b.SetBytes(int64(len(d))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + marshal(pb) + } +} + +func benchmarkBufferMarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + p.Reset() + err := p.Marshal(pb0) + return p.Bytes(), err + }) +} + +func benchmarkSize(b *testing.B, pb Message) { + benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { + Size(pb) + return nil, nil + }) +} + +func newOf(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + return reflect.New(in.Type().Elem()).Interface().(Message) +} + +func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { + d, _ := Marshal(pb) + b.SetBytes(int64(len(d))) + pbd := newOf(pb) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + unmarshal(d, pbd) + } +} + +func benchmarkBufferUnmarshal(b *testing.B, pb Message) { + p := NewBuffer(nil) + benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { + p.SetBuf(d) + return p.Unmarshal(pb0) + }) +} + +// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} + +func BenchmarkMarshal(b *testing.B) { + benchmarkMarshal(b, testMsg(), Marshal) +} + +func BenchmarkBufferMarshal(b *testing.B) { + benchmarkBufferMarshal(b, testMsg()) +} + +func BenchmarkSize(b *testing.B) { + benchmarkSize(b, testMsg()) +} + +func BenchmarkUnmarshal(b *testing.B) { + benchmarkUnmarshal(b, testMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshal(b *testing.B) { + benchmarkBufferUnmarshal(b, testMsg()) +} + +func BenchmarkMarshalBytes(b *testing.B) { + benchmarkMarshal(b, bytesMsg(), Marshal) +} + +func BenchmarkBufferMarshalBytes(b *testing.B) { + benchmarkBufferMarshal(b, bytesMsg()) +} + +func BenchmarkSizeBytes(b *testing.B) { + benchmarkSize(b, bytesMsg()) +} + +func BenchmarkUnmarshalBytes(b *testing.B) { + benchmarkUnmarshal(b, bytesMsg(), Unmarshal) +} + +func BenchmarkBufferUnmarshalBytes(b *testing.B) { + benchmarkBufferUnmarshal(b, bytesMsg()) +} + +func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { + b.StopTimer() + pb := initGoTestField() + skip := &GoSkipTest{ + SkipInt32: Int32(32), + SkipFixed32: Uint32(3232), + SkipFixed64: Uint64(6464), + SkipString: String("skipper"), + Skipgroup: &GoSkipTest_SkipGroup{ + GroupInt32: Int32(75), + GroupString: String("wxyz"), + }, + } + + pbd := new(GoTestField) + p := NewBuffer(nil) + p.Marshal(pb) + p.Marshal(skip) + p2 := NewBuffer(nil) + + b.StartTimer() + for i := 0; i < b.N; i++ { + p2.SetBuf(p.Bytes()) + p2.Unmarshal(pbd) + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/any_test.go b/vendor/src/github.com/golang/protobuf/proto/any_test.go new file mode 100644 index 0000000..83492c5 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/any_test.go @@ -0,0 +1,272 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + pb "github.com/golang/protobuf/proto/proto3_proto" + testpb "github.com/golang/protobuf/proto/testdata" + anypb "github.com/golang/protobuf/ptypes/any" +) + +var ( + expandedMarshaler = proto.TextMarshaler{ExpandAny: true} + expandedCompactMarshaler = proto.TextMarshaler{Compact: true, ExpandAny: true} +) + +// anyEqual reports whether two messages which may be google.protobuf.Any or may +// contain google.protobuf.Any fields are equal. We can't use proto.Equal for +// comparison, because semantically equivalent messages may be marshaled to +// binary in different tag order. Instead, trust that TextMarshaler with +// ExpandAny option works and compare the text marshaling results. +func anyEqual(got, want proto.Message) bool { + // if messages are proto.Equal, no need to marshal. + if proto.Equal(got, want) { + return true + } + g := expandedMarshaler.Text(got) + w := expandedMarshaler.Text(want) + return g == w +} + +type golden struct { + m proto.Message + t, c string +} + +var goldenMessages = makeGolden() + +func makeGolden() []golden { + nested := &pb.Nested{Bunny: "Monty"} + nb, err := proto.Marshal(nested) + if err != nil { + panic(err) + } + m1 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m2 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb}, + } + m3 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb}, + } + m4 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb}, + } + m5 := &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb} + + any1 := &testpb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} + proto.SetExtension(any1, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("foo")}) + proto.SetExtension(any1, testpb.E_Ext_Text, proto.String("bar")) + any1b, err := proto.Marshal(any1) + if err != nil { + panic(err) + } + any2 := &testpb.MyMessage{Count: proto.Int32(42), Bikeshed: testpb.MyMessage_GREEN.Enum(), RepBytes: [][]byte{[]byte("roboto")}} + proto.SetExtension(any2, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("baz")}) + any2b, err := proto.Marshal(any2) + if err != nil { + panic(err) + } + m6 := &pb.Message{ + Name: "David", + ResultCount: 47, + Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + ManyThings: []*anypb.Any{ + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b}, + &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, + }, + } + + const ( + m1Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m2Golden = ` +name: "David" +result_count: 47 +anything: < + ["http://[::1]/type.googleapis.com/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m3Golden = ` +name: "David" +result_count: 47 +anything: < + ["type.googleapis.com/\"/proto3_proto.Nested"]: < + bunny: "Monty" + > +> +` + m4Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/a/path/proto3_proto.Nested]: < + bunny: "Monty" + > +> +` + m5Golden = ` +[type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" +> +` + m6Golden = ` +name: "David" +result_count: 47 +anything: < + [type.googleapis.com/testdata.MyMessage]: < + count: 47 + name: "David" + [testdata.Ext.more]: < + data: "foo" + > + [testdata.Ext.text]: "bar" + > +> +many_things: < + [type.googleapis.com/testdata.MyMessage]: < + count: 42 + bikeshed: GREEN + rep_bytes: "roboto" + [testdata.Ext.more]: < + data: "baz" + > + > +> +many_things: < + [type.googleapis.com/testdata.MyMessage]: < + count: 47 + name: "David" + [testdata.Ext.more]: < + data: "foo" + > + [testdata.Ext.text]: "bar" + > +> +` + ) + return []golden{ + {m1, strings.TrimSpace(m1Golden) + "\n", strings.TrimSpace(compact(m1Golden)) + " "}, + {m2, strings.TrimSpace(m2Golden) + "\n", strings.TrimSpace(compact(m2Golden)) + " "}, + {m3, strings.TrimSpace(m3Golden) + "\n", strings.TrimSpace(compact(m3Golden)) + " "}, + {m4, strings.TrimSpace(m4Golden) + "\n", strings.TrimSpace(compact(m4Golden)) + " "}, + {m5, strings.TrimSpace(m5Golden) + "\n", strings.TrimSpace(compact(m5Golden)) + " "}, + {m6, strings.TrimSpace(m6Golden) + "\n", strings.TrimSpace(compact(m6Golden)) + " "}, + } +} + +func TestMarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + if got, want := expandedMarshaler.Text(tt.m), tt.t; got != want { + t.Errorf("message %v: got:\n%s\nwant:\n%s", tt.m, got, want) + } + if got, want := expandedCompactMarshaler.Text(tt.m), tt.c; got != want { + t.Errorf("message %v: got:\n`%s`\nwant:\n`%s`", tt.m, got, want) + } + } +} + +func TestUnmarshalGolden(t *testing.T) { + for _, tt := range goldenMessages { + want := tt.m + got := proto.Clone(tt.m) + got.Reset() + if err := proto.UnmarshalText(tt.t, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.t, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.t, got, want) + } + got.Reset() + if err := proto.UnmarshalText(tt.c, got); err != nil { + t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.c, err) + } + if !anyEqual(got, want) { + t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.c, got, want) + } + } +} + +func TestMarsahlUnknownAny(t *testing.T) { + m := &pb.Message{ + Anything: &anypb.Any{ + TypeUrl: "foo", + Value: []byte("bar"), + }, + } + want := `anything: < + type_url: "foo" + value: "bar" +> +` + got := expandedMarshaler.Text(m) + if got != want { + t.Errorf("got\n`%s`\nwant\n`%s`", got, want) + } +} + +func TestAmbiguousAny(t *testing.T) { + pb := &anypb.Any{} + err := proto.UnmarshalText(` + [type.googleapis.com/proto3_proto.Nested]: < + bunny: "Monty" + > + type_url: "ttt/proto3_proto.Nested" + `, pb) + t.Logf("result: %v (error: %v)", expandedMarshaler.Text(pb), err) + if err != nil { + t.Errorf("failed to parse ambiguous Any message: %v", err) + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/clone.go b/vendor/src/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 0000000..e392575 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,229 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(pb Message) Message { + in := reflect.ValueOf(pb) + if in.IsNil() { + return pb + } + + out := reflect.New(in.Type().Elem()) + // out is empty so a merge is a deep copy. + mergeStruct(out.Elem(), in.Elem()) + return out.Interface().(Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + // Explicit test prior to mergeStruct so that mistyped nils will fail + panic("proto: type mismatch") + } + if in.IsNil() { + // Merging nil into non-nil is a quiet no-op + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, ok := extendable(in.Addr().Interface()); ok { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/clone_test.go b/vendor/src/github.com/golang/protobuf/proto/clone_test.go new file mode 100644 index 0000000..76720f1 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/clone_test.go @@ -0,0 +1,267 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +var cloneTestMessage = &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, +} + +func init() { + ext := &pb.Ext{ + Data: proto.String("extension"), + } + if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { + panic("SetExtension: " + err.Error()) + } +} + +func TestClone(t *testing.T) { + m := proto.Clone(cloneTestMessage).(*pb.MyMessage) + if !proto.Equal(m, cloneTestMessage) { + t.Errorf("Clone(%v) = %v", cloneTestMessage, m) + } + + // Verify it was a deep copy. + *m.Inner.Port++ + if proto.Equal(m, cloneTestMessage) { + t.Error("Mutating clone changed the original") + } + // Byte fields and repeated fields should be copied. + if &m.Pet[0] == &cloneTestMessage.Pet[0] { + t.Error("Pet: repeated field not copied") + } + if &m.Others[0] == &cloneTestMessage.Others[0] { + t.Error("Others: repeated field not copied") + } + if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { + t.Error("Others[0].Value: bytes field not copied") + } + if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { + t.Error("RepBytes: repeated field not copied") + } + if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { + t.Error("RepBytes[0]: bytes field not copied") + } +} + +func TestCloneNil(t *testing.T) { + var m *pb.MyMessage + if c := proto.Clone(m); !proto.Equal(m, c) { + t.Errorf("Clone(%v) = %v", m, c) + } +} + +var mergeTests = []struct { + src, dst, want proto.Message +}{ + { + src: &pb.MyMessage{ + Count: proto.Int32(42), + }, + dst: &pb.MyMessage{ + Name: proto.String("Dave"), + }, + want: &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + }, + }, + { + src: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + }, + Pet: []string{"horsey"}, + Others: []*pb.OtherMessage{ + { + Value: []byte("some bytes"), + }, + }, + }, + dst: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("niles"), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + { + // Explicitly test a src=nil field + Inner: nil, + }, + }, + }, + want: &pb.MyMessage{ + Inner: &pb.InnerMessage{ + Host: proto.String("hey"), + Connected: proto.Bool(true), + Port: proto.Int32(9099), + }, + Pet: []string{"bunny", "kitty", "horsey"}, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(31415926535), + }, + {}, + { + Value: []byte("some bytes"), + }, + }, + }, + }, + { + src: &pb.MyMessage{ + RepBytes: [][]byte{[]byte("wow")}, + }, + dst: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham")}, + }, + want: &pb.MyMessage{ + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(6), + }, + RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, + }, + }, + // Check that a scalar bytes field replaces rather than appends. + { + src: &pb.OtherMessage{Value: []byte("foo")}, + dst: &pb.OtherMessage{Value: []byte("bar")}, + want: &pb.OtherMessage{Value: []byte("foo")}, + }, + { + src: &pb.MessageWithMap{ + NameMapping: map[int32]string{6: "Nigel"}, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + dst: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Bruce", // should be overwritten + 7: "Andrew", + }, + }, + want: &pb.MessageWithMap{ + NameMapping: map[int32]string{ + 6: "Nigel", + 7: "Andrew", + }, + MsgMapping: map[int64]*pb.FloatingPoint{ + 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, + }, + ByteMapping: map[bool][]byte{true: []byte("wowsa")}, + }, + }, + // proto3 shouldn't merge zero values, + // in the same way that proto2 shouldn't merge nils. + { + src: &proto3pb.Message{ + Name: "Aaron", + Data: []byte(""), // zero value, but not nil + }, + dst: &proto3pb.Message{ + HeightInCm: 176, + Data: []byte("texas!"), + }, + want: &proto3pb.Message{ + Name: "Aaron", + HeightInCm: 176, + Data: []byte("texas!"), + }, + }, + // Oneof fields should merge by assignment. + { + src: &pb.Communique{ + Union: &pb.Communique_Number{41}, + }, + dst: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + want: &pb.Communique{ + Union: &pb.Communique_Number{41}, + }, + }, + // Oneof nil is the same as not set. + { + src: &pb.Communique{}, + dst: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + want: &pb.Communique{ + Union: &pb.Communique_Name{"Bobby Tables"}, + }, + }, +} + +func TestMerge(t *testing.T) { + for _, m := range mergeTests { + got := proto.Clone(m.dst) + proto.Merge(got, m.src) + if !proto.Equal(got, m.want) { + t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) + } + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/decode.go b/vendor/src/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 0000000..07288a2 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,869 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" + "os" + "reflect" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// The fundamental decoders that interpret bytes on the wire. +// Those that take integer types all return uint64 and are +// therefore of type valueDecoder. + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + // x, n already 0 + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + // x, err already 0 + + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// These are not ValueDecoders: they produce an array of bytes or a string. +// bytes, embedded messages + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +// If the protocol buffer has extensions, and the field matches, add it as an extension. +// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. +func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { + oi := o.index + + err := o.skip(t, tag, wire) + if err != nil { + return err + } + + if !unrecField.IsValid() { + return nil + } + + ptr := structPointer_Bytes(base, unrecField) + + // Add the skipped field to struct field + obuf := o.buf + + o.buf = *ptr + o.EncodeVarint(uint64(tag<<3 | wire)) + *ptr = append(o.buf, obuf[oi:o.index]...) + + o.buf = obuf + + return nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +func (o *Buffer) skip(t reflect.Type, tag, wire int) error { + + var u uint64 + var err error + + switch wire { + case WireVarint: + _, err = o.DecodeVarint() + case WireFixed64: + _, err = o.DecodeFixed64() + case WireBytes: + _, err = o.DecodeRawBytes(false) + case WireFixed32: + _, err = o.DecodeFixed32() + case WireStartGroup: + for { + u, err = o.DecodeVarint() + if err != nil { + break + } + fwire := int(u & 0x7) + if fwire == WireEndGroup { + break + } + ftag := int(u >> 3) + err = o.skip(t, ftag, fwire) + if err != nil { + break + } + } + default: + err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) + } + return err +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The method should reset the receiver before +// decoding starts. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + return UnmarshalMerge(buf, pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +func (p *Buffer) DecodeGroup(pb Message) error { + typ, base, err := getbase(pb) + if err != nil { + return err + } + return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(Unmarshaler); ok { + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + typ, base, err := getbase(pb) + if err != nil { + return err + } + + err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) + + if collectStats { + stats.Decode++ + } + + return err +} + +// unmarshalType does the work of unmarshaling a structure. +func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { + var state errorState + required, reqFields := prop.reqCount, uint64(0) + + var err error + for err == nil && o.index < len(o.buf) { + oi := o.index + var u uint64 + u, err = o.DecodeVarint() + if err != nil { + break + } + wire := int(u & 0x7) + if wire == WireEndGroup { + if is_group { + return nil // input is satisfied + } + return fmt.Errorf("proto: %s: wiretype end group for non-group", st) + } + tag := int(u >> 3) + if tag <= 0 { + return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) + } + fieldnum, ok := prop.decoderTags.get(tag) + if !ok { + // Maybe it's an extension? + if prop.extendable { + if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { + if err = o.skip(st, tag, wire); err == nil { + extmap := e.extensionsWrite() + ext := extmap[int32(tag)] // may be missing + ext.enc = append(ext.enc, o.buf[oi:o.index]...) + extmap[int32(tag)] = ext + } + continue + } + } + // Maybe it's a oneof? + if prop.oneofUnmarshaler != nil { + m := structPointer_Interface(base, st).(Message) + // First return value indicates whether tag is a oneof field. + ok, err = prop.oneofUnmarshaler(m, tag, wire, o) + if err == ErrInternalBadWireType { + // Map the error to something more descriptive. + // Do the formatting here to save generated code space. + err = fmt.Errorf("bad wiretype for oneof field in %T", m) + } + if ok { + continue + } + } + err = o.skipAndSave(st, tag, wire, base, prop.unrecField) + continue + } + p := prop.Prop[fieldnum] + + if p.dec == nil { + fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) + continue + } + dec := p.dec + if wire != WireStartGroup && wire != p.WireType { + if wire == WireBytes && p.packedDec != nil { + // a packable field + dec = p.packedDec + } else { + err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) + continue + } + } + decErr := dec(o, p, base) + if decErr != nil && !state.shouldContinue(decErr, p) { + err = decErr + } + if err == nil && p.Required { + // Successfully decoded a required field. + if tag <= 64 { + // use bitmap for fields 1-64 to catch field reuse. + var mask uint64 = 1 << uint64(tag-1) + if reqFields&mask == 0 { + // new required field + reqFields |= mask + required-- + } + } else { + // This is imprecise. It can be fooled by a required field + // with a tag > 64 that is encoded twice; that's very rare. + // A fully correct implementation would require allocating + // a data structure, which we would like to avoid. + required-- + } + } + } + if err == nil { + if is_group { + return io.ErrUnexpectedEOF + } + if state.err != nil { + return state.err + } + if required > 0 { + // Not enough information to determine the exact field. If we use extra + // CPU, we could determine the field only if the missing required field + // has a tag <= 64 and we check reqFields. + return &RequiredNotSetError{"{Unknown}"} + } + } + return err +} + +// Individual type decoders +// For each, +// u is the decoded value, +// v is a pointer to the field (pointer) in the struct + +// Sizes of the pools to allocate inside the Buffer. +// The goal is modest amortization and allocation +// on at least 16-byte boundaries. +const ( + boolPoolSize = 16 + uint32PoolSize = 8 + uint64PoolSize = 4 +) + +// Decode a bool. +func (o *Buffer) dec_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + if len(o.bools) == 0 { + o.bools = make([]bool, boolPoolSize) + } + o.bools[0] = u != 0 + *structPointer_Bool(base, p.field) = &o.bools[0] + o.bools = o.bools[1:] + return nil +} + +func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + *structPointer_BoolVal(base, p.field) = u != 0 + return nil +} + +// Decode an int32. +func (o *Buffer) dec_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) + return nil +} + +func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) + return nil +} + +// Decode an int64. +func (o *Buffer) dec_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64_Set(structPointer_Word64(base, p.field), o, u) + return nil +} + +func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64Val_Set(structPointer_Word64Val(base, p.field), o, u) + return nil +} + +// Decode a string. +func (o *Buffer) dec_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_String(base, p.field) = &s + return nil +} + +func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_StringVal(base, p.field) = s + return nil +} + +// Decode a slice of bytes ([]byte). +func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + *structPointer_Bytes(base, p.field) = b + return nil +} + +// Decode a slice of bools ([]bool). +func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + v := structPointer_BoolSlice(base, p.field) + *v = append(*v, u != 0) + return nil +} + +// Decode a slice of bools ([]bool) in packed format. +func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { + v := structPointer_BoolSlice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded bools + fin := o.index + nb + if fin < o.index { + return errOverflow + } + + y := *v + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + y = append(y, u != 0) + } + + *v = y + return nil +} + +// Decode a slice of int32s ([]int32). +func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + structPointer_Word32Slice(base, p.field).Append(uint32(u)) + return nil +} + +// Decode a slice of int32s ([]int32) in packed format. +func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int32s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(uint32(u)) + } + return nil +} + +// Decode a slice of int64s ([]int64). +func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + + structPointer_Word64Slice(base, p.field).Append(u) + return nil +} + +// Decode a slice of int64s ([]int64) in packed format. +func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int64s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(u) + } + return nil +} + +// Decode a slice of strings ([]string). +func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + v := structPointer_StringSlice(base, p.field) + *v = append(*v, s) + return nil +} + +// Decode a slice of slice of bytes ([][]byte). +func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + v := structPointer_BytesSlice(base, p.field) + *v = append(*v, b) + return nil +} + +// Decode a map field. +func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + oi := o.index // index at the end of this map entry + o.index -= len(raw) // move buffer back to start of map entry + + mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V + if mptr.Elem().IsNil() { + mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) + } + v := mptr.Elem() // map[K]V + + // Prepare addressable doubly-indirect placeholders for the key and value types. + // See enc_new_map for why. + keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K + keybase := toStructPointer(keyptr.Addr()) // **K + + var valbase structPointer + var valptr reflect.Value + switch p.mtype.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valptr = reflect.ValueOf(&dummy) // *[]byte + valbase = toStructPointer(valptr) // *[]byte + case reflect.Ptr: + // message; valptr is **Msg; need to allocate the intermediate pointer + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valptr.Set(reflect.New(valptr.Type().Elem())) + valbase = toStructPointer(valptr) + default: + // everything else + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valbase = toStructPointer(valptr.Addr()) // **V + } + + // Decode. + // This parses a restricted wire format, namely the encoding of a message + // with two fields. See enc_new_map for the format. + for o.index < oi { + // tagcode for key and value properties are always a single byte + // because they have tags 1 and 2. + tagcode := o.buf[o.index] + o.index++ + switch tagcode { + case p.mkeyprop.tagcode[0]: + if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { + return err + } + case p.mvalprop.tagcode[0]: + if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { + return err + } + default: + // TODO: Should we silently skip this instead? + return fmt.Errorf("proto: bad map data tag %d", raw[0]) + } + } + keyelem, valelem := keyptr.Elem(), valptr.Elem() + if !keyelem.IsValid() { + keyelem = reflect.Zero(p.mtype.Key()) + } + if !valelem.IsValid() { + valelem = reflect.Zero(p.mtype.Elem()) + } + + v.SetMapIndex(keyelem, valelem) + return nil +} + +// Decode a group. +func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + return o.unmarshalType(p.stype, p.sprop, true, bas) +} + +// Decode an embedded message. +func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { + raw, e := o.DecodeRawBytes(false) + if e != nil { + return e + } + + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := structPointer_Interface(bas, p.stype) + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, false, bas) + o.buf = obuf + o.index = oi + + return err +} + +// Decode a slice of embedded messages. +func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, false, base) +} + +// Decode a slice of embedded groups. +func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, true, base) +} + +// Decode a slice of structs ([]*struct). +func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { + v := reflect.New(p.stype) + bas := toStructPointer(v) + structPointer_StructPointerSlice(base, p.field).Append(bas) + + if is_group { + err := o.unmarshalType(p.stype, p.sprop, is_group, bas) + return err + } + + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := v.Interface() + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, is_group, bas) + + o.buf = obuf + o.index = oi + + return err +} diff --git a/vendor/src/github.com/golang/protobuf/proto/encode.go b/vendor/src/github.com/golang/protobuf/proto/encode.go new file mode 100644 index 0000000..8c1b8fd --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/encode.go @@ -0,0 +1,1363 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "fmt" + "reflect" + "sort" +) + +// RequiredNotSetError is the error returned if Marshal is called with +// a protocol buffer struct whose required fields have not +// all been initialized. It is also the error returned if Unmarshal is +// called with an encoded protocol buffer that does not include all the +// required fields. +// +// When printed, RequiredNotSetError reports the first unset required field in a +// message. If the field cannot be precisely determined, it is reported as +// "{Unknown}". +type RequiredNotSetError struct { + field string +} + +func (e *RequiredNotSetError) Error() string { + return fmt.Sprintf("proto: required field %q not set", e.field) +} + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// maxMarshalSize is the largest allowed size of an encoded protobuf, +// since C++ and Java use signed int32s for the size. +const maxMarshalSize = 1<<31 - 1 + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + return sizeVarint(x) +} + +func sizeVarint(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +func sizeFixed64(x uint64) int { + return 8 +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +func sizeFixed32(x uint64) int { + return 4 +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +func sizeZigzag64(x uint64) int { + return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +func sizeZigzag32(x uint64) int { + return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +func sizeRawBytes(b []byte) int { + return sizeVarint(uint64(len(b))) + + len(b) +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +func sizeStringBytes(s string) int { + return sizeVarint(uint64(len(s))) + + len(s) +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, returning the data. +func Marshal(pb Message) ([]byte, error) { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + return m.Marshal() + } + p := NewBuffer(nil) + err := p.Marshal(pb) + var state errorState + if err != nil && !state.shouldContinue(err, nil) { + return nil, err + } + if p.buf == nil && err == nil { + // Return a non-nil slice on success. + return []byte{}, nil + } + return p.buf, err +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + var state errorState + err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) + } + return err +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, writing the result to the +// Buffer. +func (p *Buffer) Marshal(pb Message) error { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + data, err := m.Marshal() + if err != nil { + return err + } + p.buf = append(p.buf, data...) + return nil + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + err = p.enc_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + stats.Encode++ + } + + if len(p.buf) > maxMarshalSize { + return ErrTooLarge + } + return err +} + +// Size returns the encoded size of a protocol buffer. +func Size(pb Message) (n int) { + // Can the object marshal itself? If so, Size is slow. + // TODO: add Size to Marshaler, or add a Sizer interface. + if m, ok := pb.(Marshaler); ok { + b, _ := m.Marshal() + return len(b) + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return 0 + } + if err == nil { + n = size_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + stats.Size++ + } + + return +} + +// Individual type encoders. + +// Encode a bool. +func (o *Buffer) enc_bool(p *Properties, base structPointer) error { + v := *structPointer_Bool(base, p.field) + if v == nil { + return ErrNil + } + x := 0 + if *v { + x = 1 + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { + v := *structPointer_BoolVal(base, p.field) + if !v { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, 1) + return nil +} + +func size_bool(p *Properties, base structPointer) int { + v := *structPointer_Bool(base, p.field) + if v == nil { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +func size_proto3_bool(p *Properties, base structPointer) int { + v := *structPointer_BoolVal(base, p.field) + if !v && !p.oneof { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +// Encode an int32. +func (o *Buffer) enc_int32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode a uint32. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := word32_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := word32_Get(v) + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode an int64. +func (o *Buffer) enc_int64(p *Properties, base structPointer) error { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return ErrNil + } + x := word64_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func size_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return 0 + } + x := word64_Get(v) + n += len(p.tagcode) + n += p.valSize(x) + return +} + +func size_proto3_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(x) + return +} + +// Encode a string. +func (o *Buffer) enc_string(p *Properties, base structPointer) error { + v := *structPointer_String(base, p.field) + if v == nil { + return ErrNil + } + x := *v + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(x) + return nil +} + +func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { + v := *structPointer_StringVal(base, p.field) + if v == "" { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(v) + return nil +} + +func size_string(p *Properties, base structPointer) (n int) { + v := *structPointer_String(base, p.field) + if v == nil { + return 0 + } + x := *v + n += len(p.tagcode) + n += sizeStringBytes(x) + return +} + +func size_proto3_string(p *Properties, base structPointer) (n int) { + v := *structPointer_StringVal(base, p.field) + if v == "" && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeStringBytes(v) + return +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} + +// Encode a message struct. +func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { + var state errorState + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return ErrNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + return state.err + } + + o.buf = append(o.buf, p.tagcode...) + return o.enc_len_struct(p.sprop, structp, &state) +} + +func size_struct_message(p *Properties, base structPointer) int { + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return 0 + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n0 := len(p.tagcode) + n1 := sizeRawBytes(data) + return n0 + n1 + } + + n0 := len(p.tagcode) + n1 := size_struct(p.sprop, structp) + n2 := sizeVarint(uint64(n1)) // size of encoded length + return n0 + n1 + n2 +} + +// Encode a group struct. +func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { + var state errorState + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return ErrNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + err := o.enc_struct(p.sprop, b) + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return state.err +} + +func size_struct_group(p *Properties, base structPointer) (n int) { + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return 0 + } + + n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) + n += size_struct(p.sprop, b) + n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return +} + +// Encode a slice of bools ([]bool). +func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + for _, x := range s { + o.buf = append(o.buf, p.tagcode...) + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_bool(p *Properties, base structPointer) int { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + return l * (len(p.tagcode) + 1) // each bool takes exactly one byte +} + +// Encode a slice of bools ([]bool) in packed format. +func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(l)) // each bool takes exactly one byte + for _, x := range s { + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_packed_bool(p *Properties, base structPointer) (n int) { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + n += len(p.tagcode) + n += sizeVarint(uint64(l)) + n += l // each bool takes exactly one byte + return +} + +// Encode a slice of bytes ([]byte). +func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if s == nil { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func size_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if s == nil && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +// Encode a slice of int32s ([]int32). +func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of int32s ([]int32) in packed format. +func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(buf, uint64(x)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + bufSize += p.valSize(uint64(x)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of uint32s ([]uint32). +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := s.Index(i) + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := s.Index(i) + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of uint32s ([]uint32) in packed format. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, uint64(s.Index(i))) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(uint64(s.Index(i))) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of int64s ([]int64). +func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, s.Index(i)) + } + return nil +} + +func size_slice_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + n += p.valSize(s.Index(i)) + } + return +} + +// Encode a slice of int64s ([]int64) in packed format. +func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, s.Index(i)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(s.Index(i)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of slice of bytes ([][]byte). +func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(ss[i]) + } + return nil +} + +func size_slice_slice_byte(p *Properties, base structPointer) (n int) { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return 0 + } + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeRawBytes(ss[i]) + } + return +} + +// Encode a slice of strings ([]string). +func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(ss[i]) + } + return nil +} + +func size_slice_string(p *Properties, base structPointer) (n int) { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeStringBytes(ss[i]) + } + return +} + +// Encode a slice of message structs ([]*struct). +func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return errRepeatedHasNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + continue + } + + o.buf = append(o.buf, p.tagcode...) + err := o.enc_len_struct(p.sprop, structp, &state) + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + } + return state.err +} + +func size_slice_struct_message(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return // return the size up to this point + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n += len(p.tagcode) + n += sizeRawBytes(data) + continue + } + + n0 := size_struct(p.sprop, structp) + n1 := sizeVarint(uint64(n0)) // size of encoded length + n += n0 + n1 + } + return +} + +// Encode a slice of group structs ([]*struct). +func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return errRepeatedHasNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + + err := o.enc_struct(p.sprop, b) + + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + } + return state.err +} + +func size_slice_struct_group(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) + n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return // return size up to this point + } + + n += size_struct(p.sprop, b) + } + return +} + +// Encode an extension map. +func (o *Buffer) enc_map(p *Properties, base structPointer) error { + exts := structPointer_ExtMap(base, p.field) + if err := encodeExtensionsMap(*exts); err != nil { + return err + } + + return o.enc_map_body(*exts) +} + +func (o *Buffer) enc_exts(p *Properties, base structPointer) error { + exts := structPointer_Extensions(base, p.field) + if err := encodeExtensions(exts); err != nil { + return err + } + v, _ := exts.extensionsRead() + + return o.enc_map_body(v) +} + +func (o *Buffer) enc_map_body(v map[int32]Extension) error { + // Fast-path for common cases: zero or one extensions. + if len(v) <= 1 { + for _, e := range v { + o.buf = append(o.buf, e.enc...) + } + return nil + } + + // Sort keys to provide a deterministic encoding. + keys := make([]int, 0, len(v)) + for k := range v { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + o.buf = append(o.buf, v[int32(k)].enc...) + } + return nil +} + +func size_map(p *Properties, base structPointer) int { + v := structPointer_ExtMap(base, p.field) + return extensionsMapSize(*v) +} + +func size_exts(p *Properties, base structPointer) int { + v := structPointer_Extensions(base, p.field) + return extensionsSize(v) +} + +// Encode a map field. +func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { + var state errorState // XXX: or do we need to plumb this through? + + /* + A map defined as + map map_field = N; + is encoded in the same way as + message MapFieldEntry { + key_type key = 1; + value_type value = 2; + } + repeated MapFieldEntry map_field = N; + */ + + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + if v.Len() == 0 { + return nil + } + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + enc := func() error { + if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { + return err + } + if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { + return err + } + return nil + } + + // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + + keycopy.Set(key) + valcopy.Set(val) + + o.buf = append(o.buf, p.tagcode...) + if err := o.enc_len_thing(enc, &state); err != nil { + return err + } + } + return nil +} + +func size_new_map(p *Properties, base structPointer) int { + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + n := 0 + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + keycopy.Set(key) + valcopy.Set(val) + + // Tag codes for key and val are the responsibility of the sub-sizer. + keysize := p.mkeyprop.size(p.mkeyprop, keybase) + valsize := p.mvalprop.size(p.mvalprop, valbase) + entry := keysize + valsize + // Add on tag code and length of map entry itself. + n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry + } + return n +} + +// mapEncodeScratch returns a new reflect.Value matching the map's value type, +// and a structPointer suitable for passing to an encoder or sizer. +func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { + // Prepare addressable doubly-indirect placeholders for the key and value types. + // This is needed because the element-type encoders expect **T, but the map iteration produces T. + + keycopy = reflect.New(mapType.Key()).Elem() // addressable K + keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K + keyptr.Set(keycopy.Addr()) // + keybase = toStructPointer(keyptr.Addr()) // **K + + // Value types are more varied and require special handling. + switch mapType.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte + valbase = toStructPointer(valcopy.Addr()) + case reflect.Ptr: + // message; the generated field type is map[K]*Msg (so V is *Msg), + // so we only need one level of indirection. + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valbase = toStructPointer(valcopy.Addr()) + default: + // everything else + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V + valptr.Set(valcopy.Addr()) // + valbase = toStructPointer(valptr.Addr()) // **V + } + return +} + +// Encode a struct. +func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { + var state errorState + // Encode fields in tag order so that decoders may use optimizations + // that depend on the ordering. + // https://developers.google.com/protocol-buffers/docs/encoding#order + for _, i := range prop.order { + p := prop.Prop[i] + if p.enc != nil { + err := p.enc(o, p, base) + if err != nil { + if err == ErrNil { + if p.Required && state.err == nil { + state.err = &RequiredNotSetError{p.Name} + } + } else if err == errRepeatedHasNil { + // Give more context to nil values in repeated fields. + return errors.New("repeated field " + p.OrigName + " has nil element") + } else if !state.shouldContinue(err, p) { + return err + } + } + if len(o.buf) > maxMarshalSize { + return ErrTooLarge + } + } + } + + // Do oneof fields. + if prop.oneofMarshaler != nil { + m := structPointer_Interface(base, prop.stype).(Message) + if err := prop.oneofMarshaler(m, o); err == ErrNil { + return errOneofHasNil + } else if err != nil { + return err + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + if len(o.buf)+len(v) > maxMarshalSize { + return ErrTooLarge + } + if len(v) > 0 { + o.buf = append(o.buf, v...) + } + } + + return state.err +} + +func size_struct(prop *StructProperties, base structPointer) (n int) { + for _, i := range prop.order { + p := prop.Prop[i] + if p.size != nil { + n += p.size(p, base) + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + n += len(v) + } + + // Factor in any oneof fields. + if prop.oneofSizer != nil { + m := structPointer_Interface(base, prop.stype).(Message) + n += prop.oneofSizer(m) + } + + return +} + +var zeroes [20]byte // longer than any conceivable sizeVarint + +// Encode a struct, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { + return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) +} + +// Encode something, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { + iLen := len(o.buf) + o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length + iMsg := len(o.buf) + err := enc() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + lMsg := len(o.buf) - iMsg + lLen := sizeVarint(uint64(lMsg)) + switch x := lLen - (iMsg - iLen); { + case x > 0: // actual length is x bytes larger than the space we reserved + // Move msg x bytes right. + o.buf = append(o.buf, zeroes[:x]...) + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + case x < 0: // actual length is x bytes smaller than the space we reserved + // Move msg x bytes left. + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + o.buf = o.buf[:len(o.buf)+x] // x is negative + } + // Encode the length in the reserved space. + o.buf = o.buf[:iLen] + o.EncodeVarint(uint64(lMsg)) + o.buf = o.buf[:len(o.buf)+lMsg] + return state.err +} + +// errorState maintains the first error that occurs and updates that error +// with additional context. +type errorState struct { + err error +} + +// shouldContinue reports whether encoding should continue upon encountering the +// given error. If the error is RequiredNotSetError, shouldContinue returns true +// and, if this is the first appearance of that error, remembers it for future +// reporting. +// +// If prop is not nil, it may update any error with additional context about the +// field with the error. +func (s *errorState) shouldContinue(err error, prop *Properties) bool { + // Ignore unset required fields. + reqNotSet, ok := err.(*RequiredNotSetError) + if !ok { + return false + } + if s.err == nil { + if prop != nil { + err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} + } + s.err = err + } + return true +} diff --git a/vendor/src/github.com/golang/protobuf/proto/equal.go b/vendor/src/github.com/golang/protobuf/proto/equal.go new file mode 100644 index 0000000..cafb99f --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/equal.go @@ -0,0 +1,289 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal (a "bytes" field, + although represented by []byte, is not a repeated field) + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + b1, ok := f1.Interface().(raw) + if ok { + b2 := f2.Interface().(raw) + // RawMessage + if !bytes.Equal(b1.Bytes(), b2.Bytes()) { + return false + } + continue + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + if !bytes.Equal(u1, u2) { + return false + } + + return true +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + continue + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/src/github.com/golang/protobuf/proto/equal_test.go b/vendor/src/github.com/golang/protobuf/proto/equal_test.go new file mode 100644 index 0000000..7b45eaa --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/equal_test.go @@ -0,0 +1,212 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +// Four identical base messages. +// The init function adds extensions to some of them. +var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)} +var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)} +var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)} +var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)} + +// Two messages with non-message extensions. +var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)} +var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)} + +func init() { + ext1 := &pb.Ext{Data: String("Kirk")} + ext2 := &pb.Ext{Data: String("Picard")} + + // messageWithExtension1a has ext1, but never marshals it. + if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil { + panic("SetExtension on 1a failed: " + err.Error()) + } + + // messageWithExtension1b is the unmarshaled form of messageWithExtension1a. + if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil { + panic("SetExtension on 1b failed: " + err.Error()) + } + buf, err := Marshal(messageWithExtension1b) + if err != nil { + panic("Marshal of 1b failed: " + err.Error()) + } + messageWithExtension1b.Reset() + if err := Unmarshal(buf, messageWithExtension1b); err != nil { + panic("Unmarshal of 1b failed: " + err.Error()) + } + + // messageWithExtension2 has ext2. + if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil { + panic("SetExtension on 2 failed: " + err.Error()) + } + + if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil { + panic("SetExtension on Int32-1 failed: " + err.Error()) + } + if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil { + panic("SetExtension on Int32-2 failed: " + err.Error()) + } +} + +var EqualTests = []struct { + desc string + a, b Message + exp bool +}{ + {"different types", &pb.GoEnum{}, &pb.GoTestField{}, false}, + {"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true}, + {"nil vs nil", nil, nil, true}, + {"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true}, + {"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false}, + {"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false}, + + {"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false}, + {"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false}, + {"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false}, + {"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true}, + + {"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false}, + {"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false}, + {"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false}, + {"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true}, + {"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true}, + {"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true}, + {"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true}, + + { + "nested, different", + &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}}, + &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}}, + false, + }, + { + "nested, equal", + &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, + &pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, + true, + }, + + {"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true}, + {"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true}, + {"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false}, + { + "repeated bytes", + &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, + &pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, + true, + }, + // In proto3, []byte{} and []byte(nil) are equal. + {"proto3 bytes, empty vs nil", &proto3pb.Message{Data: []byte{}}, &proto3pb.Message{Data: nil}, true}, + + {"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false}, + {"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true}, + {"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false}, + + {"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true}, + {"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false}, + + { + "message with group", + &pb.MyMessage{ + Count: Int32(1), + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: Int32(5), + }, + }, + &pb.MyMessage{ + Count: Int32(1), + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: Int32(5), + }, + }, + true, + }, + + { + "map same", + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, + true, + }, + { + "map different entry", + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, + &pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}}, + false, + }, + { + "map different key only", + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, + &pb.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}}, + false, + }, + { + "map different value only", + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, + &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}}, + false, + }, + { + "oneof same", + &pb.Communique{Union: &pb.Communique_Number{41}}, + &pb.Communique{Union: &pb.Communique_Number{41}}, + true, + }, + { + "oneof one nil", + &pb.Communique{Union: &pb.Communique_Number{41}}, + &pb.Communique{}, + false, + }, + { + "oneof different", + &pb.Communique{Union: &pb.Communique_Number{41}}, + &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, + false, + }, +} + +func TestEqual(t *testing.T) { + for _, tc := range EqualTests { + if res := Equal(tc.a, tc.b); res != tc.exp { + t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp) + } + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/extensions.go b/vendor/src/github.com/golang/protobuf/proto/extensions.go new file mode 100644 index 0000000..9f484f5 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/extensions.go @@ -0,0 +1,555 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, bool) { + if ep, ok := p.(extendableProto); ok { + return ep, ok + } + if ep, ok := p.(extendableProtoV1); ok { + return extensionAdapter{ep}, ok + } + return nil, false +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() +var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + epb, ok := extendable(base) + if !ok { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensions(e *XXX_InternalExtensions) error { + m, mu := e.extensionsRead() + if m == nil { + return nil // fast path + } + mu.Lock() + defer mu.Unlock() + return encodeExtensionsMap(m) +} + +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensionsMap(m map[int32]Extension) error { + for k, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + p := NewBuffer(nil) + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + if err := props.enc(p, props, toStructPointer(x)); err != nil { + return err + } + e.enc = p.buf + m[k] = e + } + return nil +} + +func extensionsSize(e *XXX_InternalExtensions) (n int) { + m, mu := e.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + defer mu.Unlock() + return extensionsMapSize(m) +} + +func extensionsMapSize(m map[int32]Extension) (n int) { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + n += props.size(props, toStructPointer(x)) + } + return +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + // TODO: Check types, field numbers, etc.? + epb, ok := extendable(pb) + if !ok { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok = extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, ok := extendable(pb) + if !ok { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) +} + +// GetExtension parses and returns the given extension of pb. +// If the extension is not present and has no default value it returns ErrMissingExtension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + o := NewBuffer(b) + + t := reflect.TypeOf(extension.ExtensionType) + + props := extensionProperties(extension) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate a "field" to store the pointer/slice itself; the + // pointer/slice will be stored here. We pass + // the address of this field to props.dec. + // This passes a zero field and a *t and lets props.dec + // interpret it as a *struct{ x t }. + value := reflect.New(t).Elem() + + for { + // Discard wire type and field number varint. It isn't needed. + if _, err := o.DecodeVarint(); err != nil { + return nil, err + } + + if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { + return nil, err + } + + if o.index >= len(o.buf) { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, ok := extendable(pb) + if !ok { + return errors.New("proto: not an extendable proto") + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return errors.New("proto: bad extension value type") + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, ok := extendable(pb) + if !ok { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/src/github.com/golang/protobuf/proto/extensions_test.go b/vendor/src/github.com/golang/protobuf/proto/extensions_test.go new file mode 100644 index 0000000..ed6a27d --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/extensions_test.go @@ -0,0 +1,455 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "bytes" + "fmt" + "reflect" + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +func TestGetExtensionsWithMissingExtensions(t *testing.T) { + msg := &pb.MyMessage{} + ext1 := &pb.Ext{} + if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { + t.Fatalf("Could not set ext1: %s", ext1) + } + exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ + pb.E_Ext_More, + pb.E_Ext_Text, + }) + if err != nil { + t.Fatalf("GetExtensions() failed: %s", err) + } + if exts[0] != ext1 { + t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) + } + if exts[1] != nil { + t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) + } +} + +func TestGetExtensionStability(t *testing.T) { + check := func(m *pb.MyMessage) bool { + ext1, err := proto.GetExtension(m, pb.E_Ext_More) + if err != nil { + t.Fatalf("GetExtension() failed: %s", err) + } + ext2, err := proto.GetExtension(m, pb.E_Ext_More) + if err != nil { + t.Fatalf("GetExtension() failed: %s", err) + } + return ext1 == ext2 + } + msg := &pb.MyMessage{Count: proto.Int32(4)} + ext0 := &pb.Ext{} + if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { + t.Fatalf("Could not set ext1: %s", ext0) + } + if !check(msg) { + t.Errorf("GetExtension() not stable before marshaling") + } + bb, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("Marshal() failed: %s", err) + } + msg1 := &pb.MyMessage{} + err = proto.Unmarshal(bb, msg1) + if err != nil { + t.Fatalf("Unmarshal() failed: %s", err) + } + if !check(msg1) { + t.Errorf("GetExtension() not stable after unmarshaling") + } +} + +func TestGetExtensionDefaults(t *testing.T) { + var setFloat64 float64 = 1 + var setFloat32 float32 = 2 + var setInt32 int32 = 3 + var setInt64 int64 = 4 + var setUint32 uint32 = 5 + var setUint64 uint64 = 6 + var setBool = true + var setBool2 = false + var setString = "Goodnight string" + var setBytes = []byte("Goodnight bytes") + var setEnum = pb.DefaultsMessage_TWO + + type testcase struct { + ext *proto.ExtensionDesc // Extension we are testing. + want interface{} // Expected value of extension, or nil (meaning that GetExtension will fail). + def interface{} // Expected value of extension after ClearExtension(). + } + tests := []testcase{ + {pb.E_NoDefaultDouble, setFloat64, nil}, + {pb.E_NoDefaultFloat, setFloat32, nil}, + {pb.E_NoDefaultInt32, setInt32, nil}, + {pb.E_NoDefaultInt64, setInt64, nil}, + {pb.E_NoDefaultUint32, setUint32, nil}, + {pb.E_NoDefaultUint64, setUint64, nil}, + {pb.E_NoDefaultSint32, setInt32, nil}, + {pb.E_NoDefaultSint64, setInt64, nil}, + {pb.E_NoDefaultFixed32, setUint32, nil}, + {pb.E_NoDefaultFixed64, setUint64, nil}, + {pb.E_NoDefaultSfixed32, setInt32, nil}, + {pb.E_NoDefaultSfixed64, setInt64, nil}, + {pb.E_NoDefaultBool, setBool, nil}, + {pb.E_NoDefaultBool, setBool2, nil}, + {pb.E_NoDefaultString, setString, nil}, + {pb.E_NoDefaultBytes, setBytes, nil}, + {pb.E_NoDefaultEnum, setEnum, nil}, + {pb.E_DefaultDouble, setFloat64, float64(3.1415)}, + {pb.E_DefaultFloat, setFloat32, float32(3.14)}, + {pb.E_DefaultInt32, setInt32, int32(42)}, + {pb.E_DefaultInt64, setInt64, int64(43)}, + {pb.E_DefaultUint32, setUint32, uint32(44)}, + {pb.E_DefaultUint64, setUint64, uint64(45)}, + {pb.E_DefaultSint32, setInt32, int32(46)}, + {pb.E_DefaultSint64, setInt64, int64(47)}, + {pb.E_DefaultFixed32, setUint32, uint32(48)}, + {pb.E_DefaultFixed64, setUint64, uint64(49)}, + {pb.E_DefaultSfixed32, setInt32, int32(50)}, + {pb.E_DefaultSfixed64, setInt64, int64(51)}, + {pb.E_DefaultBool, setBool, true}, + {pb.E_DefaultBool, setBool2, true}, + {pb.E_DefaultString, setString, "Hello, string"}, + {pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")}, + {pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE}, + } + + checkVal := func(test testcase, msg *pb.DefaultsMessage, valWant interface{}) error { + val, err := proto.GetExtension(msg, test.ext) + if err != nil { + if valWant != nil { + return fmt.Errorf("GetExtension(): %s", err) + } + if want := proto.ErrMissingExtension; err != want { + return fmt.Errorf("Unexpected error: got %v, want %v", err, want) + } + return nil + } + + // All proto2 extension values are either a pointer to a value or a slice of values. + ty := reflect.TypeOf(val) + tyWant := reflect.TypeOf(test.ext.ExtensionType) + if got, want := ty, tyWant; got != want { + return fmt.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want) + } + tye := ty.Elem() + tyeWant := tyWant.Elem() + if got, want := tye, tyeWant; got != want { + return fmt.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want) + } + + // Check the name of the type of the value. + // If it is an enum it will be type int32 with the name of the enum. + if got, want := tye.Name(), tye.Name(); got != want { + return fmt.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want) + } + + // Check that value is what we expect. + // If we have a pointer in val, get the value it points to. + valExp := val + if ty.Kind() == reflect.Ptr { + valExp = reflect.ValueOf(val).Elem().Interface() + } + if got, want := valExp, valWant; !reflect.DeepEqual(got, want) { + return fmt.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want) + } + + return nil + } + + setTo := func(test testcase) interface{} { + setTo := reflect.ValueOf(test.want) + if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr { + setTo = reflect.New(typ).Elem() + setTo.Set(reflect.New(setTo.Type().Elem())) + setTo.Elem().Set(reflect.ValueOf(test.want)) + } + return setTo.Interface() + } + + for _, test := range tests { + msg := &pb.DefaultsMessage{} + name := test.ext.Name + + // Check the initial value. + if err := checkVal(test, msg, test.def); err != nil { + t.Errorf("%s: %v", name, err) + } + + // Set the per-type value and check value. + name = fmt.Sprintf("%s (set to %T %v)", name, test.want, test.want) + if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil { + t.Errorf("%s: SetExtension(): %v", name, err) + continue + } + if err := checkVal(test, msg, test.want); err != nil { + t.Errorf("%s: %v", name, err) + continue + } + + // Set and check the value. + name += " (cleared)" + proto.ClearExtension(msg, test.ext) + if err := checkVal(test, msg, test.def); err != nil { + t.Errorf("%s: %v", name, err) + } + } +} + +func TestExtensionsRoundTrip(t *testing.T) { + msg := &pb.MyMessage{} + ext1 := &pb.Ext{ + Data: proto.String("hi"), + } + ext2 := &pb.Ext{ + Data: proto.String("there"), + } + exists := proto.HasExtension(msg, pb.E_Ext_More) + if exists { + t.Error("Extension More present unexpectedly") + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { + t.Error(err) + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { + t.Error(err) + } + e, err := proto.GetExtension(msg, pb.E_Ext_More) + if err != nil { + t.Error(err) + } + x, ok := e.(*pb.Ext) + if !ok { + t.Errorf("e has type %T, expected testdata.Ext", e) + } else if *x.Data != "there" { + t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) + } + proto.ClearExtension(msg, pb.E_Ext_More) + if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { + t.Errorf("got %v, expected ErrMissingExtension", e) + } + if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { + t.Error("expected bad extension error, got nil") + } + if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { + t.Error("expected extension err") + } + if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { + t.Error("expected some sort of type mismatch error, got nil") + } +} + +func TestNilExtension(t *testing.T) { + msg := &pb.MyMessage{ + Count: proto.Int32(1), + } + if err := proto.SetExtension(msg, pb.E_Ext_Text, proto.String("hello")); err != nil { + t.Fatal(err) + } + if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil { + t.Error("expected SetExtension to fail due to a nil extension") + } else if want := "proto: SetExtension called with nil value of type *testdata.Ext"; err.Error() != want { + t.Errorf("expected error %v, got %v", want, err) + } + // Note: if the behavior of Marshal is ever changed to ignore nil extensions, update + // this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal. +} + +func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { + // Add a repeated extension to the result. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + // Marshal message with a repeated extension. + msg1 := new(pb.OtherMessage) + err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) + if err != nil { + t.Fatalf("[%s] Error setting extension: %v", test.name, err) + } + b, err := proto.Marshal(msg1) + if err != nil { + t.Fatalf("[%s] Error marshaling message: %v", test.name, err) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err = proto.Unmarshal(b, msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_RComplex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.([]*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if !reflect.DeepEqual(ext, test.ext) { + t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext) + } + } +} + +func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { + // We may see multiple instances of the same extension in the wire + // format. For example, the proto compiler may encode custom options in + // this way. Here, we verify that we merge the extensions together. + tests := []struct { + name string + ext []*pb.ComplexExtension + }{ + { + "two fields", + []*pb.ComplexExtension{ + {First: proto.Int32(7)}, + {Second: proto.Int32(11)}, + }, + }, + { + "repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {Third: []int32{2000}}, + }, + }, + { + "two fields and repeated field", + []*pb.ComplexExtension{ + {Third: []int32{1000}}, + {First: proto.Int32(9)}, + {Second: proto.Int32(21)}, + {Third: []int32{2000}}, + }, + }, + } + for _, test := range tests { + var buf bytes.Buffer + var want pb.ComplexExtension + + // Generate a serialized representation of a repeated extension + // by catenating bytes together. + for i, e := range test.ext { + // Merge to create the wanted proto. + proto.Merge(&want, e) + + // serialize the message + msg := new(pb.OtherMessage) + err := proto.SetExtension(msg, pb.E_Complex, e) + if err != nil { + t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) + } + b, err := proto.Marshal(msg) + if err != nil { + t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) + } + buf.Write(b) + } + + // Unmarshal and read the merged proto. + msg2 := new(pb.OtherMessage) + err := proto.Unmarshal(buf.Bytes(), msg2) + if err != nil { + t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) + } + e, err := proto.GetExtension(msg2, pb.E_Complex) + if err != nil { + t.Fatalf("[%s] Error getting extension: %v", test.name, err) + } + ext := e.(*pb.ComplexExtension) + if ext == nil { + t.Fatalf("[%s] Invalid extension", test.name) + } + if !reflect.DeepEqual(*ext, want) { + t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want) + } + } +} + +func TestClearAllExtensions(t *testing.T) { + // unregistered extension + desc := &proto.ExtensionDesc{ + ExtendedType: (*pb.MyMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 101010100, + Name: "emptyextension", + Tag: "varint,0,opt", + } + m := &pb.MyMessage{} + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } + if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { + t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) + } + if !proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) + } + proto.ClearAllExtensions(m) + if proto.HasExtension(m, desc) { + t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/lib.go b/vendor/src/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 0000000..170b8e8 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,898 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Getters are only generated for message and oneof fields. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // write point + + // pools of basic types to amortize allocation. + bools []bool + uint32s []uint32 + uint64s []uint64 + + // extra pools, only used with pointer_reflect.go + int32s []int32 + int64s []int64 + float32s []float32 + float64s []float64 +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. + +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{ + vs: vs, + // default Less function: textual comparison + less: func(a, b reflect.Value) bool { + return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) + }, + } + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; + // numeric keys are sorted numerically. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion1 = true diff --git a/vendor/src/github.com/golang/protobuf/proto/message_set.go b/vendor/src/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 0000000..fd982de --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,311 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + if ms.find(pb) != nil { + return true + } + return false +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + if err := encodeExtensions(exts); err != nil { + return nil, err + } + m, _ = exts.extensionsRead() + case map[int32]Extension: + if err := encodeExtensionsMap(exts); err != nil { + return nil, err + } + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + + // Sort extension IDs to provide a deterministic encoding. + // See also enc_map in encode.go. + ids := make([]int, 0, len(m)) + for id := range m { + ids = append(ids, int(id)) + } + sort.Ints(ids) + + ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} + for _, id := range ids { + e := m[int32(id)] + // Remove the wire type and field number varint, as well as the length varint. + msg := skipVarint(skipVarint(e.enc)) + + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: Int32(int32(id)), + Message: msg, + }) + } + return Marshal(ms) +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m, _ = exts.extensionsRead() + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + if i > 0 { + b.WriteByte(',') + } + + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/message_set_test.go b/vendor/src/github.com/golang/protobuf/proto/message_set_test.go new file mode 100644 index 0000000..353a3ea --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/message_set_test.go @@ -0,0 +1,66 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "bytes" + "testing" +) + +func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { + // Check that a repeated message set entry will be concatenated. + in := &messageSet{ + Item: []*_MessageSet_Item{ + {TypeId: Int32(12345), Message: []byte("hoo")}, + {TypeId: Int32(12345), Message: []byte("hah")}, + }, + } + b, err := Marshal(in) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + t.Logf("Marshaled bytes: %q", b) + + var extensions XXX_InternalExtensions + if err := UnmarshalMessageSet(b, &extensions); err != nil { + t.Fatalf("UnmarshalMessageSet: %v", err) + } + ext, ok := extensions.p.extensionMap[12345] + if !ok { + t.Fatalf("Didn't retrieve extension 12345; map is %v", extensions.p.extensionMap) + } + // Skip wire type/field number and length varints. + got := skipVarint(skipVarint(ext.enc)) + if want := []byte("hoohah"); !bytes.Equal(got, want) { + t.Errorf("Combined extension is %q, want %q", got, want) + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/src/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 0000000..fb512e2 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,484 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "math" + "reflect" +) + +// A structPointer is a pointer to a struct. +type structPointer struct { + v reflect.Value +} + +// toStructPointer returns a structPointer equivalent to the given reflect value. +// The reflect value must itself be a pointer to a struct. +func toStructPointer(v reflect.Value) structPointer { + return structPointer{v} +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p.v.IsNil() +} + +// Interface returns the struct pointer as an interface value. +func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { + return p.v.Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// field returns the given field in the struct as a reflect value. +func structPointer_field(p structPointer, f field) reflect.Value { + // Special case: an extension map entry with a value of type T + // passes a *T to the struct-handling code with a zero field, + // expecting that it will be treated as equivalent to *struct{ X T }, + // which has the same memory layout. We have to handle that case + // specially, because reflect will panic if we call FieldByIndex on a + // non-struct. + if f == nil { + return p.v.Elem() + } + + return p.v.Elem().FieldByIndex(f) +} + +// ifield returns the given field in the struct as an interface value. +func structPointer_ifield(p structPointer, f field) interface{} { + return structPointer_field(p, f).Addr().Interface() +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return structPointer_ifield(p, f).(*[]byte) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return structPointer_ifield(p, f).(*[][]byte) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return structPointer_ifield(p, f).(**bool) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return structPointer_ifield(p, f).(*bool) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return structPointer_ifield(p, f).(*[]bool) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return structPointer_ifield(p, f).(**string) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return structPointer_ifield(p, f).(*string) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return structPointer_ifield(p, f).(*[]string) +} + +// Extensions returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return structPointer_ifield(p, f).(*XXX_InternalExtensions) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return structPointer_ifield(p, f).(*map[int32]Extension) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return structPointer_field(p, f).Addr() +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + structPointer_field(p, f).Set(q.v) +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return structPointer{structPointer_field(p, f)} +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { + return structPointerSlice{structPointer_field(p, f)} +} + +// A structPointerSlice represents the address of a slice of pointers to structs +// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. +type structPointerSlice struct { + v reflect.Value +} + +func (p structPointerSlice) Len() int { return p.v.Len() } +func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } +func (p structPointerSlice) Append(q structPointer) { + p.v.Set(reflect.Append(p.v, q.v)) +} + +var ( + int32Type = reflect.TypeOf(int32(0)) + uint32Type = reflect.TypeOf(uint32(0)) + float32Type = reflect.TypeOf(float32(0)) + int64Type = reflect.TypeOf(int64(0)) + uint64Type = reflect.TypeOf(uint64(0)) + float64Type = reflect.TypeOf(float64(0)) +) + +// A word32 represents a field of type *int32, *uint32, *float32, or *enum. +// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. +type word32 struct { + v reflect.Value +} + +// IsNil reports whether p is nil. +func word32_IsNil(p word32) bool { + return p.v.IsNil() +} + +// Set sets p to point at a newly allocated word with bits set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + t := p.v.Type().Elem() + switch t { + case int32Type: + if len(o.int32s) == 0 { + o.int32s = make([]int32, uint32PoolSize) + } + o.int32s[0] = int32(x) + p.v.Set(reflect.ValueOf(&o.int32s[0])) + o.int32s = o.int32s[1:] + return + case uint32Type: + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + p.v.Set(reflect.ValueOf(&o.uint32s[0])) + o.uint32s = o.uint32s[1:] + return + case float32Type: + if len(o.float32s) == 0 { + o.float32s = make([]float32, uint32PoolSize) + } + o.float32s[0] = math.Float32frombits(x) + p.v.Set(reflect.ValueOf(&o.float32s[0])) + o.float32s = o.float32s[1:] + return + } + + // must be enum + p.v.Set(reflect.New(t)) + p.v.Elem().SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32_Get(p word32) uint32 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32{structPointer_field(p, f)} +} + +// A word32Val represents a field of type int32, uint32, float32, or enum. +// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. +type word32Val struct { + v reflect.Value +} + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + switch p.v.Type() { + case int32Type: + p.v.SetInt(int64(x)) + return + case uint32Type: + p.v.SetUint(uint64(x)) + return + case float32Type: + p.v.SetFloat(float64(math.Float32frombits(x))) + return + } + + // must be enum + p.v.SetInt(int64(int32(x))) +} + +// Get gets the bits pointed at by p, as a uint32. +func word32Val_Get(p word32Val) uint32 { + elem := p.v + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val{structPointer_field(p, f)} +} + +// A word32Slice is a slice of 32-bit values. +// That is, v.Type() is []int32, []uint32, []float32, or []enum. +type word32Slice struct { + v reflect.Value +} + +func (p word32Slice) Append(x uint32) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int32: + elem.SetInt(int64(int32(x))) + case reflect.Uint32: + elem.SetUint(uint64(x)) + case reflect.Float32: + elem.SetFloat(float64(math.Float32frombits(x))) + } +} + +func (p word32Slice) Len() int { + return p.v.Len() +} + +func (p word32Slice) Index(i int) uint32 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") +} + +// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) word32Slice { + return word32Slice{structPointer_field(p, f)} +} + +// word64 is like word32 but for 64-bit values. +type word64 struct { + v reflect.Value +} + +func word64_Set(p word64, o *Buffer, x uint64) { + t := p.v.Type().Elem() + switch t { + case int64Type: + if len(o.int64s) == 0 { + o.int64s = make([]int64, uint64PoolSize) + } + o.int64s[0] = int64(x) + p.v.Set(reflect.ValueOf(&o.int64s[0])) + o.int64s = o.int64s[1:] + return + case uint64Type: + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + p.v.Set(reflect.ValueOf(&o.uint64s[0])) + o.uint64s = o.uint64s[1:] + return + case float64Type: + if len(o.float64s) == 0 { + o.float64s = make([]float64, uint64PoolSize) + } + o.float64s[0] = math.Float64frombits(x) + p.v.Set(reflect.ValueOf(&o.float64s[0])) + o.float64s = o.float64s[1:] + return + } + panic("unreachable") +} + +func word64_IsNil(p word64) bool { + return p.v.IsNil() +} + +func word64_Get(p word64) uint64 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64{structPointer_field(p, f)} +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val struct { + v reflect.Value +} + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + switch p.v.Type() { + case int64Type: + p.v.SetInt(int64(x)) + return + case uint64Type: + p.v.SetUint(x) + return + case float64Type: + p.v.SetFloat(math.Float64frombits(x)) + return + } + panic("unreachable") +} + +func word64Val_Get(p word64Val) uint64 { + elem := p.v + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val{structPointer_field(p, f)} +} + +type word64Slice struct { + v reflect.Value +} + +func (p word64Slice) Append(x uint64) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int64: + elem.SetInt(int64(int64(x))) + case reflect.Uint64: + elem.SetUint(uint64(x)) + case reflect.Float64: + elem.SetFloat(float64(math.Float64frombits(x))) + } +} + +func (p word64Slice) Len() int { + return p.v.Len() +} + +func (p word64Slice) Index(i int) uint64 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return uint64(elem.Uint()) + case reflect.Float64: + return math.Float64bits(float64(elem.Float())) + } + panic("unreachable") +} + +func structPointer_Word64Slice(p structPointer, f field) word64Slice { + return word64Slice{structPointer_field(p, f)} +} diff --git a/vendor/src/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/src/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 0000000..6b5567d --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,270 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "unsafe" +) + +// NOTE: These type_Foo functions would more idiomatically be methods, +// but Go does not allow methods on pointer types, and we must preserve +// some pointer type for the garbage collector. We use these +// funcs with clunky names as our poor approximation to methods. +// +// An alternative would be +// type structPointer struct { p unsafe.Pointer } +// but that does not registerize as well. + +// A structPointer is a pointer to a struct. +type structPointer unsafe.Pointer + +// toStructPointer returns a structPointer equivalent to the given reflect value. +func toStructPointer(v reflect.Value) structPointer { + return structPointer(unsafe.Pointer(v.Pointer())) +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p == nil +} + +// Interface returns the struct pointer, assumed to have element type t, +// as an interface value. +func structPointer_Interface(p structPointer, t reflect.Type) interface{} { + return reflect.NewAt(t, unsafe.Pointer(p)).Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != ^field(0) +} + +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) +} + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q +} + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { + return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). +type structPointerSlice []structPointer + +func (v *structPointerSlice) Len() int { return len(*v) } +func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } +func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } + +// A word32 is the address of a "pointer to 32-bit value" field. +type word32 **uint32 + +// IsNil reports whether *v is nil. +func word32_IsNil(p word32) bool { + return *p == nil +} + +// Set sets *v to point at a newly allocated word set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + *p = &o.uint32s[0] + o.uint32s = o.uint32s[1:] +} + +// Get gets the value pointed at by *v. +func word32_Get(p word32) uint32 { + return **p +} + +// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Val is the address of a 32-bit value field. +type word32Val *uint32 + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + *p = x +} + +// Get gets the value pointed at by p. +func word32Val_Get(p word32Val) uint32 { + return *p +} + +// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// A word32Slice is a slice of 32-bit values. +type word32Slice []uint32 + +func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } +func (v *word32Slice) Len() int { return len(*v) } +func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } + +// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) *word32Slice { + return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} + +// word64 is like word32 but for 64-bit values. +type word64 **uint64 + +func word64_Set(p word64, o *Buffer, x uint64) { + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + *p = &o.uint64s[0] + o.uint64s = o.uint64s[1:] +} + +func word64_IsNil(p word64) bool { + return *p == nil +} + +func word64_Get(p word64) uint64 { + return **p +} + +func structPointer_Word64(p structPointer, f field) word64 { + return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Val is like word32Val but for 64-bit values. +type word64Val *uint64 + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + *p = x +} + +func word64Val_Get(p word64Val) uint64 { + return *p +} + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +} + +// word64Slice is like word32Slice but for 64-bit values. +type word64Slice []uint64 + +func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } +func (v *word64Slice) Len() int { return len(*v) } +func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } + +func structPointer_Word64Slice(p structPointer, f field) *word64Slice { + return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +} diff --git a/vendor/src/github.com/golang/protobuf/proto/properties.go b/vendor/src/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 0000000..dd29683 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,850 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +const startSize = 10 // initial slice/string sizes + +// Encoders are defined in encode.go +// An encoder outputs the full representation of a field, including its +// tag and encoder type. +type encoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueEncoder encodes a single integer in a particular encoding. +type valueEncoder func(o *Buffer, x uint64) error + +// Sizers are defined in encode.go +// A sizer returns the encoded size of a field, including its tag and encoder +// type. +type sizer func(prop *Properties, base structPointer) int + +// A valueSizer returns the encoded size of a single integer in a particular +// encoding. +type valueSizer func(x uint64) int + +// Decoders are defined in decode.go +// A decoder creates a value from its wire representation. +// Unrecognized subelements are saved in unrec. +type decoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueDecoder decodes a single integer in a particular encoding. +type valueDecoder func(o *Buffer) (x uint64, err error) + +// A oneofMarshaler does the marshaling for all oneof fields in a message. +type oneofMarshaler func(Message, *Buffer) error + +// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. +type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) + +// A oneofSizer does the sizing for all oneof fields in a message. +type oneofSizer func(Message) int + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + unrecField field // field id of the XXX_unrecognized []byte field + extendable bool // is this an extendable proto + + oneofMarshaler oneofMarshaler + oneofUnmarshaler oneofUnmarshaler + oneofSizer oneofSizer + stype reflect.Type + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field; set for []byte only + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + def_uint64 uint64 + + enc encoder + valEnc valueEncoder // set for bool and numeric types only + field field + tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) + tagbuf [8]byte + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + isMarshaler bool + isUnmarshaler bool + + mtype reflect.Type // set for map types only + mkeyprop *Properties // set for map types only + mvalprop *Properties // set for map types only + + size sizer + valSize valueSizer // set for bool and numeric types only + + dec decoder + valDec valueDecoder // set for bool and numeric types only + + // If this is a packable field, this will be the decoder for the packed version of the field. + packedDec decoder +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s = "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeVarint + p.valDec = (*Buffer).DecodeVarint + p.valSize = sizeVarint + case "fixed32": + p.WireType = WireFixed32 + p.valEnc = (*Buffer).EncodeFixed32 + p.valDec = (*Buffer).DecodeFixed32 + p.valSize = sizeFixed32 + case "fixed64": + p.WireType = WireFixed64 + p.valEnc = (*Buffer).EncodeFixed64 + p.valDec = (*Buffer).DecodeFixed64 + p.valSize = sizeFixed64 + case "zigzag32": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag32 + p.valDec = (*Buffer).DecodeZigzag32 + p.valSize = sizeZigzag32 + case "zigzag64": + p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag64 + p.valDec = (*Buffer).DecodeZigzag64 + p.valSize = sizeZigzag64 + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break + } + } + } +} + +func logNoSliceEnc(t1, t2 reflect.Type) { + fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// Initialize the fields for encoding and decoding. +func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + p.enc = nil + p.dec = nil + p.size = nil + + switch t1 := typ; t1.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) + + // proto3 scalar types + + case reflect.Bool: + p.enc = (*Buffer).enc_proto3_bool + p.dec = (*Buffer).dec_proto3_bool + p.size = size_proto3_bool + case reflect.Int32: + p.enc = (*Buffer).enc_proto3_int32 + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_proto3_uint32 + p.dec = (*Buffer).dec_proto3_int32 // can reuse + p.size = size_proto3_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_proto3_int64 + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.String: + p.enc = (*Buffer).enc_proto3_string + p.dec = (*Buffer).dec_proto3_string + p.size = size_proto3_string + + case reflect.Ptr: + switch t2 := t1.Elem(); t2.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) + break + case reflect.Bool: + p.enc = (*Buffer).enc_bool + p.dec = (*Buffer).dec_bool + p.size = size_bool + case reflect.Int32: + p.enc = (*Buffer).enc_int32 + p.dec = (*Buffer).dec_int32 + p.size = size_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_uint32 + p.dec = (*Buffer).dec_int32 // can reuse + p.size = size_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_int64 + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_int32 + p.size = size_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_int64 // can just treat them as bits + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.String: + p.enc = (*Buffer).enc_string + p.dec = (*Buffer).dec_string + p.size = size_string + case reflect.Struct: + p.stype = t1.Elem() + p.isMarshaler = isMarshaler(t1) + p.isUnmarshaler = isUnmarshaler(t1) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_struct_message + p.dec = (*Buffer).dec_struct_message + p.size = size_struct_message + } else { + p.enc = (*Buffer).enc_struct_group + p.dec = (*Buffer).dec_struct_group + p.size = size_struct_group + } + } + + case reflect.Slice: + switch t2 := t1.Elem(); t2.Kind() { + default: + logNoSliceEnc(t1, t2) + break + case reflect.Bool: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_bool + p.size = size_slice_packed_bool + } else { + p.enc = (*Buffer).enc_slice_bool + p.size = size_slice_bool + } + p.dec = (*Buffer).dec_slice_bool + p.packedDec = (*Buffer).dec_slice_packed_bool + case reflect.Int32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int32 + p.size = size_slice_packed_int32 + } else { + p.enc = (*Buffer).enc_slice_int32 + p.size = size_slice_int32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Uint32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Int64, reflect.Uint64: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + case reflect.Uint8: + p.dec = (*Buffer).dec_slice_byte + if p.proto3 { + p.enc = (*Buffer).enc_proto3_slice_byte + p.size = size_proto3_slice_byte + } else { + p.enc = (*Buffer).enc_slice_byte + p.size = size_slice_byte + } + case reflect.Float32, reflect.Float64: + switch t2.Bits() { + case 32: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case 64: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + default: + logNoSliceEnc(t1, t2) + break + } + case reflect.String: + p.enc = (*Buffer).enc_slice_string + p.dec = (*Buffer).dec_slice_string + p.size = size_slice_string + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) + break + case reflect.Struct: + p.stype = t2.Elem() + p.isMarshaler = isMarshaler(t2) + p.isUnmarshaler = isUnmarshaler(t2) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_slice_struct_message + p.dec = (*Buffer).dec_slice_struct_message + p.size = size_slice_struct_message + } else { + p.enc = (*Buffer).enc_slice_struct_group + p.dec = (*Buffer).dec_slice_struct_group + p.size = size_slice_struct_group + } + } + case reflect.Slice: + switch t2.Elem().Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) + break + case reflect.Uint8: + p.enc = (*Buffer).enc_slice_slice_byte + p.dec = (*Buffer).dec_slice_slice_byte + p.size = size_slice_slice_byte + } + } + + case reflect.Map: + p.enc = (*Buffer).enc_new_map + p.dec = (*Buffer).dec_new_map + p.size = size_new_map + + p.mtype = t1 + p.mkeyprop = &Properties{} + p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.mvalprop = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + // precalculate tag code + wire := p.WireType + if p.Packed { + wire = WireBytes + } + x := uint32(p.Tag)<<3 | uint32(wire) + i := 0 + for i = 0; x > 127; i++ { + p.tagbuf[i] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + p.tagbuf[i] = uint8(x) + p.tagcode = p.tagbuf[0 : i+1] + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() +) + +// isMarshaler reports whether type t implements Marshaler. +func isMarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isMarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isMarshaler") + } + return t.Implements(marshalerType) +} + +// isUnmarshaler reports whether type t implements Unmarshaler. +func isUnmarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isUnmarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isUnmarshaler") + } + return t.Implements(unmarshalerType) +} + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if f != nil { + p.field = toField(f) + } + if tag == "" { + return + } + p.Parse(tag) + p.setEncAndDec(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || + reflect.PtrTo(t).Implements(extendableProtoV1Type) + prop.unrecField = invalidField + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + if f.Name == "XXX_InternalExtensions" { // special case + p.enc = (*Buffer).enc_exts + p.dec = nil // not needed + p.size = size_exts + } else if f.Name == "XXX_extensions" { // special case + p.enc = (*Buffer).enc_map + p.dec = nil // not needed + p.size = size_map + } else if f.Name == "XXX_unrecognized" { // special case + prop.unrecField = toField(&f) + } + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { + fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + var oots []interface{} + prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() + prop.stype = t + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// Return the Properties object for the x[0]'th field of the structure. +func propByIndex(t reflect.Type, x []int) *Properties { + if len(x) != 1 { + fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) + return nil + } + prop := GetProperties(t) + return prop.Prop[x[0]] +} + +// Get the address and type of a pointer to a struct from an interface. +func getbase(pb Message) (t reflect.Type, b structPointer, err error) { + if pb == nil { + err = ErrNil + return + } + // get the reflect type of the pointer to the struct. + t = reflect.TypeOf(pb) + // get the address of the struct. + value := reflect.ValueOf(pb) + b = toStructPointer(value) + return +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypes = make(map[string]reflect.Type) + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypes[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { return revProtoTypes[reflect.TypeOf(x)] } + +// MessageType returns the message type (pointer to struct) for a named message. +func MessageType(name string) reflect.Type { return protoTypes[name] } diff --git a/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go b/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go new file mode 100644 index 0000000..411f17f --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go @@ -0,0 +1,198 @@ +// Code generated by protoc-gen-go. +// source: proto3_proto/proto3.proto +// DO NOT EDIT! + +/* +Package proto3_proto is a generated protocol buffer package. + +It is generated from these files: + proto3_proto/proto3.proto + +It has these top-level messages: + Message + Nested + MessageWithMap +*/ +package proto3_proto + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" +import google_protobuf "github.com/golang/protobuf/ptypes/any" +import testdata "github.com/golang/protobuf/proto/testdata" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + +type Message_Humour int32 + +const ( + Message_UNKNOWN Message_Humour = 0 + Message_PUNS Message_Humour = 1 + Message_SLAPSTICK Message_Humour = 2 + Message_BILL_BAILEY Message_Humour = 3 +) + +var Message_Humour_name = map[int32]string{ + 0: "UNKNOWN", + 1: "PUNS", + 2: "SLAPSTICK", + 3: "BILL_BAILEY", +} +var Message_Humour_value = map[string]int32{ + "UNKNOWN": 0, + "PUNS": 1, + "SLAPSTICK": 2, + "BILL_BAILEY": 3, +} + +func (x Message_Humour) String() string { + return proto.EnumName(Message_Humour_name, int32(x)) +} +func (Message_Humour) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } + +type Message struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` + HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm" json:"height_in_cm,omitempty"` + Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` + ResultCount int64 `protobuf:"varint,7,opt,name=result_count,json=resultCount" json:"result_count,omitempty"` + TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman" json:"true_scotsman,omitempty"` + Score float32 `protobuf:"fixed32,9,opt,name=score" json:"score,omitempty"` + Key []uint64 `protobuf:"varint,5,rep,name=key" json:"key,omitempty"` + Nested *Nested `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` + RFunny []Message_Humour `protobuf:"varint,16,rep,name=r_funny,json=rFunny,enum=proto3_proto.Message_Humour" json:"r_funny,omitempty"` + Terrain map[string]*Nested `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Proto2Field *testdata.SubDefaults `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field" json:"proto2_field,omitempty"` + Proto2Value map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Anything *google_protobuf.Any `protobuf:"bytes,14,opt,name=anything" json:"anything,omitempty"` + ManyThings []*google_protobuf.Any `protobuf:"bytes,15,rep,name=many_things,json=manyThings" json:"many_things,omitempty"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *Message) GetNested() *Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *Message) GetTerrain() map[string]*Nested { + if m != nil { + return m.Terrain + } + return nil +} + +func (m *Message) GetProto2Field() *testdata.SubDefaults { + if m != nil { + return m.Proto2Field + } + return nil +} + +func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { + if m != nil { + return m.Proto2Value + } + return nil +} + +func (m *Message) GetAnything() *google_protobuf.Any { + if m != nil { + return m.Anything + } + return nil +} + +func (m *Message) GetManyThings() []*google_protobuf.Any { + if m != nil { + return m.ManyThings + } + return nil +} + +type Nested struct { + Bunny string `protobuf:"bytes,1,opt,name=bunny" json:"bunny,omitempty"` +} + +func (m *Nested) Reset() { *m = Nested{} } +func (m *Nested) String() string { return proto.CompactTextString(m) } +func (*Nested) ProtoMessage() {} +func (*Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +type MessageWithMap struct { + ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +func init() { + proto.RegisterType((*Message)(nil), "proto3_proto.Message") + proto.RegisterType((*Nested)(nil), "proto3_proto.Nested") + proto.RegisterType((*MessageWithMap)(nil), "proto3_proto.MessageWithMap") + proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) +} + +var fileDescriptor0 = []byte{ + // 617 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x92, 0x5d, 0x6b, 0xdb, 0x3c, + 0x14, 0xc7, 0x1f, 0xc5, 0xa9, 0x93, 0x1e, 0x3b, 0xad, 0xd1, 0xd3, 0x81, 0x1a, 0xc6, 0xf0, 0x32, + 0x18, 0x66, 0x2f, 0xee, 0xc8, 0x28, 0x94, 0x31, 0x36, 0xda, 0xae, 0x65, 0xa1, 0x69, 0x16, 0x9c, + 0x76, 0x65, 0x57, 0x46, 0x49, 0x95, 0xc4, 0x2c, 0x96, 0x83, 0x2d, 0x0f, 0xfc, 0x75, 0xf6, 0x29, + 0x77, 0x39, 0x24, 0x39, 0xa9, 0x5b, 0xb2, 0xed, 0xca, 0xd2, 0xf1, 0xef, 0xbc, 0xe8, 0xff, 0x3f, + 0xb0, 0xbf, 0x4c, 0x13, 0x91, 0xbc, 0x0d, 0xd5, 0xe7, 0x40, 0x5f, 0x7c, 0xf5, 0xc1, 0x76, 0xf5, + 0x57, 0x7b, 0x7f, 0x96, 0x24, 0xb3, 0x05, 0xd3, 0xc8, 0x38, 0x9f, 0x1e, 0x50, 0x5e, 0x68, 0xb0, + 0xfd, 0xbf, 0x60, 0x99, 0xb8, 0xa5, 0x82, 0x1e, 0xc8, 0x83, 0x0e, 0x76, 0x7e, 0x99, 0xd0, 0xb8, + 0x64, 0x59, 0x46, 0x67, 0x0c, 0x63, 0xa8, 0x73, 0x1a, 0x33, 0x82, 0x5c, 0xe4, 0x6d, 0x07, 0xea, + 0x8c, 0x8f, 0xa0, 0x39, 0x8f, 0x16, 0x34, 0x8d, 0x44, 0x41, 0x6a, 0x2e, 0xf2, 0x76, 0xba, 0x8f, + 0xfd, 0x6a, 0x43, 0xbf, 0x4c, 0xf6, 0x3f, 0xe7, 0x71, 0x92, 0xa7, 0xc1, 0x9a, 0xc6, 0x2e, 0xd8, + 0x73, 0x16, 0xcd, 0xe6, 0x22, 0x8c, 0x78, 0x38, 0x89, 0x89, 0xe1, 0x22, 0xaf, 0x15, 0x80, 0x8e, + 0xf5, 0xf8, 0x69, 0x2c, 0xfb, 0xc9, 0x71, 0x48, 0xdd, 0x45, 0x9e, 0x1d, 0xa8, 0x33, 0x7e, 0x0a, + 0x76, 0xca, 0xb2, 0x7c, 0x21, 0xc2, 0x49, 0x92, 0x73, 0x41, 0x1a, 0x2e, 0xf2, 0x8c, 0xc0, 0xd2, + 0xb1, 0x53, 0x19, 0xc2, 0xcf, 0xa0, 0x25, 0xd2, 0x9c, 0x85, 0xd9, 0x24, 0x11, 0x59, 0x4c, 0x39, + 0x69, 0xba, 0xc8, 0x6b, 0x06, 0xb6, 0x0c, 0x8e, 0xca, 0x18, 0xde, 0x83, 0xad, 0x6c, 0x92, 0xa4, + 0x8c, 0x6c, 0xbb, 0xc8, 0xab, 0x05, 0xfa, 0x82, 0x1d, 0x30, 0xbe, 0xb3, 0x82, 0x6c, 0xb9, 0x86, + 0x57, 0x0f, 0xe4, 0x11, 0xbf, 0x02, 0x93, 0xb3, 0x4c, 0xb0, 0x5b, 0x62, 0xba, 0xc8, 0xb3, 0xba, + 0x7b, 0xf7, 0x5f, 0x37, 0x50, 0xff, 0x82, 0x92, 0xc1, 0x87, 0xd0, 0x48, 0xc3, 0x69, 0xce, 0x79, + 0x41, 0x1c, 0xd7, 0xf8, 0xa7, 0x18, 0x66, 0x7a, 0x2e, 0x59, 0xfc, 0x1e, 0x1a, 0x82, 0xa5, 0x29, + 0x8d, 0x38, 0x01, 0xd7, 0xf0, 0xac, 0x6e, 0x67, 0x73, 0xda, 0x95, 0x86, 0xce, 0xb8, 0x48, 0x8b, + 0x60, 0x95, 0x82, 0x8f, 0x40, 0x5b, 0xdc, 0x0d, 0xa7, 0x11, 0x5b, 0xdc, 0x12, 0x4b, 0x0d, 0xfa, + 0xc8, 0x5f, 0xd9, 0xe9, 0x8f, 0xf2, 0xf1, 0x27, 0x36, 0xa5, 0xf9, 0x42, 0x64, 0x81, 0xa5, 0xd1, + 0x73, 0x49, 0xe2, 0xde, 0x3a, 0xf3, 0x07, 0x5d, 0xe4, 0x8c, 0xb4, 0x54, 0xf3, 0xe7, 0x9b, 0x9b, + 0x0f, 0x15, 0xf9, 0x55, 0x82, 0x7a, 0x80, 0xb2, 0x94, 0x8a, 0xe0, 0x37, 0xd0, 0xa4, 0xbc, 0x10, + 0xf3, 0x88, 0xcf, 0xc8, 0x4e, 0xa9, 0x94, 0x5e, 0x35, 0x7f, 0xb5, 0x6a, 0xfe, 0x31, 0x2f, 0x82, + 0x35, 0x85, 0x0f, 0xc1, 0x8a, 0x29, 0x2f, 0x42, 0x75, 0xcb, 0xc8, 0xae, 0xea, 0xbd, 0x39, 0x09, + 0x24, 0x78, 0xa5, 0xb8, 0xf6, 0x10, 0xec, 0xaa, 0x0c, 0x2b, 0xcb, 0xf4, 0x4e, 0x2a, 0xcb, 0x5e, + 0xc0, 0x96, 0x7e, 0x4e, 0xed, 0x2f, 0x8e, 0x69, 0xe4, 0x5d, 0xed, 0x08, 0xb5, 0xaf, 0xc1, 0x79, + 0xf8, 0xb6, 0x0d, 0x55, 0x5f, 0xde, 0xaf, 0xfa, 0x07, 0x79, 0xef, 0xca, 0x76, 0x3e, 0x82, 0xa9, + 0x6d, 0xc6, 0x16, 0x34, 0xae, 0x07, 0x17, 0x83, 0x2f, 0x37, 0x03, 0xe7, 0x3f, 0xdc, 0x84, 0xfa, + 0xf0, 0x7a, 0x30, 0x72, 0x10, 0x6e, 0xc1, 0xf6, 0xa8, 0x7f, 0x3c, 0x1c, 0x5d, 0xf5, 0x4e, 0x2f, + 0x9c, 0x1a, 0xde, 0x05, 0xeb, 0xa4, 0xd7, 0xef, 0x87, 0x27, 0xc7, 0xbd, 0xfe, 0xd9, 0x37, 0xc7, + 0xe8, 0x3c, 0x01, 0x53, 0x0f, 0x2b, 0x97, 0x75, 0xac, 0x96, 0x4a, 0xcf, 0xa3, 0x2f, 0x9d, 0x9f, + 0x08, 0x76, 0x4a, 0x73, 0x6e, 0x22, 0x31, 0xbf, 0xa4, 0x4b, 0x3c, 0x04, 0x7b, 0x5c, 0x08, 0x16, + 0xc6, 0x74, 0xb9, 0x94, 0x4e, 0x20, 0x25, 0xea, 0xeb, 0x8d, 0x86, 0x96, 0x39, 0xfe, 0x49, 0x21, + 0xd8, 0xa5, 0xe6, 0x4b, 0x5f, 0xc7, 0x77, 0x91, 0xf6, 0x07, 0x70, 0x1e, 0x02, 0x55, 0x71, 0x9a, + 0x5a, 0x9c, 0xbd, 0xaa, 0x38, 0x76, 0x45, 0x85, 0xb1, 0xa9, 0x5b, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0xff, 0x54, 0x4a, 0xfa, 0x41, 0xa1, 0x04, 0x00, 0x00, +} diff --git a/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto b/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto new file mode 100644 index 0000000..31509e4 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/proto3_proto/proto3.proto @@ -0,0 +1,73 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +import "google/protobuf/any.proto"; +import "testdata/test.proto"; + +package proto3_proto; + +message Message { + enum Humour { + UNKNOWN = 0; + PUNS = 1; + SLAPSTICK = 2; + BILL_BAILEY = 3; + } + + string name = 1; + Humour hilarity = 2; + uint32 height_in_cm = 3; + bytes data = 4; + int64 result_count = 7; + bool true_scotsman = 8; + float score = 9; + + repeated uint64 key = 5; + Nested nested = 6; + repeated Humour r_funny = 16; + + map terrain = 10; + testdata.SubDefaults proto2_field = 11; + map proto2_value = 13; + + google.protobuf.Any anything = 14; + repeated google.protobuf.Any many_things = 15; +} + +message Nested { + string bunny = 1; +} + +message MessageWithMap { + map byte_mapping = 1; +} diff --git a/vendor/src/github.com/golang/protobuf/proto/proto3_test.go b/vendor/src/github.com/golang/protobuf/proto/proto3_test.go new file mode 100644 index 0000000..462f805 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/proto3_test.go @@ -0,0 +1,125 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2014 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "testing" + + "github.com/golang/protobuf/proto" + pb "github.com/golang/protobuf/proto/proto3_proto" + tpb "github.com/golang/protobuf/proto/testdata" +) + +func TestProto3ZeroValues(t *testing.T) { + tests := []struct { + desc string + m proto.Message + }{ + {"zero message", &pb.Message{}}, + {"empty bytes field", &pb.Message{Data: []byte{}}}, + } + for _, test := range tests { + b, err := proto.Marshal(test.m) + if err != nil { + t.Errorf("%s: proto.Marshal: %v", test.desc, err) + continue + } + if len(b) > 0 { + t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) + } + } +} + +func TestRoundTripProto3(t *testing.T) { + m := &pb.Message{ + Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" + Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 + HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 + Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" + ResultCount: 47, // (0 | 7<<3): 0x38 0x2f + TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 + Score: 8.1, // (5 | 9<<3): 0x4d <8.1> + + Key: []uint64{1, 0xdeadbeef}, + Nested: &pb.Nested{ + Bunny: "Monty", + }, + } + t.Logf(" m: %v", m) + + b, err := proto.Marshal(m) + if err != nil { + t.Fatalf("proto.Marshal: %v", err) + } + t.Logf(" b: %q", b) + + m2 := new(pb.Message) + if err := proto.Unmarshal(b, m2); err != nil { + t.Fatalf("proto.Unmarshal: %v", err) + } + t.Logf("m2: %v", m2) + + if !proto.Equal(m, m2) { + t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) + } +} + +func TestProto3SetDefaults(t *testing.T) { + in := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: new(tpb.SubDefaults), + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": new(tpb.SubDefaults), + }, + } + + got := proto.Clone(in).(*pb.Message) + proto.SetDefaults(got) + + // There are no defaults in proto3. Everything should be the zero value, but + // we need to remember to set defaults for nested proto2 messages. + want := &pb.Message{ + Terrain: map[string]*pb.Nested{ + "meadow": new(pb.Nested), + }, + Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, + Proto2Value: map[string]*tpb.SubDefaults{ + "badlands": &tpb.SubDefaults{N: proto.Int64(7)}, + }, + } + + if !proto.Equal(got, want) { + t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/size2_test.go b/vendor/src/github.com/golang/protobuf/proto/size2_test.go new file mode 100644 index 0000000..a2729c3 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/size2_test.go @@ -0,0 +1,63 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "testing" +) + +// This is a separate file and package from size_test.go because that one uses +// generated messages and thus may not be in package proto without having a circular +// dependency, whereas this file tests unexported details of size.go. + +func TestVarintSize(t *testing.T) { + // Check the edge cases carefully. + testCases := []struct { + n uint64 + size int + }{ + {0, 1}, + {1, 1}, + {127, 1}, + {128, 2}, + {16383, 2}, + {16384, 3}, + {1<<63 - 1, 9}, + {1 << 63, 10}, + } + for _, tc := range testCases { + size := sizeVarint(tc.n) + if size != tc.size { + t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) + } + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/size_test.go b/vendor/src/github.com/golang/protobuf/proto/size_test.go new file mode 100644 index 0000000..af1034d --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/size_test.go @@ -0,0 +1,164 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "log" + "strings" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} + +// messageWithExtension2 is in equal_test.go. +var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} + +func init() { + if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { + log.Panicf("SetExtension: %v", err) + } + + // Force messageWithExtension3 to have the extension encoded. + Marshal(messageWithExtension3) + +} + +var SizeTests = []struct { + desc string + pb Message +}{ + {"empty", &pb.OtherMessage{}}, + // Basic types. + {"bool", &pb.Defaults{F_Bool: Bool(true)}}, + {"int32", &pb.Defaults{F_Int32: Int32(12)}}, + {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, + {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, + {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, + {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, + {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, + {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, + {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, + {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, + {"float", &pb.Defaults{F_Float: Float32(12.6)}}, + {"double", &pb.Defaults{F_Double: Float64(13.9)}}, + {"string", &pb.Defaults{F_String: String("niles")}}, + {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, + {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, + {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, + {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, + {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, + // Repeated. + {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, + {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, + {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, + {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, + {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, + {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ + // Need enough large numbers to verify that the header is counting the number of bytes + // for the field, not the number of elements. + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, + }}}, + {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, + {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, + // Nested. + {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, + {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, + // Other things. + {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, + {"extension (unencoded)", messageWithExtension1}, + {"extension (encoded)", messageWithExtension3}, + // proto3 message + {"proto3 empty", &proto3pb.Message{}}, + {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, + {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, + {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, + {"proto3 float", &proto3pb.Message{Score: 12.6}}, + {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, + {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, + {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, + {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, + {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, + + {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, + {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, + {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, + {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, + + {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, + {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, + {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, + + {"oneof not set", &pb.Oneof{}}, + {"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, + {"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, + {"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, + {"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, + {"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, + {"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, + {"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, + {"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, + {"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, + {"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, + {"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, + {"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, + {"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, + {"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, + {"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, + {"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, + {"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, + {"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, + {"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, + {"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, +} + +func TestSize(t *testing.T) { + for _, tc := range SizeTests { + size := Size(tc.pb) + b, err := Marshal(tc.pb) + if err != nil { + t.Errorf("%v: Marshal failed: %v", tc.desc, err) + continue + } + if size != len(b) { + t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) + t.Logf("%v: bytes: %#v", tc.desc, b) + } + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/testdata/Makefile b/vendor/src/github.com/golang/protobuf/proto/testdata/Makefile new file mode 100644 index 0000000..fc28862 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/testdata/Makefile @@ -0,0 +1,50 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +include ../../Make.protobuf + +all: regenerate + +regenerate: + rm -f test.pb.go + make test.pb.go + +# The following rules are just aids to development. Not needed for typical testing. + +diff: regenerate + git diff test.pb.go + +restore: + cp test.pb.go.golden test.pb.go + +preserve: + cp test.pb.go test.pb.go.golden diff --git a/vendor/src/github.com/golang/protobuf/proto/testdata/golden_test.go b/vendor/src/github.com/golang/protobuf/proto/testdata/golden_test.go new file mode 100644 index 0000000..7172d0e --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/testdata/golden_test.go @@ -0,0 +1,86 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Verify that the compiler output for test.proto is unchanged. + +package testdata + +import ( + "crypto/sha1" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" +) + +// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. +func sum(t *testing.T, name string) string { + data, err := ioutil.ReadFile(name) + if err != nil { + t.Fatal(err) + } + t.Logf("sum(%q): length is %d", name, len(data)) + hash := sha1.New() + _, err = hash.Write(data) + if err != nil { + t.Fatal(err) + } + return fmt.Sprintf("% x", hash.Sum(nil)) +} + +func run(t *testing.T, name string, args ...string) { + cmd := exec.Command(name, args...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + if err != nil { + t.Fatal(err) + } +} + +func TestGolden(t *testing.T) { + // Compute the original checksum. + goldenSum := sum(t, "test.pb.go") + // Run the proto compiler. + run(t, "protoc", "--go_out="+os.TempDir(), "test.proto") + newFile := filepath.Join(os.TempDir(), "test.pb.go") + defer os.Remove(newFile) + // Compute the new checksum. + newSum := sum(t, newFile) + // Verify + if newSum != goldenSum { + run(t, "diff", "-u", "test.pb.go", newFile) + t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/testdata/test.pb.go b/vendor/src/github.com/golang/protobuf/proto/testdata/test.pb.go new file mode 100644 index 0000000..772adcb --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/testdata/test.pb.go @@ -0,0 +1,4029 @@ +// Code generated by protoc-gen-go. +// source: test.proto +// DO NOT EDIT! + +/* +Package testdata is a generated protocol buffer package. + +It is generated from these files: + test.proto + +It has these top-level messages: + GoEnum + GoTestField + GoTest + GoSkipTest + NonPackedTest + PackedTest + MaxTag + OldMessage + NewMessage + InnerMessage + OtherMessage + RequiredInnerMessage + MyMessage + Ext + ComplexExtension + DefaultsMessage + MyMessageSet + Empty + MessageList + Strings + Defaults + SubDefaults + RepeatedEnum + MoreRepeated + GroupOld + GroupNew + FloatingPoint + MessageWithMap + Oneof + Communique +*/ +package testdata + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + +type FOO int32 + +const ( + FOO_FOO1 FOO = 1 +) + +var FOO_name = map[int32]string{ + 1: "FOO1", +} +var FOO_value = map[string]int32{ + "FOO1": 1, +} + +func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p +} +func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) +} +func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data, "FOO") + if err != nil { + return err + } + *x = FOO(value) + return nil +} +func (FOO) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +// An enum, for completeness. +type GoTest_KIND int32 + +const ( + GoTest_VOID GoTest_KIND = 0 + // Basic types + GoTest_BOOL GoTest_KIND = 1 + GoTest_BYTES GoTest_KIND = 2 + GoTest_FINGERPRINT GoTest_KIND = 3 + GoTest_FLOAT GoTest_KIND = 4 + GoTest_INT GoTest_KIND = 5 + GoTest_STRING GoTest_KIND = 6 + GoTest_TIME GoTest_KIND = 7 + // Groupings + GoTest_TUPLE GoTest_KIND = 8 + GoTest_ARRAY GoTest_KIND = 9 + GoTest_MAP GoTest_KIND = 10 + // Table types + GoTest_TABLE GoTest_KIND = 11 + // Functions + GoTest_FUNCTION GoTest_KIND = 12 +) + +var GoTest_KIND_name = map[int32]string{ + 0: "VOID", + 1: "BOOL", + 2: "BYTES", + 3: "FINGERPRINT", + 4: "FLOAT", + 5: "INT", + 6: "STRING", + 7: "TIME", + 8: "TUPLE", + 9: "ARRAY", + 10: "MAP", + 11: "TABLE", + 12: "FUNCTION", +} +var GoTest_KIND_value = map[string]int32{ + "VOID": 0, + "BOOL": 1, + "BYTES": 2, + "FINGERPRINT": 3, + "FLOAT": 4, + "INT": 5, + "STRING": 6, + "TIME": 7, + "TUPLE": 8, + "ARRAY": 9, + "MAP": 10, + "TABLE": 11, + "FUNCTION": 12, +} + +func (x GoTest_KIND) Enum() *GoTest_KIND { + p := new(GoTest_KIND) + *p = x + return p +} +func (x GoTest_KIND) String() string { + return proto.EnumName(GoTest_KIND_name, int32(x)) +} +func (x *GoTest_KIND) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(GoTest_KIND_value, data, "GoTest_KIND") + if err != nil { + return err + } + *x = GoTest_KIND(value) + return nil +} +func (GoTest_KIND) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +type MyMessage_Color int32 + +const ( + MyMessage_RED MyMessage_Color = 0 + MyMessage_GREEN MyMessage_Color = 1 + MyMessage_BLUE MyMessage_Color = 2 +) + +var MyMessage_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var MyMessage_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x MyMessage_Color) Enum() *MyMessage_Color { + p := new(MyMessage_Color) + *p = x + return p +} +func (x MyMessage_Color) String() string { + return proto.EnumName(MyMessage_Color_name, int32(x)) +} +func (x *MyMessage_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MyMessage_Color_value, data, "MyMessage_Color") + if err != nil { + return err + } + *x = MyMessage_Color(value) + return nil +} +func (MyMessage_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } + +type DefaultsMessage_DefaultsEnum int32 + +const ( + DefaultsMessage_ZERO DefaultsMessage_DefaultsEnum = 0 + DefaultsMessage_ONE DefaultsMessage_DefaultsEnum = 1 + DefaultsMessage_TWO DefaultsMessage_DefaultsEnum = 2 +) + +var DefaultsMessage_DefaultsEnum_name = map[int32]string{ + 0: "ZERO", + 1: "ONE", + 2: "TWO", +} +var DefaultsMessage_DefaultsEnum_value = map[string]int32{ + "ZERO": 0, + "ONE": 1, + "TWO": 2, +} + +func (x DefaultsMessage_DefaultsEnum) Enum() *DefaultsMessage_DefaultsEnum { + p := new(DefaultsMessage_DefaultsEnum) + *p = x + return p +} +func (x DefaultsMessage_DefaultsEnum) String() string { + return proto.EnumName(DefaultsMessage_DefaultsEnum_name, int32(x)) +} +func (x *DefaultsMessage_DefaultsEnum) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DefaultsMessage_DefaultsEnum_value, data, "DefaultsMessage_DefaultsEnum") + if err != nil { + return err + } + *x = DefaultsMessage_DefaultsEnum(value) + return nil +} +func (DefaultsMessage_DefaultsEnum) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{15, 0} +} + +type Defaults_Color int32 + +const ( + Defaults_RED Defaults_Color = 0 + Defaults_GREEN Defaults_Color = 1 + Defaults_BLUE Defaults_Color = 2 +) + +var Defaults_Color_name = map[int32]string{ + 0: "RED", + 1: "GREEN", + 2: "BLUE", +} +var Defaults_Color_value = map[string]int32{ + "RED": 0, + "GREEN": 1, + "BLUE": 2, +} + +func (x Defaults_Color) Enum() *Defaults_Color { + p := new(Defaults_Color) + *p = x + return p +} +func (x Defaults_Color) String() string { + return proto.EnumName(Defaults_Color_name, int32(x)) +} +func (x *Defaults_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Defaults_Color_value, data, "Defaults_Color") + if err != nil { + return err + } + *x = Defaults_Color(value) + return nil +} +func (Defaults_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{20, 0} } + +type RepeatedEnum_Color int32 + +const ( + RepeatedEnum_RED RepeatedEnum_Color = 1 +) + +var RepeatedEnum_Color_name = map[int32]string{ + 1: "RED", +} +var RepeatedEnum_Color_value = map[string]int32{ + "RED": 1, +} + +func (x RepeatedEnum_Color) Enum() *RepeatedEnum_Color { + p := new(RepeatedEnum_Color) + *p = x + return p +} +func (x RepeatedEnum_Color) String() string { + return proto.EnumName(RepeatedEnum_Color_name, int32(x)) +} +func (x *RepeatedEnum_Color) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RepeatedEnum_Color_value, data, "RepeatedEnum_Color") + if err != nil { + return err + } + *x = RepeatedEnum_Color(value) + return nil +} +func (RepeatedEnum_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{22, 0} } + +type GoEnum struct { + Foo *FOO `protobuf:"varint,1,req,name=foo,enum=testdata.FOO" json:"foo,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoEnum) Reset() { *m = GoEnum{} } +func (m *GoEnum) String() string { return proto.CompactTextString(m) } +func (*GoEnum) ProtoMessage() {} +func (*GoEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *GoEnum) GetFoo() FOO { + if m != nil && m.Foo != nil { + return *m.Foo + } + return FOO_FOO1 +} + +type GoTestField struct { + Label *string `protobuf:"bytes,1,req,name=Label,json=label" json:"Label,omitempty"` + Type *string `protobuf:"bytes,2,req,name=Type,json=type" json:"Type,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTestField) Reset() { *m = GoTestField{} } +func (m *GoTestField) String() string { return proto.CompactTextString(m) } +func (*GoTestField) ProtoMessage() {} +func (*GoTestField) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *GoTestField) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" +} + +func (m *GoTestField) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +type GoTest struct { + // Some typical parameters + Kind *GoTest_KIND `protobuf:"varint,1,req,name=Kind,json=kind,enum=testdata.GoTest_KIND" json:"Kind,omitempty"` + Table *string `protobuf:"bytes,2,opt,name=Table,json=table" json:"Table,omitempty"` + Param *int32 `protobuf:"varint,3,opt,name=Param,json=param" json:"Param,omitempty"` + // Required, repeated and optional foreign fields. + RequiredField *GoTestField `protobuf:"bytes,4,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + RepeatedField []*GoTestField `protobuf:"bytes,5,rep,name=RepeatedField,json=repeatedField" json:"RepeatedField,omitempty"` + OptionalField *GoTestField `protobuf:"bytes,6,opt,name=OptionalField,json=optionalField" json:"OptionalField,omitempty"` + // Required fields of all basic types + F_BoolRequired *bool `protobuf:"varint,10,req,name=F_Bool_required,json=fBoolRequired" json:"F_Bool_required,omitempty"` + F_Int32Required *int32 `protobuf:"varint,11,req,name=F_Int32_required,json=fInt32Required" json:"F_Int32_required,omitempty"` + F_Int64Required *int64 `protobuf:"varint,12,req,name=F_Int64_required,json=fInt64Required" json:"F_Int64_required,omitempty"` + F_Fixed32Required *uint32 `protobuf:"fixed32,13,req,name=F_Fixed32_required,json=fFixed32Required" json:"F_Fixed32_required,omitempty"` + F_Fixed64Required *uint64 `protobuf:"fixed64,14,req,name=F_Fixed64_required,json=fFixed64Required" json:"F_Fixed64_required,omitempty"` + F_Uint32Required *uint32 `protobuf:"varint,15,req,name=F_Uint32_required,json=fUint32Required" json:"F_Uint32_required,omitempty"` + F_Uint64Required *uint64 `protobuf:"varint,16,req,name=F_Uint64_required,json=fUint64Required" json:"F_Uint64_required,omitempty"` + F_FloatRequired *float32 `protobuf:"fixed32,17,req,name=F_Float_required,json=fFloatRequired" json:"F_Float_required,omitempty"` + F_DoubleRequired *float64 `protobuf:"fixed64,18,req,name=F_Double_required,json=fDoubleRequired" json:"F_Double_required,omitempty"` + F_StringRequired *string `protobuf:"bytes,19,req,name=F_String_required,json=fStringRequired" json:"F_String_required,omitempty"` + F_BytesRequired []byte `protobuf:"bytes,101,req,name=F_Bytes_required,json=fBytesRequired" json:"F_Bytes_required,omitempty"` + F_Sint32Required *int32 `protobuf:"zigzag32,102,req,name=F_Sint32_required,json=fSint32Required" json:"F_Sint32_required,omitempty"` + F_Sint64Required *int64 `protobuf:"zigzag64,103,req,name=F_Sint64_required,json=fSint64Required" json:"F_Sint64_required,omitempty"` + // Repeated fields of all basic types + F_BoolRepeated []bool `protobuf:"varint,20,rep,name=F_Bool_repeated,json=fBoolRepeated" json:"F_Bool_repeated,omitempty"` + F_Int32Repeated []int32 `protobuf:"varint,21,rep,name=F_Int32_repeated,json=fInt32Repeated" json:"F_Int32_repeated,omitempty"` + F_Int64Repeated []int64 `protobuf:"varint,22,rep,name=F_Int64_repeated,json=fInt64Repeated" json:"F_Int64_repeated,omitempty"` + F_Fixed32Repeated []uint32 `protobuf:"fixed32,23,rep,name=F_Fixed32_repeated,json=fFixed32Repeated" json:"F_Fixed32_repeated,omitempty"` + F_Fixed64Repeated []uint64 `protobuf:"fixed64,24,rep,name=F_Fixed64_repeated,json=fFixed64Repeated" json:"F_Fixed64_repeated,omitempty"` + F_Uint32Repeated []uint32 `protobuf:"varint,25,rep,name=F_Uint32_repeated,json=fUint32Repeated" json:"F_Uint32_repeated,omitempty"` + F_Uint64Repeated []uint64 `protobuf:"varint,26,rep,name=F_Uint64_repeated,json=fUint64Repeated" json:"F_Uint64_repeated,omitempty"` + F_FloatRepeated []float32 `protobuf:"fixed32,27,rep,name=F_Float_repeated,json=fFloatRepeated" json:"F_Float_repeated,omitempty"` + F_DoubleRepeated []float64 `protobuf:"fixed64,28,rep,name=F_Double_repeated,json=fDoubleRepeated" json:"F_Double_repeated,omitempty"` + F_StringRepeated []string `protobuf:"bytes,29,rep,name=F_String_repeated,json=fStringRepeated" json:"F_String_repeated,omitempty"` + F_BytesRepeated [][]byte `protobuf:"bytes,201,rep,name=F_Bytes_repeated,json=fBytesRepeated" json:"F_Bytes_repeated,omitempty"` + F_Sint32Repeated []int32 `protobuf:"zigzag32,202,rep,name=F_Sint32_repeated,json=fSint32Repeated" json:"F_Sint32_repeated,omitempty"` + F_Sint64Repeated []int64 `protobuf:"zigzag64,203,rep,name=F_Sint64_repeated,json=fSint64Repeated" json:"F_Sint64_repeated,omitempty"` + // Optional fields of all basic types + F_BoolOptional *bool `protobuf:"varint,30,opt,name=F_Bool_optional,json=fBoolOptional" json:"F_Bool_optional,omitempty"` + F_Int32Optional *int32 `protobuf:"varint,31,opt,name=F_Int32_optional,json=fInt32Optional" json:"F_Int32_optional,omitempty"` + F_Int64Optional *int64 `protobuf:"varint,32,opt,name=F_Int64_optional,json=fInt64Optional" json:"F_Int64_optional,omitempty"` + F_Fixed32Optional *uint32 `protobuf:"fixed32,33,opt,name=F_Fixed32_optional,json=fFixed32Optional" json:"F_Fixed32_optional,omitempty"` + F_Fixed64Optional *uint64 `protobuf:"fixed64,34,opt,name=F_Fixed64_optional,json=fFixed64Optional" json:"F_Fixed64_optional,omitempty"` + F_Uint32Optional *uint32 `protobuf:"varint,35,opt,name=F_Uint32_optional,json=fUint32Optional" json:"F_Uint32_optional,omitempty"` + F_Uint64Optional *uint64 `protobuf:"varint,36,opt,name=F_Uint64_optional,json=fUint64Optional" json:"F_Uint64_optional,omitempty"` + F_FloatOptional *float32 `protobuf:"fixed32,37,opt,name=F_Float_optional,json=fFloatOptional" json:"F_Float_optional,omitempty"` + F_DoubleOptional *float64 `protobuf:"fixed64,38,opt,name=F_Double_optional,json=fDoubleOptional" json:"F_Double_optional,omitempty"` + F_StringOptional *string `protobuf:"bytes,39,opt,name=F_String_optional,json=fStringOptional" json:"F_String_optional,omitempty"` + F_BytesOptional []byte `protobuf:"bytes,301,opt,name=F_Bytes_optional,json=fBytesOptional" json:"F_Bytes_optional,omitempty"` + F_Sint32Optional *int32 `protobuf:"zigzag32,302,opt,name=F_Sint32_optional,json=fSint32Optional" json:"F_Sint32_optional,omitempty"` + F_Sint64Optional *int64 `protobuf:"zigzag64,303,opt,name=F_Sint64_optional,json=fSint64Optional" json:"F_Sint64_optional,omitempty"` + // Default-valued fields of all basic types + F_BoolDefaulted *bool `protobuf:"varint,40,opt,name=F_Bool_defaulted,json=fBoolDefaulted,def=1" json:"F_Bool_defaulted,omitempty"` + F_Int32Defaulted *int32 `protobuf:"varint,41,opt,name=F_Int32_defaulted,json=fInt32Defaulted,def=32" json:"F_Int32_defaulted,omitempty"` + F_Int64Defaulted *int64 `protobuf:"varint,42,opt,name=F_Int64_defaulted,json=fInt64Defaulted,def=64" json:"F_Int64_defaulted,omitempty"` + F_Fixed32Defaulted *uint32 `protobuf:"fixed32,43,opt,name=F_Fixed32_defaulted,json=fFixed32Defaulted,def=320" json:"F_Fixed32_defaulted,omitempty"` + F_Fixed64Defaulted *uint64 `protobuf:"fixed64,44,opt,name=F_Fixed64_defaulted,json=fFixed64Defaulted,def=640" json:"F_Fixed64_defaulted,omitempty"` + F_Uint32Defaulted *uint32 `protobuf:"varint,45,opt,name=F_Uint32_defaulted,json=fUint32Defaulted,def=3200" json:"F_Uint32_defaulted,omitempty"` + F_Uint64Defaulted *uint64 `protobuf:"varint,46,opt,name=F_Uint64_defaulted,json=fUint64Defaulted,def=6400" json:"F_Uint64_defaulted,omitempty"` + F_FloatDefaulted *float32 `protobuf:"fixed32,47,opt,name=F_Float_defaulted,json=fFloatDefaulted,def=314159" json:"F_Float_defaulted,omitempty"` + F_DoubleDefaulted *float64 `protobuf:"fixed64,48,opt,name=F_Double_defaulted,json=fDoubleDefaulted,def=271828" json:"F_Double_defaulted,omitempty"` + F_StringDefaulted *string `protobuf:"bytes,49,opt,name=F_String_defaulted,json=fStringDefaulted,def=hello, \"world!\"\n" json:"F_String_defaulted,omitempty"` + F_BytesDefaulted []byte `protobuf:"bytes,401,opt,name=F_Bytes_defaulted,json=fBytesDefaulted,def=Bignose" json:"F_Bytes_defaulted,omitempty"` + F_Sint32Defaulted *int32 `protobuf:"zigzag32,402,opt,name=F_Sint32_defaulted,json=fSint32Defaulted,def=-32" json:"F_Sint32_defaulted,omitempty"` + F_Sint64Defaulted *int64 `protobuf:"zigzag64,403,opt,name=F_Sint64_defaulted,json=fSint64Defaulted,def=-64" json:"F_Sint64_defaulted,omitempty"` + // Packed repeated fields (no string or bytes). + F_BoolRepeatedPacked []bool `protobuf:"varint,50,rep,packed,name=F_Bool_repeated_packed,json=fBoolRepeatedPacked" json:"F_Bool_repeated_packed,omitempty"` + F_Int32RepeatedPacked []int32 `protobuf:"varint,51,rep,packed,name=F_Int32_repeated_packed,json=fInt32RepeatedPacked" json:"F_Int32_repeated_packed,omitempty"` + F_Int64RepeatedPacked []int64 `protobuf:"varint,52,rep,packed,name=F_Int64_repeated_packed,json=fInt64RepeatedPacked" json:"F_Int64_repeated_packed,omitempty"` + F_Fixed32RepeatedPacked []uint32 `protobuf:"fixed32,53,rep,packed,name=F_Fixed32_repeated_packed,json=fFixed32RepeatedPacked" json:"F_Fixed32_repeated_packed,omitempty"` + F_Fixed64RepeatedPacked []uint64 `protobuf:"fixed64,54,rep,packed,name=F_Fixed64_repeated_packed,json=fFixed64RepeatedPacked" json:"F_Fixed64_repeated_packed,omitempty"` + F_Uint32RepeatedPacked []uint32 `protobuf:"varint,55,rep,packed,name=F_Uint32_repeated_packed,json=fUint32RepeatedPacked" json:"F_Uint32_repeated_packed,omitempty"` + F_Uint64RepeatedPacked []uint64 `protobuf:"varint,56,rep,packed,name=F_Uint64_repeated_packed,json=fUint64RepeatedPacked" json:"F_Uint64_repeated_packed,omitempty"` + F_FloatRepeatedPacked []float32 `protobuf:"fixed32,57,rep,packed,name=F_Float_repeated_packed,json=fFloatRepeatedPacked" json:"F_Float_repeated_packed,omitempty"` + F_DoubleRepeatedPacked []float64 `protobuf:"fixed64,58,rep,packed,name=F_Double_repeated_packed,json=fDoubleRepeatedPacked" json:"F_Double_repeated_packed,omitempty"` + F_Sint32RepeatedPacked []int32 `protobuf:"zigzag32,502,rep,packed,name=F_Sint32_repeated_packed,json=fSint32RepeatedPacked" json:"F_Sint32_repeated_packed,omitempty"` + F_Sint64RepeatedPacked []int64 `protobuf:"zigzag64,503,rep,packed,name=F_Sint64_repeated_packed,json=fSint64RepeatedPacked" json:"F_Sint64_repeated_packed,omitempty"` + Requiredgroup *GoTest_RequiredGroup `protobuf:"group,70,req,name=RequiredGroup,json=requiredgroup" json:"requiredgroup,omitempty"` + Repeatedgroup []*GoTest_RepeatedGroup `protobuf:"group,80,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"` + Optionalgroup *GoTest_OptionalGroup `protobuf:"group,90,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest) Reset() { *m = GoTest{} } +func (m *GoTest) String() string { return proto.CompactTextString(m) } +func (*GoTest) ProtoMessage() {} +func (*GoTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +const Default_GoTest_F_BoolDefaulted bool = true +const Default_GoTest_F_Int32Defaulted int32 = 32 +const Default_GoTest_F_Int64Defaulted int64 = 64 +const Default_GoTest_F_Fixed32Defaulted uint32 = 320 +const Default_GoTest_F_Fixed64Defaulted uint64 = 640 +const Default_GoTest_F_Uint32Defaulted uint32 = 3200 +const Default_GoTest_F_Uint64Defaulted uint64 = 6400 +const Default_GoTest_F_FloatDefaulted float32 = 314159 +const Default_GoTest_F_DoubleDefaulted float64 = 271828 +const Default_GoTest_F_StringDefaulted string = "hello, \"world!\"\n" + +var Default_GoTest_F_BytesDefaulted []byte = []byte("Bignose") + +const Default_GoTest_F_Sint32Defaulted int32 = -32 +const Default_GoTest_F_Sint64Defaulted int64 = -64 + +func (m *GoTest) GetKind() GoTest_KIND { + if m != nil && m.Kind != nil { + return *m.Kind + } + return GoTest_VOID +} + +func (m *GoTest) GetTable() string { + if m != nil && m.Table != nil { + return *m.Table + } + return "" +} + +func (m *GoTest) GetParam() int32 { + if m != nil && m.Param != nil { + return *m.Param + } + return 0 +} + +func (m *GoTest) GetRequiredField() *GoTestField { + if m != nil { + return m.RequiredField + } + return nil +} + +func (m *GoTest) GetRepeatedField() []*GoTestField { + if m != nil { + return m.RepeatedField + } + return nil +} + +func (m *GoTest) GetOptionalField() *GoTestField { + if m != nil { + return m.OptionalField + } + return nil +} + +func (m *GoTest) GetF_BoolRequired() bool { + if m != nil && m.F_BoolRequired != nil { + return *m.F_BoolRequired + } + return false +} + +func (m *GoTest) GetF_Int32Required() int32 { + if m != nil && m.F_Int32Required != nil { + return *m.F_Int32Required + } + return 0 +} + +func (m *GoTest) GetF_Int64Required() int64 { + if m != nil && m.F_Int64Required != nil { + return *m.F_Int64Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Required() uint32 { + if m != nil && m.F_Fixed32Required != nil { + return *m.F_Fixed32Required + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Required() uint64 { + if m != nil && m.F_Fixed64Required != nil { + return *m.F_Fixed64Required + } + return 0 +} + +func (m *GoTest) GetF_Uint32Required() uint32 { + if m != nil && m.F_Uint32Required != nil { + return *m.F_Uint32Required + } + return 0 +} + +func (m *GoTest) GetF_Uint64Required() uint64 { + if m != nil && m.F_Uint64Required != nil { + return *m.F_Uint64Required + } + return 0 +} + +func (m *GoTest) GetF_FloatRequired() float32 { + if m != nil && m.F_FloatRequired != nil { + return *m.F_FloatRequired + } + return 0 +} + +func (m *GoTest) GetF_DoubleRequired() float64 { + if m != nil && m.F_DoubleRequired != nil { + return *m.F_DoubleRequired + } + return 0 +} + +func (m *GoTest) GetF_StringRequired() string { + if m != nil && m.F_StringRequired != nil { + return *m.F_StringRequired + } + return "" +} + +func (m *GoTest) GetF_BytesRequired() []byte { + if m != nil { + return m.F_BytesRequired + } + return nil +} + +func (m *GoTest) GetF_Sint32Required() int32 { + if m != nil && m.F_Sint32Required != nil { + return *m.F_Sint32Required + } + return 0 +} + +func (m *GoTest) GetF_Sint64Required() int64 { + if m != nil && m.F_Sint64Required != nil { + return *m.F_Sint64Required + } + return 0 +} + +func (m *GoTest) GetF_BoolRepeated() []bool { + if m != nil { + return m.F_BoolRepeated + } + return nil +} + +func (m *GoTest) GetF_Int32Repeated() []int32 { + if m != nil { + return m.F_Int32Repeated + } + return nil +} + +func (m *GoTest) GetF_Int64Repeated() []int64 { + if m != nil { + return m.F_Int64Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed32Repeated() []uint32 { + if m != nil { + return m.F_Fixed32Repeated + } + return nil +} + +func (m *GoTest) GetF_Fixed64Repeated() []uint64 { + if m != nil { + return m.F_Fixed64Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint32Repeated() []uint32 { + if m != nil { + return m.F_Uint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Uint64Repeated() []uint64 { + if m != nil { + return m.F_Uint64Repeated + } + return nil +} + +func (m *GoTest) GetF_FloatRepeated() []float32 { + if m != nil { + return m.F_FloatRepeated + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeated() []float64 { + if m != nil { + return m.F_DoubleRepeated + } + return nil +} + +func (m *GoTest) GetF_StringRepeated() []string { + if m != nil { + return m.F_StringRepeated + } + return nil +} + +func (m *GoTest) GetF_BytesRepeated() [][]byte { + if m != nil { + return m.F_BytesRepeated + } + return nil +} + +func (m *GoTest) GetF_Sint32Repeated() []int32 { + if m != nil { + return m.F_Sint32Repeated + } + return nil +} + +func (m *GoTest) GetF_Sint64Repeated() []int64 { + if m != nil { + return m.F_Sint64Repeated + } + return nil +} + +func (m *GoTest) GetF_BoolOptional() bool { + if m != nil && m.F_BoolOptional != nil { + return *m.F_BoolOptional + } + return false +} + +func (m *GoTest) GetF_Int32Optional() int32 { + if m != nil && m.F_Int32Optional != nil { + return *m.F_Int32Optional + } + return 0 +} + +func (m *GoTest) GetF_Int64Optional() int64 { + if m != nil && m.F_Int64Optional != nil { + return *m.F_Int64Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed32Optional() uint32 { + if m != nil && m.F_Fixed32Optional != nil { + return *m.F_Fixed32Optional + } + return 0 +} + +func (m *GoTest) GetF_Fixed64Optional() uint64 { + if m != nil && m.F_Fixed64Optional != nil { + return *m.F_Fixed64Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint32Optional() uint32 { + if m != nil && m.F_Uint32Optional != nil { + return *m.F_Uint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Uint64Optional() uint64 { + if m != nil && m.F_Uint64Optional != nil { + return *m.F_Uint64Optional + } + return 0 +} + +func (m *GoTest) GetF_FloatOptional() float32 { + if m != nil && m.F_FloatOptional != nil { + return *m.F_FloatOptional + } + return 0 +} + +func (m *GoTest) GetF_DoubleOptional() float64 { + if m != nil && m.F_DoubleOptional != nil { + return *m.F_DoubleOptional + } + return 0 +} + +func (m *GoTest) GetF_StringOptional() string { + if m != nil && m.F_StringOptional != nil { + return *m.F_StringOptional + } + return "" +} + +func (m *GoTest) GetF_BytesOptional() []byte { + if m != nil { + return m.F_BytesOptional + } + return nil +} + +func (m *GoTest) GetF_Sint32Optional() int32 { + if m != nil && m.F_Sint32Optional != nil { + return *m.F_Sint32Optional + } + return 0 +} + +func (m *GoTest) GetF_Sint64Optional() int64 { + if m != nil && m.F_Sint64Optional != nil { + return *m.F_Sint64Optional + } + return 0 +} + +func (m *GoTest) GetF_BoolDefaulted() bool { + if m != nil && m.F_BoolDefaulted != nil { + return *m.F_BoolDefaulted + } + return Default_GoTest_F_BoolDefaulted +} + +func (m *GoTest) GetF_Int32Defaulted() int32 { + if m != nil && m.F_Int32Defaulted != nil { + return *m.F_Int32Defaulted + } + return Default_GoTest_F_Int32Defaulted +} + +func (m *GoTest) GetF_Int64Defaulted() int64 { + if m != nil && m.F_Int64Defaulted != nil { + return *m.F_Int64Defaulted + } + return Default_GoTest_F_Int64Defaulted +} + +func (m *GoTest) GetF_Fixed32Defaulted() uint32 { + if m != nil && m.F_Fixed32Defaulted != nil { + return *m.F_Fixed32Defaulted + } + return Default_GoTest_F_Fixed32Defaulted +} + +func (m *GoTest) GetF_Fixed64Defaulted() uint64 { + if m != nil && m.F_Fixed64Defaulted != nil { + return *m.F_Fixed64Defaulted + } + return Default_GoTest_F_Fixed64Defaulted +} + +func (m *GoTest) GetF_Uint32Defaulted() uint32 { + if m != nil && m.F_Uint32Defaulted != nil { + return *m.F_Uint32Defaulted + } + return Default_GoTest_F_Uint32Defaulted +} + +func (m *GoTest) GetF_Uint64Defaulted() uint64 { + if m != nil && m.F_Uint64Defaulted != nil { + return *m.F_Uint64Defaulted + } + return Default_GoTest_F_Uint64Defaulted +} + +func (m *GoTest) GetF_FloatDefaulted() float32 { + if m != nil && m.F_FloatDefaulted != nil { + return *m.F_FloatDefaulted + } + return Default_GoTest_F_FloatDefaulted +} + +func (m *GoTest) GetF_DoubleDefaulted() float64 { + if m != nil && m.F_DoubleDefaulted != nil { + return *m.F_DoubleDefaulted + } + return Default_GoTest_F_DoubleDefaulted +} + +func (m *GoTest) GetF_StringDefaulted() string { + if m != nil && m.F_StringDefaulted != nil { + return *m.F_StringDefaulted + } + return Default_GoTest_F_StringDefaulted +} + +func (m *GoTest) GetF_BytesDefaulted() []byte { + if m != nil && m.F_BytesDefaulted != nil { + return m.F_BytesDefaulted + } + return append([]byte(nil), Default_GoTest_F_BytesDefaulted...) +} + +func (m *GoTest) GetF_Sint32Defaulted() int32 { + if m != nil && m.F_Sint32Defaulted != nil { + return *m.F_Sint32Defaulted + } + return Default_GoTest_F_Sint32Defaulted +} + +func (m *GoTest) GetF_Sint64Defaulted() int64 { + if m != nil && m.F_Sint64Defaulted != nil { + return *m.F_Sint64Defaulted + } + return Default_GoTest_F_Sint64Defaulted +} + +func (m *GoTest) GetF_BoolRepeatedPacked() []bool { + if m != nil { + return m.F_BoolRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int32RepeatedPacked() []int32 { + if m != nil { + return m.F_Int32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Int64RepeatedPacked() []int64 { + if m != nil { + return m.F_Int64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Fixed32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Fixed64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Fixed64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint32RepeatedPacked() []uint32 { + if m != nil { + return m.F_Uint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Uint64RepeatedPacked() []uint64 { + if m != nil { + return m.F_Uint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_FloatRepeatedPacked() []float32 { + if m != nil { + return m.F_FloatRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_DoubleRepeatedPacked() []float64 { + if m != nil { + return m.F_DoubleRepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint32RepeatedPacked() []int32 { + if m != nil { + return m.F_Sint32RepeatedPacked + } + return nil +} + +func (m *GoTest) GetF_Sint64RepeatedPacked() []int64 { + if m != nil { + return m.F_Sint64RepeatedPacked + } + return nil +} + +func (m *GoTest) GetRequiredgroup() *GoTest_RequiredGroup { + if m != nil { + return m.Requiredgroup + } + return nil +} + +func (m *GoTest) GetRepeatedgroup() []*GoTest_RepeatedGroup { + if m != nil { + return m.Repeatedgroup + } + return nil +} + +func (m *GoTest) GetOptionalgroup() *GoTest_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil +} + +// Required, repeated, and optional groups. +type GoTest_RequiredGroup struct { + RequiredField *string `protobuf:"bytes,71,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RequiredGroup) Reset() { *m = GoTest_RequiredGroup{} } +func (m *GoTest_RequiredGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RequiredGroup) ProtoMessage() {} +func (*GoTest_RequiredGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} } + +func (m *GoTest_RequiredGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_RepeatedGroup struct { + RequiredField *string `protobuf:"bytes,81,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_RepeatedGroup) Reset() { *m = GoTest_RepeatedGroup{} } +func (m *GoTest_RepeatedGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_RepeatedGroup) ProtoMessage() {} +func (*GoTest_RepeatedGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 1} } + +func (m *GoTest_RepeatedGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +type GoTest_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,91,req,name=RequiredField,json=requiredField" json:"RequiredField,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoTest_OptionalGroup) Reset() { *m = GoTest_OptionalGroup{} } +func (m *GoTest_OptionalGroup) String() string { return proto.CompactTextString(m) } +func (*GoTest_OptionalGroup) ProtoMessage() {} +func (*GoTest_OptionalGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 2} } + +func (m *GoTest_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +type GoSkipTest struct { + SkipInt32 *int32 `protobuf:"varint,11,req,name=skip_int32,json=skipInt32" json:"skip_int32,omitempty"` + SkipFixed32 *uint32 `protobuf:"fixed32,12,req,name=skip_fixed32,json=skipFixed32" json:"skip_fixed32,omitempty"` + SkipFixed64 *uint64 `protobuf:"fixed64,13,req,name=skip_fixed64,json=skipFixed64" json:"skip_fixed64,omitempty"` + SkipString *string `protobuf:"bytes,14,req,name=skip_string,json=skipString" json:"skip_string,omitempty"` + Skipgroup *GoSkipTest_SkipGroup `protobuf:"group,15,req,name=SkipGroup,json=skipgroup" json:"skipgroup,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest) Reset() { *m = GoSkipTest{} } +func (m *GoSkipTest) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest) ProtoMessage() {} +func (*GoSkipTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *GoSkipTest) GetSkipInt32() int32 { + if m != nil && m.SkipInt32 != nil { + return *m.SkipInt32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed32() uint32 { + if m != nil && m.SkipFixed32 != nil { + return *m.SkipFixed32 + } + return 0 +} + +func (m *GoSkipTest) GetSkipFixed64() uint64 { + if m != nil && m.SkipFixed64 != nil { + return *m.SkipFixed64 + } + return 0 +} + +func (m *GoSkipTest) GetSkipString() string { + if m != nil && m.SkipString != nil { + return *m.SkipString + } + return "" +} + +func (m *GoSkipTest) GetSkipgroup() *GoSkipTest_SkipGroup { + if m != nil { + return m.Skipgroup + } + return nil +} + +type GoSkipTest_SkipGroup struct { + GroupInt32 *int32 `protobuf:"varint,16,req,name=group_int32,json=groupInt32" json:"group_int32,omitempty"` + GroupString *string `protobuf:"bytes,17,req,name=group_string,json=groupString" json:"group_string,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GoSkipTest_SkipGroup) Reset() { *m = GoSkipTest_SkipGroup{} } +func (m *GoSkipTest_SkipGroup) String() string { return proto.CompactTextString(m) } +func (*GoSkipTest_SkipGroup) ProtoMessage() {} +func (*GoSkipTest_SkipGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + +func (m *GoSkipTest_SkipGroup) GetGroupInt32() int32 { + if m != nil && m.GroupInt32 != nil { + return *m.GroupInt32 + } + return 0 +} + +func (m *GoSkipTest_SkipGroup) GetGroupString() string { + if m != nil && m.GroupString != nil { + return *m.GroupString + } + return "" +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +type NonPackedTest struct { + A []int32 `protobuf:"varint,1,rep,name=a" json:"a,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NonPackedTest) Reset() { *m = NonPackedTest{} } +func (m *NonPackedTest) String() string { return proto.CompactTextString(m) } +func (*NonPackedTest) ProtoMessage() {} +func (*NonPackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *NonPackedTest) GetA() []int32 { + if m != nil { + return m.A + } + return nil +} + +type PackedTest struct { + B []int32 `protobuf:"varint,1,rep,packed,name=b" json:"b,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PackedTest) Reset() { *m = PackedTest{} } +func (m *PackedTest) String() string { return proto.CompactTextString(m) } +func (*PackedTest) ProtoMessage() {} +func (*PackedTest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *PackedTest) GetB() []int32 { + if m != nil { + return m.B + } + return nil +} + +type MaxTag struct { + // Maximum possible tag number. + LastField *string `protobuf:"bytes,536870911,opt,name=last_field,json=lastField" json:"last_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MaxTag) Reset() { *m = MaxTag{} } +func (m *MaxTag) String() string { return proto.CompactTextString(m) } +func (*MaxTag) ProtoMessage() {} +func (*MaxTag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *MaxTag) GetLastField() string { + if m != nil && m.LastField != nil { + return *m.LastField + } + return "" +} + +type OldMessage struct { + Nested *OldMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + Num *int32 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage) Reset() { *m = OldMessage{} } +func (m *OldMessage) String() string { return proto.CompactTextString(m) } +func (*OldMessage) ProtoMessage() {} +func (*OldMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +func (m *OldMessage) GetNested() *OldMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *OldMessage) GetNum() int32 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type OldMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OldMessage_Nested) Reset() { *m = OldMessage_Nested{} } +func (m *OldMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*OldMessage_Nested) ProtoMessage() {} +func (*OldMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } + +func (m *OldMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +type NewMessage struct { + Nested *NewMessage_Nested `protobuf:"bytes,1,opt,name=nested" json:"nested,omitempty"` + // This is an int32 in OldMessage. + Num *int64 `protobuf:"varint,2,opt,name=num" json:"num,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage) Reset() { *m = NewMessage{} } +func (m *NewMessage) String() string { return proto.CompactTextString(m) } +func (*NewMessage) ProtoMessage() {} +func (*NewMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +func (m *NewMessage) GetNested() *NewMessage_Nested { + if m != nil { + return m.Nested + } + return nil +} + +func (m *NewMessage) GetNum() int64 { + if m != nil && m.Num != nil { + return *m.Num + } + return 0 +} + +type NewMessage_Nested struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + FoodGroup *string `protobuf:"bytes,2,opt,name=food_group,json=foodGroup" json:"food_group,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NewMessage_Nested) Reset() { *m = NewMessage_Nested{} } +func (m *NewMessage_Nested) String() string { return proto.CompactTextString(m) } +func (*NewMessage_Nested) ProtoMessage() {} +func (*NewMessage_Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8, 0} } + +func (m *NewMessage_Nested) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *NewMessage_Nested) GetFoodGroup() string { + if m != nil && m.FoodGroup != nil { + return *m.FoodGroup + } + return "" +} + +type InnerMessage struct { + Host *string `protobuf:"bytes,1,req,name=host" json:"host,omitempty"` + Port *int32 `protobuf:"varint,2,opt,name=port,def=4000" json:"port,omitempty"` + Connected *bool `protobuf:"varint,3,opt,name=connected" json:"connected,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InnerMessage) Reset() { *m = InnerMessage{} } +func (m *InnerMessage) String() string { return proto.CompactTextString(m) } +func (*InnerMessage) ProtoMessage() {} +func (*InnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +const Default_InnerMessage_Port int32 = 4000 + +func (m *InnerMessage) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *InnerMessage) GetPort() int32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_InnerMessage_Port +} + +func (m *InnerMessage) GetConnected() bool { + if m != nil && m.Connected != nil { + return *m.Connected + } + return false +} + +type OtherMessage struct { + Key *int64 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + Weight *float32 `protobuf:"fixed32,3,opt,name=weight" json:"weight,omitempty"` + Inner *InnerMessage `protobuf:"bytes,4,opt,name=inner" json:"inner,omitempty"` + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *OtherMessage) Reset() { *m = OtherMessage{} } +func (m *OtherMessage) String() string { return proto.CompactTextString(m) } +func (*OtherMessage) ProtoMessage() {} +func (*OtherMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +var extRange_OtherMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*OtherMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_OtherMessage +} +func (m *OtherMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +func (m *OtherMessage) GetKey() int64 { + if m != nil && m.Key != nil { + return *m.Key + } + return 0 +} + +func (m *OtherMessage) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *OtherMessage) GetWeight() float32 { + if m != nil && m.Weight != nil { + return *m.Weight + } + return 0 +} + +func (m *OtherMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +type RequiredInnerMessage struct { + LeoFinallyWonAnOscar *InnerMessage `protobuf:"bytes,1,req,name=leo_finally_won_an_oscar,json=leoFinallyWonAnOscar" json:"leo_finally_won_an_oscar,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequiredInnerMessage) Reset() { *m = RequiredInnerMessage{} } +func (m *RequiredInnerMessage) String() string { return proto.CompactTextString(m) } +func (*RequiredInnerMessage) ProtoMessage() {} +func (*RequiredInnerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *RequiredInnerMessage) GetLeoFinallyWonAnOscar() *InnerMessage { + if m != nil { + return m.LeoFinallyWonAnOscar + } + return nil +} + +type MyMessage struct { + Count *int32 `protobuf:"varint,1,req,name=count" json:"count,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Quote *string `protobuf:"bytes,3,opt,name=quote" json:"quote,omitempty"` + Pet []string `protobuf:"bytes,4,rep,name=pet" json:"pet,omitempty"` + Inner *InnerMessage `protobuf:"bytes,5,opt,name=inner" json:"inner,omitempty"` + Others []*OtherMessage `protobuf:"bytes,6,rep,name=others" json:"others,omitempty"` + WeMustGoDeeper *RequiredInnerMessage `protobuf:"bytes,13,opt,name=we_must_go_deeper,json=weMustGoDeeper" json:"we_must_go_deeper,omitempty"` + RepInner []*InnerMessage `protobuf:"bytes,12,rep,name=rep_inner,json=repInner" json:"rep_inner,omitempty"` + Bikeshed *MyMessage_Color `protobuf:"varint,7,opt,name=bikeshed,enum=testdata.MyMessage_Color" json:"bikeshed,omitempty"` + Somegroup *MyMessage_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` + // This field becomes [][]byte in the generated code. + RepBytes [][]byte `protobuf:"bytes,10,rep,name=rep_bytes,json=repBytes" json:"rep_bytes,omitempty"` + Bigfloat *float64 `protobuf:"fixed64,11,opt,name=bigfloat" json:"bigfloat,omitempty"` + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage) Reset() { *m = MyMessage{} } +func (m *MyMessage) String() string { return proto.CompactTextString(m) } +func (*MyMessage) ProtoMessage() {} +func (*MyMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +var extRange_MyMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*MyMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessage +} +func (m *MyMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +func (m *MyMessage) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *MyMessage) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MyMessage) GetQuote() string { + if m != nil && m.Quote != nil { + return *m.Quote + } + return "" +} + +func (m *MyMessage) GetPet() []string { + if m != nil { + return m.Pet + } + return nil +} + +func (m *MyMessage) GetInner() *InnerMessage { + if m != nil { + return m.Inner + } + return nil +} + +func (m *MyMessage) GetOthers() []*OtherMessage { + if m != nil { + return m.Others + } + return nil +} + +func (m *MyMessage) GetWeMustGoDeeper() *RequiredInnerMessage { + if m != nil { + return m.WeMustGoDeeper + } + return nil +} + +func (m *MyMessage) GetRepInner() []*InnerMessage { + if m != nil { + return m.RepInner + } + return nil +} + +func (m *MyMessage) GetBikeshed() MyMessage_Color { + if m != nil && m.Bikeshed != nil { + return *m.Bikeshed + } + return MyMessage_RED +} + +func (m *MyMessage) GetSomegroup() *MyMessage_SomeGroup { + if m != nil { + return m.Somegroup + } + return nil +} + +func (m *MyMessage) GetRepBytes() [][]byte { + if m != nil { + return m.RepBytes + } + return nil +} + +func (m *MyMessage) GetBigfloat() float64 { + if m != nil && m.Bigfloat != nil { + return *m.Bigfloat + } + return 0 +} + +type MyMessage_SomeGroup struct { + GroupField *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessage_SomeGroup) Reset() { *m = MyMessage_SomeGroup{} } +func (m *MyMessage_SomeGroup) String() string { return proto.CompactTextString(m) } +func (*MyMessage_SomeGroup) ProtoMessage() {} +func (*MyMessage_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12, 0} } + +func (m *MyMessage_SomeGroup) GetGroupField() int32 { + if m != nil && m.GroupField != nil { + return *m.GroupField + } + return 0 +} + +type Ext struct { + Data *string `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Ext) Reset() { *m = Ext{} } +func (m *Ext) String() string { return proto.CompactTextString(m) } +func (*Ext) ProtoMessage() {} +func (*Ext) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +func (m *Ext) GetData() string { + if m != nil && m.Data != nil { + return *m.Data + } + return "" +} + +var E_Ext_More = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*Ext)(nil), + Field: 103, + Name: "testdata.Ext.more", + Tag: "bytes,103,opt,name=more", +} + +var E_Ext_Text = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*string)(nil), + Field: 104, + Name: "testdata.Ext.text", + Tag: "bytes,104,opt,name=text", +} + +var E_Ext_Number = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 105, + Name: "testdata.Ext.number", + Tag: "varint,105,opt,name=number", +} + +type ComplexExtension struct { + First *int32 `protobuf:"varint,1,opt,name=first" json:"first,omitempty"` + Second *int32 `protobuf:"varint,2,opt,name=second" json:"second,omitempty"` + Third []int32 `protobuf:"varint,3,rep,name=third" json:"third,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ComplexExtension) Reset() { *m = ComplexExtension{} } +func (m *ComplexExtension) String() string { return proto.CompactTextString(m) } +func (*ComplexExtension) ProtoMessage() {} +func (*ComplexExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *ComplexExtension) GetFirst() int32 { + if m != nil && m.First != nil { + return *m.First + } + return 0 +} + +func (m *ComplexExtension) GetSecond() int32 { + if m != nil && m.Second != nil { + return *m.Second + } + return 0 +} + +func (m *ComplexExtension) GetThird() []int32 { + if m != nil { + return m.Third + } + return nil +} + +type DefaultsMessage struct { + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DefaultsMessage) Reset() { *m = DefaultsMessage{} } +func (m *DefaultsMessage) String() string { return proto.CompactTextString(m) } +func (*DefaultsMessage) ProtoMessage() {} +func (*DefaultsMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +var extRange_DefaultsMessage = []proto.ExtensionRange{ + {100, 536870911}, +} + +func (*DefaultsMessage) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_DefaultsMessage +} +func (m *DefaultsMessage) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +type MyMessageSet struct { + XXX_extensions map[int32]proto.Extension `json:"-"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MyMessageSet) Reset() { *m = MyMessageSet{} } +func (m *MyMessageSet) String() string { return proto.CompactTextString(m) } +func (*MyMessageSet) ProtoMessage() {} +func (*MyMessageSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } + +func (m *MyMessageSet) Marshal() ([]byte, error) { + return proto.MarshalMessageSet(m.ExtensionMap()) +} +func (m *MyMessageSet) Unmarshal(buf []byte) error { + return proto.UnmarshalMessageSet(buf, m.ExtensionMap()) +} +func (m *MyMessageSet) MarshalJSON() ([]byte, error) { + return proto.MarshalMessageSetJSON(m.XXX_extensions) +} +func (m *MyMessageSet) UnmarshalJSON(buf []byte) error { + return proto.UnmarshalMessageSetJSON(buf, m.XXX_extensions) +} + +// ensure MyMessageSet satisfies proto.Marshaler and proto.Unmarshaler +var _ proto.Marshaler = (*MyMessageSet)(nil) +var _ proto.Unmarshaler = (*MyMessageSet)(nil) + +var extRange_MyMessageSet = []proto.ExtensionRange{ + {100, 2147483646}, +} + +func (*MyMessageSet) ExtensionRangeArray() []proto.ExtensionRange { + return extRange_MyMessageSet +} +func (m *MyMessageSet) ExtensionMap() map[int32]proto.Extension { + if m.XXX_extensions == nil { + m.XXX_extensions = make(map[int32]proto.Extension) + } + return m.XXX_extensions +} + +type Empty struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } + +type MessageList struct { + Message []*MessageList_Message `protobuf:"group,1,rep,name=Message,json=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList) Reset() { *m = MessageList{} } +func (m *MessageList) String() string { return proto.CompactTextString(m) } +func (*MessageList) ProtoMessage() {} +func (*MessageList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } + +func (m *MessageList) GetMessage() []*MessageList_Message { + if m != nil { + return m.Message + } + return nil +} + +type MessageList_Message struct { + Name *string `protobuf:"bytes,2,req,name=name" json:"name,omitempty"` + Count *int32 `protobuf:"varint,3,req,name=count" json:"count,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageList_Message) Reset() { *m = MessageList_Message{} } +func (m *MessageList_Message) String() string { return proto.CompactTextString(m) } +func (*MessageList_Message) ProtoMessage() {} +func (*MessageList_Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} } + +func (m *MessageList_Message) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MessageList_Message) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +type Strings struct { + StringField *string `protobuf:"bytes,1,opt,name=string_field,json=stringField" json:"string_field,omitempty"` + BytesField []byte `protobuf:"bytes,2,opt,name=bytes_field,json=bytesField" json:"bytes_field,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Strings) Reset() { *m = Strings{} } +func (m *Strings) String() string { return proto.CompactTextString(m) } +func (*Strings) ProtoMessage() {} +func (*Strings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } + +func (m *Strings) GetStringField() string { + if m != nil && m.StringField != nil { + return *m.StringField + } + return "" +} + +func (m *Strings) GetBytesField() []byte { + if m != nil { + return m.BytesField + } + return nil +} + +type Defaults struct { + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + F_Bool *bool `protobuf:"varint,1,opt,name=F_Bool,json=fBool,def=1" json:"F_Bool,omitempty"` + F_Int32 *int32 `protobuf:"varint,2,opt,name=F_Int32,json=fInt32,def=32" json:"F_Int32,omitempty"` + F_Int64 *int64 `protobuf:"varint,3,opt,name=F_Int64,json=fInt64,def=64" json:"F_Int64,omitempty"` + F_Fixed32 *uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=fFixed32,def=320" json:"F_Fixed32,omitempty"` + F_Fixed64 *uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=fFixed64,def=640" json:"F_Fixed64,omitempty"` + F_Uint32 *uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=fUint32,def=3200" json:"F_Uint32,omitempty"` + F_Uint64 *uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=fUint64,def=6400" json:"F_Uint64,omitempty"` + F_Float *float32 `protobuf:"fixed32,8,opt,name=F_Float,json=fFloat,def=314159" json:"F_Float,omitempty"` + F_Double *float64 `protobuf:"fixed64,9,opt,name=F_Double,json=fDouble,def=271828" json:"F_Double,omitempty"` + F_String *string `protobuf:"bytes,10,opt,name=F_String,json=fString,def=hello, \"world!\"\n" json:"F_String,omitempty"` + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=fBytes,def=Bignose" json:"F_Bytes,omitempty"` + F_Sint32 *int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=fSint32,def=-32" json:"F_Sint32,omitempty"` + F_Sint64 *int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=fSint64,def=-64" json:"F_Sint64,omitempty"` + F_Enum *Defaults_Color `protobuf:"varint,14,opt,name=F_Enum,json=fEnum,enum=testdata.Defaults_Color,def=1" json:"F_Enum,omitempty"` + // More fields with crazy defaults. + F_Pinf *float32 `protobuf:"fixed32,15,opt,name=F_Pinf,json=fPinf,def=inf" json:"F_Pinf,omitempty"` + F_Ninf *float32 `protobuf:"fixed32,16,opt,name=F_Ninf,json=fNinf,def=-inf" json:"F_Ninf,omitempty"` + F_Nan *float32 `protobuf:"fixed32,17,opt,name=F_Nan,json=fNan,def=nan" json:"F_Nan,omitempty"` + // Sub-message. + Sub *SubDefaults `protobuf:"bytes,18,opt,name=sub" json:"sub,omitempty"` + // Redundant but explicit defaults. + StrZero *string `protobuf:"bytes,19,opt,name=str_zero,json=strZero,def=" json:"str_zero,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Defaults) Reset() { *m = Defaults{} } +func (m *Defaults) String() string { return proto.CompactTextString(m) } +func (*Defaults) ProtoMessage() {} +func (*Defaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } + +const Default_Defaults_F_Bool bool = true +const Default_Defaults_F_Int32 int32 = 32 +const Default_Defaults_F_Int64 int64 = 64 +const Default_Defaults_F_Fixed32 uint32 = 320 +const Default_Defaults_F_Fixed64 uint64 = 640 +const Default_Defaults_F_Uint32 uint32 = 3200 +const Default_Defaults_F_Uint64 uint64 = 6400 +const Default_Defaults_F_Float float32 = 314159 +const Default_Defaults_F_Double float64 = 271828 +const Default_Defaults_F_String string = "hello, \"world!\"\n" + +var Default_Defaults_F_Bytes []byte = []byte("Bignose") + +const Default_Defaults_F_Sint32 int32 = -32 +const Default_Defaults_F_Sint64 int64 = -64 +const Default_Defaults_F_Enum Defaults_Color = Defaults_GREEN + +var Default_Defaults_F_Pinf float32 = float32(math.Inf(1)) +var Default_Defaults_F_Ninf float32 = float32(math.Inf(-1)) +var Default_Defaults_F_Nan float32 = float32(math.NaN()) + +func (m *Defaults) GetF_Bool() bool { + if m != nil && m.F_Bool != nil { + return *m.F_Bool + } + return Default_Defaults_F_Bool +} + +func (m *Defaults) GetF_Int32() int32 { + if m != nil && m.F_Int32 != nil { + return *m.F_Int32 + } + return Default_Defaults_F_Int32 +} + +func (m *Defaults) GetF_Int64() int64 { + if m != nil && m.F_Int64 != nil { + return *m.F_Int64 + } + return Default_Defaults_F_Int64 +} + +func (m *Defaults) GetF_Fixed32() uint32 { + if m != nil && m.F_Fixed32 != nil { + return *m.F_Fixed32 + } + return Default_Defaults_F_Fixed32 +} + +func (m *Defaults) GetF_Fixed64() uint64 { + if m != nil && m.F_Fixed64 != nil { + return *m.F_Fixed64 + } + return Default_Defaults_F_Fixed64 +} + +func (m *Defaults) GetF_Uint32() uint32 { + if m != nil && m.F_Uint32 != nil { + return *m.F_Uint32 + } + return Default_Defaults_F_Uint32 +} + +func (m *Defaults) GetF_Uint64() uint64 { + if m != nil && m.F_Uint64 != nil { + return *m.F_Uint64 + } + return Default_Defaults_F_Uint64 +} + +func (m *Defaults) GetF_Float() float32 { + if m != nil && m.F_Float != nil { + return *m.F_Float + } + return Default_Defaults_F_Float +} + +func (m *Defaults) GetF_Double() float64 { + if m != nil && m.F_Double != nil { + return *m.F_Double + } + return Default_Defaults_F_Double +} + +func (m *Defaults) GetF_String() string { + if m != nil && m.F_String != nil { + return *m.F_String + } + return Default_Defaults_F_String +} + +func (m *Defaults) GetF_Bytes() []byte { + if m != nil && m.F_Bytes != nil { + return m.F_Bytes + } + return append([]byte(nil), Default_Defaults_F_Bytes...) +} + +func (m *Defaults) GetF_Sint32() int32 { + if m != nil && m.F_Sint32 != nil { + return *m.F_Sint32 + } + return Default_Defaults_F_Sint32 +} + +func (m *Defaults) GetF_Sint64() int64 { + if m != nil && m.F_Sint64 != nil { + return *m.F_Sint64 + } + return Default_Defaults_F_Sint64 +} + +func (m *Defaults) GetF_Enum() Defaults_Color { + if m != nil && m.F_Enum != nil { + return *m.F_Enum + } + return Default_Defaults_F_Enum +} + +func (m *Defaults) GetF_Pinf() float32 { + if m != nil && m.F_Pinf != nil { + return *m.F_Pinf + } + return Default_Defaults_F_Pinf +} + +func (m *Defaults) GetF_Ninf() float32 { + if m != nil && m.F_Ninf != nil { + return *m.F_Ninf + } + return Default_Defaults_F_Ninf +} + +func (m *Defaults) GetF_Nan() float32 { + if m != nil && m.F_Nan != nil { + return *m.F_Nan + } + return Default_Defaults_F_Nan +} + +func (m *Defaults) GetSub() *SubDefaults { + if m != nil { + return m.Sub + } + return nil +} + +func (m *Defaults) GetStrZero() string { + if m != nil && m.StrZero != nil { + return *m.StrZero + } + return "" +} + +type SubDefaults struct { + N *int64 `protobuf:"varint,1,opt,name=n,def=7" json:"n,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SubDefaults) Reset() { *m = SubDefaults{} } +func (m *SubDefaults) String() string { return proto.CompactTextString(m) } +func (*SubDefaults) ProtoMessage() {} +func (*SubDefaults) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } + +const Default_SubDefaults_N int64 = 7 + +func (m *SubDefaults) GetN() int64 { + if m != nil && m.N != nil { + return *m.N + } + return Default_SubDefaults_N +} + +type RepeatedEnum struct { + Color []RepeatedEnum_Color `protobuf:"varint,1,rep,name=color,enum=testdata.RepeatedEnum_Color" json:"color,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RepeatedEnum) Reset() { *m = RepeatedEnum{} } +func (m *RepeatedEnum) String() string { return proto.CompactTextString(m) } +func (*RepeatedEnum) ProtoMessage() {} +func (*RepeatedEnum) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } + +func (m *RepeatedEnum) GetColor() []RepeatedEnum_Color { + if m != nil { + return m.Color + } + return nil +} + +type MoreRepeated struct { + Bools []bool `protobuf:"varint,1,rep,name=bools" json:"bools,omitempty"` + BoolsPacked []bool `protobuf:"varint,2,rep,packed,name=bools_packed,json=boolsPacked" json:"bools_packed,omitempty"` + Ints []int32 `protobuf:"varint,3,rep,name=ints" json:"ints,omitempty"` + IntsPacked []int32 `protobuf:"varint,4,rep,packed,name=ints_packed,json=intsPacked" json:"ints_packed,omitempty"` + Int64SPacked []int64 `protobuf:"varint,7,rep,packed,name=int64s_packed,json=int64sPacked" json:"int64s_packed,omitempty"` + Strings []string `protobuf:"bytes,5,rep,name=strings" json:"strings,omitempty"` + Fixeds []uint32 `protobuf:"fixed32,6,rep,name=fixeds" json:"fixeds,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MoreRepeated) Reset() { *m = MoreRepeated{} } +func (m *MoreRepeated) String() string { return proto.CompactTextString(m) } +func (*MoreRepeated) ProtoMessage() {} +func (*MoreRepeated) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } + +func (m *MoreRepeated) GetBools() []bool { + if m != nil { + return m.Bools + } + return nil +} + +func (m *MoreRepeated) GetBoolsPacked() []bool { + if m != nil { + return m.BoolsPacked + } + return nil +} + +func (m *MoreRepeated) GetInts() []int32 { + if m != nil { + return m.Ints + } + return nil +} + +func (m *MoreRepeated) GetIntsPacked() []int32 { + if m != nil { + return m.IntsPacked + } + return nil +} + +func (m *MoreRepeated) GetInt64SPacked() []int64 { + if m != nil { + return m.Int64SPacked + } + return nil +} + +func (m *MoreRepeated) GetStrings() []string { + if m != nil { + return m.Strings + } + return nil +} + +func (m *MoreRepeated) GetFixeds() []uint32 { + if m != nil { + return m.Fixeds + } + return nil +} + +type GroupOld struct { + G *GroupOld_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld) Reset() { *m = GroupOld{} } +func (m *GroupOld) String() string { return proto.CompactTextString(m) } +func (*GroupOld) ProtoMessage() {} +func (*GroupOld) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *GroupOld) GetG() *GroupOld_G { + if m != nil { + return m.G + } + return nil +} + +type GroupOld_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupOld_G) Reset() { *m = GroupOld_G{} } +func (m *GroupOld_G) String() string { return proto.CompactTextString(m) } +func (*GroupOld_G) ProtoMessage() {} +func (*GroupOld_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24, 0} } + +func (m *GroupOld_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type GroupNew struct { + G *GroupNew_G `protobuf:"group,101,opt,name=G,json=g" json:"g,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew) Reset() { *m = GroupNew{} } +func (m *GroupNew) String() string { return proto.CompactTextString(m) } +func (*GroupNew) ProtoMessage() {} +func (*GroupNew) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } + +func (m *GroupNew) GetG() *GroupNew_G { + if m != nil { + return m.G + } + return nil +} + +type GroupNew_G struct { + X *int32 `protobuf:"varint,2,opt,name=x" json:"x,omitempty"` + Y *int32 `protobuf:"varint,3,opt,name=y" json:"y,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GroupNew_G) Reset() { *m = GroupNew_G{} } +func (m *GroupNew_G) String() string { return proto.CompactTextString(m) } +func (*GroupNew_G) ProtoMessage() {} +func (*GroupNew_G) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25, 0} } + +func (m *GroupNew_G) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *GroupNew_G) GetY() int32 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type FloatingPoint struct { + F *float64 `protobuf:"fixed64,1,req,name=f" json:"f,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FloatingPoint) Reset() { *m = FloatingPoint{} } +func (m *FloatingPoint) String() string { return proto.CompactTextString(m) } +func (*FloatingPoint) ProtoMessage() {} +func (*FloatingPoint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } + +func (m *FloatingPoint) GetF() float64 { + if m != nil && m.F != nil { + return *m.F + } + return 0 +} + +type MessageWithMap struct { + NameMapping map[int32]string `protobuf:"bytes,1,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + MsgMapping map[int64]*FloatingPoint `protobuf:"bytes,2,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ByteMapping map[bool][]byte `protobuf:"bytes,3,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + StrToStr map[string]string `protobuf:"bytes,4,rep,name=str_to_str,json=strToStr" json:"str_to_str,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MessageWithMap) Reset() { *m = MessageWithMap{} } +func (m *MessageWithMap) String() string { return proto.CompactTextString(m) } +func (*MessageWithMap) ProtoMessage() {} +func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } + +func (m *MessageWithMap) GetNameMapping() map[int32]string { + if m != nil { + return m.NameMapping + } + return nil +} + +func (m *MessageWithMap) GetMsgMapping() map[int64]*FloatingPoint { + if m != nil { + return m.MsgMapping + } + return nil +} + +func (m *MessageWithMap) GetByteMapping() map[bool][]byte { + if m != nil { + return m.ByteMapping + } + return nil +} + +func (m *MessageWithMap) GetStrToStr() map[string]string { + if m != nil { + return m.StrToStr + } + return nil +} + +type Oneof struct { + // Types that are valid to be assigned to Union: + // *Oneof_F_Bool + // *Oneof_F_Int32 + // *Oneof_F_Int64 + // *Oneof_F_Fixed32 + // *Oneof_F_Fixed64 + // *Oneof_F_Uint32 + // *Oneof_F_Uint64 + // *Oneof_F_Float + // *Oneof_F_Double + // *Oneof_F_String + // *Oneof_F_Bytes + // *Oneof_F_Sint32 + // *Oneof_F_Sint64 + // *Oneof_F_Enum + // *Oneof_F_Message + // *Oneof_FGroup + // *Oneof_F_Largest_Tag + Union isOneof_Union `protobuf_oneof:"union"` + // Types that are valid to be assigned to Tormato: + // *Oneof_Value + Tormato isOneof_Tormato `protobuf_oneof:"tormato"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof) Reset() { *m = Oneof{} } +func (m *Oneof) String() string { return proto.CompactTextString(m) } +func (*Oneof) ProtoMessage() {} +func (*Oneof) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } + +type isOneof_Union interface { + isOneof_Union() +} +type isOneof_Tormato interface { + isOneof_Tormato() +} + +type Oneof_F_Bool struct { + F_Bool bool `protobuf:"varint,1,opt,name=F_Bool,json=fBool,oneof"` +} +type Oneof_F_Int32 struct { + F_Int32 int32 `protobuf:"varint,2,opt,name=F_Int32,json=fInt32,oneof"` +} +type Oneof_F_Int64 struct { + F_Int64 int64 `protobuf:"varint,3,opt,name=F_Int64,json=fInt64,oneof"` +} +type Oneof_F_Fixed32 struct { + F_Fixed32 uint32 `protobuf:"fixed32,4,opt,name=F_Fixed32,json=fFixed32,oneof"` +} +type Oneof_F_Fixed64 struct { + F_Fixed64 uint64 `protobuf:"fixed64,5,opt,name=F_Fixed64,json=fFixed64,oneof"` +} +type Oneof_F_Uint32 struct { + F_Uint32 uint32 `protobuf:"varint,6,opt,name=F_Uint32,json=fUint32,oneof"` +} +type Oneof_F_Uint64 struct { + F_Uint64 uint64 `protobuf:"varint,7,opt,name=F_Uint64,json=fUint64,oneof"` +} +type Oneof_F_Float struct { + F_Float float32 `protobuf:"fixed32,8,opt,name=F_Float,json=fFloat,oneof"` +} +type Oneof_F_Double struct { + F_Double float64 `protobuf:"fixed64,9,opt,name=F_Double,json=fDouble,oneof"` +} +type Oneof_F_String struct { + F_String string `protobuf:"bytes,10,opt,name=F_String,json=fString,oneof"` +} +type Oneof_F_Bytes struct { + F_Bytes []byte `protobuf:"bytes,11,opt,name=F_Bytes,json=fBytes,oneof"` +} +type Oneof_F_Sint32 struct { + F_Sint32 int32 `protobuf:"zigzag32,12,opt,name=F_Sint32,json=fSint32,oneof"` +} +type Oneof_F_Sint64 struct { + F_Sint64 int64 `protobuf:"zigzag64,13,opt,name=F_Sint64,json=fSint64,oneof"` +} +type Oneof_F_Enum struct { + F_Enum MyMessage_Color `protobuf:"varint,14,opt,name=F_Enum,json=fEnum,enum=testdata.MyMessage_Color,oneof"` +} +type Oneof_F_Message struct { + F_Message *GoTestField `protobuf:"bytes,15,opt,name=F_Message,json=fMessage,oneof"` +} +type Oneof_FGroup struct { + FGroup *Oneof_F_Group `protobuf:"group,16,opt,name=F_Group,json=fGroup,oneof"` +} +type Oneof_F_Largest_Tag struct { + F_Largest_Tag int32 `protobuf:"varint,536870911,opt,name=F_Largest_Tag,json=fLargestTag,oneof"` +} +type Oneof_Value struct { + Value int32 `protobuf:"varint,100,opt,name=value,oneof"` +} + +func (*Oneof_F_Bool) isOneof_Union() {} +func (*Oneof_F_Int32) isOneof_Union() {} +func (*Oneof_F_Int64) isOneof_Union() {} +func (*Oneof_F_Fixed32) isOneof_Union() {} +func (*Oneof_F_Fixed64) isOneof_Union() {} +func (*Oneof_F_Uint32) isOneof_Union() {} +func (*Oneof_F_Uint64) isOneof_Union() {} +func (*Oneof_F_Float) isOneof_Union() {} +func (*Oneof_F_Double) isOneof_Union() {} +func (*Oneof_F_String) isOneof_Union() {} +func (*Oneof_F_Bytes) isOneof_Union() {} +func (*Oneof_F_Sint32) isOneof_Union() {} +func (*Oneof_F_Sint64) isOneof_Union() {} +func (*Oneof_F_Enum) isOneof_Union() {} +func (*Oneof_F_Message) isOneof_Union() {} +func (*Oneof_FGroup) isOneof_Union() {} +func (*Oneof_F_Largest_Tag) isOneof_Union() {} +func (*Oneof_Value) isOneof_Tormato() {} + +func (m *Oneof) GetUnion() isOneof_Union { + if m != nil { + return m.Union + } + return nil +} +func (m *Oneof) GetTormato() isOneof_Tormato { + if m != nil { + return m.Tormato + } + return nil +} + +func (m *Oneof) GetF_Bool() bool { + if x, ok := m.GetUnion().(*Oneof_F_Bool); ok { + return x.F_Bool + } + return false +} + +func (m *Oneof) GetF_Int32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Int32); ok { + return x.F_Int32 + } + return 0 +} + +func (m *Oneof) GetF_Int64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Int64); ok { + return x.F_Int64 + } + return 0 +} + +func (m *Oneof) GetF_Fixed32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed32); ok { + return x.F_Fixed32 + } + return 0 +} + +func (m *Oneof) GetF_Fixed64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Fixed64); ok { + return x.F_Fixed64 + } + return 0 +} + +func (m *Oneof) GetF_Uint32() uint32 { + if x, ok := m.GetUnion().(*Oneof_F_Uint32); ok { + return x.F_Uint32 + } + return 0 +} + +func (m *Oneof) GetF_Uint64() uint64 { + if x, ok := m.GetUnion().(*Oneof_F_Uint64); ok { + return x.F_Uint64 + } + return 0 +} + +func (m *Oneof) GetF_Float() float32 { + if x, ok := m.GetUnion().(*Oneof_F_Float); ok { + return x.F_Float + } + return 0 +} + +func (m *Oneof) GetF_Double() float64 { + if x, ok := m.GetUnion().(*Oneof_F_Double); ok { + return x.F_Double + } + return 0 +} + +func (m *Oneof) GetF_String() string { + if x, ok := m.GetUnion().(*Oneof_F_String); ok { + return x.F_String + } + return "" +} + +func (m *Oneof) GetF_Bytes() []byte { + if x, ok := m.GetUnion().(*Oneof_F_Bytes); ok { + return x.F_Bytes + } + return nil +} + +func (m *Oneof) GetF_Sint32() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Sint32); ok { + return x.F_Sint32 + } + return 0 +} + +func (m *Oneof) GetF_Sint64() int64 { + if x, ok := m.GetUnion().(*Oneof_F_Sint64); ok { + return x.F_Sint64 + } + return 0 +} + +func (m *Oneof) GetF_Enum() MyMessage_Color { + if x, ok := m.GetUnion().(*Oneof_F_Enum); ok { + return x.F_Enum + } + return MyMessage_RED +} + +func (m *Oneof) GetF_Message() *GoTestField { + if x, ok := m.GetUnion().(*Oneof_F_Message); ok { + return x.F_Message + } + return nil +} + +func (m *Oneof) GetFGroup() *Oneof_F_Group { + if x, ok := m.GetUnion().(*Oneof_FGroup); ok { + return x.FGroup + } + return nil +} + +func (m *Oneof) GetF_Largest_Tag() int32 { + if x, ok := m.GetUnion().(*Oneof_F_Largest_Tag); ok { + return x.F_Largest_Tag + } + return 0 +} + +func (m *Oneof) GetValue() int32 { + if x, ok := m.GetTormato().(*Oneof_Value); ok { + return x.Value + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Oneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Oneof_OneofMarshaler, _Oneof_OneofUnmarshaler, _Oneof_OneofSizer, []interface{}{ + (*Oneof_F_Bool)(nil), + (*Oneof_F_Int32)(nil), + (*Oneof_F_Int64)(nil), + (*Oneof_F_Fixed32)(nil), + (*Oneof_F_Fixed64)(nil), + (*Oneof_F_Uint32)(nil), + (*Oneof_F_Uint64)(nil), + (*Oneof_F_Float)(nil), + (*Oneof_F_Double)(nil), + (*Oneof_F_String)(nil), + (*Oneof_F_Bytes)(nil), + (*Oneof_F_Sint32)(nil), + (*Oneof_F_Sint64)(nil), + (*Oneof_F_Enum)(nil), + (*Oneof_F_Message)(nil), + (*Oneof_FGroup)(nil), + (*Oneof_F_Largest_Tag)(nil), + (*Oneof_Value)(nil), + } +} + +func _Oneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + t := uint64(0) + if x.F_Bool { + t = 1 + } + b.EncodeVarint(1<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Oneof_F_Int32: + b.EncodeVarint(2<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + b.EncodeVarint(3<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + b.EncodeVarint(4<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(x.F_Fixed32)) + case *Oneof_F_Fixed64: + b.EncodeVarint(5<<3 | proto.WireFixed64) + b.EncodeFixed64(uint64(x.F_Fixed64)) + case *Oneof_F_Uint32: + b.EncodeVarint(6<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + b.EncodeVarint(7<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + b.EncodeVarint(8<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.F_Float))) + case *Oneof_F_Double: + b.EncodeVarint(9<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.F_Double)) + case *Oneof_F_String: + b.EncodeVarint(10<<3 | proto.WireBytes) + b.EncodeStringBytes(x.F_String) + case *Oneof_F_Bytes: + b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeRawBytes(x.F_Bytes) + case *Oneof_F_Sint32: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeZigzag32(uint64(x.F_Sint32)) + case *Oneof_F_Sint64: + b.EncodeVarint(13<<3 | proto.WireVarint) + b.EncodeZigzag64(uint64(x.F_Sint64)) + case *Oneof_F_Enum: + b.EncodeVarint(14<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.F_Message); err != nil { + return err + } + case *Oneof_FGroup: + b.EncodeVarint(16<<3 | proto.WireStartGroup) + if err := b.Marshal(x.FGroup); err != nil { + return err + } + b.EncodeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + b.EncodeVarint(536870911<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + return fmt.Errorf("Oneof.Union has unexpected type %T", x) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + b.EncodeVarint(100<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Value)) + case nil: + default: + return fmt.Errorf("Oneof.Tormato has unexpected type %T", x) + } + return nil +} + +func _Oneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Oneof) + switch tag { + case 1: // union.F_Bool + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Bool{x != 0} + return true, err + case 2: // union.F_Int32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int32{int32(x)} + return true, err + case 3: // union.F_Int64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Int64{int64(x)} + return true, err + case 4: // union.F_Fixed32 + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Fixed32{uint32(x)} + return true, err + case 5: // union.F_Fixed64 + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Fixed64{x} + return true, err + case 6: // union.F_Uint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint32{uint32(x)} + return true, err + case 7: // union.F_Uint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Uint64{x} + return true, err + case 8: // union.F_Float + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Union = &Oneof_F_Float{math.Float32frombits(uint32(x))} + return true, err + case 9: // union.F_Double + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Oneof_F_Double{math.Float64frombits(x)} + return true, err + case 10: // union.F_String + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Oneof_F_String{x} + return true, err + case 11: // union.F_Bytes + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Oneof_F_Bytes{x} + return true, err + case 12: // union.F_Sint32 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag32() + m.Union = &Oneof_F_Sint32{int32(x)} + return true, err + case 13: // union.F_Sint64 + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeZigzag64() + m.Union = &Oneof_F_Sint64{int64(x)} + return true, err + case 14: // union.F_Enum + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Enum{MyMessage_Color(x)} + return true, err + case 15: // union.F_Message + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(GoTestField) + err := b.DecodeMessage(msg) + m.Union = &Oneof_F_Message{msg} + return true, err + case 16: // union.f_group + if wire != proto.WireStartGroup { + return true, proto.ErrInternalBadWireType + } + msg := new(Oneof_F_Group) + err := b.DecodeGroup(msg) + m.Union = &Oneof_FGroup{msg} + return true, err + case 536870911: // union.F_Largest_Tag + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Oneof_F_Largest_Tag{int32(x)} + return true, err + case 100: // tormato.value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Tormato = &Oneof_Value{int32(x)} + return true, err + default: + return false, nil + } +} + +func _Oneof_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Oneof) + // union + switch x := m.Union.(type) { + case *Oneof_F_Bool: + n += proto.SizeVarint(1<<3 | proto.WireVarint) + n += 1 + case *Oneof_F_Int32: + n += proto.SizeVarint(2<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int32)) + case *Oneof_F_Int64: + n += proto.SizeVarint(3<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Int64)) + case *Oneof_F_Fixed32: + n += proto.SizeVarint(4<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Fixed64: + n += proto.SizeVarint(5<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_Uint32: + n += proto.SizeVarint(6<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint32)) + case *Oneof_F_Uint64: + n += proto.SizeVarint(7<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Uint64)) + case *Oneof_F_Float: + n += proto.SizeVarint(8<<3 | proto.WireFixed32) + n += 4 + case *Oneof_F_Double: + n += proto.SizeVarint(9<<3 | proto.WireFixed64) + n += 8 + case *Oneof_F_String: + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_String))) + n += len(x.F_String) + case *Oneof_F_Bytes: + n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.F_Bytes))) + n += len(x.F_Bytes) + case *Oneof_F_Sint32: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64((uint32(x.F_Sint32) << 1) ^ uint32((int32(x.F_Sint32) >> 31)))) + case *Oneof_F_Sint64: + n += proto.SizeVarint(13<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(uint64(x.F_Sint64<<1) ^ uint64((int64(x.F_Sint64) >> 63)))) + case *Oneof_F_Enum: + n += proto.SizeVarint(14<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Enum)) + case *Oneof_F_Message: + s := proto.Size(x.F_Message) + n += proto.SizeVarint(15<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *Oneof_FGroup: + n += proto.SizeVarint(16<<3 | proto.WireStartGroup) + n += proto.Size(x.FGroup) + n += proto.SizeVarint(16<<3 | proto.WireEndGroup) + case *Oneof_F_Largest_Tag: + n += proto.SizeVarint(536870911<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.F_Largest_Tag)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + // tormato + switch x := m.Tormato.(type) { + case *Oneof_Value: + n += proto.SizeVarint(100<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Value)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type Oneof_F_Group struct { + X *int32 `protobuf:"varint,17,opt,name=x" json:"x,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Oneof_F_Group) Reset() { *m = Oneof_F_Group{} } +func (m *Oneof_F_Group) String() string { return proto.CompactTextString(m) } +func (*Oneof_F_Group) ProtoMessage() {} +func (*Oneof_F_Group) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28, 0} } + +func (m *Oneof_F_Group) GetX() int32 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +type Communique struct { + MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` + // This is a oneof, called "union". + // + // Types that are valid to be assigned to Union: + // *Communique_Number + // *Communique_Name + // *Communique_Data + // *Communique_TempC + // *Communique_Col + // *Communique_Msg + Union isCommunique_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Communique) Reset() { *m = Communique{} } +func (m *Communique) String() string { return proto.CompactTextString(m) } +func (*Communique) ProtoMessage() {} +func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +type isCommunique_Union interface { + isCommunique_Union() +} + +type Communique_Number struct { + Number int32 `protobuf:"varint,5,opt,name=number,oneof"` +} +type Communique_Name struct { + Name string `protobuf:"bytes,6,opt,name=name,oneof"` +} +type Communique_Data struct { + Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` +} +type Communique_TempC struct { + TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` +} +type Communique_Col struct { + Col MyMessage_Color `protobuf:"varint,9,opt,name=col,enum=testdata.MyMessage_Color,oneof"` +} +type Communique_Msg struct { + Msg *Strings `protobuf:"bytes,10,opt,name=msg,oneof"` +} + +func (*Communique_Number) isCommunique_Union() {} +func (*Communique_Name) isCommunique_Union() {} +func (*Communique_Data) isCommunique_Union() {} +func (*Communique_TempC) isCommunique_Union() {} +func (*Communique_Col) isCommunique_Union() {} +func (*Communique_Msg) isCommunique_Union() {} + +func (m *Communique) GetUnion() isCommunique_Union { + if m != nil { + return m.Union + } + return nil +} + +func (m *Communique) GetMakeMeCry() bool { + if m != nil && m.MakeMeCry != nil { + return *m.MakeMeCry + } + return false +} + +func (m *Communique) GetNumber() int32 { + if x, ok := m.GetUnion().(*Communique_Number); ok { + return x.Number + } + return 0 +} + +func (m *Communique) GetName() string { + if x, ok := m.GetUnion().(*Communique_Name); ok { + return x.Name + } + return "" +} + +func (m *Communique) GetData() []byte { + if x, ok := m.GetUnion().(*Communique_Data); ok { + return x.Data + } + return nil +} + +func (m *Communique) GetTempC() float64 { + if x, ok := m.GetUnion().(*Communique_TempC); ok { + return x.TempC + } + return 0 +} + +func (m *Communique) GetCol() MyMessage_Color { + if x, ok := m.GetUnion().(*Communique_Col); ok { + return x.Col + } + return MyMessage_RED +} + +func (m *Communique) GetMsg() *Strings { + if x, ok := m.GetUnion().(*Communique_Msg); ok { + return x.Msg + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ + (*Communique_Number)(nil), + (*Communique_Name)(nil), + (*Communique_Data)(nil), + (*Communique_TempC)(nil), + (*Communique_Col)(nil), + (*Communique_Msg)(nil), + } +} + +func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + b.EncodeVarint(5<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Number)) + case *Communique_Name: + b.EncodeVarint(6<<3 | proto.WireBytes) + b.EncodeStringBytes(x.Name) + case *Communique_Data: + b.EncodeVarint(7<<3 | proto.WireBytes) + b.EncodeRawBytes(x.Data) + case *Communique_TempC: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.TempC)) + case *Communique_Col: + b.EncodeVarint(9<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Col)) + case *Communique_Msg: + b.EncodeVarint(10<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Msg); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("Communique.Union has unexpected type %T", x) + } + return nil +} + +func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Communique) + switch tag { + case 5: // union.number + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Number{int32(x)} + return true, err + case 6: // union.name + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Union = &Communique_Name{x} + return true, err + case 7: // union.data + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Union = &Communique_Data{x} + return true, err + case 8: // union.temp_c + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Union = &Communique_TempC{math.Float64frombits(x)} + return true, err + case 9: // union.col + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Union = &Communique_Col{MyMessage_Color(x)} + return true, err + case 10: // union.msg + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Strings) + err := b.DecodeMessage(msg) + m.Union = &Communique_Msg{msg} + return true, err + default: + return false, nil + } +} + +func _Communique_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Communique) + // union + switch x := m.Union.(type) { + case *Communique_Number: + n += proto.SizeVarint(5<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Number)) + case *Communique_Name: + n += proto.SizeVarint(6<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Name))) + n += len(x.Name) + case *Communique_Data: + n += proto.SizeVarint(7<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.Data))) + n += len(x.Data) + case *Communique_TempC: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Communique_Col: + n += proto.SizeVarint(9<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Col)) + case *Communique_Msg: + s := proto.Size(x.Msg) + n += proto.SizeVarint(10<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +var E_Greeting = &proto.ExtensionDesc{ + ExtendedType: (*MyMessage)(nil), + ExtensionType: ([]string)(nil), + Field: 106, + Name: "testdata.greeting", + Tag: "bytes,106,rep,name=greeting", +} + +var E_Complex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: (*ComplexExtension)(nil), + Field: 200, + Name: "testdata.complex", + Tag: "bytes,200,opt,name=complex", +} + +var E_RComplex = &proto.ExtensionDesc{ + ExtendedType: (*OtherMessage)(nil), + ExtensionType: ([]*ComplexExtension)(nil), + Field: 201, + Name: "testdata.r_complex", + Tag: "bytes,201,rep,name=r_complex,json=rComplex", +} + +var E_NoDefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 101, + Name: "testdata.no_default_double", + Tag: "fixed64,101,opt,name=no_default_double,json=noDefaultDouble", +} + +var E_NoDefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 102, + Name: "testdata.no_default_float", + Tag: "fixed32,102,opt,name=no_default_float,json=noDefaultFloat", +} + +var E_NoDefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 103, + Name: "testdata.no_default_int32", + Tag: "varint,103,opt,name=no_default_int32,json=noDefaultInt32", +} + +var E_NoDefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 104, + Name: "testdata.no_default_int64", + Tag: "varint,104,opt,name=no_default_int64,json=noDefaultInt64", +} + +var E_NoDefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 105, + Name: "testdata.no_default_uint32", + Tag: "varint,105,opt,name=no_default_uint32,json=noDefaultUint32", +} + +var E_NoDefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 106, + Name: "testdata.no_default_uint64", + Tag: "varint,106,opt,name=no_default_uint64,json=noDefaultUint64", +} + +var E_NoDefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 107, + Name: "testdata.no_default_sint32", + Tag: "zigzag32,107,opt,name=no_default_sint32,json=noDefaultSint32", +} + +var E_NoDefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 108, + Name: "testdata.no_default_sint64", + Tag: "zigzag64,108,opt,name=no_default_sint64,json=noDefaultSint64", +} + +var E_NoDefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 109, + Name: "testdata.no_default_fixed32", + Tag: "fixed32,109,opt,name=no_default_fixed32,json=noDefaultFixed32", +} + +var E_NoDefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 110, + Name: "testdata.no_default_fixed64", + Tag: "fixed64,110,opt,name=no_default_fixed64,json=noDefaultFixed64", +} + +var E_NoDefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 111, + Name: "testdata.no_default_sfixed32", + Tag: "fixed32,111,opt,name=no_default_sfixed32,json=noDefaultSfixed32", +} + +var E_NoDefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 112, + Name: "testdata.no_default_sfixed64", + Tag: "fixed64,112,opt,name=no_default_sfixed64,json=noDefaultSfixed64", +} + +var E_NoDefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 113, + Name: "testdata.no_default_bool", + Tag: "varint,113,opt,name=no_default_bool,json=noDefaultBool", +} + +var E_NoDefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 114, + Name: "testdata.no_default_string", + Tag: "bytes,114,opt,name=no_default_string,json=noDefaultString", +} + +var E_NoDefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 115, + Name: "testdata.no_default_bytes", + Tag: "bytes,115,opt,name=no_default_bytes,json=noDefaultBytes", +} + +var E_NoDefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 116, + Name: "testdata.no_default_enum", + Tag: "varint,116,opt,name=no_default_enum,json=noDefaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum", +} + +var E_DefaultDouble = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float64)(nil), + Field: 201, + Name: "testdata.default_double", + Tag: "fixed64,201,opt,name=default_double,json=defaultDouble,def=3.1415", +} + +var E_DefaultFloat = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*float32)(nil), + Field: 202, + Name: "testdata.default_float", + Tag: "fixed32,202,opt,name=default_float,json=defaultFloat,def=3.14", +} + +var E_DefaultInt32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 203, + Name: "testdata.default_int32", + Tag: "varint,203,opt,name=default_int32,json=defaultInt32,def=42", +} + +var E_DefaultInt64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 204, + Name: "testdata.default_int64", + Tag: "varint,204,opt,name=default_int64,json=defaultInt64,def=43", +} + +var E_DefaultUint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 205, + Name: "testdata.default_uint32", + Tag: "varint,205,opt,name=default_uint32,json=defaultUint32,def=44", +} + +var E_DefaultUint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 206, + Name: "testdata.default_uint64", + Tag: "varint,206,opt,name=default_uint64,json=defaultUint64,def=45", +} + +var E_DefaultSint32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 207, + Name: "testdata.default_sint32", + Tag: "zigzag32,207,opt,name=default_sint32,json=defaultSint32,def=46", +} + +var E_DefaultSint64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 208, + Name: "testdata.default_sint64", + Tag: "zigzag64,208,opt,name=default_sint64,json=defaultSint64,def=47", +} + +var E_DefaultFixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint32)(nil), + Field: 209, + Name: "testdata.default_fixed32", + Tag: "fixed32,209,opt,name=default_fixed32,json=defaultFixed32,def=48", +} + +var E_DefaultFixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*uint64)(nil), + Field: 210, + Name: "testdata.default_fixed64", + Tag: "fixed64,210,opt,name=default_fixed64,json=defaultFixed64,def=49", +} + +var E_DefaultSfixed32 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int32)(nil), + Field: 211, + Name: "testdata.default_sfixed32", + Tag: "fixed32,211,opt,name=default_sfixed32,json=defaultSfixed32,def=50", +} + +var E_DefaultSfixed64 = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*int64)(nil), + Field: 212, + Name: "testdata.default_sfixed64", + Tag: "fixed64,212,opt,name=default_sfixed64,json=defaultSfixed64,def=51", +} + +var E_DefaultBool = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*bool)(nil), + Field: 213, + Name: "testdata.default_bool", + Tag: "varint,213,opt,name=default_bool,json=defaultBool,def=1", +} + +var E_DefaultString = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*string)(nil), + Field: 214, + Name: "testdata.default_string", + Tag: "bytes,214,opt,name=default_string,json=defaultString,def=Hello, string", +} + +var E_DefaultBytes = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: ([]byte)(nil), + Field: 215, + Name: "testdata.default_bytes", + Tag: "bytes,215,opt,name=default_bytes,json=defaultBytes,def=Hello, bytes", +} + +var E_DefaultEnum = &proto.ExtensionDesc{ + ExtendedType: (*DefaultsMessage)(nil), + ExtensionType: (*DefaultsMessage_DefaultsEnum)(nil), + Field: 216, + Name: "testdata.default_enum", + Tag: "varint,216,opt,name=default_enum,json=defaultEnum,enum=testdata.DefaultsMessage_DefaultsEnum,def=1", +} + +var E_X201 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 201, + Name: "testdata.x201", + Tag: "bytes,201,opt,name=x201", +} + +var E_X202 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 202, + Name: "testdata.x202", + Tag: "bytes,202,opt,name=x202", +} + +var E_X203 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 203, + Name: "testdata.x203", + Tag: "bytes,203,opt,name=x203", +} + +var E_X204 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 204, + Name: "testdata.x204", + Tag: "bytes,204,opt,name=x204", +} + +var E_X205 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 205, + Name: "testdata.x205", + Tag: "bytes,205,opt,name=x205", +} + +var E_X206 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 206, + Name: "testdata.x206", + Tag: "bytes,206,opt,name=x206", +} + +var E_X207 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 207, + Name: "testdata.x207", + Tag: "bytes,207,opt,name=x207", +} + +var E_X208 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 208, + Name: "testdata.x208", + Tag: "bytes,208,opt,name=x208", +} + +var E_X209 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 209, + Name: "testdata.x209", + Tag: "bytes,209,opt,name=x209", +} + +var E_X210 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 210, + Name: "testdata.x210", + Tag: "bytes,210,opt,name=x210", +} + +var E_X211 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 211, + Name: "testdata.x211", + Tag: "bytes,211,opt,name=x211", +} + +var E_X212 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 212, + Name: "testdata.x212", + Tag: "bytes,212,opt,name=x212", +} + +var E_X213 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 213, + Name: "testdata.x213", + Tag: "bytes,213,opt,name=x213", +} + +var E_X214 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 214, + Name: "testdata.x214", + Tag: "bytes,214,opt,name=x214", +} + +var E_X215 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 215, + Name: "testdata.x215", + Tag: "bytes,215,opt,name=x215", +} + +var E_X216 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 216, + Name: "testdata.x216", + Tag: "bytes,216,opt,name=x216", +} + +var E_X217 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 217, + Name: "testdata.x217", + Tag: "bytes,217,opt,name=x217", +} + +var E_X218 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 218, + Name: "testdata.x218", + Tag: "bytes,218,opt,name=x218", +} + +var E_X219 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 219, + Name: "testdata.x219", + Tag: "bytes,219,opt,name=x219", +} + +var E_X220 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 220, + Name: "testdata.x220", + Tag: "bytes,220,opt,name=x220", +} + +var E_X221 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 221, + Name: "testdata.x221", + Tag: "bytes,221,opt,name=x221", +} + +var E_X222 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 222, + Name: "testdata.x222", + Tag: "bytes,222,opt,name=x222", +} + +var E_X223 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 223, + Name: "testdata.x223", + Tag: "bytes,223,opt,name=x223", +} + +var E_X224 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 224, + Name: "testdata.x224", + Tag: "bytes,224,opt,name=x224", +} + +var E_X225 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 225, + Name: "testdata.x225", + Tag: "bytes,225,opt,name=x225", +} + +var E_X226 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 226, + Name: "testdata.x226", + Tag: "bytes,226,opt,name=x226", +} + +var E_X227 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 227, + Name: "testdata.x227", + Tag: "bytes,227,opt,name=x227", +} + +var E_X228 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 228, + Name: "testdata.x228", + Tag: "bytes,228,opt,name=x228", +} + +var E_X229 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 229, + Name: "testdata.x229", + Tag: "bytes,229,opt,name=x229", +} + +var E_X230 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 230, + Name: "testdata.x230", + Tag: "bytes,230,opt,name=x230", +} + +var E_X231 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 231, + Name: "testdata.x231", + Tag: "bytes,231,opt,name=x231", +} + +var E_X232 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 232, + Name: "testdata.x232", + Tag: "bytes,232,opt,name=x232", +} + +var E_X233 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 233, + Name: "testdata.x233", + Tag: "bytes,233,opt,name=x233", +} + +var E_X234 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 234, + Name: "testdata.x234", + Tag: "bytes,234,opt,name=x234", +} + +var E_X235 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 235, + Name: "testdata.x235", + Tag: "bytes,235,opt,name=x235", +} + +var E_X236 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 236, + Name: "testdata.x236", + Tag: "bytes,236,opt,name=x236", +} + +var E_X237 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 237, + Name: "testdata.x237", + Tag: "bytes,237,opt,name=x237", +} + +var E_X238 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 238, + Name: "testdata.x238", + Tag: "bytes,238,opt,name=x238", +} + +var E_X239 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 239, + Name: "testdata.x239", + Tag: "bytes,239,opt,name=x239", +} + +var E_X240 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 240, + Name: "testdata.x240", + Tag: "bytes,240,opt,name=x240", +} + +var E_X241 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 241, + Name: "testdata.x241", + Tag: "bytes,241,opt,name=x241", +} + +var E_X242 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 242, + Name: "testdata.x242", + Tag: "bytes,242,opt,name=x242", +} + +var E_X243 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 243, + Name: "testdata.x243", + Tag: "bytes,243,opt,name=x243", +} + +var E_X244 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 244, + Name: "testdata.x244", + Tag: "bytes,244,opt,name=x244", +} + +var E_X245 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 245, + Name: "testdata.x245", + Tag: "bytes,245,opt,name=x245", +} + +var E_X246 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 246, + Name: "testdata.x246", + Tag: "bytes,246,opt,name=x246", +} + +var E_X247 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 247, + Name: "testdata.x247", + Tag: "bytes,247,opt,name=x247", +} + +var E_X248 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 248, + Name: "testdata.x248", + Tag: "bytes,248,opt,name=x248", +} + +var E_X249 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 249, + Name: "testdata.x249", + Tag: "bytes,249,opt,name=x249", +} + +var E_X250 = &proto.ExtensionDesc{ + ExtendedType: (*MyMessageSet)(nil), + ExtensionType: (*Empty)(nil), + Field: 250, + Name: "testdata.x250", + Tag: "bytes,250,opt,name=x250", +} + +func init() { + proto.RegisterType((*GoEnum)(nil), "testdata.GoEnum") + proto.RegisterType((*GoTestField)(nil), "testdata.GoTestField") + proto.RegisterType((*GoTest)(nil), "testdata.GoTest") + proto.RegisterType((*GoTest_RequiredGroup)(nil), "testdata.GoTest.RequiredGroup") + proto.RegisterType((*GoTest_RepeatedGroup)(nil), "testdata.GoTest.RepeatedGroup") + proto.RegisterType((*GoTest_OptionalGroup)(nil), "testdata.GoTest.OptionalGroup") + proto.RegisterType((*GoSkipTest)(nil), "testdata.GoSkipTest") + proto.RegisterType((*GoSkipTest_SkipGroup)(nil), "testdata.GoSkipTest.SkipGroup") + proto.RegisterType((*NonPackedTest)(nil), "testdata.NonPackedTest") + proto.RegisterType((*PackedTest)(nil), "testdata.PackedTest") + proto.RegisterType((*MaxTag)(nil), "testdata.MaxTag") + proto.RegisterType((*OldMessage)(nil), "testdata.OldMessage") + proto.RegisterType((*OldMessage_Nested)(nil), "testdata.OldMessage.Nested") + proto.RegisterType((*NewMessage)(nil), "testdata.NewMessage") + proto.RegisterType((*NewMessage_Nested)(nil), "testdata.NewMessage.Nested") + proto.RegisterType((*InnerMessage)(nil), "testdata.InnerMessage") + proto.RegisterType((*OtherMessage)(nil), "testdata.OtherMessage") + proto.RegisterType((*RequiredInnerMessage)(nil), "testdata.RequiredInnerMessage") + proto.RegisterType((*MyMessage)(nil), "testdata.MyMessage") + proto.RegisterType((*MyMessage_SomeGroup)(nil), "testdata.MyMessage.SomeGroup") + proto.RegisterType((*Ext)(nil), "testdata.Ext") + proto.RegisterType((*ComplexExtension)(nil), "testdata.ComplexExtension") + proto.RegisterType((*DefaultsMessage)(nil), "testdata.DefaultsMessage") + proto.RegisterType((*MyMessageSet)(nil), "testdata.MyMessageSet") + proto.RegisterType((*Empty)(nil), "testdata.Empty") + proto.RegisterType((*MessageList)(nil), "testdata.MessageList") + proto.RegisterType((*MessageList_Message)(nil), "testdata.MessageList.Message") + proto.RegisterType((*Strings)(nil), "testdata.Strings") + proto.RegisterType((*Defaults)(nil), "testdata.Defaults") + proto.RegisterType((*SubDefaults)(nil), "testdata.SubDefaults") + proto.RegisterType((*RepeatedEnum)(nil), "testdata.RepeatedEnum") + proto.RegisterType((*MoreRepeated)(nil), "testdata.MoreRepeated") + proto.RegisterType((*GroupOld)(nil), "testdata.GroupOld") + proto.RegisterType((*GroupOld_G)(nil), "testdata.GroupOld.G") + proto.RegisterType((*GroupNew)(nil), "testdata.GroupNew") + proto.RegisterType((*GroupNew_G)(nil), "testdata.GroupNew.G") + proto.RegisterType((*FloatingPoint)(nil), "testdata.FloatingPoint") + proto.RegisterType((*MessageWithMap)(nil), "testdata.MessageWithMap") + proto.RegisterType((*Oneof)(nil), "testdata.Oneof") + proto.RegisterType((*Oneof_F_Group)(nil), "testdata.Oneof.F_Group") + proto.RegisterType((*Communique)(nil), "testdata.Communique") + proto.RegisterEnum("testdata.FOO", FOO_name, FOO_value) + proto.RegisterEnum("testdata.GoTest_KIND", GoTest_KIND_name, GoTest_KIND_value) + proto.RegisterEnum("testdata.MyMessage_Color", MyMessage_Color_name, MyMessage_Color_value) + proto.RegisterEnum("testdata.DefaultsMessage_DefaultsEnum", DefaultsMessage_DefaultsEnum_name, DefaultsMessage_DefaultsEnum_value) + proto.RegisterEnum("testdata.Defaults_Color", Defaults_Color_name, Defaults_Color_value) + proto.RegisterEnum("testdata.RepeatedEnum_Color", RepeatedEnum_Color_name, RepeatedEnum_Color_value) + proto.RegisterExtension(E_Ext_More) + proto.RegisterExtension(E_Ext_Text) + proto.RegisterExtension(E_Ext_Number) + proto.RegisterExtension(E_Greeting) + proto.RegisterExtension(E_Complex) + proto.RegisterExtension(E_RComplex) + proto.RegisterExtension(E_NoDefaultDouble) + proto.RegisterExtension(E_NoDefaultFloat) + proto.RegisterExtension(E_NoDefaultInt32) + proto.RegisterExtension(E_NoDefaultInt64) + proto.RegisterExtension(E_NoDefaultUint32) + proto.RegisterExtension(E_NoDefaultUint64) + proto.RegisterExtension(E_NoDefaultSint32) + proto.RegisterExtension(E_NoDefaultSint64) + proto.RegisterExtension(E_NoDefaultFixed32) + proto.RegisterExtension(E_NoDefaultFixed64) + proto.RegisterExtension(E_NoDefaultSfixed32) + proto.RegisterExtension(E_NoDefaultSfixed64) + proto.RegisterExtension(E_NoDefaultBool) + proto.RegisterExtension(E_NoDefaultString) + proto.RegisterExtension(E_NoDefaultBytes) + proto.RegisterExtension(E_NoDefaultEnum) + proto.RegisterExtension(E_DefaultDouble) + proto.RegisterExtension(E_DefaultFloat) + proto.RegisterExtension(E_DefaultInt32) + proto.RegisterExtension(E_DefaultInt64) + proto.RegisterExtension(E_DefaultUint32) + proto.RegisterExtension(E_DefaultUint64) + proto.RegisterExtension(E_DefaultSint32) + proto.RegisterExtension(E_DefaultSint64) + proto.RegisterExtension(E_DefaultFixed32) + proto.RegisterExtension(E_DefaultFixed64) + proto.RegisterExtension(E_DefaultSfixed32) + proto.RegisterExtension(E_DefaultSfixed64) + proto.RegisterExtension(E_DefaultBool) + proto.RegisterExtension(E_DefaultString) + proto.RegisterExtension(E_DefaultBytes) + proto.RegisterExtension(E_DefaultEnum) + proto.RegisterExtension(E_X201) + proto.RegisterExtension(E_X202) + proto.RegisterExtension(E_X203) + proto.RegisterExtension(E_X204) + proto.RegisterExtension(E_X205) + proto.RegisterExtension(E_X206) + proto.RegisterExtension(E_X207) + proto.RegisterExtension(E_X208) + proto.RegisterExtension(E_X209) + proto.RegisterExtension(E_X210) + proto.RegisterExtension(E_X211) + proto.RegisterExtension(E_X212) + proto.RegisterExtension(E_X213) + proto.RegisterExtension(E_X214) + proto.RegisterExtension(E_X215) + proto.RegisterExtension(E_X216) + proto.RegisterExtension(E_X217) + proto.RegisterExtension(E_X218) + proto.RegisterExtension(E_X219) + proto.RegisterExtension(E_X220) + proto.RegisterExtension(E_X221) + proto.RegisterExtension(E_X222) + proto.RegisterExtension(E_X223) + proto.RegisterExtension(E_X224) + proto.RegisterExtension(E_X225) + proto.RegisterExtension(E_X226) + proto.RegisterExtension(E_X227) + proto.RegisterExtension(E_X228) + proto.RegisterExtension(E_X229) + proto.RegisterExtension(E_X230) + proto.RegisterExtension(E_X231) + proto.RegisterExtension(E_X232) + proto.RegisterExtension(E_X233) + proto.RegisterExtension(E_X234) + proto.RegisterExtension(E_X235) + proto.RegisterExtension(E_X236) + proto.RegisterExtension(E_X237) + proto.RegisterExtension(E_X238) + proto.RegisterExtension(E_X239) + proto.RegisterExtension(E_X240) + proto.RegisterExtension(E_X241) + proto.RegisterExtension(E_X242) + proto.RegisterExtension(E_X243) + proto.RegisterExtension(E_X244) + proto.RegisterExtension(E_X245) + proto.RegisterExtension(E_X246) + proto.RegisterExtension(E_X247) + proto.RegisterExtension(E_X248) + proto.RegisterExtension(E_X249) + proto.RegisterExtension(E_X250) +} + +var fileDescriptor0 = []byte{ + // 4407 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x5a, 0x59, 0x77, 0xdb, 0x48, + 0x76, 0x36, 0xc0, 0xfd, 0x92, 0x12, 0xa1, 0xb2, 0xda, 0x4d, 0x4b, 0x5e, 0x60, 0xce, 0x74, 0x37, + 0xbd, 0x69, 0x24, 0x10, 0xa2, 0x6d, 0xba, 0xd3, 0xe7, 0x78, 0xa1, 0x64, 0x9d, 0xb1, 0x44, 0x05, + 0x52, 0x77, 0x9f, 0xe9, 0x3c, 0xf0, 0x50, 0x22, 0x48, 0xb3, 0x4d, 0x02, 0x34, 0x09, 0xc5, 0x52, + 0xf2, 0xd2, 0x2f, 0xc9, 0x6b, 0xb6, 0x97, 0xbc, 0xe6, 0x29, 0x4f, 0x49, 0xce, 0xc9, 0x9f, 0x48, + 0xba, 0x7b, 0xd6, 0x9e, 0x35, 0xeb, 0x64, 0x5f, 0x26, 0xfb, 0x36, 0x93, 0xe4, 0xa5, 0xe7, 0xd4, + 0xad, 0x02, 0x50, 0x00, 0x09, 0x48, 0x7e, 0x12, 0x51, 0xf5, 0x7d, 0xb7, 0x6e, 0x15, 0xbe, 0xba, + 0xb7, 0x6e, 0x41, 0x00, 0x8e, 0x39, 0x71, 0x56, 0x46, 0x63, 0xdb, 0xb1, 0x49, 0x96, 0xfe, 0xee, + 0xb4, 0x9d, 0x76, 0xf9, 0x3a, 0xa4, 0x37, 0xed, 0x86, 0x75, 0x34, 0x24, 0x57, 0x21, 0xd1, 0xb5, + 0xed, 0x92, 0xa4, 0xca, 0x95, 0x79, 0x6d, 0x6e, 0xc5, 0x45, 0xac, 0x6c, 0x34, 0x9b, 0x06, 0xed, + 0x29, 0xdf, 0x81, 0xfc, 0xa6, 0xbd, 0x6f, 0x4e, 0x9c, 0x8d, 0xbe, 0x39, 0xe8, 0x90, 0x45, 0x48, + 0x3d, 0x6d, 0x1f, 0x98, 0x03, 0x64, 0xe4, 0x8c, 0xd4, 0x80, 0x3e, 0x10, 0x02, 0xc9, 0xfd, 0x93, + 0x91, 0x59, 0x92, 0xb1, 0x31, 0xe9, 0x9c, 0x8c, 0xcc, 0xf2, 0xaf, 0x5c, 0xa1, 0x83, 0x50, 0x26, + 0xb9, 0x0e, 0xc9, 0x2f, 0xf7, 0xad, 0x0e, 0x1f, 0xe5, 0x35, 0x7f, 0x14, 0xd6, 0xbf, 0xf2, 0xe5, + 0xad, 0x9d, 0xc7, 0x46, 0xf2, 0x79, 0xdf, 0x42, 0xfb, 0xfb, 0xed, 0x83, 0x01, 0x35, 0x25, 0x51, + 0xfb, 0x0e, 0x7d, 0xa0, 0xad, 0xbb, 0xed, 0x71, 0x7b, 0x58, 0x4a, 0xa8, 0x52, 0x25, 0x65, 0xa4, + 0x46, 0xf4, 0x81, 0xdc, 0x87, 0x39, 0xc3, 0x7c, 0x71, 0xd4, 0x1f, 0x9b, 0x1d, 0x74, 0xae, 0x94, + 0x54, 0xe5, 0x4a, 0x7e, 0xda, 0x3e, 0x76, 0x1a, 0x73, 0x63, 0x11, 0xcb, 0xc8, 0x23, 0xb3, 0xed, + 0xb8, 0xe4, 0x94, 0x9a, 0x88, 0x25, 0x0b, 0x58, 0x4a, 0x6e, 0x8e, 0x9c, 0xbe, 0x6d, 0xb5, 0x07, + 0x8c, 0x9c, 0x56, 0xa5, 0x18, 0xb2, 0x2d, 0x62, 0xc9, 0x9b, 0x50, 0xdc, 0x68, 0x3d, 0xb4, 0xed, + 0x41, 0xcb, 0xf5, 0xa8, 0x04, 0xaa, 0x5c, 0xc9, 0x1a, 0x73, 0x5d, 0xda, 0xea, 0x4e, 0x89, 0x54, + 0x40, 0xd9, 0x68, 0x6d, 0x59, 0x4e, 0x55, 0xf3, 0x81, 0x79, 0x55, 0xae, 0xa4, 0x8c, 0xf9, 0x2e, + 0x36, 0x4f, 0x21, 0x6b, 0xba, 0x8f, 0x2c, 0xa8, 0x72, 0x25, 0xc1, 0x90, 0x35, 0xdd, 0x43, 0xde, + 0x02, 0xb2, 0xd1, 0xda, 0xe8, 0x1f, 0x9b, 0x1d, 0xd1, 0xea, 0x9c, 0x2a, 0x57, 0x32, 0x86, 0xd2, + 0xe5, 0x1d, 0x33, 0xd0, 0xa2, 0xe5, 0x79, 0x55, 0xae, 0xa4, 0x5d, 0xb4, 0x60, 0xfb, 0x06, 0x2c, + 0x6c, 0xb4, 0xde, 0xed, 0x07, 0x1d, 0x2e, 0xaa, 0x72, 0x65, 0xce, 0x28, 0x76, 0x59, 0xfb, 0x34, + 0x56, 0x34, 0xac, 0xa8, 0x72, 0x25, 0xc9, 0xb1, 0x82, 0x5d, 0x9c, 0xdd, 0xc6, 0xc0, 0x6e, 0x3b, + 0x3e, 0x74, 0x41, 0x95, 0x2b, 0xb2, 0x31, 0xdf, 0xc5, 0xe6, 0xa0, 0xd5, 0xc7, 0xf6, 0xd1, 0xc1, + 0xc0, 0xf4, 0xa1, 0x44, 0x95, 0x2b, 0x92, 0x51, 0xec, 0xb2, 0xf6, 0x20, 0x76, 0xcf, 0x19, 0xf7, + 0xad, 0x9e, 0x8f, 0x3d, 0x8f, 0xfa, 0x2d, 0x76, 0x59, 0x7b, 0xd0, 0x83, 0x87, 0x27, 0x8e, 0x39, + 0xf1, 0xa1, 0xa6, 0x2a, 0x57, 0x0a, 0xc6, 0x7c, 0x17, 0x9b, 0x43, 0x56, 0x43, 0x6b, 0xd0, 0x55, + 0xe5, 0xca, 0x02, 0xb5, 0x3a, 0x63, 0x0d, 0xf6, 0x42, 0x6b, 0xd0, 0x53, 0xe5, 0x0a, 0xe1, 0x58, + 0x61, 0x0d, 0x44, 0xcd, 0x30, 0x21, 0x96, 0x16, 0xd5, 0x84, 0xa0, 0x19, 0xd6, 0x18, 0xd4, 0x0c, + 0x07, 0xbe, 0xa6, 0x26, 0x44, 0xcd, 0x84, 0x90, 0x38, 0x38, 0x47, 0x5e, 0x50, 0x13, 0xa2, 0x66, + 0x38, 0x32, 0xa4, 0x19, 0x8e, 0x7d, 0x5d, 0x4d, 0x04, 0x35, 0x33, 0x85, 0x16, 0x2d, 0x97, 0xd4, + 0x44, 0x50, 0x33, 0x1c, 0x1d, 0xd4, 0x0c, 0x07, 0x5f, 0x54, 0x13, 0x01, 0xcd, 0x84, 0xb1, 0xa2, + 0xe1, 0x25, 0x35, 0x11, 0xd0, 0x8c, 0x38, 0x3b, 0x57, 0x33, 0x1c, 0xba, 0xac, 0x26, 0x44, 0xcd, + 0x88, 0x56, 0x3d, 0xcd, 0x70, 0xe8, 0x25, 0x35, 0x11, 0xd0, 0x8c, 0x88, 0xf5, 0x34, 0xc3, 0xb1, + 0x97, 0xd5, 0x44, 0x40, 0x33, 0x1c, 0x7b, 0x5d, 0xd4, 0x0c, 0x87, 0x7e, 0x2c, 0xa9, 0x09, 0x51, + 0x34, 0x1c, 0x7a, 0x33, 0x20, 0x1a, 0x8e, 0xfd, 0x84, 0x62, 0x45, 0xd5, 0x84, 0xc1, 0xe2, 0x2a, + 0x7c, 0x4a, 0xc1, 0xa2, 0x6c, 0x38, 0xd8, 0x97, 0x8d, 0x1b, 0x82, 0x4a, 0x57, 0x54, 0xc9, 0x93, + 0x8d, 0x1b, 0xc3, 0x44, 0xd9, 0x78, 0xc0, 0xab, 0x18, 0x6a, 0xb9, 0x6c, 0xa6, 0x90, 0x35, 0xdd, + 0x47, 0xaa, 0xaa, 0xe4, 0xcb, 0xc6, 0x43, 0x06, 0x64, 0xe3, 0x61, 0xaf, 0xa9, 0x92, 0x28, 0x9b, + 0x19, 0x68, 0xd1, 0x72, 0x59, 0x95, 0x44, 0xd9, 0x78, 0x68, 0x51, 0x36, 0x1e, 0xf8, 0x0b, 0xaa, + 0x24, 0xc8, 0x66, 0x1a, 0x2b, 0x1a, 0xfe, 0xa2, 0x2a, 0x09, 0xb2, 0x09, 0xce, 0x8e, 0xc9, 0xc6, + 0x83, 0xbe, 0xa1, 0x4a, 0xbe, 0x6c, 0x82, 0x56, 0xb9, 0x6c, 0x3c, 0xe8, 0x9b, 0xaa, 0x24, 0xc8, + 0x26, 0x88, 0xe5, 0xb2, 0xf1, 0xb0, 0x6f, 0x61, 0x7e, 0x73, 0x65, 0xe3, 0x61, 0x05, 0xd9, 0x78, + 0xd0, 0xdf, 0xa1, 0xb9, 0xd0, 0x93, 0x8d, 0x07, 0x15, 0x65, 0xe3, 0x61, 0x7f, 0x97, 0x62, 0x7d, + 0xd9, 0x4c, 0x83, 0xc5, 0x55, 0xf8, 0x3d, 0x0a, 0xf6, 0x65, 0xe3, 0x81, 0x57, 0xd0, 0x09, 0x2a, + 0x9b, 0x8e, 0xd9, 0x6d, 0x1f, 0x0d, 0xa8, 0xc4, 0x2a, 0x54, 0x37, 0xf5, 0xa4, 0x33, 0x3e, 0x32, + 0xa9, 0x27, 0xb6, 0x3d, 0x78, 0xec, 0xf6, 0x91, 0x15, 0x6a, 0x9c, 0xc9, 0xc7, 0x27, 0x5c, 0xa7, + 0xfa, 0xa9, 0xcb, 0x55, 0xcd, 0x28, 0x32, 0x0d, 0x4d, 0xe3, 0x6b, 0xba, 0x80, 0xbf, 0x41, 0x55, + 0x54, 0x97, 0x6b, 0x3a, 0xc3, 0xd7, 0x74, 0x1f, 0x5f, 0x85, 0xf3, 0xbe, 0x94, 0x7c, 0xc6, 0x4d, + 0xaa, 0xa5, 0x7a, 0xa2, 0xaa, 0xad, 0x1a, 0x0b, 0xae, 0xa0, 0x66, 0x91, 0x02, 0xc3, 0xdc, 0xa2, + 0x92, 0xaa, 0x27, 0x6a, 0xba, 0x47, 0x12, 0x47, 0xd2, 0xa8, 0x0c, 0xb9, 0xb0, 0x7c, 0xce, 0x6d, + 0xaa, 0xac, 0x7a, 0xb2, 0xaa, 0xad, 0xae, 0x1a, 0x0a, 0xd7, 0xd7, 0x0c, 0x4e, 0x60, 0x9c, 0x15, + 0xaa, 0xb0, 0x7a, 0xb2, 0xa6, 0x7b, 0x9c, 0xe0, 0x38, 0x0b, 0xae, 0xd0, 0x7c, 0xca, 0x97, 0xa8, + 0xd2, 0xea, 0xe9, 0xea, 0x9a, 0xbe, 0xb6, 0x7e, 0xcf, 0x28, 0x32, 0xc5, 0xf9, 0x1c, 0x9d, 0x8e, + 0xc3, 0x25, 0xe7, 0x93, 0x56, 0xa9, 0xe6, 0xea, 0x69, 0xed, 0xce, 0xda, 0x5d, 0xed, 0xae, 0xa1, + 0x70, 0xed, 0xf9, 0xac, 0x77, 0x28, 0x8b, 0x8b, 0xcf, 0x67, 0xad, 0x51, 0xf5, 0xd5, 0x95, 0x67, + 0xe6, 0x60, 0x60, 0xdf, 0x52, 0xcb, 0x2f, 0xed, 0xf1, 0xa0, 0x73, 0xad, 0x0c, 0x86, 0xc2, 0xf5, + 0x28, 0x8e, 0xba, 0xe0, 0x0a, 0xd2, 0xa7, 0xff, 0x1a, 0x3d, 0x87, 0x15, 0xea, 0x99, 0x87, 0xfd, + 0x9e, 0x65, 0x4f, 0x4c, 0xa3, 0xc8, 0xa4, 0x19, 0x5a, 0x93, 0xbd, 0xf0, 0x3a, 0xfe, 0x3a, 0xa5, + 0x2d, 0xd4, 0x13, 0xb7, 0xab, 0x1a, 0x1d, 0x69, 0xd6, 0x3a, 0xee, 0x85, 0xd7, 0xf1, 0x37, 0x28, + 0x87, 0xd4, 0x13, 0xb7, 0x6b, 0x3a, 0xe7, 0x88, 0xeb, 0x78, 0x07, 0x2e, 0x84, 0xf2, 0x62, 0x6b, + 0xd4, 0x3e, 0x7c, 0x6e, 0x76, 0x4a, 0x1a, 0x4d, 0x8f, 0x0f, 0x65, 0x45, 0x32, 0xce, 0x07, 0x52, + 0xe4, 0x2e, 0x76, 0x93, 0x7b, 0xf0, 0x7a, 0x38, 0x51, 0xba, 0xcc, 0x2a, 0xcd, 0x97, 0xc8, 0x5c, + 0x0c, 0xe6, 0xcc, 0x10, 0x55, 0x08, 0xc0, 0x2e, 0x55, 0xa7, 0x09, 0xd4, 0xa7, 0xfa, 0x91, 0x98, + 0x53, 0x7f, 0x06, 0x2e, 0x4e, 0xa7, 0x52, 0x97, 0xbc, 0x4e, 0x33, 0x2a, 0x92, 0x2f, 0x84, 0xb3, + 0xea, 0x14, 0x7d, 0xc6, 0xd8, 0x35, 0x9a, 0x62, 0x45, 0xfa, 0xd4, 0xe8, 0xf7, 0xa1, 0x34, 0x95, + 0x6c, 0x5d, 0xf6, 0x1d, 0x9a, 0x73, 0x91, 0xfd, 0x5a, 0x28, 0xef, 0x86, 0xc9, 0x33, 0x86, 0xbe, + 0x4b, 0x93, 0xb0, 0x40, 0x9e, 0x1a, 0x19, 0x97, 0x2c, 0x98, 0x8e, 0x5d, 0xee, 0x3d, 0x9a, 0x95, + 0xf9, 0x92, 0x05, 0x32, 0xb3, 0x38, 0x6e, 0x28, 0x3f, 0xbb, 0xdc, 0x3a, 0x4d, 0xd3, 0x7c, 0xdc, + 0x60, 0xaa, 0xe6, 0xe4, 0xb7, 0x29, 0x79, 0x6f, 0xf6, 0x8c, 0x7f, 0x9c, 0xa0, 0x09, 0x96, 0xb3, + 0xf7, 0x66, 0x4d, 0xd9, 0x63, 0xcf, 0x98, 0xf2, 0x4f, 0x28, 0x9b, 0x08, 0xec, 0xa9, 0x39, 0x3f, + 0x06, 0xaf, 0xe2, 0xe8, 0x8d, 0xed, 0xa3, 0x51, 0x69, 0x43, 0x95, 0x2b, 0xa0, 0x5d, 0x99, 0xaa, + 0x7e, 0xdc, 0x43, 0xde, 0x26, 0x45, 0x19, 0x41, 0x12, 0xb3, 0xc2, 0xec, 0x32, 0x2b, 0xbb, 0x6a, + 0x22, 0xc2, 0x0a, 0x43, 0x79, 0x56, 0x04, 0x12, 0xb5, 0xe2, 0x06, 0x7d, 0x66, 0xe5, 0x03, 0x55, + 0x9a, 0x69, 0xc5, 0x4d, 0x01, 0xdc, 0x4a, 0x80, 0xb4, 0xb4, 0xee, 0xd7, 0x5b, 0xd8, 0x4f, 0xbe, + 0x18, 0x2e, 0xc0, 0x36, 0xf1, 0xfc, 0x1c, 0xac, 0xb4, 0x18, 0x4d, 0x70, 0x6e, 0x9a, 0xf6, 0xb3, + 0x11, 0xb4, 0x80, 0x37, 0xd3, 0xb4, 0x9f, 0x9b, 0x41, 0x2b, 0xff, 0xa6, 0x04, 0x49, 0x5a, 0x4f, + 0x92, 0x2c, 0x24, 0xdf, 0x6b, 0x6e, 0x3d, 0x56, 0xce, 0xd1, 0x5f, 0x0f, 0x9b, 0xcd, 0xa7, 0x8a, + 0x44, 0x72, 0x90, 0x7a, 0xf8, 0x95, 0xfd, 0xc6, 0x9e, 0x22, 0x93, 0x22, 0xe4, 0x37, 0xb6, 0x76, + 0x36, 0x1b, 0xc6, 0xae, 0xb1, 0xb5, 0xb3, 0xaf, 0x24, 0x68, 0xdf, 0xc6, 0xd3, 0xe6, 0x83, 0x7d, + 0x25, 0x49, 0x32, 0x90, 0xa0, 0x6d, 0x29, 0x02, 0x90, 0xde, 0xdb, 0x37, 0xb6, 0x76, 0x36, 0x95, + 0x34, 0xb5, 0xb2, 0xbf, 0xb5, 0xdd, 0x50, 0x32, 0x14, 0xb9, 0xff, 0xee, 0xee, 0xd3, 0x86, 0x92, + 0xa5, 0x3f, 0x1f, 0x18, 0xc6, 0x83, 0xaf, 0x28, 0x39, 0x4a, 0xda, 0x7e, 0xb0, 0xab, 0x00, 0x76, + 0x3f, 0x78, 0xf8, 0xb4, 0xa1, 0xe4, 0x49, 0x01, 0xb2, 0x1b, 0xef, 0xee, 0x3c, 0xda, 0xdf, 0x6a, + 0xee, 0x28, 0x85, 0xf2, 0x6f, 0xc9, 0x00, 0x9b, 0xf6, 0xde, 0xf3, 0xfe, 0x08, 0xab, 0xe2, 0xcb, + 0x00, 0x93, 0xe7, 0xfd, 0x51, 0x0b, 0xa5, 0xc7, 0x2b, 0xbb, 0x1c, 0x6d, 0xc1, 0xa0, 0x43, 0xae, + 0x41, 0x01, 0xbb, 0xbb, 0x2c, 0x14, 0x60, 0x41, 0x97, 0x31, 0xf2, 0xb4, 0x8d, 0x47, 0x87, 0x20, + 0xa4, 0xa6, 0x63, 0x1d, 0x97, 0x16, 0x20, 0x35, 0x9d, 0x5c, 0x05, 0x7c, 0x6c, 0x4d, 0x30, 0xac, + 0x63, 0xed, 0x96, 0x33, 0x70, 0x5c, 0x16, 0xe8, 0xc9, 0xdb, 0x80, 0x63, 0x32, 0x59, 0x14, 0xa7, + 0x25, 0xea, 0xba, 0xbb, 0x42, 0x7f, 0x30, 0x59, 0xf8, 0x84, 0xa5, 0x26, 0xe4, 0xbc, 0x76, 0x3a, + 0x16, 0xb6, 0xf2, 0x19, 0x29, 0x38, 0x23, 0xc0, 0x26, 0x6f, 0x4a, 0x0c, 0xc0, 0xbd, 0x59, 0x40, + 0x6f, 0x18, 0x89, 0xb9, 0x53, 0xbe, 0x0c, 0x73, 0x3b, 0xb6, 0xc5, 0xb6, 0x10, 0xae, 0x52, 0x01, + 0xa4, 0x76, 0x49, 0xc2, 0x12, 0x46, 0x6a, 0x97, 0xaf, 0x00, 0x08, 0x7d, 0x0a, 0x48, 0x07, 0xac, + 0x0f, 0x37, 0xa2, 0x74, 0x50, 0xbe, 0x09, 0xe9, 0xed, 0xf6, 0xf1, 0x7e, 0xbb, 0x47, 0xae, 0x01, + 0x0c, 0xda, 0x13, 0xa7, 0xd5, 0x45, 0xa9, 0x7c, 0xfe, 0xf9, 0xe7, 0x9f, 0x4b, 0x78, 0xe2, 0xca, + 0xd1, 0x56, 0x26, 0x95, 0x17, 0x00, 0xcd, 0x41, 0x67, 0xdb, 0x9c, 0x4c, 0xda, 0x3d, 0x93, 0x54, + 0x21, 0x6d, 0x99, 0x13, 0x9a, 0x72, 0x24, 0x2c, 0xe6, 0x97, 0xfd, 0x55, 0xf0, 0x51, 0x2b, 0x3b, + 0x08, 0x31, 0x38, 0x94, 0x28, 0x90, 0xb0, 0x8e, 0x86, 0x78, 0x59, 0x91, 0x32, 0xe8, 0xcf, 0xa5, + 0x4b, 0x90, 0x66, 0x18, 0x42, 0x20, 0x69, 0xb5, 0x87, 0x66, 0x89, 0x8d, 0x8b, 0xbf, 0xcb, 0xbf, + 0x2a, 0x01, 0xec, 0x98, 0x2f, 0xcf, 0x30, 0xa6, 0x8f, 0x8a, 0x19, 0x33, 0xc1, 0xc6, 0xbc, 0x1f, + 0x37, 0x26, 0xd5, 0x59, 0xd7, 0xb6, 0x3b, 0x2d, 0xf6, 0x8a, 0xd9, 0xbd, 0x4a, 0x8e, 0xb6, 0xe0, + 0x5b, 0x2b, 0x7f, 0x00, 0x85, 0x2d, 0xcb, 0x32, 0xc7, 0xae, 0x4f, 0x04, 0x92, 0xcf, 0xec, 0x89, + 0xc3, 0x2f, 0x78, 0xf0, 0x37, 0x29, 0x41, 0x72, 0x64, 0x8f, 0x1d, 0x36, 0xcf, 0x7a, 0x52, 0x5f, + 0x5d, 0x5d, 0x35, 0xb0, 0x85, 0x5c, 0x82, 0xdc, 0xa1, 0x6d, 0x59, 0xe6, 0x21, 0x9d, 0x44, 0x02, + 0x6b, 0x0b, 0xbf, 0xa1, 0xfc, 0xcb, 0x12, 0x14, 0x9a, 0xce, 0x33, 0xdf, 0xb8, 0x02, 0x89, 0xe7, + 0xe6, 0x09, 0xba, 0x97, 0x30, 0xe8, 0x4f, 0xb2, 0x08, 0xa9, 0x9f, 0x6f, 0x0f, 0x8e, 0xd8, 0x85, + 0x4f, 0xc1, 0x60, 0x0f, 0xe4, 0x02, 0xa4, 0x5f, 0x9a, 0xfd, 0xde, 0x33, 0x07, 0x6d, 0xca, 0x06, + 0x7f, 0x22, 0xb7, 0x20, 0xd5, 0xa7, 0xce, 0x96, 0x92, 0xb8, 0x5e, 0x17, 0xfc, 0xf5, 0x12, 0xe7, + 0x60, 0x30, 0xd0, 0x8d, 0x6c, 0xb6, 0xa3, 0x7c, 0xf4, 0xd1, 0x47, 0x1f, 0xc9, 0xe5, 0x2e, 0x2c, + 0xba, 0xb1, 0x23, 0x30, 0xd9, 0x1d, 0x28, 0x0d, 0x4c, 0xbb, 0xd5, 0xed, 0x5b, 0xed, 0xc1, 0xe0, + 0xa4, 0xf5, 0xd2, 0xb6, 0x5a, 0x6d, 0xab, 0x65, 0x4f, 0x0e, 0xdb, 0x63, 0x5c, 0x80, 0xe8, 0x21, + 0x16, 0x07, 0xa6, 0xbd, 0xc1, 0x68, 0xef, 0xdb, 0xd6, 0x03, 0xab, 0x49, 0x39, 0xe5, 0x3f, 0x48, + 0x42, 0x6e, 0xfb, 0xc4, 0xb5, 0xbe, 0x08, 0xa9, 0x43, 0xfb, 0xc8, 0x62, 0x6b, 0x99, 0x32, 0xd8, + 0x83, 0xf7, 0x8e, 0x64, 0xe1, 0x1d, 0x2d, 0x42, 0xea, 0xc5, 0x91, 0xed, 0x98, 0x38, 0xdd, 0x9c, + 0xc1, 0x1e, 0xe8, 0x6a, 0x8d, 0x4c, 0xa7, 0x94, 0xc4, 0x0a, 0x93, 0xfe, 0xf4, 0xe7, 0x9f, 0x3a, + 0xc3, 0xfc, 0xc9, 0x0a, 0xa4, 0x6d, 0xba, 0xfa, 0x93, 0x52, 0x1a, 0x2f, 0xb7, 0x04, 0xb8, 0xf8, + 0x56, 0x0c, 0x8e, 0x22, 0x5b, 0xb0, 0xf0, 0xd2, 0x6c, 0x0d, 0x8f, 0x26, 0x4e, 0xab, 0x67, 0xb7, + 0x3a, 0xa6, 0x39, 0x32, 0xc7, 0xa5, 0x39, 0x1c, 0x49, 0x88, 0x09, 0xb3, 0x16, 0xd2, 0x98, 0x7f, + 0x69, 0x6e, 0x1f, 0x4d, 0x9c, 0x4d, 0xfb, 0x31, 0xb2, 0x48, 0x15, 0x72, 0x63, 0x93, 0x46, 0x02, + 0xea, 0x6c, 0x21, 0x3c, 0x7a, 0x80, 0x9a, 0x1d, 0x9b, 0x23, 0x6c, 0x20, 0xeb, 0x90, 0x3d, 0xe8, + 0x3f, 0x37, 0x27, 0xcf, 0xcc, 0x4e, 0x29, 0xa3, 0x4a, 0x95, 0x79, 0xed, 0xa2, 0xcf, 0xf1, 0x96, + 0x75, 0xe5, 0x91, 0x3d, 0xb0, 0xc7, 0x86, 0x07, 0x25, 0xf7, 0x21, 0x37, 0xb1, 0x87, 0x26, 0xd3, + 0x77, 0x16, 0x33, 0xdb, 0xe5, 0x59, 0xbc, 0x3d, 0x7b, 0x68, 0xba, 0x11, 0xcc, 0xc5, 0x93, 0x65, + 0xe6, 0xe8, 0x01, 0x3d, 0xbf, 0x96, 0x00, 0xeb, 0x73, 0xea, 0x10, 0x9e, 0x67, 0xc9, 0x12, 0x75, + 0xa8, 0xd7, 0xa5, 0xc7, 0x92, 0x52, 0x1e, 0x8b, 0x3b, 0xef, 0x79, 0xe9, 0x16, 0xe4, 0x3c, 0x83, + 0x7e, 0xe8, 0x63, 0xe1, 0x26, 0x87, 0xf1, 0x80, 0x85, 0x3e, 0x16, 0x6b, 0xde, 0x80, 0x14, 0xba, + 0x4d, 0xd3, 0x84, 0xd1, 0xa0, 0x59, 0x29, 0x07, 0xa9, 0x4d, 0xa3, 0xd1, 0xd8, 0x51, 0x24, 0x4c, + 0x50, 0x4f, 0xdf, 0x6d, 0x28, 0xb2, 0xa0, 0xd8, 0xdf, 0x96, 0x20, 0xd1, 0x38, 0x46, 0xb5, 0xd0, + 0x69, 0xb8, 0x3b, 0x9a, 0xfe, 0xd6, 0x6a, 0x90, 0x1c, 0xda, 0x63, 0x93, 0x9c, 0x9f, 0x31, 0xcb, + 0x52, 0x0f, 0xdf, 0x97, 0x70, 0x95, 0xdb, 0x38, 0x76, 0x0c, 0xc4, 0x6b, 0x6f, 0x41, 0xd2, 0x31, + 0x8f, 0x9d, 0xd9, 0xbc, 0x67, 0x6c, 0x00, 0x0a, 0xd0, 0x6e, 0x42, 0xda, 0x3a, 0x1a, 0x1e, 0x98, + 0xe3, 0xd9, 0xd0, 0x3e, 0x4e, 0x8f, 0x43, 0xca, 0xef, 0x81, 0xf2, 0xc8, 0x1e, 0x8e, 0x06, 0xe6, + 0x71, 0xe3, 0xd8, 0x31, 0xad, 0x49, 0xdf, 0xb6, 0xa8, 0x9e, 0xbb, 0xfd, 0x31, 0x46, 0x11, 0xbc, + 0xb0, 0xc5, 0x07, 0xba, 0xab, 0x27, 0xe6, 0xa1, 0x6d, 0x75, 0x78, 0xc0, 0xe4, 0x4f, 0x14, 0xed, + 0x3c, 0xeb, 0x8f, 0x69, 0x00, 0xa1, 0x71, 0x9e, 0x3d, 0x94, 0x37, 0xa1, 0xc8, 0x0f, 0xfa, 0x13, + 0x3e, 0x70, 0xf9, 0x06, 0x14, 0xdc, 0x26, 0xbc, 0xbd, 0xce, 0x42, 0xf2, 0x83, 0x86, 0xd1, 0x54, + 0xce, 0xd1, 0x65, 0x6d, 0xee, 0x34, 0x14, 0x89, 0xfe, 0xd8, 0x7f, 0xbf, 0x19, 0x58, 0xca, 0x4b, + 0x50, 0xf0, 0x7c, 0xdf, 0x33, 0x1d, 0xec, 0xa1, 0x09, 0x21, 0x53, 0x97, 0xb3, 0x52, 0x39, 0x03, + 0xa9, 0xc6, 0x70, 0xe4, 0x9c, 0x94, 0x7f, 0x11, 0xf2, 0x1c, 0xf4, 0xb4, 0x3f, 0x71, 0xc8, 0x1d, + 0xc8, 0x0c, 0xf9, 0x7c, 0x25, 0x3c, 0x73, 0x89, 0x9a, 0xf2, 0x71, 0xee, 0x6f, 0xc3, 0x45, 0x2f, + 0x55, 0x21, 0x23, 0xc4, 0x52, 0xbe, 0xd5, 0x65, 0x71, 0xab, 0xb3, 0xa0, 0x90, 0x10, 0x82, 0x42, + 0x79, 0x1b, 0x32, 0x2c, 0x03, 0x4e, 0x30, 0xab, 0xb3, 0x7a, 0x8d, 0x89, 0x89, 0xbd, 0xf9, 0x3c, + 0x6b, 0x63, 0x57, 0xc8, 0x57, 0x21, 0x8f, 0x82, 0xe5, 0x08, 0x16, 0x3a, 0x01, 0x9b, 0x98, 0xdc, + 0x7e, 0x3f, 0x05, 0x59, 0x77, 0xa5, 0xc8, 0x32, 0xa4, 0x59, 0x91, 0x84, 0xa6, 0xdc, 0x22, 0x3e, + 0x85, 0x65, 0x11, 0x59, 0x86, 0x0c, 0x2f, 0x84, 0x78, 0x74, 0xa7, 0x15, 0x7b, 0x9a, 0x15, 0x3e, + 0x5e, 0x67, 0x4d, 0xc7, 0xc0, 0xc4, 0xca, 0xf3, 0x34, 0x2b, 0x6d, 0x88, 0x0a, 0x39, 0xaf, 0x98, + 0xc1, 0x78, 0xcc, 0x6b, 0xf1, 0xac, 0x5b, 0xbd, 0x08, 0x88, 0x9a, 0x8e, 0x11, 0x8b, 0x17, 0xde, + 0xd9, 0xae, 0x7f, 0x3c, 0xc9, 0xba, 0x25, 0x09, 0xde, 0xa1, 0xbb, 0x55, 0x76, 0x86, 0x17, 0x21, + 0x3e, 0xa0, 0xa6, 0x63, 0x48, 0x70, 0x4b, 0xea, 0x0c, 0x2f, 0x34, 0xc8, 0x55, 0xea, 0x22, 0x16, + 0x0e, 0xb8, 0xf5, 0xfd, 0xfa, 0x39, 0xcd, 0xca, 0x09, 0x72, 0x8d, 0x5a, 0x60, 0xd5, 0x01, 0xee, + 0x4b, 0xbf, 0x58, 0xce, 0xf0, 0xa2, 0x81, 0xdc, 0xa4, 0x10, 0xb6, 0xfc, 0x25, 0x88, 0xa8, 0x8c, + 0x33, 0xbc, 0x32, 0x26, 0x2a, 0x1d, 0x10, 0xc3, 0x03, 0x86, 0x04, 0xa1, 0x0a, 0x4e, 0xb3, 0x2a, + 0x98, 0x5c, 0x41, 0x73, 0x6c, 0x52, 0x05, 0xbf, 0xe2, 0xcd, 0xf0, 0x2a, 0xc3, 0xef, 0xc7, 0x23, + 0x9b, 0x57, 0xdd, 0x66, 0x78, 0x1d, 0x41, 0x6a, 0xf4, 0x7d, 0x51, 0x7d, 0x97, 0xe6, 0x31, 0x08, + 0x96, 0x7c, 0xe1, 0xb9, 0xef, 0x94, 0xc5, 0xc0, 0x3a, 0x8b, 0x20, 0x46, 0xaa, 0x8b, 0xbb, 0x61, + 0x89, 0xf2, 0x76, 0xfb, 0x56, 0xb7, 0x54, 0xc4, 0x95, 0x48, 0xf4, 0xad, 0xae, 0x91, 0xea, 0xd2, + 0x16, 0xa6, 0x81, 0x1d, 0xda, 0xa7, 0x60, 0x5f, 0xf2, 0x36, 0xeb, 0xa4, 0x4d, 0xa4, 0x04, 0xa9, + 0x8d, 0xd6, 0x4e, 0xdb, 0x2a, 0x2d, 0x30, 0x9e, 0xd5, 0xb6, 0x8c, 0x64, 0x77, 0xa7, 0x6d, 0x91, + 0xb7, 0x20, 0x31, 0x39, 0x3a, 0x28, 0x91, 0xf0, 0xe7, 0x8d, 0xbd, 0xa3, 0x03, 0xd7, 0x15, 0x83, + 0x22, 0xc8, 0x32, 0x64, 0x27, 0xce, 0xb8, 0xf5, 0x0b, 0xe6, 0xd8, 0x2e, 0x9d, 0xc7, 0x25, 0x3c, + 0x67, 0x64, 0x26, 0xce, 0xf8, 0x03, 0x73, 0x6c, 0x9f, 0x31, 0xf8, 0x95, 0xaf, 0x40, 0x5e, 0xb0, + 0x4b, 0x8a, 0x20, 0x59, 0xec, 0xa4, 0x50, 0x97, 0xee, 0x18, 0x92, 0x55, 0xde, 0x87, 0x82, 0x5b, + 0x48, 0xe0, 0x7c, 0x35, 0xba, 0x93, 0x06, 0xf6, 0x18, 0xf7, 0xe7, 0xbc, 0x76, 0x49, 0x4c, 0x51, + 0x3e, 0x8c, 0xa7, 0x0b, 0x06, 0x2d, 0x2b, 0x21, 0x57, 0xa4, 0xf2, 0x0f, 0x25, 0x28, 0x6c, 0xdb, + 0x63, 0xff, 0x96, 0x77, 0x11, 0x52, 0x07, 0xb6, 0x3d, 0x98, 0xa0, 0xd9, 0xac, 0xc1, 0x1e, 0xc8, + 0x1b, 0x50, 0xc0, 0x1f, 0x6e, 0x01, 0x28, 0x7b, 0xf7, 0x0b, 0x79, 0x6c, 0xe7, 0x55, 0x1f, 0x81, + 0x64, 0xdf, 0x72, 0x26, 0x3c, 0x92, 0xe1, 0x6f, 0xf2, 0x05, 0xc8, 0xd3, 0xbf, 0x2e, 0x33, 0xe9, + 0x1d, 0x58, 0x81, 0x36, 0x73, 0xe2, 0x5b, 0x30, 0x87, 0x6f, 0xdf, 0x83, 0x65, 0xbc, 0xbb, 0x84, + 0x02, 0xeb, 0xe0, 0xc0, 0x12, 0x64, 0x58, 0x28, 0x98, 0xe0, 0x27, 0xab, 0x9c, 0xe1, 0x3e, 0xd2, + 0xf0, 0x8a, 0x95, 0x00, 0x4b, 0xf7, 0x19, 0x83, 0x3f, 0x95, 0x1f, 0x40, 0x16, 0xb3, 0x54, 0x73, + 0xd0, 0x21, 0x65, 0x90, 0x7a, 0x25, 0x13, 0x73, 0xe4, 0xa2, 0x70, 0xcc, 0xe7, 0xdd, 0x2b, 0x9b, + 0x86, 0xd4, 0x5b, 0x5a, 0x00, 0x69, 0x93, 0x9e, 0xbb, 0x8f, 0x79, 0x98, 0x96, 0x8e, 0xcb, 0x4d, + 0x6e, 0x62, 0xc7, 0x7c, 0x19, 0x67, 0x62, 0xc7, 0x7c, 0xc9, 0x4c, 0x5c, 0x9d, 0x32, 0x41, 0x9f, + 0x4e, 0xf8, 0xf7, 0x3b, 0xe9, 0x84, 0x9e, 0xf3, 0x71, 0x7b, 0xf6, 0xad, 0xde, 0xae, 0xdd, 0xb7, + 0xf0, 0x9c, 0xdf, 0xc5, 0x73, 0x92, 0x64, 0x48, 0xdd, 0xf2, 0x67, 0x49, 0x98, 0xe7, 0x41, 0xf4, + 0xfd, 0xbe, 0xf3, 0x6c, 0xbb, 0x3d, 0x22, 0x4f, 0xa1, 0x40, 0xe3, 0x67, 0x6b, 0xd8, 0x1e, 0x8d, + 0xe8, 0x46, 0x95, 0xf0, 0x50, 0x71, 0x7d, 0x2a, 0x28, 0x73, 0xfc, 0xca, 0x4e, 0x7b, 0x68, 0x6e, + 0x33, 0x6c, 0xc3, 0x72, 0xc6, 0x27, 0x46, 0xde, 0xf2, 0x5b, 0xc8, 0x16, 0xe4, 0x87, 0x93, 0x9e, + 0x67, 0x4c, 0x46, 0x63, 0x95, 0x48, 0x63, 0xdb, 0x93, 0x5e, 0xc0, 0x16, 0x0c, 0xbd, 0x06, 0xea, + 0x18, 0x8d, 0xbc, 0x9e, 0xad, 0xc4, 0x29, 0x8e, 0xd1, 0x20, 0x11, 0x74, 0xec, 0xc0, 0x6f, 0x21, + 0x8f, 0x01, 0xe8, 0x46, 0x72, 0x6c, 0x5a, 0x24, 0xa1, 0x56, 0xf2, 0xda, 0x9b, 0x91, 0xb6, 0xf6, + 0x9c, 0xf1, 0xbe, 0xbd, 0xe7, 0x8c, 0x99, 0x21, 0xba, 0x05, 0xf1, 0x71, 0xe9, 0x1d, 0x50, 0xc2, + 0xf3, 0x17, 0xcf, 0xde, 0xa9, 0x19, 0x67, 0xef, 0x1c, 0x3f, 0x7b, 0xd7, 0xe5, 0xbb, 0xd2, 0xd2, + 0x7b, 0x50, 0x0c, 0x4d, 0x59, 0xa4, 0x13, 0x46, 0xbf, 0x2d, 0xd2, 0xf3, 0xda, 0xeb, 0xc2, 0xd7, + 0x63, 0xf1, 0xd5, 0x8a, 0x76, 0xdf, 0x01, 0x25, 0x3c, 0x7d, 0xd1, 0x70, 0x36, 0xa6, 0x26, 0x40, + 0xfe, 0x7d, 0x98, 0x0b, 0x4c, 0x59, 0x24, 0xe7, 0x4e, 0x99, 0x54, 0xf9, 0x97, 0x52, 0x90, 0x6a, + 0x5a, 0xa6, 0xdd, 0x25, 0xaf, 0x07, 0x33, 0xe2, 0x93, 0x73, 0x6e, 0x36, 0xbc, 0x18, 0xca, 0x86, + 0x4f, 0xce, 0x79, 0xb9, 0xf0, 0x62, 0x28, 0x17, 0xba, 0x5d, 0x35, 0x9d, 0x5c, 0x9e, 0xca, 0x84, + 0x4f, 0xce, 0x09, 0x69, 0xf0, 0xf2, 0x54, 0x1a, 0xf4, 0xbb, 0x6b, 0x3a, 0x0d, 0x9d, 0xc1, 0x1c, + 0xf8, 0xe4, 0x9c, 0x9f, 0xff, 0x96, 0xc3, 0xf9, 0xcf, 0xeb, 0xac, 0xe9, 0xcc, 0x25, 0x21, 0xf7, + 0xa1, 0x4b, 0x2c, 0xeb, 0x2d, 0x87, 0xb3, 0x1e, 0xf2, 0x78, 0xbe, 0x5b, 0x0e, 0xe7, 0x3b, 0xec, + 0xe4, 0xf9, 0xed, 0x62, 0x28, 0xbf, 0xa1, 0x51, 0x96, 0xd8, 0x96, 0xc3, 0x89, 0x8d, 0xf1, 0x04, + 0x4f, 0xc5, 0xac, 0xe6, 0x75, 0xd6, 0x74, 0xa2, 0x85, 0x52, 0x5a, 0xf4, 0xb9, 0x1e, 0xdf, 0x05, + 0x86, 0x77, 0x9d, 0x2e, 0x9b, 0x7b, 0xe4, 0x2c, 0xc6, 0x7c, 0x60, 0xc7, 0xd5, 0x74, 0x8f, 0x5c, + 0x1a, 0x64, 0xba, 0xbc, 0xd4, 0x55, 0x30, 0x46, 0x09, 0xb2, 0xc4, 0x97, 0xbf, 0xb2, 0xd1, 0xc2, + 0x58, 0x85, 0xf3, 0x62, 0xa7, 0xf7, 0x0a, 0xcc, 0x6d, 0xb4, 0x9e, 0xb6, 0xc7, 0x3d, 0x73, 0xe2, + 0xb4, 0xf6, 0xdb, 0x3d, 0xef, 0xba, 0x80, 0xbe, 0xff, 0x7c, 0x97, 0xf7, 0xec, 0xb7, 0x7b, 0xe4, + 0x82, 0x2b, 0xae, 0x0e, 0xf6, 0x4a, 0x5c, 0x5e, 0x4b, 0xaf, 0xd3, 0x45, 0x63, 0xc6, 0x30, 0xea, + 0x2d, 0xf0, 0xa8, 0xf7, 0x30, 0x03, 0xa9, 0x23, 0xab, 0x6f, 0x5b, 0x0f, 0x73, 0x90, 0x71, 0xec, + 0xf1, 0xb0, 0xed, 0xd8, 0xe5, 0x1f, 0x49, 0x00, 0x8f, 0xec, 0xe1, 0xf0, 0xc8, 0xea, 0xbf, 0x38, + 0x32, 0xc9, 0x15, 0xc8, 0x0f, 0xdb, 0xcf, 0xcd, 0xd6, 0xd0, 0x6c, 0x1d, 0x8e, 0xdd, 0x7d, 0x90, + 0xa3, 0x4d, 0xdb, 0xe6, 0xa3, 0xf1, 0x09, 0x29, 0xb9, 0x87, 0x71, 0xd4, 0x0e, 0x4a, 0x92, 0x1f, + 0xce, 0x17, 0xf9, 0xf1, 0x32, 0xcd, 0xdf, 0xa1, 0x7b, 0xc0, 0x64, 0x15, 0x43, 0x86, 0xbf, 0x3d, + 0x7c, 0xa2, 0x92, 0x77, 0xcc, 0xe1, 0xa8, 0x75, 0x88, 0x52, 0xa1, 0x72, 0x48, 0xd1, 0xe7, 0x47, + 0xe4, 0x36, 0x24, 0x0e, 0xed, 0x01, 0x8a, 0xe4, 0x94, 0xf7, 0x42, 0x71, 0xe4, 0x0d, 0x48, 0x0c, + 0x27, 0x4c, 0x36, 0x79, 0x6d, 0x41, 0x38, 0x11, 0xb0, 0x24, 0x44, 0x61, 0xc3, 0x49, 0xcf, 0x9b, + 0xf7, 0x8d, 0x22, 0x24, 0x36, 0x9a, 0x4d, 0x9a, 0xe5, 0x37, 0x9a, 0xcd, 0x35, 0x45, 0xaa, 0x7f, + 0x09, 0xb2, 0xbd, 0xb1, 0x69, 0xd2, 0xf0, 0x30, 0xbb, 0xba, 0xf8, 0x10, 0xb3, 0x9a, 0x07, 0xaa, + 0x6f, 0x43, 0xe6, 0x90, 0xd5, 0x17, 0x24, 0xa2, 0x80, 0x2d, 0xfd, 0x21, 0xbb, 0x3e, 0x59, 0xf2, + 0xbb, 0xc3, 0x15, 0x89, 0xe1, 0xda, 0xa8, 0xef, 0x42, 0x6e, 0xdc, 0x3a, 0xcd, 0xe0, 0xc7, 0x2c, + 0xbb, 0xc4, 0x19, 0xcc, 0x8e, 0x79, 0x53, 0xbd, 0x01, 0x0b, 0x96, 0xed, 0x7e, 0xb2, 0x68, 0x75, + 0xd8, 0x1e, 0xbb, 0x38, 0x7d, 0x68, 0x73, 0x8d, 0x9b, 0xec, 0x33, 0xa1, 0x65, 0xf3, 0x0e, 0xb6, + 0x2b, 0xeb, 0x8f, 0x40, 0x11, 0xcc, 0x60, 0x91, 0x19, 0x67, 0xa5, 0xcb, 0xbe, 0x4b, 0x7a, 0x56, + 0x70, 0xdf, 0x87, 0x8c, 0xb0, 0x9d, 0x19, 0x63, 0xa4, 0xc7, 0x3e, 0xf2, 0x7a, 0x46, 0x30, 0xd4, + 0x4d, 0x1b, 0xa1, 0xb1, 0x26, 0xda, 0xc8, 0x33, 0xf6, 0xfd, 0x57, 0x34, 0x52, 0xd3, 0x43, 0xab, + 0x72, 0x74, 0xaa, 0x2b, 0x7d, 0xf6, 0xf9, 0xd6, 0xb3, 0xc2, 0x02, 0xe0, 0x0c, 0x33, 0xf1, 0xce, + 0x7c, 0xc8, 0xbe, 0xec, 0x06, 0xcc, 0x4c, 0x79, 0x33, 0x39, 0xd5, 0x9b, 0xe7, 0xec, 0x33, 0xaa, + 0x67, 0x66, 0x6f, 0x96, 0x37, 0x93, 0x53, 0xbd, 0x19, 0xb0, 0x0f, 0xac, 0x01, 0x33, 0x35, 0xbd, + 0xbe, 0x09, 0x44, 0x7c, 0xd5, 0x3c, 0x4f, 0xc4, 0xd8, 0x19, 0xb2, 0xcf, 0xe6, 0xfe, 0xcb, 0x66, + 0x94, 0x59, 0x86, 0xe2, 0x1d, 0xb2, 0xd8, 0x17, 0xf5, 0xa0, 0xa1, 0x9a, 0x5e, 0xdf, 0x82, 0xf3, + 0xe2, 0xc4, 0xce, 0xe0, 0x92, 0xad, 0x4a, 0x95, 0xa2, 0xb1, 0xe0, 0x4f, 0x8d, 0x73, 0x66, 0x9a, + 0x8a, 0x77, 0x6a, 0xa4, 0x4a, 0x15, 0x65, 0xca, 0x54, 0x4d, 0xaf, 0x3f, 0x80, 0xa2, 0x60, 0xea, + 0x00, 0x33, 0x74, 0xb4, 0x99, 0x17, 0xec, 0x5f, 0x1b, 0x3c, 0x33, 0x34, 0xa3, 0x87, 0xdf, 0x18, + 0xcf, 0x71, 0xd1, 0x46, 0xc6, 0xec, 0xbb, 0xbc, 0xef, 0x0b, 0x32, 0x42, 0x5b, 0x02, 0x2b, 0xed, + 0x38, 0x2b, 0x13, 0xf6, 0xc5, 0xde, 0x77, 0x85, 0x12, 0xea, 0xfd, 0xc0, 0x74, 0x4c, 0x9a, 0xe4, + 0x62, 0x6c, 0x38, 0x18, 0x91, 0xdf, 0x8c, 0x04, 0xac, 0x88, 0x57, 0x21, 0xc2, 0xb4, 0xe9, 0x63, + 0x7d, 0x0b, 0xe6, 0xcf, 0x1e, 0x90, 0x3e, 0x96, 0x58, 0x5d, 0x5c, 0x5d, 0xa1, 0xa5, 0xb3, 0x31, + 0xd7, 0x09, 0xc4, 0xa5, 0x06, 0xcc, 0x9d, 0x39, 0x28, 0x7d, 0x22, 0xb1, 0xea, 0x92, 0x5a, 0x32, + 0x0a, 0x9d, 0x60, 0x64, 0x9a, 0x3b, 0x73, 0x58, 0xfa, 0x54, 0x62, 0x57, 0x11, 0xba, 0xe6, 0x19, + 0x71, 0x23, 0xd3, 0xdc, 0x99, 0xc3, 0xd2, 0x57, 0x59, 0xed, 0x28, 0xeb, 0x55, 0xd1, 0x08, 0xc6, + 0x82, 0xf9, 0xb3, 0x87, 0xa5, 0xaf, 0x49, 0x78, 0x2d, 0x21, 0xeb, 0xba, 0xb7, 0x2e, 0x5e, 0x64, + 0x9a, 0x3f, 0x7b, 0x58, 0xfa, 0xba, 0x84, 0x97, 0x17, 0xb2, 0xbe, 0x1e, 0x30, 0x13, 0xf4, 0xe6, + 0xf4, 0xb0, 0xf4, 0x0d, 0x09, 0xef, 0x13, 0x64, 0xbd, 0xe6, 0x99, 0xd9, 0x9b, 0xf2, 0xe6, 0xf4, + 0xb0, 0xf4, 0x4d, 0x3c, 0xc5, 0xd7, 0x65, 0xfd, 0x4e, 0xc0, 0x0c, 0x46, 0xa6, 0xe2, 0x2b, 0x84, + 0xa5, 0x6f, 0x49, 0x78, 0xed, 0x23, 0xeb, 0x77, 0x0d, 0x77, 0x74, 0x3f, 0x32, 0x15, 0x5f, 0x21, + 0x2c, 0x7d, 0x26, 0xe1, 0xed, 0x90, 0xac, 0xdf, 0x0b, 0x1a, 0xc2, 0xc8, 0xa4, 0xbc, 0x4a, 0x58, + 0xfa, 0x36, 0xb5, 0x54, 0xac, 0xcb, 0xeb, 0xab, 0x86, 0xeb, 0x80, 0x10, 0x99, 0x94, 0x57, 0x09, + 0x4b, 0xdf, 0xa1, 0xa6, 0x94, 0xba, 0xbc, 0xbe, 0x16, 0x32, 0x55, 0xd3, 0xeb, 0x8f, 0xa0, 0x70, + 0xd6, 0xb0, 0xf4, 0x5d, 0xf1, 0xd6, 0x2d, 0xdf, 0x11, 0x62, 0xd3, 0xae, 0xf0, 0xce, 0x4e, 0x0d, + 0x4c, 0xdf, 0xc3, 0x1a, 0xa7, 0x3e, 0xf7, 0x84, 0xdd, 0x4c, 0x31, 0x82, 0xff, 0xfa, 0x58, 0x98, + 0xda, 0xf6, 0xf7, 0xc7, 0xa9, 0x31, 0xea, 0xfb, 0x12, 0x5e, 0x5f, 0x15, 0xb8, 0x41, 0xc4, 0x7b, + 0x3b, 0x85, 0x05, 0xac, 0x0f, 0xfd, 0x59, 0x9e, 0x16, 0xad, 0x7e, 0x20, 0xbd, 0x4a, 0xb8, 0xaa, + 0x27, 0x9a, 0x3b, 0x0d, 0x6f, 0x31, 0xb0, 0xe5, 0x6d, 0x48, 0x1e, 0x6b, 0xab, 0x6b, 0xe2, 0x91, + 0x4c, 0xbc, 0xb5, 0x65, 0x41, 0x2a, 0xaf, 0x15, 0x85, 0x8b, 0xed, 0xe1, 0xc8, 0x39, 0x31, 0x90, + 0xc5, 0xd9, 0x5a, 0x24, 0xfb, 0x93, 0x18, 0xb6, 0xc6, 0xd9, 0xd5, 0x48, 0xf6, 0xa7, 0x31, 0xec, + 0x2a, 0x67, 0xeb, 0x91, 0xec, 0xaf, 0xc6, 0xb0, 0x75, 0xce, 0x5e, 0x8f, 0x64, 0x7f, 0x2d, 0x86, + 0xbd, 0xce, 0xd9, 0xb5, 0x48, 0xf6, 0xd7, 0x63, 0xd8, 0x35, 0xce, 0xbe, 0x13, 0xc9, 0xfe, 0x46, + 0x0c, 0xfb, 0x0e, 0x67, 0xdf, 0x8d, 0x64, 0x7f, 0x33, 0x86, 0x7d, 0x97, 0xb3, 0xef, 0x45, 0xb2, + 0xbf, 0x15, 0xc3, 0xbe, 0xc7, 0xd8, 0x6b, 0xab, 0x91, 0xec, 0xcf, 0xa2, 0xd9, 0x6b, 0xab, 0x9c, + 0x1d, 0xad, 0xb5, 0x6f, 0xc7, 0xb0, 0xb9, 0xd6, 0xd6, 0xa2, 0xb5, 0xf6, 0x9d, 0x18, 0x36, 0xd7, + 0xda, 0x5a, 0xb4, 0xd6, 0xbe, 0x1b, 0xc3, 0xe6, 0x5a, 0x5b, 0x8b, 0xd6, 0xda, 0xf7, 0x62, 0xd8, + 0x5c, 0x6b, 0x6b, 0xd1, 0x5a, 0xfb, 0x7e, 0x0c, 0x9b, 0x6b, 0x6d, 0x2d, 0x5a, 0x6b, 0x3f, 0x88, + 0x61, 0x73, 0xad, 0xad, 0x45, 0x6b, 0xed, 0x8f, 0x62, 0xd8, 0x5c, 0x6b, 0x6b, 0xd1, 0x5a, 0xfb, + 0xe3, 0x18, 0x36, 0xd7, 0xda, 0x5a, 0xb4, 0xd6, 0xfe, 0x24, 0x86, 0xcd, 0xb5, 0xa6, 0x45, 0x6b, + 0xed, 0x4f, 0xa3, 0xd9, 0x1a, 0xd7, 0x9a, 0x16, 0xad, 0xb5, 0x3f, 0x8b, 0x61, 0x73, 0xad, 0x69, + 0xd1, 0x5a, 0xfb, 0xf3, 0x18, 0x36, 0xd7, 0x9a, 0x16, 0xad, 0xb5, 0x1f, 0xc6, 0xb0, 0xb9, 0xd6, + 0xb4, 0x68, 0xad, 0xfd, 0x45, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0x5f, 0xc6, 0xb0, 0xb9, + 0xd6, 0xb4, 0x68, 0xad, 0xfd, 0x55, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0x5f, 0xc7, 0xb0, + 0xb9, 0xd6, 0xb4, 0x68, 0xad, 0xfd, 0x4d, 0x0c, 0x9b, 0x6b, 0x4d, 0x8b, 0xd6, 0xda, 0xdf, 0xc6, + 0xb0, 0xb9, 0xd6, 0xaa, 0xd1, 0x5a, 0xfb, 0xbb, 0x68, 0x76, 0x95, 0x6b, 0xad, 0x1a, 0xad, 0xb5, + 0xbf, 0x8f, 0x61, 0x73, 0xad, 0x55, 0xa3, 0xb5, 0xf6, 0x0f, 0x31, 0x6c, 0xae, 0xb5, 0x6a, 0xb4, + 0xd6, 0xfe, 0x31, 0x86, 0xcd, 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0x8f, 0x62, 0xd8, 0x5c, 0x6b, 0xd5, + 0x68, 0xad, 0xfd, 0x53, 0x0c, 0x9b, 0x6b, 0xad, 0x1a, 0xad, 0xb5, 0x7f, 0x8e, 0x61, 0x73, 0xad, + 0x55, 0xa3, 0xb5, 0xf6, 0x2f, 0x31, 0x6c, 0xae, 0xb5, 0x6a, 0xb4, 0xd6, 0xfe, 0x35, 0x86, 0xcd, + 0xb5, 0x56, 0x8d, 0xd6, 0xda, 0xbf, 0xc5, 0xb0, 0xb9, 0xd6, 0xf4, 0x68, 0xad, 0xfd, 0x7b, 0x34, + 0x5b, 0xe7, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x1f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, 0x6b, 0xff, + 0x19, 0xc3, 0xe6, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x5f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, 0x6b, + 0xff, 0x1d, 0xc3, 0xe6, 0x5a, 0xd3, 0xa3, 0xb5, 0xf6, 0x3f, 0x31, 0x6c, 0xae, 0x35, 0x3d, 0x5a, + 0x6b, 0x3f, 0x8e, 0x61, 0x73, 0xad, 0xe9, 0xd1, 0x5a, 0xfb, 0x49, 0x0c, 0x9b, 0x6b, 0x4d, 0x8f, + 0xd6, 0xda, 0xff, 0xc6, 0xb0, 0xb9, 0xd6, 0xf4, 0x68, 0xad, 0xfd, 0x5f, 0x0c, 0x9b, 0x6b, 0x6d, + 0x3d, 0x5a, 0x6b, 0xff, 0x1f, 0xcd, 0x5e, 0x5f, 0xfd, 0x69, 0x00, 0x00, 0x00, 0xff, 0xff, 0x81, + 0x23, 0xc6, 0xe6, 0xc6, 0x38, 0x00, 0x00, +} diff --git a/vendor/src/github.com/golang/protobuf/proto/testdata/test.proto b/vendor/src/github.com/golang/protobuf/proto/testdata/test.proto new file mode 100644 index 0000000..f607113 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/testdata/test.proto @@ -0,0 +1,540 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A feature-rich test file for the protocol compiler and libraries. + +syntax = "proto2"; + +package testdata; + +enum FOO { FOO1 = 1; }; + +message GoEnum { + required FOO foo = 1; +} + +message GoTestField { + required string Label = 1; + required string Type = 2; +} + +message GoTest { + // An enum, for completeness. + enum KIND { + VOID = 0; + + // Basic types + BOOL = 1; + BYTES = 2; + FINGERPRINT = 3; + FLOAT = 4; + INT = 5; + STRING = 6; + TIME = 7; + + // Groupings + TUPLE = 8; + ARRAY = 9; + MAP = 10; + + // Table types + TABLE = 11; + + // Functions + FUNCTION = 12; // last tag + }; + + // Some typical parameters + required KIND Kind = 1; + optional string Table = 2; + optional int32 Param = 3; + + // Required, repeated and optional foreign fields. + required GoTestField RequiredField = 4; + repeated GoTestField RepeatedField = 5; + optional GoTestField OptionalField = 6; + + // Required fields of all basic types + required bool F_Bool_required = 10; + required int32 F_Int32_required = 11; + required int64 F_Int64_required = 12; + required fixed32 F_Fixed32_required = 13; + required fixed64 F_Fixed64_required = 14; + required uint32 F_Uint32_required = 15; + required uint64 F_Uint64_required = 16; + required float F_Float_required = 17; + required double F_Double_required = 18; + required string F_String_required = 19; + required bytes F_Bytes_required = 101; + required sint32 F_Sint32_required = 102; + required sint64 F_Sint64_required = 103; + + // Repeated fields of all basic types + repeated bool F_Bool_repeated = 20; + repeated int32 F_Int32_repeated = 21; + repeated int64 F_Int64_repeated = 22; + repeated fixed32 F_Fixed32_repeated = 23; + repeated fixed64 F_Fixed64_repeated = 24; + repeated uint32 F_Uint32_repeated = 25; + repeated uint64 F_Uint64_repeated = 26; + repeated float F_Float_repeated = 27; + repeated double F_Double_repeated = 28; + repeated string F_String_repeated = 29; + repeated bytes F_Bytes_repeated = 201; + repeated sint32 F_Sint32_repeated = 202; + repeated sint64 F_Sint64_repeated = 203; + + // Optional fields of all basic types + optional bool F_Bool_optional = 30; + optional int32 F_Int32_optional = 31; + optional int64 F_Int64_optional = 32; + optional fixed32 F_Fixed32_optional = 33; + optional fixed64 F_Fixed64_optional = 34; + optional uint32 F_Uint32_optional = 35; + optional uint64 F_Uint64_optional = 36; + optional float F_Float_optional = 37; + optional double F_Double_optional = 38; + optional string F_String_optional = 39; + optional bytes F_Bytes_optional = 301; + optional sint32 F_Sint32_optional = 302; + optional sint64 F_Sint64_optional = 303; + + // Default-valued fields of all basic types + optional bool F_Bool_defaulted = 40 [default=true]; + optional int32 F_Int32_defaulted = 41 [default=32]; + optional int64 F_Int64_defaulted = 42 [default=64]; + optional fixed32 F_Fixed32_defaulted = 43 [default=320]; + optional fixed64 F_Fixed64_defaulted = 44 [default=640]; + optional uint32 F_Uint32_defaulted = 45 [default=3200]; + optional uint64 F_Uint64_defaulted = 46 [default=6400]; + optional float F_Float_defaulted = 47 [default=314159.]; + optional double F_Double_defaulted = 48 [default=271828.]; + optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; + optional sint32 F_Sint32_defaulted = 402 [default = -32]; + optional sint64 F_Sint64_defaulted = 403 [default = -64]; + + // Packed repeated fields (no string or bytes). + repeated bool F_Bool_repeated_packed = 50 [packed=true]; + repeated int32 F_Int32_repeated_packed = 51 [packed=true]; + repeated int64 F_Int64_repeated_packed = 52 [packed=true]; + repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; + repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; + repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; + repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; + repeated float F_Float_repeated_packed = 57 [packed=true]; + repeated double F_Double_repeated_packed = 58 [packed=true]; + repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; + repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; + + // Required, repeated, and optional groups. + required group RequiredGroup = 70 { + required string RequiredField = 71; + }; + + repeated group RepeatedGroup = 80 { + required string RequiredField = 81; + }; + + optional group OptionalGroup = 90 { + required string RequiredField = 91; + }; +} + +// For testing skipping of unrecognized fields. +// Numbers are all big, larger than tag numbers in GoTestField, +// the message used in the corresponding test. +message GoSkipTest { + required int32 skip_int32 = 11; + required fixed32 skip_fixed32 = 12; + required fixed64 skip_fixed64 = 13; + required string skip_string = 14; + required group SkipGroup = 15 { + required int32 group_int32 = 16; + required string group_string = 17; + } +} + +// For testing packed/non-packed decoder switching. +// A serialized instance of one should be deserializable as the other. +message NonPackedTest { + repeated int32 a = 1; +} + +message PackedTest { + repeated int32 b = 1 [packed=true]; +} + +message MaxTag { + // Maximum possible tag number. + optional string last_field = 536870911; +} + +message OldMessage { + message Nested { + optional string name = 1; + } + optional Nested nested = 1; + + optional int32 num = 2; +} + +// NewMessage is wire compatible with OldMessage; +// imagine it as a future version. +message NewMessage { + message Nested { + optional string name = 1; + optional string food_group = 2; + } + optional Nested nested = 1; + + // This is an int32 in OldMessage. + optional int64 num = 2; +} + +// Smaller tests for ASCII formatting. + +message InnerMessage { + required string host = 1; + optional int32 port = 2 [default=4000]; + optional bool connected = 3; +} + +message OtherMessage { + optional int64 key = 1; + optional bytes value = 2; + optional float weight = 3; + optional InnerMessage inner = 4; + + extensions 100 to max; +} + +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + +message MyMessage { + required int32 count = 1; + optional string name = 2; + optional string quote = 3; + repeated string pet = 4; + optional InnerMessage inner = 5; + repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; + repeated InnerMessage rep_inner = 12; + + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + }; + optional Color bikeshed = 7; + + optional group SomeGroup = 8 { + optional int32 group_field = 9; + } + + // This field becomes [][]byte in the generated code. + repeated bytes rep_bytes = 10; + + optional double bigfloat = 11; + + extensions 100 to max; +} + +message Ext { + extend MyMessage { + optional Ext more = 103; + optional string text = 104; + optional int32 number = 105; + } + + optional string data = 1; +} + +extend MyMessage { + repeated string greeting = 106; +} + +message ComplexExtension { + optional int32 first = 1; + optional int32 second = 2; + repeated int32 third = 3; +} + +extend OtherMessage { + optional ComplexExtension complex = 200; + repeated ComplexExtension r_complex = 201; +} + +message DefaultsMessage { + enum DefaultsEnum { + ZERO = 0; + ONE = 1; + TWO = 2; + }; + extensions 100 to max; +} + +extend DefaultsMessage { + optional double no_default_double = 101; + optional float no_default_float = 102; + optional int32 no_default_int32 = 103; + optional int64 no_default_int64 = 104; + optional uint32 no_default_uint32 = 105; + optional uint64 no_default_uint64 = 106; + optional sint32 no_default_sint32 = 107; + optional sint64 no_default_sint64 = 108; + optional fixed32 no_default_fixed32 = 109; + optional fixed64 no_default_fixed64 = 110; + optional sfixed32 no_default_sfixed32 = 111; + optional sfixed64 no_default_sfixed64 = 112; + optional bool no_default_bool = 113; + optional string no_default_string = 114; + optional bytes no_default_bytes = 115; + optional DefaultsMessage.DefaultsEnum no_default_enum = 116; + + optional double default_double = 201 [default = 3.1415]; + optional float default_float = 202 [default = 3.14]; + optional int32 default_int32 = 203 [default = 42]; + optional int64 default_int64 = 204 [default = 43]; + optional uint32 default_uint32 = 205 [default = 44]; + optional uint64 default_uint64 = 206 [default = 45]; + optional sint32 default_sint32 = 207 [default = 46]; + optional sint64 default_sint64 = 208 [default = 47]; + optional fixed32 default_fixed32 = 209 [default = 48]; + optional fixed64 default_fixed64 = 210 [default = 49]; + optional sfixed32 default_sfixed32 = 211 [default = 50]; + optional sfixed64 default_sfixed64 = 212 [default = 51]; + optional bool default_bool = 213 [default = true]; + optional string default_string = 214 [default = "Hello, string"]; + optional bytes default_bytes = 215 [default = "Hello, bytes"]; + optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; +} + +message MyMessageSet { + option message_set_wire_format = true; + extensions 100 to max; +} + +message Empty { +} + +extend MyMessageSet { + optional Empty x201 = 201; + optional Empty x202 = 202; + optional Empty x203 = 203; + optional Empty x204 = 204; + optional Empty x205 = 205; + optional Empty x206 = 206; + optional Empty x207 = 207; + optional Empty x208 = 208; + optional Empty x209 = 209; + optional Empty x210 = 210; + optional Empty x211 = 211; + optional Empty x212 = 212; + optional Empty x213 = 213; + optional Empty x214 = 214; + optional Empty x215 = 215; + optional Empty x216 = 216; + optional Empty x217 = 217; + optional Empty x218 = 218; + optional Empty x219 = 219; + optional Empty x220 = 220; + optional Empty x221 = 221; + optional Empty x222 = 222; + optional Empty x223 = 223; + optional Empty x224 = 224; + optional Empty x225 = 225; + optional Empty x226 = 226; + optional Empty x227 = 227; + optional Empty x228 = 228; + optional Empty x229 = 229; + optional Empty x230 = 230; + optional Empty x231 = 231; + optional Empty x232 = 232; + optional Empty x233 = 233; + optional Empty x234 = 234; + optional Empty x235 = 235; + optional Empty x236 = 236; + optional Empty x237 = 237; + optional Empty x238 = 238; + optional Empty x239 = 239; + optional Empty x240 = 240; + optional Empty x241 = 241; + optional Empty x242 = 242; + optional Empty x243 = 243; + optional Empty x244 = 244; + optional Empty x245 = 245; + optional Empty x246 = 246; + optional Empty x247 = 247; + optional Empty x248 = 248; + optional Empty x249 = 249; + optional Empty x250 = 250; +} + +message MessageList { + repeated group Message = 1 { + required string name = 2; + required int32 count = 3; + } +} + +message Strings { + optional string string_field = 1; + optional bytes bytes_field = 2; +} + +message Defaults { + enum Color { + RED = 0; + GREEN = 1; + BLUE = 2; + } + + // Default-valued fields of all basic types. + // Same as GoTest, but copied here to make testing easier. + optional bool F_Bool = 1 [default=true]; + optional int32 F_Int32 = 2 [default=32]; + optional int64 F_Int64 = 3 [default=64]; + optional fixed32 F_Fixed32 = 4 [default=320]; + optional fixed64 F_Fixed64 = 5 [default=640]; + optional uint32 F_Uint32 = 6 [default=3200]; + optional uint64 F_Uint64 = 7 [default=6400]; + optional float F_Float = 8 [default=314159.]; + optional double F_Double = 9 [default=271828.]; + optional string F_String = 10 [default="hello, \"world!\"\n"]; + optional bytes F_Bytes = 11 [default="Bignose"]; + optional sint32 F_Sint32 = 12 [default=-32]; + optional sint64 F_Sint64 = 13 [default=-64]; + optional Color F_Enum = 14 [default=GREEN]; + + // More fields with crazy defaults. + optional float F_Pinf = 15 [default=inf]; + optional float F_Ninf = 16 [default=-inf]; + optional float F_Nan = 17 [default=nan]; + + // Sub-message. + optional SubDefaults sub = 18; + + // Redundant but explicit defaults. + optional string str_zero = 19 [default=""]; +} + +message SubDefaults { + optional int64 n = 1 [default=7]; +} + +message RepeatedEnum { + enum Color { + RED = 1; + } + repeated Color color = 1; +} + +message MoreRepeated { + repeated bool bools = 1; + repeated bool bools_packed = 2 [packed=true]; + repeated int32 ints = 3; + repeated int32 ints_packed = 4 [packed=true]; + repeated int64 int64s_packed = 7 [packed=true]; + repeated string strings = 5; + repeated fixed32 fixeds = 6; +} + +// GroupOld and GroupNew have the same wire format. +// GroupNew has a new field inside a group. + +message GroupOld { + optional group G = 101 { + optional int32 x = 2; + } +} + +message GroupNew { + optional group G = 101 { + optional int32 x = 2; + optional int32 y = 3; + } +} + +message FloatingPoint { + required double f = 1; +} + +message MessageWithMap { + map name_mapping = 1; + map msg_mapping = 2; + map byte_mapping = 3; + map str_to_str = 4; +} + +message Oneof { + oneof union { + bool F_Bool = 1; + int32 F_Int32 = 2; + int64 F_Int64 = 3; + fixed32 F_Fixed32 = 4; + fixed64 F_Fixed64 = 5; + uint32 F_Uint32 = 6; + uint64 F_Uint64 = 7; + float F_Float = 8; + double F_Double = 9; + string F_String = 10; + bytes F_Bytes = 11; + sint32 F_Sint32 = 12; + sint64 F_Sint64 = 13; + MyMessage.Color F_Enum = 14; + GoTestField F_Message = 15; + group F_Group = 16 { + optional int32 x = 17; + } + int32 F_Largest_Tag = 536870911; + } + + oneof tormato { + int32 value = 100; + } +} + +message Communique { + optional bool make_me_cry = 1; + + // This is a oneof, called "union". + oneof union { + int32 number = 5; + string name = 6; + bytes data = 7; + double temp_c = 8; + MyMessage.Color col = 9; + Strings msg = 10; + } +} diff --git a/vendor/src/github.com/golang/protobuf/proto/text.go b/vendor/src/github.com/golang/protobuf/proto/text.go new file mode 100644 index 0000000..bd6f1ae --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,854 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + gtNewline = []byte(">\n") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Printf("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +// raw is the interface satisfied by RawMessage. +type raw interface { + Bytes() []byte +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.mvalprop); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if b, ok := fv.Interface().(raw); ok { + if err := writeRaw(w, b.Bytes()); err != nil { + return err + } + continue + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, ok := extendable(pv.Interface()); ok { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeRaw writes an uninterpreted raw message. +func writeRaw(w *textWriter, b []byte) error { + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if err := writeUnknownStruct(w, b); err != nil { + return err + } + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Interface().([]byte))); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else if err := tm.writeStruct(w, v); err != nil { + return err + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/src/github.com/golang/protobuf/proto/text_parser.go b/vendor/src/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 0000000..8fa9f3a --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,872 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") + errBadHex = errors.New("proto: bad hexadecimal") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + base := 8 + ss := s[:2] + s = s[2:] + if r == 'x' || r == 'X' { + base = 16 + } else { + ss = string(r) + ss + } + i, err := strconv.ParseUint(ss, base, 8) + if err != nil { + return "", "", err + } + return string([]byte{byte(i)}), s, nil + case 'u', 'U': + n := 4 + if r == 'U' { + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) + } + + bs := make([]byte, n/2) + for i := 0; i < n; i += 2 { + a, ok1 := unhex(s[i]) + b, ok2 := unhex(s[i+1]) + if !ok1 || !ok2 { + return "", "", errBadHex + } + bs[i/2] = a<<4 | b + } + s = s[n:] + return string(bs), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Adapted from src/pkg/strconv/quote.go. +func unhex(b byte) (v byte, ok bool) { + switch { + case '0' <= b && b <= '9': + return b - '0', true + case 'a' <= b && b <= 'f': + return b - 'a' + 10, true + case 'A' <= b && b <= 'F': + return b - 'A' + 10, true + } + return 0, false +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + sv.Field(oop.Field).Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // Technically the "key" and "value" could come in any order, + // but in practice they won't. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + if err := p.consumeToken("key"); err != nil { + return err + } + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.mkeyprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + if err := p.consumeToken("value"); err != nil { + return err + } + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.mvalprop); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + if err := p.consumeToken(terminator); err != nil { + return err + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // Either "true", "false", 1 or 0. + switch tok.value { + case "true", "1": + fv.SetBool(true) + return nil + case "false", "0": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + err := um.UnmarshalText([]byte(s)) + return err + } + pb.Reset() + v := reflect.ValueOf(pb) + if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { + return pe + } + return nil +} diff --git a/vendor/src/github.com/golang/protobuf/proto/text_parser_test.go b/vendor/src/github.com/golang/protobuf/proto/text_parser_test.go new file mode 100644 index 0000000..32c4117 --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/text_parser_test.go @@ -0,0 +1,567 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "math" + "reflect" + "testing" + + . "github.com/golang/protobuf/proto" + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + . "github.com/golang/protobuf/proto/testdata" +) + +type UnmarshalTextTest struct { + in string + err string // if "", no error expected + out *MyMessage +} + +func buildExtStructTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_More, &Ext{ + Data: String("Hello, world!"), + }) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtDataTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + SetExtension(msg, E_Ext_Text, String("Hello, world!")) + SetExtension(msg, E_Ext_Number, Int32(1729)) + return UnmarshalTextTest{in: text, out: msg} +} + +func buildExtRepStringTest(text string) UnmarshalTextTest { + msg := &MyMessage{ + Count: Int32(42), + } + if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { + panic(err) + } + return UnmarshalTextTest{in: text, out: msg} +} + +var unMarshalTextTests = []UnmarshalTextTest{ + // Basic + { + in: " count:42\n name:\"Dave\" ", + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + }, + }, + + // Empty quoted string + { + in: `count:42 name:""`, + out: &MyMessage{ + Count: Int32(42), + Name: String(""), + }, + }, + + // Quoted string concatenation with double quotes + { + in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenation with single quotes + { + in: "count:42 name: 'My name is '\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string concatenations with mixed quotes + { + in: "count:42 name: 'My name is '\n\"elsewhere\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + { + in: "count:42 name: \"My name is \"\n'elsewhere'", + out: &MyMessage{ + Count: Int32(42), + Name: String("My name is elsewhere"), + }, + }, + + // Quoted string with escaped apostrophe + { + in: `count:42 name: "HOLIDAY - New Year\'s Day"`, + out: &MyMessage{ + Count: Int32(42), + Name: String("HOLIDAY - New Year's Day"), + }, + }, + + // Quoted string with single quote + { + in: `count:42 name: 'Roger "The Ramster" Ramjet'`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`Roger "The Ramster" Ramjet`), + }, + }, + + // Quoted string with all the accepted special characters from the C++ test + { + in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", + out: &MyMessage{ + Count: Int32(42), + Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), + }, + }, + + // Quoted string with quoted backslash + { + in: `count:42 name: "\\'xyz"`, + out: &MyMessage{ + Count: Int32(42), + Name: String(`\'xyz`), + }, + }, + + // Quoted string with UTF-8 bytes. + { + in: "count:42 name: '\303\277\302\201\xAB'", + out: &MyMessage{ + Count: Int32(42), + Name: String("\303\277\302\201\xAB"), + }, + }, + + // Bad quoted string + { + in: `inner: < host: "\0" >` + "\n", + err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, + }, + + // Number too large for int64 + { + in: "count: 1 others { key: 123456789012345678901 }", + err: "line 1.23: invalid int64: 123456789012345678901", + }, + + // Number too large for int32 + { + in: "count: 1234567890123", + err: "line 1.7: invalid int32: 1234567890123", + }, + + // Number in hexadecimal + { + in: "count: 0x2beef", + out: &MyMessage{ + Count: Int32(0x2beef), + }, + }, + + // Number in octal + { + in: "count: 024601", + out: &MyMessage{ + Count: Int32(024601), + }, + }, + + // Floating point number with "f" suffix + { + in: "count: 4 others:< weight: 17.0f >", + out: &MyMessage{ + Count: Int32(4), + Others: []*OtherMessage{ + { + Weight: Float32(17), + }, + }, + }, + }, + + // Floating point positive infinity + { + in: "count: 4 bigfloat: inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(1)), + }, + }, + + // Floating point negative infinity + { + in: "count: 4 bigfloat: -inf", + out: &MyMessage{ + Count: Int32(4), + Bigfloat: Float64(math.Inf(-1)), + }, + }, + + // Number too large for float32 + { + in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", + err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", + }, + + // Number posing as a quoted string + { + in: `inner: < host: 12 >` + "\n", + err: `line 1.15: invalid string: 12`, + }, + + // Quoted string posing as int32 + { + in: `count: "12"`, + err: `line 1.7: invalid int32: "12"`, + }, + + // Quoted string posing a float32 + { + in: `others:< weight: "17.4" >`, + err: `line 1.17: invalid float32: "17.4"`, + }, + + // Enum + { + in: `count:42 bikeshed: BLUE`, + out: &MyMessage{ + Count: Int32(42), + Bikeshed: MyMessage_BLUE.Enum(), + }, + }, + + // Repeated field + { + in: `count:42 pet: "horsey" pet:"bunny"`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated field with list notation + { + in: `count:42 pet: ["horsey", "bunny"]`, + out: &MyMessage{ + Count: Int32(42), + Pet: []string{"horsey", "bunny"}, + }, + }, + + // Repeated message with/without colon and <>/{} + { + in: `count:42 others:{} others{} others:<> others:{}`, + out: &MyMessage{ + Count: Int32(42), + Others: []*OtherMessage{ + {}, + {}, + {}, + {}, + }, + }, + }, + + // Missing colon for inner message + { + in: `count:42 inner < host: "cauchy.syd" >`, + out: &MyMessage{ + Count: Int32(42), + Inner: &InnerMessage{ + Host: String("cauchy.syd"), + }, + }, + }, + + // Missing colon for string field + { + in: `name "Dave"`, + err: `line 1.5: expected ':', found "\"Dave\""`, + }, + + // Missing colon for int32 field + { + in: `count 42`, + err: `line 1.6: expected ':', found "42"`, + }, + + // Missing required field + { + in: `name: "Pawel"`, + err: `proto: required field "testdata.MyMessage.count" not set`, + out: &MyMessage{ + Name: String("Pawel"), + }, + }, + + // Missing required field in a required submessage + { + in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, + err: `proto: required field "testdata.InnerMessage.host" not set`, + out: &MyMessage{ + Count: Int32(42), + WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, + }, + }, + + // Repeated non-repeated field + { + in: `name: "Rob" name: "Russ"`, + err: `line 1.12: non-repeated field "name" was repeated`, + }, + + // Group + { + in: `count: 17 SomeGroup { group_field: 12 }`, + out: &MyMessage{ + Count: Int32(17), + Somegroup: &MyMessage_SomeGroup{ + GroupField: Int32(12), + }, + }, + }, + + // Semicolon between fields + { + in: `count:3;name:"Calvin"`, + out: &MyMessage{ + Count: Int32(3), + Name: String("Calvin"), + }, + }, + // Comma between fields + { + in: `count:4,name:"Ezekiel"`, + out: &MyMessage{ + Count: Int32(4), + Name: String("Ezekiel"), + }, + }, + + // Extension + buildExtStructTest(`count: 42 [testdata.Ext.more]:`), + buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), + buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), + buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), + + // Big all-in-one + { + in: "count:42 # Meaning\n" + + `name:"Dave" ` + + `quote:"\"I didn't want to go.\"" ` + + `pet:"bunny" ` + + `pet:"kitty" ` + + `pet:"horsey" ` + + `inner:<` + + ` host:"footrest.syd" ` + + ` port:7001 ` + + ` connected:true ` + + `> ` + + `others:<` + + ` key:3735928559 ` + + ` value:"\x01A\a\f" ` + + `> ` + + `others:<` + + " weight:58.9 # Atomic weight of Co\n" + + ` inner:<` + + ` host:"lesha.mtv" ` + + ` port:8002 ` + + ` >` + + `>`, + out: &MyMessage{ + Count: Int32(42), + Name: String("Dave"), + Quote: String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &InnerMessage{ + Host: String("footrest.syd"), + Port: Int32(7001), + Connected: Bool(true), + }, + Others: []*OtherMessage{ + { + Key: Int64(3735928559), + Value: []byte{0x1, 'A', '\a', '\f'}, + }, + { + Weight: Float32(58.9), + Inner: &InnerMessage{ + Host: String("lesha.mtv"), + Port: Int32(8002), + }, + }, + }, + }, + }, +} + +func TestUnmarshalText(t *testing.T) { + for i, test := range unMarshalTextTests { + pb := new(MyMessage) + err := UnmarshalText(test.in, pb) + if test.err == "" { + // We don't expect failure. + if err != nil { + t.Errorf("Test %d: Unexpected error: %v", i, err) + } else if !reflect.DeepEqual(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } else { + // We do expect failure. + if err == nil { + t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) + } else if err.Error() != test.err { + t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", + i, err.Error(), test.err) + } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { + t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", + i, pb, test.out) + } + } + } +} + +func TestUnmarshalTextCustomMessage(t *testing.T) { + msg := &textMessage{} + if err := UnmarshalText("custom", msg); err != nil { + t.Errorf("Unexpected error from custom unmarshal: %v", err) + } + if UnmarshalText("not custom", msg) == nil { + t.Errorf("Didn't get expected error from custom unmarshal") + } +} + +// Regression test; this caused a panic. +func TestRepeatedEnum(t *testing.T) { + pb := new(RepeatedEnum) + if err := UnmarshalText("color: RED", pb); err != nil { + t.Fatal(err) + } + exp := &RepeatedEnum{ + Color: []RepeatedEnum_Color{RepeatedEnum_RED}, + } + if !Equal(pb, exp) { + t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) + } +} + +func TestProto3TextParsing(t *testing.T) { + m := new(proto3pb.Message) + const in = `name: "Wallace" true_scotsman: true` + want := &proto3pb.Message{ + Name: "Wallace", + TrueScotsman: true, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestMapParsing(t *testing.T) { + m := new(MessageWithMap) + const in = `name_mapping: name_mapping:` + + `msg_mapping:,>` + // separating commas are okay + `msg_mapping>` + // no colon after "value" + `byte_mapping:` + want := &MessageWithMap{ + NameMapping: map[int32]string{ + 1: "Beatles", + 1234: "Feist", + }, + MsgMapping: map[int64]*FloatingPoint{ + -4: {F: Float64(2.0)}, + -2: {F: Float64(4.0)}, + }, + ByteMapping: map[bool][]byte{ + true: []byte("so be it"), + }, + } + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +func TestOneofParsing(t *testing.T) { + const in = `name:"Shrek"` + m := new(Communique) + want := &Communique{Union: &Communique_Name{"Shrek"}} + if err := UnmarshalText(in, m); err != nil { + t.Fatal(err) + } + if !Equal(m, want) { + t.Errorf("\n got %v\nwant %v", m, want) + } +} + +var benchInput string + +func init() { + benchInput = "count: 4\n" + for i := 0; i < 1000; i++ { + benchInput += "pet: \"fido\"\n" + } + + // Check it is valid input. + pb := new(MyMessage) + err := UnmarshalText(benchInput, pb) + if err != nil { + panic("Bad benchmark input: " + err.Error()) + } +} + +func BenchmarkUnmarshalText(b *testing.B) { + pb := new(MyMessage) + for i := 0; i < b.N; i++ { + UnmarshalText(benchInput, pb) + } + b.SetBytes(int64(len(benchInput))) +} diff --git a/vendor/src/github.com/golang/protobuf/proto/text_test.go b/vendor/src/github.com/golang/protobuf/proto/text_test.go new file mode 100644 index 0000000..3eabaca --- /dev/null +++ b/vendor/src/github.com/golang/protobuf/proto/text_test.go @@ -0,0 +1,474 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto_test + +import ( + "bytes" + "errors" + "io/ioutil" + "math" + "strings" + "testing" + + "github.com/golang/protobuf/proto" + + proto3pb "github.com/golang/protobuf/proto/proto3_proto" + pb "github.com/golang/protobuf/proto/testdata" +) + +// textMessage implements the methods that allow it to marshal and unmarshal +// itself as text. +type textMessage struct { +} + +func (*textMessage) MarshalText() ([]byte, error) { + return []byte("custom"), nil +} + +func (*textMessage) UnmarshalText(bytes []byte) error { + if string(bytes) != "custom" { + return errors.New("expected 'custom'") + } + return nil +} + +func (*textMessage) Reset() {} +func (*textMessage) String() string { return "" } +func (*textMessage) ProtoMessage() {} + +func newTestMessage() *pb.MyMessage { + msg := &pb.MyMessage{ + Count: proto.Int32(42), + Name: proto.String("Dave"), + Quote: proto.String(`"I didn't want to go."`), + Pet: []string{"bunny", "kitty", "horsey"}, + Inner: &pb.InnerMessage{ + Host: proto.String("footrest.syd"), + Port: proto.Int32(7001), + Connected: proto.Bool(true), + }, + Others: []*pb.OtherMessage{ + { + Key: proto.Int64(0xdeadbeef), + Value: []byte{1, 65, 7, 12}, + }, + { + Weight: proto.Float32(6.022), + Inner: &pb.InnerMessage{ + Host: proto.String("lesha.mtv"), + Port: proto.Int32(8002), + }, + }, + }, + Bikeshed: pb.MyMessage_BLUE.Enum(), + Somegroup: &pb.MyMessage_SomeGroup{ + GroupField: proto.Int32(8), + }, + // One normally wouldn't do this. + // This is an undeclared tag 13, as a varint (wire type 0) with value 4. + XXX_unrecognized: []byte{13<<3 | 0, 4}, + } + ext := &pb.Ext{ + Data: proto.String("Big gobs for big rats"), + } + if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { + panic(err) + } + greetings := []string{"adg", "easy", "cow"} + if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { + panic(err) + } + + // Add an unknown extension. We marshal a pb.Ext, and fake the ID. + b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) + if err != nil { + panic(err) + } + b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) + proto.SetRawExtension(msg, 201, b) + + // Extensions can be plain fields, too, so let's test that. + b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) + proto.SetRawExtension(msg, 202, b) + + return msg +} + +const text = `count: 42 +name: "Dave" +quote: "\"I didn't want to go.\"" +pet: "bunny" +pet: "kitty" +pet: "horsey" +inner: < + host: "footrest.syd" + port: 7001 + connected: true +> +others: < + key: 3735928559 + value: "\001A\007\014" +> +others: < + weight: 6.022 + inner: < + host: "lesha.mtv" + port: 8002 + > +> +bikeshed: BLUE +SomeGroup { + group_field: 8 +} +/* 2 unknown bytes */ +13: 4 +[testdata.Ext.more]: < + data: "Big gobs for big rats" +> +[testdata.greeting]: "adg" +[testdata.greeting]: "easy" +[testdata.greeting]: "cow" +/* 13 unknown bytes */ +201: "\t3G skiing" +/* 3 unknown bytes */ +202: 19 +` + +func TestMarshalText(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, newTestMessage()); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != text { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) + } +} + +func TestMarshalTextCustomMessage(t *testing.T) { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, &textMessage{}); err != nil { + t.Fatalf("proto.MarshalText: %v", err) + } + s := buf.String() + if s != "custom" { + t.Errorf("Got %q, expected %q", s, "custom") + } +} +func TestMarshalTextNil(t *testing.T) { + want := "" + tests := []proto.Message{nil, (*pb.MyMessage)(nil)} + for i, test := range tests { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, test); err != nil { + t.Fatal(err) + } + if got := buf.String(); got != want { + t.Errorf("%d: got %q want %q", i, got, want) + } + } +} + +func TestMarshalTextUnknownEnum(t *testing.T) { + // The Color enum only specifies values 0-2. + m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} + got := m.String() + const want = `bikeshed:3 ` + if got != want { + t.Errorf("\n got %q\nwant %q", got, want) + } +} + +func TestTextOneof(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&pb.Communique{}, ``}, + // scalar field + {&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, + // message field + {&pb.Communique{Union: &pb.Communique_Msg{ + &pb.Strings{StringField: proto.String("why hello!")}, + }}, `msg:`}, + // bad oneof (should not panic) + {&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} + +func BenchmarkMarshalTextBuffered(b *testing.B) { + buf := new(bytes.Buffer) + m := newTestMessage() + for i := 0; i < b.N; i++ { + buf.Reset() + proto.MarshalText(buf, m) + } +} + +func BenchmarkMarshalTextUnbuffered(b *testing.B) { + w := ioutil.Discard + m := newTestMessage() + for i := 0; i < b.N; i++ { + proto.MarshalText(w, m) + } +} + +func compact(src string) string { + // s/[ \n]+/ /g; s/ $//; + dst := make([]byte, len(src)) + space, comment := false, false + j := 0 + for i := 0; i < len(src); i++ { + if strings.HasPrefix(src[i:], "/*") { + comment = true + i++ + continue + } + if comment && strings.HasPrefix(src[i:], "*/") { + comment = false + i++ + continue + } + if comment { + continue + } + c := src[i] + if c == ' ' || c == '\n' { + space = true + continue + } + if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { + space = false + } + if c == '{' { + space = false + } + if space { + dst[j] = ' ' + j++ + space = false + } + dst[j] = c + j++ + } + if space { + dst[j] = ' ' + j++ + } + return string(dst[0:j]) +} + +var compactText = compact(text) + +func TestCompactText(t *testing.T) { + s := proto.CompactTextString(newTestMessage()) + if s != compactText { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) + } +} + +func TestStringEscaping(t *testing.T) { + testCases := []struct { + in *pb.Strings + out string + }{ + { + // Test data from C++ test (TextFormatTest.StringEscape). + // Single divergence: we don't escape apostrophes. + &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, + "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", + }, + { + // Test data from the same C++ test. + &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, + "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", + }, + { + // Some UTF-8. + &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, + `string_field: "\000\001\377\201"` + "\n", + }, + } + + for i, tc := range testCases { + var buf bytes.Buffer + if err := proto.MarshalText(&buf, tc.in); err != nil { + t.Errorf("proto.MarsalText: %v", err) + continue + } + s := buf.String() + if s != tc.out { + t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) + continue + } + + // Check round-trip. + pb := new(pb.Strings) + if err := proto.UnmarshalText(s, pb); err != nil { + t.Errorf("#%d: UnmarshalText: %v", i, err) + continue + } + if !proto.Equal(pb, tc.in) { + t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) + } + } +} + +// A limitedWriter accepts some output before it fails. +// This is a proxy for something like a nearly-full or imminently-failing disk, +// or a network connection that is about to die. +type limitedWriter struct { + b bytes.Buffer + limit int +} + +var outOfSpace = errors.New("proto: insufficient space") + +func (w *limitedWriter) Write(p []byte) (n int, err error) { + var avail = w.limit - w.b.Len() + if avail <= 0 { + return 0, outOfSpace + } + if len(p) <= avail { + return w.b.Write(p) + } + n, _ = w.b.Write(p[:avail]) + return n, outOfSpace +} + +func TestMarshalTextFailing(t *testing.T) { + // Try lots of different sizes to exercise more error code-paths. + for lim := 0; lim < len(text); lim++ { + buf := new(limitedWriter) + buf.limit = lim + err := proto.MarshalText(buf, newTestMessage()) + // We expect a certain error, but also some partial results in the buffer. + if err != outOfSpace { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) + } + s := buf.b.String() + x := text[:buf.limit] + if s != x { + t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) + } + } +} + +func TestFloats(t *testing.T) { + tests := []struct { + f float64 + want string + }{ + {0, "0"}, + {4.7, "4.7"}, + {math.Inf(1), "inf"}, + {math.Inf(-1), "-inf"}, + {math.NaN(), "nan"}, + } + for _, test := range tests { + msg := &pb.FloatingPoint{F: &test.f} + got := strings.TrimSpace(msg.String()) + want := `f:` + test.want + if got != want { + t.Errorf("f=%f: got %q, want %q", test.f, got, want) + } + } +} + +func TestRepeatedNilText(t *testing.T) { + m := &pb.MessageList{ + Message: []*pb.MessageList_Message{ + nil, + &pb.MessageList_Message{ + Name: proto.String("Horse"), + }, + nil, + }, + } + want := `Message +Message { + name: "Horse" +} +Message +` + if s := proto.MarshalTextString(m); s != want { + t.Errorf(" got: %s\nwant: %s", s, want) + } +} + +func TestProto3Text(t *testing.T) { + tests := []struct { + m proto.Message + want string + }{ + // zero message + {&proto3pb.Message{}, ``}, + // zero message except for an empty byte slice + {&proto3pb.Message{Data: []byte{}}, ``}, + // trivial case + {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, + // empty map + {&pb.MessageWithMap{}, ``}, + // non-empty map; map format is the same as a repeated struct, + // and they are sorted by key (numerically for numeric keys). + { + &pb.MessageWithMap{NameMapping: map[int32]string{ + -1: "Negatory", + 7: "Lucky", + 1234: "Feist", + 6345789: "Otis", + }}, + `name_mapping: ` + + `name_mapping: ` + + `name_mapping: ` + + `name_mapping:`, + }, + // map with nil value; not well-defined, but we shouldn't crash + { + &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, + `msg_mapping:`, + }, + } + for _, test := range tests { + got := strings.TrimSpace(test.m.String()) + if got != test.want { + t.Errorf("\n got %s\nwant %s", got, test.want) + } + } +} diff --git a/vendor/src/github.com/golang/snappy/AUTHORS b/vendor/src/github.com/golang/snappy/AUTHORS new file mode 100644 index 0000000..bcfa195 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of Snappy-Go authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Damian Gryski +Google Inc. +Jan Mercl <0xjnml@gmail.com> +Rodolfo Carvalho +Sebastien Binet diff --git a/vendor/src/github.com/golang/snappy/CONTRIBUTORS b/vendor/src/github.com/golang/snappy/CONTRIBUTORS new file mode 100644 index 0000000..931ae31 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/CONTRIBUTORS @@ -0,0 +1,37 @@ +# This is the official list of people who can contribute +# (and typically have contributed) code to the Snappy-Go repository. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# The submission process automatically checks to make sure +# that people submitting code are listed in this file (by email address). +# +# Names should be added to this file only after verifying that +# the individual or the individual's organization has agreed to +# the appropriate Contributor License Agreement, found here: +# +# http://code.google.com/legal/individual-cla-v1.0.html +# http://code.google.com/legal/corporate-cla-v1.0.html +# +# The agreement for individuals can be filled out on the web. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file, depending on whether the +# individual or corporate CLA was used. + +# Names should be added to this file like so: +# Name + +# Please keep the list sorted. + +Damian Gryski +Jan Mercl <0xjnml@gmail.com> +Kai Backman +Marc-Antoine Ruel +Nigel Tao +Rob Pike +Rodolfo Carvalho +Russ Cox +Sebastien Binet diff --git a/vendor/src/github.com/golang/snappy/LICENSE b/vendor/src/github.com/golang/snappy/LICENSE new file mode 100644 index 0000000..6050c10 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/src/github.com/golang/snappy/README b/vendor/src/github.com/golang/snappy/README new file mode 100644 index 0000000..6b13826 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/README @@ -0,0 +1,107 @@ +The Snappy compression format in the Go programming language. + +To download and install from source: +$ go get github.com/golang/snappy + +Unless otherwise noted, the Snappy-Go source files are distributed +under the BSD-style license found in the LICENSE file. + + + +Benchmarks. + +The golang/snappy benchmarks include compressing (Z) and decompressing (U) ten +or so files, the same set used by the C++ Snappy code (github.com/google/snappy +and note the "google", not "golang"). On an "Intel(R) Core(TM) i7-3770 CPU @ +3.40GHz", Go's GOARCH=amd64 numbers as of 2016-04-29: + +"go test -test.bench=." + +_UFlat0-8 2.23GB/s ± 1% html +_UFlat1-8 1.43GB/s ± 0% urls +_UFlat2-8 23.7GB/s ± 1% jpg +_UFlat3-8 1.93GB/s ± 0% jpg_200 +_UFlat4-8 13.9GB/s ± 2% pdf +_UFlat5-8 2.00GB/s ± 0% html4 +_UFlat6-8 829MB/s ± 0% txt1 +_UFlat7-8 799MB/s ± 0% txt2 +_UFlat8-8 871MB/s ± 0% txt3 +_UFlat9-8 730MB/s ± 0% txt4 +_UFlat10-8 2.87GB/s ± 0% pb +_UFlat11-8 1.07GB/s ± 0% gaviota + +_ZFlat0-8 1.04GB/s ± 0% html +_ZFlat1-8 536MB/s ± 0% urls +_ZFlat2-8 16.3GB/s ± 2% jpg +_ZFlat3-8 762MB/s ± 0% jpg_200 +_ZFlat4-8 9.48GB/s ± 1% pdf +_ZFlat5-8 990MB/s ± 0% html4 +_ZFlat6-8 381MB/s ± 0% txt1 +_ZFlat7-8 353MB/s ± 0% txt2 +_ZFlat8-8 398MB/s ± 0% txt3 +_ZFlat9-8 329MB/s ± 0% txt4 +_ZFlat10-8 1.35GB/s ± 1% pb +_ZFlat11-8 608MB/s ± 0% gaviota + + + +"go test -test.bench=. -tags=noasm" + +_UFlat0-8 637MB/s ± 0% html +_UFlat1-8 506MB/s ± 0% urls +_UFlat2-8 23.0GB/s ± 5% jpg +_UFlat3-8 1.17GB/s ± 0% jpg_200 +_UFlat4-8 4.44GB/s ± 1% pdf +_UFlat5-8 623MB/s ± 0% html4 +_UFlat6-8 300MB/s ± 1% txt1 +_UFlat7-8 293MB/s ± 0% txt2 +_UFlat8-8 316MB/s ± 0% txt3 +_UFlat9-8 285MB/s ± 0% txt4 +_UFlat10-8 768MB/s ± 0% pb +_UFlat11-8 406MB/s ± 1% gaviota + +_ZFlat0-8 411MB/s ± 1% html +_ZFlat1-8 250MB/s ± 1% urls +_ZFlat2-8 12.7GB/s ± 1% jpg +_ZFlat3-8 157MB/s ± 0% jpg_200 +_ZFlat4-8 2.95GB/s ± 0% pdf +_ZFlat5-8 406MB/s ± 0% html4 +_ZFlat6-8 182MB/s ± 0% txt1 +_ZFlat7-8 173MB/s ± 1% txt2 +_ZFlat8-8 191MB/s ± 0% txt3 +_ZFlat9-8 166MB/s ± 0% txt4 +_ZFlat10-8 480MB/s ± 0% pb +_ZFlat11-8 272MB/s ± 0% gaviota + + + +For comparison (Go's encoded output is byte-for-byte identical to C++'s), here +are the numbers from C++ Snappy's + +make CXXFLAGS="-O2 -DNDEBUG -g" clean snappy_unittest.log && cat snappy_unittest.log + +BM_UFlat/0 2.4GB/s html +BM_UFlat/1 1.4GB/s urls +BM_UFlat/2 21.8GB/s jpg +BM_UFlat/3 1.5GB/s jpg_200 +BM_UFlat/4 13.3GB/s pdf +BM_UFlat/5 2.1GB/s html4 +BM_UFlat/6 1.0GB/s txt1 +BM_UFlat/7 959.4MB/s txt2 +BM_UFlat/8 1.0GB/s txt3 +BM_UFlat/9 864.5MB/s txt4 +BM_UFlat/10 2.9GB/s pb +BM_UFlat/11 1.2GB/s gaviota + +BM_ZFlat/0 944.3MB/s html (22.31 %) +BM_ZFlat/1 501.6MB/s urls (47.78 %) +BM_ZFlat/2 14.3GB/s jpg (99.95 %) +BM_ZFlat/3 538.3MB/s jpg_200 (73.00 %) +BM_ZFlat/4 8.3GB/s pdf (83.30 %) +BM_ZFlat/5 903.5MB/s html4 (22.52 %) +BM_ZFlat/6 336.0MB/s txt1 (57.88 %) +BM_ZFlat/7 312.3MB/s txt2 (61.91 %) +BM_ZFlat/8 353.1MB/s txt3 (54.99 %) +BM_ZFlat/9 289.9MB/s txt4 (66.26 %) +BM_ZFlat/10 1.2GB/s pb (19.68 %) +BM_ZFlat/11 527.4MB/s gaviota (37.72 %) diff --git a/vendor/src/github.com/golang/snappy/cmd/snappytool/main.cpp b/vendor/src/github.com/golang/snappy/cmd/snappytool/main.cpp new file mode 100644 index 0000000..fc31f51 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/cmd/snappytool/main.cpp @@ -0,0 +1,77 @@ +/* +To build the snappytool binary: +g++ main.cpp /usr/lib/libsnappy.a -o snappytool +or, if you have built the C++ snappy library from source: +g++ main.cpp /path/to/your/snappy/.libs/libsnappy.a -o snappytool +after running "make" from your snappy checkout directory. +*/ + +#include +#include +#include +#include + +#include "snappy.h" + +#define N 1000000 + +char dst[N]; +char src[N]; + +int main(int argc, char** argv) { + // Parse args. + if (argc != 2) { + fprintf(stderr, "exactly one of -d or -e must be given\n"); + return 1; + } + bool decode = strcmp(argv[1], "-d") == 0; + bool encode = strcmp(argv[1], "-e") == 0; + if (decode == encode) { + fprintf(stderr, "exactly one of -d or -e must be given\n"); + return 1; + } + + // Read all of stdin into src[:s]. + size_t s = 0; + while (1) { + if (s == N) { + fprintf(stderr, "input too large\n"); + return 1; + } + ssize_t n = read(0, src+s, N-s); + if (n == 0) { + break; + } + if (n < 0) { + fprintf(stderr, "read error: %s\n", strerror(errno)); + // TODO: handle EAGAIN, EINTR? + return 1; + } + s += n; + } + + // Encode or decode src[:s] to dst[:d], and write to stdout. + size_t d = 0; + if (encode) { + if (N < snappy::MaxCompressedLength(s)) { + fprintf(stderr, "input too large after encoding\n"); + return 1; + } + snappy::RawCompress(src, s, dst, &d); + } else { + if (!snappy::GetUncompressedLength(src, s, &d)) { + fprintf(stderr, "could not get uncompressed length\n"); + return 1; + } + if (N < d) { + fprintf(stderr, "input too large after decoding\n"); + return 1; + } + if (!snappy::RawUncompress(src, s, dst)) { + fprintf(stderr, "input was not valid Snappy-compressed data\n"); + return 1; + } + } + write(1, dst, d); + return 0; +} diff --git a/vendor/src/github.com/golang/snappy/decode.go b/vendor/src/github.com/golang/snappy/decode.go new file mode 100644 index 0000000..819c717 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/decode.go @@ -0,0 +1,241 @@ +// Copyright 2011 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package snappy + +import ( + "encoding/binary" + "errors" + "io" +) + +var ( + // ErrCorrupt reports that the input is invalid. + ErrCorrupt = errors.New("snappy: corrupt input") + // ErrTooLarge reports that the uncompressed length is too large. + ErrTooLarge = errors.New("snappy: decoded block is too large") + // ErrUnsupported reports that the input isn't supported. + ErrUnsupported = errors.New("snappy: unsupported input") + + errUnsupportedCopy4Tag = errors.New("snappy: unsupported COPY_4 tag") + errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") +) + +// DecodedLen returns the length of the decoded block. +func DecodedLen(src []byte) (int, error) { + v, _, err := decodedLen(src) + return v, err +} + +// decodedLen returns the length of the decoded block and the number of bytes +// that the length header occupied. +func decodedLen(src []byte) (blockLen, headerLen int, err error) { + v, n := binary.Uvarint(src) + if n <= 0 || v > 0xffffffff { + return 0, 0, ErrCorrupt + } + + const wordSize = 32 << (^uint(0) >> 32 & 1) + if wordSize == 32 && v > 0x7fffffff { + return 0, 0, ErrTooLarge + } + return int(v), n, nil +} + +const ( + decodeErrCodeCorrupt = 1 + decodeErrCodeUnsupportedLiteralLength = 2 + decodeErrCodeUnsupportedCopy4Tag = 3 +) + +// Decode returns the decoded form of src. The returned slice may be a sub- +// slice of dst if dst was large enough to hold the entire decoded block. +// Otherwise, a newly allocated slice will be returned. +// +// The dst and src must not overlap. It is valid to pass a nil dst. +func Decode(dst, src []byte) ([]byte, error) { + dLen, s, err := decodedLen(src) + if err != nil { + return nil, err + } + if dLen <= len(dst) { + dst = dst[:dLen] + } else { + dst = make([]byte, dLen) + } + switch decode(dst, src[s:]) { + case 0: + return dst, nil + case decodeErrCodeUnsupportedLiteralLength: + return nil, errUnsupportedLiteralLength + case decodeErrCodeUnsupportedCopy4Tag: + return nil, errUnsupportedCopy4Tag + } + return nil, ErrCorrupt +} + +// NewReader returns a new Reader that decompresses from r, using the framing +// format described at +// https://github.com/google/snappy/blob/master/framing_format.txt +func NewReader(r io.Reader) *Reader { + return &Reader{ + r: r, + decoded: make([]byte, maxBlockSize), + buf: make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize), + } +} + +// Reader is an io.Reader that can read Snappy-compressed bytes. +type Reader struct { + r io.Reader + err error + decoded []byte + buf []byte + // decoded[i:j] contains decoded bytes that have not yet been passed on. + i, j int + readHeader bool +} + +// Reset discards any buffered data, resets all state, and switches the Snappy +// reader to read from r. This permits reusing a Reader rather than allocating +// a new one. +func (r *Reader) Reset(reader io.Reader) { + r.r = reader + r.err = nil + r.i = 0 + r.j = 0 + r.readHeader = false +} + +func (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) { + if _, r.err = io.ReadFull(r.r, p); r.err != nil { + if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { + r.err = ErrCorrupt + } + return false + } + return true +} + +// Read satisfies the io.Reader interface. +func (r *Reader) Read(p []byte) (int, error) { + if r.err != nil { + return 0, r.err + } + for { + if r.i < r.j { + n := copy(p, r.decoded[r.i:r.j]) + r.i += n + return n, nil + } + if !r.readFull(r.buf[:4], true) { + return 0, r.err + } + chunkType := r.buf[0] + if !r.readHeader { + if chunkType != chunkTypeStreamIdentifier { + r.err = ErrCorrupt + return 0, r.err + } + r.readHeader = true + } + chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 + if chunkLen > len(r.buf) { + r.err = ErrUnsupported + return 0, r.err + } + + // The chunk types are specified at + // https://github.com/google/snappy/blob/master/framing_format.txt + switch chunkType { + case chunkTypeCompressedData: + // Section 4.2. Compressed data (chunk type 0x00). + if chunkLen < checksumSize { + r.err = ErrCorrupt + return 0, r.err + } + buf := r.buf[:chunkLen] + if !r.readFull(buf, false) { + return 0, r.err + } + checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 + buf = buf[checksumSize:] + + n, err := DecodedLen(buf) + if err != nil { + r.err = err + return 0, r.err + } + if n > len(r.decoded) { + r.err = ErrCorrupt + return 0, r.err + } + if _, err := Decode(r.decoded, buf); err != nil { + r.err = err + return 0, r.err + } + if crc(r.decoded[:n]) != checksum { + r.err = ErrCorrupt + return 0, r.err + } + r.i, r.j = 0, n + continue + + case chunkTypeUncompressedData: + // Section 4.3. Uncompressed data (chunk type 0x01). + if chunkLen < checksumSize { + r.err = ErrCorrupt + return 0, r.err + } + buf := r.buf[:checksumSize] + if !r.readFull(buf, false) { + return 0, r.err + } + checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 + // Read directly into r.decoded instead of via r.buf. + n := chunkLen - checksumSize + if n > len(r.decoded) { + r.err = ErrCorrupt + return 0, r.err + } + if !r.readFull(r.decoded[:n], false) { + return 0, r.err + } + if crc(r.decoded[:n]) != checksum { + r.err = ErrCorrupt + return 0, r.err + } + r.i, r.j = 0, n + continue + + case chunkTypeStreamIdentifier: + // Section 4.1. Stream identifier (chunk type 0xff). + if chunkLen != len(magicBody) { + r.err = ErrCorrupt + return 0, r.err + } + if !r.readFull(r.buf[:len(magicBody)], false) { + return 0, r.err + } + for i := 0; i < len(magicBody); i++ { + if r.buf[i] != magicBody[i] { + r.err = ErrCorrupt + return 0, r.err + } + } + continue + } + + if chunkType <= 0x7f { + // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). + r.err = ErrUnsupported + return 0, r.err + } + // Section 4.4 Padding (chunk type 0xfe). + // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). + if !r.readFull(r.buf[:chunkLen], false) { + return 0, r.err + } + } +} diff --git a/vendor/src/github.com/golang/snappy/decode_amd64.go b/vendor/src/github.com/golang/snappy/decode_amd64.go new file mode 100644 index 0000000..fcd192b --- /dev/null +++ b/vendor/src/github.com/golang/snappy/decode_amd64.go @@ -0,0 +1,14 @@ +// Copyright 2016 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine +// +build gc +// +build !noasm + +package snappy + +// decode has the same semantics as in decode_other.go. +// +//go:noescape +func decode(dst, src []byte) int diff --git a/vendor/src/github.com/golang/snappy/decode_amd64.s b/vendor/src/github.com/golang/snappy/decode_amd64.s new file mode 100644 index 0000000..ed1e93b --- /dev/null +++ b/vendor/src/github.com/golang/snappy/decode_amd64.s @@ -0,0 +1,476 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine +// +build gc +// +build !noasm + +#include "textflag.h" + +// The asm code generally follows the pure Go code in decode_other.go, except +// where marked with a "!!!". + +// func decode(dst, src []byte) int +// +// All local variables fit into registers. The non-zero stack size is only to +// spill registers and push args when issuing a CALL. The register allocation: +// - AX scratch +// - BX scratch +// - CX length or x +// - DX offset +// - SI &src[s] +// - DI &dst[d] +// + R8 dst_base +// + R9 dst_len +// + R10 dst_base + dst_len +// + R11 src_base +// + R12 src_len +// + R13 src_base + src_len +// - R14 used by doCopy +// - R15 used by doCopy +// +// The registers R8-R13 (marked with a "+") are set at the start of the +// function, and after a CALL returns, and are not otherwise modified. +// +// The d variable is implicitly DI - R8, and len(dst)-d is R10 - DI. +// The s variable is implicitly SI - R11, and len(src)-s is R13 - SI. +TEXT ·decode(SB), NOSPLIT, $48-56 + // Initialize SI, DI and R8-R13. + MOVQ dst_base+0(FP), R8 + MOVQ dst_len+8(FP), R9 + MOVQ R8, DI + MOVQ R8, R10 + ADDQ R9, R10 + MOVQ src_base+24(FP), R11 + MOVQ src_len+32(FP), R12 + MOVQ R11, SI + MOVQ R11, R13 + ADDQ R12, R13 + +loop: + // for s < len(src) + CMPQ SI, R13 + JEQ end + + // CX = uint32(src[s]) + // + // switch src[s] & 0x03 + MOVBLZX (SI), CX + MOVL CX, BX + ANDL $3, BX + CMPL BX, $1 + JAE tagCopy + + // ---------------------------------------- + // The code below handles literal tags. + + // case tagLiteral: + // x := uint32(src[s] >> 2) + // switch + SHRL $2, CX + CMPL CX, $60 + JAE tagLit60Plus + + // case x < 60: + // s++ + INCQ SI + +doLit: + // This is the end of the inner "switch", when we have a literal tag. + // + // We assume that CX == x and x fits in a uint32, where x is the variable + // used in the pure Go decode_other.go code. + + // length = int(x) + 1 + // + // Unlike the pure Go code, we don't need to check if length <= 0 because + // CX can hold 64 bits, so the increment cannot overflow. + INCQ CX + + // Prepare to check if copying length bytes will run past the end of dst or + // src. + // + // AX = len(dst) - d + // BX = len(src) - s + MOVQ R10, AX + SUBQ DI, AX + MOVQ R13, BX + SUBQ SI, BX + + // !!! Try a faster technique for short (16 or fewer bytes) copies. + // + // if length > 16 || len(dst)-d < 16 || len(src)-s < 16 { + // goto callMemmove // Fall back on calling runtime·memmove. + // } + // + // The C++ snappy code calls this TryFastAppend. It also checks len(src)-s + // against 21 instead of 16, because it cannot assume that all of its input + // is contiguous in memory and so it needs to leave enough source bytes to + // read the next tag without refilling buffers, but Go's Decode assumes + // contiguousness (the src argument is a []byte). + CMPQ CX, $16 + JGT callMemmove + CMPQ AX, $16 + JLT callMemmove + CMPQ BX, $16 + JLT callMemmove + + // !!! Implement the copy from src to dst as a 16-byte load and store. + // (Decode's documentation says that dst and src must not overlap.) + // + // This always copies 16 bytes, instead of only length bytes, but that's + // OK. If the input is a valid Snappy encoding then subsequent iterations + // will fix up the overrun. Otherwise, Decode returns a nil []byte (and a + // non-nil error), so the overrun will be ignored. + // + // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or + // 16-byte loads and stores. This technique probably wouldn't be as + // effective on architectures that are fussier about alignment. + MOVOU 0(SI), X0 + MOVOU X0, 0(DI) + + // d += length + // s += length + ADDQ CX, DI + ADDQ CX, SI + JMP loop + +callMemmove: + // if length > len(dst)-d || length > len(src)-s { etc } + CMPQ CX, AX + JGT errCorrupt + CMPQ CX, BX + JGT errCorrupt + + // copy(dst[d:], src[s:s+length]) + // + // This means calling runtime·memmove(&dst[d], &src[s], length), so we push + // DI, SI and CX as arguments. Coincidentally, we also need to spill those + // three registers to the stack, to save local variables across the CALL. + MOVQ DI, 0(SP) + MOVQ SI, 8(SP) + MOVQ CX, 16(SP) + MOVQ DI, 24(SP) + MOVQ SI, 32(SP) + MOVQ CX, 40(SP) + CALL runtime·memmove(SB) + + // Restore local variables: unspill registers from the stack and + // re-calculate R8-R13. + MOVQ 24(SP), DI + MOVQ 32(SP), SI + MOVQ 40(SP), CX + MOVQ dst_base+0(FP), R8 + MOVQ dst_len+8(FP), R9 + MOVQ R8, R10 + ADDQ R9, R10 + MOVQ src_base+24(FP), R11 + MOVQ src_len+32(FP), R12 + MOVQ R11, R13 + ADDQ R12, R13 + + // d += length + // s += length + ADDQ CX, DI + ADDQ CX, SI + JMP loop + +tagLit60Plus: + // !!! This fragment does the + // + // s += x - 58; if uint(s) > uint(len(src)) { etc } + // + // checks. In the asm version, we code it once instead of once per switch case. + ADDQ CX, SI + SUBQ $58, SI + MOVQ SI, BX + SUBQ R11, BX + CMPQ BX, R12 + JA errCorrupt + + // case x == 60: + CMPL CX, $61 + JEQ tagLit61 + JA tagLit62Plus + + // x = uint32(src[s-1]) + MOVBLZX -1(SI), CX + JMP doLit + +tagLit61: + // case x == 61: + // x = uint32(src[s-2]) | uint32(src[s-1])<<8 + MOVWLZX -2(SI), CX + JMP doLit + +tagLit62Plus: + CMPL CX, $62 + JA tagLit63 + + // case x == 62: + // x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 + MOVWLZX -3(SI), CX + MOVBLZX -1(SI), BX + SHLL $16, BX + ORL BX, CX + JMP doLit + +tagLit63: + // case x == 63: + // x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 + MOVL -4(SI), CX + JMP doLit + +// The code above handles literal tags. +// ---------------------------------------- +// The code below handles copy tags. + +tagCopy2: + // case tagCopy2: + // s += 3 + ADDQ $3, SI + + // if uint(s) > uint(len(src)) { etc } + MOVQ SI, BX + SUBQ R11, BX + CMPQ BX, R12 + JA errCorrupt + + // length = 1 + int(src[s-3])>>2 + SHRQ $2, CX + INCQ CX + + // offset = int(src[s-2]) | int(src[s-1])<<8 + MOVWQZX -2(SI), DX + JMP doCopy + +tagCopy: + // We have a copy tag. We assume that: + // - BX == src[s] & 0x03 + // - CX == src[s] + CMPQ BX, $2 + JEQ tagCopy2 + JA errUC4T + + // case tagCopy1: + // s += 2 + ADDQ $2, SI + + // if uint(s) > uint(len(src)) { etc } + MOVQ SI, BX + SUBQ R11, BX + CMPQ BX, R12 + JA errCorrupt + + // offset = int(src[s-2])&0xe0<<3 | int(src[s-1]) + MOVQ CX, DX + ANDQ $0xe0, DX + SHLQ $3, DX + MOVBQZX -1(SI), BX + ORQ BX, DX + + // length = 4 + int(src[s-2])>>2&0x7 + SHRQ $2, CX + ANDQ $7, CX + ADDQ $4, CX + +doCopy: + // This is the end of the outer "switch", when we have a copy tag. + // + // We assume that: + // - CX == length && CX > 0 + // - DX == offset + + // if offset <= 0 { etc } + CMPQ DX, $0 + JLE errCorrupt + + // if d < offset { etc } + MOVQ DI, BX + SUBQ R8, BX + CMPQ BX, DX + JLT errCorrupt + + // if length > len(dst)-d { etc } + MOVQ R10, BX + SUBQ DI, BX + CMPQ CX, BX + JGT errCorrupt + + // forwardCopy(dst[d:d+length], dst[d-offset:]); d += length + // + // Set: + // - R14 = len(dst)-d + // - R15 = &dst[d-offset] + MOVQ R10, R14 + SUBQ DI, R14 + MOVQ DI, R15 + SUBQ DX, R15 + + // !!! Try a faster technique for short (16 or fewer bytes) forward copies. + // + // First, try using two 8-byte load/stores, similar to the doLit technique + // above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is + // still OK if offset >= 8. Note that this has to be two 8-byte load/stores + // and not one 16-byte load/store, and the first store has to be before the + // second load, due to the overlap if offset is in the range [8, 16). + // + // if length > 16 || offset < 8 || len(dst)-d < 16 { + // goto slowForwardCopy + // } + // copy 16 bytes + // d += length + CMPQ CX, $16 + JGT slowForwardCopy + CMPQ DX, $8 + JLT slowForwardCopy + CMPQ R14, $16 + JLT slowForwardCopy + MOVQ 0(R15), AX + MOVQ AX, 0(DI) + MOVQ 8(R15), BX + MOVQ BX, 8(DI) + ADDQ CX, DI + JMP loop + +slowForwardCopy: + // !!! If the forward copy is longer than 16 bytes, or if offset < 8, we + // can still try 8-byte load stores, provided we can overrun up to 10 extra + // bytes. As above, the overrun will be fixed up by subsequent iterations + // of the outermost loop. + // + // The C++ snappy code calls this technique IncrementalCopyFastPath. Its + // commentary says: + // + // ---- + // + // The main part of this loop is a simple copy of eight bytes at a time + // until we've copied (at least) the requested amount of bytes. However, + // if d and d-offset are less than eight bytes apart (indicating a + // repeating pattern of length < 8), we first need to expand the pattern in + // order to get the correct results. For instance, if the buffer looks like + // this, with the eight-byte and patterns marked as + // intervals: + // + // abxxxxxxxxxxxx + // [------] d-offset + // [------] d + // + // a single eight-byte copy from to will repeat the pattern + // once, after which we can move two bytes without moving : + // + // ababxxxxxxxxxx + // [------] d-offset + // [------] d + // + // and repeat the exercise until the two no longer overlap. + // + // This allows us to do very well in the special case of one single byte + // repeated many times, without taking a big hit for more general cases. + // + // The worst case of extra writing past the end of the match occurs when + // offset == 1 and length == 1; the last copy will read from byte positions + // [0..7] and write to [4..11], whereas it was only supposed to write to + // position 1. Thus, ten excess bytes. + // + // ---- + // + // That "10 byte overrun" worst case is confirmed by Go's + // TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy + // and finishSlowForwardCopy algorithm. + // + // if length > len(dst)-d-10 { + // goto verySlowForwardCopy + // } + SUBQ $10, R14 + CMPQ CX, R14 + JGT verySlowForwardCopy + +makeOffsetAtLeast8: + // !!! As above, expand the pattern so that offset >= 8 and we can use + // 8-byte load/stores. + // + // for offset < 8 { + // copy 8 bytes from dst[d-offset:] to dst[d:] + // length -= offset + // d += offset + // offset += offset + // // The two previous lines together means that d-offset, and therefore + // // R15, is unchanged. + // } + CMPQ DX, $8 + JGE fixUpSlowForwardCopy + MOVQ (R15), BX + MOVQ BX, (DI) + SUBQ DX, CX + ADDQ DX, DI + ADDQ DX, DX + JMP makeOffsetAtLeast8 + +fixUpSlowForwardCopy: + // !!! Add length (which might be negative now) to d (implied by DI being + // &dst[d]) so that d ends up at the right place when we jump back to the + // top of the loop. Before we do that, though, we save DI to AX so that, if + // length is positive, copying the remaining length bytes will write to the + // right place. + MOVQ DI, AX + ADDQ CX, DI + +finishSlowForwardCopy: + // !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative + // length means that we overrun, but as above, that will be fixed up by + // subsequent iterations of the outermost loop. + CMPQ CX, $0 + JLE loop + MOVQ (R15), BX + MOVQ BX, (AX) + ADDQ $8, R15 + ADDQ $8, AX + SUBQ $8, CX + JMP finishSlowForwardCopy + +verySlowForwardCopy: + // verySlowForwardCopy is a simple implementation of forward copy. In C + // parlance, this is a do/while loop instead of a while loop, since we know + // that length > 0. In Go syntax: + // + // for { + // dst[d] = dst[d - offset] + // d++ + // length-- + // if length == 0 { + // break + // } + // } + MOVB (R15), BX + MOVB BX, (DI) + INCQ R15 + INCQ DI + DECQ CX + JNZ verySlowForwardCopy + JMP loop + +// The code above handles copy tags. +// ---------------------------------------- + +end: + // This is the end of the "for s < len(src)". + // + // if d != len(dst) { etc } + CMPQ DI, R10 + JNE errCorrupt + + // return 0 + MOVQ $0, ret+48(FP) + RET + +errCorrupt: + // return decodeErrCodeCorrupt + MOVQ $1, ret+48(FP) + RET + +errUC4T: + // return decodeErrCodeUnsupportedCopy4Tag + MOVQ $3, ret+48(FP) + RET diff --git a/vendor/src/github.com/golang/snappy/decode_other.go b/vendor/src/github.com/golang/snappy/decode_other.go new file mode 100644 index 0000000..f305b6f --- /dev/null +++ b/vendor/src/github.com/golang/snappy/decode_other.go @@ -0,0 +1,96 @@ +// Copyright 2016 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 appengine !gc noasm + +package snappy + +// decode writes the decoding of src to dst. It assumes that the varint-encoded +// length of the decompressed bytes has already been read, and that len(dst) +// equals that length. +// +// It returns 0 on success or a decodeErrCodeXxx error code on failure. +func decode(dst, src []byte) int { + var d, s, offset, length int + for s < len(src) { + switch src[s] & 0x03 { + case tagLiteral: + x := uint32(src[s] >> 2) + switch { + case x < 60: + s++ + case x == 60: + s += 2 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + x = uint32(src[s-1]) + case x == 61: + s += 3 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + x = uint32(src[s-2]) | uint32(src[s-1])<<8 + case x == 62: + s += 4 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 + case x == 63: + s += 5 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 + } + length = int(x) + 1 + if length <= 0 { + return decodeErrCodeUnsupportedLiteralLength + } + if length > len(dst)-d || length > len(src)-s { + return decodeErrCodeCorrupt + } + copy(dst[d:], src[s:s+length]) + d += length + s += length + continue + + case tagCopy1: + s += 2 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + length = 4 + int(src[s-2])>>2&0x7 + offset = int(src[s-2])&0xe0<<3 | int(src[s-1]) + + case tagCopy2: + s += 3 + if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. + return decodeErrCodeCorrupt + } + length = 1 + int(src[s-3])>>2 + offset = int(src[s-2]) | int(src[s-1])<<8 + + case tagCopy4: + return decodeErrCodeUnsupportedCopy4Tag + } + + if offset <= 0 || d < offset || length > len(dst)-d { + return decodeErrCodeCorrupt + } + // Copy from an earlier sub-slice of dst to a later sub-slice. Unlike + // the built-in copy function, this byte-by-byte copy always runs + // forwards, even if the slices overlap. Conceptually, this is: + // + // d += forwardCopy(dst[d:d+length], dst[d-offset:]) + for end := d + length; d != end; d++ { + dst[d] = dst[d-offset] + } + } + if d != len(dst) { + return decodeErrCodeCorrupt + } + return 0 +} diff --git a/vendor/src/github.com/golang/snappy/encode.go b/vendor/src/github.com/golang/snappy/encode.go new file mode 100644 index 0000000..8749689 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/encode.go @@ -0,0 +1,285 @@ +// Copyright 2011 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package snappy + +import ( + "encoding/binary" + "errors" + "io" +) + +// Encode returns the encoded form of src. The returned slice may be a sub- +// slice of dst if dst was large enough to hold the entire encoded block. +// Otherwise, a newly allocated slice will be returned. +// +// The dst and src must not overlap. It is valid to pass a nil dst. +func Encode(dst, src []byte) []byte { + if n := MaxEncodedLen(len(src)); n < 0 { + panic(ErrTooLarge) + } else if len(dst) < n { + dst = make([]byte, n) + } + + // The block starts with the varint-encoded length of the decompressed bytes. + d := binary.PutUvarint(dst, uint64(len(src))) + + for len(src) > 0 { + p := src + src = nil + if len(p) > maxBlockSize { + p, src = p[:maxBlockSize], p[maxBlockSize:] + } + if len(p) < minNonLiteralBlockSize { + d += emitLiteral(dst[d:], p) + } else { + d += encodeBlock(dst[d:], p) + } + } + return dst[:d] +} + +// inputMargin is the minimum number of extra input bytes to keep, inside +// encodeBlock's inner loop. On some architectures, this margin lets us +// implement a fast path for emitLiteral, where the copy of short (<= 16 byte) +// literals can be implemented as a single load to and store from a 16-byte +// register. That literal's actual length can be as short as 1 byte, so this +// can copy up to 15 bytes too much, but that's OK as subsequent iterations of +// the encoding loop will fix up the copy overrun, and this inputMargin ensures +// that we don't overrun the dst and src buffers. +const inputMargin = 16 - 1 + +// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that +// could be encoded with a copy tag. This is the minimum with respect to the +// algorithm used by encodeBlock, not a minimum enforced by the file format. +// +// The encoded output must start with at least a 1 byte literal, as there are +// no previous bytes to copy. A minimal (1 byte) copy after that, generated +// from an emitCopy call in encodeBlock's main loop, would require at least +// another inputMargin bytes, for the reason above: we want any emitLiteral +// calls inside encodeBlock's main loop to use the fast path if possible, which +// requires being able to overrun by inputMargin bytes. Thus, +// minNonLiteralBlockSize equals 1 + 1 + inputMargin. +// +// The C++ code doesn't use this exact threshold, but it could, as discussed at +// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion +// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an +// optimization. It should not affect the encoded form. This is tested by +// TestSameEncodingAsCppShortCopies. +const minNonLiteralBlockSize = 1 + 1 + inputMargin + +// MaxEncodedLen returns the maximum length of a snappy block, given its +// uncompressed length. +// +// It will return a negative value if srcLen is too large to encode. +func MaxEncodedLen(srcLen int) int { + n := uint64(srcLen) + if n > 0xffffffff { + return -1 + } + // Compressed data can be defined as: + // compressed := item* literal* + // item := literal* copy + // + // The trailing literal sequence has a space blowup of at most 62/60 + // since a literal of length 60 needs one tag byte + one extra byte + // for length information. + // + // Item blowup is trickier to measure. Suppose the "copy" op copies + // 4 bytes of data. Because of a special check in the encoding code, + // we produce a 4-byte copy only if the offset is < 65536. Therefore + // the copy op takes 3 bytes to encode, and this type of item leads + // to at most the 62/60 blowup for representing literals. + // + // Suppose the "copy" op copies 5 bytes of data. If the offset is big + // enough, it will take 5 bytes to encode the copy op. Therefore the + // worst case here is a one-byte literal followed by a five-byte copy. + // That is, 6 bytes of input turn into 7 bytes of "compressed" data. + // + // This last factor dominates the blowup, so the final estimate is: + n = 32 + n + n/6 + if n > 0xffffffff { + return -1 + } + return int(n) +} + +var errClosed = errors.New("snappy: Writer is closed") + +// NewWriter returns a new Writer that compresses to w. +// +// The Writer returned does not buffer writes. There is no need to Flush or +// Close such a Writer. +// +// Deprecated: the Writer returned is not suitable for many small writes, only +// for few large writes. Use NewBufferedWriter instead, which is efficient +// regardless of the frequency and shape of the writes, and remember to Close +// that Writer when done. +func NewWriter(w io.Writer) *Writer { + return &Writer{ + w: w, + obuf: make([]byte, obufLen), + } +} + +// NewBufferedWriter returns a new Writer that compresses to w, using the +// framing format described at +// https://github.com/google/snappy/blob/master/framing_format.txt +// +// The Writer returned buffers writes. Users must call Close to guarantee all +// data has been forwarded to the underlying io.Writer. They may also call +// Flush zero or more times before calling Close. +func NewBufferedWriter(w io.Writer) *Writer { + return &Writer{ + w: w, + ibuf: make([]byte, 0, maxBlockSize), + obuf: make([]byte, obufLen), + } +} + +// Writer is an io.Writer than can write Snappy-compressed bytes. +type Writer struct { + w io.Writer + err error + + // ibuf is a buffer for the incoming (uncompressed) bytes. + // + // Its use is optional. For backwards compatibility, Writers created by the + // NewWriter function have ibuf == nil, do not buffer incoming bytes, and + // therefore do not need to be Flush'ed or Close'd. + ibuf []byte + + // obuf is a buffer for the outgoing (compressed) bytes. + obuf []byte + + // wroteStreamHeader is whether we have written the stream header. + wroteStreamHeader bool +} + +// Reset discards the writer's state and switches the Snappy writer to write to +// w. This permits reusing a Writer rather than allocating a new one. +func (w *Writer) Reset(writer io.Writer) { + w.w = writer + w.err = nil + if w.ibuf != nil { + w.ibuf = w.ibuf[:0] + } + w.wroteStreamHeader = false +} + +// Write satisfies the io.Writer interface. +func (w *Writer) Write(p []byte) (nRet int, errRet error) { + if w.ibuf == nil { + // Do not buffer incoming bytes. This does not perform or compress well + // if the caller of Writer.Write writes many small slices. This + // behavior is therefore deprecated, but still supported for backwards + // compatibility with code that doesn't explicitly Flush or Close. + return w.write(p) + } + + // The remainder of this method is based on bufio.Writer.Write from the + // standard library. + + for len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil { + var n int + if len(w.ibuf) == 0 { + // Large write, empty buffer. + // Write directly from p to avoid copy. + n, _ = w.write(p) + } else { + n = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) + w.ibuf = w.ibuf[:len(w.ibuf)+n] + w.Flush() + } + nRet += n + p = p[n:] + } + if w.err != nil { + return nRet, w.err + } + n := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) + w.ibuf = w.ibuf[:len(w.ibuf)+n] + nRet += n + return nRet, nil +} + +func (w *Writer) write(p []byte) (nRet int, errRet error) { + if w.err != nil { + return 0, w.err + } + for len(p) > 0 { + obufStart := len(magicChunk) + if !w.wroteStreamHeader { + w.wroteStreamHeader = true + copy(w.obuf, magicChunk) + obufStart = 0 + } + + var uncompressed []byte + if len(p) > maxBlockSize { + uncompressed, p = p[:maxBlockSize], p[maxBlockSize:] + } else { + uncompressed, p = p, nil + } + checksum := crc(uncompressed) + + // Compress the buffer, discarding the result if the improvement + // isn't at least 12.5%. + compressed := Encode(w.obuf[obufHeaderLen:], uncompressed) + chunkType := uint8(chunkTypeCompressedData) + chunkLen := 4 + len(compressed) + obufEnd := obufHeaderLen + len(compressed) + if len(compressed) >= len(uncompressed)-len(uncompressed)/8 { + chunkType = chunkTypeUncompressedData + chunkLen = 4 + len(uncompressed) + obufEnd = obufHeaderLen + } + + // Fill in the per-chunk header that comes before the body. + w.obuf[len(magicChunk)+0] = chunkType + w.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0) + w.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8) + w.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16) + w.obuf[len(magicChunk)+4] = uint8(checksum >> 0) + w.obuf[len(magicChunk)+5] = uint8(checksum >> 8) + w.obuf[len(magicChunk)+6] = uint8(checksum >> 16) + w.obuf[len(magicChunk)+7] = uint8(checksum >> 24) + + if _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil { + w.err = err + return nRet, err + } + if chunkType == chunkTypeUncompressedData { + if _, err := w.w.Write(uncompressed); err != nil { + w.err = err + return nRet, err + } + } + nRet += len(uncompressed) + } + return nRet, nil +} + +// Flush flushes the Writer to its underlying io.Writer. +func (w *Writer) Flush() error { + if w.err != nil { + return w.err + } + if len(w.ibuf) == 0 { + return nil + } + w.write(w.ibuf) + w.ibuf = w.ibuf[:0] + return w.err +} + +// Close calls Flush and then closes the Writer. +func (w *Writer) Close() error { + w.Flush() + ret := w.err + if w.err == nil { + w.err = errClosed + } + return ret +} diff --git a/vendor/src/github.com/golang/snappy/encode_amd64.go b/vendor/src/github.com/golang/snappy/encode_amd64.go new file mode 100644 index 0000000..2a56fb5 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/encode_amd64.go @@ -0,0 +1,29 @@ +// Copyright 2016 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine +// +build gc +// +build !noasm + +package snappy + +// emitLiteral has the same semantics as in encode_other.go. +// +//go:noescape +func emitLiteral(dst, lit []byte) int + +// emitCopy has the same semantics as in encode_other.go. +// +//go:noescape +func emitCopy(dst []byte, offset, length int) int + +// extendMatch has the same semantics as in encode_other.go. +// +//go:noescape +func extendMatch(src []byte, i, j int) int + +// encodeBlock has the same semantics as in encode_other.go. +// +//go:noescape +func encodeBlock(dst, src []byte) (d int) \ No newline at end of file diff --git a/vendor/src/github.com/golang/snappy/encode_amd64.s b/vendor/src/github.com/golang/snappy/encode_amd64.s new file mode 100644 index 0000000..adfd979 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/encode_amd64.s @@ -0,0 +1,730 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine +// +build gc +// +build !noasm + +#include "textflag.h" + +// The XXX lines assemble on Go 1.4, 1.5 and 1.7, but not 1.6, due to a +// Go toolchain regression. See https://github.com/golang/go/issues/15426 and +// https://github.com/golang/snappy/issues/29 +// +// As a workaround, the package was built with a known good assembler, and +// those instructions were disassembled by "objdump -d" to yield the +// 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 +// style comments, in AT&T asm syntax. Note that rsp here is a physical +// register, not Go/asm's SP pseudo-register (see https://golang.org/doc/asm). +// The instructions were then encoded as "BYTE $0x.." sequences, which assemble +// fine on Go 1.6. + +// The asm code generally follows the pure Go code in encode_other.go, except +// where marked with a "!!!". + +// ---------------------------------------------------------------------------- + +// func emitLiteral(dst, lit []byte) int +// +// All local variables fit into registers. The register allocation: +// - AX len(lit) +// - BX n +// - DX return value +// - DI &dst[i] +// - R10 &lit[0] +// +// The 24 bytes of stack space is to call runtime·memmove. +// +// The unusual register allocation of local variables, such as R10 for the +// source pointer, matches the allocation used at the call site in encodeBlock, +// which makes it easier to manually inline this function. +TEXT ·emitLiteral(SB), NOSPLIT, $24-56 + MOVQ dst_base+0(FP), DI + MOVQ lit_base+24(FP), R10 + MOVQ lit_len+32(FP), AX + MOVQ AX, DX + MOVL AX, BX + SUBL $1, BX + + CMPL BX, $60 + JLT oneByte + CMPL BX, $256 + JLT twoBytes + +threeBytes: + MOVB $0xf4, 0(DI) + MOVW BX, 1(DI) + ADDQ $3, DI + ADDQ $3, DX + JMP memmove + +twoBytes: + MOVB $0xf0, 0(DI) + MOVB BX, 1(DI) + ADDQ $2, DI + ADDQ $2, DX + JMP memmove + +oneByte: + SHLB $2, BX + MOVB BX, 0(DI) + ADDQ $1, DI + ADDQ $1, DX + +memmove: + MOVQ DX, ret+48(FP) + + // copy(dst[i:], lit) + // + // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push + // DI, R10 and AX as arguments. + MOVQ DI, 0(SP) + MOVQ R10, 8(SP) + MOVQ AX, 16(SP) + CALL runtime·memmove(SB) + RET + +// ---------------------------------------------------------------------------- + +// func emitCopy(dst []byte, offset, length int) int +// +// All local variables fit into registers. The register allocation: +// - AX length +// - SI &dst[0] +// - DI &dst[i] +// - R11 offset +// +// The unusual register allocation of local variables, such as R11 for the +// offset, matches the allocation used at the call site in encodeBlock, which +// makes it easier to manually inline this function. +TEXT ·emitCopy(SB), NOSPLIT, $0-48 + MOVQ dst_base+0(FP), DI + MOVQ DI, SI + MOVQ offset+24(FP), R11 + MOVQ length+32(FP), AX + +loop0: + // for length >= 68 { etc } + CMPL AX, $68 + JLT step1 + + // Emit a length 64 copy, encoded as 3 bytes. + MOVB $0xfe, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + SUBL $64, AX + JMP loop0 + +step1: + // if length > 64 { etc } + CMPL AX, $64 + JLE step2 + + // Emit a length 60 copy, encoded as 3 bytes. + MOVB $0xee, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + SUBL $60, AX + +step2: + // if length >= 12 || offset >= 2048 { goto step3 } + CMPL AX, $12 + JGE step3 + CMPL R11, $2048 + JGE step3 + + // Emit the remaining copy, encoded as 2 bytes. + MOVB R11, 1(DI) + SHRL $8, R11 + SHLB $5, R11 + SUBB $4, AX + SHLB $2, AX + ORB AX, R11 + ORB $1, R11 + MOVB R11, 0(DI) + ADDQ $2, DI + + // Return the number of bytes written. + SUBQ SI, DI + MOVQ DI, ret+40(FP) + RET + +step3: + // Emit the remaining copy, encoded as 3 bytes. + SUBL $1, AX + SHLB $2, AX + ORB $2, AX + MOVB AX, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + + // Return the number of bytes written. + SUBQ SI, DI + MOVQ DI, ret+40(FP) + RET + +// ---------------------------------------------------------------------------- + +// func extendMatch(src []byte, i, j int) int +// +// All local variables fit into registers. The register allocation: +// - DX &src[0] +// - SI &src[j] +// - R13 &src[len(src) - 8] +// - R14 &src[len(src)] +// - R15 &src[i] +// +// The unusual register allocation of local variables, such as R15 for a source +// pointer, matches the allocation used at the call site in encodeBlock, which +// makes it easier to manually inline this function. +TEXT ·extendMatch(SB), NOSPLIT, $0-48 + MOVQ src_base+0(FP), DX + MOVQ src_len+8(FP), R14 + MOVQ i+24(FP), R15 + MOVQ j+32(FP), SI + ADDQ DX, R14 + ADDQ DX, R15 + ADDQ DX, SI + MOVQ R14, R13 + SUBQ $8, R13 + +cmp8: + // As long as we are 8 or more bytes before the end of src, we can load and + // compare 8 bytes at a time. If those 8 bytes are equal, repeat. + CMPQ SI, R13 + JA cmp1 + MOVQ (R15), AX + MOVQ (SI), BX + CMPQ AX, BX + JNE bsf + ADDQ $8, R15 + ADDQ $8, SI + JMP cmp8 + +bsf: + // If those 8 bytes were not equal, XOR the two 8 byte values, and return + // the index of the first byte that differs. The BSF instruction finds the + // least significant 1 bit, the amd64 architecture is little-endian, and + // the shift by 3 converts a bit index to a byte index. + XORQ AX, BX + BSFQ BX, BX + SHRQ $3, BX + ADDQ BX, SI + + // Convert from &src[ret] to ret. + SUBQ DX, SI + MOVQ SI, ret+40(FP) + RET + +cmp1: + // In src's tail, compare 1 byte at a time. + CMPQ SI, R14 + JAE extendMatchEnd + MOVB (R15), AX + MOVB (SI), BX + CMPB AX, BX + JNE extendMatchEnd + ADDQ $1, R15 + ADDQ $1, SI + JMP cmp1 + +extendMatchEnd: + // Convert from &src[ret] to ret. + SUBQ DX, SI + MOVQ SI, ret+40(FP) + RET + +// ---------------------------------------------------------------------------- + +// func encodeBlock(dst, src []byte) (d int) +// +// All local variables fit into registers, other than "var table". The register +// allocation: +// - AX . . +// - BX . . +// - CX 56 shift (note that amd64 shifts by non-immediates must use CX). +// - DX 64 &src[0], tableSize +// - SI 72 &src[s] +// - DI 80 &dst[d] +// - R9 88 sLimit +// - R10 . &src[nextEmit] +// - R11 96 prevHash, currHash, nextHash, offset +// - R12 104 &src[base], skip +// - R13 . &src[nextS], &src[len(src) - 8] +// - R14 . len(src), bytesBetweenHashLookups, &src[len(src)], x +// - R15 112 candidate +// +// The second column (56, 64, etc) is the stack offset to spill the registers +// when calling other functions. We could pack this slightly tighter, but it's +// simpler to have a dedicated spill map independent of the function called. +// +// "var table [maxTableSize]uint16" takes up 32768 bytes of stack space. An +// extra 56 bytes, to call other functions, and an extra 64 bytes, to spill +// local variables (registers) during calls gives 32768 + 56 + 64 = 32888. +TEXT ·encodeBlock(SB), 0, $32888-56 + MOVQ dst_base+0(FP), DI + MOVQ src_base+24(FP), SI + MOVQ src_len+32(FP), R14 + + // shift, tableSize := uint32(32-8), 1<<8 + MOVQ $24, CX + MOVQ $256, DX + +calcShift: + // for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { + // shift-- + // } + CMPQ DX, $16384 + JGE varTable + CMPQ DX, R14 + JGE varTable + SUBQ $1, CX + SHLQ $1, DX + JMP calcShift + +varTable: + // var table [maxTableSize]uint16 + // + // In the asm code, unlike the Go code, we can zero-initialize only the + // first tableSize elements. Each uint16 element is 2 bytes and each MOVOU + // writes 16 bytes, so we can do only tableSize/8 writes instead of the + // 2048 writes that would zero-initialize all of table's 32768 bytes. + SHRQ $3, DX + LEAQ table-32768(SP), BX + PXOR X0, X0 + +memclr: + MOVOU X0, 0(BX) + ADDQ $16, BX + SUBQ $1, DX + JNZ memclr + + // !!! DX = &src[0] + MOVQ SI, DX + + // sLimit := len(src) - inputMargin + MOVQ R14, R9 + SUBQ $15, R9 + + // !!! Pre-emptively spill CX, DX and R9 to the stack. Their values don't + // change for the rest of the function. + MOVQ CX, 56(SP) + MOVQ DX, 64(SP) + MOVQ R9, 88(SP) + + // nextEmit := 0 + MOVQ DX, R10 + + // s := 1 + ADDQ $1, SI + + // nextHash := hash(load32(src, s), shift) + MOVL 0(SI), R11 + IMULL $0x1e35a7bd, R11 + SHRL CX, R11 + +outer: + // for { etc } + + // skip := 32 + MOVQ $32, R12 + + // nextS := s + MOVQ SI, R13 + + // candidate := 0 + MOVQ $0, R15 + +inner0: + // for { etc } + + // s := nextS + MOVQ R13, SI + + // bytesBetweenHashLookups := skip >> 5 + MOVQ R12, R14 + SHRQ $5, R14 + + // nextS = s + bytesBetweenHashLookups + ADDQ R14, R13 + + // skip += bytesBetweenHashLookups + ADDQ R14, R12 + + // if nextS > sLimit { goto emitRemainder } + MOVQ R13, AX + SUBQ DX, AX + CMPQ AX, R9 + JA emitRemainder + + // candidate = int(table[nextHash]) + // XXX: MOVWQZX table-32768(SP)(R11*2), R15 + // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 + BYTE $0x4e + BYTE $0x0f + BYTE $0xb7 + BYTE $0x7c + BYTE $0x5c + BYTE $0x78 + + // table[nextHash] = uint16(s) + MOVQ SI, AX + SUBQ DX, AX + + // XXX: MOVW AX, table-32768(SP)(R11*2) + // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) + BYTE $0x66 + BYTE $0x42 + BYTE $0x89 + BYTE $0x44 + BYTE $0x5c + BYTE $0x78 + + // nextHash = hash(load32(src, nextS), shift) + MOVL 0(R13), R11 + IMULL $0x1e35a7bd, R11 + SHRL CX, R11 + + // if load32(src, s) != load32(src, candidate) { continue } break + MOVL 0(SI), AX + MOVL (DX)(R15*1), BX + CMPL AX, BX + JNE inner0 + +fourByteMatch: + // As per the encode_other.go code: + // + // A 4-byte match has been found. We'll later see etc. + + // !!! Jump to a fast path for short (<= 16 byte) literals. See the comment + // on inputMargin in encode.go. + MOVQ SI, AX + SUBQ R10, AX + CMPQ AX, $16 + JLE emitLiteralFastPath + + // ---------------------------------------- + // Begin inline of the emitLiteral call. + // + // d += emitLiteral(dst[d:], src[nextEmit:s]) + + MOVL AX, BX + SUBL $1, BX + + CMPL BX, $60 + JLT inlineEmitLiteralOneByte + CMPL BX, $256 + JLT inlineEmitLiteralTwoBytes + +inlineEmitLiteralThreeBytes: + MOVB $0xf4, 0(DI) + MOVW BX, 1(DI) + ADDQ $3, DI + JMP inlineEmitLiteralMemmove + +inlineEmitLiteralTwoBytes: + MOVB $0xf0, 0(DI) + MOVB BX, 1(DI) + ADDQ $2, DI + JMP inlineEmitLiteralMemmove + +inlineEmitLiteralOneByte: + SHLB $2, BX + MOVB BX, 0(DI) + ADDQ $1, DI + +inlineEmitLiteralMemmove: + // Spill local variables (registers) onto the stack; call; unspill. + // + // copy(dst[i:], lit) + // + // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push + // DI, R10 and AX as arguments. + MOVQ DI, 0(SP) + MOVQ R10, 8(SP) + MOVQ AX, 16(SP) + ADDQ AX, DI // Finish the "d +=" part of "d += emitLiteral(etc)". + MOVQ SI, 72(SP) + MOVQ DI, 80(SP) + MOVQ R15, 112(SP) + CALL runtime·memmove(SB) + MOVQ 56(SP), CX + MOVQ 64(SP), DX + MOVQ 72(SP), SI + MOVQ 80(SP), DI + MOVQ 88(SP), R9 + MOVQ 112(SP), R15 + JMP inner1 + +inlineEmitLiteralEnd: + // End inline of the emitLiteral call. + // ---------------------------------------- + +emitLiteralFastPath: + // !!! Emit the 1-byte encoding "uint8(len(lit)-1)<<2". + MOVB AX, BX + SUBB $1, BX + SHLB $2, BX + MOVB BX, (DI) + ADDQ $1, DI + + // !!! Implement the copy from lit to dst as a 16-byte load and store. + // (Encode's documentation says that dst and src must not overlap.) + // + // This always copies 16 bytes, instead of only len(lit) bytes, but that's + // OK. Subsequent iterations will fix up the overrun. + // + // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or + // 16-byte loads and stores. This technique probably wouldn't be as + // effective on architectures that are fussier about alignment. + MOVOU 0(R10), X0 + MOVOU X0, 0(DI) + ADDQ AX, DI + +inner1: + // for { etc } + + // base := s + MOVQ SI, R12 + + // !!! offset := base - candidate + MOVQ R12, R11 + SUBQ R15, R11 + SUBQ DX, R11 + + // ---------------------------------------- + // Begin inline of the extendMatch call. + // + // s = extendMatch(src, candidate+4, s+4) + + // !!! R14 = &src[len(src)] + MOVQ src_len+32(FP), R14 + ADDQ DX, R14 + + // !!! R13 = &src[len(src) - 8] + MOVQ R14, R13 + SUBQ $8, R13 + + // !!! R15 = &src[candidate + 4] + ADDQ $4, R15 + ADDQ DX, R15 + + // !!! s += 4 + ADDQ $4, SI + +inlineExtendMatchCmp8: + // As long as we are 8 or more bytes before the end of src, we can load and + // compare 8 bytes at a time. If those 8 bytes are equal, repeat. + CMPQ SI, R13 + JA inlineExtendMatchCmp1 + MOVQ (R15), AX + MOVQ (SI), BX + CMPQ AX, BX + JNE inlineExtendMatchBSF + ADDQ $8, R15 + ADDQ $8, SI + JMP inlineExtendMatchCmp8 + +inlineExtendMatchBSF: + // If those 8 bytes were not equal, XOR the two 8 byte values, and return + // the index of the first byte that differs. The BSF instruction finds the + // least significant 1 bit, the amd64 architecture is little-endian, and + // the shift by 3 converts a bit index to a byte index. + XORQ AX, BX + BSFQ BX, BX + SHRQ $3, BX + ADDQ BX, SI + JMP inlineExtendMatchEnd + +inlineExtendMatchCmp1: + // In src's tail, compare 1 byte at a time. + CMPQ SI, R14 + JAE inlineExtendMatchEnd + MOVB (R15), AX + MOVB (SI), BX + CMPB AX, BX + JNE inlineExtendMatchEnd + ADDQ $1, R15 + ADDQ $1, SI + JMP inlineExtendMatchCmp1 + +inlineExtendMatchEnd: + // End inline of the extendMatch call. + // ---------------------------------------- + + // ---------------------------------------- + // Begin inline of the emitCopy call. + // + // d += emitCopy(dst[d:], base-candidate, s-base) + + // !!! length := s - base + MOVQ SI, AX + SUBQ R12, AX + +inlineEmitCopyLoop0: + // for length >= 68 { etc } + CMPL AX, $68 + JLT inlineEmitCopyStep1 + + // Emit a length 64 copy, encoded as 3 bytes. + MOVB $0xfe, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + SUBL $64, AX + JMP inlineEmitCopyLoop0 + +inlineEmitCopyStep1: + // if length > 64 { etc } + CMPL AX, $64 + JLE inlineEmitCopyStep2 + + // Emit a length 60 copy, encoded as 3 bytes. + MOVB $0xee, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + SUBL $60, AX + +inlineEmitCopyStep2: + // if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 } + CMPL AX, $12 + JGE inlineEmitCopyStep3 + CMPL R11, $2048 + JGE inlineEmitCopyStep3 + + // Emit the remaining copy, encoded as 2 bytes. + MOVB R11, 1(DI) + SHRL $8, R11 + SHLB $5, R11 + SUBB $4, AX + SHLB $2, AX + ORB AX, R11 + ORB $1, R11 + MOVB R11, 0(DI) + ADDQ $2, DI + JMP inlineEmitCopyEnd + +inlineEmitCopyStep3: + // Emit the remaining copy, encoded as 3 bytes. + SUBL $1, AX + SHLB $2, AX + ORB $2, AX + MOVB AX, 0(DI) + MOVW R11, 1(DI) + ADDQ $3, DI + +inlineEmitCopyEnd: + // End inline of the emitCopy call. + // ---------------------------------------- + + // nextEmit = s + MOVQ SI, R10 + + // if s >= sLimit { goto emitRemainder } + MOVQ SI, AX + SUBQ DX, AX + CMPQ AX, R9 + JAE emitRemainder + + // As per the encode_other.go code: + // + // We could immediately etc. + + // x := load64(src, s-1) + MOVQ -1(SI), R14 + + // prevHash := hash(uint32(x>>0), shift) + MOVL R14, R11 + IMULL $0x1e35a7bd, R11 + SHRL CX, R11 + + // table[prevHash] = uint16(s-1) + MOVQ SI, AX + SUBQ DX, AX + SUBQ $1, AX + + // XXX: MOVW AX, table-32768(SP)(R11*2) + // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) + BYTE $0x66 + BYTE $0x42 + BYTE $0x89 + BYTE $0x44 + BYTE $0x5c + BYTE $0x78 + + // currHash := hash(uint32(x>>8), shift) + SHRQ $8, R14 + MOVL R14, R11 + IMULL $0x1e35a7bd, R11 + SHRL CX, R11 + + // candidate = int(table[currHash]) + // XXX: MOVWQZX table-32768(SP)(R11*2), R15 + // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 + BYTE $0x4e + BYTE $0x0f + BYTE $0xb7 + BYTE $0x7c + BYTE $0x5c + BYTE $0x78 + + // table[currHash] = uint16(s) + ADDQ $1, AX + + // XXX: MOVW AX, table-32768(SP)(R11*2) + // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) + BYTE $0x66 + BYTE $0x42 + BYTE $0x89 + BYTE $0x44 + BYTE $0x5c + BYTE $0x78 + + // if uint32(x>>8) == load32(src, candidate) { continue } + MOVL (DX)(R15*1), BX + CMPL R14, BX + JEQ inner1 + + // nextHash = hash(uint32(x>>16), shift) + SHRQ $8, R14 + MOVL R14, R11 + IMULL $0x1e35a7bd, R11 + SHRL CX, R11 + + // s++ + ADDQ $1, SI + + // break out of the inner1 for loop, i.e. continue the outer loop. + JMP outer + +emitRemainder: + // if nextEmit < len(src) { etc } + MOVQ src_len+32(FP), AX + ADDQ DX, AX + CMPQ R10, AX + JEQ encodeBlockEnd + + // d += emitLiteral(dst[d:], src[nextEmit:]) + // + // Push args. + MOVQ DI, 0(SP) + MOVQ $0, 8(SP) // Unnecessary, as the callee ignores it, but conservative. + MOVQ $0, 16(SP) // Unnecessary, as the callee ignores it, but conservative. + MOVQ R10, 24(SP) + SUBQ R10, AX + MOVQ AX, 32(SP) + MOVQ AX, 40(SP) // Unnecessary, as the callee ignores it, but conservative. + + // Spill local variables (registers) onto the stack; call; unspill. + MOVQ DI, 80(SP) + CALL ·emitLiteral(SB) + MOVQ 80(SP), DI + + // Finish the "d +=" part of "d += emitLiteral(etc)". + ADDQ 48(SP), DI + +encodeBlockEnd: + MOVQ dst_base+0(FP), AX + SUBQ AX, DI + MOVQ DI, d+48(FP) + RET diff --git a/vendor/src/github.com/golang/snappy/encode_other.go b/vendor/src/github.com/golang/snappy/encode_other.go new file mode 100644 index 0000000..dbcae90 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/encode_other.go @@ -0,0 +1,238 @@ +// Copyright 2016 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 appengine !gc noasm + +package snappy + +func load32(b []byte, i int) uint32 { + b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func load64(b []byte, i int) uint64 { + b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +// emitLiteral writes a literal chunk and returns the number of bytes written. +// +// It assumes that: +// dst is long enough to hold the encoded bytes +// 1 <= len(lit) && len(lit) <= 65536 +func emitLiteral(dst, lit []byte) int { + i, n := 0, uint(len(lit)-1) + switch { + case n < 60: + dst[0] = uint8(n)<<2 | tagLiteral + i = 1 + case n < 1<<8: + dst[0] = 60<<2 | tagLiteral + dst[1] = uint8(n) + i = 2 + default: + dst[0] = 61<<2 | tagLiteral + dst[1] = uint8(n) + dst[2] = uint8(n >> 8) + i = 3 + } + return i + copy(dst[i:], lit) +} + +// emitCopy writes a copy chunk and returns the number of bytes written. +// +// It assumes that: +// dst is long enough to hold the encoded bytes +// 1 <= offset && offset <= 65535 +// 4 <= length && length <= 65535 +func emitCopy(dst []byte, offset, length int) int { + i := 0 + // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The + // threshold for this loop is a little higher (at 68 = 64 + 4), and the + // length emitted down below is is a little lower (at 60 = 64 - 4), because + // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed + // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as + // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as + // 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a + // tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an + // encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1. + for length >= 68 { + // Emit a length 64 copy, encoded as 3 bytes. + dst[i+0] = 63<<2 | tagCopy2 + dst[i+1] = uint8(offset) + dst[i+2] = uint8(offset >> 8) + i += 3 + length -= 64 + } + if length > 64 { + // Emit a length 60 copy, encoded as 3 bytes. + dst[i+0] = 59<<2 | tagCopy2 + dst[i+1] = uint8(offset) + dst[i+2] = uint8(offset >> 8) + i += 3 + length -= 60 + } + if length >= 12 || offset >= 2048 { + // Emit the remaining copy, encoded as 3 bytes. + dst[i+0] = uint8(length-1)<<2 | tagCopy2 + dst[i+1] = uint8(offset) + dst[i+2] = uint8(offset >> 8) + return i + 3 + } + // Emit the remaining copy, encoded as 2 bytes. + dst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1 + dst[i+1] = uint8(offset) + return i + 2 +} + +// extendMatch returns the largest k such that k <= len(src) and that +// src[i:i+k-j] and src[j:k] have the same contents. +// +// It assumes that: +// 0 <= i && i < j && j <= len(src) +func extendMatch(src []byte, i, j int) int { + for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { + } + return j +} + +func hash(u, shift uint32) uint32 { + return (u * 0x1e35a7bd) >> shift +} + +// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It +// assumes that the varint-encoded length of the decompressed bytes has already +// been written. +// +// It also assumes that: +// len(dst) >= MaxEncodedLen(len(src)) && +// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize +func encodeBlock(dst, src []byte) (d int) { + // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. + // The table element type is uint16, as s < sLimit and sLimit < len(src) + // and len(src) <= maxBlockSize and maxBlockSize == 65536. + const ( + maxTableSize = 1 << 14 + // tableMask is redundant, but helps the compiler eliminate bounds + // checks. + tableMask = maxTableSize - 1 + ) + shift := uint32(32 - 8) + for tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { + shift-- + } + // In Go, all array elements are zero-initialized, so there is no advantage + // to a smaller tableSize per se. However, it matches the C++ algorithm, + // and in the asm versions of this code, we can get away with zeroing only + // the first tableSize elements. + var table [maxTableSize]uint16 + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := len(src) - inputMargin + + // nextEmit is where in src the next emitLiteral should start from. + nextEmit := 0 + + // The encoded form must start with a literal, as there are no previous + // bytes to copy, so we start looking for hash matches at s == 1. + s := 1 + nextHash := hash(load32(src, s), shift) + + for { + // Copied from the C++ snappy implementation: + // + // Heuristic match skipping: If 32 bytes are scanned with no matches + // found, start looking only at every other byte. If 32 more bytes are + // scanned (or skipped), look at every third byte, etc.. When a match + // is found, immediately go back to looking at every byte. This is a + // small loss (~5% performance, ~0.1% density) for compressible data + // due to more bookkeeping, but for non-compressible data (such as + // JPEG) it's a huge win since the compressor quickly "realizes" the + // data is incompressible and doesn't bother looking for matches + // everywhere. + // + // The "skip" variable keeps track of how many bytes there are since + // the last match; dividing it by 32 (ie. right-shifting by five) gives + // the number of bytes to move ahead for each iteration. + skip := 32 + + nextS := s + candidate := 0 + for { + s = nextS + bytesBetweenHashLookups := skip >> 5 + nextS = s + bytesBetweenHashLookups + skip += bytesBetweenHashLookups + if nextS > sLimit { + goto emitRemainder + } + candidate = int(table[nextHash&tableMask]) + table[nextHash&tableMask] = uint16(s) + nextHash = hash(load32(src, nextS), shift) + if load32(src, s) == load32(src, candidate) { + break + } + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + d += emitLiteral(dst[d:], src[nextEmit:s]) + + // Call emitCopy, and then see if another emitCopy could be our next + // move. Repeat until we find no match for the input immediately after + // what was consumed by the last emitCopy call. + // + // If we exit this loop normally then we need to call emitLiteral next, + // though we don't yet know how big the literal will be. We handle that + // by proceeding to the next iteration of the main loop. We also can + // exit this loop via goto if we get close to exhausting the input. + for { + // Invariant: we have a 4-byte match at s, and no need to emit any + // literal bytes prior to s. + base := s + + // Extend the 4-byte match as long as possible. + // + // This is an inlined version of: + // s = extendMatch(src, candidate+4, s+4) + s += 4 + for i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 { + } + + d += emitCopy(dst[d:], base-candidate, s-base) + nextEmit = s + if s >= sLimit { + goto emitRemainder + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-1 and at s. If + // another emitCopy is not our next move, also calculate nextHash + // at s+1. At least on GOARCH=amd64, these three hash calculations + // are faster as one load64 call (with some shifts) instead of + // three load32 calls. + x := load64(src, s-1) + prevHash := hash(uint32(x>>0), shift) + table[prevHash&tableMask] = uint16(s - 1) + currHash := hash(uint32(x>>8), shift) + candidate = int(table[currHash&tableMask]) + table[currHash&tableMask] = uint16(s) + if uint32(x>>8) != load32(src, candidate) { + nextHash = hash(uint32(x>>16), shift) + s++ + break + } + } + } + +emitRemainder: + if nextEmit < len(src) { + d += emitLiteral(dst[d:], src[nextEmit:]) + } + return d +} diff --git a/vendor/src/github.com/golang/snappy/golden_test.go b/vendor/src/github.com/golang/snappy/golden_test.go new file mode 100644 index 0000000..e4496f9 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/golden_test.go @@ -0,0 +1,1965 @@ +// Copyright 2016 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package snappy + +// extendMatchGoldenTestCases is the i and j arguments, and the returned value, +// for every extendMatch call issued when encoding the +// testdata/Mark.Twain-Tom.Sawyer.txt file. It is used to benchmark the +// extendMatch implementation. +// +// It was generated manually by adding some print statements to the (pure Go) +// extendMatch implementation: +// +// func extendMatch(src []byte, i, j int) int { +// i0, j0 := i, j +// for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { +// } +// println("{", i0, ",", j0, ",", j, "},") +// return j +// } +// +// and running "go test -test.run=EncodeGoldenInput -tags=noasm". +var extendMatchGoldenTestCases = []struct { + i, j, want int +}{ + {11, 61, 62}, + {80, 81, 82}, + {86, 87, 101}, + {85, 133, 149}, + {152, 153, 162}, + {133, 168, 193}, + {168, 207, 225}, + {81, 255, 275}, + {278, 279, 283}, + {306, 417, 417}, + {373, 428, 430}, + {389, 444, 447}, + {474, 510, 512}, + {465, 533, 533}, + {47, 547, 547}, + {307, 551, 554}, + {420, 582, 587}, + {309, 604, 604}, + {604, 625, 625}, + {538, 629, 629}, + {328, 640, 640}, + {573, 645, 645}, + {319, 657, 657}, + {30, 664, 664}, + {45, 679, 680}, + {621, 684, 684}, + {376, 700, 700}, + {33, 707, 708}, + {601, 733, 733}, + {334, 744, 745}, + {625, 758, 759}, + {382, 763, 763}, + {550, 769, 771}, + {533, 789, 789}, + {804, 813, 813}, + {342, 841, 842}, + {742, 847, 847}, + {74, 852, 852}, + {810, 864, 864}, + {758, 868, 869}, + {714, 883, 883}, + {582, 889, 891}, + {61, 934, 935}, + {894, 942, 942}, + {939, 949, 949}, + {785, 956, 957}, + {886, 978, 978}, + {792, 998, 998}, + {998, 1005, 1005}, + {572, 1032, 1032}, + {698, 1051, 1053}, + {599, 1067, 1069}, + {1056, 1079, 1079}, + {942, 1089, 1090}, + {831, 1094, 1096}, + {1088, 1100, 1103}, + {732, 1113, 1114}, + {1037, 1118, 1118}, + {872, 1128, 1130}, + {1079, 1140, 1142}, + {332, 1162, 1162}, + {207, 1168, 1186}, + {1189, 1190, 1225}, + {105, 1229, 1230}, + {79, 1256, 1257}, + {1190, 1261, 1283}, + {255, 1306, 1306}, + {1319, 1339, 1358}, + {364, 1370, 1370}, + {955, 1378, 1380}, + {122, 1403, 1403}, + {1325, 1407, 1419}, + {664, 1423, 1424}, + {941, 1461, 1463}, + {867, 1477, 1478}, + {757, 1488, 1489}, + {1140, 1499, 1499}, + {31, 1506, 1506}, + {1487, 1510, 1512}, + {1089, 1520, 1521}, + {1467, 1525, 1529}, + {1394, 1537, 1537}, + {1499, 1541, 1541}, + {367, 1558, 1558}, + {1475, 1564, 1564}, + {1525, 1568, 1571}, + {1541, 1582, 1583}, + {864, 1587, 1588}, + {704, 1597, 1597}, + {336, 1602, 1602}, + {1383, 1613, 1613}, + {1498, 1617, 1618}, + {1051, 1623, 1625}, + {401, 1643, 1645}, + {1072, 1654, 1655}, + {1067, 1667, 1669}, + {699, 1673, 1674}, + {1587, 1683, 1684}, + {920, 1696, 1696}, + {1505, 1710, 1710}, + {1550, 1723, 1723}, + {996, 1727, 1727}, + {833, 1733, 1734}, + {1638, 1739, 1740}, + {1654, 1744, 1744}, + {753, 1761, 1761}, + {1548, 1773, 1773}, + {1568, 1777, 1780}, + {1683, 1793, 1794}, + {948, 1801, 1801}, + {1666, 1805, 1808}, + {1502, 1814, 1814}, + {1696, 1822, 1822}, + {502, 1836, 1837}, + {917, 1843, 1843}, + {1733, 1854, 1855}, + {970, 1859, 1859}, + {310, 1863, 1863}, + {657, 1872, 1872}, + {1005, 1876, 1876}, + {1662, 1880, 1880}, + {904, 1892, 1892}, + {1427, 1910, 1910}, + {1772, 1929, 1930}, + {1822, 1937, 1940}, + {1858, 1949, 1950}, + {1602, 1956, 1956}, + {1150, 1962, 1962}, + {1504, 1966, 1967}, + {51, 1971, 1971}, + {1605, 1979, 1979}, + {1458, 1983, 1988}, + {1536, 2001, 2006}, + {1373, 2014, 2018}, + {1494, 2025, 2025}, + {1667, 2029, 2031}, + {1592, 2035, 2035}, + {330, 2045, 2045}, + {1376, 2053, 2053}, + {1991, 2058, 2059}, + {1635, 2065, 2065}, + {1992, 2073, 2074}, + {2014, 2080, 2081}, + {1546, 2085, 2087}, + {59, 2099, 2099}, + {1996, 2106, 2106}, + {1836, 2110, 2110}, + {2068, 2114, 2114}, + {1338, 2122, 2122}, + {1562, 2128, 2130}, + {1934, 2134, 2134}, + {2114, 2141, 2142}, + {977, 2149, 2150}, + {956, 2154, 2155}, + {1407, 2162, 2162}, + {1773, 2166, 2166}, + {883, 2171, 2171}, + {623, 2175, 2178}, + {1520, 2191, 2192}, + {1162, 2200, 2200}, + {912, 2204, 2204}, + {733, 2208, 2208}, + {1777, 2212, 2215}, + {1532, 2219, 2219}, + {718, 2223, 2225}, + {2069, 2229, 2229}, + {2207, 2245, 2246}, + {1139, 2264, 2264}, + {677, 2274, 2274}, + {2099, 2279, 2279}, + {1863, 2283, 2283}, + {1966, 2305, 2306}, + {2279, 2313, 2313}, + {1628, 2319, 2319}, + {755, 2329, 2329}, + {1461, 2334, 2334}, + {2117, 2340, 2340}, + {2313, 2349, 2349}, + {1859, 2353, 2353}, + {1048, 2362, 2362}, + {895, 2366, 2366}, + {2278, 2373, 2373}, + {1884, 2377, 2377}, + {1402, 2387, 2392}, + {700, 2398, 2398}, + {1971, 2402, 2402}, + {2009, 2419, 2419}, + {1441, 2426, 2428}, + {2208, 2432, 2432}, + {2038, 2436, 2436}, + {932, 2443, 2443}, + {1759, 2447, 2448}, + {744, 2452, 2452}, + {1875, 2458, 2458}, + {2405, 2468, 2468}, + {1596, 2472, 2473}, + {1953, 2480, 2482}, + {736, 2487, 2487}, + {1913, 2493, 2493}, + {774, 2497, 2497}, + {1484, 2506, 2508}, + {2432, 2512, 2512}, + {752, 2519, 2519}, + {2497, 2523, 2523}, + {2409, 2528, 2529}, + {2122, 2533, 2533}, + {2396, 2537, 2538}, + {2410, 2547, 2548}, + {1093, 2555, 2560}, + {551, 2564, 2565}, + {2268, 2569, 2569}, + {1362, 2580, 2580}, + {1916, 2584, 2585}, + {994, 2589, 2590}, + {1979, 2596, 2596}, + {1041, 2602, 2602}, + {2104, 2614, 2616}, + {2609, 2621, 2628}, + {2329, 2638, 2638}, + {2211, 2657, 2658}, + {2638, 2662, 2667}, + {2578, 2676, 2679}, + {2153, 2685, 2686}, + {2608, 2696, 2697}, + {598, 2712, 2712}, + {2620, 2719, 2720}, + {1888, 2724, 2728}, + {2709, 2732, 2732}, + {1365, 2739, 2739}, + {784, 2747, 2748}, + {424, 2753, 2753}, + {2204, 2759, 2759}, + {812, 2768, 2769}, + {2455, 2773, 2773}, + {1722, 2781, 2781}, + {1917, 2792, 2792}, + {2705, 2799, 2799}, + {2685, 2806, 2807}, + {2742, 2811, 2811}, + {1370, 2818, 2818}, + {2641, 2830, 2830}, + {2512, 2837, 2837}, + {2457, 2841, 2841}, + {2756, 2845, 2845}, + {2719, 2855, 2855}, + {1423, 2859, 2859}, + {2849, 2863, 2865}, + {1474, 2871, 2871}, + {1161, 2875, 2876}, + {2282, 2880, 2881}, + {2746, 2888, 2888}, + {1783, 2893, 2893}, + {2401, 2899, 2900}, + {2632, 2920, 2923}, + {2422, 2928, 2930}, + {2715, 2939, 2939}, + {2162, 2943, 2943}, + {2859, 2947, 2947}, + {1910, 2951, 2951}, + {1431, 2955, 2956}, + {1439, 2964, 2964}, + {2501, 2968, 2969}, + {2029, 2973, 2976}, + {689, 2983, 2984}, + {1658, 2988, 2988}, + {1031, 2996, 2996}, + {2149, 3001, 3002}, + {25, 3009, 3013}, + {2964, 3023, 3023}, + {953, 3027, 3028}, + {2359, 3036, 3036}, + {3023, 3049, 3049}, + {2880, 3055, 3056}, + {2973, 3076, 3077}, + {2874, 3090, 3090}, + {2871, 3094, 3094}, + {2532, 3100, 3100}, + {2938, 3107, 3108}, + {350, 3115, 3115}, + {2196, 3119, 3121}, + {1133, 3127, 3129}, + {1797, 3134, 3150}, + {3032, 3158, 3158}, + {3016, 3172, 3172}, + {2533, 3179, 3179}, + {3055, 3187, 3188}, + {1384, 3192, 3193}, + {2799, 3199, 3199}, + {2126, 3203, 3207}, + {2334, 3215, 3215}, + {2105, 3220, 3221}, + {3199, 3229, 3229}, + {2891, 3233, 3233}, + {855, 3240, 3240}, + {1852, 3253, 3256}, + {2140, 3263, 3263}, + {1682, 3268, 3270}, + {3243, 3274, 3274}, + {924, 3279, 3279}, + {2212, 3283, 3283}, + {2596, 3287, 3287}, + {2999, 3291, 3291}, + {2353, 3295, 3295}, + {2480, 3302, 3304}, + {1959, 3308, 3311}, + {3000, 3318, 3318}, + {845, 3330, 3330}, + {2283, 3334, 3334}, + {2519, 3342, 3342}, + {3325, 3346, 3348}, + {2397, 3353, 3354}, + {2763, 3358, 3358}, + {3198, 3363, 3364}, + {3211, 3368, 3372}, + {2950, 3376, 3377}, + {3245, 3388, 3391}, + {2264, 3398, 3398}, + {795, 3403, 3403}, + {3287, 3407, 3407}, + {3358, 3411, 3411}, + {3317, 3415, 3415}, + {3232, 3431, 3431}, + {2128, 3435, 3437}, + {3236, 3441, 3441}, + {3398, 3445, 3446}, + {2814, 3450, 3450}, + {3394, 3466, 3466}, + {2425, 3470, 3470}, + {3330, 3476, 3476}, + {1612, 3480, 3480}, + {1004, 3485, 3486}, + {2732, 3490, 3490}, + {1117, 3494, 3495}, + {629, 3501, 3501}, + {3087, 3514, 3514}, + {684, 3518, 3518}, + {3489, 3522, 3524}, + {1760, 3529, 3529}, + {617, 3537, 3537}, + {3431, 3541, 3541}, + {997, 3547, 3547}, + {882, 3552, 3553}, + {2419, 3558, 3558}, + {610, 3562, 3563}, + {1903, 3567, 3569}, + {3005, 3575, 3575}, + {3076, 3585, 3586}, + {3541, 3590, 3590}, + {3490, 3594, 3594}, + {1899, 3599, 3599}, + {3545, 3606, 3606}, + {3290, 3614, 3615}, + {2056, 3619, 3620}, + {3556, 3625, 3625}, + {3294, 3632, 3633}, + {637, 3643, 3644}, + {3609, 3648, 3650}, + {3175, 3658, 3658}, + {3498, 3665, 3665}, + {1597, 3669, 3669}, + {1983, 3673, 3673}, + {3215, 3682, 3682}, + {3544, 3689, 3689}, + {3694, 3698, 3698}, + {3228, 3715, 3716}, + {2594, 3720, 3722}, + {3573, 3726, 3726}, + {2479, 3732, 3735}, + {3191, 3741, 3742}, + {1113, 3746, 3747}, + {2844, 3751, 3751}, + {3445, 3756, 3757}, + {3755, 3766, 3766}, + {3421, 3775, 3780}, + {3593, 3784, 3786}, + {3263, 3796, 3796}, + {3469, 3806, 3806}, + {2602, 3815, 3815}, + {723, 3819, 3821}, + {1608, 3826, 3826}, + {3334, 3830, 3830}, + {2198, 3835, 3835}, + {2635, 3840, 3840}, + {3702, 3852, 3853}, + {3406, 3858, 3859}, + {3681, 3867, 3870}, + {3407, 3880, 3880}, + {340, 3889, 3889}, + {3772, 3893, 3893}, + {593, 3897, 3897}, + {2563, 3914, 3916}, + {2981, 3929, 3929}, + {1835, 3933, 3934}, + {3906, 3951, 3951}, + {1459, 3958, 3958}, + {3889, 3974, 3974}, + {2188, 3982, 3982}, + {3220, 3986, 3987}, + {3585, 3991, 3993}, + {3712, 3997, 4001}, + {2805, 4007, 4007}, + {1879, 4012, 4013}, + {3618, 4018, 4018}, + {1145, 4031, 4032}, + {3901, 4037, 4037}, + {2772, 4046, 4047}, + {2802, 4053, 4054}, + {3299, 4058, 4058}, + {3725, 4066, 4066}, + {2271, 4070, 4070}, + {385, 4075, 4076}, + {3624, 4089, 4090}, + {3745, 4096, 4098}, + {1563, 4102, 4102}, + {4045, 4106, 4111}, + {3696, 4115, 4119}, + {3376, 4125, 4126}, + {1880, 4130, 4130}, + {2048, 4140, 4141}, + {2724, 4149, 4149}, + {1767, 4156, 4156}, + {2601, 4164, 4164}, + {2757, 4168, 4168}, + {3974, 4172, 4172}, + {3914, 4178, 4178}, + {516, 4185, 4185}, + {1032, 4189, 4190}, + {3462, 4197, 4198}, + {3805, 4202, 4203}, + {3910, 4207, 4212}, + {3075, 4221, 4221}, + {3756, 4225, 4226}, + {1872, 4236, 4237}, + {3844, 4241, 4241}, + {3991, 4245, 4249}, + {2203, 4258, 4258}, + {3903, 4267, 4268}, + {705, 4272, 4272}, + {1896, 4276, 4276}, + {1955, 4285, 4288}, + {3746, 4302, 4303}, + {2672, 4311, 4311}, + {3969, 4317, 4317}, + {3883, 4322, 4322}, + {1920, 4339, 4340}, + {3527, 4344, 4346}, + {1160, 4358, 4358}, + {3648, 4364, 4366}, + {2711, 4387, 4387}, + {3619, 4391, 4392}, + {1944, 4396, 4396}, + {4369, 4400, 4400}, + {2736, 4404, 4407}, + {2546, 4411, 4412}, + {4390, 4422, 4422}, + {3610, 4426, 4427}, + {4058, 4431, 4431}, + {4374, 4435, 4435}, + {3463, 4445, 4446}, + {1813, 4452, 4452}, + {3669, 4456, 4456}, + {3830, 4460, 4460}, + {421, 4464, 4465}, + {1719, 4471, 4471}, + {3880, 4475, 4475}, + {1834, 4485, 4487}, + {3590, 4491, 4491}, + {442, 4496, 4497}, + {4435, 4501, 4501}, + {3814, 4509, 4509}, + {987, 4513, 4513}, + {4494, 4518, 4521}, + {3218, 4526, 4529}, + {4221, 4537, 4537}, + {2778, 4543, 4545}, + {4422, 4552, 4552}, + {4031, 4558, 4559}, + {4178, 4563, 4563}, + {3726, 4567, 4574}, + {4027, 4578, 4578}, + {4339, 4585, 4587}, + {3796, 4592, 4595}, + {543, 4600, 4613}, + {2855, 4620, 4621}, + {2795, 4627, 4627}, + {3440, 4631, 4632}, + {4279, 4636, 4639}, + {4245, 4643, 4645}, + {4516, 4649, 4650}, + {3133, 4654, 4654}, + {4042, 4658, 4659}, + {3422, 4663, 4663}, + {4046, 4667, 4668}, + {4267, 4672, 4672}, + {4004, 4676, 4677}, + {2490, 4682, 4682}, + {2451, 4697, 4697}, + {3027, 4705, 4705}, + {4028, 4717, 4717}, + {4460, 4721, 4721}, + {2471, 4725, 4727}, + {3090, 4735, 4735}, + {3192, 4739, 4740}, + {3835, 4760, 4760}, + {4540, 4764, 4764}, + {4007, 4772, 4774}, + {619, 4784, 4784}, + {3561, 4789, 4791}, + {3367, 4805, 4805}, + {4490, 4810, 4811}, + {2402, 4815, 4815}, + {3352, 4819, 4822}, + {2773, 4828, 4828}, + {4552, 4832, 4832}, + {2522, 4840, 4841}, + {316, 4847, 4852}, + {4715, 4858, 4858}, + {2959, 4862, 4862}, + {4858, 4868, 4869}, + {2134, 4873, 4873}, + {578, 4878, 4878}, + {4189, 4889, 4890}, + {2229, 4894, 4894}, + {4501, 4898, 4898}, + {2297, 4903, 4903}, + {2933, 4909, 4909}, + {3008, 4913, 4913}, + {3153, 4917, 4917}, + {4819, 4921, 4921}, + {4921, 4932, 4933}, + {4920, 4944, 4945}, + {4814, 4954, 4955}, + {576, 4966, 4966}, + {1854, 4970, 4971}, + {1374, 4975, 4976}, + {3307, 4980, 4980}, + {974, 4984, 4988}, + {4721, 4992, 4992}, + {4898, 4996, 4996}, + {4475, 5006, 5006}, + {3819, 5012, 5012}, + {1948, 5019, 5021}, + {4954, 5027, 5029}, + {3740, 5038, 5040}, + {4763, 5044, 5045}, + {1936, 5051, 5051}, + {4844, 5055, 5060}, + {4215, 5069, 5072}, + {1146, 5076, 5076}, + {3845, 5082, 5082}, + {4865, 5090, 5090}, + {4624, 5094, 5094}, + {4815, 5098, 5098}, + {5006, 5105, 5105}, + {4980, 5109, 5109}, + {4795, 5113, 5115}, + {5043, 5119, 5121}, + {4782, 5129, 5129}, + {3826, 5139, 5139}, + {3876, 5156, 5156}, + {3111, 5167, 5171}, + {1470, 5177, 5177}, + {4431, 5181, 5181}, + {546, 5189, 5189}, + {4225, 5193, 5193}, + {1672, 5199, 5201}, + {4207, 5205, 5209}, + {4220, 5216, 5217}, + {4658, 5224, 5225}, + {3295, 5235, 5235}, + {2436, 5239, 5239}, + {2349, 5246, 5246}, + {2175, 5250, 5250}, + {5180, 5257, 5258}, + {3161, 5263, 5263}, + {5105, 5272, 5272}, + {3552, 5282, 5282}, + {4944, 5299, 5300}, + {4130, 5312, 5313}, + {902, 5323, 5323}, + {913, 5327, 5327}, + {2987, 5333, 5334}, + {5150, 5344, 5344}, + {5249, 5348, 5348}, + {1965, 5358, 5359}, + {5330, 5364, 5364}, + {2012, 5373, 5377}, + {712, 5384, 5386}, + {5235, 5390, 5390}, + {5044, 5398, 5399}, + {564, 5406, 5406}, + {39, 5410, 5410}, + {4642, 5422, 5425}, + {4421, 5437, 5438}, + {2347, 5449, 5449}, + {5333, 5453, 5454}, + {4136, 5458, 5459}, + {3793, 5468, 5468}, + {2243, 5480, 5480}, + {4889, 5492, 5493}, + {4295, 5504, 5504}, + {2785, 5511, 5511}, + {2377, 5518, 5518}, + {3662, 5525, 5525}, + {5097, 5529, 5530}, + {4781, 5537, 5538}, + {4697, 5547, 5548}, + {436, 5552, 5553}, + {5542, 5558, 5558}, + {3692, 5562, 5562}, + {2696, 5568, 5569}, + {4620, 5578, 5578}, + {2898, 5590, 5590}, + {5557, 5596, 5618}, + {2797, 5623, 5625}, + {2792, 5629, 5629}, + {5243, 5633, 5633}, + {5348, 5637, 5637}, + {5547, 5643, 5643}, + {4296, 5654, 5655}, + {5568, 5662, 5662}, + {3001, 5670, 5671}, + {3794, 5679, 5679}, + {4006, 5685, 5686}, + {4969, 5690, 5692}, + {687, 5704, 5704}, + {4563, 5708, 5708}, + {1723, 5738, 5738}, + {649, 5742, 5742}, + {5163, 5748, 5755}, + {3907, 5759, 5759}, + {3074, 5764, 5764}, + {5326, 5771, 5771}, + {2951, 5776, 5776}, + {5181, 5780, 5780}, + {2614, 5785, 5788}, + {4709, 5794, 5794}, + {2784, 5799, 5799}, + {5518, 5803, 5803}, + {4155, 5812, 5815}, + {921, 5819, 5819}, + {5224, 5823, 5824}, + {2853, 5830, 5836}, + {5776, 5840, 5840}, + {2955, 5844, 5845}, + {5745, 5853, 5853}, + {3291, 5857, 5857}, + {2988, 5861, 5861}, + {2647, 5865, 5865}, + {5398, 5869, 5870}, + {1085, 5874, 5875}, + {4906, 5881, 5881}, + {802, 5886, 5886}, + {5119, 5890, 5893}, + {5802, 5899, 5900}, + {3415, 5904, 5904}, + {5629, 5908, 5908}, + {3714, 5912, 5914}, + {5558, 5921, 5921}, + {2710, 5927, 5928}, + {1094, 5932, 5934}, + {2653, 5940, 5941}, + {4735, 5954, 5954}, + {5861, 5958, 5958}, + {1040, 5971, 5971}, + {5514, 5977, 5977}, + {5048, 5981, 5982}, + {5953, 5992, 5993}, + {3751, 5997, 5997}, + {4991, 6001, 6002}, + {5885, 6006, 6007}, + {5529, 6011, 6012}, + {4974, 6019, 6020}, + {5857, 6024, 6024}, + {3483, 6032, 6032}, + {3594, 6036, 6036}, + {1997, 6040, 6040}, + {5997, 6044, 6047}, + {5197, 6051, 6051}, + {1764, 6055, 6055}, + {6050, 6059, 6059}, + {5239, 6063, 6063}, + {5049, 6067, 6067}, + {5957, 6073, 6074}, + {1022, 6078, 6078}, + {3414, 6083, 6084}, + {3809, 6090, 6090}, + {4562, 6095, 6096}, + {5878, 6104, 6104}, + {594, 6108, 6109}, + {3353, 6115, 6116}, + {4992, 6120, 6121}, + {2424, 6125, 6125}, + {4484, 6130, 6130}, + {3900, 6134, 6135}, + {5793, 6139, 6141}, + {3562, 6145, 6145}, + {1438, 6152, 6153}, + {6058, 6157, 6158}, + {4411, 6162, 6163}, + {4590, 6167, 6171}, + {4748, 6175, 6175}, + {5517, 6183, 6184}, + {6095, 6191, 6192}, + {1471, 6203, 6203}, + {2643, 6209, 6210}, + {450, 6220, 6220}, + {5266, 6226, 6226}, + {2576, 6233, 6233}, + {2607, 6239, 6240}, + {5164, 6244, 6251}, + {6054, 6255, 6255}, + {1789, 6260, 6261}, + {5250, 6265, 6265}, + {6062, 6273, 6278}, + {5990, 6282, 6282}, + {3283, 6286, 6286}, + {5436, 6290, 6290}, + {6059, 6294, 6294}, + {5668, 6298, 6300}, + {3072, 6324, 6329}, + {3132, 6338, 6339}, + {3246, 6343, 6344}, + {28, 6348, 6349}, + {1503, 6353, 6355}, + {6067, 6359, 6359}, + {3384, 6364, 6364}, + {545, 6375, 6376}, + {5803, 6380, 6380}, + {5522, 6384, 6385}, + {5908, 6389, 6389}, + {2796, 6393, 6396}, + {4831, 6403, 6404}, + {6388, 6412, 6412}, + {6005, 6417, 6420}, + {4450, 6430, 6430}, + {4050, 6435, 6435}, + {5372, 6441, 6441}, + {4378, 6447, 6447}, + {6199, 6452, 6452}, + {3026, 6456, 6456}, + {2642, 6460, 6462}, + {6392, 6470, 6470}, + {6459, 6474, 6474}, + {2829, 6487, 6488}, + {2942, 6499, 6504}, + {5069, 6508, 6511}, + {5341, 6515, 6516}, + {5853, 6521, 6525}, + {6104, 6531, 6531}, + {5759, 6535, 6538}, + {4672, 6542, 6543}, + {2443, 6550, 6550}, + {5109, 6554, 6554}, + {6494, 6558, 6560}, + {6006, 6570, 6572}, + {6424, 6576, 6580}, + {4693, 6591, 6592}, + {6439, 6596, 6597}, + {3179, 6601, 6601}, + {5299, 6606, 6607}, + {4148, 6612, 6613}, + {3774, 6617, 6617}, + {3537, 6623, 6624}, + {4975, 6628, 6629}, + {3848, 6636, 6636}, + {856, 6640, 6640}, + {5724, 6645, 6645}, + {6632, 6651, 6651}, + {4630, 6656, 6658}, + {1440, 6662, 6662}, + {4281, 6666, 6667}, + {4302, 6671, 6672}, + {2589, 6676, 6677}, + {5647, 6681, 6687}, + {6082, 6691, 6693}, + {6144, 6698, 6698}, + {6103, 6709, 6710}, + {3710, 6714, 6714}, + {4253, 6718, 6721}, + {2467, 6730, 6730}, + {4778, 6734, 6734}, + {6528, 6738, 6738}, + {4358, 6747, 6747}, + {5889, 6753, 6753}, + {5193, 6757, 6757}, + {5797, 6761, 6761}, + {3858, 6765, 6766}, + {5951, 6776, 6776}, + {6487, 6781, 6782}, + {3282, 6786, 6787}, + {4667, 6797, 6799}, + {1927, 6803, 6806}, + {6583, 6810, 6810}, + {4937, 6814, 6814}, + {6099, 6824, 6824}, + {4415, 6835, 6836}, + {6332, 6840, 6841}, + {5160, 6850, 6850}, + {4764, 6854, 6854}, + {6814, 6858, 6859}, + {3018, 6864, 6864}, + {6293, 6868, 6869}, + {6359, 6877, 6877}, + {3047, 6884, 6886}, + {5262, 6890, 6891}, + {5471, 6900, 6900}, + {3268, 6910, 6912}, + {1047, 6916, 6916}, + {5904, 6923, 6923}, + {5798, 6933, 6938}, + {4149, 6942, 6942}, + {1821, 6946, 6946}, + {3599, 6952, 6952}, + {6470, 6957, 6957}, + {5562, 6961, 6961}, + {6268, 6965, 6967}, + {6389, 6971, 6971}, + {6596, 6975, 6976}, + {6553, 6980, 6981}, + {6576, 6985, 6989}, + {1375, 6993, 6993}, + {652, 6998, 6998}, + {4876, 7002, 7003}, + {5768, 7011, 7013}, + {3973, 7017, 7017}, + {6802, 7025, 7025}, + {6955, 7034, 7036}, + {6974, 7040, 7040}, + {5944, 7044, 7044}, + {6992, 7048, 7054}, + {6872, 7059, 7059}, + {2943, 7063, 7063}, + {6923, 7067, 7067}, + {5094, 7071, 7071}, + {4873, 7075, 7075}, + {5819, 7079, 7079}, + {5945, 7085, 7085}, + {1540, 7090, 7091}, + {2090, 7095, 7095}, + {5024, 7104, 7105}, + {6900, 7109, 7109}, + {6024, 7113, 7114}, + {6000, 7118, 7120}, + {2187, 7124, 7125}, + {6760, 7129, 7130}, + {5898, 7134, 7136}, + {7032, 7144, 7144}, + {4271, 7148, 7148}, + {3706, 7152, 7152}, + {6970, 7156, 7157}, + {7088, 7161, 7163}, + {2718, 7168, 7169}, + {5674, 7175, 7175}, + {4631, 7182, 7182}, + {7070, 7188, 7189}, + {6220, 7196, 7196}, + {3458, 7201, 7202}, + {2041, 7211, 7212}, + {1454, 7216, 7216}, + {5199, 7225, 7227}, + {3529, 7234, 7234}, + {6890, 7238, 7238}, + {3815, 7242, 7243}, + {5490, 7250, 7253}, + {6554, 7257, 7263}, + {5890, 7267, 7269}, + {6877, 7273, 7273}, + {4877, 7277, 7277}, + {2502, 7285, 7285}, + {1483, 7289, 7295}, + {7210, 7304, 7308}, + {6845, 7313, 7316}, + {7219, 7320, 7320}, + {7001, 7325, 7329}, + {6853, 7333, 7334}, + {6120, 7338, 7338}, + {6606, 7342, 7343}, + {7020, 7348, 7350}, + {3509, 7354, 7354}, + {7133, 7359, 7363}, + {3434, 7371, 7374}, + {2787, 7384, 7384}, + {7044, 7388, 7388}, + {6960, 7394, 7395}, + {6676, 7399, 7400}, + {7161, 7404, 7404}, + {7285, 7417, 7418}, + {4558, 7425, 7426}, + {4828, 7430, 7430}, + {6063, 7436, 7436}, + {3597, 7442, 7442}, + {914, 7446, 7446}, + {7320, 7452, 7454}, + {7267, 7458, 7460}, + {5076, 7464, 7464}, + {7430, 7468, 7469}, + {6273, 7473, 7474}, + {7440, 7478, 7487}, + {7348, 7491, 7494}, + {1021, 7510, 7510}, + {7473, 7515, 7515}, + {2823, 7519, 7519}, + {6264, 7527, 7527}, + {7302, 7531, 7531}, + {7089, 7535, 7535}, + {7342, 7540, 7541}, + {3688, 7547, 7551}, + {3054, 7558, 7560}, + {4177, 7566, 7567}, + {6691, 7574, 7575}, + {7156, 7585, 7586}, + {7147, 7590, 7592}, + {7407, 7598, 7598}, + {7403, 7602, 7603}, + {6868, 7607, 7607}, + {6636, 7611, 7611}, + {4805, 7617, 7617}, + {5779, 7623, 7623}, + {7063, 7627, 7627}, + {5079, 7632, 7632}, + {7377, 7637, 7637}, + {7337, 7641, 7642}, + {6738, 7655, 7655}, + {7338, 7659, 7659}, + {6541, 7669, 7671}, + {595, 7675, 7675}, + {7658, 7679, 7680}, + {7647, 7685, 7686}, + {2477, 7690, 7690}, + {5823, 7694, 7694}, + {4156, 7699, 7699}, + {5931, 7703, 7706}, + {6854, 7712, 7712}, + {4931, 7718, 7718}, + {6979, 7722, 7722}, + {5085, 7727, 7727}, + {6965, 7732, 7732}, + {7201, 7736, 7737}, + {3639, 7741, 7743}, + {7534, 7749, 7749}, + {4292, 7753, 7753}, + {3427, 7759, 7763}, + {7273, 7767, 7767}, + {940, 7778, 7778}, + {4838, 7782, 7785}, + {4216, 7790, 7792}, + {922, 7800, 7801}, + {7256, 7810, 7811}, + {7789, 7815, 7819}, + {7225, 7823, 7825}, + {7531, 7829, 7829}, + {6997, 7833, 7833}, + {7757, 7837, 7838}, + {4129, 7842, 7842}, + {7333, 7848, 7849}, + {6776, 7855, 7855}, + {7527, 7859, 7859}, + {4370, 7863, 7863}, + {4512, 7868, 7868}, + {5679, 7880, 7880}, + {3162, 7884, 7885}, + {3933, 7892, 7894}, + {7804, 7899, 7902}, + {6363, 7906, 7907}, + {7848, 7911, 7912}, + {5584, 7917, 7921}, + {874, 7926, 7926}, + {3342, 7930, 7930}, + {4507, 7935, 7937}, + {3672, 7943, 7944}, + {7911, 7948, 7949}, + {6402, 7956, 7956}, + {7940, 7960, 7960}, + {7113, 7964, 7964}, + {1073, 7968, 7968}, + {7740, 7974, 7974}, + {7601, 7978, 7982}, + {6797, 7987, 7988}, + {3528, 7994, 7995}, + {5483, 7999, 7999}, + {5717, 8011, 8011}, + {5480, 8017, 8017}, + {7770, 8023, 8030}, + {2452, 8034, 8034}, + {5282, 8047, 8047}, + {7967, 8051, 8051}, + {1128, 8058, 8066}, + {6348, 8070, 8070}, + {8055, 8077, 8077}, + {7925, 8081, 8086}, + {6810, 8090, 8090}, + {5051, 8101, 8101}, + {4696, 8109, 8110}, + {5129, 8119, 8119}, + {4449, 8123, 8123}, + {7222, 8127, 8127}, + {4649, 8131, 8134}, + {7994, 8138, 8138}, + {5954, 8148, 8148}, + {475, 8152, 8153}, + {7906, 8157, 8157}, + {7458, 8164, 8166}, + {7632, 8171, 8173}, + {3874, 8177, 8183}, + {4391, 8187, 8187}, + {561, 8191, 8191}, + {2417, 8195, 8195}, + {2357, 8204, 8204}, + {2269, 8216, 8218}, + {3968, 8222, 8222}, + {2200, 8226, 8227}, + {3453, 8247, 8247}, + {2439, 8251, 8252}, + {7175, 8257, 8257}, + {976, 8262, 8264}, + {4953, 8273, 8273}, + {4219, 8278, 8278}, + {6, 8285, 8291}, + {5703, 8295, 8296}, + {5272, 8300, 8300}, + {8037, 8304, 8304}, + {8186, 8314, 8314}, + {8304, 8318, 8318}, + {8051, 8326, 8326}, + {8318, 8330, 8330}, + {2671, 8334, 8335}, + {2662, 8339, 8339}, + {8081, 8349, 8350}, + {3328, 8356, 8356}, + {2879, 8360, 8362}, + {8050, 8370, 8371}, + {8330, 8375, 8376}, + {8375, 8386, 8386}, + {4961, 8390, 8390}, + {1017, 8403, 8405}, + {3533, 8416, 8416}, + {4555, 8422, 8422}, + {6445, 8426, 8426}, + {8169, 8432, 8432}, + {990, 8436, 8436}, + {4102, 8440, 8440}, + {7398, 8444, 8446}, + {3480, 8450, 8450}, + {6324, 8462, 8462}, + {7948, 8466, 8467}, + {5950, 8471, 8471}, + {5189, 8476, 8476}, + {4026, 8490, 8490}, + {8374, 8494, 8495}, + {4682, 8501, 8501}, + {7387, 8506, 8506}, + {8164, 8510, 8515}, + {4079, 8524, 8524}, + {8360, 8529, 8531}, + {7446, 8540, 8543}, + {7971, 8547, 8548}, + {4311, 8552, 8552}, + {5204, 8556, 8557}, + {7968, 8562, 8562}, + {7847, 8571, 8573}, + {8547, 8577, 8577}, + {5320, 8581, 8581}, + {8556, 8585, 8586}, + {8504, 8590, 8590}, + {7669, 8602, 8604}, + {5874, 8608, 8609}, + {5828, 8613, 8613}, + {7998, 8617, 8617}, + {8519, 8625, 8625}, + {7250, 8637, 8637}, + {426, 8641, 8641}, + {8436, 8645, 8645}, + {5986, 8649, 8656}, + {8157, 8660, 8660}, + {7182, 8665, 8665}, + {8421, 8675, 8675}, + {8509, 8681, 8681}, + {5137, 8688, 8689}, + {8625, 8694, 8695}, + {5228, 8701, 8702}, + {6661, 8714, 8714}, + {1010, 8719, 8719}, + {6648, 8723, 8723}, + {3500, 8728, 8728}, + {2442, 8735, 8735}, + {8494, 8740, 8741}, + {8171, 8753, 8755}, + {7242, 8763, 8764}, + {4739, 8768, 8769}, + {7079, 8773, 8773}, + {8386, 8777, 8777}, + {8624, 8781, 8787}, + {661, 8791, 8794}, + {8631, 8801, 8801}, + {7753, 8805, 8805}, + {4783, 8809, 8810}, + {1673, 8814, 8815}, + {6623, 8819, 8819}, + {4404, 8823, 8823}, + {8089, 8827, 8828}, + {8773, 8832, 8832}, + {5394, 8836, 8836}, + {6231, 8841, 8843}, + {1015, 8852, 8853}, + {6873, 8857, 8857}, + {6289, 8865, 8865}, + {8577, 8869, 8869}, + {8114, 8873, 8875}, + {8534, 8883, 8883}, + {3007, 8887, 8888}, + {8827, 8892, 8893}, + {4788, 8897, 8900}, + {5698, 8906, 8907}, + {7690, 8911, 8911}, + {6643, 8919, 8919}, + {7206, 8923, 8924}, + {7866, 8929, 8931}, + {8880, 8942, 8942}, + {8630, 8951, 8952}, + {6027, 8958, 8958}, + {7749, 8966, 8967}, + {4932, 8972, 8973}, + {8892, 8980, 8981}, + {634, 9003, 9003}, + {8109, 9007, 9008}, + {8777, 9012, 9012}, + {3981, 9016, 9017}, + {5723, 9025, 9025}, + {7662, 9034, 9038}, + {8955, 9042, 9042}, + {8070, 9060, 9062}, + {8910, 9066, 9066}, + {5363, 9070, 9071}, + {7699, 9075, 9076}, + {8991, 9081, 9081}, + {6850, 9085, 9085}, + {5811, 9092, 9094}, + {9079, 9098, 9102}, + {6456, 9106, 9106}, + {2259, 9111, 9111}, + {4752, 9116, 9116}, + {9060, 9120, 9123}, + {8090, 9127, 9127}, + {5305, 9131, 9132}, + {8623, 9137, 9137}, + {7417, 9141, 9141}, + {6564, 9148, 9149}, + {9126, 9157, 9158}, + {4285, 9169, 9170}, + {8698, 9174, 9174}, + {8869, 9178, 9178}, + {2572, 9182, 9183}, + {6482, 9188, 9190}, + {9181, 9201, 9201}, + {2968, 9208, 9209}, + {2506, 9213, 9215}, + {9127, 9219, 9219}, + {7910, 9225, 9227}, + {5422, 9235, 9239}, + {8813, 9244, 9246}, + {9178, 9250, 9250}, + {8748, 9255, 9255}, + {7354, 9265, 9265}, + {7767, 9269, 9269}, + {7710, 9281, 9283}, + {8826, 9288, 9290}, + {861, 9295, 9295}, + {4482, 9301, 9301}, + {9264, 9305, 9306}, + {8805, 9310, 9310}, + {4995, 9314, 9314}, + {6730, 9318, 9318}, + {7457, 9328, 9328}, + {2547, 9335, 9336}, + {6298, 9340, 9343}, + {9305, 9353, 9354}, + {9269, 9358, 9358}, + {6338, 9370, 9370}, + {7289, 9376, 9379}, + {5780, 9383, 9383}, + {7607, 9387, 9387}, + {2065, 9392, 9392}, + {7238, 9396, 9396}, + {8856, 9400, 9400}, + {8069, 9412, 9413}, + {611, 9420, 9420}, + {7071, 9424, 9424}, + {3089, 9430, 9431}, + {7117, 9435, 9438}, + {1976, 9445, 9445}, + {6640, 9449, 9449}, + {5488, 9453, 9453}, + {8739, 9457, 9459}, + {5958, 9466, 9466}, + {7985, 9470, 9470}, + {8735, 9475, 9475}, + {5009, 9479, 9479}, + {8073, 9483, 9484}, + {2328, 9490, 9491}, + {9250, 9495, 9495}, + {4043, 9502, 9502}, + {7712, 9506, 9506}, + {9012, 9510, 9510}, + {9028, 9514, 9515}, + {2190, 9521, 9524}, + {9029, 9528, 9528}, + {9519, 9532, 9532}, + {9495, 9536, 9536}, + {8527, 9540, 9540}, + {2137, 9550, 9550}, + {8419, 9557, 9557}, + {9383, 9561, 9562}, + {8970, 9575, 9578}, + {8911, 9582, 9582}, + {7828, 9595, 9596}, + {6180, 9600, 9600}, + {8738, 9604, 9607}, + {7540, 9611, 9612}, + {9599, 9616, 9618}, + {9187, 9623, 9623}, + {9294, 9628, 9629}, + {4536, 9639, 9639}, + {3867, 9643, 9643}, + {6305, 9648, 9648}, + {1617, 9654, 9657}, + {5762, 9666, 9666}, + {8314, 9670, 9670}, + {9666, 9674, 9675}, + {9506, 9679, 9679}, + {9669, 9685, 9686}, + {9683, 9690, 9690}, + {8763, 9697, 9698}, + {7468, 9702, 9702}, + {460, 9707, 9707}, + {3115, 9712, 9712}, + {9424, 9716, 9717}, + {7359, 9721, 9724}, + {7547, 9728, 9729}, + {7151, 9733, 9738}, + {7627, 9742, 9742}, + {2822, 9747, 9747}, + {8247, 9751, 9753}, + {9550, 9758, 9758}, + {7585, 9762, 9763}, + {1002, 9767, 9767}, + {7168, 9772, 9773}, + {6941, 9777, 9780}, + {9728, 9784, 9786}, + {9770, 9792, 9796}, + {6411, 9801, 9802}, + {3689, 9806, 9808}, + {9575, 9814, 9816}, + {7025, 9820, 9821}, + {2776, 9826, 9826}, + {9806, 9830, 9830}, + {9820, 9834, 9835}, + {9800, 9839, 9847}, + {9834, 9851, 9852}, + {9829, 9856, 9862}, + {1400, 9866, 9866}, + {3197, 9870, 9871}, + {9851, 9875, 9876}, + {9742, 9883, 9884}, + {3362, 9888, 9889}, + {9883, 9893, 9893}, + {5711, 9899, 9910}, + {7806, 9915, 9915}, + {9120, 9919, 9919}, + {9715, 9925, 9934}, + {2580, 9938, 9938}, + {4907, 9942, 9944}, + {6239, 9953, 9954}, + {6961, 9963, 9963}, + {5295, 9967, 9968}, + {1915, 9972, 9973}, + {3426, 9983, 9985}, + {9875, 9994, 9995}, + {6942, 9999, 9999}, + {6621, 10005, 10005}, + {7589, 10010, 10012}, + {9286, 10020, 10020}, + {838, 10024, 10024}, + {9980, 10028, 10031}, + {9994, 10035, 10041}, + {2702, 10048, 10051}, + {2621, 10059, 10059}, + {10054, 10065, 10065}, + {8612, 10073, 10074}, + {7033, 10078, 10078}, + {916, 10082, 10082}, + {10035, 10086, 10087}, + {8613, 10097, 10097}, + {9919, 10107, 10108}, + {6133, 10114, 10115}, + {10059, 10119, 10119}, + {10065, 10126, 10127}, + {7732, 10131, 10131}, + {7155, 10135, 10136}, + {6728, 10140, 10140}, + {6162, 10144, 10145}, + {4724, 10150, 10150}, + {1665, 10154, 10154}, + {10126, 10163, 10163}, + {9783, 10168, 10168}, + {1715, 10172, 10173}, + {7152, 10177, 10182}, + {8760, 10187, 10187}, + {7829, 10191, 10191}, + {9679, 10196, 10196}, + {9369, 10201, 10201}, + {2928, 10206, 10208}, + {6951, 10214, 10217}, + {5633, 10221, 10221}, + {7199, 10225, 10225}, + {10118, 10230, 10231}, + {9999, 10235, 10236}, + {10045, 10240, 10249}, + {5565, 10256, 10256}, + {9866, 10261, 10261}, + {10163, 10268, 10268}, + {9869, 10272, 10272}, + {9789, 10276, 10283}, + {10235, 10287, 10288}, + {10214, 10298, 10299}, + {6971, 10303, 10303}, + {3346, 10307, 10307}, + {10185, 10311, 10312}, + {9993, 10318, 10320}, + {2779, 10332, 10334}, + {1726, 10338, 10338}, + {741, 10354, 10360}, + {10230, 10372, 10373}, + {10260, 10384, 10385}, + {10131, 10389, 10398}, + {6946, 10406, 10409}, + {10158, 10413, 10420}, + {10123, 10424, 10424}, + {6157, 10428, 10429}, + {4518, 10434, 10434}, + {9893, 10438, 10438}, + {9865, 10442, 10446}, + {7558, 10454, 10454}, + {10434, 10460, 10460}, + {10064, 10466, 10468}, + {2703, 10472, 10474}, + {9751, 10478, 10479}, + {6714, 10485, 10485}, + {8020, 10490, 10490}, + {10303, 10494, 10494}, + {3521, 10499, 10500}, + {9281, 10513, 10515}, + {6028, 10519, 10523}, + {9387, 10527, 10527}, + {7614, 10531, 10531}, + {3611, 10536, 10536}, + {9162, 10540, 10540}, + {10081, 10546, 10547}, + {10034, 10560, 10562}, + {6726, 10567, 10571}, + {8237, 10575, 10575}, + {10438, 10579, 10583}, + {10140, 10587, 10587}, + {5784, 10592, 10592}, + {9819, 10597, 10600}, + {10567, 10604, 10608}, + {9335, 10613, 10613}, + {8300, 10617, 10617}, + {10575, 10621, 10621}, + {9678, 10625, 10626}, + {9962, 10632, 10633}, + {10535, 10637, 10638}, + {8199, 10642, 10642}, + {10372, 10647, 10648}, + {10637, 10656, 10657}, + {10579, 10667, 10668}, + {10465, 10677, 10680}, + {6702, 10684, 10685}, + {10073, 10691, 10692}, + {4505, 10696, 10697}, + {9042, 10701, 10701}, + {6460, 10705, 10706}, + {10010, 10714, 10716}, + {10656, 10720, 10722}, + {7282, 10727, 10729}, + {2327, 10733, 10733}, + {2491, 10740, 10741}, + {10704, 10748, 10750}, + {6465, 10754, 10754}, + {10647, 10758, 10759}, + {10424, 10763, 10763}, + {10748, 10776, 10776}, + {10546, 10780, 10781}, + {10758, 10785, 10786}, + {10287, 10790, 10797}, + {10785, 10801, 10807}, + {10240, 10811, 10826}, + {9509, 10830, 10830}, + {2579, 10836, 10838}, + {9801, 10843, 10845}, + {7555, 10849, 10850}, + {10776, 10860, 10865}, + {8023, 10869, 10869}, + {10046, 10876, 10884}, + {10253, 10888, 10892}, + {9941, 10897, 10897}, + {7898, 10901, 10905}, + {6725, 10909, 10913}, + {10757, 10921, 10923}, + {10160, 10931, 10931}, + {10916, 10935, 10942}, + {10261, 10946, 10946}, + {10318, 10952, 10954}, + {5911, 10959, 10961}, + {10801, 10965, 10966}, + {10946, 10970, 10977}, + {10592, 10982, 10984}, + {9913, 10988, 10990}, + {8510, 10994, 10996}, + {9419, 11000, 11001}, + {6765, 11006, 11007}, + {10725, 11011, 11011}, + {5537, 11017, 11019}, + {9208, 11024, 11025}, + {5850, 11030, 11030}, + {9610, 11034, 11036}, + {8846, 11041, 11047}, + {9697, 11051, 11051}, + {1622, 11055, 11058}, + {2370, 11062, 11062}, + {8393, 11067, 11067}, + {9756, 11071, 11071}, + {10172, 11076, 11076}, + {27, 11081, 11081}, + {7357, 11087, 11092}, + {8151, 11104, 11106}, + {6115, 11110, 11110}, + {10667, 11114, 11115}, + {11099, 11121, 11123}, + {10705, 11127, 11127}, + {8938, 11131, 11131}, + {11114, 11135, 11136}, + {1390, 11140, 11141}, + {10964, 11146, 11148}, + {11140, 11152, 11155}, + {9813, 11159, 11166}, + {624, 11171, 11172}, + {3118, 11177, 11179}, + {11029, 11184, 11186}, + {10186, 11190, 11190}, + {10306, 11196, 11196}, + {8665, 11201, 11201}, + {7382, 11205, 11205}, + {1100, 11210, 11210}, + {2337, 11216, 11217}, + {1609, 11221, 11223}, + {5763, 11228, 11229}, + {5220, 11233, 11233}, + {11061, 11241, 11241}, + {10617, 11246, 11246}, + {11190, 11250, 11251}, + {10144, 11255, 11256}, + {11232, 11260, 11260}, + {857, 11264, 11265}, + {10994, 11269, 11271}, + {3879, 11280, 11281}, + {11184, 11287, 11289}, + {9611, 11293, 11295}, + {11250, 11299, 11299}, + {4495, 11304, 11304}, + {7574, 11308, 11309}, + {9814, 11315, 11317}, + {1713, 11321, 11324}, + {1905, 11328, 11328}, + {8745, 11335, 11340}, + {8883, 11351, 11351}, + {8119, 11358, 11358}, + {1842, 11363, 11364}, + {11237, 11368, 11368}, + {8814, 11373, 11374}, + {5684, 11378, 11378}, + {11011, 11382, 11382}, + {6520, 11389, 11389}, + {11183, 11393, 11396}, + {1790, 11404, 11404}, + {9536, 11408, 11408}, + {11298, 11418, 11419}, + {3929, 11425, 11425}, + {5588, 11429, 11429}, + {8476, 11436, 11436}, + {4096, 11440, 11442}, + {11084, 11446, 11454}, + {10603, 11458, 11463}, + {7332, 11472, 11474}, + {7611, 11483, 11486}, + {4836, 11490, 11491}, + {10024, 11495, 11495}, + {4917, 11501, 11506}, + {6486, 11510, 11512}, + {11269, 11516, 11518}, + {3603, 11522, 11525}, + {11126, 11535, 11535}, + {11418, 11539, 11541}, + {11408, 11545, 11545}, + {9021, 11549, 11552}, + {6745, 11557, 11557}, + {5118, 11561, 11564}, + {7590, 11568, 11569}, + {4426, 11573, 11578}, + {9790, 11582, 11583}, + {6447, 11587, 11587}, + {10229, 11591, 11594}, + {10457, 11598, 11598}, + {10168, 11604, 11604}, + {10543, 11608, 11608}, + {7404, 11612, 11612}, + {11127, 11616, 11616}, + {3337, 11620, 11620}, + {11501, 11624, 11628}, + {4543, 11633, 11635}, + {8449, 11642, 11642}, + {4943, 11646, 11648}, + {10526, 11652, 11654}, + {11620, 11659, 11659}, + {8927, 11664, 11669}, + {532, 11673, 11673}, + {10513, 11677, 11679}, + {10428, 11683, 11683}, + {10999, 11689, 11690}, + {9469, 11695, 11695}, + {3606, 11699, 11699}, + {9560, 11708, 11709}, + {1564, 11714, 11714}, + {10527, 11718, 11718}, + {3071, 11723, 11726}, + {11590, 11731, 11732}, + {6605, 11737, 11737}, + {11624, 11741, 11745}, + {7822, 11749, 11752}, + {5269, 11757, 11758}, + {1339, 11767, 11767}, + {1363, 11771, 11773}, + {3704, 11777, 11777}, + {10952, 11781, 11783}, + {6764, 11793, 11795}, + {8675, 11800, 11800}, + {9963, 11804, 11804}, + {11573, 11808, 11809}, + {9548, 11813, 11813}, + {11591, 11817, 11818}, + {11446, 11822, 11822}, + {9224, 11828, 11828}, + {3158, 11836, 11836}, + {10830, 11840, 11840}, + {7234, 11846, 11846}, + {11299, 11850, 11850}, + {11544, 11854, 11855}, + {11498, 11859, 11859}, + {10993, 11865, 11868}, + {9720, 11872, 11878}, + {10489, 11882, 11890}, + {11712, 11898, 11904}, + {11516, 11908, 11910}, + {11568, 11914, 11915}, + {10177, 11919, 11924}, + {11363, 11928, 11929}, + {10494, 11933, 11933}, + {9870, 11937, 11938}, + {9427, 11942, 11942}, + {11481, 11949, 11949}, + {6030, 11955, 11957}, + {11718, 11961, 11961}, + {10531, 11965, 11983}, + {5126, 11987, 11987}, + {7515, 11991, 11991}, + {10646, 11996, 11997}, + {2947, 12001, 12001}, + {9582, 12009, 12010}, + {6202, 12017, 12018}, + {11714, 12022, 12022}, + {9235, 12033, 12037}, + {9721, 12041, 12044}, + {11932, 12051, 12052}, + {12040, 12056, 12056}, + {12051, 12060, 12060}, + {11601, 12066, 12066}, + {8426, 12070, 12070}, + {4053, 12077, 12077}, + {4262, 12081, 12081}, + {9761, 12086, 12088}, + {11582, 12092, 12093}, + {10965, 12097, 12098}, + {11803, 12103, 12104}, + {11933, 12108, 12109}, + {10688, 12117, 12117}, + {12107, 12125, 12126}, + {6774, 12130, 12132}, + {6286, 12137, 12137}, + {9543, 12141, 12141}, + {12097, 12145, 12146}, + {10790, 12150, 12150}, + {10125, 12154, 12156}, + {12125, 12164, 12164}, + {12064, 12168, 12172}, + {10811, 12178, 12188}, + {12092, 12192, 12193}, + {10058, 12197, 12198}, + {11611, 12211, 12212}, + {3459, 12216, 12216}, + {10291, 12225, 12228}, + {12191, 12232, 12234}, + {12145, 12238, 12238}, + {12001, 12242, 12250}, + {3840, 12255, 12255}, + {12216, 12259, 12259}, + {674, 12272, 12272}, + {12141, 12276, 12276}, + {10766, 12280, 12280}, + {11545, 12284, 12284}, + {6496, 12290, 12290}, + {11381, 12294, 12295}, + {603, 12302, 12303}, + {12276, 12308, 12308}, + {11850, 12313, 12314}, + {565, 12319, 12319}, + {9351, 12324, 12324}, + {11822, 12328, 12328}, + {2691, 12333, 12334}, + {11840, 12338, 12338}, + {11070, 12343, 12343}, + {9510, 12347, 12347}, + {11024, 12352, 12353}, + {7173, 12359, 12359}, + {517, 12363, 12363}, + {6311, 12367, 12368}, + {11367, 12372, 12373}, + {12008, 12377, 12377}, + {11372, 12382, 12384}, + {11358, 12391, 12392}, + {11382, 12396, 12396}, + {6882, 12400, 12401}, + {11246, 12405, 12405}, + {8359, 12409, 12412}, + {10154, 12418, 12418}, + {12016, 12425, 12426}, + {8972, 12434, 12435}, + {10478, 12439, 12440}, + {12395, 12449, 12449}, + {11612, 12454, 12454}, + {12347, 12458, 12458}, + {10700, 12466, 12467}, + {3637, 12471, 12476}, + {1042, 12480, 12481}, + {6747, 12488, 12488}, + {12396, 12492, 12493}, + {9420, 12497, 12497}, + {11285, 12501, 12510}, + {4470, 12515, 12515}, + {9374, 12519, 12519}, + {11293, 12528, 12528}, + {2058, 12534, 12535}, + {6521, 12539, 12539}, + {12492, 12543, 12543}, + {3043, 12547, 12547}, + {2982, 12551, 12553}, + {11030, 12557, 12563}, + {7636, 12568, 12568}, + {9639, 12572, 12572}, + {12543, 12576, 12576}, + {5989, 12580, 12583}, + {11051, 12587, 12587}, + {1061, 12592, 12594}, + {12313, 12599, 12601}, + {11846, 12605, 12605}, + {12576, 12609, 12609}, + {11040, 12618, 12625}, + {12479, 12629, 12629}, + {6903, 12633, 12633}, + {12322, 12639, 12639}, + {12253, 12643, 12645}, + {5594, 12651, 12651}, + {12522, 12655, 12655}, + {11703, 12659, 12659}, + {1377, 12665, 12665}, + {8022, 12669, 12669}, + {12280, 12674, 12674}, + {9023, 12680, 12681}, + {12328, 12685, 12685}, + {3085, 12689, 12693}, + {4700, 12698, 12698}, + {10224, 12702, 12702}, + {8781, 12706, 12706}, + {1651, 12710, 12710}, + {12458, 12714, 12714}, + {12005, 12718, 12721}, + {11908, 12725, 12726}, + {8202, 12733, 12733}, + {11708, 12739, 12740}, + {12599, 12744, 12745}, + {12284, 12749, 12749}, + {5285, 12756, 12756}, + {12055, 12775, 12777}, + {6919, 12782, 12782}, + {12242, 12786, 12786}, + {12009, 12790, 12790}, + {9628, 12794, 12796}, + {11354, 12801, 12802}, + {10225, 12806, 12807}, + {579, 12813, 12813}, + {8935, 12817, 12822}, + {8753, 12827, 12829}, + {11006, 12835, 12835}, + {858, 12841, 12845}, + {476, 12849, 12849}, + {7667, 12854, 12854}, + {12760, 12860, 12871}, + {11677, 12875, 12877}, + {12714, 12881, 12881}, + {12731, 12885, 12890}, + {7108, 12894, 12896}, + {1165, 12900, 12900}, + {4021, 12906, 12906}, + {10829, 12910, 12911}, + {12331, 12915, 12915}, + {8887, 12919, 12921}, + {11639, 12925, 12925}, + {7964, 12929, 12929}, + {12528, 12937, 12937}, + {8148, 12941, 12941}, + {12770, 12948, 12950}, + {12609, 12954, 12954}, + {12685, 12958, 12958}, + {2803, 12962, 12962}, + {9561, 12966, 12966}, + {6671, 12972, 12973}, + {12056, 12977, 12977}, + {6380, 12981, 12981}, + {12048, 12985, 12985}, + {11961, 12989, 12993}, + {3368, 12997, 12999}, + {6634, 13004, 13004}, + {6775, 13009, 13010}, + {12136, 13014, 13019}, + {10341, 13023, 13023}, + {13002, 13027, 13027}, + {10587, 13031, 13031}, + {10307, 13035, 13035}, + {12736, 13039, 13039}, + {12744, 13043, 13044}, + {6175, 13048, 13048}, + {9702, 13053, 13054}, + {662, 13059, 13061}, + {12718, 13065, 13068}, + {12893, 13072, 13075}, + {8299, 13086, 13091}, + {12604, 13095, 13096}, + {12848, 13100, 13101}, + {12749, 13105, 13105}, + {12526, 13109, 13114}, + {9173, 13122, 13122}, + {12769, 13128, 13128}, + {13038, 13132, 13132}, + {12725, 13136, 13137}, + {12639, 13146, 13146}, + {9711, 13150, 13151}, + {12137, 13155, 13155}, + {13039, 13159, 13159}, + {4681, 13163, 13164}, + {12954, 13168, 13168}, + {13158, 13175, 13176}, + {13105, 13180, 13180}, + {10754, 13184, 13184}, + {13167, 13188, 13188}, + {12658, 13192, 13192}, + {4294, 13199, 13200}, + {11682, 13204, 13205}, + {11695, 13209, 13209}, + {11076, 13214, 13214}, + {12232, 13218, 13218}, + {9399, 13223, 13224}, + {12880, 13228, 13229}, + {13048, 13234, 13234}, + {9701, 13238, 13239}, + {13209, 13243, 13243}, + {3658, 13248, 13248}, + {3698, 13252, 13254}, + {12237, 13260, 13260}, + {8872, 13266, 13266}, + {12957, 13272, 13273}, + {1393, 13281, 13281}, + {2013, 13285, 13288}, + {4244, 13296, 13299}, + {9428, 13303, 13303}, + {12702, 13307, 13307}, + {13078, 13311, 13311}, + {6071, 13315, 13315}, + {3061, 13319, 13319}, + {2051, 13324, 13324}, + {11560, 13328, 13331}, + {6584, 13336, 13336}, + {8482, 13340, 13340}, + {5331, 13344, 13344}, + {4171, 13348, 13348}, + {8501, 13352, 13352}, + {9219, 13356, 13356}, + {9473, 13360, 13363}, + {12881, 13367, 13367}, + {13065, 13371, 13375}, + {2979, 13379, 13384}, + {1518, 13388, 13388}, + {11177, 13392, 13392}, + {9457, 13398, 13398}, + {12293, 13407, 13410}, + {3697, 13414, 13417}, + {10338, 13425, 13425}, + {13367, 13429, 13429}, + {11074, 13433, 13437}, + {4201, 13441, 13443}, + {1812, 13447, 13448}, + {13360, 13452, 13456}, + {13188, 13463, 13463}, + {9732, 13470, 13470}, + {11332, 13477, 13477}, + {9918, 13487, 13487}, + {6337, 13497, 13497}, + {13429, 13501, 13501}, + {11413, 13505, 13505}, + {4685, 13512, 13513}, + {13136, 13517, 13519}, + {7416, 13528, 13530}, + {12929, 13534, 13534}, + {11110, 13539, 13539}, + {11521, 13543, 13543}, + {12825, 13553, 13553}, + {13447, 13557, 13558}, + {12299, 13562, 13563}, + {9003, 13570, 13570}, + {12500, 13577, 13577}, + {13501, 13581, 13581}, + {9392, 13586, 13586}, + {12454, 13590, 13590}, + {6189, 13595, 13595}, + {13053, 13599, 13599}, + {11881, 13604, 13604}, + {13159, 13608, 13608}, + {4894, 13612, 13612}, + {13221, 13621, 13621}, + {8950, 13625, 13625}, + {13533, 13629, 13629}, + {9633, 13633, 13633}, + {7892, 13637, 13639}, + {13581, 13643, 13643}, + {13616, 13647, 13649}, + {12794, 13653, 13654}, + {8919, 13659, 13659}, + {9674, 13663, 13663}, + {13577, 13668, 13668}, + {12966, 13672, 13672}, + {12659, 13676, 13683}, + {6124, 13688, 13688}, + {9225, 13693, 13695}, + {11833, 13702, 13702}, + {12904, 13709, 13717}, + {13647, 13721, 13722}, + {11687, 13726, 13727}, + {12434, 13731, 13732}, + {12689, 13736, 13742}, + {13168, 13746, 13746}, + {6151, 13751, 13752}, + {11821, 13756, 13757}, + {6467, 13764, 13764}, + {5730, 13769, 13769}, + {5136, 13780, 13780}, + {724, 13784, 13785}, + {13517, 13789, 13791}, + {640, 13795, 13796}, + {7721, 13800, 13802}, + {11121, 13806, 13807}, + {5791, 13811, 13815}, + {12894, 13819, 13819}, + {11100, 13824, 13824}, + {7011, 13830, 13830}, + {7129, 13834, 13837}, + {13833, 13841, 13841}, + {11276, 13847, 13847}, + {13621, 13853, 13853}, + {13589, 13862, 13863}, + {12989, 13867, 13867}, + {12789, 13871, 13871}, + {1239, 13875, 13875}, + {4675, 13879, 13881}, + {4686, 13885, 13885}, + {707, 13889, 13889}, + {5449, 13897, 13898}, + {13867, 13902, 13903}, + {10613, 13908, 13908}, + {13789, 13912, 13914}, + {4451, 13918, 13919}, + {9200, 13924, 13924}, + {2011, 13930, 13930}, + {11433, 13934, 13936}, + {4695, 13942, 13943}, + {9435, 13948, 13951}, + {13688, 13955, 13957}, + {11694, 13961, 13962}, + {5712, 13966, 13966}, + {5991, 13970, 13972}, + {13477, 13976, 13976}, + {10213, 13987, 13987}, + {11839, 13991, 13993}, + {12272, 13997, 13997}, + {6206, 14001, 14001}, + {13179, 14006, 14007}, + {2939, 14011, 14011}, + {12972, 14016, 14017}, + {13918, 14021, 14022}, + {7436, 14026, 14027}, + {7678, 14032, 14034}, + {13586, 14040, 14040}, + {13347, 14044, 14044}, + {13109, 14048, 14051}, + {9244, 14055, 14057}, + {13315, 14061, 14061}, + {13276, 14067, 14067}, + {11435, 14073, 14074}, + {13853, 14078, 14078}, + {13452, 14082, 14082}, + {14044, 14087, 14087}, + {4440, 14091, 14095}, + {4479, 14100, 14103}, + {9395, 14107, 14109}, + {6834, 14119, 14119}, + {10458, 14123, 14124}, + {1429, 14129, 14129}, + {8443, 14135, 14135}, + {10365, 14140, 14140}, + {5267, 14145, 14145}, + {11834, 14151, 14153}, +} diff --git a/vendor/src/github.com/golang/snappy/snappy.go b/vendor/src/github.com/golang/snappy/snappy.go new file mode 100644 index 0000000..0102542 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/snappy.go @@ -0,0 +1,84 @@ +// Copyright 2011 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package snappy implements the snappy block-based compression format. +// It aims for very high speeds and reasonable compression. +// +// The C++ snappy implementation is at https://github.com/google/snappy +package snappy // import "github.com/golang/snappy" + +import ( + "hash/crc32" +) + +/* +Each encoded block begins with the varint-encoded length of the decoded data, +followed by a sequence of chunks. Chunks begin and end on byte boundaries. The +first byte of each chunk is broken into its 2 least and 6 most significant bits +called l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag. +Zero means a literal tag. All other values mean a copy tag. + +For literal tags: + - If m < 60, the next 1 + m bytes are literal bytes. + - Otherwise, let n be the little-endian unsigned integer denoted by the next + m - 59 bytes. The next 1 + n bytes after that are literal bytes. + +For copy tags, length bytes are copied from offset bytes ago, in the style of +Lempel-Ziv compression algorithms. In particular: + - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12). + The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10 + of the offset. The next byte is bits 0-7 of the offset. + - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65). + The length is 1 + m. The offset is the little-endian unsigned integer + denoted by the next 2 bytes. + - For l == 3, this tag is a legacy format that is no longer supported. +*/ +const ( + tagLiteral = 0x00 + tagCopy1 = 0x01 + tagCopy2 = 0x02 + tagCopy4 = 0x03 +) + +const ( + checksumSize = 4 + chunkHeaderSize = 4 + magicChunk = "\xff\x06\x00\x00" + magicBody + magicBody = "sNaPpY" + + // maxBlockSize is the maximum size of the input to encodeBlock. It is not + // part of the wire format per se, but some parts of the encoder assume + // that an offset fits into a uint16. + // + // Also, for the framing format (Writer type instead of Encode function), + // https://github.com/google/snappy/blob/master/framing_format.txt says + // that "the uncompressed data in a chunk must be no longer than 65536 + // bytes". + maxBlockSize = 65536 + + // maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is + // hard coded to be a const instead of a variable, so that obufLen can also + // be a const. Their equivalence is confirmed by + // TestMaxEncodedLenOfMaxBlockSize. + maxEncodedLenOfMaxBlockSize = 76490 + + obufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize + obufLen = obufHeaderLen + maxEncodedLenOfMaxBlockSize +) + +const ( + chunkTypeCompressedData = 0x00 + chunkTypeUncompressedData = 0x01 + chunkTypePadding = 0xfe + chunkTypeStreamIdentifier = 0xff +) + +var crcTable = crc32.MakeTable(crc32.Castagnoli) + +// crc implements the checksum specified in section 3 of +// https://github.com/google/snappy/blob/master/framing_format.txt +func crc(b []byte) uint32 { + c := crc32.Update(0, crcTable, b) + return uint32(c>>15|c<<17) + 0xa282ead8 +} diff --git a/vendor/src/github.com/golang/snappy/snappy_test.go b/vendor/src/github.com/golang/snappy/snappy_test.go new file mode 100644 index 0000000..ce3f08e --- /dev/null +++ b/vendor/src/github.com/golang/snappy/snappy_test.go @@ -0,0 +1,1320 @@ +// Copyright 2011 The Snappy-Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package snappy + +import ( + "bytes" + "encoding/binary" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "net/http" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" +) + +var ( + download = flag.Bool("download", false, "If true, download any missing files before running benchmarks") + testdataDir = flag.String("testdataDir", "testdata", "Directory containing the test data") + benchdataDir = flag.String("benchdataDir", "testdata/bench", "Directory containing the benchmark data") +) + +// goEncoderShouldMatchCppEncoder is whether to test that the algorithm used by +// Go's encoder matches byte-for-byte what the C++ snappy encoder produces, on +// this GOARCH. There is more than one valid encoding of any given input, and +// there is more than one good algorithm along the frontier of trading off +// throughput for output size. Nonetheless, we presume that the C++ encoder's +// algorithm is a good one and has been tested on a wide range of inputs, so +// matching that exactly should mean that the Go encoder's algorithm is also +// good, without needing to gather our own corpus of test data. +// +// The exact algorithm used by the C++ code is potentially endian dependent, as +// it puns a byte pointer to a uint32 pointer to load, hash and compare 4 bytes +// at a time. The Go implementation is endian agnostic, in that its output is +// the same (as little-endian C++ code), regardless of the CPU's endianness. +// +// Thus, when comparing Go's output to C++ output generated beforehand, such as +// the "testdata/pi.txt.rawsnappy" file generated by C++ code on a little- +// endian system, we can run that test regardless of the runtime.GOARCH value. +// +// When comparing Go's output to dynamically generated C++ output, i.e. the +// result of fork/exec'ing a C++ program, we can run that test only on +// little-endian systems, because the C++ output might be different on +// big-endian systems. The runtime package doesn't export endianness per se, +// but we can restrict this match-C++ test to common little-endian systems. +const goEncoderShouldMatchCppEncoder = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" || runtime.GOARCH == "arm" + +func TestMaxEncodedLenOfMaxBlockSize(t *testing.T) { + got := maxEncodedLenOfMaxBlockSize + want := MaxEncodedLen(maxBlockSize) + if got != want { + t.Fatalf("got %d, want %d", got, want) + } +} + +func cmp(a, b []byte) error { + if bytes.Equal(a, b) { + return nil + } + if len(a) != len(b) { + return fmt.Errorf("got %d bytes, want %d", len(a), len(b)) + } + for i := range a { + if a[i] != b[i] { + return fmt.Errorf("byte #%d: got 0x%02x, want 0x%02x", i, a[i], b[i]) + } + } + return nil +} + +func roundtrip(b, ebuf, dbuf []byte) error { + d, err := Decode(dbuf, Encode(ebuf, b)) + if err != nil { + return fmt.Errorf("decoding error: %v", err) + } + if err := cmp(d, b); err != nil { + return fmt.Errorf("roundtrip mismatch: %v", err) + } + return nil +} + +func TestEmpty(t *testing.T) { + if err := roundtrip(nil, nil, nil); err != nil { + t.Fatal(err) + } +} + +func TestSmallCopy(t *testing.T) { + for _, ebuf := range [][]byte{nil, make([]byte, 20), make([]byte, 64)} { + for _, dbuf := range [][]byte{nil, make([]byte, 20), make([]byte, 64)} { + for i := 0; i < 32; i++ { + s := "aaaa" + strings.Repeat("b", i) + "aaaabbbb" + if err := roundtrip([]byte(s), ebuf, dbuf); err != nil { + t.Errorf("len(ebuf)=%d, len(dbuf)=%d, i=%d: %v", len(ebuf), len(dbuf), i, err) + } + } + } + } +} + +func TestSmallRand(t *testing.T) { + rng := rand.New(rand.NewSource(1)) + for n := 1; n < 20000; n += 23 { + b := make([]byte, n) + for i := range b { + b[i] = uint8(rng.Intn(256)) + } + if err := roundtrip(b, nil, nil); err != nil { + t.Fatal(err) + } + } +} + +func TestSmallRegular(t *testing.T) { + for n := 1; n < 20000; n += 23 { + b := make([]byte, n) + for i := range b { + b[i] = uint8(i%10 + 'a') + } + if err := roundtrip(b, nil, nil); err != nil { + t.Fatal(err) + } + } +} + +func TestInvalidVarint(t *testing.T) { + testCases := []struct { + desc string + input string + }{{ + "invalid varint, final byte has continuation bit set", + "\xff", + }, { + "invalid varint, value overflows uint64", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00", + }, { + // https://github.com/google/snappy/blob/master/format_description.txt + // says that "the stream starts with the uncompressed length [as a + // varint] (up to a maximum of 2^32 - 1)". + "valid varint (as uint64), but value overflows uint32", + "\x80\x80\x80\x80\x10", + }} + + for _, tc := range testCases { + input := []byte(tc.input) + if _, err := DecodedLen(input); err != ErrCorrupt { + t.Errorf("%s: DecodedLen: got %v, want ErrCorrupt", tc.desc, err) + } + if _, err := Decode(nil, input); err != ErrCorrupt { + t.Errorf("%s: Decode: got %v, want ErrCorrupt", tc.desc, err) + } + } +} + +func TestDecode(t *testing.T) { + lit40Bytes := make([]byte, 40) + for i := range lit40Bytes { + lit40Bytes[i] = byte(i) + } + lit40 := string(lit40Bytes) + + testCases := []struct { + desc string + input string + want string + wantErr error + }{{ + `decodedLen=0; valid input`, + "\x00", + "", + nil, + }, { + `decodedLen=3; tagLiteral, 0-byte length; length=3; valid input`, + "\x03" + "\x08\xff\xff\xff", + "\xff\xff\xff", + nil, + }, { + `decodedLen=2; tagLiteral, 0-byte length; length=3; not enough dst bytes`, + "\x02" + "\x08\xff\xff\xff", + "", + ErrCorrupt, + }, { + `decodedLen=3; tagLiteral, 0-byte length; length=3; not enough src bytes`, + "\x03" + "\x08\xff\xff", + "", + ErrCorrupt, + }, { + `decodedLen=40; tagLiteral, 0-byte length; length=40; valid input`, + "\x28" + "\x9c" + lit40, + lit40, + nil, + }, { + `decodedLen=1; tagLiteral, 1-byte length; not enough length bytes`, + "\x01" + "\xf0", + "", + ErrCorrupt, + }, { + `decodedLen=3; tagLiteral, 1-byte length; length=3; valid input`, + "\x03" + "\xf0\x02\xff\xff\xff", + "\xff\xff\xff", + nil, + }, { + `decodedLen=1; tagLiteral, 2-byte length; not enough length bytes`, + "\x01" + "\xf4\x00", + "", + ErrCorrupt, + }, { + `decodedLen=3; tagLiteral, 2-byte length; length=3; valid input`, + "\x03" + "\xf4\x02\x00\xff\xff\xff", + "\xff\xff\xff", + nil, + }, { + `decodedLen=1; tagLiteral, 3-byte length; not enough length bytes`, + "\x01" + "\xf8\x00\x00", + "", + ErrCorrupt, + }, { + `decodedLen=3; tagLiteral, 3-byte length; length=3; valid input`, + "\x03" + "\xf8\x02\x00\x00\xff\xff\xff", + "\xff\xff\xff", + nil, + }, { + `decodedLen=1; tagLiteral, 4-byte length; not enough length bytes`, + "\x01" + "\xfc\x00\x00\x00", + "", + ErrCorrupt, + }, { + `decodedLen=1; tagLiteral, 4-byte length; length=3; not enough dst bytes`, + "\x01" + "\xfc\x02\x00\x00\x00\xff\xff\xff", + "", + ErrCorrupt, + }, { + `decodedLen=4; tagLiteral, 4-byte length; length=3; not enough src bytes`, + "\x04" + "\xfc\x02\x00\x00\x00\xff", + "", + ErrCorrupt, + }, { + `decodedLen=3; tagLiteral, 4-byte length; length=3; valid input`, + "\x03" + "\xfc\x02\x00\x00\x00\xff\xff\xff", + "\xff\xff\xff", + nil, + }, { + `decodedLen=4; tagCopy1, 1 extra length|offset byte; not enough extra bytes`, + "\x04" + "\x01", + "", + ErrCorrupt, + }, { + `decodedLen=4; tagCopy2, 2 extra length|offset bytes; not enough extra bytes`, + "\x04" + "\x02\x00", + "", + ErrCorrupt, + }, { + `decodedLen=4; tagCopy4; unsupported COPY_4 tag`, + "\x04" + "\x03\x00\x00\x00\x00", + "", + errUnsupportedCopy4Tag, + }, { + `decodedLen=4; tagLiteral (4 bytes "abcd"); valid input`, + "\x04" + "\x0cabcd", + "abcd", + nil, + }, { + `decodedLen=13; tagLiteral (4 bytes "abcd"); tagCopy1; length=9 offset=4; valid input`, + "\x0d" + "\x0cabcd" + "\x15\x04", + "abcdabcdabcda", + nil, + }, { + `decodedLen=8; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=4; valid input`, + "\x08" + "\x0cabcd" + "\x01\x04", + "abcdabcd", + nil, + }, { + `decodedLen=8; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=2; valid input`, + "\x08" + "\x0cabcd" + "\x01\x02", + "abcdcdcd", + nil, + }, { + `decodedLen=8; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=1; valid input`, + "\x08" + "\x0cabcd" + "\x01\x01", + "abcddddd", + nil, + }, { + `decodedLen=8; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=0; zero offset`, + "\x08" + "\x0cabcd" + "\x01\x00", + "", + ErrCorrupt, + }, { + `decodedLen=9; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=4; inconsistent dLen`, + "\x09" + "\x0cabcd" + "\x01\x04", + "", + ErrCorrupt, + }, { + `decodedLen=8; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=5; offset too large`, + "\x08" + "\x0cabcd" + "\x01\x05", + "", + ErrCorrupt, + }, { + `decodedLen=7; tagLiteral (4 bytes "abcd"); tagCopy1; length=4 offset=4; length too large`, + "\x07" + "\x0cabcd" + "\x01\x04", + "", + ErrCorrupt, + }, { + `decodedLen=6; tagLiteral (4 bytes "abcd"); tagCopy2; length=2 offset=3; valid input`, + "\x06" + "\x0cabcd" + "\x06\x03\x00", + "abcdbc", + nil, + }} + + const ( + // notPresentXxx defines a range of byte values [0xa0, 0xc5) that are + // not present in either the input or the output. It is written to dBuf + // to check that Decode does not write bytes past the end of + // dBuf[:dLen]. + // + // The magic number 37 was chosen because it is prime. A more 'natural' + // number like 32 might lead to a false negative if, for example, a + // byte was incorrectly copied 4*8 bytes later. + notPresentBase = 0xa0 + notPresentLen = 37 + ) + + var dBuf [100]byte +loop: + for i, tc := range testCases { + input := []byte(tc.input) + for _, x := range input { + if notPresentBase <= x && x < notPresentBase+notPresentLen { + t.Errorf("#%d (%s): input shouldn't contain %#02x\ninput: % x", i, tc.desc, x, input) + continue loop + } + } + + dLen, n := binary.Uvarint(input) + if n <= 0 { + t.Errorf("#%d (%s): invalid varint-encoded dLen", i, tc.desc) + continue + } + if dLen > uint64(len(dBuf)) { + t.Errorf("#%d (%s): dLen %d is too large", i, tc.desc, dLen) + continue + } + + for j := range dBuf { + dBuf[j] = byte(notPresentBase + j%notPresentLen) + } + g, gotErr := Decode(dBuf[:], input) + if got := string(g); got != tc.want || gotErr != tc.wantErr { + t.Errorf("#%d (%s):\ngot %q, %v\nwant %q, %v", + i, tc.desc, got, gotErr, tc.want, tc.wantErr) + continue + } + for j, x := range dBuf { + if uint64(j) < dLen { + continue + } + if w := byte(notPresentBase + j%notPresentLen); x != w { + t.Errorf("#%d (%s): Decode overrun: dBuf[%d] was modified: got %#02x, want %#02x\ndBuf: % x", + i, tc.desc, j, x, w, dBuf) + continue loop + } + } + } +} + +// TestDecodeLengthOffset tests decoding an encoding of the form literal + +// copy-length-offset + literal. For example: "abcdefghijkl" + "efghij" + "AB". +func TestDecodeLengthOffset(t *testing.T) { + const ( + prefix = "abcdefghijklmnopqr" + suffix = "ABCDEFGHIJKLMNOPQR" + + // notPresentXxx defines a range of byte values [0xa0, 0xc5) that are + // not present in either the input or the output. It is written to + // gotBuf to check that Decode does not write bytes past the end of + // gotBuf[:totalLen]. + // + // The magic number 37 was chosen because it is prime. A more 'natural' + // number like 32 might lead to a false negative if, for example, a + // byte was incorrectly copied 4*8 bytes later. + notPresentBase = 0xa0 + notPresentLen = 37 + ) + var gotBuf, wantBuf, inputBuf [128]byte + for length := 1; length <= 18; length++ { + for offset := 1; offset <= 18; offset++ { + loop: + for suffixLen := 0; suffixLen <= 18; suffixLen++ { + totalLen := len(prefix) + length + suffixLen + + inputLen := binary.PutUvarint(inputBuf[:], uint64(totalLen)) + inputBuf[inputLen] = tagLiteral + 4*byte(len(prefix)-1) + inputLen++ + inputLen += copy(inputBuf[inputLen:], prefix) + inputBuf[inputLen+0] = tagCopy2 + 4*byte(length-1) + inputBuf[inputLen+1] = byte(offset) + inputBuf[inputLen+2] = 0x00 + inputLen += 3 + if suffixLen > 0 { + inputBuf[inputLen] = tagLiteral + 4*byte(suffixLen-1) + inputLen++ + inputLen += copy(inputBuf[inputLen:], suffix[:suffixLen]) + } + input := inputBuf[:inputLen] + + for i := range gotBuf { + gotBuf[i] = byte(notPresentBase + i%notPresentLen) + } + got, err := Decode(gotBuf[:], input) + if err != nil { + t.Errorf("length=%d, offset=%d; suffixLen=%d: %v", length, offset, suffixLen, err) + continue + } + + wantLen := 0 + wantLen += copy(wantBuf[wantLen:], prefix) + for i := 0; i < length; i++ { + wantBuf[wantLen] = wantBuf[wantLen-offset] + wantLen++ + } + wantLen += copy(wantBuf[wantLen:], suffix[:suffixLen]) + want := wantBuf[:wantLen] + + for _, x := range input { + if notPresentBase <= x && x < notPresentBase+notPresentLen { + t.Errorf("length=%d, offset=%d; suffixLen=%d: input shouldn't contain %#02x\ninput: % x", + length, offset, suffixLen, x, input) + continue loop + } + } + for i, x := range gotBuf { + if i < totalLen { + continue + } + if w := byte(notPresentBase + i%notPresentLen); x != w { + t.Errorf("length=%d, offset=%d; suffixLen=%d; totalLen=%d: "+ + "Decode overrun: gotBuf[%d] was modified: got %#02x, want %#02x\ngotBuf: % x", + length, offset, suffixLen, totalLen, i, x, w, gotBuf) + continue loop + } + } + for _, x := range want { + if notPresentBase <= x && x < notPresentBase+notPresentLen { + t.Errorf("length=%d, offset=%d; suffixLen=%d: want shouldn't contain %#02x\nwant: % x", + length, offset, suffixLen, x, want) + continue loop + } + } + + if !bytes.Equal(got, want) { + t.Errorf("length=%d, offset=%d; suffixLen=%d:\ninput % x\ngot % x\nwant % x", + length, offset, suffixLen, input, got, want) + continue + } + } + } + } +} + +const ( + goldenText = "Mark.Twain-Tom.Sawyer.txt" + goldenCompressed = goldenText + ".rawsnappy" +) + +func TestDecodeGoldenInput(t *testing.T) { + tDir := filepath.FromSlash(*testdataDir) + src, err := ioutil.ReadFile(filepath.Join(tDir, goldenCompressed)) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + got, err := Decode(nil, src) + if err != nil { + t.Fatalf("Decode: %v", err) + } + want, err := ioutil.ReadFile(filepath.Join(tDir, goldenText)) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + if err := cmp(got, want); err != nil { + t.Fatal(err) + } +} + +func TestEncodeGoldenInput(t *testing.T) { + tDir := filepath.FromSlash(*testdataDir) + src, err := ioutil.ReadFile(filepath.Join(tDir, goldenText)) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + got := Encode(nil, src) + want, err := ioutil.ReadFile(filepath.Join(tDir, goldenCompressed)) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + if err := cmp(got, want); err != nil { + t.Fatal(err) + } +} + +func TestExtendMatchGoldenInput(t *testing.T) { + tDir := filepath.FromSlash(*testdataDir) + src, err := ioutil.ReadFile(filepath.Join(tDir, goldenText)) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + for i, tc := range extendMatchGoldenTestCases { + got := extendMatch(src, tc.i, tc.j) + if got != tc.want { + t.Errorf("test #%d: i, j = %5d, %5d: got %5d (= j + %6d), want %5d (= j + %6d)", + i, tc.i, tc.j, got, got-tc.j, tc.want, tc.want-tc.j) + } + } +} + +func TestExtendMatch(t *testing.T) { + // ref is a simple, reference implementation of extendMatch. + ref := func(src []byte, i, j int) int { + for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { + } + return j + } + + nums := []int{0, 1, 2, 7, 8, 9, 29, 30, 31, 32, 33, 34, 38, 39, 40} + for yIndex := 40; yIndex > 30; yIndex-- { + xxx := bytes.Repeat([]byte("x"), 40) + if yIndex < len(xxx) { + xxx[yIndex] = 'y' + } + for _, i := range nums { + for _, j := range nums { + if i >= j { + continue + } + got := extendMatch(xxx, i, j) + want := ref(xxx, i, j) + if got != want { + t.Errorf("yIndex=%d, i=%d, j=%d: got %d, want %d", yIndex, i, j, got, want) + } + } + } + } +} + +const snappytoolCmdName = "cmd/snappytool/snappytool" + +func skipTestSameEncodingAsCpp() (msg string) { + if !goEncoderShouldMatchCppEncoder { + return fmt.Sprintf("skipping testing that the encoding is byte-for-byte identical to C++: GOARCH=%s", runtime.GOARCH) + } + if _, err := os.Stat(snappytoolCmdName); err != nil { + return fmt.Sprintf("could not find snappytool: %v", err) + } + return "" +} + +func runTestSameEncodingAsCpp(src []byte) error { + got := Encode(nil, src) + + cmd := exec.Command(snappytoolCmdName, "-e") + cmd.Stdin = bytes.NewReader(src) + want, err := cmd.Output() + if err != nil { + return fmt.Errorf("could not run snappytool: %v", err) + } + return cmp(got, want) +} + +func TestSameEncodingAsCppShortCopies(t *testing.T) { + if msg := skipTestSameEncodingAsCpp(); msg != "" { + t.Skip(msg) + } + src := bytes.Repeat([]byte{'a'}, 20) + for i := 0; i <= len(src); i++ { + if err := runTestSameEncodingAsCpp(src[:i]); err != nil { + t.Errorf("i=%d: %v", i, err) + } + } +} + +func TestSameEncodingAsCppLongFiles(t *testing.T) { + if msg := skipTestSameEncodingAsCpp(); msg != "" { + t.Skip(msg) + } + bDir := filepath.FromSlash(*benchdataDir) + failed := false + for i, tf := range testFiles { + if err := downloadBenchmarkFiles(t, tf.filename); err != nil { + t.Fatalf("failed to download testdata: %s", err) + } + data := readFile(t, filepath.Join(bDir, tf.filename)) + if n := tf.sizeLimit; 0 < n && n < len(data) { + data = data[:n] + } + if err := runTestSameEncodingAsCpp(data); err != nil { + t.Errorf("i=%d: %v", i, err) + failed = true + } + } + if failed { + t.Errorf("was the snappytool program built against the C++ snappy library version " + + "d53de187 or later, commited on 2016-04-05? See " + + "https://github.com/google/snappy/commit/d53de18799418e113e44444252a39b12a0e4e0cc") + } +} + +// TestSlowForwardCopyOverrun tests the "expand the pattern" algorithm +// described in decode_amd64.s and its claim of a 10 byte overrun worst case. +func TestSlowForwardCopyOverrun(t *testing.T) { + const base = 100 + + for length := 1; length < 18; length++ { + for offset := 1; offset < 18; offset++ { + highWaterMark := base + d := base + l := length + o := offset + + // makeOffsetAtLeast8 + for o < 8 { + if end := d + 8; highWaterMark < end { + highWaterMark = end + } + l -= o + d += o + o += o + } + + // fixUpSlowForwardCopy + a := d + d += l + + // finishSlowForwardCopy + for l > 0 { + if end := a + 8; highWaterMark < end { + highWaterMark = end + } + a += 8 + l -= 8 + } + + dWant := base + length + overrun := highWaterMark - dWant + if d != dWant || overrun < 0 || 10 < overrun { + t.Errorf("length=%d, offset=%d: d and overrun: got (%d, %d), want (%d, something in [0, 10])", + length, offset, d, overrun, dWant) + } + } + } +} + +// TestEncodeNoiseThenRepeats encodes input for which the first half is very +// incompressible and the second half is very compressible. The encoded form's +// length should be closer to 50% of the original length than 100%. +func TestEncodeNoiseThenRepeats(t *testing.T) { + for _, origLen := range []int{256 * 1024, 2048 * 1024} { + src := make([]byte, origLen) + rng := rand.New(rand.NewSource(1)) + firstHalf, secondHalf := src[:origLen/2], src[origLen/2:] + for i := range firstHalf { + firstHalf[i] = uint8(rng.Intn(256)) + } + for i := range secondHalf { + secondHalf[i] = uint8(i >> 8) + } + dst := Encode(nil, src) + if got, want := len(dst), origLen*3/4; got >= want { + t.Errorf("origLen=%d: got %d encoded bytes, want less than %d", origLen, got, want) + } + } +} + +func TestFramingFormat(t *testing.T) { + // src is comprised of alternating 1e5-sized sequences of random + // (incompressible) bytes and repeated (compressible) bytes. 1e5 was chosen + // because it is larger than maxBlockSize (64k). + src := make([]byte, 1e6) + rng := rand.New(rand.NewSource(1)) + for i := 0; i < 10; i++ { + if i%2 == 0 { + for j := 0; j < 1e5; j++ { + src[1e5*i+j] = uint8(rng.Intn(256)) + } + } else { + for j := 0; j < 1e5; j++ { + src[1e5*i+j] = uint8(i) + } + } + } + + buf := new(bytes.Buffer) + if _, err := NewWriter(buf).Write(src); err != nil { + t.Fatalf("Write: encoding: %v", err) + } + dst, err := ioutil.ReadAll(NewReader(buf)) + if err != nil { + t.Fatalf("ReadAll: decoding: %v", err) + } + if err := cmp(dst, src); err != nil { + t.Fatal(err) + } +} + +func TestWriterGoldenOutput(t *testing.T) { + buf := new(bytes.Buffer) + w := NewBufferedWriter(buf) + defer w.Close() + w.Write([]byte("abcd")) // Not compressible. + w.Flush() + w.Write(bytes.Repeat([]byte{'A'}, 150)) // Compressible. + w.Flush() + // The next chunk is also compressible, but a naive, greedy encoding of the + // overall length 67 copy as a length 64 copy (the longest expressible as a + // tagCopy1 or tagCopy2) plus a length 3 remainder would be two 3-byte + // tagCopy2 tags (6 bytes), since the minimum length for a tagCopy1 is 4 + // bytes. Instead, we could do it shorter, in 5 bytes: a 3-byte tagCopy2 + // (of length 60) and a 2-byte tagCopy1 (of length 7). + w.Write(bytes.Repeat([]byte{'B'}, 68)) + w.Write([]byte("efC")) // Not compressible. + w.Write(bytes.Repeat([]byte{'C'}, 20)) // Compressible. + w.Write(bytes.Repeat([]byte{'B'}, 20)) // Compressible. + w.Write([]byte("g")) // Not compressible. + w.Flush() + + got := buf.String() + want := strings.Join([]string{ + magicChunk, + "\x01\x08\x00\x00", // Uncompressed chunk, 8 bytes long (including 4 byte checksum). + "\x68\x10\xe6\xb6", // Checksum. + "\x61\x62\x63\x64", // Uncompressed payload: "abcd". + "\x00\x11\x00\x00", // Compressed chunk, 17 bytes long (including 4 byte checksum). + "\x5f\xeb\xf2\x10", // Checksum. + "\x96\x01", // Compressed payload: Uncompressed length (varint encoded): 150. + "\x00\x41", // Compressed payload: tagLiteral, length=1, "A". + "\xfe\x01\x00", // Compressed payload: tagCopy2, length=64, offset=1. + "\xfe\x01\x00", // Compressed payload: tagCopy2, length=64, offset=1. + "\x52\x01\x00", // Compressed payload: tagCopy2, length=21, offset=1. + "\x00\x18\x00\x00", // Compressed chunk, 24 bytes long (including 4 byte checksum). + "\x30\x85\x69\xeb", // Checksum. + "\x70", // Compressed payload: Uncompressed length (varint encoded): 112. + "\x00\x42", // Compressed payload: tagLiteral, length=1, "B". + "\xee\x01\x00", // Compressed payload: tagCopy2, length=60, offset=1. + "\x0d\x01", // Compressed payload: tagCopy1, length=7, offset=1. + "\x08\x65\x66\x43", // Compressed payload: tagLiteral, length=3, "efC". + "\x4e\x01\x00", // Compressed payload: tagCopy2, length=20, offset=1. + "\x4e\x5a\x00", // Compressed payload: tagCopy2, length=20, offset=90. + "\x00\x67", // Compressed payload: tagLiteral, length=1, "g". + }, "") + if got != want { + t.Fatalf("\ngot: % x\nwant: % x", got, want) + } +} + +func TestEmitLiteral(t *testing.T) { + testCases := []struct { + length int + want string + }{ + {1, "\x00"}, + {2, "\x04"}, + {59, "\xe8"}, + {60, "\xec"}, + {61, "\xf0\x3c"}, + {62, "\xf0\x3d"}, + {254, "\xf0\xfd"}, + {255, "\xf0\xfe"}, + {256, "\xf0\xff"}, + {257, "\xf4\x00\x01"}, + {65534, "\xf4\xfd\xff"}, + {65535, "\xf4\xfe\xff"}, + {65536, "\xf4\xff\xff"}, + } + + dst := make([]byte, 70000) + nines := bytes.Repeat([]byte{0x99}, 65536) + for _, tc := range testCases { + lit := nines[:tc.length] + n := emitLiteral(dst, lit) + if !bytes.HasSuffix(dst[:n], lit) { + t.Errorf("length=%d: did not end with that many literal bytes", tc.length) + continue + } + got := string(dst[:n-tc.length]) + if got != tc.want { + t.Errorf("length=%d:\ngot % x\nwant % x", tc.length, got, tc.want) + continue + } + } +} + +func TestEmitCopy(t *testing.T) { + testCases := []struct { + offset int + length int + want string + }{ + {8, 04, "\x01\x08"}, + {8, 11, "\x1d\x08"}, + {8, 12, "\x2e\x08\x00"}, + {8, 13, "\x32\x08\x00"}, + {8, 59, "\xea\x08\x00"}, + {8, 60, "\xee\x08\x00"}, + {8, 61, "\xf2\x08\x00"}, + {8, 62, "\xf6\x08\x00"}, + {8, 63, "\xfa\x08\x00"}, + {8, 64, "\xfe\x08\x00"}, + {8, 65, "\xee\x08\x00\x05\x08"}, + {8, 66, "\xee\x08\x00\x09\x08"}, + {8, 67, "\xee\x08\x00\x0d\x08"}, + {8, 68, "\xfe\x08\x00\x01\x08"}, + {8, 69, "\xfe\x08\x00\x05\x08"}, + {8, 80, "\xfe\x08\x00\x3e\x08\x00"}, + + {256, 04, "\x21\x00"}, + {256, 11, "\x3d\x00"}, + {256, 12, "\x2e\x00\x01"}, + {256, 13, "\x32\x00\x01"}, + {256, 59, "\xea\x00\x01"}, + {256, 60, "\xee\x00\x01"}, + {256, 61, "\xf2\x00\x01"}, + {256, 62, "\xf6\x00\x01"}, + {256, 63, "\xfa\x00\x01"}, + {256, 64, "\xfe\x00\x01"}, + {256, 65, "\xee\x00\x01\x25\x00"}, + {256, 66, "\xee\x00\x01\x29\x00"}, + {256, 67, "\xee\x00\x01\x2d\x00"}, + {256, 68, "\xfe\x00\x01\x21\x00"}, + {256, 69, "\xfe\x00\x01\x25\x00"}, + {256, 80, "\xfe\x00\x01\x3e\x00\x01"}, + + {2048, 04, "\x0e\x00\x08"}, + {2048, 11, "\x2a\x00\x08"}, + {2048, 12, "\x2e\x00\x08"}, + {2048, 13, "\x32\x00\x08"}, + {2048, 59, "\xea\x00\x08"}, + {2048, 60, "\xee\x00\x08"}, + {2048, 61, "\xf2\x00\x08"}, + {2048, 62, "\xf6\x00\x08"}, + {2048, 63, "\xfa\x00\x08"}, + {2048, 64, "\xfe\x00\x08"}, + {2048, 65, "\xee\x00\x08\x12\x00\x08"}, + {2048, 66, "\xee\x00\x08\x16\x00\x08"}, + {2048, 67, "\xee\x00\x08\x1a\x00\x08"}, + {2048, 68, "\xfe\x00\x08\x0e\x00\x08"}, + {2048, 69, "\xfe\x00\x08\x12\x00\x08"}, + {2048, 80, "\xfe\x00\x08\x3e\x00\x08"}, + } + + dst := make([]byte, 1024) + for _, tc := range testCases { + n := emitCopy(dst, tc.offset, tc.length) + got := string(dst[:n]) + if got != tc.want { + t.Errorf("offset=%d, length=%d:\ngot % x\nwant % x", tc.offset, tc.length, got, tc.want) + } + } +} + +func TestNewBufferedWriter(t *testing.T) { + // Test all 32 possible sub-sequences of these 5 input slices. + // + // Their lengths sum to 400,000, which is over 6 times the Writer ibuf + // capacity: 6 * maxBlockSize is 393,216. + inputs := [][]byte{ + bytes.Repeat([]byte{'a'}, 40000), + bytes.Repeat([]byte{'b'}, 150000), + bytes.Repeat([]byte{'c'}, 60000), + bytes.Repeat([]byte{'d'}, 120000), + bytes.Repeat([]byte{'e'}, 30000), + } +loop: + for i := 0; i < 1< 0; { + i := copy(x, src) + x = x[i:] + } + return dst +} + +func benchWords(b *testing.B, n int, decode bool) { + // Note: the file is OS-language dependent so the resulting values are not + // directly comparable for non-US-English OS installations. + data := expand(readFile(b, "/usr/share/dict/words"), n) + if decode { + benchDecode(b, data) + } else { + benchEncode(b, data) + } +} + +func BenchmarkWordsDecode1e1(b *testing.B) { benchWords(b, 1e1, true) } +func BenchmarkWordsDecode1e2(b *testing.B) { benchWords(b, 1e2, true) } +func BenchmarkWordsDecode1e3(b *testing.B) { benchWords(b, 1e3, true) } +func BenchmarkWordsDecode1e4(b *testing.B) { benchWords(b, 1e4, true) } +func BenchmarkWordsDecode1e5(b *testing.B) { benchWords(b, 1e5, true) } +func BenchmarkWordsDecode1e6(b *testing.B) { benchWords(b, 1e6, true) } +func BenchmarkWordsEncode1e1(b *testing.B) { benchWords(b, 1e1, false) } +func BenchmarkWordsEncode1e2(b *testing.B) { benchWords(b, 1e2, false) } +func BenchmarkWordsEncode1e3(b *testing.B) { benchWords(b, 1e3, false) } +func BenchmarkWordsEncode1e4(b *testing.B) { benchWords(b, 1e4, false) } +func BenchmarkWordsEncode1e5(b *testing.B) { benchWords(b, 1e5, false) } +func BenchmarkWordsEncode1e6(b *testing.B) { benchWords(b, 1e6, false) } + +func BenchmarkRandomEncode(b *testing.B) { + rng := rand.New(rand.NewSource(1)) + data := make([]byte, 1<<20) + for i := range data { + data[i] = uint8(rng.Intn(256)) + } + benchEncode(b, data) +} + +// testFiles' values are copied directly from +// https://raw.githubusercontent.com/google/snappy/master/snappy_unittest.cc +// The label field is unused in snappy-go. +var testFiles = []struct { + label string + filename string + sizeLimit int +}{ + {"html", "html", 0}, + {"urls", "urls.10K", 0}, + {"jpg", "fireworks.jpeg", 0}, + {"jpg_200", "fireworks.jpeg", 200}, + {"pdf", "paper-100k.pdf", 0}, + {"html4", "html_x_4", 0}, + {"txt1", "alice29.txt", 0}, + {"txt2", "asyoulik.txt", 0}, + {"txt3", "lcet10.txt", 0}, + {"txt4", "plrabn12.txt", 0}, + {"pb", "geo.protodata", 0}, + {"gaviota", "kppkn.gtb", 0}, +} + +const ( + // The benchmark data files are at this canonical URL. + benchURL = "https://raw.githubusercontent.com/google/snappy/master/testdata/" +) + +func downloadBenchmarkFiles(b testing.TB, basename string) (errRet error) { + bDir := filepath.FromSlash(*benchdataDir) + filename := filepath.Join(bDir, basename) + if stat, err := os.Stat(filename); err == nil && stat.Size() != 0 { + return nil + } + + if !*download { + b.Skipf("test data not found; skipping %s without the -download flag", testOrBenchmark(b)) + } + // Download the official snappy C++ implementation reference test data + // files for benchmarking. + if err := os.MkdirAll(bDir, 0777); err != nil && !os.IsExist(err) { + return fmt.Errorf("failed to create %s: %s", bDir, err) + } + + f, err := os.Create(filename) + if err != nil { + return fmt.Errorf("failed to create %s: %s", filename, err) + } + defer f.Close() + defer func() { + if errRet != nil { + os.Remove(filename) + } + }() + url := benchURL + basename + resp, err := http.Get(url) + if err != nil { + return fmt.Errorf("failed to download %s: %s", url, err) + } + defer resp.Body.Close() + if s := resp.StatusCode; s != http.StatusOK { + return fmt.Errorf("downloading %s: HTTP status code %d (%s)", url, s, http.StatusText(s)) + } + _, err = io.Copy(f, resp.Body) + if err != nil { + return fmt.Errorf("failed to download %s to %s: %s", url, filename, err) + } + return nil +} + +func benchFile(b *testing.B, i int, decode bool) { + if err := downloadBenchmarkFiles(b, testFiles[i].filename); err != nil { + b.Fatalf("failed to download testdata: %s", err) + } + bDir := filepath.FromSlash(*benchdataDir) + data := readFile(b, filepath.Join(bDir, testFiles[i].filename)) + if n := testFiles[i].sizeLimit; 0 < n && n < len(data) { + data = data[:n] + } + if decode { + benchDecode(b, data) + } else { + benchEncode(b, data) + } +} + +// Naming convention is kept similar to what snappy's C++ implementation uses. +func Benchmark_UFlat0(b *testing.B) { benchFile(b, 0, true) } +func Benchmark_UFlat1(b *testing.B) { benchFile(b, 1, true) } +func Benchmark_UFlat2(b *testing.B) { benchFile(b, 2, true) } +func Benchmark_UFlat3(b *testing.B) { benchFile(b, 3, true) } +func Benchmark_UFlat4(b *testing.B) { benchFile(b, 4, true) } +func Benchmark_UFlat5(b *testing.B) { benchFile(b, 5, true) } +func Benchmark_UFlat6(b *testing.B) { benchFile(b, 6, true) } +func Benchmark_UFlat7(b *testing.B) { benchFile(b, 7, true) } +func Benchmark_UFlat8(b *testing.B) { benchFile(b, 8, true) } +func Benchmark_UFlat9(b *testing.B) { benchFile(b, 9, true) } +func Benchmark_UFlat10(b *testing.B) { benchFile(b, 10, true) } +func Benchmark_UFlat11(b *testing.B) { benchFile(b, 11, true) } +func Benchmark_ZFlat0(b *testing.B) { benchFile(b, 0, false) } +func Benchmark_ZFlat1(b *testing.B) { benchFile(b, 1, false) } +func Benchmark_ZFlat2(b *testing.B) { benchFile(b, 2, false) } +func Benchmark_ZFlat3(b *testing.B) { benchFile(b, 3, false) } +func Benchmark_ZFlat4(b *testing.B) { benchFile(b, 4, false) } +func Benchmark_ZFlat5(b *testing.B) { benchFile(b, 5, false) } +func Benchmark_ZFlat6(b *testing.B) { benchFile(b, 6, false) } +func Benchmark_ZFlat7(b *testing.B) { benchFile(b, 7, false) } +func Benchmark_ZFlat8(b *testing.B) { benchFile(b, 8, false) } +func Benchmark_ZFlat9(b *testing.B) { benchFile(b, 9, false) } +func Benchmark_ZFlat10(b *testing.B) { benchFile(b, 10, false) } +func Benchmark_ZFlat11(b *testing.B) { benchFile(b, 11, false) } + +func BenchmarkExtendMatch(b *testing.B) { + tDir := filepath.FromSlash(*testdataDir) + src, err := ioutil.ReadFile(filepath.Join(tDir, goldenText)) + if err != nil { + b.Fatalf("ReadFile: %v", err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, tc := range extendMatchGoldenTestCases { + extendMatch(src, tc.i, tc.j) + } + } +} diff --git a/vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt b/vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt new file mode 100644 index 0000000..86a1875 --- /dev/null +++ b/vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt @@ -0,0 +1,396 @@ +Produced by David Widger. The previous edition was updated by Jose +Menendez. + + + + + + THE ADVENTURES OF TOM SAWYER + BY + MARK TWAIN + (Samuel Langhorne Clemens) + + + + + P R E F A C E + +MOST of the adventures recorded in this book really occurred; one or +two were experiences of my own, the rest those of boys who were +schoolmates of mine. Huck Finn is drawn from life; Tom Sawyer also, but +not from an individual--he is a combination of the characteristics of +three boys whom I knew, and therefore belongs to the composite order of +architecture. + +The odd superstitions touched upon were all prevalent among children +and slaves in the West at the period of this story--that is to say, +thirty or forty years ago. + +Although my book is intended mainly for the entertainment of boys and +girls, I hope it will not be shunned by men and women on that account, +for part of my plan has been to try to pleasantly remind adults of what +they once were themselves, and of how they felt and thought and talked, +and what queer enterprises they sometimes engaged in. + + THE AUTHOR. + +HARTFORD, 1876. + + + + T O M S A W Y E R + + + +CHAPTER I + +"TOM!" + +No answer. + +"TOM!" + +No answer. + +"What's gone with that boy, I wonder? You TOM!" + +No answer. + +The old lady pulled her spectacles down and looked over them about the +room; then she put them up and looked out under them. She seldom or +never looked THROUGH them for so small a thing as a boy; they were her +state pair, the pride of her heart, and were built for "style," not +service--she could have seen through a pair of stove-lids just as well. +She looked perplexed for a moment, and then said, not fiercely, but +still loud enough for the furniture to hear: + +"Well, I lay if I get hold of you I'll--" + +She did not finish, for by this time she was bending down and punching +under the bed with the broom, and so she needed breath to punctuate the +punches with. She resurrected nothing but the cat. + +"I never did see the beat of that boy!" + +She went to the open door and stood in it and looked out among the +tomato vines and "jimpson" weeds that constituted the garden. No Tom. +So she lifted up her voice at an angle calculated for distance and +shouted: + +"Y-o-u-u TOM!" + +There was a slight noise behind her and she turned just in time to +seize a small boy by the slack of his roundabout and arrest his flight. + +"There! I might 'a' thought of that closet. What you been doing in +there?" + +"Nothing." + +"Nothing! Look at your hands. And look at your mouth. What IS that +truck?" + +"I don't know, aunt." + +"Well, I know. It's jam--that's what it is. Forty times I've said if +you didn't let that jam alone I'd skin you. Hand me that switch." + +The switch hovered in the air--the peril was desperate-- + +"My! Look behind you, aunt!" + +The old lady whirled round, and snatched her skirts out of danger. The +lad fled on the instant, scrambled up the high board-fence, and +disappeared over it. + +His aunt Polly stood surprised a moment, and then broke into a gentle +laugh. + +"Hang the boy, can't I never learn anything? Ain't he played me tricks +enough like that for me to be looking out for him by this time? But old +fools is the biggest fools there is. Can't learn an old dog new tricks, +as the saying is. But my goodness, he never plays them alike, two days, +and how is a body to know what's coming? He 'pears to know just how +long he can torment me before I get my dander up, and he knows if he +can make out to put me off for a minute or make me laugh, it's all down +again and I can't hit him a lick. I ain't doing my duty by that boy, +and that's the Lord's truth, goodness knows. Spare the rod and spile +the child, as the Good Book says. I'm a laying up sin and suffering for +us both, I know. He's full of the Old Scratch, but laws-a-me! he's my +own dead sister's boy, poor thing, and I ain't got the heart to lash +him, somehow. Every time I let him off, my conscience does hurt me so, +and every time I hit him my old heart most breaks. Well-a-well, man +that is born of woman is of few days and full of trouble, as the +Scripture says, and I reckon it's so. He'll play hookey this evening, * +and [* Southwestern for "afternoon"] I'll just be obleeged to make him +work, to-morrow, to punish him. It's mighty hard to make him work +Saturdays, when all the boys is having holiday, but he hates work more +than he hates anything else, and I've GOT to do some of my duty by him, +or I'll be the ruination of the child." + +Tom did play hookey, and he had a very good time. He got back home +barely in season to help Jim, the small colored boy, saw next-day's +wood and split the kindlings before supper--at least he was there in +time to tell his adventures to Jim while Jim did three-fourths of the +work. Tom's younger brother (or rather half-brother) Sid was already +through with his part of the work (picking up chips), for he was a +quiet boy, and had no adventurous, troublesome ways. + +While Tom was eating his supper, and stealing sugar as opportunity +offered, Aunt Polly asked him questions that were full of guile, and +very deep--for she wanted to trap him into damaging revealments. Like +many other simple-hearted souls, it was her pet vanity to believe she +was endowed with a talent for dark and mysterious diplomacy, and she +loved to contemplate her most transparent devices as marvels of low +cunning. Said she: + +"Tom, it was middling warm in school, warn't it?" + +"Yes'm." + +"Powerful warm, warn't it?" + +"Yes'm." + +"Didn't you want to go in a-swimming, Tom?" + +A bit of a scare shot through Tom--a touch of uncomfortable suspicion. +He searched Aunt Polly's face, but it told him nothing. So he said: + +"No'm--well, not very much." + +The old lady reached out her hand and felt Tom's shirt, and said: + +"But you ain't too warm now, though." And it flattered her to reflect +that she had discovered that the shirt was dry without anybody knowing +that that was what she had in her mind. But in spite of her, Tom knew +where the wind lay, now. So he forestalled what might be the next move: + +"Some of us pumped on our heads--mine's damp yet. See?" + +Aunt Polly was vexed to think she had overlooked that bit of +circumstantial evidence, and missed a trick. Then she had a new +inspiration: + +"Tom, you didn't have to undo your shirt collar where I sewed it, to +pump on your head, did you? Unbutton your jacket!" + +The trouble vanished out of Tom's face. He opened his jacket. His +shirt collar was securely sewed. + +"Bother! Well, go 'long with you. I'd made sure you'd played hookey +and been a-swimming. But I forgive ye, Tom. I reckon you're a kind of a +singed cat, as the saying is--better'n you look. THIS time." + +She was half sorry her sagacity had miscarried, and half glad that Tom +had stumbled into obedient conduct for once. + +But Sidney said: + +"Well, now, if I didn't think you sewed his collar with white thread, +but it's black." + +"Why, I did sew it with white! Tom!" + +But Tom did not wait for the rest. As he went out at the door he said: + +"Siddy, I'll lick you for that." + +In a safe place Tom examined two large needles which were thrust into +the lapels of his jacket, and had thread bound about them--one needle +carried white thread and the other black. He said: + +"She'd never noticed if it hadn't been for Sid. Confound it! sometimes +she sews it with white, and sometimes she sews it with black. I wish to +geeminy she'd stick to one or t'other--I can't keep the run of 'em. But +I bet you I'll lam Sid for that. I'll learn him!" + +He was not the Model Boy of the village. He knew the model boy very +well though--and loathed him. + +Within two minutes, or even less, he had forgotten all his troubles. +Not because his troubles were one whit less heavy and bitter to him +than a man's are to a man, but because a new and powerful interest bore +them down and drove them out of his mind for the time--just as men's +misfortunes are forgotten in the excitement of new enterprises. This +new interest was a valued novelty in whistling, which he had just +acquired from a negro, and he was suffering to practise it undisturbed. +It consisted in a peculiar bird-like turn, a sort of liquid warble, +produced by touching the tongue to the roof of the mouth at short +intervals in the midst of the music--the reader probably remembers how +to do it, if he has ever been a boy. Diligence and attention soon gave +him the knack of it, and he strode down the street with his mouth full +of harmony and his soul full of gratitude. He felt much as an +astronomer feels who has discovered a new planet--no doubt, as far as +strong, deep, unalloyed pleasure is concerned, the advantage was with +the boy, not the astronomer. + +The summer evenings were long. It was not dark, yet. Presently Tom +checked his whistle. A stranger was before him--a boy a shade larger +than himself. A new-comer of any age or either sex was an impressive +curiosity in the poor little shabby village of St. Petersburg. This boy +was well dressed, too--well dressed on a week-day. This was simply +astounding. His cap was a dainty thing, his close-buttoned blue cloth +roundabout was new and natty, and so were his pantaloons. He had shoes +on--and it was only Friday. He even wore a necktie, a bright bit of +ribbon. He had a citified air about him that ate into Tom's vitals. The +more Tom stared at the splendid marvel, the higher he turned up his +nose at his finery and the shabbier and shabbier his own outfit seemed +to him to grow. Neither boy spoke. If one moved, the other moved--but +only sidewise, in a circle; they kept face to face and eye to eye all +the time. Finally Tom said: + +"I can lick you!" + +"I'd like to see you try it." + +"Well, I can do it." + +"No you can't, either." + +"Yes I can." + +"No you can't." + +"I can." + +"You can't." + +"Can!" + +"Can't!" + +An uncomfortable pause. Then Tom said: + +"What's your name?" + +"'Tisn't any of your business, maybe." + +"Well I 'low I'll MAKE it my business." + +"Well why don't you?" + +"If you say much, I will." + +"Much--much--MUCH. There now." + +"Oh, you think you're mighty smart, DON'T you? I could lick you with +one hand tied behind me, if I wanted to." + +"Well why don't you DO it? You SAY you can do it." + +"Well I WILL, if you fool with me." + +"Oh yes--I've seen whole families in the same fix." + +"Smarty! You think you're SOME, now, DON'T you? Oh, what a hat!" + +"You can lump that hat if you don't like it. I dare you to knock it +off--and anybody that'll take a dare will suck eggs." + +"You're a liar!" + +"You're another." + +"You're a fighting liar and dasn't take it up." + +"Aw--take a walk!" + +"Say--if you give me much more of your sass I'll take and bounce a +rock off'n your head." + +"Oh, of COURSE you will." + +"Well I WILL." + +"Well why don't you DO it then? What do you keep SAYING you will for? +Why don't you DO it? It's because you're afraid." + +"I AIN'T afraid." + +"You are." + +"I ain't." + +"You are." + +Another pause, and more eying and sidling around each other. Presently +they were shoulder to shoulder. Tom said: + +"Get away from here!" + +"Go away yourself!" + +"I won't." + +"I won't either." + +So they stood, each with a foot placed at an angle as a brace, and +both shoving with might and main, and glowering at each other with +hate. But neither could get an advantage. After struggling till both +were hot and flushed, each relaxed his strain with watchful caution, +and Tom said: + +"You're a coward and a pup. I'll tell my big brother on you, and he +can thrash you with his little finger, and I'll make him do it, too." + +"What do I care for your big brother? I've got a brother that's bigger +than he is--and what's more, he can throw him over that fence, too." +[Both brothers were imaginary.] + +"That's a lie." + +"YOUR saying so don't make it so." + +Tom drew a line in the dust with his big toe, and said: + +"I dare you to step over that, and I'll lick you till you can't stand +up. Anybody that'll take a dare will steal sheep." + +The new boy stepped over promptly, and said: + +"Now you said you'd do it, now let's see you do it." + +"Don't you crowd me now; you better look out." + +"Well, you SAID you'd do it--why don't you do it?" + +"By jingo! for two cents I WILL do it." + +The new boy took two broad coppers out of his pocket and held them out +with derision. Tom struck them to the ground. In an instant both boys +were rolling and tumbling in the dirt, gripped together like cats; and +for the space of a minute they tugged and tore at each other's hair and +clothes, punched and scratched each other's nose, and covered +themselves with dust and glory. Presently the confusion took form, and +through the fog of battle Tom appeared, seated astride the new boy, and +pounding him with his fists. "Holler 'nuff!" said he. + +The boy only struggled to free himself. He was crying--mainly from rage. + +"Holler 'nuff!"--and the pounding went on. + +At last the stranger got out a smothered "'Nuff!" and Tom let him up +and said: + +"Now that'll learn you. Better look out who you're fooling with next +time." + +The new boy went off brushing the dust from his clothes, sobbing, +snuffling, and occasionally looking back and shaking his head and +threatening what he would do to Tom the "next time he caught him out." +To which Tom responded with jeers, and started off in high feather, and +as soon as his back was turned the new boy snatched up a stone, threw +it and hit him between the shoulders and then turned tail and ran like +an antelope. Tom chased the traitor home, and thus found out where he +lived. He then held a position at the gate for some time, daring the +enemy to come outside, but the enemy only made faces at him through the +window and declined. At last the enemy's mother appeared, and called +Tom a bad, vicious, vulgar child, and ordered him away. So he went +away; but he said he "'lowed" to "lay" for that boy. + +He got home pretty late that night, and when he climbed cautiously in +at the window, he uncovered an ambuscade, in the person of his aunt; +and when she saw the state his clothes were in her resolution to turn +his Saturday holiday into captivity at hard labor became adamantine in +its firmness. diff --git a/vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt.rawsnappy b/vendor/src/github.com/golang/snappy/testdata/Mark.Twain-Tom.Sawyer.txt.rawsnappy new file mode 100644 index 0000000000000000000000000000000000000000..9c56d985888e48a9967e187523f0e3326330aeca GIT binary patch literal 9871 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 0 { + v.Add("offset", strconv.Itoa(config.Offset)) + } + if config.Limit > 0 { + v.Add("limit", strconv.Itoa(config.Limit)) + } + if config.Timeout > 0 { + v.Add("timeout", strconv.Itoa(config.Timeout)) + } + + resp, err := bot.MakeRequest("getUpdates", v) + if err != nil { + return []Update{}, err + } + + var updates []Update + json.Unmarshal(resp.Result, &updates) + + bot.debugLog("getUpdates", v, updates) + + return updates, nil +} + +// RemoveWebhook unsets the webhook. +func (bot *BotAPI) RemoveWebhook() (APIResponse, error) { + return bot.MakeRequest("setWebhook", url.Values{}) +} + +// SetWebhook sets a webhook. +// +// If this is set, GetUpdates will not get any data! +// +// If you do not have a legitmate TLS certificate, you need to include +// your self signed certificate with the config. +func (bot *BotAPI) SetWebhook(config WebhookConfig) (APIResponse, error) { + if config.Certificate == nil { + v := url.Values{} + v.Add("url", config.URL.String()) + + return bot.MakeRequest("setWebhook", v) + } + + params := make(map[string]string) + params["url"] = config.URL.String() + + resp, err := bot.UploadFile("setWebhook", params, "certificate", config.Certificate) + if err != nil { + return APIResponse{}, err + } + + var apiResp APIResponse + json.Unmarshal(resp.Result, &apiResp) + + if bot.Debug { + log.Printf("setWebhook resp: %+v\n", apiResp) + } + + return apiResp, nil +} + +// GetUpdatesChan starts and returns a channel for getting updates. +func (bot *BotAPI) GetUpdatesChan(config UpdateConfig) (<-chan Update, error) { + updatesChan := make(chan Update, 100) + + go func() { + for { + updates, err := bot.GetUpdates(config) + if err != nil { + log.Println(err) + log.Println("Failed to get updates, retrying in 3 seconds...") + time.Sleep(time.Second * 3) + + continue + } + + for _, update := range updates { + if update.UpdateID >= config.Offset { + config.Offset = update.UpdateID + 1 + updatesChan <- update + } + } + } + }() + + return updatesChan, nil +} + +// ListenForWebhook registers a http handler for a webhook. +func (bot *BotAPI) ListenForWebhook(pattern string) <-chan Update { + updatesChan := make(chan Update, 100) + + http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { + bytes, _ := ioutil.ReadAll(r.Body) + + var update Update + json.Unmarshal(bytes, &update) + + updatesChan <- update + }) + + return updatesChan +} + +// AnswerInlineQuery sends a response to an inline query. +// +// Note that you must respond to an inline query within 30 seconds. +func (bot *BotAPI) AnswerInlineQuery(config InlineConfig) (APIResponse, error) { + v := url.Values{} + + v.Add("inline_query_id", config.InlineQueryID) + v.Add("cache_time", strconv.Itoa(config.CacheTime)) + v.Add("is_personal", strconv.FormatBool(config.IsPersonal)) + v.Add("next_offset", config.NextOffset) + data, err := json.Marshal(config.Results) + if err != nil { + return APIResponse{}, err + } + v.Add("results", string(data)) + v.Add("switch_pm_text", config.SwitchPMText) + v.Add("switch_pm_parameter", config.SwitchPMParameter) + + bot.debugLog("answerInlineQuery", v, nil) + + return bot.MakeRequest("answerInlineQuery", v) +} + +// AnswerCallbackQuery sends a response to an inline query callback. +func (bot *BotAPI) AnswerCallbackQuery(config CallbackConfig) (APIResponse, error) { + v := url.Values{} + + v.Add("callback_query_id", config.CallbackQueryID) + v.Add("text", config.Text) + v.Add("show_alert", strconv.FormatBool(config.ShowAlert)) + + bot.debugLog("answerCallbackQuery", v, nil) + + return bot.MakeRequest("answerCallbackQuery", v) +} + +// KickChatMember kicks a user from a chat. Note that this only will work +// in supergroups, and requires the bot to be an admin. Also note they +// will be unable to rejoin until they are unbanned. +func (bot *BotAPI) KickChatMember(config ChatMemberConfig) (APIResponse, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + v.Add("user_id", strconv.Itoa(config.UserID)) + + bot.debugLog("kickChatMember", v, nil) + + return bot.MakeRequest("kickChatMember", v) +} + +// LeaveChat makes the bot leave the chat. +func (bot *BotAPI) LeaveChat(config ChatConfig) (APIResponse, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + + bot.debugLog("leaveChat", v, nil) + + return bot.MakeRequest("leaveChat", v) +} + +// GetChat gets information about a chat. +func (bot *BotAPI) GetChat(config ChatConfig) (Chat, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + + resp, err := bot.MakeRequest("getChat", v) + if err != nil { + return Chat{}, err + } + + var chat Chat + err = json.Unmarshal(resp.Result, &chat) + + bot.debugLog("getChat", v, chat) + + return chat, err +} + +// GetChatAdministrators gets a list of administrators in the chat. +// +// If none have been appointed, only the creator will be returned. +// Bots are not shown, even if they are an administrator. +func (bot *BotAPI) GetChatAdministrators(config ChatConfig) ([]ChatMember, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + + resp, err := bot.MakeRequest("getChatAdministrators", v) + if err != nil { + return []ChatMember{}, err + } + + var members []ChatMember + err = json.Unmarshal(resp.Result, &members) + + bot.debugLog("getChatAdministrators", v, members) + + return members, err +} + +// GetChatMembersCount gets the number of users in a chat. +func (bot *BotAPI) GetChatMembersCount(config ChatConfig) (int, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + + resp, err := bot.MakeRequest("getChatMembersCount", v) + if err != nil { + return -1, err + } + + var count int + err = json.Unmarshal(resp.Result, &count) + + bot.debugLog("getChatMembersCount", v, count) + + return count, err +} + +// GetChatMember gets a specific chat member. +func (bot *BotAPI) GetChatMember(config ChatConfigWithUser) (ChatMember, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + v.Add("user_id", strconv.Itoa(config.UserID)) + + resp, err := bot.MakeRequest("getChatMember", v) + if err != nil { + return ChatMember{}, err + } + + var member ChatMember + err = json.Unmarshal(resp.Result, &member) + + bot.debugLog("getChatMember", v, member) + + return member, err +} + +// UnbanChatMember unbans a user from a chat. Note that this only will work +// in supergroups, and requires the bot to be an admin. +func (bot *BotAPI) UnbanChatMember(config ChatMemberConfig) (APIResponse, error) { + v := url.Values{} + + if config.SuperGroupUsername == "" { + v.Add("chat_id", strconv.FormatInt(config.ChatID, 10)) + } else { + v.Add("chat_id", config.SuperGroupUsername) + } + v.Add("user_id", strconv.Itoa(config.UserID)) + + bot.debugLog("unbanChatMember", v, nil) + + return bot.MakeRequest("unbanChatMember", v) +} diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/bot_test.go b/vendor/src/gopkg.in/telegram-bot-api.v4/bot_test.go new file mode 100644 index 0000000..3f84d76 --- /dev/null +++ b/vendor/src/gopkg.in/telegram-bot-api.v4/bot_test.go @@ -0,0 +1,518 @@ +package tgbotapi_test + +import ( + "github.com/go-telegram-bot-api/telegram-bot-api" + "io/ioutil" + "log" + "net/http" + "os" + "testing" +) + +const ( + TestToken = "153667468:AAHlSHlMqSt1f_uFmVRJbm5gntu2HI4WW8I" + ChatID = 76918703 + ReplyToMessageID = 35 + ExistingPhotoFileID = "AgADAgADw6cxG4zHKAkr42N7RwEN3IFShCoABHQwXEtVks4EH2wBAAEC" + ExistingDocumentFileID = "BQADAgADOQADjMcoCcioX1GrDvp3Ag" + ExistingAudioFileID = "BQADAgADRgADjMcoCdXg3lSIN49lAg" + ExistingVoiceFileID = "AwADAgADWQADjMcoCeul6r_q52IyAg" + ExistingVideoFileID = "BAADAgADZgADjMcoCav432kYe0FRAg" + ExistingStickerFileID = "BQADAgADcwADjMcoCbdl-6eB--YPAg" +) + +func getBot(t *testing.T) (*tgbotapi.BotAPI, error) { + bot, err := tgbotapi.NewBotAPI(TestToken) + + if err != nil { + t.Fail() + } + + return bot, err +} + +func TestNewBotAPI_notoken(t *testing.T) { + _, err := tgbotapi.NewBotAPI("") + + if err == nil { + t.Fail() + } +} + +func TestGetUpdates(t *testing.T) { + bot, _ := getBot(t) + + u := tgbotapi.NewUpdate(0) + + _, err := bot.GetUpdates(u) + + if err != nil { + t.Fail() + } +} + +func TestSendWithMessage(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewMessage(ChatID, "A test message from the test library in telegram-bot-api") + msg.ParseMode = "markdown" + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithMessageReply(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewMessage(ChatID, "A test message from the test library in telegram-bot-api") + msg.ReplyToMessageID = ReplyToMessageID + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithMessageForward(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewForward(ChatID, ChatID, ReplyToMessageID) + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewPhoto(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewPhotoUpload(ChatID, "tests/image.jpg") + msg.Caption = "Test" + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewPhotoWithFileBytes(t *testing.T) { + bot, _ := getBot(t) + + data, _ := ioutil.ReadFile("tests/image.jpg") + b := tgbotapi.FileBytes{Name: "image.jpg", Bytes: data} + + msg := tgbotapi.NewPhotoUpload(ChatID, b) + msg.Caption = "Test" + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewPhotoWithFileReader(t *testing.T) { + bot, _ := getBot(t) + + f, _ := os.Open("tests/image.jpg") + reader := tgbotapi.FileReader{Name: "image.jpg", Reader: f, Size: -1} + + msg := tgbotapi.NewPhotoUpload(ChatID, reader) + msg.Caption = "Test" + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewPhotoReply(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewPhotoUpload(ChatID, "tests/image.jpg") + msg.ReplyToMessageID = ReplyToMessageID + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingPhoto(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewPhotoShare(ChatID, ExistingPhotoFileID) + msg.Caption = "Test" + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewDocument(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewDocumentUpload(ChatID, "tests/image.jpg") + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingDocument(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewDocumentShare(ChatID, ExistingDocumentFileID) + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewAudio(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewAudioUpload(ChatID, "tests/audio.mp3") + msg.Title = "TEST" + msg.Duration = 10 + msg.Performer = "TEST" + msg.MimeType = "audio/mpeg" + msg.FileSize = 688 + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingAudio(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewAudioShare(ChatID, ExistingAudioFileID) + msg.Title = "TEST" + msg.Duration = 10 + msg.Performer = "TEST" + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewVoice(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewVoiceUpload(ChatID, "tests/voice.ogg") + msg.Duration = 10 + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingVoice(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewVoiceShare(ChatID, ExistingVoiceFileID) + msg.Duration = 10 + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithContact(t *testing.T) { + bot, _ := getBot(t) + + contact := tgbotapi.NewContact(ChatID, "5551234567", "Test") + + if _, err := bot.Send(contact); err != nil { + t.Fail() + } +} + +func TestSendWithLocation(t *testing.T) { + bot, _ := getBot(t) + + _, err := bot.Send(tgbotapi.NewLocation(ChatID, 40, 40)) + + if err != nil { + t.Fail() + } +} + +func TestSendWithVenue(t *testing.T) { + bot, _ := getBot(t) + + venue := tgbotapi.NewVenue(ChatID, "A Test Location", "123 Test Street", 40, 40) + + if _, err := bot.Send(venue); err != nil { + t.Fail() + } +} + +func TestSendWithNewVideo(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewVideoUpload(ChatID, "tests/video.mp4") + msg.Duration = 10 + msg.Caption = "TEST" + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingVideo(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewVideoShare(ChatID, ExistingVideoFileID) + msg.Duration = 10 + msg.Caption = "TEST" + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewSticker(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingSticker(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) + + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithNewStickerAndKeyboardHide(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") + msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} + _, err := bot.Send(msg) + + if err != nil { + t.Fail() + } +} + +func TestSendWithExistingStickerAndKeyboardHide(t *testing.T) { + bot, _ := getBot(t) + + msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) + msg.ReplyMarkup = tgbotapi.ReplyKeyboardHide{true, false} + + _, err := bot.Send(msg) + + if err != nil { + + t.Fail() + } +} + +func TestGetFile(t *testing.T) { + bot, _ := getBot(t) + + file := tgbotapi.FileConfig{ExistingPhotoFileID} + + _, err := bot.GetFile(file) + + if err != nil { + t.Fail() + } +} + +func TestSendChatConfig(t *testing.T) { + bot, _ := getBot(t) + + _, err := bot.Send(tgbotapi.NewChatAction(ChatID, tgbotapi.ChatTyping)) + + if err != nil { + t.Fail() + } +} + +func TestSendEditMessage(t *testing.T) { + bot, _ := getBot(t) + + msg, err := bot.Send(tgbotapi.NewMessage(ChatID, "Testing editing.")) + if err != nil { + t.Fail() + } + + edit := tgbotapi.EditMessageTextConfig{ + BaseEdit: tgbotapi.BaseEdit{ + ChatID: ChatID, + MessageID: msg.MessageID, + }, + Text: "Updated text.", + } + + _, err = bot.Send(edit) + if err != nil { + t.Fail() + } +} + +func TestGetUserProfilePhotos(t *testing.T) { + bot, _ := getBot(t) + + _, err := bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(ChatID)) + if err != nil { + t.Fail() + } +} + +func TestSetWebhookWithCert(t *testing.T) { + bot, _ := getBot(t) + + bot.RemoveWebhook() + + wh := tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/"+bot.Token, "tests/cert.pem") + _, err := bot.SetWebhook(wh) + if err != nil { + t.Fail() + } + + bot.RemoveWebhook() +} + +func TestSetWebhookWithoutCert(t *testing.T) { + bot, _ := getBot(t) + + bot.RemoveWebhook() + + wh := tgbotapi.NewWebhook("https://example.com/tgbotapi-test/" + bot.Token) + _, err := bot.SetWebhook(wh) + if err != nil { + t.Fail() + } + + bot.RemoveWebhook() +} + +func TestUpdatesChan(t *testing.T) { + bot, _ := getBot(t) + + var ucfg tgbotapi.UpdateConfig = tgbotapi.NewUpdate(0) + ucfg.Timeout = 60 + _, err := bot.GetUpdatesChan(ucfg) + + if err != nil { + t.Fail() + } +} + +func ExampleNewBotAPI() { + bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") + if err != nil { + log.Panic(err) + } + + bot.Debug = true + + log.Printf("Authorized on account %s", bot.Self.UserName) + + u := tgbotapi.NewUpdate(0) + u.Timeout = 60 + + updates, err := bot.GetUpdatesChan(u) + + for update := range updates { + if update.Message == nil { + continue + } + + log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) + + msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) + msg.ReplyToMessageID = update.Message.MessageID + + bot.Send(msg) + } +} + +func ExampleNewWebhook() { + bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") + if err != nil { + log.Fatal(err) + } + + bot.Debug = true + + log.Printf("Authorized on account %s", bot.Self.UserName) + + _, err = bot.SetWebhook(tgbotapi.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem")) + if err != nil { + log.Fatal(err) + } + + updates := bot.ListenForWebhook("/" + bot.Token) + go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil) + + for update := range updates { + log.Printf("%+v\n", update) + } +} + +func ExampleAnswerInlineQuery() { + bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") // create new bot + if err != nil { + log.Panic(err) + } + + log.Printf("Authorized on account %s", bot.Self.UserName) + + u := tgbotapi.NewUpdate(0) + u.Timeout = 60 + + updates, err := bot.GetUpdatesChan(u) + + for update := range updates { + if update.InlineQuery == nil { // if no inline query, ignore it + continue + } + + article := tgbotapi.NewInlineQueryResultArticle(update.InlineQuery.ID, "Echo", update.InlineQuery.Query) + article.Description = update.InlineQuery.Query + + inlineConf := tgbotapi.InlineConfig{ + InlineQueryID: update.InlineQuery.ID, + IsPersonal: true, + CacheTime: 0, + Results: []interface{}{article}, + } + + if _, err := bot.AnswerInlineQuery(inlineConf); err != nil { + log.Println(err) + } + } +} diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/configs.go b/vendor/src/gopkg.in/telegram-bot-api.v4/configs.go new file mode 100644 index 0000000..49fc0c3 --- /dev/null +++ b/vendor/src/gopkg.in/telegram-bot-api.v4/configs.go @@ -0,0 +1,691 @@ +package tgbotapi + +import ( + "encoding/json" + "io" + "net/url" + "strconv" +) + +// Telegram constants +const ( + // APIEndpoint is the endpoint for all API methods, + // with formatting for Sprintf. + APIEndpoint = "https://api.telegram.org/bot%s/%s" + // FileEndpoint is the endpoint for downloading a file from Telegram. + FileEndpoint = "https://api.telegram.org/file/bot%s/%s" +) + +// Constant values for ChatActions +const ( + ChatTyping = "typing" + ChatUploadPhoto = "upload_photo" + ChatRecordVideo = "record_video" + ChatUploadVideo = "upload_video" + ChatRecordAudio = "record_audio" + ChatUploadAudio = "upload_audio" + ChatUploadDocument = "upload_document" + ChatFindLocation = "find_location" +) + +// API errors +const ( + // ErrAPIForbidden happens when a token is bad + ErrAPIForbidden = "forbidden" +) + +// Constant values for ParseMode in MessageConfig +const ( + ModeMarkdown = "Markdown" + ModeHTML = "HTML" +) + +// Library errors +const ( + // ErrBadFileType happens when you pass an unknown type + ErrBadFileType = "bad file type" + ErrBadURL = "bad or empty url" +) + +// Chattable is any config type that can be sent. +type Chattable interface { + values() (url.Values, error) + method() string +} + +// Fileable is any config type that can be sent that includes a file. +type Fileable interface { + Chattable + params() (map[string]string, error) + name() string + getFile() interface{} + useExistingFile() bool +} + +// BaseChat is base type for all chat config types. +type BaseChat struct { + ChatID int64 // required + ChannelUsername string + ReplyToMessageID int + ReplyMarkup interface{} + DisableNotification bool +} + +// values returns url.Values representation of BaseChat +func (chat *BaseChat) values() (url.Values, error) { + v := url.Values{} + if chat.ChannelUsername != "" { + v.Add("chat_id", chat.ChannelUsername) + } else { + v.Add("chat_id", strconv.FormatInt(chat.ChatID, 10)) + } + + if chat.ReplyToMessageID != 0 { + v.Add("reply_to_message_id", strconv.Itoa(chat.ReplyToMessageID)) + } + + if chat.ReplyMarkup != nil { + data, err := json.Marshal(chat.ReplyMarkup) + if err != nil { + return v, err + } + + v.Add("reply_markup", string(data)) + } + + v.Add("disable_notification", strconv.FormatBool(chat.DisableNotification)) + + return v, nil +} + +// BaseFile is a base type for all file config types. +type BaseFile struct { + BaseChat + File interface{} + FileID string + UseExisting bool + MimeType string + FileSize int +} + +// params returns a map[string]string representation of BaseFile. +func (file BaseFile) params() (map[string]string, error) { + params := make(map[string]string) + + if file.ChannelUsername != "" { + params["chat_id"] = file.ChannelUsername + } else { + params["chat_id"] = strconv.FormatInt(file.ChatID, 10) + } + + if file.ReplyToMessageID != 0 { + params["reply_to_message_id"] = strconv.Itoa(file.ReplyToMessageID) + } + + if file.ReplyMarkup != nil { + data, err := json.Marshal(file.ReplyMarkup) + if err != nil { + return params, err + } + + params["reply_markup"] = string(data) + } + + if file.MimeType != "" { + params["mime_type"] = file.MimeType + } + + if file.FileSize > 0 { + params["file_size"] = strconv.Itoa(file.FileSize) + } + + params["disable_notification"] = strconv.FormatBool(file.DisableNotification) + + return params, nil +} + +// getFile returns the file. +func (file BaseFile) getFile() interface{} { + return file.File +} + +// useExistingFile returns if the BaseFile has already been uploaded. +func (file BaseFile) useExistingFile() bool { + return file.UseExisting +} + +// BaseEdit is base type of all chat edits. +type BaseEdit struct { + ChatID int64 + ChannelUsername string + MessageID int + InlineMessageID string + ReplyMarkup *InlineKeyboardMarkup +} + +func (edit BaseEdit) values() (url.Values, error) { + v := url.Values{} + + if edit.ChannelUsername != "" { + v.Add("chat_id", edit.ChannelUsername) + } else { + v.Add("chat_id", strconv.FormatInt(edit.ChatID, 10)) + } + v.Add("message_id", strconv.Itoa(edit.MessageID)) + v.Add("inline_message_id", edit.InlineMessageID) + + if edit.ReplyMarkup != nil { + data, err := json.Marshal(edit.ReplyMarkup) + if err != nil { + return v, err + } + v.Add("reply_markup", string(data)) + } + + return v, nil +} + +// MessageConfig contains information about a SendMessage request. +type MessageConfig struct { + BaseChat + Text string + ParseMode string + DisableWebPagePreview bool +} + +// values returns a url.Values representation of MessageConfig. +func (config MessageConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + v.Add("text", config.Text) + v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview)) + if config.ParseMode != "" { + v.Add("parse_mode", config.ParseMode) + } + + return v, nil +} + +// method returns Telegram API method name for sending Message. +func (config MessageConfig) method() string { + return "sendMessage" +} + +// ForwardConfig contains information about a ForwardMessage request. +type ForwardConfig struct { + BaseChat + FromChatID int64 // required + FromChannelUsername string + MessageID int // required +} + +// values returns a url.Values representation of ForwardConfig. +func (config ForwardConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + v.Add("from_chat_id", strconv.FormatInt(config.FromChatID, 10)) + v.Add("message_id", strconv.Itoa(config.MessageID)) + return v, nil +} + +// method returns Telegram API method name for sending Forward. +func (config ForwardConfig) method() string { + return "forwardMessage" +} + +// PhotoConfig contains information about a SendPhoto request. +type PhotoConfig struct { + BaseFile + Caption string +} + +// Params returns a map[string]string representation of PhotoConfig. +func (config PhotoConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + if config.Caption != "" { + params["caption"] = config.Caption + } + + return params, nil +} + +// Values returns a url.Values representation of PhotoConfig. +func (config PhotoConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + if config.Caption != "" { + v.Add("caption", config.Caption) + } + return v, nil +} + +// name returns the field name for the Photo. +func (config PhotoConfig) name() string { + return "photo" +} + +// method returns Telegram API method name for sending Photo. +func (config PhotoConfig) method() string { + return "sendPhoto" +} + +// AudioConfig contains information about a SendAudio request. +type AudioConfig struct { + BaseFile + Duration int + Performer string + Title string +} + +// values returns a url.Values representation of AudioConfig. +func (config AudioConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + if config.Duration != 0 { + v.Add("duration", strconv.Itoa(config.Duration)) + } + + if config.Performer != "" { + v.Add("performer", config.Performer) + } + if config.Title != "" { + v.Add("title", config.Title) + } + + return v, nil +} + +// params returns a map[string]string representation of AudioConfig. +func (config AudioConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + if config.Duration != 0 { + params["duration"] = strconv.Itoa(config.Duration) + } + + if config.Performer != "" { + params["performer"] = config.Performer + } + if config.Title != "" { + params["title"] = config.Title + } + + return params, nil +} + +// name returns the field name for the Audio. +func (config AudioConfig) name() string { + return "audio" +} + +// method returns Telegram API method name for sending Audio. +func (config AudioConfig) method() string { + return "sendAudio" +} + +// DocumentConfig contains information about a SendDocument request. +type DocumentConfig struct { + BaseFile +} + +// values returns a url.Values representation of DocumentConfig. +func (config DocumentConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + + return v, nil +} + +// params returns a map[string]string representation of DocumentConfig. +func (config DocumentConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + return params, nil +} + +// name returns the field name for the Document. +func (config DocumentConfig) name() string { + return "document" +} + +// method returns Telegram API method name for sending Document. +func (config DocumentConfig) method() string { + return "sendDocument" +} + +// StickerConfig contains information about a SendSticker request. +type StickerConfig struct { + BaseFile +} + +// values returns a url.Values representation of StickerConfig. +func (config StickerConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + + return v, nil +} + +// params returns a map[string]string representation of StickerConfig. +func (config StickerConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + return params, nil +} + +// name returns the field name for the Sticker. +func (config StickerConfig) name() string { + return "sticker" +} + +// method returns Telegram API method name for sending Sticker. +func (config StickerConfig) method() string { + return "sendSticker" +} + +// VideoConfig contains information about a SendVideo request. +type VideoConfig struct { + BaseFile + Duration int + Caption string +} + +// values returns a url.Values representation of VideoConfig. +func (config VideoConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + if config.Duration != 0 { + v.Add("duration", strconv.Itoa(config.Duration)) + } + if config.Caption != "" { + v.Add("caption", config.Caption) + } + + return v, nil +} + +// params returns a map[string]string representation of VideoConfig. +func (config VideoConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + return params, nil +} + +// name returns the field name for the Video. +func (config VideoConfig) name() string { + return "video" +} + +// method returns Telegram API method name for sending Video. +func (config VideoConfig) method() string { + return "sendVideo" +} + +// VoiceConfig contains information about a SendVoice request. +type VoiceConfig struct { + BaseFile + Duration int +} + +// values returns a url.Values representation of VoiceConfig. +func (config VoiceConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add(config.name(), config.FileID) + if config.Duration != 0 { + v.Add("duration", strconv.Itoa(config.Duration)) + } + + return v, nil +} + +// params returns a map[string]string representation of VoiceConfig. +func (config VoiceConfig) params() (map[string]string, error) { + params, _ := config.BaseFile.params() + + if config.Duration != 0 { + params["duration"] = strconv.Itoa(config.Duration) + } + + return params, nil +} + +// name returns the field name for the Voice. +func (config VoiceConfig) name() string { + return "voice" +} + +// method returns Telegram API method name for sending Voice. +func (config VoiceConfig) method() string { + return "sendVoice" +} + +// LocationConfig contains information about a SendLocation request. +type LocationConfig struct { + BaseChat + Latitude float64 // required + Longitude float64 // required +} + +// values returns a url.Values representation of LocationConfig. +func (config LocationConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64)) + v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64)) + + return v, nil +} + +// method returns Telegram API method name for sending Location. +func (config LocationConfig) method() string { + return "sendLocation" +} + +// VenueConfig contains information about a SendVenue request. +type VenueConfig struct { + BaseChat + Latitude float64 // required + Longitude float64 // required + Title string // required + Address string // required + FoursquareID string +} + +func (config VenueConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add("latitude", strconv.FormatFloat(config.Latitude, 'f', 6, 64)) + v.Add("longitude", strconv.FormatFloat(config.Longitude, 'f', 6, 64)) + v.Add("title", config.Title) + v.Add("address", config.Address) + if config.FoursquareID != "" { + v.Add("foursquare_id", config.FoursquareID) + } + + return v, nil +} + +func (config VenueConfig) method() string { + return "sendVenue" +} + +// ContactConfig allows you to send a contact. +type ContactConfig struct { + BaseChat + PhoneNumber string + FirstName string + LastName string +} + +func (config ContactConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + + v.Add("phone_number", config.PhoneNumber) + v.Add("first_name", config.FirstName) + v.Add("last_name", config.LastName) + + return v, nil +} + +func (config ContactConfig) method() string { + return "sendContact" +} + +// ChatActionConfig contains information about a SendChatAction request. +type ChatActionConfig struct { + BaseChat + Action string // required +} + +// values returns a url.Values representation of ChatActionConfig. +func (config ChatActionConfig) values() (url.Values, error) { + v, _ := config.BaseChat.values() + v.Add("action", config.Action) + return v, nil +} + +// method returns Telegram API method name for sending ChatAction. +func (config ChatActionConfig) method() string { + return "sendChatAction" +} + +// EditMessageTextConfig allows you to modify the text in a message. +type EditMessageTextConfig struct { + BaseEdit + Text string + ParseMode string + DisableWebPagePreview bool +} + +func (config EditMessageTextConfig) values() (url.Values, error) { + v, _ := config.BaseEdit.values() + + v.Add("text", config.Text) + v.Add("parse_mode", config.ParseMode) + v.Add("disable_web_page_preview", strconv.FormatBool(config.DisableWebPagePreview)) + + return v, nil +} + +func (config EditMessageTextConfig) method() string { + return "editMessageText" +} + +// EditMessageCaptionConfig allows you to modify the caption of a message. +type EditMessageCaptionConfig struct { + BaseEdit + Caption string +} + +func (config EditMessageCaptionConfig) values() (url.Values, error) { + v, _ := config.BaseEdit.values() + + v.Add("caption", config.Caption) + + return v, nil +} + +func (config EditMessageCaptionConfig) method() string { + return "editMessageCaption" +} + +// EditMessageReplyMarkupConfig allows you to modify the reply markup +// of a message. +type EditMessageReplyMarkupConfig struct { + BaseEdit +} + +func (config EditMessageReplyMarkupConfig) values() (url.Values, error) { + return config.BaseEdit.values() +} + +func (config EditMessageReplyMarkupConfig) method() string { + return "editMessageReplyMarkup" +} + +// UserProfilePhotosConfig contains information about a +// GetUserProfilePhotos request. +type UserProfilePhotosConfig struct { + UserID int + Offset int + Limit int +} + +// FileConfig has information about a file hosted on Telegram. +type FileConfig struct { + FileID string +} + +// UpdateConfig contains information about a GetUpdates request. +type UpdateConfig struct { + Offset int + Limit int + Timeout int +} + +// WebhookConfig contains information about a SetWebhook request. +type WebhookConfig struct { + URL *url.URL + Certificate interface{} +} + +// FileBytes contains information about a set of bytes to upload +// as a File. +type FileBytes struct { + Name string + Bytes []byte +} + +// FileReader contains information about a reader to upload as a File. +// If Size is -1, it will read the entire Reader into memory to +// calculate a Size. +type FileReader struct { + Name string + Reader io.Reader + Size int64 +} + +// InlineConfig contains information on making an InlineQuery response. +type InlineConfig struct { + InlineQueryID string `json:"inline_query_id"` + Results []interface{} `json:"results"` + CacheTime int `json:"cache_time"` + IsPersonal bool `json:"is_personal"` + NextOffset string `json:"next_offset"` + SwitchPMText string `json:"switch_pm_text"` + SwitchPMParameter string `json:"switch_pm_parameter"` +} + +// CallbackConfig contains information on making a CallbackQuery response. +type CallbackConfig struct { + CallbackQueryID string `json:"callback_query_id"` + Text string `json:"text"` + ShowAlert bool `json:"show_alert"` +} + +// ChatMemberConfig contains information about a user in a chat for use +// with administrative functions such as kicking or unbanning a user. +type ChatMemberConfig struct { + ChatID int64 + SuperGroupUsername string + UserID int +} + +// ChatConfig contains information about getting information on a chat. +type ChatConfig struct { + ChatID int64 + SuperGroupUsername string +} + +// ChatConfigWithUser contains information about getting information on +// a specific user within a chat. +type ChatConfigWithUser struct { + ChatID int64 + SuperGroupUsername string + UserID int +} diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/helpers.go b/vendor/src/gopkg.in/telegram-bot-api.v4/helpers.go new file mode 100644 index 0000000..7240831 --- /dev/null +++ b/vendor/src/gopkg.in/telegram-bot-api.v4/helpers.go @@ -0,0 +1,562 @@ +package tgbotapi + +import ( + "net/url" +) + +// NewMessage creates a new Message. +// +// chatID is where to send it, text is the message text. +func NewMessage(chatID int64, text string) MessageConfig { + return MessageConfig{ + BaseChat: BaseChat{ + ChatID: chatID, + ReplyToMessageID: 0, + }, + Text: text, + DisableWebPagePreview: false, + } +} + +// NewMessageToChannel creates a new Message that is sent to a channel +// by username. +// username is the username of the channel, text is the message text. +func NewMessageToChannel(username string, text string) MessageConfig { + return MessageConfig{ + BaseChat: BaseChat{ + ChannelUsername: username, + }, + Text: text, + } +} + +// NewForward creates a new forward. +// +// chatID is where to send it, fromChatID is the source chat, +// and messageID is the ID of the original message. +func NewForward(chatID int64, fromChatID int64, messageID int) ForwardConfig { + return ForwardConfig{ + BaseChat: BaseChat{ChatID: chatID}, + FromChatID: fromChatID, + MessageID: messageID, + } +} + +// NewPhotoUpload creates a new photo uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +// +// Note that you must send animated GIFs as a document. +func NewPhotoUpload(chatID int64, file interface{}) PhotoConfig { + return PhotoConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewPhotoShare shares an existing photo. +// You may use this to reshare an existing photo without reuploading it. +// +// chatID is where to send it, fileID is the ID of the file +// already uploaded. +func NewPhotoShare(chatID int64, fileID string) PhotoConfig { + return PhotoConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewAudioUpload creates a new audio uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +func NewAudioUpload(chatID int64, file interface{}) AudioConfig { + return AudioConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewAudioShare shares an existing audio file. +// You may use this to reshare an existing audio file without +// reuploading it. +// +// chatID is where to send it, fileID is the ID of the audio +// already uploaded. +func NewAudioShare(chatID int64, fileID string) AudioConfig { + return AudioConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewDocumentUpload creates a new document uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +func NewDocumentUpload(chatID int64, file interface{}) DocumentConfig { + return DocumentConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewDocumentShare shares an existing document. +// You may use this to reshare an existing document without +// reuploading it. +// +// chatID is where to send it, fileID is the ID of the document +// already uploaded. +func NewDocumentShare(chatID int64, fileID string) DocumentConfig { + return DocumentConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewStickerUpload creates a new sticker uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +func NewStickerUpload(chatID int64, file interface{}) StickerConfig { + return StickerConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewStickerShare shares an existing sticker. +// You may use this to reshare an existing sticker without +// reuploading it. +// +// chatID is where to send it, fileID is the ID of the sticker +// already uploaded. +func NewStickerShare(chatID int64, fileID string) StickerConfig { + return StickerConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewVideoUpload creates a new video uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +func NewVideoUpload(chatID int64, file interface{}) VideoConfig { + return VideoConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewVideoShare shares an existing video. +// You may use this to reshare an existing video without reuploading it. +// +// chatID is where to send it, fileID is the ID of the video +// already uploaded. +func NewVideoShare(chatID int64, fileID string) VideoConfig { + return VideoConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewVoiceUpload creates a new voice uploader. +// +// chatID is where to send it, file is a string path to the file, +// FileReader, or FileBytes. +func NewVoiceUpload(chatID int64, file interface{}) VoiceConfig { + return VoiceConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + File: file, + UseExisting: false, + }, + } +} + +// NewVoiceShare shares an existing voice. +// You may use this to reshare an existing voice without reuploading it. +// +// chatID is where to send it, fileID is the ID of the video +// already uploaded. +func NewVoiceShare(chatID int64, fileID string) VoiceConfig { + return VoiceConfig{ + BaseFile: BaseFile{ + BaseChat: BaseChat{ChatID: chatID}, + FileID: fileID, + UseExisting: true, + }, + } +} + +// NewContact allows you to send a shared contact. +func NewContact(chatID int64, phoneNumber, firstName string) ContactConfig { + return ContactConfig{ + BaseChat: BaseChat{ + ChatID: chatID, + }, + PhoneNumber: phoneNumber, + FirstName: firstName, + } +} + +// NewLocation shares your location. +// +// chatID is where to send it, latitude and longitude are coordinates. +func NewLocation(chatID int64, latitude float64, longitude float64) LocationConfig { + return LocationConfig{ + BaseChat: BaseChat{ + ChatID: chatID, + }, + Latitude: latitude, + Longitude: longitude, + } +} + +// NewVenue allows you to send a venue and its location. +func NewVenue(chatID int64, title, address string, latitude, longitude float64) VenueConfig { + return VenueConfig{ + BaseChat: BaseChat{ + ChatID: chatID, + }, + Title: title, + Address: address, + Latitude: latitude, + Longitude: longitude, + } +} + +// NewChatAction sets a chat action. +// Actions last for 5 seconds, or until your next action. +// +// chatID is where to send it, action should be set via Chat constants. +func NewChatAction(chatID int64, action string) ChatActionConfig { + return ChatActionConfig{ + BaseChat: BaseChat{ChatID: chatID}, + Action: action, + } +} + +// NewUserProfilePhotos gets user profile photos. +// +// userID is the ID of the user you wish to get profile photos from. +func NewUserProfilePhotos(userID int) UserProfilePhotosConfig { + return UserProfilePhotosConfig{ + UserID: userID, + Offset: 0, + Limit: 0, + } +} + +// NewUpdate gets updates since the last Offset. +// +// offset is the last Update ID to include. +// You likely want to set this to the last Update ID plus 1. +func NewUpdate(offset int) UpdateConfig { + return UpdateConfig{ + Offset: offset, + Limit: 0, + Timeout: 0, + } +} + +// NewWebhook creates a new webhook. +// +// link is the url parsable link you wish to get the updates. +func NewWebhook(link string) WebhookConfig { + u, _ := url.Parse(link) + + return WebhookConfig{ + URL: u, + } +} + +// NewWebhookWithCert creates a new webhook with a certificate. +// +// link is the url you wish to get webhooks, +// file contains a string to a file, FileReader, or FileBytes. +func NewWebhookWithCert(link string, file interface{}) WebhookConfig { + u, _ := url.Parse(link) + + return WebhookConfig{ + URL: u, + Certificate: file, + } +} + +// NewInlineQueryResultArticle creates a new inline query article. +func NewInlineQueryResultArticle(id, title, messageText string) InlineQueryResultArticle { + return InlineQueryResultArticle{ + Type: "article", + ID: id, + Title: title, + InputMessageContent: InputTextMessageContent{ + Text: messageText, + }, + } +} + +// NewInlineQueryResultGIF creates a new inline query GIF. +func NewInlineQueryResultGIF(id, url string) InlineQueryResultGIF { + return InlineQueryResultGIF{ + Type: "gif", + ID: id, + URL: url, + } +} + +// NewInlineQueryResultMPEG4GIF creates a new inline query MPEG4 GIF. +func NewInlineQueryResultMPEG4GIF(id, url string) InlineQueryResultMPEG4GIF { + return InlineQueryResultMPEG4GIF{ + Type: "mpeg4_gif", + ID: id, + URL: url, + } +} + +// NewInlineQueryResultPhoto creates a new inline query photo. +func NewInlineQueryResultPhoto(id, url string) InlineQueryResultPhoto { + return InlineQueryResultPhoto{ + Type: "photo", + ID: id, + URL: url, + } +} + +// NewInlineQueryResultVideo creates a new inline query video. +func NewInlineQueryResultVideo(id, url string) InlineQueryResultVideo { + return InlineQueryResultVideo{ + Type: "video", + ID: id, + URL: url, + } +} + +// NewInlineQueryResultAudio creates a new inline query audio. +func NewInlineQueryResultAudio(id, url, title string) InlineQueryResultAudio { + return InlineQueryResultAudio{ + Type: "audio", + ID: id, + URL: url, + Title: title, + } +} + +// NewInlineQueryResultVoice creates a new inline query voice. +func NewInlineQueryResultVoice(id, url, title string) InlineQueryResultVoice { + return InlineQueryResultVoice{ + Type: "voice", + ID: id, + URL: url, + Title: title, + } +} + +// NewInlineQueryResultDocument creates a new inline query document. +func NewInlineQueryResultDocument(id, url, title, mimeType string) InlineQueryResultDocument { + return InlineQueryResultDocument{ + Type: "document", + ID: id, + URL: url, + Title: title, + MimeType: mimeType, + } +} + +// NewInlineQueryResultLocation creates a new inline query location. +func NewInlineQueryResultLocation(id, title string, latitude, longitude float64) InlineQueryResultLocation { + return InlineQueryResultLocation{ + Type: "location", + ID: id, + Title: title, + Latitude: latitude, + Longitude: longitude, + } +} + +// NewEditMessageText allows you to edit the text of a message. +func NewEditMessageText(chatID int64, messageID int, text string) EditMessageTextConfig { + return EditMessageTextConfig{ + BaseEdit: BaseEdit{ + ChatID: chatID, + MessageID: messageID, + }, + Text: text, + } +} + +// NewEditMessageCaption allows you to edit the caption of a message. +func NewEditMessageCaption(chatID int64, messageID int, caption string) EditMessageCaptionConfig { + return EditMessageCaptionConfig{ + BaseEdit: BaseEdit{ + ChatID: chatID, + MessageID: messageID, + }, + Caption: caption, + } +} + +// NewEditMessageReplyMarkup allows you to edit the inline +// keyboard markup. +func NewEditMessageReplyMarkup(chatID int64, messageID int, replyMarkup InlineKeyboardMarkup) EditMessageReplyMarkupConfig { + return EditMessageReplyMarkupConfig{ + BaseEdit: BaseEdit{ + ChatID: chatID, + MessageID: messageID, + ReplyMarkup: &replyMarkup, + }, + } +} + +// NewHideKeyboard hides the keyboard, with the option for being selective +// or hiding for everyone. +func NewHideKeyboard(selective bool) ReplyKeyboardHide { + return ReplyKeyboardHide{ + HideKeyboard: true, + Selective: selective, + } +} + +// NewKeyboardButton creates a regular keyboard button. +func NewKeyboardButton(text string) KeyboardButton { + return KeyboardButton{ + Text: text, + } +} + +// NewKeyboardButtonContact creates a keyboard button that requests +// user contact information upon click. +func NewKeyboardButtonContact(text string) KeyboardButton { + return KeyboardButton{ + Text: text, + RequestContact: true, + } +} + +// NewKeyboardButtonLocation creates a keyboard button that requests +// user location information upon click. +func NewKeyboardButtonLocation(text string) KeyboardButton { + return KeyboardButton{ + Text: text, + RequestLocation: true, + } +} + +// NewKeyboardButtonRow creates a row of keyboard buttons. +func NewKeyboardButtonRow(buttons ...KeyboardButton) []KeyboardButton { + var row []KeyboardButton + + row = append(row, buttons...) + + return row +} + +// NewReplyKeyboard creates a new regular keyboard with sane defaults. +func NewReplyKeyboard(rows ...[]KeyboardButton) ReplyKeyboardMarkup { + var keyboard [][]KeyboardButton + + keyboard = append(keyboard, rows...) + + return ReplyKeyboardMarkup{ + ResizeKeyboard: true, + Keyboard: keyboard, + } +} + +// NewInlineKeyboardButtonData creates an inline keyboard button with text +// and data for a callback. +func NewInlineKeyboardButtonData(text, data string) InlineKeyboardButton { + return InlineKeyboardButton{ + Text: text, + CallbackData: &data, + } +} + +// NewInlineKeyboardButtonURL creates an inline keyboard button with text +// which goes to a URL. +func NewInlineKeyboardButtonURL(text, url string) InlineKeyboardButton { + return InlineKeyboardButton{ + Text: text, + URL: &url, + } +} + +// NewInlineKeyboardButtonSwitch creates an inline keyboard button with +// text which allows the user to switch to a chat or return to a chat. +func NewInlineKeyboardButtonSwitch(text, sw string) InlineKeyboardButton { + return InlineKeyboardButton{ + Text: text, + SwitchInlineQuery: &sw, + } +} + +// NewInlineKeyboardRow creates an inline keyboard row with buttons. +func NewInlineKeyboardRow(buttons ...InlineKeyboardButton) []InlineKeyboardButton { + var row []InlineKeyboardButton + + row = append(row, buttons...) + + return row +} + +// NewInlineKeyboardMarkup creates a new inline keyboard. +func NewInlineKeyboardMarkup(rows ...[]InlineKeyboardButton) InlineKeyboardMarkup { + var keyboard [][]InlineKeyboardButton + + keyboard = append(keyboard, rows...) + + return InlineKeyboardMarkup{ + InlineKeyboard: keyboard, + } +} + +// NewCallback creates a new callback message. +func NewCallback(id, text string) CallbackConfig { + return CallbackConfig{ + CallbackQueryID: id, + Text: text, + ShowAlert: false, + } +} + +// NewCallbackWithAlert creates a new callback message that alerts +// the user. +func NewCallbackWithAlert(id, text string) CallbackConfig { + return CallbackConfig{ + CallbackQueryID: id, + Text: text, + ShowAlert: true, + } +} diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/helpers_test.go b/vendor/src/gopkg.in/telegram-bot-api.v4/helpers_test.go new file mode 100644 index 0000000..64ffe1f --- /dev/null +++ b/vendor/src/gopkg.in/telegram-bot-api.v4/helpers_test.go @@ -0,0 +1,142 @@ +package tgbotapi_test + +import ( + "github.com/go-telegram-bot-api/telegram-bot-api" + "testing" +) + +func TestNewInlineQueryResultArticle(t *testing.T) { + result := tgbotapi.NewInlineQueryResultArticle("id", "title", "message") + + if result.Type != "article" || + result.ID != "id" || + result.Title != "title" || + result.InputMessageContent.(tgbotapi.InputTextMessageContent).Text != "message" { + t.Fail() + } +} + +func TestNewInlineQueryResultGIF(t *testing.T) { + result := tgbotapi.NewInlineQueryResultGIF("id", "google.com") + + if result.Type != "gif" || + result.ID != "id" || + result.URL != "google.com" { + t.Fail() + } +} + +func TestNewInlineQueryResultMPEG4GIF(t *testing.T) { + result := tgbotapi.NewInlineQueryResultMPEG4GIF("id", "google.com") + + if result.Type != "mpeg4_gif" || + result.ID != "id" || + result.URL != "google.com" { + t.Fail() + } +} + +func TestNewInlineQueryResultPhoto(t *testing.T) { + result := tgbotapi.NewInlineQueryResultPhoto("id", "google.com") + + if result.Type != "photo" || + result.ID != "id" || + result.URL != "google.com" { + t.Fail() + } +} + +func TestNewInlineQueryResultVideo(t *testing.T) { + result := tgbotapi.NewInlineQueryResultVideo("id", "google.com") + + if result.Type != "video" || + result.ID != "id" || + result.URL != "google.com" { + t.Fail() + } +} + +func TestNewInlineQueryResultAudio(t *testing.T) { + result := tgbotapi.NewInlineQueryResultAudio("id", "google.com", "title") + + if result.Type != "audio" || + result.ID != "id" || + result.URL != "google.com" || + result.Title != "title" { + t.Fail() + } +} + +func TestNewInlineQueryResultVoice(t *testing.T) { + result := tgbotapi.NewInlineQueryResultVoice("id", "google.com", "title") + + if result.Type != "voice" || + result.ID != "id" || + result.URL != "google.com" || + result.Title != "title" { + t.Fail() + } +} + +func TestNewInlineQueryResultDocument(t *testing.T) { + result := tgbotapi.NewInlineQueryResultDocument("id", "google.com", "title", "mime/type") + + if result.Type != "document" || + result.ID != "id" || + result.URL != "google.com" || + result.Title != "title" || + result.MimeType != "mime/type" { + t.Fail() + } +} + +func TestNewInlineQueryResultLocation(t *testing.T) { + result := tgbotapi.NewInlineQueryResultLocation("id", "name", 40, 50) + + if result.Type != "location" || + result.ID != "id" || + result.Title != "name" || + result.Latitude != 40 || + result.Longitude != 50 { + t.Fail() + } +} + +func TestNewEditMessageText(t *testing.T) { + edit := tgbotapi.NewEditMessageText(ChatID, ReplyToMessageID, "new text") + + if edit.Text != "new text" || + edit.BaseEdit.ChatID != ChatID || + edit.BaseEdit.MessageID != ReplyToMessageID { + t.Fail() + } +} + +func TestNewEditMessageCaption(t *testing.T) { + edit := tgbotapi.NewEditMessageCaption(ChatID, ReplyToMessageID, "new caption") + + if edit.Caption != "new caption" || + edit.BaseEdit.ChatID != ChatID || + edit.BaseEdit.MessageID != ReplyToMessageID { + t.Fail() + } +} + +func TestNewEditMessageReplyMarkup(t *testing.T) { + markup := tgbotapi.InlineKeyboardMarkup{ + InlineKeyboard: [][]tgbotapi.InlineKeyboardButton{ + []tgbotapi.InlineKeyboardButton{ + tgbotapi.InlineKeyboardButton{Text: "test"}, + }, + }, + } + + edit := tgbotapi.NewEditMessageReplyMarkup(ChatID, ReplyToMessageID, markup) + + if edit.ReplyMarkup.InlineKeyboard[0][0].Text != "test" || + edit.BaseEdit.ChatID != ChatID || + edit.BaseEdit.MessageID != ReplyToMessageID { + t.Fail() + } + +} diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/tests/audio.mp3 b/vendor/src/gopkg.in/telegram-bot-api.v4/tests/audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..06b0284b82f3a6c691c4aa8ad1e0757e4bf7df06 GIT binary patch literal 704512 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�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
  • 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%0Dkv;5RGjwn`#)*=zbX6QDAJX{ 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

    ~zGtON(&zS?z@9m|jLjXS32UJSK38FRF)qmZT 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%0A#0JN^+@ z{8SQWo`~-PPnX|xE< z6UxR-ea*mG43HQBQBd(b8SQ90XH3H7X@Ay;}$??9)BgR3T3>f`Xw|>aoHMwo1R_?nk#>1GU<# z8`LB6EtdYq>9;FR)=#O&%2OBNnDQUH5sw6k7u-0@e)`>*tbnT__3=GFNzIDg^eAra zeaG322aecplw(C#CC0_F*zBG@Rg;FG zbwV)VW}uIwTJKfKm(+IFjg;yO$URj%^AGQ1l+pul=u&2Q=d|0E*`N^O@N6?|Qiga) z1oC_4rc^kB>!E&P>)+n?a@4w-)G8%Qx5hMWDa|ou6q?+!GuIU06YZ_>73SVX(10TE z%v|2smhVn5B%xd>tDO_ud$kv=H3{g)R#0p6*!Mg zHU~#N8Cd&ddxTfvs#4XeN;PDxE%~%g;e#*THJL1 z;BsTy_1ISworzDW$W~Cm_(kY%N-3gV;8?O5&M#)67?-0b+pYMH-dLwXUtmG{{M{B_ zI$mY_7fDawQZkiaLWjD=*_G~wO1>x&P8QM>1f&5~G^)b(*xH@})XUAL=>%uS2eR<1GQymE-2i$0_A(#k5r_&Do&c7Y3SC=e z#g9yXX=>=-6D?_#eqh|8^Yeu(My%<}h>m!g&vWh6h+qsT|MzC!RZ@TRjy6vg7`{At zRZgcxhitp5=_jgG*KQqa?+#&v_`o6-4tZcH70LP|k*%F!!+TELd`!-h4*2Lg-z#g8 z%1Y(%?hEMS#bF%t6ZE2}>e`3cbf_dUma0jPF63FN4N=u&w;V_J6;KEM@R|v*Q@|d{ z8<^z)l!EtZY;!noeS~o6s`?xim+1>-N9GWurspLbuCQzZ}Io#HS1kf zD>FD*e4mIRPWcqoTLJqx%6dPWVF$X2XTMY!Nj`a3mV&Eag5X)S@3IOi zIqz-T_eeU*Q{SHaX@`I%HXw1;&rhvE%%-)S0DJ$XvF-<;6Z8tG1yfbkVuDv%?@a|{ z?i3%v`AUp&XFH+r0yGt?a2J6G|05~wf^DYdLCH1ZfB<95;6>w*bB6Ezh~EsflH;W@ z%+HmTBlb8c8NKE1wp`9gf2hO){!EH1i0IDw;R|;E05V%QAcoW=JK4NU zL}H6TqdD00lPWaeH;v*cBL@GnRo;sS7B^+)tx>zJr;(@nmsddJ_&8HQ=p$o~)jv3O z%1mqj@L%QT;gg}#8gzaOCiq9#z*S(7LmFU&?FI)LPdE;QyM@M9>2e06_ZLJ?5wSVN zXxjw;7T@}%r`Tm3_{`d>N;5W#%dc-1_t~BQp1hTBFxhs`Ee*FK655MSlkp zGe5(r$xZOb#5`_HkhdG?Xu0+@V$V+kYz8GV(Hzc_t zO6sQ5_~oJp;}swf)5{6XGo-GZGViU%=``5rA9ZY|Elp=cFj5SDM#GJTZ8$M*9;=@F z*II#}!?V-q7NFA;xBob;KCP;Eu6v!%ZtI4(o&!<4QBhBc*BCC@_5J+W)X3VtGWD%3 zo;o7`-fcx`N$E-z_<1fI8METVMUi=5&p^`i-P>1_v%_k6a-87>2E1m&4-gpFWpu_r zlT?XU8yB&V7nK^6SA#S%8K+5939#kfcvnjeZp3^ZBofta$-o_=YhqZe{L&2tMjNi( zDP6x%nPd1t)E3K}pM<)nhVE{gd{l#jT4pi%C;3wN^$z_wt@c?X$m}q{zDZMegCSmQ z8W3}ei*q-M#k^(zk$jgVrNs%o{)!2@5L3IF5%_jwztQ0a zA>`3!C!!@URcu|P$#MmiV7s8{S-%Oqr*YMF1Z$tFBaIruPx6rc8){X?o7vy4sBa@I z*@WvQY*d?;`F)7V(V5?V&D)9I{yaD>vPOXCH5~%Ir>pz9lp?Qn5NgUx#Ze{EKz;Bf zF?lUoz9|yXsz#=(uE_T@d=Z-NNXI<;fx?GRz+Dx_u++%k8XkcntBxbtq()?)K$QKXXsbn|jN`y>0@?lGYbhl32#<7xT;UJg)GpbVUc;RE<+3;M7sy>Gl1{IrV3TgbqbF;yIg35cfWSJBpkzWbkzE*$ ziq2c$AT!x!Y7r#tKUn;752Kvb3Bh>U-`e1|YGfoG{%xln>Z5PQ^ zHv;kp86E0J0Wo^3%xXa0xWtkVFVZi}-ZJ{`Z{|_;^Z!UX%YY`oHjE=(!bs`vlFzG+29c85-iQCY53qf_cAuT+oI8G3P)*W@B6mh#s2pJNZCqc?Y;^t+c{fo7b(J~B^x`pTfyGXwEqe}b}zVm#NO zN0WZ(a~z*TL26x#DGSeI%f-mWXJ(q4B^n&B_u4Jb|6Lz^K|w*l2p*C#@<0Fi)3+O7 z^a7fB3^hT2+z%oPirmC8NlMKBL_6_x&Pg(br37{^iyVLI&C}w2p|*Ir(QQyxm{ZBe zmuDt_JgsVE8WtX0u}G&~^I8sLizbNiqF()52U&QkRy(j@X6;QRKlRZJxbZ9)tGFEX z7WdGV=O=BdYh~MLXH{sbkX)4-0ewXkEN!FMXm$jAzp9_Qp;A8GAKa33mC!UdJi5- zQ=~_HdgT%$=La9?C2;fgo}l)K(9OTRtBt-b=(+GC1Kuu$*QdU!!Cu$F)6}>hoSs~9 zvNgsA6b!sdUMjl%#Yz*Tx&j*V?p55*)?M&(+3Z$|VhYI)36!`t*@9cRk(9me6y3cF zv{1Ld-qI-;rI5`!g@>~E>L+{1RL?bViHGdi?TR^+jcX&$sSS32p}53n6eYCg!aR}n z`vhM%vQA4EFk6)eH0eAB)ZflaU;UsJ4zNaC3=g3TqzeQl!*+h-1x%n5~``m+^+@WDpK&&cF z)1}jHQcsNs#<4NN2RY8z?wQw>5@5j1RsZ;E?OUS#NMitYNKD9-B1r~~SIc$FyN4!; z2MOmaIJye<3i4!E*u~w$Q}uJcdScJ&@n5R$g3}j4zd-CkPNPaOCLnj=xiJyhlpDB! z8?qE5?^VbcgSrr-sjzP9tD$e%G!eIh?rUIq?9>8?t&d`y+<1$KXPf`w>Hx(^>(0#M zhd&c~^|x|k$3BmydA}?+EfdUYLT{CDEe4C0wwS!vt%%>gw%PPl5G_j7DCPV>&|L`a zL#S$TFwzt(MlOFcRGzzZvQS~s(*Anxa08`3Nsi%mn!u5j|EW{KcD+!@HSpt@`_ZXJ zng9i}$w@T;fk>OFW{9fH@{N|7{8!FNTQ2XpC3MX;yPi zzq}U|%Wt~I*y}%{jFHyIzq;Hf4$RV>`d$#ihOU!D`P%9EvmfA~3!S?uro>K-6cva< zAz`HB9+c<)b*NvLR782RAWhj$H9Ib>k$h|Id^T%B0k5Z5mOnDZw$I8N>Z&IqFGssA zjSY1Vy?bA;5qDoSWr$ifqPWtkiNQG4h+3+dD9qB_GR`YH#5S8qg%%T2Kt}2qN<%WI zx>6&ZL(Chd?P_kGV!c`Tc!1osAm%5em90dT@**f1$L+u_fakRma+3f02ck?xB~C1j zV{Zxa1*>;_1W4e))X+W%KGaBc7+@2fj)$LM_1<#u3c{aDFrEJ`MN!F&Dj}!8ln~c! zX>Isk|7*B=bW7Z)f&s~MWdjytN}tVw7jN0^?DPHv?^&(uo{VhpRgB~b$=eLYNQ`ek zG`5RTnpi5574|((h1i<(_Z?Rp*PBf}*`zk-idZL2)=Kqc$cpB(YrCt*46nyZ&5JYi zufp@*t)%;D8j^ZIsR@lXg2LYoPq<=^rSgPg0fNlRanU;MAV7^37YtnoEXh2gZdB`^ zM2t~`D0QK%-zBs1{nNR7p84;s?>Pkyeawn_MwOB@W}6i`j~mia_MB)@WF+4k0w|`= zVD0EbdON^5%mnSx<+il+gy-s&waMt36O|~Nt02SXT5W{B636%tP0n@^qw9a(ZR;(M z7ZR#E@H#c?UE%A*Um=}NWRL2yCJF@!2{x>4c`TwkzYS@&6P5lJ9_Q2N7vDKmeH*uM zZI5qq1u$iMYWF%MnU43JJJD73+D211*%R9@5sJp8_px~4p#vbPabuw1HHY;}N1!r9 zN755XRuQ!z)n=;Clkc-Bie`y!vJ4THaS-#lEJ!30~sQ;NO4j z4&%GuEyV4#XS>d+89a-{8IMvXGJ2I)V?ew;Vf>obQx#U((TMNTG{G_Kh-po09+_Y5 zN^O_EfwR2jK9kL*s=l$VDr%o-S{{5iT&pZ)b4sTfAvg-61nez7Atv2W+tcZkPTUCB zFWQdU1jWc^YAVsCM9CQ|DtD#xlfki8z07jB<>FA|m<33@HAG4B2l#*aia&lRkTM6+ z5uQ&vg#ZIos^c&a|K~q+WAQ%%C@;vjQvP+HlKNtU7WQ+8c;N9x75O{fL7Yw<$8D47-g0m_mE2UDT-*Xbx6*J4p zTX^s<+p!88amkmwX}=a*xb`l8Ut4W*V_+kAyHZjZuPjqsH#NHIRhxa2vRTyYK$ngy zjhF_e&lMr8Le>grSRG&7fS*ef8xJI(`fpSCifb-q;Rsal0RG^k{EEp5@(V0vqozC9wIO{xL1Pr#z z(tyfKEe8_?G#px6B<^%4eE^X9zksfb01_^v4X8dZZ(u8)JrJND!L#6T5%?q|dVqic_umT#_Kf-R1}&p% zH3jl;W_&Ld%PY}Zj~zU^U%?oHi6F_#{02*#XIFJ0u^sHotEwh#bvT9#;pR+bU;wul zW?hw|A6EK!Rnj6NP8!h$v?m!$`eMmYmt-@DWnq3!itE>56&2qcrhQ|tVwp8Fsdr>C zHxkA%^g)-Yz2aq-!_6BPZPg(_T+S(M%3=c!GzKmvX*O7Snq>)IC@$hHVtD&i{hTrU z+xyHCwkR5DGbxs;ugmHRWvh`Q>o`)NBuw3^Rd?u5d~8I;6G^B_S2=U6Mkj(XO4!`E zeE6;$ud^l_&v<4m=89c|DqR&ncb2%<-i%eUU)t|u%`f=J7ABEV6g)0|;c=(MjAUeG z?W|2-!eX8e60a)!E~y^cW4eNPy_}~}z*_6iXgSb67DuPf$Uvd)_Zwu%^vYi{p2M{f zd73>u)L4GsWZ2XLg3J=IrGo4NH~<8{-NSkYZkQYNpf>0RO7O@iRseg32%Q{vlnl?7 z=6kvx^B>RT;Sc@!jVPb9>H*sYCw@R@bekRZ`uFasV?>^s5{W1}wycsxy18ex@h~?o zNizK!&m+r}E66rwa`cTT{CVoCsDdTJ^esz?+Ob`-*>uM7w4hn~*`UF(LuDF%mJh6F zeexn%sk{Di6fuX-vazUxYyw_91^j82#_(jDk6g=g>sMjrrTO)#GxWO7z^`fZDh!NU zua$b(Y%qCv;V=+n4i8sE9NpneuTV8+%5M-TA9g0QTUklyG2Gg8E3D(K^4a~*xfwj^ zgn(J4I~Qx6_M)p4-QhxjQ~Q^X9J%TY2Ncbp_O&6fSB@dY>ECqNuxoHvZN{3>;n>M-8w`N>8NQCt( zTrni!G{wvoO9yo40llcbvyNhY@0Cf=-)jyVYa?kS_&XV|5sxQ*>v+dF=Lg6_J}Qqwv1rD~WGX|eVqL%R#QzCRf#*Cp%_M?<#VU7DwT z&LkCnK;rVxT4k2RMa{i%I6}Ki#G1e0`{U*+?N+3qdEtm3TfRbdK5KrDAIvgyP;Fj* z^4rFM@=JtD2yGDTCV7;daDTpE?`Bg<+8o>T>H0HZN^!R)b|HTAVMU#P4fOhQCyk0p zw@^#KXqx&!Kes6A+s7Ib`dP@oyP|B*vf6NgyZfGJ*^R73*!0oMlI~&hTpUd!p#X>c z$o(CZL?n)#fC;yEMWZ@Mm%*<1nTVD=!{DIYJFU84b&f6l5N=LcQTsLARN)c}v;}rW zvK}j;*$N#?$#9upyYtB6<2~|T+NG%!d@I0pDu-Gwkk?SIYJRyhb$1PUc>chXl_Q+c z$#cj15+QRebEyxTj3|a!g29)kKsVM*BpOq$E-be51|q7nya&t6kc}i@l|-Ta@`_2| zXJZt8*0Qq;^vOi9^^17o@9&^0+_}TWq?;<^VXU9Cl#AUcO6yIC$&7|!dhA)M)XqqkVXRx z0(>dD6sa#>t8#NSDa; zv;%w1shVsp&zmD`)^BR>7dLk({G1ferG4Utt2=Cygw1BlGtgD=Z3%m@pS@^W{7LNUc?3#vQ2FXpD*);6}CkN&A{bckq zF9C|eX#i5&K+*@P0=VA+);2>Dt^!iT_Kih~lBqxCr{92>D4=Z==7oeibfzKv)ld<- zHYm|oKHoQy28vU7uYM_X43&DjnHi@mS;~jv2dzd8*?3f2@Qnqt-#IFKeQz8kyl~Dk z{qh+q0P?46BIn>}Mok&yn@o#`b4o#(6_&xU-dA+V3Q`i+YTU3*AYfN^CZ2T+ZklY; zZpm!-3~JxyMHivjy~o$}n1ghe;k6Jla_q;KWlGB)tHs=k!j#Nm%=Sm=(?RbCBf{fl#Sb0iC7i*yt5ay#l zqfGU=ro)bg_Y%cmPqL0-}?u%_4zhVak?j$k)A>H(T-}E@Xw+}coYp)gsA>t z+868J+;Bhqy?LuqkWuTz;2nIh80{3kz9nQtF!Gk-G=&BDtI~^046f_V55SJ<){?d9 z1l!I$a+wH%g~*(-hgg40u#qZL&fiPnYS5*vkrN&KH0BkpCp86w25|9fQMd*S4F98t zH{o{4SWQ|o86t5;*4(Z)OpdBR8~zzrmBkGc7s>ntrSA^rg#PQ z*Ad|$Cjl;MFqst#i>ApwiW{at1gWZN3Zt53utQ_U-#h8xwTXfKiJVOcM<6Shg$72j z(DKSfypXB^VJ0i&wb9coMOM)#&mdRGUV_J|(txtOb@cZwboE@2%qR22y=o;=F4jR50QljBEc(j z0rfv%>g6z|^wOqfJpatj#A6EYZpf+}W!zs_;=m1w!y7&^DmwE~qKZd8>HC%$hgvcmC$Z4FNA)!fBD5~Sb? z^h;T9sONe2aJOLzCi(Naf)%?AsjH88?KCIyx#~83Ela>X>|5yBj(f_J0&MWR zy=ZTja>=Gx_k%kpf)l;SvHE3r<`0koVYzJP1?&g*E#Re#=$TE?An~#(bQAoX1Uh4w zoRUAnukf>uxItyF76>BCxwWM+!QTp=mT)uctRQZy@jo?{JjMGT^*hhTwL296@A1_srEVIiMQn2{T z;&qy*DC^T~1M0I&Upf21^ZnSPV%JK;`euEdZTN}*e2+m}`KVva!*M1m2qQhLykw!)q6)(`*r!e<%Gc1(HhHlMT`b5y|S4gjJnsL zMwiXwF>1`WzQSa%!;Wi4n8q$($vD9Y=)UgM{WA`Y%}9=Pz^ zW9x5iz^{-Lv1-Y^>~bGKmB3;9<-w{B6d!;_ z5{;hPcST2^=Uu$cYQfDKE=uZfa`gCUNQ5|G3QEmOE!PrTT12l|alDBnYIz+;7v-O& znA!;D!|*0=&(MU5N5Ogd--i|@b*T(%x{*H5{&JE8-Tk%A`!(QQNI7mz0!wdo>>9W` zw=HQaaY_8#^I)6dLRQzS*7l zH1EYJU-w3<~nJ7*(JL=;45EJCK$O zX}9nR+u0FRUsoo7;2Ad4Nq5}MPz%5fK><4!mg0nIBG&fkEcm^_*VZolC(J7qE%E1S zdu2mcQ9uOVhszx{YIGpqwUl--3XY2GR-09e&B)`V@MS%EtMnNUxW_Zp%cWsJr0|EK7Gpj^2@?Smegaehlt`9w`u5EXWMzGsSjx&*- z^I4!e^E~Q!urvva8?cLdn0}2c54nJC(9qKE`#>J~FCKfIT-J+dIA$B|*B?6<&S0Gk zsv>rcR>P@`KJEfO{?oRpO~a`u7`G);pBw`XNnQlC5ENlJ0Pq1PkUn5jNF3%iZJh%d zD|p8d9`QF5fs_ZP#iDIA-+4P{^wCkg;Cb%T84NZeiyJ8lI=laS0h8GK`R7+J>?ymy z_jgo^AwX(WGUYRSr5+iqSYlfI|09L2+O!&2&x1 z^c!3$W-howV~Q9vb?CR*ElimVs{>KSJhFoD z1XJzFb}{#4nK;pLq9uC*xnJJKQm6}Nqr-r!Zm8K8&?Ruc;{%8!Ke~^AIb#<#(tn>v z&x%}4*$}R;Qb3Es1n#4)A1l!9$rh|O5#}!j9X1b30?7gmW zw!-D!eS|afkWLlFN!YcSM?eN2%l3a&gG&jHX*m5#uq*tlglcEd9Ra7}pp$#ej0ED$bdo ztkNF)p53G{X5`+yEd~>18edaofay)<{U@&Ww36hk zVKpV;ZY?fdXvmYmrSLK-xOQE_=EoDlD=3{VpI4OLa=rwFb? zt!zRvD%07+hIePuJ-|_BLZbHX@!Wn(_~ab-Ek3pc$NTOo!#BL}4D7xP#^MbAK+=8& zjcz?^o;q{NVmmogfBUWAnWk&shL;fwa%*Xsk@)q-*xk^Ho}rfF%?<>%QMcEntm08r zO^CzvmmEn+R;ZF%|G3|WdP44PM9TM~ zA>S51c&1->y8z*FQ!}WV#nP4j!~-1yd)}@P0lv1YdIklV)N+`u&Yq-B7SPJwx(d@( z|3^z+9&{E}62Uv~+^OClNv5Q@gDmcat5AB3D*tBDYC})EW9D^w7z%pzt@pzHR(vSr zN#u@7BstcikwxsA2(2sH-rgDX)@H>Nhsk@%r4zeuELOE1mJ79rJX1^-X!sV#C28Tx zO9DtwB2CV^i)yPJ@icHL69~QNkWjgS0 zW+>|ZO4qWZKw{N;fkF@C-K${9xd!}>tEgm4^aErw0awIu!3aK%i$LG6PBow}J|#Z-h3MKB)F+Bt`T0?pKUWR~upI4P9Cs`7;CO zjnY@1R#Vg#prAP5AgMq8XTom z#>>4LGYA!K!D;S@jiQ{Cw-d~hGFjolB`ygnB;Pwnzn=kPPp8n8eQBUdsW&UP;QCp^ zG(14x=X-`Z_Lqcj<*2Crq)jh={`gCI zjq&@>=#0R{9H@vSJfF@%#mlyB)<&p!+fljA>D!DNkgbwTtFeoR`ymGH>h4wHB+uI<*3n`^>=zJb#IAXgm6xAJUq`;!3 zfS_=xsxa^Qn>F(7xYY$$wPl$x@pXyYqKf1dHxK6c4>VAEhv(1Y(%U_s+BJ&DmD+5! zxL?v95Gt@mO{GU#%N3Co5~u#nYOuz*daC`66tim(8a9=NBn1~or{CbRCv4#p(rEe3 zn{P+2#9u^60!yK3l_$&I=p{n2csDQ~Qn4K;OgH(PQ;;m(Xk#B#h=J~3F}kj#Ggy0q z$*P9&y;Y`u2ms3=qaV8S`J@oF=%|!`_a6@j@LdLKO}~Dfewc(_leC=QE`ejNSTvjg z{2T#*vOf5`4_|~%gKUH=t1UWk$26@y=PU~iIg@g*nrO_Mfe%S1V0uvYpHfs(jBQd~ zuN)y>H{QMWfVxhf%RpOfOs9K(t37JmE?P3)EqguOKCxcZXJYvN&+#x; z7;@=)njc{E_#-Su(Z3qj_HPGHJf8ltiO%fnPnj0`;76TXY8`lo<47y>gx2F;P`7Q@j22WL636IO)CPX`{1D~JjBulVty`tCc3o*A> z4kyCnAojZ~Poa|bc$%XVJ~m1@o& zrNnWSwktko6|L7lTeCD294HDn{1hC+2qS*QtTBD`is+9&b^pG|c^KM8szH1XtR?Q^@mU^Gwj+YFSSl#h%HjLS3>OM@L;uFm=!!IB*}g0fN%a2M ztog4(guYADrKiC~|oiTvo;I#1w?e5xiZ47$~Be}B{6GcZhjcJoMQY--v} zz;|`z$aXy^VzA~hsm727qM@$#>h6hh2UpcbA}(1_KUG8&;r=3JkQN+>5_;RR2|Q{= zHDu+8#fUdy4?HhRt{JD&z#RY@8e^x>9E%gnHfyop69v*WRA#_LL!Zi(A$qU{(HO-^MS<3uu|H&R({JkMMwJ9D~RwyF+R~K4$ z`32oJQ9X4scdT{AG)uDKS7slPXHuBR+Z&`MmtsCt&8(aDKRgQzUTOMJ-o+6EDW0f# zR!Z2hP|!CD(LdRb{r?<@-rx}M_6UDM);WRIG#u}uRi$9@%>B-NLul@{JMN911n$d& zY)e~h*VG#dya*}*4U4#wnjacsJphD8V%gT2%}%}lfDpyyusE}LeW&cN9(@7<1=kY zl5&>u91c zF36tuA6+gFC!N({RRY5h>8s1S8*vKwM0Y|w%;I-Ao$LNi%KF)u3#nO_Cc?L= zie==ho`FXvPBLn#l zB&nh#P;@*w?Wkaj(BI$M^m#!>wO=L{37pQ+kB**dA0tWiOcw%x-p9${-sPG-%K8Tw z{rIc@w(S~6uW~oR-*$wq$+diNIwwVr1w{l&) z5r5g`+Ckx-fRSXpF|P2)Tr-|h2MwUR4R-b~!DRD#aW~3;vkuL1URk%tBgjcMrA6fp zQ~b}*#6R7=$CLv#dA(fQB^<;4i(_LsBVFUuUwkkZ6e8AyKjPR3EkSHCIF9?V^wueU42u^&o;eYub0;f-FY9J^KEuqV`isHS;{=& zZw9)T)s!$fPM!uaup+{@= zof7vXy^*-`g|!HlNUXeR>nAwaT&*#$Y|5uA0YcF0pWG?*IiJKUcNaZWUirqBdwISH z`h}l=Xvz+=D*rl1ddYPi6D5!8e2 zc3|TucBBM4qWC?=9hL$|U~LHVFn|@c>>;^lMOjv-spZE?24=9>+X(rbVt3h=K^|c- z6gued+B5B$D`=&?wI*kr`EErk<;Uugyk7e!ZW#PxcwW79tZ%E}hLApgxO;qz<`%ds_vVE6=jRFdTt@<*;*`>GNa4V187oVhi`^xhCz3OZ1DN&e!fo zz@!nq)9Z>~OU<}SE*hh9%RlaPm3;CwH)MakZ+7bzn%D!COKg`x~{%jE~=_rgopAi@UM`YC+k% z9Y%)_9rM)>EsEbxpRm9Dp~Hq(5=*85D+MbZyS4PSyvI6E)BZ+A6vqpymqw=6I%FSx zH|IiOE3uKZ(Xm-wMDgG!;Ez8JzJul~ryfDEJ-Q?bfYTLw>spUHz24`x{|hp({!b9@ z5&Y5^w~_}xt7sP<1-fP`*~0p(`mb#NSix3JR89k0RXXG5f9#~#dw2QFhjJP04lRjy z{CilUoRe%Vag)jT9&@MT;eVX#uUvbhGbxZ6{2Zexpn(&>`Mt!!5yo{fd(4gy5%b!s zO_2ikBZB(#jM)Q3|KpQVKRZlB+Xo~iPpm~k4Z&5!rSSRA*Rq>6q_LzY7Z5p5YHQP{k zg;F~9fc|%FS&y_Hn=@OkmPD4=jpGB&z{y;bSQ4kSKt+ThX)iolsQ}HWwKwBz_L!~Q z?N>!*ZD*EM*dU&E;uim8eye4iyn5>7gi#NgcN+Y>TOTk6u!thQuDr3no>`nWW__zc z4N?xh5|Cuccg~Pf^6US4#a6kov3gw_ov#paDFu^#7{h$V4vl z#-zC5uL|;yV$AcVN z{!~9NlKA}8DgnBU{9h{c5re&`5`+5|)+O5A*7+Zxz!~l|+wNXrlF7 z;H_-lNbwOzpaxRPbLr=0z0vo>MVz(eG4P7^q*MDmDMDnDHe$pOGvD|S4{>NanYKNH z+;ATda=rso8X$fBX}?IstFs5sN-(z~VeF1b6I)#BpeUR65}`aiG$Dscu`@%&uZGKR zB*;us?~w>+(cX4ZSy1A;;m@}k!cv?a^X&fYqF+~azD}(4_WQM0>sN$wE27|mOEf2g zc@ZSddmrkr6>@6-r5>V?>xx3eAH%#pLQsNs;zkRkRN(0bVw&D^O|Ex%KQF{+v2UJ#9-Wi+4 zZ;}=~I?&;tuPssZIO@;QHRUa~I`t~Gjy0^@^^)bE@!qW5w0KUUNe6WA^lZS`DjFBl z@T8m2+GS6)?1H(ZxJ%i$quV_lI*NDHggsQEn>dMutJhlED!RehBGR zsIddm9Q=0F)Fl*65nhWkQKefNcJdj#NF+Ho85nX3g2og2mo^!+Ky;IAZGz=@p19rKoj%j@s zS!c!6$Q&a)Q4Gr2{IEU@&JVTTn!7hbwatQ?#ju&=+X-3|ol3Yc1r(d=qC4+2hie?n zSQso7k_(}(9XuY%udKLOqQp(P& zjc0Nd8Tx>Z!Ol1 zaS_2Ej<%>lOK(d>)^e}9LOWov<=>wlXepYt_OP2eXUk&JKFX*~Qn0UVkA~sgxCn{- z`{|k!|0-Rn{mYx<=cxJP5zz{s=6<>!hqkAGtrrOXz0S=|+q(6JE6Hr3#%qLlUyM+; zo(ieh@IDnDVtfi&G7BcdxBHr|uil_x0g|EbCtGx+U{UGWm^BK7{1NVf`S-wfg90Ig zWEYn5Qc-P&qi8F_2Q{Lnh~!hv6Oj5d%alc-&djXr?Ekm=B;zD2+jIgKR-`X3TOS0+ zz=(=$`QcKU=}nlDA2Ffr2K1PS)hk`)RcnTX@ZaVyi$CKaT@K2< z4*K)WI`o`Zwcdwk<5%(<)hJ%(=xBbLO$;iCzO7}gD^^v7@A}1Q5zL$rk>nIL)US18 z@P*=-vl>+lH8dh!#Q>tg+fCTLYa&#R^%iXJNFG*=u5m&@a1-~L59|7#){Frw+glQK{&)%bozFw!45)jy)$F15IE8?_Ekn`#wQx zSjw0|q&W4)AM(`8 zZvs-(cG~h~rzKT>0hKBc1*d45_p7{5b-!Dh91tf`}5!QweIPj9@l-7zc!y zlF80)`!X^S62-n+62nwMci`7#X8JOut}&pI#qY&qO*NvC9JJ89aMpRJYR8nBsvU~T zJ!|OHrW(|FH?xmQ6{=zvic0N|99KMCW-9d}=o5i`yOm>kGhD*&nROGeAe^Hr?|70F z&xr~BWD}LyJo9qWmySgr)y+m!64V;*@kl1|-*Cv1aNhfni&HoODEmB>66KsUrXvcR z@wm&otarK9>}9NH1_$9kaf@<#PG6P;>}=-8qXX>e3)RIQ0&Yl%q;8dAMkT2;-K?rm zYuM?@a#AAa?=2a8THf~PpI<~`$I*^z%;R2<7Sa>$tCYlQy?qP*F?1wG%N?>{qpLxQ zO!dkP{s)O9qMI+A$j5!SQ(Wpy;$Lo9Ae$FK`gr|X9+QL3a9Bj!mnIQR@OYOTc&~=U zbJD`T`e5UgF`%K@eM*@A?t>i;zlVQ2S*wtC-d?q|d8~YLvw3n1yD;%GU6lEt#?0zr zX9VG%2-wcA*BJN^TGbI!%@Ps_}cyLUoZ^}+DTCgF4Z>s_C-|w z*2kIrKh40Oqq7G6AEmg?<)nnB^-(HXgT^c$HIQ6zyv-M?_46h$3|8>Xut}SqgnD9O zpRVXwEMHIFY$cX>9^otV`J1R7Fo9kKiM{Uo=}LL<9S+gVaPO!e4o>PrZE_e`u1+kK z+0{;^XOC9Vt^e|OKaAT#8CKb{f1_hm)7H&#k>{Eb3FOewQ~9Q%Jy5AaxLoMi;CM6~ ze#O6GipH-4sNxrAKFGf-Qzqa{o$~#;stf@q(pQL~rRJKAd35+pXLhTWv47X0l=5e! zbu?{E<$9!r522-6RjUf9o+^=O3`j%Qw9!!(aKQrH9F&H`eNC0t+n2p`X(e&W!(xQR zw(rWG1EBLPkB^LVYTSG2vo&J^{&V>dT)W8Rqax?Mw zc>j-LP;6sRziv(E^yc&?D@-#80@GE!V}^&WgcHlP(`HoAMO)5&z{C^S9w$N{gcP1EkB~(O7lwD;kHoY*m`}FOJG8_F{k1%V6nO(N-kYt zRKJK5oLsYV_J9Z%qHS31JRD&2>f!y^T%(TDVS)ew28!STT2vx2gH!q9hL~5tDsc%B z$g^eb;PI))=^bhK2lS?MF+SB^N3D@b8c>4*Y9d#K@8m+sSN(4fI9AqTbLSe21djTH z-0A7$DQ$)`1&&8**R~GlY^dHZf?RRDt^jMBJ*Q7U4A=EhRU0TkbNlouY zbk+u#m1IniiIaX!%H2!Tx)bQgW&Df{USRN@j4(@QtO5#`J#c2U$>nwmGYu*;(fpl1 zoT5W0X$KvKjFFcSG1#<>Y8RMdi=>bAJuVUR++!zNB}iL*tDhDai)JqG(iP^}<^xTF zs@7UaK2VWV?CEkRCuj{CN?fn3O@c}j^2S^rIMZ3XZHe^CbzLQ%C7zRjVIdJ1^cfm~ zxlf<_O@rAQF-%cyacNoIc>G0B5=i3+5ESkNOtCJXD#n33?XQ^N*zeNB8q5r=jUH1J zHwGylvHvnP@DlH7pSIOuF*jbAbhfjT3==2U`frvdz5-5;}6PY0>FPtf+ir4hIFh zwf3n|nFjH?FZ)HfFazR{xr=zHwh0_Ns%S;pv0@H{9);WQr@|P03}K6%3}L{GXS&~t zR2y8)TqqZ6ijp6p2?+T`Py>D$g4w7gl2arV(B&*M1BOGN@NHV2t}?gmU~R%WO!`Mm zZ}W1Ls}-X&s$zPBK%JLn`(EfQ=xd0M(1az6a2(dr!-4MlT|vCFL;J*&MC9PG0X$Fo z$z|rs{TvhEH&qjyh z1>XmUsEVgB@tsBzy%1+h4|SUNDY0p%{J^E05#|T0GWr3YCv;UJ;6Y?zK4z(^n(Rb} zON!;={OxT2J(&UHKS9;F9VkFmf5$2O&}Cj zBMk$;kNP=9rsh!<)l!@Lwaux{^SD9037KD)0lIN{LL2fwmac*=s;+AzA=2GlGJvFj zgn)E+58d4j5+dE5(m6wS2`Ez1HFPN52ojR>9iI1_UoiKz7*ADtuy z-Zh^Z|Cs-%w=lt&`pSQDqwK2d0p;R%cD~3d89&^|0J#oMAWT&vHh7j_#eD$<;)f@+ zg#<;)Nq5f1&0VudKMh21sQd5Ww`kR{yJV`u;l{a7Cw1`CTfx15Iq~_Y{gB+p3TXls zL0WM}!VjElev!zQnRTPY+0QG~K{$^B@X&W1BNm>{|GY{;+rU?B(hMsqUg;0%MF@gTQDo{uZ|w;|@M%D| z?MQG=Lb)ZOSw%%}Kt)@?DV&F_oMPv6D|Nv(vNeD%vOF(8@ApBo)kYw*4|-?k*(7s) z(30@&8K+C9XXGvXeiM^cf+`B7TmxSviq;%E`vWo$TIy>*VHRXj8vp4GNs;`#jpozS zNtJ=tDHVm6ZIS=Q5Gv)#j{Ih7uSCjugZAbQd;)p+;^rZsY?8h+}IzyoB|$4y0!-j(aG`aMTB5 z;JFr57S{G}U3t}4E9ZHIBJr_IJSRn>3_t%-IPt_CWJDaYB+)d1o0_NO7M3a?hh@pK zenV6IWVVG6O$b&Iq)3s+UXf!M^plY^90xOf_%)0 z0hPuid)ybtjN-k|u3CUl6xTH>K$2~wvr!kUL`x4!&zuN|xivJQdIQA9{q;mbY}?g? zw!`c3ERC=IAqJJ1;AcR^gfHaXIDw`Q(mwdW5H|u8gPekAUJYG@kv*1hAuQ@R!`WwJwzjHNZ(W&TC9w?HF)ntfd1nUe!K z)M*^(jrChaBg;g^g=k}br&Nwoe2w0}^u~~zSMebAE3Hh<2mP94YXidG7XDz>?C&cEsXx#jP>cP{Sn7&ckmedi@9 zetnaxb|!BQqRDjTbZ4Q6BfzthDOO*1!A@T%1^Pu#+^q+_e}bL23OwYwX*&#( zrOk*+R%Pwl7FtG64{XX~Sr6ThjbF6SGxd!iQfeJ9KH>U$L!tQseYi0Qyf3}J04L#S z<>Rg_?1nFjPWTy68IIgIFa$qSzzi|oZU%)ZlwvhbBb-=<=<7fRS5p*CYFO|aaJ5rY zIf7D=*PPo2poJCd7V1%(lj9{4W!*n{SbWlAb63SYJd!JWKIVKr+OZ6aTQ=tk^|PkZ zLxtVhVwh49H%Z-N=53^2h#|RmFRIRukQOw4&`^ma@qp#?dxTPSsm+pi(Xn-6cfzLI zpxkX_QjS|TZ^tDny1p!}Lad=}-MaZYN}+2MVA%?>wcb^=4N!6j64C)gTpntUhFmPq z9A;kseo9658BjA}1MtAJKy^ehRao+5)nn|`YH6n1CMC1BYhg@Lg@=;!xF%5AeJCBJ z0?VXg&+?*ZaUO-w9=ZGoc!`wj#c#voO@RGGHuKnk)*R=^J+pV~%*f!Dp!qn{>wpYF z7aMc?YM7=p!Ic(Pc;MyRZHXZ>Kkn}-L_MT~@#Q=6;azTmET-x?d;spXW!*u!v2!ys zu8ngBH$radAA+mD`}f<_iQo+>%0AQ1+Gb|W$h$N8lv;V(SI|BZ!D&~Xem^fS0)(xM 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�n-6c`s_IZF%~dS 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 literal 0 HcmV?d00001 diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/tests/key.pem b/vendor/src/gopkg.in/telegram-bot-api.v4/tests/key.pem new file mode 100644 index 0000000..034b703 --- /dev/null +++ b/vendor/src/gopkg.in/telegram-bot-api.v4/tests/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCgwxIgiBjHylPw +rPU7xSR38lXKoFBhFKjR6eoTOjvb3lVE5epNS2FsRt2LQ5zNR+XgiwBamk5JGsPA +SC4lnRwn+vojEaxusJ1CvYyOCKiZi0BcopAYAYvlaWz4DNxE1XQ6zNUnOQM0VhnO +A16PKK0YlI0RAzJTyvaDI/IhY/0xApCy3zIyD3VH/uX2PB/oBbA3HKRmVhm6u2xD +pewE9mkX1g4Uvu9lg+EpQWI0Sb7vhGmiMLsa3qfO1gBQjZX8X7W6hcCvyculuP1I +PRVLDJktEbW4hUsHOFvSV84jMC8njkQqSL2d6PKhd8fVTn6IzN1IB1zLcwIGGkRn +Ak+qEOp5AgMBAAECggEBAJ/dPCJzlEjhL5XPONLmGXzZ1Gx5/VR86eBMv0O9jhb3 +wk2QYO3aPxggZGD/rGcKz1L6hzCR77WM0wpb/N/Um1I6pxHGmnU8VjYvLh10CM0f +h7JWyfnFV+ubagxFJamhpkJuvKyTaldaI7EU8qxj47Xky18Wka53z6nbTgXcW8Sm +V4CJy9OHNgKJQnylX6zOAaxVngSGde3xLslLjsYK4w9b2+OkCSUST2XXdo+ZLXxl +cs0lEPFRM1Xh9/E6UrDrJMHHzio53L/W/+a8sIar1upgSY52pyD/tA7VSrAJ9nYC +RezOU81VTLfMO+TYmgZzSUQJYh0cR4yqJe+wgl4U550CgYEA1EcS6Z+PO5Pr3u2+ +XevawSAal6y9ONkkdOoASC977W37nn0E1wlQo41dR6DESCJfiSMeN0KbmXj5Wnc/ +ADu+73iGwC90G9Qs9sjD7KAFBJvuj0V8hxvpWRdIBBbf7rlOj3CV0iXRYjkJbyJa +cxuR0kiv4gTWmm5Cq+5ir8t1Oc8CgYEAwd+xOaDerNR481R+QmENFw+oR2EVMq3Q +B/vinLK0PemQWrh32iBcd+vhSilOSQtUm1nko1jLK8C4s8X2vZYua4m5tcK9VqCt +maCCq/ffxzsoW/GN8japnduz+qA+hKWJzW/aYR8tsOeqzjVqj4iIqPI4HuokrDi/ +UD/QLgq5UTcCgYEAk2ZC0Kx15dXB7AtDq63xOTcUoAtXXRkSgohV58npEKXVGWkQ +Kk0SjG7Fvc35XWlY0z3qZk6/AuOIqfOxcHUMEPatAtgwlH5RNo+T1EQNF/U6wotq +e9q6vp026XgEyJwt29Y+giy2ZrDaRywgiFs1d0H3t0bKyXMUopQmPJFXdesCgYEA +psCxXcDpZjxGX/zPsGZrbOdxtRtisTlg0k0rp93pO8tV90HtDHeDMT54g2ItzJPr +TMev6XOpJNPZyf6+8GhpOuO2EQkT85u2VYoCeslz95gBabvFfIzZrUZYcnw76bm8 +YjAP5DN+CEfq2PyG0Df+W1ojPSvlKSCSJQMOG1vr81cCgYEAkjPY5WR99uJxYBNI +OTFMSkETgDUbPXBu/E/h5Dtn79v8Moj9FvC7+q6sg9qXhrGhfK2xDev3/sTrbS/E +Gcf8UNIne3AXsoAS8MtkOwJXHkYaTIboIYgDX4LlDmbGQlIRaWgyh2POI6VtjLBT +ms6AdsdpIB6As9xNUBUwj/RnTZQ= +-----END PRIVATE KEY----- diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/tests/video.mp4 b/vendor/src/gopkg.in/telegram-bot-api.v4/tests/video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a203d0cdf13ea5106cdb8c98b52301f0e3719bac GIT binary patch literal 1053651 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%0A0_A2BB?T)i~ z4N2W5nUMXhn#m5ZjZ%8r@Zo^*hAJ$sW*4*wd7e z-^TSy`GRU+6j(e{#3C)$=TSoCvXhQ~i^5G`ofJ5H1Z3HM)UsT1Coa+z;Y7uEc0L$+P?b`&$h#6;Yn%gIcBF+k7a&xe@o$Bh~szTL@SG zT)$gE=cK;ka@n3^lyUynKCW8B-PT8qelkZD(p2E)OHfV`|IC)anf? zXHgh~dn(MW&9GyMCugeU#Cy||Bqd}VgD9hSYV51>!eh1?d3T5-#)3}6ZJUinQXnP^ z;*${1{1F^$7KNfuI$E)L=5yDpAh4BNO+c5$1xW7x#OG3owTv)i_)h!cjohtgw6V

    Jbq-814NPd$TYkZAM*DuEbPgkd!5Mv&pQs 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%0A$ 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

    F^h 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�L$2-vNN2qd&Na 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%0D@5 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%0Ar{$@$bdoE3f zl+)Mctbu8+cf2|ZjG4pJdASDk3rIyAtP$Vil5r_2J=$ajGZKuZ(6c+qweFga?LnP& z$B9ce!%KXsjXq5SRfiPXswS-iY((b=Cco(GpJg%HS)DkqdeAqujLe#wR1zIZXdXP{ z{tH_2aQ2**7FUgJ)s3-;>kvl}STp0|mAA_vm-_%l7@!GoQnEZj3wN(80xE$qG2{SZ zIMDDIsc1tgV(E1RH4YJVhAu$OSF2jgifS7B-^nsAh0uNyKAFA00E3gW={GK;j+f~h zohq|x14})MW>4@JUmZX(s#ELWl|&eClZa?zxfeI^w{P$BU}>beL!G4Rep3Q0XhY|# zxX-5XZ-SNl@9g(p$H;TR8^d%KYV;`5n>Y_aoKvj|F~_3CwYLL;Zix|MBKN2Gc{jQ^juMuW*km>*!flJ3%IgUW|mpYG8n(BlD(= zYaIL2*Z$588bvRM9b$(#z4=TEXV9>co`${%P2`k7B7-~6>N(aHVi(&XpuZ-pXx}8J%at2o*u<+f=PXCZey2HqS=mzo{*yq2fLiL}*XZ zFZeeaaI|A3?OjRz)Z6fr<&iM{;EgKuw)kJtQnzdIf=Lz8g5bD!>Ia zdi`-EPy%YiqM4s6@-AJS@SL0+)PksAdKJAS&*Ey};Xakz&^z;~{8{gTcy=q3YYClv zekUcJ%~sr=N{K9hX!$%3c3!|GFk!pb^G}j!x71<{nI&QBJUn2ymOZw%1&_z{D#Qo< z2$?==`s+b@XX*7fe2!fCvwA{W`$X9{i$w*gsz#xQ>Y{}mFMjgCOEcAfXwK!9Sp-=Z z9Usy4Z)(`b$B#j76y_&2ic<4cA7>hWa6R18Pl|eS%{#6@R=(Vqn!n)X_uW$mKnCW> z-*d;?76M%O1oGjbbt%9pej*EB^N1_ObjuI1Zh4YOKs@ncY-7 z2q=(=jyXe)u=tLTJ3$7Qzr*VJkHf9v#IOz>-5mCkOJz9fJ6>I0PLu7>h~29nGp1bc z8WiO5fOo6hUK4?w{!!hGwh^=aI}NAkma6QANzyC+1_`9i7#!|pW&6^cChdHbS5!S- zH!Ul?HZGc4CHp;M^{4EU@Olj=Bd$d*Z}RFF+fef(Zm?`MYCk7|d`lPn!FWqnQ`AA@ z4IU0gubhAd5BZBo`LAS86*b{r+#st5zw7dilQAoUbQ}twfKkI+qFZQi#`)^;o%Ru2 z^`^CM5Ohh6b9B)zbsa008rLxbYPmm=%ERRw~S9bM$Y0wsrahI#{GgU}6$>h<`*GDSby=9`8*n?2Yz8fw^8tTIp z^;e{gUf#2x;_5Dd#V9R@4JRhisFtJp!mXO!JUJxBWdF~6fNCq36aD{VKFHf$goW8; zT%)x&-uAMS6^e8$<9x{7((ihXPIjHt$77YB`Rek-MQUO+U^;GZ_nlOJ@z7=OISFHx z#^;?KyE;~DK58rpLf2Vm6az0E_wR4dR9h@t$)d*z2RLDaG_rYAX1k%auZNovLX;45 zJi)jrGgyF$L<3rvz=5k~dK zvFg1cs&u-v(42YX^B;@Ie*C`pjq+UIHhg;~EMiC1aF)SLYc}a-XDSlqQ7+o;qZhq8YUzO!c{RRD4xm>%0;ACrnaQ=0 zK)ht{r19Q3{cHDA6-qWhSpg�IeT~@r?-xXXpbi!xq0(h5wcR4zyG}?;yV7-{-lT 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�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 z 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

    ^$ywdz$5hK=ZG`Afn0K9XJjIQXceAoppq9T@ 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 OVI?aqAtfUr_5T3)u@DIW literal 0 HcmV?d00001 diff --git a/vendor/src/gopkg.in/telegram-bot-api.v4/tests/voice.ogg b/vendor/src/gopkg.in/telegram-bot-api.v4/tests/voice.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0d7f43eb7956d8ace08e2a8131ff1f4fc3fdba6e GIT binary patch literal 105243 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