From b23779a24f9eab51a372c9ed6e660f7a7c431298 Mon Sep 17 00:00:00 2001 From: siddontang Date: Mon, 11 Feb 2019 16:50:48 +0800 Subject: [PATCH] use go mod --- .travis.yml | 5 +- Gopkg.lock | 72 - Gopkg.toml | 51 - Makefile | 6 +- go.mod | 9 + go.sum | 16 + vendor/github.com/BurntSushi/toml/decode.go | 509 ------ .../github.com/BurntSushi/toml/decode_meta.go | 121 -- vendor/github.com/BurntSushi/toml/doc.go | 27 - vendor/github.com/BurntSushi/toml/encode.go | 568 ------- .../BurntSushi/toml/encoding_types.go | 19 - .../BurntSushi/toml/encoding_types_1.1.go | 18 - vendor/github.com/BurntSushi/toml/lex.go | 953 ----------- vendor/github.com/BurntSushi/toml/parse.go | 592 ------- .../github.com/BurntSushi/toml/type_check.go | 91 -- .../github.com/BurntSushi/toml/type_fields.go | 242 --- vendor/github.com/juju/errors/LICENSE | 191 --- vendor/github.com/juju/errors/doc.go | 81 - vendor/github.com/juju/errors/error.go | 172 -- vendor/github.com/juju/errors/errortypes.go | 333 ---- vendor/github.com/juju/errors/functions.go | 330 ---- vendor/github.com/juju/errors/path.go | 38 - vendor/github.com/pingcap/check/benchmark.go | 187 --- vendor/github.com/pingcap/check/check.go | 980 ----------- vendor/github.com/pingcap/check/checkers.go | 458 ------ vendor/github.com/pingcap/check/checkers2.go | 131 -- vendor/github.com/pingcap/check/compare.go | 161 -- vendor/github.com/pingcap/check/helpers.go | 236 --- vendor/github.com/pingcap/check/printer.go | 168 -- vendor/github.com/pingcap/check/run.go | 179 -- vendor/github.com/satori/go.uuid/LICENSE | 20 - vendor/github.com/satori/go.uuid/codec.go | 206 --- vendor/github.com/satori/go.uuid/generator.go | 239 --- vendor/github.com/satori/go.uuid/sql.go | 78 - vendor/github.com/satori/go.uuid/uuid.go | 161 -- vendor/github.com/shopspring/decimal/LICENSE | 45 - .../shopspring/decimal/decimal-go.go | 414 ----- .../github.com/shopspring/decimal/decimal.go | 1434 ----------------- .../github.com/shopspring/decimal/rounding.go | 118 -- vendor/github.com/siddontang/go-log/LICENSE | 21 - .../github.com/siddontang/go-log/log/doc.go | 20 - .../siddontang/go-log/log/filehandler.go | 230 --- .../siddontang/go-log/log/handler.go | 54 - .../github.com/siddontang/go-log/log/log.go | 137 -- .../siddontang/go-log/log/logger.go | 340 ---- .../siddontang/go-log/loggers/loggers.go | 68 - vendor/github.com/siddontang/go-mysql/LICENSE | 20 - .../siddontang/go-mysql/canal/canal.go | 462 ------ .../siddontang/go-mysql/canal/config.go | 109 -- .../siddontang/go-mysql/canal/dump.go | 174 -- .../siddontang/go-mysql/canal/handler.go | 41 - .../siddontang/go-mysql/canal/master.go | 46 - .../siddontang/go-mysql/canal/rows.go | 75 - .../siddontang/go-mysql/canal/sync.go | 271 ---- .../siddontang/go-mysql/client/auth.go | 174 -- .../siddontang/go-mysql/client/conn.go | 254 --- .../siddontang/go-mysql/client/req.go | 72 - .../siddontang/go-mysql/client/resp.go | 219 --- .../siddontang/go-mysql/client/stmt.go | 216 --- .../siddontang/go-mysql/dump/dump.go | 216 --- .../siddontang/go-mysql/dump/parser.go | 192 --- .../siddontang/go-mysql/mysql/const.go | 164 -- .../siddontang/go-mysql/mysql/errcode.go | 870 ---------- .../siddontang/go-mysql/mysql/errname.go | 868 ---------- .../siddontang/go-mysql/mysql/error.go | 66 - .../siddontang/go-mysql/mysql/field.go | 157 -- .../siddontang/go-mysql/mysql/gtid.go | 29 - .../siddontang/go-mysql/mysql/mariadb_gtid.go | 217 --- .../siddontang/go-mysql/mysql/mysql_gtid.go | 435 ----- .../siddontang/go-mysql/mysql/parse_binary.go | 53 - .../siddontang/go-mysql/mysql/position.go | 33 - .../siddontang/go-mysql/mysql/result.go | 14 - .../siddontang/go-mysql/mysql/resultset.go | 439 ----- .../go-mysql/mysql/resultset_helper.go | 248 --- .../siddontang/go-mysql/mysql/state.go | 233 --- .../siddontang/go-mysql/mysql/util.go | 354 ---- .../siddontang/go-mysql/packet/conn.go | 163 -- .../siddontang/go-mysql/replication/backup.go | 96 -- .../go-mysql/replication/binlogstreamer.go | 71 - .../go-mysql/replication/binlogsyncer.go | 758 --------- .../siddontang/go-mysql/replication/const.go | 185 --- .../siddontang/go-mysql/replication/doc.go | 8 - .../siddontang/go-mysql/replication/event.go | 487 ------ .../go-mysql/replication/generic_event.go | 171 -- .../go-mysql/replication/json_binary.go | 485 ------ .../siddontang/go-mysql/replication/parser.go | 341 ---- .../go-mysql/replication/row_event.go | 852 ---------- .../siddontang/go-mysql/replication/time.go | 43 - .../siddontang/go-mysql/schema/schema.go | 395 ----- vendor/github.com/siddontang/go/LICENSE | 20 - vendor/github.com/siddontang/go/bson/LICENSE | 25 - .../github.com/siddontang/go/filelock/LICENSE | 27 - vendor/github.com/siddontang/go/hack/hack.go | 27 - .../siddontang/go/ioutil2/ioutil.go | 39 - .../siddontang/go/ioutil2/sectionwriter.go | 69 - .../github.com/siddontang/go/snappy/LICENSE | 27 - .../github.com/siddontang/go/sync2/atomic.go | 146 -- .../siddontang/go/sync2/semaphore.go | 65 - 98 files changed, 31 insertions(+), 21719 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 vendor/github.com/BurntSushi/toml/decode.go delete mode 100644 vendor/github.com/BurntSushi/toml/decode_meta.go delete mode 100644 vendor/github.com/BurntSushi/toml/doc.go delete mode 100644 vendor/github.com/BurntSushi/toml/encode.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types_1.1.go delete mode 100644 vendor/github.com/BurntSushi/toml/lex.go delete mode 100644 vendor/github.com/BurntSushi/toml/parse.go delete mode 100644 vendor/github.com/BurntSushi/toml/type_check.go delete mode 100644 vendor/github.com/BurntSushi/toml/type_fields.go delete mode 100644 vendor/github.com/juju/errors/LICENSE delete mode 100644 vendor/github.com/juju/errors/doc.go delete mode 100644 vendor/github.com/juju/errors/error.go delete mode 100644 vendor/github.com/juju/errors/errortypes.go delete mode 100644 vendor/github.com/juju/errors/functions.go delete mode 100644 vendor/github.com/juju/errors/path.go delete mode 100644 vendor/github.com/pingcap/check/benchmark.go delete mode 100644 vendor/github.com/pingcap/check/check.go delete mode 100644 vendor/github.com/pingcap/check/checkers.go delete mode 100644 vendor/github.com/pingcap/check/checkers2.go delete mode 100644 vendor/github.com/pingcap/check/compare.go delete mode 100644 vendor/github.com/pingcap/check/helpers.go delete mode 100644 vendor/github.com/pingcap/check/printer.go delete mode 100644 vendor/github.com/pingcap/check/run.go delete mode 100644 vendor/github.com/satori/go.uuid/LICENSE delete mode 100644 vendor/github.com/satori/go.uuid/codec.go delete mode 100644 vendor/github.com/satori/go.uuid/generator.go delete mode 100644 vendor/github.com/satori/go.uuid/sql.go delete mode 100644 vendor/github.com/satori/go.uuid/uuid.go delete mode 100644 vendor/github.com/shopspring/decimal/LICENSE delete mode 100644 vendor/github.com/shopspring/decimal/decimal-go.go delete mode 100644 vendor/github.com/shopspring/decimal/decimal.go delete mode 100644 vendor/github.com/shopspring/decimal/rounding.go delete mode 100644 vendor/github.com/siddontang/go-log/LICENSE delete mode 100644 vendor/github.com/siddontang/go-log/log/doc.go delete mode 100644 vendor/github.com/siddontang/go-log/log/filehandler.go delete mode 100644 vendor/github.com/siddontang/go-log/log/handler.go delete mode 100644 vendor/github.com/siddontang/go-log/log/log.go delete mode 100644 vendor/github.com/siddontang/go-log/log/logger.go delete mode 100644 vendor/github.com/siddontang/go-log/loggers/loggers.go delete mode 100644 vendor/github.com/siddontang/go-mysql/LICENSE delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/canal.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/config.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/dump.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/handler.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/master.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/rows.go delete mode 100644 vendor/github.com/siddontang/go-mysql/canal/sync.go delete mode 100644 vendor/github.com/siddontang/go-mysql/client/auth.go delete mode 100644 vendor/github.com/siddontang/go-mysql/client/conn.go delete mode 100644 vendor/github.com/siddontang/go-mysql/client/req.go delete mode 100644 vendor/github.com/siddontang/go-mysql/client/resp.go delete mode 100644 vendor/github.com/siddontang/go-mysql/client/stmt.go delete mode 100644 vendor/github.com/siddontang/go-mysql/dump/dump.go delete mode 100644 vendor/github.com/siddontang/go-mysql/dump/parser.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/const.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/errcode.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/errname.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/error.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/field.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/gtid.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/mariadb_gtid.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/mysql_gtid.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/parse_binary.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/position.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/result.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/resultset.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/resultset_helper.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/state.go delete mode 100644 vendor/github.com/siddontang/go-mysql/mysql/util.go delete mode 100644 vendor/github.com/siddontang/go-mysql/packet/conn.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/backup.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/binlogstreamer.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/binlogsyncer.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/const.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/doc.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/event.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/generic_event.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/json_binary.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/parser.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/row_event.go delete mode 100644 vendor/github.com/siddontang/go-mysql/replication/time.go delete mode 100644 vendor/github.com/siddontang/go-mysql/schema/schema.go delete mode 100644 vendor/github.com/siddontang/go/LICENSE delete mode 100644 vendor/github.com/siddontang/go/bson/LICENSE delete mode 100644 vendor/github.com/siddontang/go/filelock/LICENSE delete mode 100644 vendor/github.com/siddontang/go/hack/hack.go delete mode 100644 vendor/github.com/siddontang/go/ioutil2/ioutil.go delete mode 100644 vendor/github.com/siddontang/go/ioutil2/sectionwriter.go delete mode 100644 vendor/github.com/siddontang/go/snappy/LICENSE delete mode 100644 vendor/github.com/siddontang/go/sync2/atomic.go delete mode 100644 vendor/github.com/siddontang/go/sync2/semaphore.go diff --git a/.travis.yml b/.travis.yml index 12f6fcff..356ff410 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: go go: - - "1.9" - - "1.10" + - "1.11" services: - elasticsearch @@ -35,3 +34,5 @@ before_install: script: - go test --race ./... +env: + - GO111MODULE=on \ No newline at end of file diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 38021a8a..00000000 --- a/Gopkg.lock +++ /dev/null @@ -1,72 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/BurntSushi/toml" - packages = ["."] - revision = "b26d9c308763d68093482582cea63d69be07a0f0" - version = "v0.3.0" - -[[projects]] - branch = "master" - name = "github.com/juju/errors" - packages = ["."] - revision = "812b06ada1776ad4dd95d575e18ffffe3a9ac34a" - -[[projects]] - branch = "master" - name = "github.com/pingcap/check" - packages = ["."] - revision = "1c287c953996ab3a0bf535dba9d53d809d3dc0b6" - -[[projects]] - name = "github.com/satori/go.uuid" - packages = ["."] - revision = "f58768cc1a7a7e77a3bd49e98cdd21419399b6a3" - version = "v1.2.0" - -[[projects]] - name = "github.com/shopspring/decimal" - packages = ["."] - revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" - version = "1.1.0" - -[[projects]] - branch = "master" - name = "github.com/siddontang/go" - packages = [ - "hack", - "ioutil2", - "sync2" - ] - revision = "bdc77568d726a8702315ec4eafda030b6abc4f43" - -[[projects]] - branch = "master" - name = "github.com/siddontang/go-log" - packages = [ - "log", - "loggers" - ] - revision = "a4d157e46fa3e08b7e7ff329af341fa3ff86c02c" - -[[projects]] - branch = "master" - name = "github.com/siddontang/go-mysql" - packages = [ - "canal", - "client", - "dump", - "mysql", - "packet", - "replication", - "schema" - ] - revision = "2d151e326c1a7193d6c374dba6fbb0db3435bf05" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "a44edb92429a19dab5e22a895bbcd4f8d98e67fb9e5f0d6c6899afe1a6517b59" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index 7f50f77e..00000000 --- a/Gopkg.toml +++ /dev/null @@ -1,51 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/BurntSushi/toml" - version = "0.3.0" - -[[constraint]] - branch = "master" - name = "github.com/juju/errors" - -[[constraint]] - branch = "master" - name = "github.com/pingcap/check" - -[[constraint]] - branch = "master" - name = "github.com/siddontang/go" - -[[constraint]] - branch = "master" - name = "github.com/siddontang/go-mysql" - -[prune] - go-tests = true - unused-packages = true - non-go = true \ No newline at end of file diff --git a/Makefile b/Makefile index 16426a1a..c92cfa4c 100644 --- a/Makefile +++ b/Makefile @@ -3,11 +3,11 @@ all: build build: build-elasticsearch build-elasticsearch: - go build -o bin/go-mysql-elasticsearch ./cmd/go-mysql-elasticsearch + GO111MODULE=on go build -o bin/go-mysql-elasticsearch ./cmd/go-mysql-elasticsearch test: - go test -timeout 1m --race ./... + GO111MODULE=on go test -timeout 1m --race ./... clean: - go clean -i ./... + GO111MODULE=on go clean -i ./... @rm -rf bin \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..06467f64 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/siddontang/go-mysql-elasticsearch + +require ( + github.com/BurntSushi/toml v0.3.1 + github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 + github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 + github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07 + github.com/siddontang/go-mysql v0.0.0-20190123011128-88e9cd7f6643 +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..2905d1ec --- /dev/null +++ b/go.sum @@ -0,0 +1,16 @@ +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/juju/errors v0.0.0-20190207033735-e65537c515d7 h1:dMIPRDg6gi7CUp0Kj2+HxqJ5kTr1iAdzsXYIrLCNSmU= +github.com/juju/errors v0.0.0-20190207033735-e65537c515d7/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/pingcap/errors v0.11.0 h1:DCJQB8jrHbQ1VVlMFIrbj2ApScNNotVmkSNplu2yUt4= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM= +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07 h1:oI+RNwuC9jF2g2lP0u0cVEEZrc/AYBCuFdvwrLWM/6Q= +github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07/go.mod h1:yFdBgwXP24JziuRl2NMUahT7nGLNOKi1SIiFxMttVD4= +github.com/siddontang/go-mysql v0.0.0-20190123011128-88e9cd7f6643 h1:yzg8+Cip1iDhy6GGS1zKflqOybgRc4xp82eYwQrP+DU= +github.com/siddontang/go-mysql v0.0.0-20190123011128-88e9cd7f6643/go.mod h1:/b8ZcWjAShCcHp2dWpjb1vTlNyiG03UeHEQr2jteOpI= diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go deleted file mode 100644 index b0fd51d5..00000000 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ /dev/null @@ -1,509 +0,0 @@ -package toml - -import ( - "fmt" - "io" - "io/ioutil" - "math" - "reflect" - "strings" - "time" -) - -func e(format string, args ...interface{}) error { - return fmt.Errorf("toml: "+format, args...) -} - -// Unmarshaler is the interface implemented by objects that can unmarshal a -// TOML description of themselves. -type Unmarshaler interface { - UnmarshalTOML(interface{}) error -} - -// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. -func Unmarshal(p []byte, v interface{}) error { - _, err := Decode(string(p), v) - return err -} - -// Primitive is a TOML value that hasn't been decoded into a Go value. -// When using the various `Decode*` functions, the type `Primitive` may -// be given to any value, and its decoding will be delayed. -// -// A `Primitive` value can be decoded using the `PrimitiveDecode` function. -// -// The underlying representation of a `Primitive` value is subject to change. -// Do not rely on it. -// -// N.B. Primitive values are still parsed, so using them will only avoid -// the overhead of reflection. They can be useful when you don't know the -// exact type of TOML data until run time. -type Primitive struct { - undecoded interface{} - context Key -} - -// DEPRECATED! -// -// Use MetaData.PrimitiveDecode instead. -func PrimitiveDecode(primValue Primitive, v interface{}) error { - md := MetaData{decoded: make(map[string]bool)} - return md.unify(primValue.undecoded, rvalue(v)) -} - -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) -// -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) -func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { - md.context = primValue.context - defer func() { md.context = nil }() - return md.unify(primValue.undecoded, rvalue(v)) -} - -// Decode will decode the contents of `data` in TOML format into a pointer -// `v`. -// -// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be -// used interchangeably.) -// -// TOML arrays of tables correspond to either a slice of structs or a slice -// of maps. -// -// TOML datetimes correspond to Go `time.Time` values. -// -// All other TOML types (float, string, int, bool and array) correspond -// to the obvious Go types. -// -// An exception to the above rules is if a type implements the -// encoding.TextUnmarshaler interface. In this case, any primitive TOML value -// (floats, strings, integers, booleans and datetimes) will be converted to -// a byte string and given to the value's UnmarshalText method. See the -// Unmarshaler example for a demonstration with time duration strings. -// -// Key mapping -// -// TOML keys can map to either keys in a Go map or field names in a Go -// struct. The special `toml` struct tag may be used to map TOML keys to -// struct fields that don't match the key name exactly. (See the example.) -// A case insensitive match to struct names will be tried if an exact match -// can't be found. -// -// The mapping between TOML values and Go values is loose. That is, there -// may exist TOML values that cannot be placed into your representation, and -// there may be parts of your representation that do not correspond to -// TOML values. This loose mapping can be made stricter by using the IsDefined -// and/or Undecoded methods on the MetaData returned. -// -// This decoder will not handle cyclic types. If a cyclic type is passed, -// `Decode` will not terminate. -func Decode(data string, v interface{}) (MetaData, error) { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr { - return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) - } - if rv.IsNil() { - return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) - } - p, err := parse(data) - if err != nil { - return MetaData{}, err - } - md := MetaData{ - p.mapping, p.types, p.ordered, - make(map[string]bool, len(p.ordered)), nil, - } - return md, md.unify(p.mapping, indirect(rv)) -} - -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at `fpath` and decode it for you. -func DecodeFile(fpath string, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadFile(fpath) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// DecodeReader is just like Decode, except it will consume all bytes -// from the reader and decode it for you. -func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadAll(r) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// unify performs a sort of type unification based on the structure of `rv`, -// which is the client representation. -// -// Any type mismatch produces an error. Finding a type that we don't know -// how to handle produces an unsupported type error. -func (md *MetaData) unify(data interface{}, rv reflect.Value) error { - - // Special case. Look for a `Primitive` value. - if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { - // Save the undecoded data and the key context into the primitive - // value. - context := make(Key, len(md.context)) - copy(context, md.context) - rv.Set(reflect.ValueOf(Primitive{ - undecoded: data, - context: context, - })) - return nil - } - - // Special case. Unmarshaler Interface support. - if rv.CanAddr() { - if v, ok := rv.Addr().Interface().(Unmarshaler); ok { - return v.UnmarshalTOML(data) - } - } - - // Special case. Handle time.Time values specifically. - // TODO: Remove this code when we decide to drop support for Go 1.1. - // This isn't necessary in Go 1.2 because time.Time satisfies the encoding - // interfaces. - if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { - return md.unifyDatetime(data, rv) - } - - // Special case. Look for a value satisfying the TextUnmarshaler interface. - if v, ok := rv.Interface().(TextUnmarshaler); ok { - return md.unifyText(data, v) - } - // BUG(burntsushi) - // The behavior here is incorrect whenever a Go type satisfies the - // encoding.TextUnmarshaler interface but also corresponds to a TOML - // hash or array. In particular, the unmarshaler should only be applied - // to primitive TOML values. But at this point, it will be applied to - // all kinds of values and produce an incorrect error whenever those values - // are hashes or arrays (including arrays of tables). - - k := rv.Kind() - - // laziness - if k >= reflect.Int && k <= reflect.Uint64 { - return md.unifyInt(data, rv) - } - switch k { - case reflect.Ptr: - elem := reflect.New(rv.Type().Elem()) - err := md.unify(data, reflect.Indirect(elem)) - if err != nil { - return err - } - rv.Set(elem) - return nil - case reflect.Struct: - return md.unifyStruct(data, rv) - case reflect.Map: - return md.unifyMap(data, rv) - case reflect.Array: - return md.unifyArray(data, rv) - case reflect.Slice: - return md.unifySlice(data, rv) - case reflect.String: - return md.unifyString(data, rv) - case reflect.Bool: - return md.unifyBool(data, rv) - case reflect.Interface: - // we only support empty interfaces. - if rv.NumMethod() > 0 { - return e("unsupported type %s", rv.Type()) - } - return md.unifyAnything(data, rv) - case reflect.Float32: - fallthrough - case reflect.Float64: - return md.unifyFloat64(data, rv) - } - return e("unsupported type %s", rv.Kind()) -} - -func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if mapping == nil { - return nil - } - return e("type mismatch for %s: expected table but found %T", - rv.Type().String(), mapping) - } - - for key, datum := range tmap { - var f *field - fields := cachedTypeFields(rv.Type()) - for i := range fields { - ff := &fields[i] - if ff.name == key { - f = ff - break - } - if f == nil && strings.EqualFold(ff.name, key) { - f = ff - } - } - if f != nil { - subv := rv - for _, i := range f.index { - subv = indirect(subv.Field(i)) - } - if isUnifiable(subv) { - md.decoded[md.context.add(key).String()] = true - md.context = append(md.context, key) - if err := md.unify(datum, subv); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - } else if f.name != "" { - // Bad user! No soup for you! - return e("cannot write unexported field %s.%s", - rv.Type().String(), f.name) - } - } - } - return nil -} - -func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if tmap == nil { - return nil - } - return badtype("map", mapping) - } - if rv.IsNil() { - rv.Set(reflect.MakeMap(rv.Type())) - } - for k, v := range tmap { - md.decoded[md.context.add(k).String()] = true - md.context = append(md.context, k) - - rvkey := indirect(reflect.New(rv.Type().Key())) - rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) - if err := md.unify(v, rvval); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - - rvkey.SetString(k) - rv.SetMapIndex(rvkey, rvval) - } - return nil -} - -func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - sliceLen := datav.Len() - if sliceLen != rv.Len() { - return e("expected array length %d; got TOML array of length %d", - rv.Len(), sliceLen) - } - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - n := datav.Len() - if rv.IsNil() || rv.Cap() < n { - rv.Set(reflect.MakeSlice(rv.Type(), n, n)) - } - rv.SetLen(n) - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { - sliceLen := data.Len() - for i := 0; i < sliceLen; i++ { - v := data.Index(i).Interface() - sliceval := indirect(rv.Index(i)) - if err := md.unify(v, sliceval); err != nil { - return err - } - } - return nil -} - -func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { - if _, ok := data.(time.Time); ok { - rv.Set(reflect.ValueOf(data)) - return nil - } - return badtype("time.Time", data) -} - -func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { - if s, ok := data.(string); ok { - rv.SetString(s) - return nil - } - return badtype("string", data) -} - -func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { - if num, ok := data.(float64); ok { - switch rv.Kind() { - case reflect.Float32: - fallthrough - case reflect.Float64: - rv.SetFloat(num) - default: - panic("bug") - } - return nil - } - return badtype("float", data) -} - -func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { - if num, ok := data.(int64); ok { - if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { - switch rv.Kind() { - case reflect.Int, reflect.Int64: - // No bounds checking necessary. - case reflect.Int8: - if num < math.MinInt8 || num > math.MaxInt8 { - return e("value %d is out of range for int8", num) - } - case reflect.Int16: - if num < math.MinInt16 || num > math.MaxInt16 { - return e("value %d is out of range for int16", num) - } - case reflect.Int32: - if num < math.MinInt32 || num > math.MaxInt32 { - return e("value %d is out of range for int32", num) - } - } - rv.SetInt(num) - } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { - unum := uint64(num) - switch rv.Kind() { - case reflect.Uint, reflect.Uint64: - // No bounds checking necessary. - case reflect.Uint8: - if num < 0 || unum > math.MaxUint8 { - return e("value %d is out of range for uint8", num) - } - case reflect.Uint16: - if num < 0 || unum > math.MaxUint16 { - return e("value %d is out of range for uint16", num) - } - case reflect.Uint32: - if num < 0 || unum > math.MaxUint32 { - return e("value %d is out of range for uint32", num) - } - } - rv.SetUint(unum) - } else { - panic("unreachable") - } - return nil - } - return badtype("integer", data) -} - -func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { - if b, ok := data.(bool); ok { - rv.SetBool(b) - return nil - } - return badtype("boolean", data) -} - -func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { - rv.Set(reflect.ValueOf(data)) - return nil -} - -func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { - var s string - switch sdata := data.(type) { - case TextMarshaler: - text, err := sdata.MarshalText() - if err != nil { - return err - } - s = string(text) - case fmt.Stringer: - s = sdata.String() - case string: - s = sdata - case bool: - s = fmt.Sprintf("%v", sdata) - case int64: - s = fmt.Sprintf("%d", sdata) - case float64: - s = fmt.Sprintf("%f", sdata) - default: - return badtype("primitive (string-like)", data) - } - if err := v.UnmarshalText([]byte(s)); err != nil { - return err - } - return nil -} - -// rvalue returns a reflect.Value of `v`. All pointers are resolved. -func rvalue(v interface{}) reflect.Value { - return indirect(reflect.ValueOf(v)) -} - -// indirect returns the value pointed to by a pointer. -// Pointers are followed until the value is not a pointer. -// New values are allocated for each nil pointer. -// -// An exception to this rule is if the value satisfies an interface of -// interest to us (like encoding.TextUnmarshaler). -func indirect(v reflect.Value) reflect.Value { - if v.Kind() != reflect.Ptr { - if v.CanSet() { - pv := v.Addr() - if _, ok := pv.Interface().(TextUnmarshaler); ok { - return pv - } - } - return v - } - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - return indirect(reflect.Indirect(v)) -} - -func isUnifiable(rv reflect.Value) bool { - if rv.CanSet() { - return true - } - if _, ok := rv.Interface().(TextUnmarshaler); ok { - return true - } - return false -} - -func badtype(expected string, data interface{}) error { - return e("cannot load TOML value of type %T into a Go %s", data, expected) -} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go deleted file mode 100644 index b9914a67..00000000 --- a/vendor/github.com/BurntSushi/toml/decode_meta.go +++ /dev/null @@ -1,121 +0,0 @@ -package toml - -import "strings" - -// MetaData allows access to meta information about TOML data that may not -// be inferrable via reflection. In particular, whether a key has been defined -// and the TOML type of a key. -type MetaData struct { - mapping map[string]interface{} - types map[string]tomlType - keys []Key - decoded map[string]bool - context Key // Used only during decoding. -} - -// IsDefined returns true if the key given exists in the TOML data. The key -// should be specified hierarchially. e.g., -// -// // access the TOML key 'a.b.c' -// IsDefined("a", "b", "c") -// -// IsDefined will return false if an empty key given. Keys are case sensitive. -func (md *MetaData) IsDefined(key ...string) bool { - if len(key) == 0 { - return false - } - - var hash map[string]interface{} - var ok bool - var hashOrVal interface{} = md.mapping - for _, k := range key { - if hash, ok = hashOrVal.(map[string]interface{}); !ok { - return false - } - if hashOrVal, ok = hash[k]; !ok { - return false - } - } - return true -} - -// Type returns a string representation of the type of the key specified. -// -// Type will return the empty string if given an empty key or a key that -// does not exist. Keys are case sensitive. -func (md *MetaData) Type(key ...string) string { - fullkey := strings.Join(key, ".") - if typ, ok := md.types[fullkey]; ok { - return typ.typeString() - } - return "" -} - -// Key is the type of any TOML key, including key groups. Use (MetaData).Keys -// to get values of this type. -type Key []string - -func (k Key) String() string { - return strings.Join(k, ".") -} - -func (k Key) maybeQuotedAll() string { - var ss []string - for i := range k { - ss = append(ss, k.maybeQuoted(i)) - } - return strings.Join(ss, ".") -} - -func (k Key) maybeQuoted(i int) string { - quote := false - for _, c := range k[i] { - if !isBareKeyChar(c) { - quote = true - break - } - } - if quote { - return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" - } - return k[i] -} - -func (k Key) add(piece string) Key { - newKey := make(Key, len(k)+1) - copy(newKey, k) - newKey[len(k)] = piece - return newKey -} - -// Keys returns a slice of every key in the TOML data, including key groups. -// Each key is itself a slice, where the first element is the top of the -// hierarchy and the last is the most specific. -// -// The list will have the same order as the keys appeared in the TOML data. -// -// All keys returned are non-empty. -func (md *MetaData) Keys() []Key { - return md.keys -} - -// Undecoded returns all keys that have not been decoded in the order in which -// they appear in the original TOML document. -// -// This includes keys that haven't been decoded because of a Primitive value. -// Once the Primitive value is decoded, the keys will be considered decoded. -// -// Also note that decoding into an empty interface will result in no decoding, -// and so no keys will be considered decoded. -// -// In this sense, the Undecoded keys correspond to keys in the TOML document -// that do not have a concrete type in your representation. -func (md *MetaData) Undecoded() []Key { - undecoded := make([]Key, 0, len(md.keys)) - for _, key := range md.keys { - if !md.decoded[key.String()] { - undecoded = append(undecoded, key) - } - } - return undecoded -} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go deleted file mode 100644 index b371f396..00000000 --- a/vendor/github.com/BurntSushi/toml/doc.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Package toml provides facilities for decoding and encoding TOML configuration -files via reflection. There is also support for delaying decoding with -the Primitive type, and querying the set of keys in a TOML document with the -MetaData type. - -The specification implemented: https://github.com/toml-lang/toml - -The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify -whether a file is a valid TOML document. It can also be used to print the -type of each key in a TOML document. - -Testing - -There are two important types of tests used for this package. The first is -contained inside '*_test.go' files and uses the standard Go unit testing -framework. These tests are primarily devoted to holistically testing the -decoder and encoder. - -The second type of testing is used to verify the implementation's adherence -to the TOML specification. These tests have been factored into their own -project: https://github.com/BurntSushi/toml-test - -The reason the tests are in a separate project is so that they can be used by -any implementation of TOML. Namely, it is language agnostic. -*/ -package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go deleted file mode 100644 index d905c21a..00000000 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ /dev/null @@ -1,568 +0,0 @@ -package toml - -import ( - "bufio" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - "time" -) - -type tomlEncodeError struct{ error } - -var ( - errArrayMixedElementTypes = errors.New( - "toml: cannot encode array with mixed element types") - errArrayNilElement = errors.New( - "toml: cannot encode array with nil element") - errNonString = errors.New( - "toml: cannot encode a map with non-string key type") - errAnonNonStruct = errors.New( - "toml: cannot encode an anonymous field that is not a struct") - errArrayNoTable = errors.New( - "toml: TOML array element cannot contain a table") - errNoKey = errors.New( - "toml: top-level values must be Go maps or structs") - errAnything = errors.New("") // used in testing -) - -var quotedReplacer = strings.NewReplacer( - "\t", "\\t", - "\n", "\\n", - "\r", "\\r", - "\"", "\\\"", - "\\", "\\\\", -) - -// Encoder controls the encoding of Go values to a TOML document to some -// io.Writer. -// -// The indentation level can be controlled with the Indent field. -type Encoder struct { - // A single indentation level. By default it is two spaces. - Indent string - - // hasWritten is whether we have written any output to w yet. - hasWritten bool - w *bufio.Writer -} - -// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer -// given. By default, a single indentation level is 2 spaces. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - w: bufio.NewWriter(w), - Indent: " ", - } -} - -// Encode writes a TOML representation of the Go value to the underlying -// io.Writer. If the value given cannot be encoded to a valid TOML document, -// then an error is returned. -// -// The mapping between Go values and TOML values should be precisely the same -// as for the Decode* functions. Similarly, the TextMarshaler interface is -// supported by encoding the resulting bytes as strings. (If you want to write -// arbitrary binary data then you will need to use something like base64 since -// TOML does not have any binary types.) -// -// When encoding TOML hashes (i.e., Go maps or structs), keys without any -// sub-hashes are encoded first. -// -// If a Go map is encoded, then its keys are sorted alphabetically for -// deterministic output. More control over this behavior may be provided if -// there is demand for it. -// -// Encoding Go values without a corresponding TOML representation---like map -// types with non-string keys---will cause an error to be returned. Similarly -// for mixed arrays/slices, arrays/slices with nil elements, embedded -// non-struct types and nested slices containing maps or structs. -// (e.g., [][]map[string]string is not allowed but []map[string]string is OK -// and so is []map[string][]string.) -func (enc *Encoder) Encode(v interface{}) error { - rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { - return err - } - return enc.w.Flush() -} - -func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { - defer func() { - if r := recover(); r != nil { - if terr, ok := r.(tomlEncodeError); ok { - err = terr.error - return - } - panic(r) - } - }() - enc.encode(key, rv) - return nil -} - -func (enc *Encoder) encode(key Key, rv reflect.Value) { - // Special case. Time needs to be in ISO8601 format. - // Special case. If we can marshal the type to text, then we used that. - // Basically, this prevents the encoder for handling these types as - // generic structs (or whatever the underlying type of a TextMarshaler is). - switch rv.Interface().(type) { - case time.Time, TextMarshaler: - enc.keyEqElement(key, rv) - return - } - - k := rv.Kind() - switch k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64, - reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: - enc.keyEqElement(key, rv) - case reflect.Array, reflect.Slice: - if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { - enc.eArrayOfTables(key, rv) - } else { - enc.keyEqElement(key, rv) - } - case reflect.Interface: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Map: - if rv.IsNil() { - return - } - enc.eTable(key, rv) - case reflect.Ptr: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Struct: - enc.eTable(key, rv) - default: - panic(e("unsupported type for key '%s': %s", key, k)) - } -} - -// eElement encodes any value that can be an array element (primitives and -// arrays). -func (enc *Encoder) eElement(rv reflect.Value) { - switch v := rv.Interface().(type) { - case time.Time: - // Special case time.Time as a primitive. Has to come before - // TextMarshaler below because time.Time implements - // encoding.TextMarshaler, but we need to always use UTC. - enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) - return - case TextMarshaler: - // Special case. Use text marshaler if it's available for this value. - if s, err := v.MarshalText(); err != nil { - encPanic(err) - } else { - enc.writeQuoted(string(s)) - } - return - } - switch rv.Kind() { - case reflect.Bool: - enc.wf(strconv.FormatBool(rv.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64: - enc.wf(strconv.FormatInt(rv.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, - reflect.Uint32, reflect.Uint64: - enc.wf(strconv.FormatUint(rv.Uint(), 10)) - case reflect.Float32: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) - case reflect.Float64: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) - case reflect.Array, reflect.Slice: - enc.eArrayOrSliceElement(rv) - case reflect.Interface: - enc.eElement(rv.Elem()) - case reflect.String: - enc.writeQuoted(rv.String()) - default: - panic(e("unexpected primitive type: %s", rv.Kind())) - } -} - -// By the TOML spec, all floats must have a decimal with at least one -// number on either side. -func floatAddDecimal(fstr string) string { - if !strings.Contains(fstr, ".") { - return fstr + ".0" - } - return fstr -} - -func (enc *Encoder) writeQuoted(s string) { - enc.wf("\"%s\"", quotedReplacer.Replace(s)) -} - -func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { - length := rv.Len() - enc.wf("[") - for i := 0; i < length; i++ { - elem := rv.Index(i) - enc.eElement(elem) - if i != length-1 { - enc.wf(", ") - } - } - enc.wf("]") -} - -func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - for i := 0; i < rv.Len(); i++ { - trv := rv.Index(i) - if isNil(trv) { - continue - } - panicIfInvalidKey(key) - enc.newline() - enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - enc.eMapOrStruct(key, trv) - } -} - -func (enc *Encoder) eTable(key Key, rv reflect.Value) { - panicIfInvalidKey(key) - if len(key) == 1 { - // Output an extra newline between top-level tables. - // (The newline isn't written if nothing else has been written though.) - enc.newline() - } - if len(key) > 0 { - enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - } - enc.eMapOrStruct(key, rv) -} - -func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { - switch rv := eindirect(rv); rv.Kind() { - case reflect.Map: - enc.eMap(key, rv) - case reflect.Struct: - enc.eStruct(key, rv) - default: - panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) - } -} - -func (enc *Encoder) eMap(key Key, rv reflect.Value) { - rt := rv.Type() - if rt.Key().Kind() != reflect.String { - encPanic(errNonString) - } - - // Sort keys so that we have deterministic output. And write keys directly - // underneath this key first, before writing sub-structs or sub-maps. - var mapKeysDirect, mapKeysSub []string - for _, mapKey := range rv.MapKeys() { - k := mapKey.String() - if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { - mapKeysSub = append(mapKeysSub, k) - } else { - mapKeysDirect = append(mapKeysDirect, k) - } - } - - var writeMapKeys = func(mapKeys []string) { - sort.Strings(mapKeys) - for _, mapKey := range mapKeys { - mrv := rv.MapIndex(reflect.ValueOf(mapKey)) - if isNil(mrv) { - // Don't write anything for nil fields. - continue - } - enc.encode(key.add(mapKey), mrv) - } - } - writeMapKeys(mapKeysDirect) - writeMapKeys(mapKeysSub) -} - -func (enc *Encoder) eStruct(key Key, rv reflect.Value) { - // Write keys for fields directly under this key first, because if we write - // a field that creates a new table, then all keys under it will be in that - // table (not the one we're writing here). - rt := rv.Type() - var fieldsDirect, fieldsSub [][]int - var addFields func(rt reflect.Type, rv reflect.Value, start []int) - addFields = func(rt reflect.Type, rv reflect.Value, start []int) { - for i := 0; i < rt.NumField(); i++ { - f := rt.Field(i) - // skip unexported fields - if f.PkgPath != "" && !f.Anonymous { - continue - } - frv := rv.Field(i) - if f.Anonymous { - t := f.Type - switch t.Kind() { - case reflect.Struct: - // Treat anonymous struct fields with - // tag names as though they are not - // anonymous, like encoding/json does. - if getOptions(f.Tag).name == "" { - addFields(t, frv, f.Index) - continue - } - case reflect.Ptr: - if t.Elem().Kind() == reflect.Struct && - getOptions(f.Tag).name == "" { - if !frv.IsNil() { - addFields(t.Elem(), frv.Elem(), f.Index) - } - continue - } - // Fall through to the normal field encoding logic below - // for non-struct anonymous fields. - } - } - - if typeIsHash(tomlTypeOfGo(frv)) { - fieldsSub = append(fieldsSub, append(start, f.Index...)) - } else { - fieldsDirect = append(fieldsDirect, append(start, f.Index...)) - } - } - } - addFields(rt, rv, nil) - - var writeFields = func(fields [][]int) { - for _, fieldIndex := range fields { - sft := rt.FieldByIndex(fieldIndex) - sf := rv.FieldByIndex(fieldIndex) - if isNil(sf) { - // Don't write anything for nil fields. - continue - } - - opts := getOptions(sft.Tag) - if opts.skip { - continue - } - keyName := sft.Name - if opts.name != "" { - keyName = opts.name - } - if opts.omitempty && isEmpty(sf) { - continue - } - if opts.omitzero && isZero(sf) { - continue - } - - enc.encode(key.add(keyName), sf) - } - } - writeFields(fieldsDirect) - writeFields(fieldsSub) -} - -// tomlTypeName returns the TOML type name of the Go value's type. It is -// used to determine whether the types of array elements are mixed (which is -// forbidden). If the Go value is nil, then it is illegal for it to be an array -// element, and valueIsNil is returned as true. - -// Returns the TOML type of a Go value. The type may be `nil`, which means -// no concrete TOML type could be found. -func tomlTypeOfGo(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() { - return nil - } - switch rv.Kind() { - case reflect.Bool: - return tomlBool - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64: - return tomlInteger - case reflect.Float32, reflect.Float64: - return tomlFloat - case reflect.Array, reflect.Slice: - if typeEqual(tomlHash, tomlArrayType(rv)) { - return tomlArrayHash - } - return tomlArray - case reflect.Ptr, reflect.Interface: - return tomlTypeOfGo(rv.Elem()) - case reflect.String: - return tomlString - case reflect.Map: - return tomlHash - case reflect.Struct: - switch rv.Interface().(type) { - case time.Time: - return tomlDatetime - case TextMarshaler: - return tomlString - default: - return tomlHash - } - default: - panic("unexpected reflect.Kind: " + rv.Kind().String()) - } -} - -// tomlArrayType returns the element type of a TOML array. The type returned -// may be nil if it cannot be determined (e.g., a nil slice or a zero length -// slize). This function may also panic if it finds a type that cannot be -// expressed in TOML (such as nil elements, heterogeneous arrays or directly -// nested arrays of tables). -func tomlArrayType(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { - return nil - } - firstType := tomlTypeOfGo(rv.Index(0)) - if firstType == nil { - encPanic(errArrayNilElement) - } - - rvlen := rv.Len() - for i := 1; i < rvlen; i++ { - elem := rv.Index(i) - switch elemType := tomlTypeOfGo(elem); { - case elemType == nil: - encPanic(errArrayNilElement) - case !typeEqual(firstType, elemType): - encPanic(errArrayMixedElementTypes) - } - } - // If we have a nested array, then we must make sure that the nested - // array contains ONLY primitives. - // This checks arbitrarily nested arrays. - if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { - nest := tomlArrayType(eindirect(rv.Index(0))) - if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { - encPanic(errArrayNoTable) - } - } - return firstType -} - -type tagOptions struct { - skip bool // "-" - name string - omitempty bool - omitzero bool -} - -func getOptions(tag reflect.StructTag) tagOptions { - t := tag.Get("toml") - if t == "-" { - return tagOptions{skip: true} - } - var opts tagOptions - parts := strings.Split(t, ",") - opts.name = parts[0] - for _, s := range parts[1:] { - switch s { - case "omitempty": - opts.omitempty = true - case "omitzero": - opts.omitzero = true - } - } - return opts -} - -func isZero(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return rv.Uint() == 0 - case reflect.Float32, reflect.Float64: - return rv.Float() == 0.0 - } - return false -} - -func isEmpty(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Array, reflect.Slice, reflect.Map, reflect.String: - return rv.Len() == 0 - case reflect.Bool: - return !rv.Bool() - } - return false -} - -func (enc *Encoder) newline() { - if enc.hasWritten { - enc.wf("\n") - } -} - -func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - panicIfInvalidKey(key) - enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) - enc.eElement(val) - enc.newline() -} - -func (enc *Encoder) wf(format string, v ...interface{}) { - if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { - encPanic(err) - } - enc.hasWritten = true -} - -func (enc *Encoder) indentStr(key Key) string { - return strings.Repeat(enc.Indent, len(key)-1) -} - -func encPanic(err error) { - panic(tomlEncodeError{err}) -} - -func eindirect(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - return eindirect(v.Elem()) - default: - return v - } -} - -func isNil(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return rv.IsNil() - default: - return false - } -} - -func panicIfInvalidKey(key Key) { - for _, k := range key { - if len(k) == 0 { - encPanic(e("Key '%s' is not a valid table name. Key names "+ - "cannot be empty.", key.maybeQuotedAll())) - } - } -} - -func isValidKeyName(s string) bool { - return len(s) != 0 -} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go deleted file mode 100644 index d36e1dd6..00000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.2 - -package toml - -// In order to support Go 1.1, we define our own TextMarshaler and -// TextUnmarshaler types. For Go 1.2+, we just alias them with the -// standard library interfaces. - -import ( - "encoding" -) - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler encoding.TextMarshaler - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go deleted file mode 100644 index e8d503d0..00000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !go1.2 - -package toml - -// These interfaces were introduced in Go 1.2, so we add them manually when -// compiling for Go 1.1. - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler interface { - MarshalText() (text []byte, err error) -} - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go deleted file mode 100644 index 6dee7fc7..00000000 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ /dev/null @@ -1,953 +0,0 @@ -package toml - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -type itemType int - -const ( - itemError itemType = iota - itemNIL // used in the parser to indicate no type - itemEOF - itemText - itemString - itemRawString - itemMultilineString - itemRawMultilineString - itemBool - itemInteger - itemFloat - itemDatetime - itemArray // the start of an array - itemArrayEnd - itemTableStart - itemTableEnd - itemArrayTableStart - itemArrayTableEnd - itemKeyStart - itemCommentStart - itemInlineTableStart - itemInlineTableEnd -) - -const ( - eof = 0 - comma = ',' - tableStart = '[' - tableEnd = ']' - arrayTableStart = '[' - arrayTableEnd = ']' - tableSep = '.' - keySep = '=' - arrayStart = '[' - arrayEnd = ']' - commentStart = '#' - stringStart = '"' - stringEnd = '"' - rawStringStart = '\'' - rawStringEnd = '\'' - inlineTableStart = '{' - inlineTableEnd = '}' -) - -type stateFn func(lx *lexer) stateFn - -type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item - - // Allow for backing up up to three runes. - // This is necessary because TOML contains 3-rune tokens (""" and '''). - prevWidths [3]int - nprev int // how many of prevWidths are in use - // If we emit an eof, we can still back up, but it is not OK to call - // next again. - atEOF bool - - // A stack of state functions used to maintain context. - // The idea is to reuse parts of the state machine in various places. - // For example, values can appear at the top level or within arbitrarily - // nested arrays. The last state on the stack is used after a value has - // been lexed. Similarly for comments. - stack []stateFn -} - -type item struct { - typ itemType - val string - line int -} - -func (lx *lexer) nextItem() item { - for { - select { - case item := <-lx.items: - return item - default: - lx.state = lx.state(lx) - } - } -} - -func lex(input string) *lexer { - lx := &lexer{ - input: input, - state: lexTop, - line: 1, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), - } - return lx -} - -func (lx *lexer) push(state stateFn) { - lx.stack = append(lx.stack, state) -} - -func (lx *lexer) pop() stateFn { - if len(lx.stack) == 0 { - return lx.errorf("BUG in lexer: no states to pop") - } - last := lx.stack[len(lx.stack)-1] - lx.stack = lx.stack[0 : len(lx.stack)-1] - return last -} - -func (lx *lexer) current() string { - return lx.input[lx.start:lx.pos] -} - -func (lx *lexer) emit(typ itemType) { - lx.items <- item{typ, lx.current(), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) emitTrim(typ itemType) { - lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) next() (r rune) { - if lx.atEOF { - panic("next called after EOF") - } - if lx.pos >= len(lx.input) { - lx.atEOF = true - return eof - } - - if lx.input[lx.pos] == '\n' { - lx.line++ - } - lx.prevWidths[2] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[0] - if lx.nprev < 3 { - lx.nprev++ - } - r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) - lx.prevWidths[0] = w - lx.pos += w - return r -} - -// ignore skips over the pending input before this point. -func (lx *lexer) ignore() { - lx.start = lx.pos -} - -// backup steps back one rune. Can be called only twice between calls to next. -func (lx *lexer) backup() { - if lx.atEOF { - lx.atEOF = false - return - } - if lx.nprev < 1 { - panic("backed up too far") - } - w := lx.prevWidths[0] - lx.prevWidths[0] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[2] - lx.nprev-- - lx.pos -= w - if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { - lx.line-- - } -} - -// accept consumes the next rune if it's equal to `valid`. -func (lx *lexer) accept(valid rune) bool { - if lx.next() == valid { - return true - } - lx.backup() - return false -} - -// peek returns but does not consume the next rune in the input. -func (lx *lexer) peek() rune { - r := lx.next() - lx.backup() - return r -} - -// skip ignores all input that matches the given predicate. -func (lx *lexer) skip(pred func(rune) bool) { - for { - r := lx.next() - if pred(r) { - continue - } - lx.backup() - lx.ignore() - return - } -} - -// errorf stops all lexing by emitting an error and returning `nil`. -// Note that any value that is a character is escaped if it's a special -// character (newlines, tabs, etc.). -func (lx *lexer) errorf(format string, values ...interface{}) stateFn { - lx.items <- item{ - itemError, - fmt.Sprintf(format, values...), - lx.line, - } - return nil -} - -// lexTop consumes elements at the top level of TOML data. -func lexTop(lx *lexer) stateFn { - r := lx.next() - if isWhitespace(r) || isNL(r) { - return lexSkip(lx, lexTop) - } - switch r { - case commentStart: - lx.push(lexTop) - return lexCommentStart - case tableStart: - return lexTableStart - case eof: - if lx.pos > lx.start { - return lx.errorf("unexpected EOF") - } - lx.emit(itemEOF) - return nil - } - - // At this point, the only valid item can be a key, so we back up - // and let the key lexer do the rest. - lx.backup() - lx.push(lexTopEnd) - return lexKeyStart -} - -// lexTopEnd is entered whenever a top-level item has been consumed. (A value -// or a table.) It must see only whitespace, and will turn back to lexTop -// upon a newline. If it sees EOF, it will quit the lexer successfully. -func lexTopEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case r == commentStart: - // a comment will read to a newline for us. - lx.push(lexTop) - return lexCommentStart - case isWhitespace(r): - return lexTopEnd - case isNL(r): - lx.ignore() - return lexTop - case r == eof: - lx.emit(itemEOF) - return nil - } - return lx.errorf("expected a top-level item to end with a newline, "+ - "comment, or EOF, but got %q instead", r) -} - -// lexTable lexes the beginning of a table. Namely, it makes sure that -// it starts with a character other than '.' and ']'. -// It assumes that '[' has already been consumed. -// It also handles the case that this is an item in an array of tables. -// e.g., '[[name]]'. -func lexTableStart(lx *lexer) stateFn { - if lx.peek() == arrayTableStart { - lx.next() - lx.emit(itemArrayTableStart) - lx.push(lexArrayTableEnd) - } else { - lx.emit(itemTableStart) - lx.push(lexTableEnd) - } - return lexTableNameStart -} - -func lexTableEnd(lx *lexer) stateFn { - lx.emit(itemTableEnd) - return lexTopEnd -} - -func lexArrayTableEnd(lx *lexer) stateFn { - if r := lx.next(); r != arrayTableEnd { - return lx.errorf("expected end of table array name delimiter %q, "+ - "but got %q instead", arrayTableEnd, r) - } - lx.emit(itemArrayTableEnd) - return lexTopEnd -} - -func lexTableNameStart(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.peek(); { - case r == tableEnd || r == eof: - return lx.errorf("unexpected end of table name " + - "(table names cannot be empty)") - case r == tableSep: - return lx.errorf("unexpected table separator " + - "(table names cannot be empty)") - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.push(lexTableNameEnd) - return lexValue // reuse string lexing - default: - return lexBareTableName - } -} - -// lexBareTableName lexes the name of a table. It assumes that at least one -// valid character for the table has already been read. -func lexBareTableName(lx *lexer) stateFn { - r := lx.next() - if isBareKeyChar(r) { - return lexBareTableName - } - lx.backup() - lx.emit(itemText) - return lexTableNameEnd -} - -// lexTableNameEnd reads the end of a piece of a table name, optionally -// consuming whitespace. -func lexTableNameEnd(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.next(); { - case isWhitespace(r): - return lexTableNameEnd - case r == tableSep: - lx.ignore() - return lexTableNameStart - case r == tableEnd: - return lx.pop() - default: - return lx.errorf("expected '.' or ']' to end table name, "+ - "but got %q instead", r) - } -} - -// lexKeyStart consumes a key name up until the first non-whitespace character. -// lexKeyStart will ignore whitespace. -func lexKeyStart(lx *lexer) stateFn { - r := lx.peek() - switch { - case r == keySep: - return lx.errorf("unexpected key separator %q", keySep) - case isWhitespace(r) || isNL(r): - lx.next() - return lexSkip(lx, lexKeyStart) - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.emit(itemKeyStart) - lx.push(lexKeyEnd) - return lexValue // reuse string lexing - default: - lx.ignore() - lx.emit(itemKeyStart) - return lexBareKey - } -} - -// lexBareKey consumes the text of a bare key. Assumes that the first character -// (which is not whitespace) has not yet been consumed. -func lexBareKey(lx *lexer) stateFn { - switch r := lx.next(); { - case isBareKeyChar(r): - return lexBareKey - case isWhitespace(r): - lx.backup() - lx.emit(itemText) - return lexKeyEnd - case r == keySep: - lx.backup() - lx.emit(itemText) - return lexKeyEnd - default: - return lx.errorf("bare keys cannot contain %q", r) - } -} - -// lexKeyEnd consumes the end of a key and trims whitespace (up to the key -// separator). -func lexKeyEnd(lx *lexer) stateFn { - switch r := lx.next(); { - case r == keySep: - return lexSkip(lx, lexValue) - case isWhitespace(r): - return lexSkip(lx, lexKeyEnd) - default: - return lx.errorf("expected key separator %q, but got %q instead", - keySep, r) - } -} - -// lexValue starts the consumption of a value anywhere a value is expected. -// lexValue will ignore whitespace. -// After a value is lexed, the last state on the next is popped and returned. -func lexValue(lx *lexer) stateFn { - // We allow whitespace to precede a value, but NOT newlines. - // In array syntax, the array states are responsible for ignoring newlines. - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexValue) - case isDigit(r): - lx.backup() // avoid an extra state and use the same as above - return lexNumberOrDateStart - } - switch r { - case arrayStart: - lx.ignore() - lx.emit(itemArray) - return lexArrayValue - case inlineTableStart: - lx.ignore() - lx.emit(itemInlineTableStart) - return lexInlineTableValue - case stringStart: - if lx.accept(stringStart) { - if lx.accept(stringStart) { - lx.ignore() // Ignore """ - return lexMultilineString - } - lx.backup() - } - lx.ignore() // ignore the '"' - return lexString - case rawStringStart: - if lx.accept(rawStringStart) { - if lx.accept(rawStringStart) { - lx.ignore() // Ignore """ - return lexMultilineRawString - } - lx.backup() - } - lx.ignore() // ignore the "'" - return lexRawString - case '+', '-': - return lexNumberStart - case '.': // special error case, be kind to users - return lx.errorf("floats must start with a digit, not '.'") - } - if unicode.IsLetter(r) { - // Be permissive here; lexBool will give a nice error if the - // user wrote something like - // x = foo - // (i.e. not 'true' or 'false' but is something else word-like.) - lx.backup() - return lexBool - } - return lx.errorf("expected value but found %q instead", r) -} - -// lexArrayValue consumes one value in an array. It assumes that '[' or ',' -// have already been consumed. All whitespace and newlines are ignored. -func lexArrayValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValue) - case r == commentStart: - lx.push(lexArrayValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == arrayEnd: - // NOTE(caleb): The spec isn't clear about whether you can have - // a trailing comma or not, so we'll allow it. - return lexArrayEnd - } - - lx.backup() - lx.push(lexArrayValueEnd) - return lexValue -} - -// lexArrayValueEnd consumes everything between the end of an array value and -// the next value (or the end of the array): it ignores whitespace and newlines -// and expects either a ',' or a ']'. -func lexArrayValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValueEnd) - case r == commentStart: - lx.push(lexArrayValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexArrayValue // move on to the next value - case r == arrayEnd: - return lexArrayEnd - } - return lx.errorf( - "expected a comma or array terminator %q, but got %q instead", - arrayEnd, r, - ) -} - -// lexArrayEnd finishes the lexing of an array. -// It assumes that a ']' has just been consumed. -func lexArrayEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemArrayEnd) - return lx.pop() -} - -// lexInlineTableValue consumes one key/value pair in an inline table. -// It assumes that '{' or ',' have already been consumed. Whitespace is ignored. -func lexInlineTableValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValue) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == inlineTableEnd: - return lexInlineTableEnd - } - lx.backup() - lx.push(lexInlineTableValueEnd) - return lexKeyStart -} - -// lexInlineTableValueEnd consumes everything between the end of an inline table -// key/value pair and the next pair (or the end of the table): -// it ignores whitespace and expects either a ',' or a '}'. -func lexInlineTableValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValueEnd) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexInlineTableValue - case r == inlineTableEnd: - return lexInlineTableEnd - } - return lx.errorf("expected a comma or an inline table terminator %q, "+ - "but got %q instead", inlineTableEnd, r) -} - -// lexInlineTableEnd finishes the lexing of an inline table. -// It assumes that a '}' has just been consumed. -func lexInlineTableEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemInlineTableEnd) - return lx.pop() -} - -// lexString consumes the inner contents of a string. It assumes that the -// beginning '"' has already been consumed and ignored. -func lexString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == '\\': - lx.push(lexString) - return lexStringEscape - case r == stringEnd: - lx.backup() - lx.emit(itemString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexString -} - -// lexMultilineString consumes the inner contents of a string. It assumes that -// the beginning '"""' has already been consumed and ignored. -func lexMultilineString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case '\\': - return lexMultilineStringEscape - case stringEnd: - if lx.accept(stringEnd) { - if lx.accept(stringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineString -} - -// lexRawString consumes a raw string. Nothing can be escaped in such a string. -// It assumes that the beginning "'" has already been consumed and ignored. -func lexRawString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == rawStringEnd: - lx.backup() - lx.emit(itemRawString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexRawString -} - -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning "'''" has already been consumed and -// ignored. -func lexMultilineRawString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case rawStringEnd: - if lx.accept(rawStringEnd) { - if lx.accept(rawStringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemRawMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineRawString -} - -// lexMultilineStringEscape consumes an escaped character. It assumes that the -// preceding '\\' has already been consumed. -func lexMultilineStringEscape(lx *lexer) stateFn { - // Handle the special case first: - if isNL(lx.next()) { - return lexMultilineString - } - lx.backup() - lx.push(lexMultilineString) - return lexStringEscape(lx) -} - -func lexStringEscape(lx *lexer) stateFn { - r := lx.next() - switch r { - case 'b': - fallthrough - case 't': - fallthrough - case 'n': - fallthrough - case 'f': - fallthrough - case 'r': - fallthrough - case '"': - fallthrough - case '\\': - return lx.pop() - case 'u': - return lexShortUnicodeEscape - case 'U': - return lexLongUnicodeEscape - } - return lx.errorf("invalid escape character %q; only the following "+ - "escape characters are allowed: "+ - `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) -} - -func lexShortUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 4; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected four hexadecimal digits after '\u', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -func lexLongUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 8; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected eight hexadecimal digits after '\U', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -// lexNumberOrDateStart consumes either an integer, a float, or datetime. -func lexNumberOrDateStart(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '_': - return lexNumber - case 'e', 'E': - return lexFloat - case '.': - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) -} - -// lexNumberOrDate consumes either an integer, float or datetime. -func lexNumberOrDate(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '-': - return lexDatetime - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexDatetime consumes a Datetime, to a first approximation. -// The parser validates that it matches one of the accepted formats. -func lexDatetime(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexDatetime - } - switch r { - case '-', 'T', ':', '.', 'Z': - return lexDatetime - } - - lx.backup() - lx.emit(itemDatetime) - return lx.pop() -} - -// lexNumberStart consumes either an integer or a float. It assumes that a sign -// has already been read, but that *no* digits have been consumed. -// lexNumberStart will move to the appropriate integer or float states. -func lexNumberStart(lx *lexer) stateFn { - // We MUST see a digit. Even floats have to start with a digit. - r := lx.next() - if !isDigit(r) { - if r == '.' { - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) - } - return lexNumber -} - -// lexNumber consumes an integer or a float after seeing the first digit. -func lexNumber(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumber - } - switch r { - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexFloat consumes the elements of a float. It allows any sequence of -// float-like characters, so floats emitted by the lexer are only a first -// approximation and must be validated by the parser. -func lexFloat(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexFloat - } - switch r { - case '_', '.', '-', '+', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemFloat) - return lx.pop() -} - -// lexBool consumes a bool string: 'true' or 'false. -func lexBool(lx *lexer) stateFn { - var rs []rune - for { - r := lx.next() - if !unicode.IsLetter(r) { - lx.backup() - break - } - rs = append(rs, r) - } - s := string(rs) - switch s { - case "true", "false": - lx.emit(itemBool) - return lx.pop() - } - return lx.errorf("expected value but found %q instead", s) -} - -// lexCommentStart begins the lexing of a comment. It will emit -// itemCommentStart and consume no characters, passing control to lexComment. -func lexCommentStart(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemCommentStart) - return lexComment -} - -// lexComment lexes an entire comment. It assumes that '#' has been consumed. -// It will consume *up to* the first newline character, and pass control -// back to the last state on the stack. -func lexComment(lx *lexer) stateFn { - r := lx.peek() - if isNL(r) || r == eof { - lx.emit(itemText) - return lx.pop() - } - lx.next() - return lexComment -} - -// lexSkip ignores all slurped input and moves on to the next state. -func lexSkip(lx *lexer, nextState stateFn) stateFn { - return func(lx *lexer) stateFn { - lx.ignore() - return nextState - } -} - -// isWhitespace returns true if `r` is a whitespace character according -// to the spec. -func isWhitespace(r rune) bool { - return r == '\t' || r == ' ' -} - -func isNL(r rune) bool { - return r == '\n' || r == '\r' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -func isHexadecimal(r rune) bool { - return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') -} - -func isBareKeyChar(r rune) bool { - return (r >= 'A' && r <= 'Z') || - (r >= 'a' && r <= 'z') || - (r >= '0' && r <= '9') || - r == '_' || - r == '-' -} - -func (itype itemType) String() string { - switch itype { - case itemError: - return "Error" - case itemNIL: - return "NIL" - case itemEOF: - return "EOF" - case itemText: - return "Text" - case itemString, itemRawString, itemMultilineString, itemRawMultilineString: - return "String" - case itemBool: - return "Bool" - case itemInteger: - return "Integer" - case itemFloat: - return "Float" - case itemDatetime: - return "DateTime" - case itemTableStart: - return "TableStart" - case itemTableEnd: - return "TableEnd" - case itemKeyStart: - return "KeyStart" - case itemArray: - return "Array" - case itemArrayEnd: - return "ArrayEnd" - case itemCommentStart: - return "CommentStart" - } - panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) -} - -func (item item) String() string { - return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) -} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go deleted file mode 100644 index 50869ef9..00000000 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ /dev/null @@ -1,592 +0,0 @@ -package toml - -import ( - "fmt" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -type parser struct { - mapping map[string]interface{} - types map[string]tomlType - lx *lexer - - // A list of keys in the order that they appear in the TOML data. - ordered []Key - - // the full key for the current hash in scope - context Key - - // the base key name for everything except hashes - currentKey string - - // rough approximation of line number - approxLine int - - // A map of 'key.group.names' to whether they were created implicitly. - implicits map[string]bool -} - -type parseError string - -func (pe parseError) Error() string { - return string(pe) -} - -func parse(data string) (p *parser, err error) { - defer func() { - if r := recover(); r != nil { - var ok bool - if err, ok = r.(parseError); ok { - return - } - panic(r) - } - }() - - p = &parser{ - mapping: make(map[string]interface{}), - types: make(map[string]tomlType), - lx: lex(data), - ordered: make([]Key, 0), - implicits: make(map[string]bool), - } - for { - item := p.next() - if item.typ == itemEOF { - break - } - p.topLevel(item) - } - - return p, nil -} - -func (p *parser) panicf(format string, v ...interface{}) { - msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", - p.approxLine, p.current(), fmt.Sprintf(format, v...)) - panic(parseError(msg)) -} - -func (p *parser) next() item { - it := p.lx.nextItem() - if it.typ == itemError { - p.panicf("%s", it.val) - } - return it -} - -func (p *parser) bug(format string, v ...interface{}) { - panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) -} - -func (p *parser) expect(typ itemType) item { - it := p.next() - p.assertEqual(typ, it.typ) - return it -} - -func (p *parser) assertEqual(expected, got itemType) { - if expected != got { - p.bug("Expected '%s' but got '%s'.", expected, got) - } -} - -func (p *parser) topLevel(item item) { - switch item.typ { - case itemCommentStart: - p.approxLine = item.line - p.expect(itemText) - case itemTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemTableEnd, kg.typ) - - p.establishContext(key, false) - p.setType("", tomlHash) - p.ordered = append(p.ordered, key) - case itemArrayTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemArrayTableEnd, kg.typ) - - p.establishContext(key, true) - p.setType("", tomlArrayHash) - p.ordered = append(p.ordered, key) - case itemKeyStart: - kname := p.next() - p.approxLine = kname.line - p.currentKey = p.keyString(kname) - - val, typ := p.value(p.next()) - p.setValue(p.currentKey, val) - p.setType(p.currentKey, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - p.currentKey = "" - default: - p.bug("Unexpected type at top level: %s", item.typ) - } -} - -// Gets a string for a key (or part of a key in a table name). -func (p *parser) keyString(it item) string { - switch it.typ { - case itemText: - return it.val - case itemString, itemMultilineString, - itemRawString, itemRawMultilineString: - s, _ := p.value(it) - return s.(string) - default: - p.bug("Unexpected key type: %s", it.typ) - panic("unreachable") - } -} - -// value translates an expected value from the lexer into a Go value wrapped -// as an empty interface. -func (p *parser) value(it item) (interface{}, tomlType) { - switch it.typ { - case itemString: - return p.replaceEscapes(it.val), p.typeOfPrimitive(it) - case itemMultilineString: - trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) - return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) - case itemRawString: - return it.val, p.typeOfPrimitive(it) - case itemRawMultilineString: - return stripFirstNewline(it.val), p.typeOfPrimitive(it) - case itemBool: - switch it.val { - case "true": - return true, p.typeOfPrimitive(it) - case "false": - return false, p.typeOfPrimitive(it) - } - p.bug("Expected boolean value, but got '%s'.", it.val) - case itemInteger: - if !numUnderscoresOK(it.val) { - p.panicf("Invalid integer %q: underscores must be surrounded by digits", - it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseInt(val, 10, 64) - if err != nil { - // Distinguish integer values. Normally, it'd be a bug if the lexer - // provides an invalid integer, but it's possible that the number is - // out of range of valid values (which the lexer cannot determine). - // So mark the former as a bug but the latter as a legitimate user - // error. - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Integer '%s' is out of the range of 64-bit "+ - "signed integers.", it.val) - } else { - p.bug("Expected integer value, but got '%s'.", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemFloat: - parts := strings.FieldsFunc(it.val, func(r rune) bool { - switch r { - case '.', 'e', 'E': - return true - } - return false - }) - for _, part := range parts { - if !numUnderscoresOK(part) { - p.panicf("Invalid float %q: underscores must be "+ - "surrounded by digits", it.val) - } - } - if !numPeriodsOK(it.val) { - // As a special case, numbers like '123.' or '1.e2', - // which are valid as far as Go/strconv are concerned, - // must be rejected because TOML says that a fractional - // part consists of '.' followed by 1+ digits. - p.panicf("Invalid float %q: '.' must be followed "+ - "by one or more digits", it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseFloat(val, 64) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Float '%s' is out of the range of 64-bit "+ - "IEEE-754 floating-point numbers.", it.val) - } else { - p.panicf("Invalid float value: %q", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemDatetime: - var t time.Time - var ok bool - var err error - for _, format := range []string{ - "2006-01-02T15:04:05Z07:00", - "2006-01-02T15:04:05", - "2006-01-02", - } { - t, err = time.ParseInLocation(format, it.val, time.Local) - if err == nil { - ok = true - break - } - } - if !ok { - p.panicf("Invalid TOML Datetime: %q.", it.val) - } - return t, p.typeOfPrimitive(it) - case itemArray: - array := make([]interface{}, 0) - types := make([]tomlType, 0) - - for it = p.next(); it.typ != itemArrayEnd; it = p.next() { - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - val, typ := p.value(it) - array = append(array, val) - types = append(types, typ) - } - return array, p.typeOfArray(types) - case itemInlineTableStart: - var ( - hash = make(map[string]interface{}) - outerContext = p.context - outerKey = p.currentKey - ) - - p.context = append(p.context, p.currentKey) - p.currentKey = "" - for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { - if it.typ != itemKeyStart { - p.bug("Expected key start but instead found %q, around line %d", - it.val, p.approxLine) - } - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - // retrieve key - k := p.next() - p.approxLine = k.line - kname := p.keyString(k) - - // retrieve value - p.currentKey = kname - val, typ := p.value(p.next()) - // make sure we keep metadata up to date - p.setType(kname, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - hash[kname] = val - } - p.context = outerContext - p.currentKey = outerKey - return hash, tomlHash - } - p.bug("Unexpected value type: %s", it.typ) - panic("unreachable") -} - -// numUnderscoresOK checks whether each underscore in s is surrounded by -// characters that are not underscores. -func numUnderscoresOK(s string) bool { - accept := false - for _, r := range s { - if r == '_' { - if !accept { - return false - } - accept = false - continue - } - accept = true - } - return accept -} - -// numPeriodsOK checks whether every period in s is followed by a digit. -func numPeriodsOK(s string) bool { - period := false - for _, r := range s { - if period && !isDigit(r) { - return false - } - period = r == '.' - } - return !period -} - -// establishContext sets the current context of the parser, -// where the context is either a hash or an array of hashes. Which one is -// set depends on the value of the `array` parameter. -// -// Establishing the context also makes sure that the key isn't a duplicate, and -// will create implicit hashes automatically. -func (p *parser) establishContext(key Key, array bool) { - var ok bool - - // Always start at the top level and drill down for our context. - hashContext := p.mapping - keyContext := make(Key, 0) - - // We only need implicit hashes for key[0:-1] - for _, k := range key[0 : len(key)-1] { - _, ok = hashContext[k] - keyContext = append(keyContext, k) - - // No key? Make an implicit hash and move on. - if !ok { - p.addImplicit(keyContext) - hashContext[k] = make(map[string]interface{}) - } - - // If the hash context is actually an array of tables, then set - // the hash context to the last element in that array. - // - // Otherwise, it better be a table, since this MUST be a key group (by - // virtue of it not being the last element in a key). - switch t := hashContext[k].(type) { - case []map[string]interface{}: - hashContext = t[len(t)-1] - case map[string]interface{}: - hashContext = t - default: - p.panicf("Key '%s' was already created as a hash.", keyContext) - } - } - - p.context = keyContext - if array { - // If this is the first element for this array, then allocate a new - // list of tables for it. - k := key[len(key)-1] - if _, ok := hashContext[k]; !ok { - hashContext[k] = make([]map[string]interface{}, 0, 5) - } - - // Add a new table. But make sure the key hasn't already been used - // for something else. - if hash, ok := hashContext[k].([]map[string]interface{}); ok { - hashContext[k] = append(hash, make(map[string]interface{})) - } else { - p.panicf("Key '%s' was already created and cannot be used as "+ - "an array.", keyContext) - } - } else { - p.setValue(key[len(key)-1], make(map[string]interface{})) - } - p.context = append(p.context, key[len(key)-1]) -} - -// setValue sets the given key to the given value in the current context. -// It will make sure that the key hasn't already been defined, account for -// implicit key groups. -func (p *parser) setValue(key string, value interface{}) { - var tmpHash interface{} - var ok bool - - hash := p.mapping - keyContext := make(Key, 0) - for _, k := range p.context { - keyContext = append(keyContext, k) - if tmpHash, ok = hash[k]; !ok { - p.bug("Context for key '%s' has not been established.", keyContext) - } - switch t := tmpHash.(type) { - case []map[string]interface{}: - // The context is a table of hashes. Pick the most recent table - // defined as the current hash. - hash = t[len(t)-1] - case map[string]interface{}: - hash = t - default: - p.bug("Expected hash to have type 'map[string]interface{}', but "+ - "it has '%T' instead.", tmpHash) - } - } - keyContext = append(keyContext, key) - - if _, ok := hash[key]; ok { - // Typically, if the given key has already been set, then we have - // to raise an error since duplicate keys are disallowed. However, - // it's possible that a key was previously defined implicitly. In this - // case, it is allowed to be redefined concretely. (See the - // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) - // - // But we have to make sure to stop marking it as an implicit. (So that - // another redefinition provokes an error.) - // - // Note that since it has already been defined (as a hash), we don't - // want to overwrite it. So our business is done. - if p.isImplicit(keyContext) { - p.removeImplicit(keyContext) - return - } - - // Otherwise, we have a concrete key trying to override a previous - // key, which is *always* wrong. - p.panicf("Key '%s' has already been defined.", keyContext) - } - hash[key] = value -} - -// setType sets the type of a particular value at a given key. -// It should be called immediately AFTER setValue. -// -// Note that if `key` is empty, then the type given will be applied to the -// current context (which is either a table or an array of tables). -func (p *parser) setType(key string, typ tomlType) { - keyContext := make(Key, 0, len(p.context)+1) - for _, k := range p.context { - keyContext = append(keyContext, k) - } - if len(key) > 0 { // allow type setting for hashes - keyContext = append(keyContext, key) - } - p.types[keyContext.String()] = typ -} - -// addImplicit sets the given Key as having been created implicitly. -func (p *parser) addImplicit(key Key) { - p.implicits[key.String()] = true -} - -// removeImplicit stops tagging the given key as having been implicitly -// created. -func (p *parser) removeImplicit(key Key) { - p.implicits[key.String()] = false -} - -// isImplicit returns true if the key group pointed to by the key was created -// implicitly. -func (p *parser) isImplicit(key Key) bool { - return p.implicits[key.String()] -} - -// current returns the full key name of the current context. -func (p *parser) current() string { - if len(p.currentKey) == 0 { - return p.context.String() - } - if len(p.context) == 0 { - return p.currentKey - } - return fmt.Sprintf("%s.%s", p.context, p.currentKey) -} - -func stripFirstNewline(s string) string { - if len(s) == 0 || s[0] != '\n' { - return s - } - return s[1:] -} - -func stripEscapedWhitespace(s string) string { - esc := strings.Split(s, "\\\n") - if len(esc) > 1 { - for i := 1; i < len(esc); i++ { - esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) - } - } - return strings.Join(esc, "") -} - -func (p *parser) replaceEscapes(str string) string { - var replaced []rune - s := []byte(str) - r := 0 - for r < len(s) { - if s[r] != '\\' { - c, size := utf8.DecodeRune(s[r:]) - r += size - replaced = append(replaced, c) - continue - } - r += 1 - if r >= len(s) { - p.bug("Escape sequence at end of string.") - return "" - } - switch s[r] { - default: - p.bug("Expected valid escape code after \\, but got %q.", s[r]) - return "" - case 'b': - replaced = append(replaced, rune(0x0008)) - r += 1 - case 't': - replaced = append(replaced, rune(0x0009)) - r += 1 - case 'n': - replaced = append(replaced, rune(0x000A)) - r += 1 - case 'f': - replaced = append(replaced, rune(0x000C)) - r += 1 - case 'r': - replaced = append(replaced, rune(0x000D)) - r += 1 - case '"': - replaced = append(replaced, rune(0x0022)) - r += 1 - case '\\': - replaced = append(replaced, rune(0x005C)) - r += 1 - case 'u': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+5). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) - replaced = append(replaced, escaped) - r += 5 - case 'U': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+9). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) - replaced = append(replaced, escaped) - r += 9 - } - } - return string(replaced) -} - -func (p *parser) asciiEscapeToUnicode(bs []byte) rune { - s := string(bs) - hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) - if err != nil { - p.bug("Could not parse '%s' as a hexadecimal number, but the "+ - "lexer claims it's OK: %s", s, err) - } - if !utf8.ValidRune(rune(hex)) { - p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) - } - return rune(hex) -} - -func isStringType(ty itemType) bool { - return ty == itemString || ty == itemMultilineString || - ty == itemRawString || ty == itemRawMultilineString -} diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go deleted file mode 100644 index c73f8afc..00000000 --- a/vendor/github.com/BurntSushi/toml/type_check.go +++ /dev/null @@ -1,91 +0,0 @@ -package toml - -// tomlType represents any Go type that corresponds to a TOML type. -// While the first draft of the TOML spec has a simplistic type system that -// probably doesn't need this level of sophistication, we seem to be militating -// toward adding real composite types. -type tomlType interface { - typeString() string -} - -// typeEqual accepts any two types and returns true if they are equal. -func typeEqual(t1, t2 tomlType) bool { - if t1 == nil || t2 == nil { - return false - } - return t1.typeString() == t2.typeString() -} - -func typeIsHash(t tomlType) bool { - return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) -} - -type tomlBaseType string - -func (btype tomlBaseType) typeString() string { - return string(btype) -} - -func (btype tomlBaseType) String() string { - return btype.typeString() -} - -var ( - tomlInteger tomlBaseType = "Integer" - tomlFloat tomlBaseType = "Float" - tomlDatetime tomlBaseType = "Datetime" - tomlString tomlBaseType = "String" - tomlBool tomlBaseType = "Bool" - tomlArray tomlBaseType = "Array" - tomlHash tomlBaseType = "Hash" - tomlArrayHash tomlBaseType = "ArrayHash" -) - -// typeOfPrimitive returns a tomlType of any primitive value in TOML. -// Primitive values are: Integer, Float, Datetime, String and Bool. -// -// Passing a lexer item other than the following will cause a BUG message -// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. -func (p *parser) typeOfPrimitive(lexItem item) tomlType { - switch lexItem.typ { - case itemInteger: - return tomlInteger - case itemFloat: - return tomlFloat - case itemDatetime: - return tomlDatetime - case itemString: - return tomlString - case itemMultilineString: - return tomlString - case itemRawString: - return tomlString - case itemRawMultilineString: - return tomlString - case itemBool: - return tomlBool - } - p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) - panic("unreachable") -} - -// typeOfArray returns a tomlType for an array given a list of types of its -// values. -// -// In the current spec, if an array is homogeneous, then its type is always -// "Array". If the array is not homogeneous, an error is generated. -func (p *parser) typeOfArray(types []tomlType) tomlType { - // Empty arrays are cool. - if len(types) == 0 { - return tomlArray - } - - theType := types[0] - for _, t := range types[1:] { - if !typeEqual(theType, t) { - p.panicf("Array contains values of type '%s' and '%s', but "+ - "arrays must be homogeneous.", theType, t) - } - } - return tomlArray -} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go deleted file mode 100644 index 608997c2..00000000 --- a/vendor/github.com/BurntSushi/toml/type_fields.go +++ /dev/null @@ -1,242 +0,0 @@ -package toml - -// Struct field handling is adapted from code in encoding/json: -// -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the Go distribution. - -import ( - "reflect" - "sort" - "sync" -) - -// A field represents a single field found in a struct. -type field struct { - name string // the name of the field (`toml` tag included) - tag bool // whether field has a `toml` tag - index []int // represents the depth of an anonymous field - typ reflect.Type // the type of the field -} - -// byName sorts field by name, breaking ties with depth, -// then breaking ties with "name came from toml tag", then -// breaking ties with index sequence. -type byName []field - -func (x byName) Len() int { return len(x) } - -func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byName) Less(i, j int) bool { - if x[i].name != x[j].name { - return x[i].name < x[j].name - } - if len(x[i].index) != len(x[j].index) { - return len(x[i].index) < len(x[j].index) - } - if x[i].tag != x[j].tag { - return x[i].tag - } - return byIndex(x).Less(i, j) -} - -// byIndex sorts field by index sequence. -type byIndex []field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - for k, xik := range x[i].index { - if k >= len(x[j].index) { - return false - } - if xik != x[j].index[k] { - return xik < x[j].index[k] - } - } - return len(x[i].index) < len(x[j].index) -} - -// typeFields returns a list of fields that TOML should recognize for the given -// type. The algorithm is breadth-first search over the set of structs to -// include - the top struct and then any reachable anonymous structs. -func typeFields(t reflect.Type) []field { - // Anonymous fields to explore at the current level and the next. - current := []field{} - next := []field{{typ: t}} - - // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} - - // Types already visited at an earlier level. - visited := map[reflect.Type]bool{} - - // Fields found. - var fields []field - - for len(next) > 0 { - current, next = next, current[:0] - count, nextCount = nextCount, map[reflect.Type]int{} - - for _, f := range current { - if visited[f.typ] { - continue - } - visited[f.typ] = true - - // Scan f.typ for fields to include. - for i := 0; i < f.typ.NumField(); i++ { - sf := f.typ.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - opts := getOptions(sf.Tag) - if opts.skip { - continue - } - index := make([]int, len(f.index)+1) - copy(index, f.index) - index[len(f.index)] = i - - ft := sf.Type - if ft.Name() == "" && ft.Kind() == reflect.Ptr { - // Follow pointer. - ft = ft.Elem() - } - - // Record found field and index sequence. - if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { - tagged := opts.name != "" - name := opts.name - if name == "" { - name = sf.Name - } - fields = append(fields, field{name, tagged, index, ft}) - if count[f.typ] > 1 { - // If there were multiple instances, add a second, - // so that the annihilation code will see a duplicate. - // It only cares about the distinction between 1 or 2, - // so don't bother generating any more copies. - fields = append(fields, fields[len(fields)-1]) - } - continue - } - - // Record new anonymous struct to explore in next round. - nextCount[ft]++ - if nextCount[ft] == 1 { - f := field{name: ft.Name(), index: index, typ: ft} - next = append(next, f) - } - } - } - } - - sort.Sort(byName(fields)) - - // Delete all fields that are hidden by the Go rules for embedded fields, - // except that fields with TOML tags are promoted. - - // The fields are sorted in primary order of name, secondary order - // of field index length. Loop over names; for each name, delete - // hidden fields by choosing the one dominant field that survives. - out := fields[:0] - for advance, i := 0, 0; i < len(fields); i += advance { - // One iteration per name. - // Find the sequence of fields with the name of this first field. - fi := fields[i] - name := fi.name - for advance = 1; i+advance < len(fields); advance++ { - fj := fields[i+advance] - if fj.name != name { - break - } - } - if advance == 1 { // Only one field with this name - out = append(out, fi) - continue - } - dominant, ok := dominantField(fields[i : i+advance]) - if ok { - out = append(out, dominant) - } - } - - fields = out - sort.Sort(byIndex(fields)) - - return fields -} - -// dominantField looks through the fields, all of which are known to -// have the same name, to find the single field that dominates the -// others using Go's embedding rules, modified by the presence of -// TOML tags. If there are multiple top-level fields, the boolean -// will be false: This condition is an error in Go and we skip all -// the fields. -func dominantField(fields []field) (field, bool) { - // The fields are sorted in increasing index-length order. The winner - // must therefore be one with the shortest index length. Drop all - // longer entries, which is easy: just truncate the slice. - length := len(fields[0].index) - tagged := -1 // Index of first tagged field. - for i, f := range fields { - if len(f.index) > length { - fields = fields[:i] - break - } - if f.tag { - if tagged >= 0 { - // Multiple tagged fields at the same level: conflict. - // Return no field. - return field{}, false - } - tagged = i - } - } - if tagged >= 0 { - return fields[tagged], true - } - // All remaining fields have the same length. If there's more than one, - // we have a conflict (two fields named "X" at the same level) and we - // return no field. - if len(fields) > 1 { - return field{}, false - } - return fields[0], true -} - -var fieldCache struct { - sync.RWMutex - m map[reflect.Type][]field -} - -// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -func cachedTypeFields(t reflect.Type) []field { - fieldCache.RLock() - f := fieldCache.m[t] - fieldCache.RUnlock() - if f != nil { - return f - } - - // Compute fields without lock. - // Might duplicate effort but won't hold other computations back. - f = typeFields(t) - if f == nil { - f = []field{} - } - - fieldCache.Lock() - if fieldCache.m == nil { - fieldCache.m = map[reflect.Type][]field{} - } - fieldCache.m[t] = f - fieldCache.Unlock() - return f -} diff --git a/vendor/github.com/juju/errors/LICENSE b/vendor/github.com/juju/errors/LICENSE deleted file mode 100644 index ade9307b..00000000 --- a/vendor/github.com/juju/errors/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -All files in this repository are licensed as follows. If you contribute -to this repository, it is assumed that you license your contribution -under the same license unless you state otherwise. - -All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. - -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/github.com/juju/errors/doc.go b/vendor/github.com/juju/errors/doc.go deleted file mode 100644 index 35b119aa..00000000 --- a/vendor/github.com/juju/errors/doc.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013, 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -/* -[godoc-link-here] - -The juju/errors provides an easy way to annotate errors without losing the -orginal error context. - -The exported `New` and `Errorf` functions are designed to replace the -`errors.New` and `fmt.Errorf` functions respectively. The same underlying -error is there, but the package also records the location at which the error -was created. - -A primary use case for this library is to add extra context any time an -error is returned from a function. - - if err := SomeFunc(); err != nil { - return err - } - -This instead becomes: - - if err := SomeFunc(); err != nil { - return errors.Trace(err) - } - -which just records the file and line number of the Trace call, or - - if err := SomeFunc(); err != nil { - return errors.Annotate(err, "more context") - } - -which also adds an annotation to the error. - -When you want to check to see if an error is of a particular type, a helper -function is normally exported by the package that returned the error, like the -`os` package does. The underlying cause of the error is available using the -`Cause` function. - - os.IsNotExist(errors.Cause(err)) - -The result of the `Error()` call on an annotated error is the annotations joined -with colons, then the result of the `Error()` method for the underlying error -that was the cause. - - err := errors.Errorf("original") - err = errors.Annotatef(err, "context") - err = errors.Annotatef(err, "more context") - err.Error() -> "more context: context: original" - -Obviously recording the file, line and functions is not very useful if you -cannot get them back out again. - - errors.ErrorStack(err) - -will return something like: - - first error - github.com/juju/errors/annotation_test.go:193: - github.com/juju/errors/annotation_test.go:194: annotation - github.com/juju/errors/annotation_test.go:195: - github.com/juju/errors/annotation_test.go:196: more context - github.com/juju/errors/annotation_test.go:197: - -The first error was generated by an external system, so there was no location -associated. The second, fourth, and last lines were generated with Trace calls, -and the other two through Annotate. - -Sometimes when responding to an error you want to return a more specific error -for the situation. - - if err := FindField(field); err != nil { - return errors.Wrap(err, errors.NotFoundf(field)) - } - -This returns an error where the complete error stack is still available, and -`errors.Cause()` will return the `NotFound` error. - -*/ -package errors diff --git a/vendor/github.com/juju/errors/error.go b/vendor/github.com/juju/errors/error.go deleted file mode 100644 index b7df7358..00000000 --- a/vendor/github.com/juju/errors/error.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" - "reflect" - "runtime" -) - -// Err holds a description of an error along with information about -// where the error was created. -// -// It may be embedded in custom error types to add extra information that -// this errors package can understand. -type Err struct { - // message holds an annotation of the error. - message string - - // cause holds the cause of the error as returned - // by the Cause method. - cause error - - // previous holds the previous error in the error stack, if any. - previous error - - // file and line hold the source code location where the error was - // created. - file string - line int -} - -// NewErr is used to return an Err for the purpose of embedding in other -// structures. The location is not specified, and needs to be set with a call -// to SetLocation. -// -// For example: -// type FooError struct { -// errors.Err -// code int -// } -// -// func NewFooError(code int) error { -// err := &FooError{errors.NewErr("foo"), code} -// err.SetLocation(1) -// return err -// } -func NewErr(format string, args ...interface{}) Err { - return Err{ - message: fmt.Sprintf(format, args...), - } -} - -// NewErrWithCause is used to return an Err with case by other error for the purpose of embedding in other -// structures. The location is not specified, and needs to be set with a call -// to SetLocation. -// -// For example: -// type FooError struct { -// errors.Err -// code int -// } -// -// func (e *FooError) Annotate(format string, args ...interface{}) error { -// err := &FooError{errors.NewErrWithCause(e.Err, format, args...), e.code} -// err.SetLocation(1) -// return err -// }) -func NewErrWithCause(other error, format string, args ...interface{}) Err { - return Err{ - message: fmt.Sprintf(format, args...), - cause: Cause(other), - previous: other, - } -} - -// Location is the file and line of where the error was most recently -// created or annotated. -func (e *Err) Location() (filename string, line int) { - return e.file, e.line -} - -// Underlying returns the previous error in the error stack, if any. A client -// should not ever really call this method. It is used to build the error -// stack and should not be introspected by client calls. Or more -// specifically, clients should not depend on anything but the `Cause` of an -// error. -func (e *Err) Underlying() error { - return e.previous -} - -// The Cause of an error is the most recent error in the error stack that -// meets one of these criteria: the original error that was raised; the new -// error that was passed into the Wrap function; the most recently masked -// error; or nil if the error itself is considered the Cause. Normally this -// method is not invoked directly, but instead through the Cause stand alone -// function. -func (e *Err) Cause() error { - return e.cause -} - -// Message returns the message stored with the most recent location. This is -// the empty string if the most recent call was Trace, or the message stored -// with Annotate or Mask. -func (e *Err) Message() string { - return e.message -} - -// Error implements error.Error. -func (e *Err) Error() string { - // We want to walk up the stack of errors showing the annotations - // as long as the cause is the same. - err := e.previous - if !sameError(Cause(err), e.cause) && e.cause != nil { - err = e.cause - } - switch { - case err == nil: - return e.message - case e.message == "": - return err.Error() - } - return fmt.Sprintf("%s: %v", e.message, err) -} - -// Format implements fmt.Formatter -// When printing errors with %+v it also prints the stack trace. -// %#v unsurprisingly will print the real underlying type. -func (e *Err) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case s.Flag('+'): - fmt.Fprintf(s, "%s", ErrorStack(e)) - return - case s.Flag('#'): - // avoid infinite recursion by wrapping e into a type - // that doesn't implement Formatter. - fmt.Fprintf(s, "%#v", (*unformatter)(e)) - return - } - fallthrough - case 's': - fmt.Fprintf(s, "%s", e.Error()) - } -} - -// helper for Format -type unformatter Err - -func (unformatter) Format() { /* break the fmt.Formatter interface */ } - -// SetLocation records the source location of the error at callDepth stack -// frames above the call. -func (e *Err) SetLocation(callDepth int) { - _, file, line, _ := runtime.Caller(callDepth + 1) - e.file = trimGoPath(file) - e.line = line -} - -// StackTrace returns one string for each location recorded in the stack of -// errors. The first value is the originating error, with a line for each -// other annotation or tracing of the error. -func (e *Err) StackTrace() []string { - return errorStack(e) -} - -// Ideally we'd have a way to check identity, but deep equals will do. -func sameError(e1, e2 error) bool { - return reflect.DeepEqual(e1, e2) -} diff --git a/vendor/github.com/juju/errors/errortypes.go b/vendor/github.com/juju/errors/errortypes.go deleted file mode 100644 index 5faf1e22..00000000 --- a/vendor/github.com/juju/errors/errortypes.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" -) - -// wrap is a helper to construct an *wrapper. -func wrap(err error, format, suffix string, args ...interface{}) Err { - newErr := Err{ - message: fmt.Sprintf(format+suffix, args...), - previous: err, - } - newErr.SetLocation(2) - return newErr -} - -// timeout represents an error on timeout. -type timeout struct { - Err -} - -// Timeoutf returns an error which satisfies IsTimeout(). -func Timeoutf(format string, args ...interface{}) error { - return &timeout{wrap(nil, format, " timeout", args...)} -} - -// NewTimeout returns an error which wraps err that satisfies -// IsTimeout(). -func NewTimeout(err error, msg string) error { - return &timeout{wrap(err, msg, "")} -} - -// IsTimeout reports whether err was created with Timeoutf() or -// NewTimeout(). -func IsTimeout(err error) bool { - err = Cause(err) - _, ok := err.(*timeout) - return ok -} - -// notFound represents an error when something has not been found. -type notFound struct { - Err -} - -// NotFoundf returns an error which satisfies IsNotFound(). -func NotFoundf(format string, args ...interface{}) error { - return ¬Found{wrap(nil, format, " not found", args...)} -} - -// NewNotFound returns an error which wraps err that satisfies -// IsNotFound(). -func NewNotFound(err error, msg string) error { - return ¬Found{wrap(err, msg, "")} -} - -// IsNotFound reports whether err was created with NotFoundf() or -// NewNotFound(). -func IsNotFound(err error) bool { - err = Cause(err) - _, ok := err.(*notFound) - return ok -} - -// userNotFound represents an error when an inexistent user is looked up. -type userNotFound struct { - Err -} - -// UserNotFoundf returns an error which satisfies IsUserNotFound(). -func UserNotFoundf(format string, args ...interface{}) error { - return &userNotFound{wrap(nil, format, " user not found", args...)} -} - -// NewUserNotFound returns an error which wraps err and satisfies -// IsUserNotFound(). -func NewUserNotFound(err error, msg string) error { - return &userNotFound{wrap(err, msg, "")} -} - -// IsUserNotFound reports whether err was created with UserNotFoundf() or -// NewUserNotFound(). -func IsUserNotFound(err error) bool { - err = Cause(err) - _, ok := err.(*userNotFound) - return ok -} - -// unauthorized represents an error when an operation is unauthorized. -type unauthorized struct { - Err -} - -// Unauthorizedf returns an error which satisfies IsUnauthorized(). -func Unauthorizedf(format string, args ...interface{}) error { - return &unauthorized{wrap(nil, format, "", args...)} -} - -// NewUnauthorized returns an error which wraps err and satisfies -// IsUnauthorized(). -func NewUnauthorized(err error, msg string) error { - return &unauthorized{wrap(err, msg, "")} -} - -// IsUnauthorized reports whether err was created with Unauthorizedf() or -// NewUnauthorized(). -func IsUnauthorized(err error) bool { - err = Cause(err) - _, ok := err.(*unauthorized) - return ok -} - -// notImplemented represents an error when something is not -// implemented. -type notImplemented struct { - Err -} - -// NotImplementedf returns an error which satisfies IsNotImplemented(). -func NotImplementedf(format string, args ...interface{}) error { - return ¬Implemented{wrap(nil, format, " not implemented", args...)} -} - -// NewNotImplemented returns an error which wraps err and satisfies -// IsNotImplemented(). -func NewNotImplemented(err error, msg string) error { - return ¬Implemented{wrap(err, msg, "")} -} - -// IsNotImplemented reports whether err was created with -// NotImplementedf() or NewNotImplemented(). -func IsNotImplemented(err error) bool { - err = Cause(err) - _, ok := err.(*notImplemented) - return ok -} - -// alreadyExists represents and error when something already exists. -type alreadyExists struct { - Err -} - -// AlreadyExistsf returns an error which satisfies IsAlreadyExists(). -func AlreadyExistsf(format string, args ...interface{}) error { - return &alreadyExists{wrap(nil, format, " already exists", args...)} -} - -// NewAlreadyExists returns an error which wraps err and satisfies -// IsAlreadyExists(). -func NewAlreadyExists(err error, msg string) error { - return &alreadyExists{wrap(err, msg, "")} -} - -// IsAlreadyExists reports whether the error was created with -// AlreadyExistsf() or NewAlreadyExists(). -func IsAlreadyExists(err error) bool { - err = Cause(err) - _, ok := err.(*alreadyExists) - return ok -} - -// notSupported represents an error when something is not supported. -type notSupported struct { - Err -} - -// NotSupportedf returns an error which satisfies IsNotSupported(). -func NotSupportedf(format string, args ...interface{}) error { - return ¬Supported{wrap(nil, format, " not supported", args...)} -} - -// NewNotSupported returns an error which wraps err and satisfies -// IsNotSupported(). -func NewNotSupported(err error, msg string) error { - return ¬Supported{wrap(err, msg, "")} -} - -// IsNotSupported reports whether the error was created with -// NotSupportedf() or NewNotSupported(). -func IsNotSupported(err error) bool { - err = Cause(err) - _, ok := err.(*notSupported) - return ok -} - -// notValid represents an error when something is not valid. -type notValid struct { - Err -} - -// NotValidf returns an error which satisfies IsNotValid(). -func NotValidf(format string, args ...interface{}) error { - return ¬Valid{wrap(nil, format, " not valid", args...)} -} - -// NewNotValid returns an error which wraps err and satisfies IsNotValid(). -func NewNotValid(err error, msg string) error { - return ¬Valid{wrap(err, msg, "")} -} - -// IsNotValid reports whether the error was created with NotValidf() or -// NewNotValid(). -func IsNotValid(err error) bool { - err = Cause(err) - _, ok := err.(*notValid) - return ok -} - -// notProvisioned represents an error when something is not yet provisioned. -type notProvisioned struct { - Err -} - -// NotProvisionedf returns an error which satisfies IsNotProvisioned(). -func NotProvisionedf(format string, args ...interface{}) error { - return ¬Provisioned{wrap(nil, format, " not provisioned", args...)} -} - -// NewNotProvisioned returns an error which wraps err that satisfies -// IsNotProvisioned(). -func NewNotProvisioned(err error, msg string) error { - return ¬Provisioned{wrap(err, msg, "")} -} - -// IsNotProvisioned reports whether err was created with NotProvisionedf() or -// NewNotProvisioned(). -func IsNotProvisioned(err error) bool { - err = Cause(err) - _, ok := err.(*notProvisioned) - return ok -} - -// notAssigned represents an error when something is not yet assigned to -// something else. -type notAssigned struct { - Err -} - -// NotAssignedf returns an error which satisfies IsNotAssigned(). -func NotAssignedf(format string, args ...interface{}) error { - return ¬Assigned{wrap(nil, format, " not assigned", args...)} -} - -// NewNotAssigned returns an error which wraps err that satisfies -// IsNotAssigned(). -func NewNotAssigned(err error, msg string) error { - return ¬Assigned{wrap(err, msg, "")} -} - -// IsNotAssigned reports whether err was created with NotAssignedf() or -// NewNotAssigned(). -func IsNotAssigned(err error) bool { - err = Cause(err) - _, ok := err.(*notAssigned) - return ok -} - -// badRequest represents an error when a request has bad parameters. -type badRequest struct { - Err -} - -// BadRequestf returns an error which satisfies IsBadRequest(). -func BadRequestf(format string, args ...interface{}) error { - return &badRequest{wrap(nil, format, "", args...)} -} - -// NewBadRequest returns an error which wraps err that satisfies -// IsBadRequest(). -func NewBadRequest(err error, msg string) error { - return &badRequest{wrap(err, msg, "")} -} - -// IsBadRequest reports whether err was created with BadRequestf() or -// NewBadRequest(). -func IsBadRequest(err error) bool { - err = Cause(err) - _, ok := err.(*badRequest) - return ok -} - -// methodNotAllowed represents an error when an HTTP request -// is made with an inappropriate method. -type methodNotAllowed struct { - Err -} - -// MethodNotAllowedf returns an error which satisfies IsMethodNotAllowed(). -func MethodNotAllowedf(format string, args ...interface{}) error { - return &methodNotAllowed{wrap(nil, format, "", args...)} -} - -// NewMethodNotAllowed returns an error which wraps err that satisfies -// IsMethodNotAllowed(). -func NewMethodNotAllowed(err error, msg string) error { - return &methodNotAllowed{wrap(err, msg, "")} -} - -// IsMethodNotAllowed reports whether err was created with MethodNotAllowedf() or -// NewMethodNotAllowed(). -func IsMethodNotAllowed(err error) bool { - err = Cause(err) - _, ok := err.(*methodNotAllowed) - return ok -} - -// forbidden represents an error when a request cannot be completed because of -// missing privileges -type forbidden struct { - Err -} - -// Forbiddenf returns an error which satistifes IsForbidden() -func Forbiddenf(format string, args ...interface{}) error { - return &forbidden{wrap(nil, format, "", args...)} -} - -// NewForbidden returns an error which wraps err that satisfies -// IsForbidden(). -func NewForbidden(err error, msg string) error { - return &forbidden{wrap(err, msg, "")} -} - -// IsForbidden reports whether err was created with Forbiddenf() or -// NewForbidden(). -func IsForbidden(err error) bool { - err = Cause(err) - _, ok := err.(*forbidden) - return ok -} diff --git a/vendor/github.com/juju/errors/functions.go b/vendor/github.com/juju/errors/functions.go deleted file mode 100644 index f86b09b2..00000000 --- a/vendor/github.com/juju/errors/functions.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "fmt" - "strings" -) - -// New is a drop in replacement for the standard library errors module that records -// the location that the error is created. -// -// For example: -// return errors.New("validation failed") -// -func New(message string) error { - err := &Err{message: message} - err.SetLocation(1) - return err -} - -// Errorf creates a new annotated error and records the location that the -// error is created. This should be a drop in replacement for fmt.Errorf. -// -// For example: -// return errors.Errorf("validation failed: %s", message) -// -func Errorf(format string, args ...interface{}) error { - err := &Err{message: fmt.Sprintf(format, args...)} - err.SetLocation(1) - return err -} - -// Trace adds the location of the Trace call to the stack. The Cause of the -// resulting error is the same as the error parameter. If the other error is -// nil, the result will be nil. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Trace(err) -// } -// -func Trace(other error) error { - if other == nil { - return nil - } - err := &Err{previous: other, cause: Cause(other)} - err.SetLocation(1) - return err -} - -// Annotate is used to add extra context to an existing error. The location of -// the Annotate call is recorded with the annotations. The file, line and -// function are also recorded. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Annotate(err, "failed to frombulate") -// } -// -func Annotate(other error, message string) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - cause: Cause(other), - message: message, - } - err.SetLocation(1) - return err -} - -// Annotatef is used to add extra context to an existing error. The location of -// the Annotate call is recorded with the annotations. The file, line and -// function are also recorded. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Annotatef(err, "failed to frombulate the %s", arg) -// } -// -func Annotatef(other error, format string, args ...interface{}) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - cause: Cause(other), - message: fmt.Sprintf(format, args...), - } - err.SetLocation(1) - return err -} - -// DeferredAnnotatef annotates the given error (when it is not nil) with the given -// format string and arguments (like fmt.Sprintf). If *err is nil, DeferredAnnotatef -// does nothing. This method is used in a defer statement in order to annotate any -// resulting error with the same message. -// -// For example: -// -// defer DeferredAnnotatef(&err, "failed to frombulate the %s", arg) -// -func DeferredAnnotatef(err *error, format string, args ...interface{}) { - if *err == nil { - return - } - newErr := &Err{ - message: fmt.Sprintf(format, args...), - cause: Cause(*err), - previous: *err, - } - newErr.SetLocation(1) - *err = newErr -} - -// Wrap changes the Cause of the error. The location of the Wrap call is also -// stored in the error stack. -// -// For example: -// if err := SomeFunc(); err != nil { -// newErr := &packageError{"more context", private_value} -// return errors.Wrap(err, newErr) -// } -// -func Wrap(other, newDescriptive error) error { - err := &Err{ - previous: other, - cause: newDescriptive, - } - err.SetLocation(1) - return err -} - -// Wrapf changes the Cause of the error, and adds an annotation. The location -// of the Wrap call is also stored in the error stack. -// -// For example: -// if err := SomeFunc(); err != nil { -// return errors.Wrapf(err, simpleErrorType, "invalid value %q", value) -// } -// -func Wrapf(other, newDescriptive error, format string, args ...interface{}) error { - err := &Err{ - message: fmt.Sprintf(format, args...), - previous: other, - cause: newDescriptive, - } - err.SetLocation(1) - return err -} - -// Mask masks the given error with the given format string and arguments (like -// fmt.Sprintf), returning a new error that maintains the error stack, but -// hides the underlying error type. The error string still contains the full -// annotations. If you want to hide the annotations, call Wrap. -func Maskf(other error, format string, args ...interface{}) error { - if other == nil { - return nil - } - err := &Err{ - message: fmt.Sprintf(format, args...), - previous: other, - } - err.SetLocation(1) - return err -} - -// Mask hides the underlying error type, and records the location of the masking. -func Mask(other error) error { - if other == nil { - return nil - } - err := &Err{ - previous: other, - } - err.SetLocation(1) - return err -} - -// Cause returns the cause of the given error. This will be either the -// original error, or the result of a Wrap or Mask call. -// -// Cause is the usual way to diagnose errors that may have been wrapped by -// the other errors functions. -func Cause(err error) error { - var diag error - if err, ok := err.(causer); ok { - diag = err.Cause() - } - if diag != nil { - return diag - } - return err -} - -type causer interface { - Cause() error -} - -type wrapper interface { - // Message returns the top level error message, - // not including the message from the Previous - // error. - Message() string - - // Underlying returns the Previous error, or nil - // if there is none. - Underlying() error -} - -type locationer interface { - Location() (string, int) -} - -var ( - _ wrapper = (*Err)(nil) - _ locationer = (*Err)(nil) - _ causer = (*Err)(nil) -) - -// Details returns information about the stack of errors wrapped by err, in -// the format: -// -// [{filename:99: error one} {otherfile:55: cause of error one}] -// -// This is a terse alternative to ErrorStack as it returns a single line. -func Details(err error) string { - if err == nil { - return "[]" - } - var s []byte - s = append(s, '[') - for { - s = append(s, '{') - if err, ok := err.(locationer); ok { - file, line := err.Location() - if file != "" { - s = append(s, fmt.Sprintf("%s:%d", file, line)...) - s = append(s, ": "...) - } - } - if cerr, ok := err.(wrapper); ok { - s = append(s, cerr.Message()...) - err = cerr.Underlying() - } else { - s = append(s, err.Error()...) - err = nil - } - s = append(s, '}') - if err == nil { - break - } - s = append(s, ' ') - } - s = append(s, ']') - return string(s) -} - -// ErrorStack returns a string representation of the annotated error. If the -// error passed as the parameter is not an annotated error, the result is -// simply the result of the Error() method on that error. -// -// If the error is an annotated error, a multi-line string is returned where -// each line represents one entry in the annotation stack. The full filename -// from the call stack is used in the output. -// -// first error -// github.com/juju/errors/annotation_test.go:193: -// github.com/juju/errors/annotation_test.go:194: annotation -// github.com/juju/errors/annotation_test.go:195: -// github.com/juju/errors/annotation_test.go:196: more context -// github.com/juju/errors/annotation_test.go:197: -func ErrorStack(err error) string { - return strings.Join(errorStack(err), "\n") -} - -func errorStack(err error) []string { - if err == nil { - return nil - } - - // We want the first error first - var lines []string - for { - var buff []byte - if err, ok := err.(locationer); ok { - file, line := err.Location() - // Strip off the leading GOPATH/src path elements. - file = trimGoPath(file) - if file != "" { - buff = append(buff, fmt.Sprintf("%s:%d", file, line)...) - buff = append(buff, ": "...) - } - } - if cerr, ok := err.(wrapper); ok { - message := cerr.Message() - buff = append(buff, message...) - // If there is a cause for this error, and it is different to the cause - // of the underlying error, then output the error string in the stack trace. - var cause error - if err1, ok := err.(causer); ok { - cause = err1.Cause() - } - err = cerr.Underlying() - if cause != nil && !sameError(Cause(err), cause) { - if message != "" { - buff = append(buff, ": "...) - } - buff = append(buff, cause.Error()...) - } - } else { - buff = append(buff, err.Error()...) - err = nil - } - lines = append(lines, string(buff)) - if err == nil { - break - } - } - // reverse the lines to get the original error, which was at the end of - // the list, back to the start. - var result []string - for i := len(lines); i > 0; i-- { - result = append(result, lines[i-1]) - } - return result -} diff --git a/vendor/github.com/juju/errors/path.go b/vendor/github.com/juju/errors/path.go deleted file mode 100644 index a7b726ab..00000000 --- a/vendor/github.com/juju/errors/path.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013, 2014 Canonical Ltd. -// Licensed under the LGPLv3, see LICENCE file for details. - -package errors - -import ( - "runtime" - "strings" -) - -// prefixSize is used internally to trim the user specific path from the -// front of the returned filenames from the runtime call stack. -var prefixSize int - -// goPath is the deduced path based on the location of this file as compiled. -var goPath string - -func init() { - _, file, _, ok := runtime.Caller(0) - if file == "?" { - return - } - if ok { - // We know that the end of the file should be: - // github.com/juju/errors/path.go - size := len(file) - suffix := len("github.com/juju/errors/path.go") - goPath = file[:size-suffix] - prefixSize = len(goPath) - } -} - -func trimGoPath(filename string) string { - if strings.HasPrefix(filename, goPath) { - return filename[prefixSize:] - } - return filename -} diff --git a/vendor/github.com/pingcap/check/benchmark.go b/vendor/github.com/pingcap/check/benchmark.go deleted file mode 100644 index 46ea9dc6..00000000 --- a/vendor/github.com/pingcap/check/benchmark.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2012 The 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. - -package check - -import ( - "fmt" - "runtime" - "time" -) - -var memStats runtime.MemStats - -// testingB is a type passed to Benchmark functions to manage benchmark -// timing and to specify the number of iterations to run. -type timer struct { - start time.Time // Time test or benchmark started - duration time.Duration - N int - bytes int64 - timerOn bool - benchTime time.Duration - // The initial states of memStats.Mallocs and memStats.TotalAlloc. - startAllocs uint64 - startBytes uint64 - // The net total of this test after being run. - netAllocs uint64 - netBytes uint64 -} - -// StartTimer starts timing a test. This function is called automatically -// before a benchmark starts, but it can also used to resume timing after -// a call to StopTimer. -func (c *C) StartTimer() { - if !c.timerOn { - c.start = time.Now() - c.timerOn = true - - runtime.ReadMemStats(&memStats) - c.startAllocs = memStats.Mallocs - c.startBytes = memStats.TotalAlloc - } -} - -// StopTimer stops timing a test. This can be used to pause the timer -// while performing complex initialization that you don't -// want to measure. -func (c *C) StopTimer() { - if c.timerOn { - c.duration += time.Now().Sub(c.start) - c.timerOn = false - runtime.ReadMemStats(&memStats) - c.netAllocs += memStats.Mallocs - c.startAllocs - c.netBytes += memStats.TotalAlloc - c.startBytes - } -} - -// ResetTimer sets the elapsed benchmark time to zero. -// It does not affect whether the timer is running. -func (c *C) ResetTimer() { - if c.timerOn { - c.start = time.Now() - runtime.ReadMemStats(&memStats) - c.startAllocs = memStats.Mallocs - c.startBytes = memStats.TotalAlloc - } - c.duration = 0 - c.netAllocs = 0 - c.netBytes = 0 -} - -// SetBytes informs the number of bytes that the benchmark processes -// on each iteration. If this is called in a benchmark it will also -// report MB/s. -func (c *C) SetBytes(n int64) { - c.bytes = n -} - -func (c *C) nsPerOp() int64 { - if c.N <= 0 { - return 0 - } - return c.duration.Nanoseconds() / int64(c.N) -} - -func (c *C) mbPerSec() float64 { - if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 { - return 0 - } - return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds() -} - -func (c *C) timerString() string { - if c.N <= 0 { - return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9) - } - mbs := c.mbPerSec() - mb := "" - if mbs != 0 { - mb = fmt.Sprintf("\t%7.2f MB/s", mbs) - } - nsop := c.nsPerOp() - ns := fmt.Sprintf("%10d ns/op", nsop) - if c.N > 0 && nsop < 100 { - // The format specifiers here make sure that - // the ones digits line up for all three possible formats. - if nsop < 10 { - ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) - } else { - ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) - } - } - memStats := "" - if c.benchMem { - allocedBytes := fmt.Sprintf("%8d B/op", int64(c.netBytes)/int64(c.N)) - allocs := fmt.Sprintf("%8d allocs/op", int64(c.netAllocs)/int64(c.N)) - memStats = fmt.Sprintf("\t%s\t%s", allocedBytes, allocs) - } - return fmt.Sprintf("%8d\t%s%s%s", c.N, ns, mb, memStats) -} - -func min(x, y int) int { - if x > y { - return y - } - return x -} - -func max(x, y int) int { - if x < y { - return y - } - return x -} - -// roundDown10 rounds a number down to the nearest power of 10. -func roundDown10(n int) int { - var tens = 0 - // tens = floor(log_10(n)) - for n > 10 { - n = n / 10 - tens++ - } - // result = 10^tens - result := 1 - for i := 0; i < tens; i++ { - result *= 10 - } - return result -} - -// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. -func roundUp(n int) int { - base := roundDown10(n) - if n < (2 * base) { - return 2 * base - } - if n < (5 * base) { - return 5 * base - } - return 10 * base -} diff --git a/vendor/github.com/pingcap/check/check.go b/vendor/github.com/pingcap/check/check.go deleted file mode 100644 index fc535bc3..00000000 --- a/vendor/github.com/pingcap/check/check.go +++ /dev/null @@ -1,980 +0,0 @@ -// Package check is a rich testing extension for Go's testing package. -// -// For details about the project, see: -// -// http://labix.org/gocheck -// -package check - -import ( - "bytes" - "errors" - "fmt" - "io" - "math/rand" - "os" - "path" - "path/filepath" - "reflect" - "regexp" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" -) - -// ----------------------------------------------------------------------- -// Internal type which deals with suite method calling. - -const ( - fixtureKd = iota - testKd -) - -type funcKind int - -const ( - succeededSt = iota - failedSt - skippedSt - panickedSt - fixturePanickedSt - missedSt -) - -type funcStatus uint32 - -// A method value can't reach its own Method structure. -type methodType struct { - reflect.Value - Info reflect.Method -} - -func newMethod(receiver reflect.Value, i int) *methodType { - return &methodType{receiver.Method(i), receiver.Type().Method(i)} -} - -func (method *methodType) PC() uintptr { - return method.Info.Func.Pointer() -} - -func (method *methodType) suiteName() string { - t := method.Info.Type.In(0) - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t.Name() -} - -func (method *methodType) String() string { - return method.suiteName() + "." + method.Info.Name -} - -func (method *methodType) matches(re *regexp.Regexp) bool { - return (re.MatchString(method.Info.Name) || - re.MatchString(method.suiteName()) || - re.MatchString(method.String())) -} - -type C struct { - method *methodType - kind funcKind - testName string - _status funcStatus - logb *logger - logw io.Writer - done chan *C - parallel chan *C - reason string - mustFail bool - tempDir *tempDir - benchMem bool - startTime time.Time - timer -} - -func (c *C) status() funcStatus { - return funcStatus(atomic.LoadUint32((*uint32)(&c._status))) -} - -func (c *C) setStatus(s funcStatus) { - atomic.StoreUint32((*uint32)(&c._status), uint32(s)) -} - -func (c *C) stopNow() { - runtime.Goexit() -} - -// logger is a concurrency safe byte.Buffer -type logger struct { - sync.Mutex - writer bytes.Buffer -} - -func (l *logger) Write(buf []byte) (int, error) { - l.Lock() - defer l.Unlock() - return l.writer.Write(buf) -} - -func (l *logger) WriteTo(w io.Writer) (int64, error) { - l.Lock() - defer l.Unlock() - return l.writer.WriteTo(w) -} - -func (l *logger) String() string { - l.Lock() - defer l.Unlock() - return l.writer.String() -} - -// ----------------------------------------------------------------------- -// Handling of temporary files and directories. - -type tempDir struct { - sync.Mutex - path string - counter int -} - -func (td *tempDir) newPath() string { - td.Lock() - defer td.Unlock() - if td.path == "" { - var err error - for i := 0; i != 100; i++ { - path := fmt.Sprintf("%s%ccheck-%d", os.TempDir(), os.PathSeparator, rand.Int()) - if err = os.Mkdir(path, 0700); err == nil { - td.path = path - break - } - } - if td.path == "" { - panic("Couldn't create temporary directory: " + err.Error()) - } - } - result := filepath.Join(td.path, strconv.Itoa(td.counter)) - td.counter += 1 - return result -} - -func (td *tempDir) removeAll() { - td.Lock() - defer td.Unlock() - if td.path != "" { - err := os.RemoveAll(td.path) - if err != nil { - fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error()) - } - } -} - -// Create a new temporary directory which is automatically removed after -// the suite finishes running. -func (c *C) MkDir() string { - path := c.tempDir.newPath() - if err := os.Mkdir(path, 0700); err != nil { - panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error())) - } - return path -} - -// ----------------------------------------------------------------------- -// Low-level logging functions. - -func (c *C) log(args ...interface{}) { - c.writeLog([]byte(fmt.Sprint(args...) + "\n")) -} - -func (c *C) logf(format string, args ...interface{}) { - c.writeLog([]byte(fmt.Sprintf(format+"\n", args...))) -} - -func (c *C) logNewLine() { - c.writeLog([]byte{'\n'}) -} - -func (c *C) writeLog(buf []byte) { - c.logb.Write(buf) - if c.logw != nil { - c.logw.Write(buf) - } -} - -func hasStringOrError(x interface{}) (ok bool) { - _, ok = x.(fmt.Stringer) - if ok { - return - } - _, ok = x.(error) - return -} - -func (c *C) logValue(label string, value interface{}) { - if label == "" { - if hasStringOrError(value) { - c.logf("... %#v (%q)", value, value) - } else { - c.logf("... %#v", value) - } - } else if value == nil { - c.logf("... %s = nil", label) - } else { - if hasStringOrError(value) { - fv := fmt.Sprintf("%#v", value) - qv := fmt.Sprintf("%q", value) - if fv != qv { - c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv) - return - } - } - if s, ok := value.(string); ok && isMultiLine(s) { - c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value)) - c.logMultiLine(s) - } else { - c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value) - } - } -} - -func (c *C) logMultiLine(s string) { - b := make([]byte, 0, len(s)*2) - i := 0 - n := len(s) - for i < n { - j := i + 1 - for j < n && s[j-1] != '\n' { - j++ - } - b = append(b, "... "...) - b = strconv.AppendQuote(b, s[i:j]) - if j < n { - b = append(b, " +"...) - } - b = append(b, '\n') - i = j - } - c.writeLog(b) -} - -func isMultiLine(s string) bool { - for i := 0; i+1 < len(s); i++ { - if s[i] == '\n' { - return true - } - } - return false -} - -func (c *C) logString(issue string) { - c.log("... ", issue) -} - -func (c *C) logCaller(skip int) { - // This is a bit heavier than it ought to be. - skip += 1 // Our own frame. - pc, callerFile, callerLine, ok := runtime.Caller(skip) - if !ok { - return - } - var testFile string - var testLine int - testFunc := runtime.FuncForPC(c.method.PC()) - if runtime.FuncForPC(pc) != testFunc { - for { - skip += 1 - if pc, file, line, ok := runtime.Caller(skip); ok { - // Note that the test line may be different on - // distinct calls for the same test. Showing - // the "internal" line is helpful when debugging. - if runtime.FuncForPC(pc) == testFunc { - testFile, testLine = file, line - break - } - } else { - break - } - } - } - if testFile != "" && (testFile != callerFile || testLine != callerLine) { - c.logCode(testFile, testLine) - } - c.logCode(callerFile, callerLine) -} - -func (c *C) logCode(path string, line int) { - c.logf("%s:%d:", nicePath(path), line) - code, err := printLine(path, line) - if code == "" { - code = "..." // XXX Open the file and take the raw line. - if err != nil { - code += err.Error() - } - } - c.log(indent(code, " ")) -} - -var valueGo = filepath.Join("reflect", "value.go") -var asmGo = filepath.Join("runtime", "asm_") - -func (c *C) logPanic(skip int, value interface{}) { - skip++ // Our own frame. - initialSkip := skip - for ; ; skip++ { - if pc, file, line, ok := runtime.Caller(skip); ok { - if skip == initialSkip { - c.logf("... Panic: %s (PC=0x%X)\n", value, pc) - } - name := niceFuncName(pc) - path := nicePath(file) - if strings.Contains(path, "/gopkg.in/check.v") { - continue - } - if name == "Value.call" && strings.HasSuffix(path, valueGo) { - continue - } - if (name == "call16" || name == "call32") && strings.Contains(path, asmGo) { - continue - } - c.logf("%s:%d\n in %s", nicePath(file), line, name) - } else { - break - } - } -} - -func (c *C) logSoftPanic(issue string) { - c.log("... Panic: ", issue) -} - -func (c *C) logArgPanic(method *methodType, expectedType string) { - c.logf("... Panic: %s argument should be %s", - niceFuncName(method.PC()), expectedType) -} - -// ----------------------------------------------------------------------- -// Some simple formatting helpers. - -var initWD, initWDErr = os.Getwd() - -func init() { - if initWDErr == nil { - initWD = strings.Replace(initWD, "\\", "/", -1) + "/" - } -} - -func nicePath(path string) string { - if initWDErr == nil { - if strings.HasPrefix(path, initWD) { - return path[len(initWD):] - } - } - return path -} - -func niceFuncPath(pc uintptr) string { - function := runtime.FuncForPC(pc) - if function != nil { - filename, line := function.FileLine(pc) - return fmt.Sprintf("%s:%d", nicePath(filename), line) - } - return "" -} - -func niceFuncName(pc uintptr) string { - function := runtime.FuncForPC(pc) - if function != nil { - name := path.Base(function.Name()) - if i := strings.Index(name, "."); i > 0 { - name = name[i+1:] - } - if strings.HasPrefix(name, "(*") { - if i := strings.Index(name, ")"); i > 0 { - name = name[2:i] + name[i+1:] - } - } - if i := strings.LastIndex(name, ".*"); i != -1 { - name = name[:i] + "." + name[i+2:] - } - if i := strings.LastIndex(name, "·"); i != -1 { - name = name[:i] + "." + name[i+2:] - } - return name - } - return "" -} - -// ----------------------------------------------------------------------- -// Result tracker to aggregate call results. - -type Result struct { - Succeeded int - Failed int - Skipped int - Panicked int - FixturePanicked int - ExpectedFailures int - Missed int // Not even tried to run, related to a panic in the fixture. - RunError error // Houston, we've got a problem. - WorkDir string // If KeepWorkDir is true -} - -type resultTracker struct { - result Result - _lastWasProblem bool - _waiting int - _missed int - _expectChan chan *C - _doneChan chan *C - _stopChan chan bool -} - -func newResultTracker() *resultTracker { - return &resultTracker{_expectChan: make(chan *C), // Synchronous - _doneChan: make(chan *C, 32), // Asynchronous - _stopChan: make(chan bool)} // Synchronous -} - -func (tracker *resultTracker) start() { - go tracker._loopRoutine() -} - -func (tracker *resultTracker) waitAndStop() { - <-tracker._stopChan -} - -func (tracker *resultTracker) expectCall(c *C) { - tracker._expectChan <- c -} - -func (tracker *resultTracker) callDone(c *C) { - tracker._doneChan <- c -} - -func (tracker *resultTracker) _loopRoutine() { - for { - var c *C - if tracker._waiting > 0 { - // Calls still running. Can't stop. - select { - // XXX Reindent this (not now to make diff clear) - case c = <-tracker._expectChan: - tracker._waiting += 1 - case c = <-tracker._doneChan: - tracker._waiting -= 1 - switch c.status() { - case succeededSt: - if c.kind == testKd { - if c.mustFail { - tracker.result.ExpectedFailures++ - } else { - tracker.result.Succeeded++ - } - } - case failedSt: - tracker.result.Failed++ - case panickedSt: - if c.kind == fixtureKd { - tracker.result.FixturePanicked++ - } else { - tracker.result.Panicked++ - } - case fixturePanickedSt: - // Track it as missed, since the panic - // was on the fixture, not on the test. - tracker.result.Missed++ - case missedSt: - tracker.result.Missed++ - case skippedSt: - if c.kind == testKd { - tracker.result.Skipped++ - } - } - } - } else { - // No calls. Can stop, but no done calls here. - select { - case tracker._stopChan <- true: - return - case c = <-tracker._expectChan: - tracker._waiting += 1 - case c = <-tracker._doneChan: - panic("Tracker got an unexpected done call.") - } - } - } -} - -// ----------------------------------------------------------------------- -// The underlying suite runner. - -type suiteRunner struct { - suite interface{} - setUpSuite, tearDownSuite *methodType - setUpTest, tearDownTest *methodType - tests []*methodType - tracker *resultTracker - tempDir *tempDir - keepDir bool - output *outputWriter - reportedProblemLast bool - benchTime time.Duration - benchMem bool -} - -type RunConf struct { - Output io.Writer - Stream bool - Verbose bool - Filter string - Benchmark bool - BenchmarkTime time.Duration // Defaults to 1 second - BenchmarkMem bool - KeepWorkDir bool - Exclude string -} - -// Create a new suiteRunner able to run all methods in the given suite. -func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner { - var conf RunConf - if runConf != nil { - conf = *runConf - } - if conf.Output == nil { - conf.Output = os.Stdout - } - if conf.Benchmark { - conf.Verbose = true - } - - suiteType := reflect.TypeOf(suite) - suiteNumMethods := suiteType.NumMethod() - suiteValue := reflect.ValueOf(suite) - - runner := &suiteRunner{ - suite: suite, - output: newOutputWriter(conf.Output, conf.Stream, conf.Verbose), - tracker: newResultTracker(), - benchTime: conf.BenchmarkTime, - benchMem: conf.BenchmarkMem, - tempDir: &tempDir{}, - keepDir: conf.KeepWorkDir, - tests: make([]*methodType, 0, suiteNumMethods), - } - if runner.benchTime == 0 { - runner.benchTime = 1 * time.Second - } - - var filterRegexp *regexp.Regexp - if conf.Filter != "" { - if regexp, err := regexp.Compile(conf.Filter); err != nil { - msg := "Bad filter expression: " + err.Error() - runner.tracker.result.RunError = errors.New(msg) - return runner - } else { - filterRegexp = regexp - } - } - - var excludeRegexp *regexp.Regexp - if conf.Exclude != "" { - if regexp, err := regexp.Compile(conf.Exclude); err != nil { - msg := "Bad exclude expression: " + err.Error() - runner.tracker.result.RunError = errors.New(msg) - return runner - } else { - excludeRegexp = regexp - } - } - - for i := 0; i != suiteNumMethods; i++ { - method := newMethod(suiteValue, i) - switch method.Info.Name { - case "SetUpSuite": - runner.setUpSuite = method - case "TearDownSuite": - runner.tearDownSuite = method - case "SetUpTest": - runner.setUpTest = method - case "TearDownTest": - runner.tearDownTest = method - default: - prefix := "Test" - if conf.Benchmark { - prefix = "Benchmark" - } - if !strings.HasPrefix(method.Info.Name, prefix) { - continue - } - if filterRegexp == nil || method.matches(filterRegexp) { - if excludeRegexp == nil || !method.matches(excludeRegexp) { - runner.tests = append(runner.tests, method) - } - } - } - } - return runner -} - -// Run all methods in the given suite. -func (runner *suiteRunner) run() *Result { - if runner.tracker.result.RunError == nil && len(runner.tests) > 0 { - runner.tracker.start() - if runner.checkFixtureArgs() { - c := runner.runFixture(runner.setUpSuite, "", nil) - if c == nil || c.status() == succeededSt { - var delayedC []*C - for i := 0; i != len(runner.tests); i++ { - c := runner.forkTest(runner.tests[i]) - select { - case <-c.done: - case <-c.parallel: - delayedC = append(delayedC, c) - } - if c.status() == fixturePanickedSt { - runner.skipTests(missedSt, runner.tests[i+1:]) - break - } - } - // Wait those parallel tests finish. - for _, delayed := range delayedC { - <-delayed.done - } - } else if c != nil && c.status() == skippedSt { - runner.skipTests(skippedSt, runner.tests) - } else { - runner.skipTests(missedSt, runner.tests) - } - runner.runFixture(runner.tearDownSuite, "", nil) - } else { - runner.skipTests(missedSt, runner.tests) - } - runner.tracker.waitAndStop() - if runner.keepDir { - runner.tracker.result.WorkDir = runner.tempDir.path - } else { - runner.tempDir.removeAll() - } - } - return &runner.tracker.result -} - -// Create a call object with the given suite method, and fork a -// goroutine with the provided dispatcher for running it. -func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { - var logw io.Writer - if runner.output.Stream { - logw = runner.output - } - if logb == nil { - logb = new(logger) - } - c := &C{ - method: method, - kind: kind, - testName: testName, - logb: logb, - logw: logw, - tempDir: runner.tempDir, - done: make(chan *C, 1), - parallel: make(chan *C, 1), - timer: timer{benchTime: runner.benchTime}, - startTime: time.Now(), - benchMem: runner.benchMem, - } - runner.tracker.expectCall(c) - go (func() { - runner.reportCallStarted(c) - defer runner.callDone(c) - dispatcher(c) - })() - return c -} - -// Same as forkCall(), but wait for call to finish before returning. -func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { - c := runner.forkCall(method, kind, testName, logb, dispatcher) - <-c.done - return c -} - -// Handle a finished call. If there were any panics, update the call status -// accordingly. Then, mark the call as done and report to the tracker. -func (runner *suiteRunner) callDone(c *C) { - value := recover() - if value != nil { - switch v := value.(type) { - case *fixturePanic: - if v.status == skippedSt { - c.setStatus(skippedSt) - } else { - c.logSoftPanic("Fixture has panicked (see related PANIC)") - c.setStatus(fixturePanickedSt) - } - default: - c.logPanic(1, value) - c.setStatus(panickedSt) - } - } - if c.mustFail { - switch c.status() { - case failedSt: - c.setStatus(succeededSt) - case succeededSt: - c.setStatus(failedSt) - c.logString("Error: Test succeeded, but was expected to fail") - c.logString("Reason: " + c.reason) - } - } - - runner.reportCallDone(c) - c.done <- c -} - -// Runs a fixture call synchronously. The fixture will still be run in a -// goroutine like all suite methods, but this method will not return -// while the fixture goroutine is not done, because the fixture must be -// run in a desired order. -func (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C { - if method != nil { - c := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) { - c.ResetTimer() - c.StartTimer() - defer c.StopTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - }) - return c - } - return nil -} - -// Run the fixture method with runFixture(), but panic with a fixturePanic{} -// in case the fixture method panics. This makes it easier to track the -// fixture panic together with other call panics within forkTest(). -func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C { - if skipped != nil && *skipped { - return nil - } - c := runner.runFixture(method, testName, logb) - if c != nil && c.status() != succeededSt { - if skipped != nil { - *skipped = c.status() == skippedSt - } - panic(&fixturePanic{c.status(), method}) - } - return c -} - -type fixturePanic struct { - status funcStatus - method *methodType -} - -// Run the suite test method, together with the test-specific fixture, -// asynchronously. -func (runner *suiteRunner) forkTest(method *methodType) *C { - testName := method.String() - return runner.forkCall(method, testKd, testName, nil, func(c *C) { - var skipped bool - defer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped) - defer c.StopTimer() - benchN := 1 - for { - runner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped) - mt := c.method.Type() - if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) { - // Rather than a plain panic, provide a more helpful message when - // the argument type is incorrect. - c.setStatus(panickedSt) - c.logArgPanic(c.method, "*check.C") - return - } - if strings.HasPrefix(c.method.Info.Name, "Test") { - c.ResetTimer() - c.StartTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - return - } - if !strings.HasPrefix(c.method.Info.Name, "Benchmark") { - panic("unexpected method prefix: " + c.method.Info.Name) - } - - runtime.GC() - c.N = benchN - c.ResetTimer() - c.StartTimer() - c.method.Call([]reflect.Value{reflect.ValueOf(c)}) - c.StopTimer() - if c.status() != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 { - return - } - perOpN := int(1e9) - if c.nsPerOp() != 0 { - perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp()) - } - - // Logic taken from the stock testing package: - // - Run more iterations than we think we'll need for a second (1.5x). - // - Don't grow too fast in case we had timing errors previously. - // - Be sure to run at least one more than last time. - benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1) - benchN = roundUp(benchN) - - skipped = true // Don't run the deferred one if this panics. - runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil) - skipped = false - } - }) -} - -// Same as forkTest(), but wait for the test to finish before returning. -func (runner *suiteRunner) runTest(method *methodType) *C { - c := runner.forkTest(method) - <-c.done - return c -} - -// Helper to mark tests as skipped or missed. A bit heavy for what -// it does, but it enables homogeneous handling of tracking, including -// nice verbose output. -func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) { - for _, method := range methods { - runner.runFunc(method, testKd, "", nil, func(c *C) { - c.setStatus(status) - }) - } -} - -// Verify if the fixture arguments are *check.C. In case of errors, -// log the error as a panic in the fixture method call, and return false. -func (runner *suiteRunner) checkFixtureArgs() bool { - succeeded := true - argType := reflect.TypeOf(&C{}) - for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} { - if method != nil { - mt := method.Type() - if mt.NumIn() != 1 || mt.In(0) != argType { - succeeded = false - runner.runFunc(method, fixtureKd, "", nil, func(c *C) { - c.logArgPanic(method, "*check.C") - c.setStatus(panickedSt) - }) - } - } - } - return succeeded -} - -func (runner *suiteRunner) reportCallStarted(c *C) { - runner.output.WriteCallStarted("START", c) -} - -func (runner *suiteRunner) reportCallDone(c *C) { - runner.tracker.callDone(c) - switch c.status() { - case succeededSt: - if c.mustFail { - runner.output.WriteCallSuccess("FAIL EXPECTED", c) - } else { - runner.output.WriteCallSuccess("PASS", c) - } - case skippedSt: - runner.output.WriteCallSuccess("SKIP", c) - case failedSt: - runner.output.WriteCallProblem("FAIL", c) - case panickedSt: - runner.output.WriteCallProblem("PANIC", c) - case fixturePanickedSt: - // That's a testKd call reporting that its fixture - // has panicked. The fixture call which caused the - // panic itself was tracked above. We'll report to - // aid debugging. - runner.output.WriteCallProblem("PANIC", c) - case missedSt: - runner.output.WriteCallSuccess("MISS", c) - } -} - -// ----------------------------------------------------------------------- -// Output writer manages atomic output writing according to settings. - -type outputWriter struct { - m sync.Mutex - writer io.Writer - wroteCallProblemLast bool - Stream bool - Verbose bool -} - -func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter { - return &outputWriter{writer: writer, Stream: stream, Verbose: verbose} -} - -func (ow *outputWriter) Write(content []byte) (n int, err error) { - ow.m.Lock() - n, err = ow.writer.Write(content) - ow.m.Unlock() - return -} - -func (ow *outputWriter) WriteCallStarted(label string, c *C) { - if ow.Stream { - header := renderCallHeader(label, c, "", "\n") - ow.m.Lock() - ow.writer.Write([]byte(header)) - ow.m.Unlock() - } -} - -func (ow *outputWriter) WriteCallProblem(label string, c *C) { - var prefix string - if !ow.Stream { - prefix = "\n-----------------------------------" + - "-----------------------------------\n" - } - header := renderCallHeader(label, c, prefix, "\n\n") - ow.m.Lock() - ow.wroteCallProblemLast = true - ow.writer.Write([]byte(header)) - if !ow.Stream { - c.logb.WriteTo(ow.writer) - } - ow.m.Unlock() -} - -func (ow *outputWriter) WriteCallSuccess(label string, c *C) { - if ow.Stream || (ow.Verbose && c.kind == testKd) { - // TODO Use a buffer here. - var suffix string - if c.reason != "" { - suffix = " (" + c.reason + ")" - } - if c.status() == succeededSt { - suffix += "\t" + c.timerString() - } - suffix += "\n" - if ow.Stream { - suffix += "\n" - } - header := renderCallHeader(label, c, "", suffix) - ow.m.Lock() - // Resist temptation of using line as prefix above due to race. - if !ow.Stream && ow.wroteCallProblemLast { - header = "\n-----------------------------------" + - "-----------------------------------\n" + - header - } - ow.wroteCallProblemLast = false - ow.writer.Write([]byte(header)) - ow.m.Unlock() - } -} - -func renderCallHeader(label string, c *C, prefix, suffix string) string { - pc := c.method.PC() - return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc), - niceFuncName(pc), suffix) -} diff --git a/vendor/github.com/pingcap/check/checkers.go b/vendor/github.com/pingcap/check/checkers.go deleted file mode 100644 index 37495458..00000000 --- a/vendor/github.com/pingcap/check/checkers.go +++ /dev/null @@ -1,458 +0,0 @@ -package check - -import ( - "fmt" - "reflect" - "regexp" -) - -// ----------------------------------------------------------------------- -// CommentInterface and Commentf helper, to attach extra information to checks. - -type comment struct { - format string - args []interface{} -} - -// Commentf returns an infomational value to use with Assert or Check calls. -// If the checker test fails, the provided arguments will be passed to -// fmt.Sprintf, and will be presented next to the logged failure. -// -// For example: -// -// c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i)) -// -// Note that if the comment is constant, a better option is to -// simply use a normal comment right above or next to the line, as -// it will also get printed with any errors: -// -// c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123) -// -func Commentf(format string, args ...interface{}) CommentInterface { - return &comment{format, args} -} - -// CommentInterface must be implemented by types that attach extra -// information to failed checks. See the Commentf function for details. -type CommentInterface interface { - CheckCommentString() string -} - -func (c *comment) CheckCommentString() string { - return fmt.Sprintf(c.format, c.args...) -} - -// ----------------------------------------------------------------------- -// The Checker interface. - -// The Checker interface must be provided by checkers used with -// the Assert and Check verification methods. -type Checker interface { - Info() *CheckerInfo - Check(params []interface{}, names []string) (result bool, error string) -} - -// See the Checker interface. -type CheckerInfo struct { - Name string - Params []string -} - -func (info *CheckerInfo) Info() *CheckerInfo { - return info -} - -// ----------------------------------------------------------------------- -// Not checker logic inverter. - -// The Not checker inverts the logic of the provided checker. The -// resulting checker will succeed where the original one failed, and -// vice-versa. -// -// For example: -// -// c.Assert(a, Not(Equals), b) -// -func Not(checker Checker) Checker { - return ¬Checker{checker} -} - -type notChecker struct { - sub Checker -} - -func (checker *notChecker) Info() *CheckerInfo { - info := *checker.sub.Info() - info.Name = "Not(" + info.Name + ")" - return &info -} - -func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) { - result, error = checker.sub.Check(params, names) - result = !result - return -} - -// ----------------------------------------------------------------------- -// IsNil checker. - -type isNilChecker struct { - *CheckerInfo -} - -// The IsNil checker tests whether the obtained value is nil. -// -// For example: -// -// c.Assert(err, IsNil) -// -var IsNil Checker = &isNilChecker{ - &CheckerInfo{Name: "IsNil", Params: []string{"value"}}, -} - -func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) { - return isNil(params[0]), "" -} - -func isNil(obtained interface{}) (result bool) { - if obtained == nil { - result = true - } else { - switch v := reflect.ValueOf(obtained); v.Kind() { - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - } - return -} - -// ----------------------------------------------------------------------- -// NotNil checker. Alias for Not(IsNil), since it's so common. - -type notNilChecker struct { - *CheckerInfo -} - -// The NotNil checker verifies that the obtained value is not nil. -// -// For example: -// -// c.Assert(iface, NotNil) -// -// This is an alias for Not(IsNil), made available since it's a -// fairly common check. -// -var NotNil Checker = ¬NilChecker{ - &CheckerInfo{Name: "NotNil", Params: []string{"value"}}, -} - -func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) { - return !isNil(params[0]), "" -} - -// ----------------------------------------------------------------------- -// Equals checker. - -type equalsChecker struct { - *CheckerInfo -} - -// The Equals checker verifies that the obtained value is equal to -// the expected value, according to usual Go semantics for ==. -// -// For example: -// -// c.Assert(value, Equals, 42) -// -var Equals Checker = &equalsChecker{ - &CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}}, -} - -func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) { - defer func() { - if v := recover(); v != nil { - result = false - error = fmt.Sprint(v) - } - }() - return params[0] == params[1], "" -} - -// ----------------------------------------------------------------------- -// DeepEquals checker. - -type deepEqualsChecker struct { - *CheckerInfo -} - -// The DeepEquals checker verifies that the obtained value is deep-equal to -// the expected value. The check will work correctly even when facing -// slices, interfaces, and values of different types (which always fail -// the test). -// -// For example: -// -// c.Assert(value, DeepEquals, 42) -// c.Assert(array, DeepEquals, []string{"hi", "there"}) -// -var DeepEquals Checker = &deepEqualsChecker{ - &CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}}, -} - -func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) { - return reflect.DeepEqual(params[0], params[1]), "" -} - -// ----------------------------------------------------------------------- -// HasLen checker. - -type hasLenChecker struct { - *CheckerInfo -} - -// The HasLen checker verifies that the obtained value has the -// provided length. In many cases this is superior to using Equals -// in conjunction with the len function because in case the check -// fails the value itself will be printed, instead of its length, -// providing more details for figuring the problem. -// -// For example: -// -// c.Assert(list, HasLen, 5) -// -var HasLen Checker = &hasLenChecker{ - &CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}}, -} - -func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) { - n, ok := params[1].(int) - if !ok { - return false, "n must be an int" - } - value := reflect.ValueOf(params[0]) - switch value.Kind() { - case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String: - default: - return false, "obtained value type has no length" - } - return value.Len() == n, "" -} - -// ----------------------------------------------------------------------- -// ErrorMatches checker. - -type errorMatchesChecker struct { - *CheckerInfo -} - -// The ErrorMatches checker verifies that the error value -// is non nil and matches the regular expression provided. -// -// For example: -// -// c.Assert(err, ErrorMatches, "perm.*denied") -// -var ErrorMatches Checker = errorMatchesChecker{ - &CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}}, -} - -func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) { - if params[0] == nil { - return false, "Error value is nil" - } - err, ok := params[0].(error) - if !ok { - return false, "Value is not an error" - } - params[0] = err.Error() - names[0] = "error" - return matches(params[0], params[1]) -} - -// ----------------------------------------------------------------------- -// Matches checker. - -type matchesChecker struct { - *CheckerInfo -} - -// The Matches checker verifies that the string provided as the obtained -// value (or the string resulting from obtained.String()) matches the -// regular expression provided. -// -// For example: -// -// c.Assert(err, Matches, "perm.*denied") -// -var Matches Checker = &matchesChecker{ - &CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}}, -} - -func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) { - return matches(params[0], params[1]) -} - -func matches(value, regex interface{}) (result bool, error string) { - reStr, ok := regex.(string) - if !ok { - return false, "Regex must be a string" - } - valueStr, valueIsStr := value.(string) - if !valueIsStr { - if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr { - valueStr, valueIsStr = valueWithStr.String(), true - } - } - if valueIsStr { - matches, err := regexp.MatchString("^"+reStr+"$", valueStr) - if err != nil { - return false, "Can't compile regex: " + err.Error() - } - return matches, "" - } - return false, "Obtained value is not a string and has no .String()" -} - -// ----------------------------------------------------------------------- -// Panics checker. - -type panicsChecker struct { - *CheckerInfo -} - -// The Panics checker verifies that calling the provided zero-argument -// function will cause a panic which is deep-equal to the provided value. -// -// For example: -// -// c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}). -// -// -var Panics Checker = &panicsChecker{ - &CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}}, -} - -func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) { - f := reflect.ValueOf(params[0]) - if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { - return false, "Function must take zero arguments" - } - defer func() { - // If the function has not panicked, then don't do the check. - if error != "" { - return - } - params[0] = recover() - names[0] = "panic" - result = reflect.DeepEqual(params[0], params[1]) - }() - f.Call(nil) - return false, "Function has not panicked" -} - -type panicMatchesChecker struct { - *CheckerInfo -} - -// The PanicMatches checker verifies that calling the provided zero-argument -// function will cause a panic with an error value matching -// the regular expression provided. -// -// For example: -// -// c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`). -// -// -var PanicMatches Checker = &panicMatchesChecker{ - &CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}}, -} - -func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) { - f := reflect.ValueOf(params[0]) - if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { - return false, "Function must take zero arguments" - } - defer func() { - // If the function has not panicked, then don't do the check. - if errmsg != "" { - return - } - obtained := recover() - names[0] = "panic" - if e, ok := obtained.(error); ok { - params[0] = e.Error() - } else if _, ok := obtained.(string); ok { - params[0] = obtained - } else { - errmsg = "Panic value is not a string or an error" - return - } - result, errmsg = matches(params[0], params[1]) - }() - f.Call(nil) - return false, "Function has not panicked" -} - -// ----------------------------------------------------------------------- -// FitsTypeOf checker. - -type fitsTypeChecker struct { - *CheckerInfo -} - -// The FitsTypeOf checker verifies that the obtained value is -// assignable to a variable with the same type as the provided -// sample value. -// -// For example: -// -// c.Assert(value, FitsTypeOf, int64(0)) -// c.Assert(value, FitsTypeOf, os.Error(nil)) -// -var FitsTypeOf Checker = &fitsTypeChecker{ - &CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}}, -} - -func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) { - obtained := reflect.ValueOf(params[0]) - sample := reflect.ValueOf(params[1]) - if !obtained.IsValid() { - return false, "" - } - if !sample.IsValid() { - return false, "Invalid sample value" - } - return obtained.Type().AssignableTo(sample.Type()), "" -} - -// ----------------------------------------------------------------------- -// Implements checker. - -type implementsChecker struct { - *CheckerInfo -} - -// The Implements checker verifies that the obtained value -// implements the interface specified via a pointer to an interface -// variable. -// -// For example: -// -// var e os.Error -// c.Assert(err, Implements, &e) -// -var Implements Checker = &implementsChecker{ - &CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}}, -} - -func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) { - obtained := reflect.ValueOf(params[0]) - ifaceptr := reflect.ValueOf(params[1]) - if !obtained.IsValid() { - return false, "" - } - if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface { - return false, "ifaceptr should be a pointer to an interface variable" - } - return obtained.Type().Implements(ifaceptr.Elem().Type()), "" -} diff --git a/vendor/github.com/pingcap/check/checkers2.go b/vendor/github.com/pingcap/check/checkers2.go deleted file mode 100644 index c09bcdc5..00000000 --- a/vendor/github.com/pingcap/check/checkers2.go +++ /dev/null @@ -1,131 +0,0 @@ -// Extensions to the go-check unittest framework. -// -// NOTE: see https://github.com/go-check/check/pull/6 for reasons why these -// checkers live here. -package check - -import ( - "bytes" - "reflect" -) - -// ----------------------------------------------------------------------- -// IsTrue / IsFalse checker. - -type isBoolValueChecker struct { - *CheckerInfo - expected bool -} - -func (checker *isBoolValueChecker) Check( - params []interface{}, - names []string) ( - result bool, - error string) { - - obtained, ok := params[0].(bool) - if !ok { - return false, "Argument to " + checker.Name + " must be bool" - } - - return obtained == checker.expected, "" -} - -// The IsTrue checker verifies that the obtained value is true. -// -// For example: -// -// c.Assert(value, IsTrue) -// -var IsTrue Checker = &isBoolValueChecker{ - &CheckerInfo{Name: "IsTrue", Params: []string{"obtained"}}, - true, -} - -// The IsFalse checker verifies that the obtained value is false. -// -// For example: -// -// c.Assert(value, IsFalse) -// -var IsFalse Checker = &isBoolValueChecker{ - &CheckerInfo{Name: "IsFalse", Params: []string{"obtained"}}, - false, -} - -// ----------------------------------------------------------------------- -// BytesEquals checker. - -type bytesEquals struct{} - -func (b *bytesEquals) Check(params []interface{}, names []string) (bool, string) { - if len(params) != 2 { - return false, "BytesEqual takes 2 bytestring arguments" - } - b1, ok1 := params[0].([]byte) - b2, ok2 := params[1].([]byte) - - if !(ok1 && ok2) { - return false, "Arguments to BytesEqual must both be bytestrings" - } - - return bytes.Equal(b1, b2), "" -} - -func (b *bytesEquals) Info() *CheckerInfo { - return &CheckerInfo{ - Name: "BytesEquals", - Params: []string{"bytes_one", "bytes_two"}, - } -} - -// BytesEquals checker compares two bytes sequence using bytes.Equal. -// -// For example: -// -// c.Assert(b, BytesEquals, []byte("bar")) -// -// Main difference between DeepEquals and BytesEquals is that BytesEquals treats -// `nil` as empty byte sequence while DeepEquals doesn't. -// -// c.Assert(nil, BytesEquals, []byte("")) // succeeds -// c.Assert(nil, DeepEquals, []byte("")) // fails -var BytesEquals = &bytesEquals{} - -// ----------------------------------------------------------------------- -// HasKey checker. - -type hasKey struct{} - -func (h *hasKey) Check(params []interface{}, names []string) (bool, string) { - if len(params) != 2 { - return false, "HasKey takes 2 arguments: a map and a key" - } - - mapValue := reflect.ValueOf(params[0]) - if mapValue.Kind() != reflect.Map { - return false, "First argument to HasKey must be a map" - } - - keyValue := reflect.ValueOf(params[1]) - if !keyValue.Type().AssignableTo(mapValue.Type().Key()) { - return false, "Second argument must be assignable to the map key type" - } - - return mapValue.MapIndex(keyValue).IsValid(), "" -} - -func (h *hasKey) Info() *CheckerInfo { - return &CheckerInfo{ - Name: "HasKey", - Params: []string{"obtained", "key"}, - } -} - -// The HasKey checker verifies that the obtained map contains the given key. -// -// For example: -// -// c.Assert(myMap, HasKey, "foo") -// -var HasKey = &hasKey{} diff --git a/vendor/github.com/pingcap/check/compare.go b/vendor/github.com/pingcap/check/compare.go deleted file mode 100644 index 7005cba7..00000000 --- a/vendor/github.com/pingcap/check/compare.go +++ /dev/null @@ -1,161 +0,0 @@ -package check - -import ( - "bytes" - "fmt" - "reflect" - "time" -) - -type compareFunc func(v1 interface{}, v2 interface{}) (bool, error) - -type valueCompare struct { - Name string - - Func compareFunc - - Operator string -} - -// v1 and v2 must have the same type -// return >0 if v1 > v2 -// return 0 if v1 = v2 -// return <0 if v1 < v2 -// now we only support int, uint, float64, string and []byte comparison -func compare(v1 interface{}, v2 interface{}) (int, error) { - value1 := reflect.ValueOf(v1) - value2 := reflect.ValueOf(v2) - - switch v1.(type) { - case int, int8, int16, int32, int64: - a1 := value1.Int() - a2 := value2.Int() - if a1 > a2 { - return 1, nil - } else if a1 == a2 { - return 0, nil - } - return -1, nil - case uint, uint8, uint16, uint32, uint64: - a1 := value1.Uint() - a2 := value2.Uint() - if a1 > a2 { - return 1, nil - } else if a1 == a2 { - return 0, nil - } - return -1, nil - case float32, float64: - a1 := value1.Float() - a2 := value2.Float() - if a1 > a2 { - return 1, nil - } else if a1 == a2 { - return 0, nil - } - return -1, nil - case string: - a1 := value1.String() - a2 := value2.String() - if a1 > a2 { - return 1, nil - } else if a1 == a2 { - return 0, nil - } - return -1, nil - case []byte: - a1 := value1.Bytes() - a2 := value2.Bytes() - return bytes.Compare(a1, a2), nil - case time.Time: - a1 := v1.(time.Time) - a2 := v2.(time.Time) - if a1.After(a2) { - return 1, nil - } else if a1.Equal(a2) { - return 0, nil - } - return -1, nil - case time.Duration: - a1 := v1.(time.Duration) - a2 := v2.(time.Duration) - if a1 > a2 { - return 1, nil - } else if a1 == a2 { - return 0, nil - } - return -1, nil - default: - return 0, fmt.Errorf("type %T is not supported now", v1) - } -} - -func less(v1 interface{}, v2 interface{}) (bool, error) { - n, err := compare(v1, v2) - if err != nil { - return false, err - } - - return n < 0, nil -} - -func lessEqual(v1 interface{}, v2 interface{}) (bool, error) { - n, err := compare(v1, v2) - if err != nil { - return false, err - } - - return n <= 0, nil -} - -func greater(v1 interface{}, v2 interface{}) (bool, error) { - n, err := compare(v1, v2) - if err != nil { - return false, err - } - - return n > 0, nil -} - -func greaterEqual(v1 interface{}, v2 interface{}) (bool, error) { - n, err := compare(v1, v2) - if err != nil { - return false, err - } - - return n >= 0, nil -} - -func (v *valueCompare) Check(params []interface{}, names []string) (bool, string) { - if len(params) != 2 { - return false, fmt.Sprintf("%s needs 2 arguments", v.Name) - } - - v1 := params[0] - v2 := params[1] - v1Type := reflect.TypeOf(v1) - v2Type := reflect.TypeOf(v2) - - if v1Type.Kind() != v2Type.Kind() { - return false, fmt.Sprintf("%s needs two same type, but %s != %s", v.Name, v1Type.Kind(), v2Type.Kind()) - } - - b, err := v.Func(v1, v2) - if err != nil { - return false, fmt.Sprintf("%s check err %v", v.Name, err) - } - - return b, "" -} - -func (v *valueCompare) Info() *CheckerInfo { - return &CheckerInfo{ - Name: v.Name, - Params: []string{"compare_one", "compare_two"}, - } -} - -var Less = &valueCompare{Name: "Less", Func: less, Operator: "<"} -var LessEqual = &valueCompare{Name: "LessEqual", Func: lessEqual, Operator: "<="} -var Greater = &valueCompare{Name: "Greater", Func: greater, Operator: ">"} -var GreaterEqual = &valueCompare{Name: "GreaterEqual", Func: greaterEqual, Operator: ">="} diff --git a/vendor/github.com/pingcap/check/helpers.go b/vendor/github.com/pingcap/check/helpers.go deleted file mode 100644 index 68e861d5..00000000 --- a/vendor/github.com/pingcap/check/helpers.go +++ /dev/null @@ -1,236 +0,0 @@ -package check - -import ( - "fmt" - "strings" - "time" -) - -// TestName returns the current test name in the form "SuiteName.TestName" -func (c *C) TestName() string { - return c.testName -} - -// ----------------------------------------------------------------------- -// Basic succeeding/failing logic. - -// Failed returns whether the currently running test has already failed. -func (c *C) Failed() bool { - return c.status() == failedSt -} - -// Fail marks the currently running test as failed. -// -// Something ought to have been previously logged so the developer can tell -// what went wrong. The higher level helper functions will fail the test -// and do the logging properly. -func (c *C) Fail() { - c.setStatus(failedSt) -} - -// FailNow marks the currently running test as failed and stops running it. -// Something ought to have been previously logged so the developer can tell -// what went wrong. The higher level helper functions will fail the test -// and do the logging properly. -func (c *C) FailNow() { - c.Fail() - c.stopNow() -} - -// Succeed marks the currently running test as succeeded, undoing any -// previous failures. -func (c *C) Succeed() { - c.setStatus(succeededSt) -} - -// SucceedNow marks the currently running test as succeeded, undoing any -// previous failures, and stops running the test. -func (c *C) SucceedNow() { - c.Succeed() - c.stopNow() -} - -// ExpectFailure informs that the running test is knowingly broken for -// the provided reason. If the test does not fail, an error will be reported -// to raise attention to this fact. This method is useful to temporarily -// disable tests which cover well known problems until a better time to -// fix the problem is found, without forgetting about the fact that a -// failure still exists. -func (c *C) ExpectFailure(reason string) { - if reason == "" { - panic("Missing reason why the test is expected to fail") - } - c.mustFail = true - c.reason = reason -} - -// Skip skips the running test for the provided reason. If run from within -// SetUpTest, the individual test being set up will be skipped, and if run -// from within SetUpSuite, the whole suite is skipped. -func (c *C) Skip(reason string) { - if reason == "" { - panic("Missing reason why the test is being skipped") - } - c.reason = reason - c.setStatus(skippedSt) - c.stopNow() -} - -// Parallel will mark the test run parallel within a test suite. -func (c *C) Parallel() { - c.parallel <- c -} - -// ----------------------------------------------------------------------- -// Basic logging. - -// GetTestLog returns the current test error output. -func (c *C) GetTestLog() string { - return c.logb.String() -} - -// Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprint. -func (c *C) Log(args ...interface{}) { - c.log(args...) -} - -// Log logs some information into the test error output. -// The provided arguments are assembled together into a string with fmt.Sprintf. -func (c *C) Logf(format string, args ...interface{}) { - c.logf(format, args...) -} - -// Output enables *C to be used as a logger in functions that require only -// the minimum interface of *log.Logger. -func (c *C) Output(calldepth int, s string) error { - d := time.Now().Sub(c.startTime) - msec := d / time.Millisecond - sec := d / time.Second - min := d / time.Minute - - c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s) - return nil -} - -// Error logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprint. -func (c *C) Error(args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) - c.logNewLine() - c.Fail() -} - -// Errorf logs an error into the test error output and marks the test as failed. -// The provided arguments are assembled together into a string with fmt.Sprintf. -func (c *C) Errorf(format string, args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprintf("Error: "+format, args...)) - c.logNewLine() - c.Fail() -} - -// Fatal logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into -// a string with fmt.Sprint. -func (c *C) Fatal(args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) - c.logNewLine() - c.FailNow() -} - -// Fatlaf logs an error into the test error output, marks the test as failed, and -// stops the test execution. The provided arguments are assembled together into -// a string with fmt.Sprintf. -func (c *C) Fatalf(format string, args ...interface{}) { - c.logCaller(1) - c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...))) - c.logNewLine() - c.FailNow() -} - -// ----------------------------------------------------------------------- -// Generic checks and assertions based on checkers. - -// Check verifies if the first value matches the expected value according -// to the provided checker. If they do not match, an error is logged, the -// test is marked as failed, and the test execution continues. -// -// Some checkers may not need the expected argument (e.g. IsNil). -// -// Extra arguments provided to the function are logged next to the reported -// problem when the matching fails. -func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool { - return c.internalCheck("Check", obtained, checker, args...) -} - -// Assert ensures that the first value matches the expected value according -// to the provided checker. If they do not match, an error is logged, the -// test is marked as failed, and the test execution stops. -// -// Some checkers may not need the expected argument (e.g. IsNil). -// -// Extra arguments provided to the function are logged next to the reported -// problem when the matching fails. -func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) { - if !c.internalCheck("Assert", obtained, checker, args...) { - c.stopNow() - } -} - -func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool { - if checker == nil { - c.logCaller(2) - c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName)) - c.logString("Oops.. you've provided a nil checker!") - c.logNewLine() - c.Fail() - return false - } - - // If the last argument is a bug info, extract it out. - var comment CommentInterface - if len(args) > 0 { - if c, ok := args[len(args)-1].(CommentInterface); ok { - comment = c - args = args[:len(args)-1] - } - } - - params := append([]interface{}{obtained}, args...) - info := checker.Info() - - if len(params) != len(info.Params) { - names := append([]string{info.Params[0], info.Name}, info.Params[1:]...) - c.logCaller(2) - c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", "))) - c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1)) - c.logNewLine() - c.Fail() - return false - } - - // Copy since it may be mutated by Check. - names := append([]string{}, info.Params...) - - // Do the actual check. - result, error := checker.Check(params, names) - if !result || error != "" { - c.logCaller(2) - for i := 0; i != len(params); i++ { - c.logValue(names[i], params[i]) - } - if comment != nil { - c.logString(comment.CheckCommentString()) - } - if error != "" { - c.logString(error) - } - c.logNewLine() - c.Fail() - return false - } - return true -} diff --git a/vendor/github.com/pingcap/check/printer.go b/vendor/github.com/pingcap/check/printer.go deleted file mode 100644 index e0f7557b..00000000 --- a/vendor/github.com/pingcap/check/printer.go +++ /dev/null @@ -1,168 +0,0 @@ -package check - -import ( - "bytes" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "os" -) - -func indent(s, with string) (r string) { - eol := true - for i := 0; i != len(s); i++ { - c := s[i] - switch { - case eol && c == '\n' || c == '\r': - case c == '\n' || c == '\r': - eol = true - case eol: - eol = false - s = s[:i] + with + s[i:] - i += len(with) - } - } - return s -} - -func printLine(filename string, line int) (string, error) { - fset := token.NewFileSet() - file, err := os.Open(filename) - if err != nil { - return "", err - } - fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments) - if err != nil { - return "", err - } - config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4} - lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config} - ast.Walk(lp, fnode) - result := lp.output.Bytes() - // Comments leave \n at the end. - n := len(result) - for n > 0 && result[n-1] == '\n' { - n-- - } - return string(result[:n]), nil -} - -type linePrinter struct { - config *printer.Config - fset *token.FileSet - fnode *ast.File - line int - output bytes.Buffer - stmt ast.Stmt -} - -func (lp *linePrinter) emit() bool { - if lp.stmt != nil { - lp.trim(lp.stmt) - lp.printWithComments(lp.stmt) - lp.stmt = nil - return true - } - return false -} - -func (lp *linePrinter) printWithComments(n ast.Node) { - nfirst := lp.fset.Position(n.Pos()).Line - nlast := lp.fset.Position(n.End()).Line - for _, g := range lp.fnode.Comments { - cfirst := lp.fset.Position(g.Pos()).Line - clast := lp.fset.Position(g.End()).Line - if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column { - for _, c := range g.List { - lp.output.WriteString(c.Text) - lp.output.WriteByte('\n') - } - } - if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash { - // The printer will not include the comment if it starts past - // the node itself. Trick it into printing by overlapping the - // slash with the end of the statement. - g.List[0].Slash = n.End() - 1 - } - } - node := &printer.CommentedNode{n, lp.fnode.Comments} - lp.config.Fprint(&lp.output, lp.fset, node) -} - -func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) { - if n == nil { - if lp.output.Len() == 0 { - lp.emit() - } - return nil - } - first := lp.fset.Position(n.Pos()).Line - last := lp.fset.Position(n.End()).Line - if first <= lp.line && last >= lp.line { - // Print the innermost statement containing the line. - if stmt, ok := n.(ast.Stmt); ok { - if _, ok := n.(*ast.BlockStmt); !ok { - lp.stmt = stmt - } - } - if first == lp.line && lp.emit() { - return nil - } - return lp - } - return nil -} - -func (lp *linePrinter) trim(n ast.Node) bool { - stmt, ok := n.(ast.Stmt) - if !ok { - return true - } - line := lp.fset.Position(n.Pos()).Line - if line != lp.line { - return false - } - switch stmt := stmt.(type) { - case *ast.IfStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.SwitchStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.TypeSwitchStmt: - stmt.Body = lp.trimBlock(stmt.Body) - case *ast.CaseClause: - stmt.Body = lp.trimList(stmt.Body) - case *ast.CommClause: - stmt.Body = lp.trimList(stmt.Body) - case *ast.BlockStmt: - stmt.List = lp.trimList(stmt.List) - } - return true -} - -func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt { - if !lp.trim(stmt) { - return lp.emptyBlock(stmt) - } - stmt.Rbrace = stmt.Lbrace - return stmt -} - -func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt { - for i := 0; i != len(stmts); i++ { - if !lp.trim(stmts[i]) { - stmts[i] = lp.emptyStmt(stmts[i]) - break - } - } - return stmts -} - -func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt { - return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}} -} - -func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt { - p := n.Pos() - return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p} -} diff --git a/vendor/github.com/pingcap/check/run.go b/vendor/github.com/pingcap/check/run.go deleted file mode 100644 index afa631f4..00000000 --- a/vendor/github.com/pingcap/check/run.go +++ /dev/null @@ -1,179 +0,0 @@ -package check - -import ( - "bufio" - "flag" - "fmt" - "os" - "testing" - "time" -) - -// ----------------------------------------------------------------------- -// Test suite registry. - -var allSuites []interface{} - -// Suite registers the given value as a test suite to be run. Any methods -// starting with the Test prefix in the given value will be considered as -// a test method. -func Suite(suite interface{}) interface{} { - allSuites = append(allSuites, suite) - return suite -} - -// ----------------------------------------------------------------------- -// Public running interface. - -var ( - oldFilterFlag = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run") - oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode") - oldStreamFlag = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)") - oldBenchFlag = flag.Bool("gocheck.b", false, "Run benchmarks") - oldBenchTime = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark") - oldListFlag = flag.Bool("gocheck.list", false, "List the names of all tests that will be run") - oldWorkFlag = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") - - newFilterFlag = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run") - newVerboseFlag = flag.Bool("check.v", false, "Verbose mode") - newStreamFlag = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)") - newBenchFlag = flag.Bool("check.b", false, "Run benchmarks") - newBenchTime = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark") - newBenchMem = flag.Bool("check.bmem", false, "Report memory benchmarks") - newListFlag = flag.Bool("check.list", false, "List the names of all tests that will be run") - newWorkFlag = flag.Bool("check.work", false, "Display and do not remove the test working directory") - newExcludeFlag = flag.String("check.exclude", "", "Regular expression to exclude tests to run") -) - -var CustomVerboseFlag bool - -// TestingT runs all test suites registered with the Suite function, -// printing results to stdout, and reporting any failures back to -// the "testing" package. -func TestingT(testingT *testing.T) { - benchTime := *newBenchTime - if benchTime == 1*time.Second { - benchTime = *oldBenchTime - } - conf := &RunConf{ - Filter: *oldFilterFlag + *newFilterFlag, - Verbose: *oldVerboseFlag || *newVerboseFlag || CustomVerboseFlag, - Stream: *oldStreamFlag || *newStreamFlag, - Benchmark: *oldBenchFlag || *newBenchFlag, - BenchmarkTime: benchTime, - BenchmarkMem: *newBenchMem, - KeepWorkDir: *oldWorkFlag || *newWorkFlag, - Exclude: *newExcludeFlag, - } - if *oldListFlag || *newListFlag { - w := bufio.NewWriter(os.Stdout) - for _, name := range ListAll(conf) { - fmt.Fprintln(w, name) - } - w.Flush() - return - } - result := RunAll(conf) - println(result.String()) - if !result.Passed() { - testingT.Fail() - } -} - -// RunAll runs all test suites registered with the Suite function, using the -// provided run configuration. -func RunAll(runConf *RunConf) *Result { - result := Result{} - for _, suite := range allSuites { - result.Add(Run(suite, runConf)) - } - return &result -} - -// Run runs the provided test suite using the provided run configuration. -func Run(suite interface{}, runConf *RunConf) *Result { - runner := newSuiteRunner(suite, runConf) - return runner.run() -} - -// ListAll returns the names of all the test functions registered with the -// Suite function that will be run with the provided run configuration. -func ListAll(runConf *RunConf) []string { - var names []string - for _, suite := range allSuites { - names = append(names, List(suite, runConf)...) - } - return names -} - -// List returns the names of the test functions in the given -// suite that will be run with the provided run configuration. -func List(suite interface{}, runConf *RunConf) []string { - var names []string - runner := newSuiteRunner(suite, runConf) - for _, t := range runner.tests { - names = append(names, t.String()) - } - return names -} - -// ----------------------------------------------------------------------- -// Result methods. - -func (r *Result) Add(other *Result) { - r.Succeeded += other.Succeeded - r.Skipped += other.Skipped - r.Failed += other.Failed - r.Panicked += other.Panicked - r.FixturePanicked += other.FixturePanicked - r.ExpectedFailures += other.ExpectedFailures - r.Missed += other.Missed - if r.WorkDir != "" && other.WorkDir != "" { - r.WorkDir += ":" + other.WorkDir - } else if other.WorkDir != "" { - r.WorkDir = other.WorkDir - } -} - -func (r *Result) Passed() bool { - return (r.Failed == 0 && r.Panicked == 0 && - r.FixturePanicked == 0 && r.Missed == 0 && - r.RunError == nil) -} - -func (r *Result) String() string { - if r.RunError != nil { - return "ERROR: " + r.RunError.Error() - } - - var value string - if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 && - r.Missed == 0 { - value = "OK: " - } else { - value = "OOPS: " - } - value += fmt.Sprintf("%d passed", r.Succeeded) - if r.Skipped != 0 { - value += fmt.Sprintf(", %d skipped", r.Skipped) - } - if r.ExpectedFailures != 0 { - value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures) - } - if r.Failed != 0 { - value += fmt.Sprintf(", %d FAILED", r.Failed) - } - if r.Panicked != 0 { - value += fmt.Sprintf(", %d PANICKED", r.Panicked) - } - if r.FixturePanicked != 0 { - value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked) - } - if r.Missed != 0 { - value += fmt.Sprintf(", %d MISSED", r.Missed) - } - if r.WorkDir != "" { - value += "\nWORK=" + r.WorkDir - } - return value -} diff --git a/vendor/github.com/satori/go.uuid/LICENSE b/vendor/github.com/satori/go.uuid/LICENSE deleted file mode 100644 index 926d5498..00000000 --- a/vendor/github.com/satori/go.uuid/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (C) 2013-2018 by Maxim Bublis - -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/github.com/satori/go.uuid/codec.go b/vendor/github.com/satori/go.uuid/codec.go deleted file mode 100644 index 656892c5..00000000 --- a/vendor/github.com/satori/go.uuid/codec.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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. - -package uuid - -import ( - "bytes" - "encoding/hex" - "fmt" -) - -// FromBytes returns UUID converted from raw byte slice input. -// It will return error if the slice isn't 16 bytes long. -func FromBytes(input []byte) (u UUID, err error) { - err = u.UnmarshalBinary(input) - return -} - -// FromBytesOrNil returns UUID converted from raw byte slice input. -// Same behavior as FromBytes, but returns a Nil UUID on error. -func FromBytesOrNil(input []byte) UUID { - uuid, err := FromBytes(input) - if err != nil { - return Nil - } - return uuid -} - -// FromString returns UUID parsed from string input. -// Input is expected in a form accepted by UnmarshalText. -func FromString(input string) (u UUID, err error) { - err = u.UnmarshalText([]byte(input)) - return -} - -// FromStringOrNil returns UUID parsed from string input. -// Same behavior as FromString, but returns a Nil UUID on error. -func FromStringOrNil(input string) UUID { - uuid, err := FromString(input) - if err != nil { - return Nil - } - return uuid -} - -// MarshalText implements the encoding.TextMarshaler interface. -// The encoding is the same as returned by String. -func (u UUID) MarshalText() (text []byte, err error) { - text = []byte(u.String()) - return -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// Following formats are supported: -// "6ba7b810-9dad-11d1-80b4-00c04fd430c8", -// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}", -// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" -// "6ba7b8109dad11d180b400c04fd430c8" -// ABNF for supported UUID text representation follows: -// uuid := canonical | hashlike | braced | urn -// plain := canonical | hashlike -// canonical := 4hexoct '-' 2hexoct '-' 2hexoct '-' 6hexoct -// hashlike := 12hexoct -// braced := '{' plain '}' -// urn := URN ':' UUID-NID ':' plain -// URN := 'urn' -// UUID-NID := 'uuid' -// 12hexoct := 6hexoct 6hexoct -// 6hexoct := 4hexoct 2hexoct -// 4hexoct := 2hexoct 2hexoct -// 2hexoct := hexoct hexoct -// hexoct := hexdig hexdig -// hexdig := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | -// 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | -// 'A' | 'B' | 'C' | 'D' | 'E' | 'F' -func (u *UUID) UnmarshalText(text []byte) (err error) { - switch len(text) { - case 32: - return u.decodeHashLike(text) - case 36: - return u.decodeCanonical(text) - case 38: - return u.decodeBraced(text) - case 41: - fallthrough - case 45: - return u.decodeURN(text) - default: - return fmt.Errorf("uuid: incorrect UUID length: %s", text) - } -} - -// decodeCanonical decodes UUID string in format -// "6ba7b810-9dad-11d1-80b4-00c04fd430c8". -func (u *UUID) decodeCanonical(t []byte) (err error) { - if t[8] != '-' || t[13] != '-' || t[18] != '-' || t[23] != '-' { - return fmt.Errorf("uuid: incorrect UUID format %s", t) - } - - src := t[:] - dst := u[:] - - for i, byteGroup := range byteGroups { - if i > 0 { - src = src[1:] // skip dash - } - _, err = hex.Decode(dst[:byteGroup/2], src[:byteGroup]) - if err != nil { - return - } - src = src[byteGroup:] - dst = dst[byteGroup/2:] - } - - return -} - -// decodeHashLike decodes UUID string in format -// "6ba7b8109dad11d180b400c04fd430c8". -func (u *UUID) decodeHashLike(t []byte) (err error) { - src := t[:] - dst := u[:] - - if _, err = hex.Decode(dst, src); err != nil { - return err - } - return -} - -// decodeBraced decodes UUID string in format -// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}" or in format -// "{6ba7b8109dad11d180b400c04fd430c8}". -func (u *UUID) decodeBraced(t []byte) (err error) { - l := len(t) - - if t[0] != '{' || t[l-1] != '}' { - return fmt.Errorf("uuid: incorrect UUID format %s", t) - } - - return u.decodePlain(t[1 : l-1]) -} - -// decodeURN decodes UUID string in format -// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in format -// "urn:uuid:6ba7b8109dad11d180b400c04fd430c8". -func (u *UUID) decodeURN(t []byte) (err error) { - total := len(t) - - urn_uuid_prefix := t[:9] - - if !bytes.Equal(urn_uuid_prefix, urnPrefix) { - return fmt.Errorf("uuid: incorrect UUID format: %s", t) - } - - return u.decodePlain(t[9:total]) -} - -// decodePlain decodes UUID string in canonical format -// "6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in hash-like format -// "6ba7b8109dad11d180b400c04fd430c8". -func (u *UUID) decodePlain(t []byte) (err error) { - switch len(t) { - case 32: - return u.decodeHashLike(t) - case 36: - return u.decodeCanonical(t) - default: - return fmt.Errorf("uuid: incorrrect UUID length: %s", t) - } -} - -// MarshalBinary implements the encoding.BinaryMarshaler interface. -func (u UUID) MarshalBinary() (data []byte, err error) { - data = u.Bytes() - return -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. -// It will return error if the slice isn't 16 bytes long. -func (u *UUID) UnmarshalBinary(data []byte) (err error) { - if len(data) != Size { - err = fmt.Errorf("uuid: UUID must be exactly 16 bytes long, got %d bytes", len(data)) - return - } - copy(u[:], data) - - return -} diff --git a/vendor/github.com/satori/go.uuid/generator.go b/vendor/github.com/satori/go.uuid/generator.go deleted file mode 100644 index 3f2f1da2..00000000 --- a/vendor/github.com/satori/go.uuid/generator.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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. - -package uuid - -import ( - "crypto/md5" - "crypto/rand" - "crypto/sha1" - "encoding/binary" - "hash" - "net" - "os" - "sync" - "time" -) - -// Difference in 100-nanosecond intervals between -// UUID epoch (October 15, 1582) and Unix epoch (January 1, 1970). -const epochStart = 122192928000000000 - -var ( - global = newDefaultGenerator() - - epochFunc = unixTimeFunc - posixUID = uint32(os.Getuid()) - posixGID = uint32(os.Getgid()) -) - -// NewV1 returns UUID based on current timestamp and MAC address. -func NewV1() UUID { - return global.NewV1() -} - -// NewV2 returns DCE Security UUID based on POSIX UID/GID. -func NewV2(domain byte) UUID { - return global.NewV2(domain) -} - -// NewV3 returns UUID based on MD5 hash of namespace UUID and name. -func NewV3(ns UUID, name string) UUID { - return global.NewV3(ns, name) -} - -// NewV4 returns random generated UUID. -func NewV4() UUID { - return global.NewV4() -} - -// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. -func NewV5(ns UUID, name string) UUID { - return global.NewV5(ns, name) -} - -// Generator provides interface for generating UUIDs. -type Generator interface { - NewV1() UUID - NewV2(domain byte) UUID - NewV3(ns UUID, name string) UUID - NewV4() UUID - NewV5(ns UUID, name string) UUID -} - -// Default generator implementation. -type generator struct { - storageOnce sync.Once - storageMutex sync.Mutex - - lastTime uint64 - clockSequence uint16 - hardwareAddr [6]byte -} - -func newDefaultGenerator() Generator { - return &generator{} -} - -// NewV1 returns UUID based on current timestamp and MAC address. -func (g *generator) NewV1() UUID { - u := UUID{} - - timeNow, clockSeq, hardwareAddr := g.getStorage() - - binary.BigEndian.PutUint32(u[0:], uint32(timeNow)) - binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) - binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) - binary.BigEndian.PutUint16(u[8:], clockSeq) - - copy(u[10:], hardwareAddr) - - u.SetVersion(V1) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV2 returns DCE Security UUID based on POSIX UID/GID. -func (g *generator) NewV2(domain byte) UUID { - u := UUID{} - - timeNow, clockSeq, hardwareAddr := g.getStorage() - - switch domain { - case DomainPerson: - binary.BigEndian.PutUint32(u[0:], posixUID) - case DomainGroup: - binary.BigEndian.PutUint32(u[0:], posixGID) - } - - binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) - binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) - binary.BigEndian.PutUint16(u[8:], clockSeq) - u[9] = domain - - copy(u[10:], hardwareAddr) - - u.SetVersion(V2) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV3 returns UUID based on MD5 hash of namespace UUID and name. -func (g *generator) NewV3(ns UUID, name string) UUID { - u := newFromHash(md5.New(), ns, name) - u.SetVersion(V3) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV4 returns random generated UUID. -func (g *generator) NewV4() UUID { - u := UUID{} - g.safeRandom(u[:]) - u.SetVersion(V4) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. -func (g *generator) NewV5(ns UUID, name string) UUID { - u := newFromHash(sha1.New(), ns, name) - u.SetVersion(V5) - u.SetVariant(VariantRFC4122) - - return u -} - -func (g *generator) initStorage() { - g.initClockSequence() - g.initHardwareAddr() -} - -func (g *generator) initClockSequence() { - buf := make([]byte, 2) - g.safeRandom(buf) - g.clockSequence = binary.BigEndian.Uint16(buf) -} - -func (g *generator) initHardwareAddr() { - interfaces, err := net.Interfaces() - if err == nil { - for _, iface := range interfaces { - if len(iface.HardwareAddr) >= 6 { - copy(g.hardwareAddr[:], iface.HardwareAddr) - return - } - } - } - - // Initialize hardwareAddr randomly in case - // of real network interfaces absence - g.safeRandom(g.hardwareAddr[:]) - - // Set multicast bit as recommended in RFC 4122 - g.hardwareAddr[0] |= 0x01 -} - -func (g *generator) safeRandom(dest []byte) { - if _, err := rand.Read(dest); err != nil { - panic(err) - } -} - -// Returns UUID v1/v2 storage state. -// Returns epoch timestamp, clock sequence, and hardware address. -func (g *generator) getStorage() (uint64, uint16, []byte) { - g.storageOnce.Do(g.initStorage) - - g.storageMutex.Lock() - defer g.storageMutex.Unlock() - - timeNow := epochFunc() - // Clock changed backwards since last UUID generation. - // Should increase clock sequence. - if timeNow <= g.lastTime { - g.clockSequence++ - } - g.lastTime = timeNow - - return timeNow, g.clockSequence, g.hardwareAddr[:] -} - -// Returns difference in 100-nanosecond intervals between -// UUID epoch (October 15, 1582) and current time. -// This is default epoch calculation function. -func unixTimeFunc() uint64 { - return epochStart + uint64(time.Now().UnixNano()/100) -} - -// Returns UUID based on hashing of namespace UUID and name. -func newFromHash(h hash.Hash, ns UUID, name string) UUID { - u := UUID{} - h.Write(ns[:]) - h.Write([]byte(name)) - copy(u[:], h.Sum(nil)) - - return u -} diff --git a/vendor/github.com/satori/go.uuid/sql.go b/vendor/github.com/satori/go.uuid/sql.go deleted file mode 100644 index 56759d39..00000000 --- a/vendor/github.com/satori/go.uuid/sql.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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. - -package uuid - -import ( - "database/sql/driver" - "fmt" -) - -// Value implements the driver.Valuer interface. -func (u UUID) Value() (driver.Value, error) { - return u.String(), nil -} - -// Scan implements the sql.Scanner interface. -// A 16-byte slice is handled by UnmarshalBinary, while -// a longer byte slice or a string is handled by UnmarshalText. -func (u *UUID) Scan(src interface{}) error { - switch src := src.(type) { - case []byte: - if len(src) == Size { - return u.UnmarshalBinary(src) - } - return u.UnmarshalText(src) - - case string: - return u.UnmarshalText([]byte(src)) - } - - return fmt.Errorf("uuid: cannot convert %T to UUID", src) -} - -// NullUUID can be used with the standard sql package to represent a -// UUID value that can be NULL in the database -type NullUUID struct { - UUID UUID - Valid bool -} - -// Value implements the driver.Valuer interface. -func (u NullUUID) Value() (driver.Value, error) { - if !u.Valid { - return nil, nil - } - // Delegate to UUID Value function - return u.UUID.Value() -} - -// Scan implements the sql.Scanner interface. -func (u *NullUUID) Scan(src interface{}) error { - if src == nil { - u.UUID, u.Valid = Nil, false - return nil - } - - // Delegate to UUID Scan function - u.Valid = true - return u.UUID.Scan(src) -} diff --git a/vendor/github.com/satori/go.uuid/uuid.go b/vendor/github.com/satori/go.uuid/uuid.go deleted file mode 100644 index a2b8e2ca..00000000 --- a/vendor/github.com/satori/go.uuid/uuid.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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. - -// Package uuid provides implementation of Universally Unique Identifier (UUID). -// Supported versions are 1, 3, 4 and 5 (as specified in RFC 4122) and -// version 2 (as specified in DCE 1.1). -package uuid - -import ( - "bytes" - "encoding/hex" -) - -// Size of a UUID in bytes. -const Size = 16 - -// UUID representation compliant with specification -// described in RFC 4122. -type UUID [Size]byte - -// UUID versions -const ( - _ byte = iota - V1 - V2 - V3 - V4 - V5 -) - -// UUID layout variants. -const ( - VariantNCS byte = iota - VariantRFC4122 - VariantMicrosoft - VariantFuture -) - -// UUID DCE domains. -const ( - DomainPerson = iota - DomainGroup - DomainOrg -) - -// String parse helpers. -var ( - urnPrefix = []byte("urn:uuid:") - byteGroups = []int{8, 4, 4, 4, 12} -) - -// Nil is special form of UUID that is specified to have all -// 128 bits set to zero. -var Nil = UUID{} - -// Predefined namespace UUIDs. -var ( - NamespaceDNS = Must(FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) - NamespaceURL = Must(FromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) - NamespaceOID = Must(FromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) - NamespaceX500 = Must(FromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) -) - -// Equal returns true if u1 and u2 equals, otherwise returns false. -func Equal(u1 UUID, u2 UUID) bool { - return bytes.Equal(u1[:], u2[:]) -} - -// Version returns algorithm version used to generate UUID. -func (u UUID) Version() byte { - return u[6] >> 4 -} - -// Variant returns UUID layout variant. -func (u UUID) Variant() byte { - switch { - case (u[8] >> 7) == 0x00: - return VariantNCS - case (u[8] >> 6) == 0x02: - return VariantRFC4122 - case (u[8] >> 5) == 0x06: - return VariantMicrosoft - case (u[8] >> 5) == 0x07: - fallthrough - default: - return VariantFuture - } -} - -// Bytes returns bytes slice representation of UUID. -func (u UUID) Bytes() []byte { - return u[:] -} - -// Returns canonical string representation of UUID: -// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. -func (u UUID) String() string { - buf := make([]byte, 36) - - hex.Encode(buf[0:8], u[0:4]) - buf[8] = '-' - hex.Encode(buf[9:13], u[4:6]) - buf[13] = '-' - hex.Encode(buf[14:18], u[6:8]) - buf[18] = '-' - hex.Encode(buf[19:23], u[8:10]) - buf[23] = '-' - hex.Encode(buf[24:], u[10:]) - - return string(buf) -} - -// SetVersion sets version bits. -func (u *UUID) SetVersion(v byte) { - u[6] = (u[6] & 0x0f) | (v << 4) -} - -// SetVariant sets variant bits. -func (u *UUID) SetVariant(v byte) { - switch v { - case VariantNCS: - u[8] = (u[8]&(0xff>>1) | (0x00 << 7)) - case VariantRFC4122: - u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) - case VariantMicrosoft: - u[8] = (u[8]&(0xff>>3) | (0x06 << 5)) - case VariantFuture: - fallthrough - default: - u[8] = (u[8]&(0xff>>3) | (0x07 << 5)) - } -} - -// Must is a helper that wraps a call to a function returning (UUID, error) -// and panics if the error is non-nil. It is intended for use in variable -// initializations such as -// var packageUUID = uuid.Must(uuid.FromString("123e4567-e89b-12d3-a456-426655440000")); -func Must(u UUID, err error) UUID { - if err != nil { - panic(err) - } - return u -} diff --git a/vendor/github.com/shopspring/decimal/LICENSE b/vendor/github.com/shopspring/decimal/LICENSE deleted file mode 100644 index ad2148aa..00000000 --- a/vendor/github.com/shopspring/decimal/LICENSE +++ /dev/null @@ -1,45 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Spring, Inc. - -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. - -- Based on https://github.com/oguzbilgic/fpd, which has the following license: -""" -The MIT License (MIT) - -Copyright (c) 2013 Oguz Bilgic - -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/github.com/shopspring/decimal/decimal-go.go b/vendor/github.com/shopspring/decimal/decimal-go.go deleted file mode 100644 index e08a15ce..00000000 --- a/vendor/github.com/shopspring/decimal/decimal-go.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2009 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. - -// Multiprecision decimal numbers. -// For floating-point formatting only; not general purpose. -// Only operations are assign and (binary) left/right shift. -// Can do binary floating point in multiprecision decimal precisely -// because 2 divides 10; cannot do decimal floating point -// in multiprecision binary precisely. -package decimal - -type decimal struct { - d [800]byte // digits, big-endian representation - nd int // number of digits used - dp int // decimal point - neg bool // negative flag - trunc bool // discarded nonzero digits beyond d[:nd] -} - -func (a *decimal) String() string { - n := 10 + a.nd - if a.dp > 0 { - n += a.dp - } - if a.dp < 0 { - n += -a.dp - } - - buf := make([]byte, n) - w := 0 - switch { - case a.nd == 0: - return "0" - - case a.dp <= 0: - // zeros fill space between decimal point and digits - buf[w] = '0' - w++ - buf[w] = '.' - w++ - w += digitZero(buf[w : w+-a.dp]) - w += copy(buf[w:], a.d[0:a.nd]) - - case a.dp < a.nd: - // decimal point in middle of digits - w += copy(buf[w:], a.d[0:a.dp]) - buf[w] = '.' - w++ - w += copy(buf[w:], a.d[a.dp:a.nd]) - - default: - // zeros fill space between digits and decimal point - w += copy(buf[w:], a.d[0:a.nd]) - w += digitZero(buf[w : w+a.dp-a.nd]) - } - return string(buf[0:w]) -} - -func digitZero(dst []byte) int { - for i := range dst { - dst[i] = '0' - } - return len(dst) -} - -// trim trailing zeros from number. -// (They are meaningless; the decimal point is tracked -// independent of the number of digits.) -func trim(a *decimal) { - for a.nd > 0 && a.d[a.nd-1] == '0' { - a.nd-- - } - if a.nd == 0 { - a.dp = 0 - } -} - -// Assign v to a. -func (a *decimal) Assign(v uint64) { - var buf [24]byte - - // Write reversed decimal in buf. - n := 0 - for v > 0 { - v1 := v / 10 - v -= 10 * v1 - buf[n] = byte(v + '0') - n++ - v = v1 - } - - // Reverse again to produce forward decimal in a.d. - a.nd = 0 - for n--; n >= 0; n-- { - a.d[a.nd] = buf[n] - a.nd++ - } - a.dp = a.nd - trim(a) -} - -// Maximum shift that we can do in one pass without overflow. -// A uint has 32 or 64 bits, and we have to be able to accommodate 9<> 63) -const maxShift = uintSize - 4 - -// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow. -func rightShift(a *decimal, k uint) { - r := 0 // read pointer - w := 0 // write pointer - - // Pick up enough leading digits to cover first shift. - var n uint - for ; n>>k == 0; r++ { - if r >= a.nd { - if n == 0 { - // a == 0; shouldn't get here, but handle anyway. - a.nd = 0 - return - } - for n>>k == 0 { - n = n * 10 - r++ - } - break - } - c := uint(a.d[r]) - n = n*10 + c - '0' - } - a.dp -= r - 1 - - var mask uint = (1 << k) - 1 - - // Pick up a digit, put down a digit. - for ; r < a.nd; r++ { - c := uint(a.d[r]) - dig := n >> k - n &= mask - a.d[w] = byte(dig + '0') - w++ - n = n*10 + c - '0' - } - - // Put down extra digits. - for n > 0 { - dig := n >> k - n &= mask - if w < len(a.d) { - a.d[w] = byte(dig + '0') - w++ - } else if dig > 0 { - a.trunc = true - } - n = n * 10 - } - - a.nd = w - trim(a) -} - -// Cheat sheet for left shift: table indexed by shift count giving -// number of new digits that will be introduced by that shift. -// -// For example, leftcheats[4] = {2, "625"}. That means that -// if we are shifting by 4 (multiplying by 16), it will add 2 digits -// when the string prefix is "625" through "999", and one fewer digit -// if the string prefix is "000" through "624". -// -// Credit for this trick goes to Ken. - -type leftCheat struct { - delta int // number of new digits - cutoff string // minus one digit if original < a. -} - -var leftcheats = []leftCheat{ - // Leading digits of 1/2^i = 5^i. - // 5^23 is not an exact 64-bit floating point number, - // so have to use bc for the math. - // Go up to 60 to be large enough for 32bit and 64bit platforms. - /* - seq 60 | sed 's/^/5^/' | bc | - awk 'BEGIN{ print "\t{ 0, \"\" }," } - { - log2 = log(2)/log(10) - printf("\t{ %d, \"%s\" },\t// * %d\n", - int(log2*NR+1), $0, 2**NR) - }' - */ - {0, ""}, - {1, "5"}, // * 2 - {1, "25"}, // * 4 - {1, "125"}, // * 8 - {2, "625"}, // * 16 - {2, "3125"}, // * 32 - {2, "15625"}, // * 64 - {3, "78125"}, // * 128 - {3, "390625"}, // * 256 - {3, "1953125"}, // * 512 - {4, "9765625"}, // * 1024 - {4, "48828125"}, // * 2048 - {4, "244140625"}, // * 4096 - {4, "1220703125"}, // * 8192 - {5, "6103515625"}, // * 16384 - {5, "30517578125"}, // * 32768 - {5, "152587890625"}, // * 65536 - {6, "762939453125"}, // * 131072 - {6, "3814697265625"}, // * 262144 - {6, "19073486328125"}, // * 524288 - {7, "95367431640625"}, // * 1048576 - {7, "476837158203125"}, // * 2097152 - {7, "2384185791015625"}, // * 4194304 - {7, "11920928955078125"}, // * 8388608 - {8, "59604644775390625"}, // * 16777216 - {8, "298023223876953125"}, // * 33554432 - {8, "1490116119384765625"}, // * 67108864 - {9, "7450580596923828125"}, // * 134217728 - {9, "37252902984619140625"}, // * 268435456 - {9, "186264514923095703125"}, // * 536870912 - {10, "931322574615478515625"}, // * 1073741824 - {10, "4656612873077392578125"}, // * 2147483648 - {10, "23283064365386962890625"}, // * 4294967296 - {10, "116415321826934814453125"}, // * 8589934592 - {11, "582076609134674072265625"}, // * 17179869184 - {11, "2910383045673370361328125"}, // * 34359738368 - {11, "14551915228366851806640625"}, // * 68719476736 - {12, "72759576141834259033203125"}, // * 137438953472 - {12, "363797880709171295166015625"}, // * 274877906944 - {12, "1818989403545856475830078125"}, // * 549755813888 - {13, "9094947017729282379150390625"}, // * 1099511627776 - {13, "45474735088646411895751953125"}, // * 2199023255552 - {13, "227373675443232059478759765625"}, // * 4398046511104 - {13, "1136868377216160297393798828125"}, // * 8796093022208 - {14, "5684341886080801486968994140625"}, // * 17592186044416 - {14, "28421709430404007434844970703125"}, // * 35184372088832 - {14, "142108547152020037174224853515625"}, // * 70368744177664 - {15, "710542735760100185871124267578125"}, // * 140737488355328 - {15, "3552713678800500929355621337890625"}, // * 281474976710656 - {15, "17763568394002504646778106689453125"}, // * 562949953421312 - {16, "88817841970012523233890533447265625"}, // * 1125899906842624 - {16, "444089209850062616169452667236328125"}, // * 2251799813685248 - {16, "2220446049250313080847263336181640625"}, // * 4503599627370496 - {16, "11102230246251565404236316680908203125"}, // * 9007199254740992 - {17, "55511151231257827021181583404541015625"}, // * 18014398509481984 - {17, "277555756156289135105907917022705078125"}, // * 36028797018963968 - {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936 - {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872 - {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744 - {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488 - {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976 -} - -// Is the leading prefix of b lexicographically less than s? -func prefixIsLessThan(b []byte, s string) bool { - for i := 0; i < len(s); i++ { - if i >= len(b) { - return true - } - if b[i] != s[i] { - return b[i] < s[i] - } - } - return false -} - -// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow. -func leftShift(a *decimal, k uint) { - delta := leftcheats[k].delta - if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { - delta-- - } - - r := a.nd // read index - w := a.nd + delta // write index - - // Pick up a digit, put down a digit. - var n uint - for r--; r >= 0; r-- { - n += (uint(a.d[r]) - '0') << k - quo := n / 10 - rem := n - 10*quo - w-- - if w < len(a.d) { - a.d[w] = byte(rem + '0') - } else if rem != 0 { - a.trunc = true - } - n = quo - } - - // Put down extra digits. - for n > 0 { - quo := n / 10 - rem := n - 10*quo - w-- - if w < len(a.d) { - a.d[w] = byte(rem + '0') - } else if rem != 0 { - a.trunc = true - } - n = quo - } - - a.nd += delta - if a.nd >= len(a.d) { - a.nd = len(a.d) - } - a.dp += delta - trim(a) -} - -// Binary shift left (k > 0) or right (k < 0). -func (a *decimal) Shift(k int) { - switch { - case a.nd == 0: - // nothing to do: a == 0 - case k > 0: - for k > maxShift { - leftShift(a, maxShift) - k -= maxShift - } - leftShift(a, uint(k)) - case k < 0: - for k < -maxShift { - rightShift(a, maxShift) - k += maxShift - } - rightShift(a, uint(-k)) - } -} - -// If we chop a at nd digits, should we round up? -func shouldRoundUp(a *decimal, nd int) bool { - if nd < 0 || nd >= a.nd { - return false - } - if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even - // if we truncated, a little higher than what's recorded - always round up - if a.trunc { - return true - } - return nd > 0 && (a.d[nd-1]-'0')%2 != 0 - } - // not halfway - digit tells all - return a.d[nd] >= '5' -} - -// Round a to nd digits (or fewer). -// If nd is zero, it means we're rounding -// just to the left of the digits, as in -// 0.09 -> 0.1. -func (a *decimal) Round(nd int) { - if nd < 0 || nd >= a.nd { - return - } - if shouldRoundUp(a, nd) { - a.RoundUp(nd) - } else { - a.RoundDown(nd) - } -} - -// Round a down to nd digits (or fewer). -func (a *decimal) RoundDown(nd int) { - if nd < 0 || nd >= a.nd { - return - } - a.nd = nd - trim(a) -} - -// Round a up to nd digits (or fewer). -func (a *decimal) RoundUp(nd int) { - if nd < 0 || nd >= a.nd { - return - } - - // round up - for i := nd - 1; i >= 0; i-- { - c := a.d[i] - if c < '9' { // can stop after this digit - a.d[i]++ - a.nd = i + 1 - return - } - } - - // Number is all 9s. - // Change to single 1 with adjusted decimal point. - a.d[0] = '1' - a.nd = 1 - a.dp++ -} - -// Extract integer part, rounded appropriately. -// No guarantees about overflow. -func (a *decimal) RoundedInteger() uint64 { - if a.dp > 20 { - return 0xFFFFFFFFFFFFFFFF - } - var i int - n := uint64(0) - for i = 0; i < a.dp && i < a.nd; i++ { - n = n*10 + uint64(a.d[i]-'0') - } - for ; i < a.dp; i++ { - n *= 10 - } - if shouldRoundUp(a, a.dp) { - n++ - } - return n -} diff --git a/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/shopspring/decimal/decimal.go deleted file mode 100644 index 134ece2f..00000000 --- a/vendor/github.com/shopspring/decimal/decimal.go +++ /dev/null @@ -1,1434 +0,0 @@ -// Package decimal implements an arbitrary precision fixed-point decimal. -// -// To use as part of a struct: -// -// type Struct struct { -// Number Decimal -// } -// -// The zero-value of a Decimal is 0, as you would expect. -// -// The best way to create a new Decimal is to use decimal.NewFromString, ex: -// -// n, err := decimal.NewFromString("-123.4567") -// n.String() // output: "-123.4567" -// -// NOTE: This can "only" represent numbers with a maximum of 2^31 digits -// after the decimal point. -package decimal - -import ( - "database/sql/driver" - "encoding/binary" - "fmt" - "math" - "math/big" - "strconv" - "strings" -) - -// DivisionPrecision is the number of decimal places in the result when it -// doesn't divide exactly. -// -// Example: -// -// d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) -// d1.String() // output: "0.6666666666666667" -// d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000) -// d2.String() // output: "0.0000666666666667" -// d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3) -// d3.String() // output: "6666.6666666666666667" -// decimal.DivisionPrecision = 3 -// d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) -// d4.String() // output: "0.667" -// -var DivisionPrecision = 16 - -// MarshalJSONWithoutQuotes should be set to true if you want the decimal to -// be JSON marshaled as a number, instead of as a string. -// WARNING: this is dangerous for decimals with many digits, since many JSON -// unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 -// double-precision floating point numbers, which means you can potentially -// silently lose precision. -var MarshalJSONWithoutQuotes = false - -// Zero constant, to make computations faster. -var Zero = New(0, 1) - -// fiveDec used in Cash Rounding -var fiveDec = New(5, 0) - -var zeroInt = big.NewInt(0) -var oneInt = big.NewInt(1) -var twoInt = big.NewInt(2) -var fourInt = big.NewInt(4) -var fiveInt = big.NewInt(5) -var tenInt = big.NewInt(10) -var twentyInt = big.NewInt(20) - -// Decimal represents a fixed-point decimal. It is immutable. -// number = value * 10 ^ exp -type Decimal struct { - value *big.Int - - // NOTE(vadim): this must be an int32, because we cast it to float64 during - // calculations. If exp is 64 bit, we might lose precision. - // If we cared about being able to represent every possible decimal, we - // could make exp a *big.Int but it would hurt performance and numbers - // like that are unrealistic. - exp int32 -} - -// New returns a new fixed-point decimal, value * 10 ^ exp. -func New(value int64, exp int32) Decimal { - return Decimal{ - value: big.NewInt(value), - exp: exp, - } -} - -// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp -func NewFromBigInt(value *big.Int, exp int32) Decimal { - return Decimal{ - value: big.NewInt(0).Set(value), - exp: exp, - } -} - -// NewFromString returns a new Decimal from a string representation. -// -// Example: -// -// d, err := NewFromString("-123.45") -// d2, err := NewFromString(".0001") -// -func NewFromString(value string) (Decimal, error) { - originalInput := value - var intString string - var exp int64 - - // Check if number is using scientific notation - eIndex := strings.IndexAny(value, "Ee") - if eIndex != -1 { - expInt, err := strconv.ParseInt(value[eIndex+1:], 10, 32) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { - return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", value) - } - return Decimal{}, fmt.Errorf("can't convert %s to decimal: exponent is not numeric", value) - } - value = value[:eIndex] - exp = expInt - } - - parts := strings.Split(value, ".") - if len(parts) == 1 { - // There is no decimal point, we can just parse the original string as - // an int - intString = value - } else if len(parts) == 2 { - // strip the insignificant digits for more accurate comparisons. - decimalPart := strings.TrimRight(parts[1], "0") - intString = parts[0] + decimalPart - expInt := -len(decimalPart) - exp += int64(expInt) - } else { - return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) - } - - dValue := new(big.Int) - _, ok := dValue.SetString(intString, 10) - if !ok { - return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) - } - - if exp < math.MinInt32 || exp > math.MaxInt32 { - // NOTE(vadim): I doubt a string could realistically be this long - return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", originalInput) - } - - return Decimal{ - value: dValue, - exp: int32(exp), - }, nil -} - -// RequireFromString returns a new Decimal from a string representation -// or panics if NewFromString would have returned an error. -// -// Example: -// -// d := RequireFromString("-123.45") -// d2 := RequireFromString(".0001") -// -func RequireFromString(value string) Decimal { - dec, err := NewFromString(value) - if err != nil { - panic(err) - } - return dec -} - -// NewFromFloat converts a float64 to Decimal. -// -// The converted number will contain the number of significant digits that can be -// represented in a float with reliable roundtrip. -// This is typically 15 digits, but may be more in some cases. -// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. -// -// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. -// -// NOTE: this will panic on NaN, +/-inf -func NewFromFloat(value float64) Decimal { - if value == 0 { - return New(0, 0) - } - return newFromFloat(value, math.Float64bits(value), &float64info) -} - -// NewFromFloat converts a float32 to Decimal. -// -// The converted number will contain the number of significant digits that can be -// represented in a float with reliable roundtrip. -// This is typically 6-8 digits depending on the input. -// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. -// -// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. -// -// NOTE: this will panic on NaN, +/-inf -func NewFromFloat32(value float32) Decimal { - if value == 0 { - return New(0, 0) - } - // XOR is workaround for https://github.com/golang/go/issues/26285 - a := math.Float32bits(value) ^ 0x80808080 - return newFromFloat(float64(value), uint64(a)^0x80808080, &float32info) -} - -func newFromFloat(val float64, bits uint64, flt *floatInfo) Decimal { - if math.IsNaN(val) || math.IsInf(val, 0) { - panic(fmt.Sprintf("Cannot create a Decimal from %v", val)) - } - exp := int(bits>>flt.mantbits) & (1<>(flt.expbits+flt.mantbits) != 0 - - roundShortest(&d, mant, exp, flt) - // If less than 19 digits, we can do calculation in an int64. - if d.nd < 19 { - tmp := int64(0) - m := int64(1) - for i := d.nd - 1; i >= 0; i-- { - tmp += m * int64(d.d[i]-'0') - m *= 10 - } - if d.neg { - tmp *= -1 - } - return Decimal{value: big.NewInt(tmp), exp: int32(d.dp) - int32(d.nd)} - } - dValue := new(big.Int) - dValue, ok := dValue.SetString(string(d.d[:d.nd]), 10) - if ok { - return Decimal{value: dValue, exp: int32(d.dp) - int32(d.nd)} - } - - return NewFromFloatWithExponent(val, int32(d.dp)-int32(d.nd)) -} - -// NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary -// number of fractional digits. -// -// Example: -// -// NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" -// -func NewFromFloatWithExponent(value float64, exp int32) Decimal { - if math.IsNaN(value) || math.IsInf(value, 0) { - panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) - } - - bits := math.Float64bits(value) - mant := bits & (1<<52 - 1) - exp2 := int32((bits >> 52) & (1<<11 - 1)) - sign := bits >> 63 - - if exp2 == 0 { - // specials - if mant == 0 { - return Decimal{} - } else { - // subnormal - exp2++ - } - } else { - // normal - mant |= 1 << 52 - } - - exp2 -= 1023 + 52 - - // normalizing base-2 values - for mant&1 == 0 { - mant = mant >> 1 - exp2++ - } - - // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 - if exp < 0 && exp < exp2 { - if exp2 < 0 { - exp = exp2 - } else { - exp = 0 - } - } - - // representing 10^M * 2^N as 5^M * 2^(M+N) - exp2 -= exp - - temp := big.NewInt(1) - dMant := big.NewInt(int64(mant)) - - // applying 5^M - if exp > 0 { - temp = temp.SetInt64(int64(exp)) - temp = temp.Exp(fiveInt, temp, nil) - } else if exp < 0 { - temp = temp.SetInt64(-int64(exp)) - temp = temp.Exp(fiveInt, temp, nil) - dMant = dMant.Mul(dMant, temp) - temp = temp.SetUint64(1) - } - - // applying 2^(M+N) - if exp2 > 0 { - dMant = dMant.Lsh(dMant, uint(exp2)) - } else if exp2 < 0 { - temp = temp.Lsh(temp, uint(-exp2)) - } - - // rounding and downscaling - if exp > 0 || exp2 < 0 { - halfDown := new(big.Int).Rsh(temp, 1) - dMant = dMant.Add(dMant, halfDown) - dMant = dMant.Quo(dMant, temp) - } - - if sign == 1 { - dMant = dMant.Neg(dMant) - } - - return Decimal{ - value: dMant, - exp: exp, - } -} - -// rescale returns a rescaled version of the decimal. Returned -// decimal may be less precise if the given exponent is bigger -// than the initial exponent of the Decimal. -// NOTE: this will truncate, NOT round -// -// Example: -// -// d := New(12345, -4) -// d2 := d.rescale(-1) -// d3 := d2.rescale(-4) -// println(d1) -// println(d2) -// println(d3) -// -// Output: -// -// 1.2345 -// 1.2 -// 1.2000 -// -func (d Decimal) rescale(exp int32) Decimal { - d.ensureInitialized() - // NOTE(vadim): must convert exps to float64 before - to prevent overflow - diff := math.Abs(float64(exp) - float64(d.exp)) - value := new(big.Int).Set(d.value) - - expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) - if exp > d.exp { - value = value.Quo(value, expScale) - } else if exp < d.exp { - value = value.Mul(value, expScale) - } - - return Decimal{ - value: value, - exp: exp, - } -} - -// Abs returns the absolute value of the decimal. -func (d Decimal) Abs() Decimal { - d.ensureInitialized() - d2Value := new(big.Int).Abs(d.value) - return Decimal{ - value: d2Value, - exp: d.exp, - } -} - -// Add returns d + d2. -func (d Decimal) Add(d2 Decimal) Decimal { - baseScale := min(d.exp, d2.exp) - rd := d.rescale(baseScale) - rd2 := d2.rescale(baseScale) - - d3Value := new(big.Int).Add(rd.value, rd2.value) - return Decimal{ - value: d3Value, - exp: baseScale, - } -} - -// Sub returns d - d2. -func (d Decimal) Sub(d2 Decimal) Decimal { - baseScale := min(d.exp, d2.exp) - rd := d.rescale(baseScale) - rd2 := d2.rescale(baseScale) - - d3Value := new(big.Int).Sub(rd.value, rd2.value) - return Decimal{ - value: d3Value, - exp: baseScale, - } -} - -// Neg returns -d. -func (d Decimal) Neg() Decimal { - d.ensureInitialized() - val := new(big.Int).Neg(d.value) - return Decimal{ - value: val, - exp: d.exp, - } -} - -// Mul returns d * d2. -func (d Decimal) Mul(d2 Decimal) Decimal { - d.ensureInitialized() - d2.ensureInitialized() - - expInt64 := int64(d.exp) + int64(d2.exp) - if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { - // NOTE(vadim): better to panic than give incorrect results, as - // Decimals are usually used for money - panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) - } - - d3Value := new(big.Int).Mul(d.value, d2.value) - return Decimal{ - value: d3Value, - exp: int32(expInt64), - } -} - -// Shift shifts the decimal in base 10. -// It shifts left when shift is positive and right if shift is negative. -// In simpler terms, the given value for shift is added to the exponent -// of the decimal. -func (d Decimal) Shift(shift int32) Decimal { - d.ensureInitialized() - return Decimal{ - value: new(big.Int).Set(d.value), - exp: d.exp + shift, - } -} - -// Div returns d / d2. If it doesn't divide exactly, the result will have -// DivisionPrecision digits after the decimal point. -func (d Decimal) Div(d2 Decimal) Decimal { - return d.DivRound(d2, int32(DivisionPrecision)) -} - -// QuoRem does divsion with remainder -// d.QuoRem(d2,precision) returns quotient q and remainder r such that -// d = d2 * q + r, q an integer multiple of 10^(-precision) -// 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 -// 0 >= r > -abs(d2) * 10 ^(-precision) if d<0 -// Note that precision<0 is allowed as input. -func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal) { - d.ensureInitialized() - d2.ensureInitialized() - if d2.value.Sign() == 0 { - panic("decimal division by 0") - } - scale := -precision - e := int64(d.exp - d2.exp - scale) - if e > math.MaxInt32 || e < math.MinInt32 { - panic("overflow in decimal QuoRem") - } - var aa, bb, expo big.Int - var scalerest int32 - // d = a 10^ea - // d2 = b 10^eb - if e < 0 { - aa = *d.value - expo.SetInt64(-e) - bb.Exp(tenInt, &expo, nil) - bb.Mul(d2.value, &bb) - scalerest = d.exp - // now aa = a - // bb = b 10^(scale + eb - ea) - } else { - expo.SetInt64(e) - aa.Exp(tenInt, &expo, nil) - aa.Mul(d.value, &aa) - bb = *d2.value - scalerest = scale + d2.exp - // now aa = a ^ (ea - eb - scale) - // bb = b - } - var q, r big.Int - q.QuoRem(&aa, &bb, &r) - dq := Decimal{value: &q, exp: scale} - dr := Decimal{value: &r, exp: scalerest} - return dq, dr -} - -// DivRound divides and rounds to a given precision -// i.e. to an integer multiple of 10^(-precision) -// for a positive quotient digit 5 is rounded up, away from 0 -// if the quotient is negative then digit 5 is rounded down, away from 0 -// Note that precision<0 is allowed as input. -func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal { - // QuoRem already checks initialization - q, r := d.QuoRem(d2, precision) - // the actual rounding decision is based on comparing r*10^precision and d2/2 - // instead compare 2 r 10 ^precision and d2 - var rv2 big.Int - rv2.Abs(r.value) - rv2.Lsh(&rv2, 1) - // now rv2 = abs(r.value) * 2 - r2 := Decimal{value: &rv2, exp: r.exp + precision} - // r2 is now 2 * r * 10 ^ precision - var c = r2.Cmp(d2.Abs()) - - if c < 0 { - return q - } - - if d.value.Sign()*d2.value.Sign() < 0 { - return q.Sub(New(1, -precision)) - } - - return q.Add(New(1, -precision)) -} - -// Mod returns d % d2. -func (d Decimal) Mod(d2 Decimal) Decimal { - quo := d.Div(d2).Truncate(0) - return d.Sub(d2.Mul(quo)) -} - -// Pow returns d to the power d2 -func (d Decimal) Pow(d2 Decimal) Decimal { - var temp Decimal - if d2.IntPart() == 0 { - return NewFromFloat(1) - } - temp = d.Pow(d2.Div(NewFromFloat(2))) - if d2.IntPart()%2 == 0 { - return temp.Mul(temp) - } - if d2.IntPart() > 0 { - return temp.Mul(temp).Mul(d) - } - return temp.Mul(temp).Div(d) -} - -// Cmp compares the numbers represented by d and d2 and returns: -// -// -1 if d < d2 -// 0 if d == d2 -// +1 if d > d2 -// -func (d Decimal) Cmp(d2 Decimal) int { - d.ensureInitialized() - d2.ensureInitialized() - - if d.exp == d2.exp { - return d.value.Cmp(d2.value) - } - - baseExp := min(d.exp, d2.exp) - rd := d.rescale(baseExp) - rd2 := d2.rescale(baseExp) - - return rd.value.Cmp(rd2.value) -} - -// Equal returns whether the numbers represented by d and d2 are equal. -func (d Decimal) Equal(d2 Decimal) bool { - return d.Cmp(d2) == 0 -} - -// Equals is deprecated, please use Equal method instead -func (d Decimal) Equals(d2 Decimal) bool { - return d.Equal(d2) -} - -// GreaterThan (GT) returns true when d is greater than d2. -func (d Decimal) GreaterThan(d2 Decimal) bool { - return d.Cmp(d2) == 1 -} - -// GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2. -func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool { - cmp := d.Cmp(d2) - return cmp == 1 || cmp == 0 -} - -// LessThan (LT) returns true when d is less than d2. -func (d Decimal) LessThan(d2 Decimal) bool { - return d.Cmp(d2) == -1 -} - -// LessThanOrEqual (LTE) returns true when d is less than or equal to d2. -func (d Decimal) LessThanOrEqual(d2 Decimal) bool { - cmp := d.Cmp(d2) - return cmp == -1 || cmp == 0 -} - -// Sign returns: -// -// -1 if d < 0 -// 0 if d == 0 -// +1 if d > 0 -// -func (d Decimal) Sign() int { - if d.value == nil { - return 0 - } - return d.value.Sign() -} - -// IsPositive return -// -// true if d > 0 -// false if d == 0 -// false if d < 0 -func (d Decimal) IsPositive() bool { - return d.Sign() == 1 -} - -// IsNegative return -// -// true if d < 0 -// false if d == 0 -// false if d > 0 -func (d Decimal) IsNegative() bool { - return d.Sign() == -1 -} - -// IsZero return -// -// true if d == 0 -// false if d > 0 -// false if d < 0 -func (d Decimal) IsZero() bool { - return d.Sign() == 0 -} - -// Exponent returns the exponent, or scale component of the decimal. -func (d Decimal) Exponent() int32 { - return d.exp -} - -// Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent() -func (d Decimal) Coefficient() *big.Int { - // we copy the coefficient so that mutating the result does not mutate the - // Decimal. - return big.NewInt(0).Set(d.value) -} - -// IntPart returns the integer component of the decimal. -func (d Decimal) IntPart() int64 { - scaledD := d.rescale(0) - return scaledD.value.Int64() -} - -// Rat returns a rational number representation of the decimal. -func (d Decimal) Rat() *big.Rat { - d.ensureInitialized() - if d.exp <= 0 { - // NOTE(vadim): must negate after casting to prevent int32 overflow - denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) - return new(big.Rat).SetFrac(d.value, denom) - } - - mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) - num := new(big.Int).Mul(d.value, mul) - return new(big.Rat).SetFrac(num, oneInt) -} - -// Float64 returns the nearest float64 value for d and a bool indicating -// whether f represents d exactly. -// For more details, see the documentation for big.Rat.Float64 -func (d Decimal) Float64() (f float64, exact bool) { - return d.Rat().Float64() -} - -// String returns the string representation of the decimal -// with the fixed point. -// -// Example: -// -// d := New(-12345, -3) -// println(d.String()) -// -// Output: -// -// -12.345 -// -func (d Decimal) String() string { - return d.string(true) -} - -// StringFixed returns a rounded fixed-point string with places digits after -// the decimal point. -// -// Example: -// -// NewFromFloat(0).StringFixed(2) // output: "0.00" -// NewFromFloat(0).StringFixed(0) // output: "0" -// NewFromFloat(5.45).StringFixed(0) // output: "5" -// NewFromFloat(5.45).StringFixed(1) // output: "5.5" -// NewFromFloat(5.45).StringFixed(2) // output: "5.45" -// NewFromFloat(5.45).StringFixed(3) // output: "5.450" -// NewFromFloat(545).StringFixed(-1) // output: "550" -// -func (d Decimal) StringFixed(places int32) string { - rounded := d.Round(places) - return rounded.string(false) -} - -// StringFixedBank returns a banker rounded fixed-point string with places digits -// after the decimal point. -// -// Example: -// -// NewFromFloat(0).StringFixed(2) // output: "0.00" -// NewFromFloat(0).StringFixed(0) // output: "0" -// NewFromFloat(5.45).StringFixed(0) // output: "5" -// NewFromFloat(5.45).StringFixed(1) // output: "5.4" -// NewFromFloat(5.45).StringFixed(2) // output: "5.45" -// NewFromFloat(5.45).StringFixed(3) // output: "5.450" -// NewFromFloat(545).StringFixed(-1) // output: "550" -// -func (d Decimal) StringFixedBank(places int32) string { - rounded := d.RoundBank(places) - return rounded.string(false) -} - -// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For -// more details see the documentation at function RoundCash. -func (d Decimal) StringFixedCash(interval uint8) string { - rounded := d.RoundCash(interval) - return rounded.string(false) -} - -// Round rounds the decimal to places decimal places. -// If places < 0, it will round the integer part to the nearest 10^(-places). -// -// Example: -// -// NewFromFloat(5.45).Round(1).String() // output: "5.5" -// NewFromFloat(545).Round(-1).String() // output: "550" -// -func (d Decimal) Round(places int32) Decimal { - // truncate to places + 1 - ret := d.rescale(-places - 1) - - // add sign(d) * 0.5 - if ret.value.Sign() < 0 { - ret.value.Sub(ret.value, fiveInt) - } else { - ret.value.Add(ret.value, fiveInt) - } - - // floor for positive numbers, ceil for negative numbers - _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) - ret.exp++ - if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { - ret.value.Add(ret.value, oneInt) - } - - return ret -} - -// RoundBank rounds the decimal to places decimal places. -// If the final digit to round is equidistant from the nearest two integers the -// rounded value is taken as the even number -// -// If places < 0, it will round the integer part to the nearest 10^(-places). -// -// Examples: -// -// NewFromFloat(5.45).Round(1).String() // output: "5.4" -// NewFromFloat(545).Round(-1).String() // output: "540" -// NewFromFloat(5.46).Round(1).String() // output: "5.5" -// NewFromFloat(546).Round(-1).String() // output: "550" -// NewFromFloat(5.55).Round(1).String() // output: "5.6" -// NewFromFloat(555).Round(-1).String() // output: "560" -// -func (d Decimal) RoundBank(places int32) Decimal { - - round := d.Round(places) - remainder := d.Sub(round).Abs() - - half := New(5, -places-1) - if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { - if round.value.Sign() < 0 { - round.value.Add(round.value, oneInt) - } else { - round.value.Sub(round.value, oneInt) - } - } - - return round -} - -// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific -// interval. The amount payable for a cash transaction is rounded to the nearest -// multiple of the minimum currency unit available. The following intervals are -// available: 5, 10, 15, 25, 50 and 100; any other number throws a panic. -// 5: 5 cent rounding 3.43 => 3.45 -// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) -// 15: 10 cent rounding 3.45 => 3.40 (5 gets rounded down) -// 25: 25 cent rounding 3.41 => 3.50 -// 50: 50 cent rounding 3.75 => 4.00 -// 100: 100 cent rounding 3.50 => 4.00 -// For more details: https://en.wikipedia.org/wiki/Cash_rounding -func (d Decimal) RoundCash(interval uint8) Decimal { - var iVal *big.Int - switch interval { - case 5: - iVal = twentyInt - case 10: - iVal = tenInt - case 15: - if d.exp < 0 { - // TODO: optimize and reduce allocations - orgExp := d.exp - dOne := New(10^-int64(orgExp), orgExp) - d2 := d - d2.exp = 0 - if d2.Mod(fiveDec).Equal(Zero) { - d2.exp = orgExp - d2 = d2.Sub(dOne) - d = d2 - } - } - iVal = tenInt - case 25: - iVal = fourInt - case 50: - iVal = twoInt - case 100: - iVal = oneInt - default: - panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 15, 25, 50, 100", interval)) - } - dVal := Decimal{ - value: iVal, - } - // TODO: optimize those calculations to reduce the high allocations (~29 allocs). - return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) -} - -// Floor returns the nearest integer value less than or equal to d. -func (d Decimal) Floor() Decimal { - d.ensureInitialized() - - if d.exp >= 0 { - return d - } - - exp := big.NewInt(10) - - // NOTE(vadim): must negate after casting to prevent int32 overflow - exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) - - z := new(big.Int).Div(d.value, exp) - return Decimal{value: z, exp: 0} -} - -// Ceil returns the nearest integer value greater than or equal to d. -func (d Decimal) Ceil() Decimal { - d.ensureInitialized() - - if d.exp >= 0 { - return d - } - - exp := big.NewInt(10) - - // NOTE(vadim): must negate after casting to prevent int32 overflow - exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) - - z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) - if m.Cmp(zeroInt) != 0 { - z.Add(z, oneInt) - } - return Decimal{value: z, exp: 0} -} - -// Truncate truncates off digits from the number, without rounding. -// -// NOTE: precision is the last digit that will not be truncated (must be >= 0). -// -// Example: -// -// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" -// -func (d Decimal) Truncate(precision int32) Decimal { - d.ensureInitialized() - if precision >= 0 && -precision > d.exp { - return d.rescale(-precision) - } - return d -} - -// UnmarshalJSON implements the json.Unmarshaler interface. -func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { - if string(decimalBytes) == "null" { - return nil - } - - str, err := unquoteIfQuoted(decimalBytes) - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) - } - - decimal, err := NewFromString(str) - *d = decimal - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", str, err) - } - return nil -} - -// MarshalJSON implements the json.Marshaler interface. -func (d Decimal) MarshalJSON() ([]byte, error) { - var str string - if MarshalJSONWithoutQuotes { - str = d.String() - } else { - str = "\"" + d.String() + "\"" - } - return []byte(str), nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation -// is already used when encoding to text, this method stores that string as []byte -func (d *Decimal) UnmarshalBinary(data []byte) error { - // Extract the exponent - d.exp = int32(binary.BigEndian.Uint32(data[:4])) - - // Extract the value - d.value = new(big.Int) - return d.value.GobDecode(data[4:]) -} - -// MarshalBinary implements the encoding.BinaryMarshaler interface. -func (d Decimal) MarshalBinary() (data []byte, err error) { - // Write the exponent first since it's a fixed size - v1 := make([]byte, 4) - binary.BigEndian.PutUint32(v1, uint32(d.exp)) - - // Add the value - var v2 []byte - if v2, err = d.value.GobEncode(); err != nil { - return - } - - // Return the byte array - data = append(v1, v2...) - return -} - -// Scan implements the sql.Scanner interface for database deserialization. -func (d *Decimal) Scan(value interface{}) error { - // first try to see if the data is stored in database as a Numeric datatype - switch v := value.(type) { - - case float32: - *d = NewFromFloat(float64(v)) - return nil - - case float64: - // numeric in sqlite3 sends us float64 - *d = NewFromFloat(v) - return nil - - case int64: - // at least in sqlite3 when the value is 0 in db, the data is sent - // to us as an int64 instead of a float64 ... - *d = New(v, 0) - return nil - - default: - // default is trying to interpret value stored as string - str, err := unquoteIfQuoted(v) - if err != nil { - return err - } - *d, err = NewFromString(str) - return err - } -} - -// Value implements the driver.Valuer interface for database serialization. -func (d Decimal) Value() (driver.Value, error) { - return d.String(), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface for XML -// deserialization. -func (d *Decimal) UnmarshalText(text []byte) error { - str := string(text) - - dec, err := NewFromString(str) - *d = dec - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", str, err) - } - - return nil -} - -// MarshalText implements the encoding.TextMarshaler interface for XML -// serialization. -func (d Decimal) MarshalText() (text []byte, err error) { - return []byte(d.String()), nil -} - -// GobEncode implements the gob.GobEncoder interface for gob serialization. -func (d Decimal) GobEncode() ([]byte, error) { - return d.MarshalBinary() -} - -// GobDecode implements the gob.GobDecoder interface for gob serialization. -func (d *Decimal) GobDecode(data []byte) error { - return d.UnmarshalBinary(data) -} - -// StringScaled first scales the decimal then calls .String() on it. -// NOTE: buggy, unintuitive, and DEPRECATED! Use StringFixed instead. -func (d Decimal) StringScaled(exp int32) string { - return d.rescale(exp).String() -} - -func (d Decimal) string(trimTrailingZeros bool) string { - if d.exp >= 0 { - return d.rescale(0).value.String() - } - - abs := new(big.Int).Abs(d.value) - str := abs.String() - - var intPart, fractionalPart string - - // NOTE(vadim): this cast to int will cause bugs if d.exp == INT_MIN - // and you are on a 32-bit machine. Won't fix this super-edge case. - dExpInt := int(d.exp) - if len(str) > -dExpInt { - intPart = str[:len(str)+dExpInt] - fractionalPart = str[len(str)+dExpInt:] - } else { - intPart = "0" - - num0s := -dExpInt - len(str) - fractionalPart = strings.Repeat("0", num0s) + str - } - - if trimTrailingZeros { - i := len(fractionalPart) - 1 - for ; i >= 0; i-- { - if fractionalPart[i] != '0' { - break - } - } - fractionalPart = fractionalPart[:i+1] - } - - number := intPart - if len(fractionalPart) > 0 { - number += "." + fractionalPart - } - - if d.value.Sign() < 0 { - return "-" + number - } - - return number -} - -func (d *Decimal) ensureInitialized() { - if d.value == nil { - d.value = new(big.Int) - } -} - -// Min returns the smallest Decimal that was passed in the arguments. -// -// To call this function with an array, you must do: -// -// Min(arr[0], arr[1:]...) -// -// This makes it harder to accidentally call Min with 0 arguments. -func Min(first Decimal, rest ...Decimal) Decimal { - ans := first - for _, item := range rest { - if item.Cmp(ans) < 0 { - ans = item - } - } - return ans -} - -// Max returns the largest Decimal that was passed in the arguments. -// -// To call this function with an array, you must do: -// -// Max(arr[0], arr[1:]...) -// -// This makes it harder to accidentally call Max with 0 arguments. -func Max(first Decimal, rest ...Decimal) Decimal { - ans := first - for _, item := range rest { - if item.Cmp(ans) > 0 { - ans = item - } - } - return ans -} - -// Sum returns the combined total of the provided first and rest Decimals -func Sum(first Decimal, rest ...Decimal) Decimal { - total := first - for _, item := range rest { - total = total.Add(item) - } - - return total -} - -// Avg returns the average value of the provided first and rest Decimals -func Avg(first Decimal, rest ...Decimal) Decimal { - count := New(int64(len(rest)+1), 0) - sum := Sum(first, rest...) - return sum.Div(count) -} - -func min(x, y int32) int32 { - if x >= y { - return y - } - return x -} - -func unquoteIfQuoted(value interface{}) (string, error) { - var bytes []byte - - switch v := value.(type) { - case string: - bytes = []byte(v) - case []byte: - bytes = v - default: - return "", fmt.Errorf("Could not convert value '%+v' to byte array of type '%T'", - value, value) - } - - // If the amount is quoted, strip the quotes - if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { - bytes = bytes[1 : len(bytes)-1] - } - return string(bytes), nil -} - -// NullDecimal represents a nullable decimal with compatibility for -// scanning null values from the database. -type NullDecimal struct { - Decimal Decimal - Valid bool -} - -// Scan implements the sql.Scanner interface for database deserialization. -func (d *NullDecimal) Scan(value interface{}) error { - if value == nil { - d.Valid = false - return nil - } - d.Valid = true - return d.Decimal.Scan(value) -} - -// Value implements the driver.Valuer interface for database serialization. -func (d NullDecimal) Value() (driver.Value, error) { - if !d.Valid { - return nil, nil - } - return d.Decimal.Value() -} - -// UnmarshalJSON implements the json.Unmarshaler interface. -func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { - if string(decimalBytes) == "null" { - d.Valid = false - return nil - } - d.Valid = true - return d.Decimal.UnmarshalJSON(decimalBytes) -} - -// MarshalJSON implements the json.Marshaler interface. -func (d NullDecimal) MarshalJSON() ([]byte, error) { - if !d.Valid { - return []byte("null"), nil - } - return d.Decimal.MarshalJSON() -} - -// Trig functions - -// Atan returns the arctangent, in radians, of x. -func (x Decimal) Atan() Decimal { - if x.Equal(NewFromFloat(0.0)) { - return x - } - if x.GreaterThan(NewFromFloat(0.0)) { - return x.satan() - } - return x.Neg().satan().Neg() -} - -func (d Decimal) xatan() Decimal { - P0 := NewFromFloat(-8.750608600031904122785e-01) - P1 := NewFromFloat(-1.615753718733365076637e+01) - P2 := NewFromFloat(-7.500855792314704667340e+01) - P3 := NewFromFloat(-1.228866684490136173410e+02) - P4 := NewFromFloat(-6.485021904942025371773e+01) - Q0 := NewFromFloat(2.485846490142306297962e+01) - Q1 := NewFromFloat(1.650270098316988542046e+02) - Q2 := NewFromFloat(4.328810604912902668951e+02) - Q3 := NewFromFloat(4.853903996359136964868e+02) - Q4 := NewFromFloat(1.945506571482613964425e+02) - z := d.Mul(d) - b1 := P0.Mul(z).Add(P1).Mul(z).Add(P2).Mul(z).Add(P3).Mul(z).Add(P4).Mul(z) - b2 := z.Add(Q0).Mul(z).Add(Q1).Mul(z).Add(Q2).Mul(z).Add(Q3).Mul(z).Add(Q4) - z = b1.Div(b2) - z = d.Mul(z).Add(d) - return z -} - -// satan reduces its argument (known to be positive) -// to the range [0, 0.66] and calls xatan. -func (d Decimal) satan() Decimal { - Morebits := NewFromFloat(6.123233995736765886130e-17) // pi/2 = PIO2 + Morebits - Tan3pio8 := NewFromFloat(2.41421356237309504880) // tan(3*pi/8) - pi := NewFromFloat(3.14159265358979323846264338327950288419716939937510582097494459) - - if d.LessThanOrEqual(NewFromFloat(0.66)) { - return d.xatan() - } - if d.GreaterThan(Tan3pio8) { - return pi.Div(NewFromFloat(2.0)).Sub(NewFromFloat(1.0).Div(d).xatan()).Add(Morebits) - } - return pi.Div(NewFromFloat(4.0)).Add((d.Sub(NewFromFloat(1.0)).Div(d.Add(NewFromFloat(1.0)))).xatan()).Add(NewFromFloat(0.5).Mul(Morebits)) -} - -// sin coefficients - var _sin = [...]Decimal{ - NewFromFloat(1.58962301576546568060E-10), // 0x3de5d8fd1fd19ccd - NewFromFloat(-2.50507477628578072866E-8), // 0xbe5ae5e5a9291f5d - NewFromFloat(2.75573136213857245213E-6), // 0x3ec71de3567d48a1 - NewFromFloat(-1.98412698295895385996E-4), // 0xbf2a01a019bfdf03 - NewFromFloat(8.33333333332211858878E-3), // 0x3f8111111110f7d0 - NewFromFloat(-1.66666666666666307295E-1), // 0xbfc5555555555548 - } - -// Sin returns the sine of the radian argument x. - func (d Decimal) Sin() Decimal { - PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, - PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, - M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi - - if d.Equal(NewFromFloat(0.0)) { - return d - } - // make argument positive but save the sign - sign := false - if d.LessThan(NewFromFloat(0.0)) { - d = d.Neg() - sign = true - } - - j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle - y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float - - // map zeros to origin - if j&1 == 1 { - j++ - y = y.Add(NewFromFloat(1.0)) - } - j &= 7 // octant modulo 2Pi radians (360 degrees) - // reflect in x axis - if j > 3 { - sign = !sign - j -= 4 - } - z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic - zz := z.Mul(z) - - if j == 1 || j == 2 { - w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) - y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) - } else { - y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) - } - if sign { - y = y.Neg() - } - return y - } - - // cos coefficients - var _cos = [...]Decimal{ - NewFromFloat(-1.13585365213876817300E-11), // 0xbda8fa49a0861a9b - NewFromFloat(2.08757008419747316778E-9), // 0x3e21ee9d7b4e3f05 - NewFromFloat(-2.75573141792967388112E-7), // 0xbe927e4f7eac4bc6 - NewFromFloat(2.48015872888517045348E-5), // 0x3efa01a019c844f5 - NewFromFloat(-1.38888888888730564116E-3), // 0xbf56c16c16c14f91 - NewFromFloat(4.16666666666665929218E-2), // 0x3fa555555555554b - } - - // Cos returns the cosine of the radian argument x. - func (d Decimal) Cos() Decimal { - - PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, - PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, - M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi - - // make argument positive - sign := false - if d.LessThan(NewFromFloat(0.0)) { - d = d.Neg() - } - - j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle - y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float - - // map zeros to origin - if j&1 == 1 { - j++ - y = y.Add(NewFromFloat(1.0)) - } - j &= 7 // octant modulo 2Pi radians (360 degrees) - // reflect in x axis - if j > 3 { - sign = !sign - j -= 4 - } - if j > 1 { - sign = !sign - } - - z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic - zz := z.Mul(z) - - if j == 1 || j == 2 { - y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) - } else { - w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) - y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) - } - if sign { - y = y.Neg() - } - return y - } - - var _tanP = [...]Decimal{ - NewFromFloat(-1.30936939181383777646E+4), // 0xc0c992d8d24f3f38 - NewFromFloat(1.15351664838587416140E+6), // 0x413199eca5fc9ddd - NewFromFloat(-1.79565251976484877988E+7), // 0xc1711fead3299176 - } - var _tanQ = [...]Decimal{ - NewFromFloat(1.00000000000000000000E+0), - NewFromFloat(1.36812963470692954678E+4), //0x40cab8a5eeb36572 - NewFromFloat(-1.32089234440210967447E+6), //0xc13427bc582abc96 - NewFromFloat(2.50083801823357915839E+7), //0x4177d98fc2ead8ef - NewFromFloat(-5.38695755929454629881E+7), //0xc189afe03cbe5a31 - } - - // Tan returns the tangent of the radian argument x. - func (d Decimal) Tan() Decimal { - - PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, - PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, - M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi - - if d.Equal(NewFromFloat(0.0)) { - return d - } - - // make argument positive but save the sign - sign := false - if d.LessThan(NewFromFloat(0.0)) { - d = d.Neg() - sign = true - } - - j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle - y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float - - // map zeros to origin - if j&1 == 1 { - j++ - y = y.Add(NewFromFloat(1.0)) - } - - z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic - zz := z.Mul(z) - - if zz.GreaterThan(NewFromFloat(1e-14)) { - w := zz.Mul(_tanP[0].Mul(zz).Add(_tanP[1]).Mul(zz).Add(_tanP[2])) - x := zz.Add(_tanQ[1]).Mul(zz).Add(_tanQ[2]).Mul(zz).Add(_tanQ[3]).Mul(zz).Add(_tanQ[4]) - y = z.Add(z.Mul(w.Div(x))) - } else { - y = z - } - if j&2 == 2 { - y = NewFromFloat(-1.0).Div(y) - } - if sign { - y = y.Neg() - } - return y - } diff --git a/vendor/github.com/shopspring/decimal/rounding.go b/vendor/github.com/shopspring/decimal/rounding.go deleted file mode 100644 index fdd74eaa..00000000 --- a/vendor/github.com/shopspring/decimal/rounding.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2009 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. - -// Multiprecision decimal numbers. -// For floating-point formatting only; not general purpose. -// Only operations are assign and (binary) left/right shift. -// Can do binary floating point in multiprecision decimal precisely -// because 2 divides 10; cannot do decimal floating point -// in multiprecision binary precisely. -package decimal - -type floatInfo struct { - mantbits uint - expbits uint - bias int -} - -var float32info = floatInfo{23, 8, -127} -var float64info = floatInfo{52, 11, -1023} - -// roundShortest rounds d (= mant * 2^exp) to the shortest number of digits -// that will let the original floating point value be precisely reconstructed. -func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { - // If mantissa is zero, the number is zero; stop now. - if mant == 0 { - d.nd = 0 - return - } - - // Compute upper and lower such that any decimal number - // between upper and lower (possibly inclusive) - // will round to the original floating point number. - - // We may see at once that the number is already shortest. - // - // Suppose d is not denormal, so that 2^exp <= d < 10^dp. - // The closest shorter number is at least 10^(dp-nd) away. - // The lower/upper bounds computed below are at distance - // at most 2^(exp-mantbits). - // - // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), - // or equivalently log2(10)*(dp-nd) > exp-mantbits. - // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). - minexp := flt.bias + 1 // minimum possible exponent - if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { - // The number is already shortest. - return - } - - // d = mant << (exp - mantbits) - // Next highest floating point number is mant+1 << exp-mantbits. - // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. - upper := new(decimal) - upper.Assign(mant*2 + 1) - upper.Shift(exp - int(flt.mantbits) - 1) - - // d = mant << (exp - mantbits) - // Next lowest floating point number is mant-1 << exp-mantbits, - // unless mant-1 drops the significant bit and exp is not the minimum exp, - // in which case the next lowest is mant*2-1 << exp-mantbits-1. - // Either way, call it mantlo << explo-mantbits. - // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. - var mantlo uint64 - var explo int - if mant > 1< 0 { - h.fd.Close() - - for i := h.backupCount - 1; i > 0; i-- { - sfn := fmt.Sprintf("%s.%d", h.fileName, i) - dfn := fmt.Sprintf("%s.%d", h.fileName, i+1) - - os.Rename(sfn, dfn) - } - - dfn := fmt.Sprintf("%s.1", h.fileName) - os.Rename(h.fileName, dfn) - - h.fd, _ = os.OpenFile(h.fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - h.curBytes = 0 - f, err := h.fd.Stat() - if err != nil { - return - } - h.curBytes = int(f.Size()) - } -} - -// TimeRotatingFileHandler writes log to a file, -// it will backup current and open a new one, with a period time you sepecified. -// -// refer: http://docs.python.org/2/library/logging.handlers.html. -// same like python TimedRotatingFileHandler. -type TimeRotatingFileHandler struct { - fd *os.File - - baseName string - interval int64 - suffix string - rolloverAt int64 -} - -// TimeRotating way -const ( - WhenSecond = iota - WhenMinute - WhenHour - WhenDay -) - -// NewTimeRotatingFileHandler creates a TimeRotatingFileHandler -func NewTimeRotatingFileHandler(baseName string, when int8, interval int) (*TimeRotatingFileHandler, error) { - dir := path.Dir(baseName) - os.MkdirAll(dir, 0777) - - h := new(TimeRotatingFileHandler) - - h.baseName = baseName - - switch when { - case WhenSecond: - h.interval = 1 - h.suffix = "2006-01-02_15-04-05" - case WhenMinute: - h.interval = 60 - h.suffix = "2006-01-02_15-04" - case WhenHour: - h.interval = 3600 - h.suffix = "2006-01-02_15" - case WhenDay: - h.interval = 3600 * 24 - h.suffix = "2006-01-02" - default: - return nil, fmt.Errorf("invalid when_rotate: %d", when) - } - - h.interval = h.interval * int64(interval) - - var err error - h.fd, err = os.OpenFile(h.baseName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - if err != nil { - return nil, err - } - - fInfo, _ := h.fd.Stat() - h.rolloverAt = fInfo.ModTime().Unix() + h.interval - - return h, nil -} - -func (h *TimeRotatingFileHandler) doRollover() { - //refer http://hg.python.org/cpython/file/2.7/Lib/logging/handlers.py - now := time.Now() - - if h.rolloverAt <= now.Unix() { - fName := h.baseName + now.Format(h.suffix) - h.fd.Close() - e := os.Rename(h.baseName, fName) - if e != nil { - panic(e) - } - - h.fd, _ = os.OpenFile(h.baseName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - - h.rolloverAt = time.Now().Unix() + h.interval - } -} - -// Write implements Handler interface -func (h *TimeRotatingFileHandler) Write(b []byte) (n int, err error) { - h.doRollover() - return h.fd.Write(b) -} - -// Close implements Handler interface -func (h *TimeRotatingFileHandler) Close() error { - return h.fd.Close() -} diff --git a/vendor/github.com/siddontang/go-log/log/handler.go b/vendor/github.com/siddontang/go-log/log/handler.go deleted file mode 100644 index 5460f069..00000000 --- a/vendor/github.com/siddontang/go-log/log/handler.go +++ /dev/null @@ -1,54 +0,0 @@ -package log - -import ( - "io" -) - -//Handler writes logs to somewhere -type Handler interface { - Write(p []byte) (n int, err error) - Close() error -} - -// StreamHandler writes logs to a specified io Writer, maybe stdout, stderr, etc... -type StreamHandler struct { - w io.Writer -} - -// NewStreamHandler creates a StreamHandler -func NewStreamHandler(w io.Writer) (*StreamHandler, error) { - h := new(StreamHandler) - - h.w = w - - return h, nil -} - -// Write implements Handler interface -func (h *StreamHandler) Write(b []byte) (n int, err error) { - return h.w.Write(b) -} - -// Close implements Handler interface -func (h *StreamHandler) Close() error { - return nil -} - -// NullHandler does nothing, it discards anything. -type NullHandler struct { -} - -// NewNullHandler creates a NullHandler -func NewNullHandler() (*NullHandler, error) { - return new(NullHandler), nil -} - -// // Write implements Handler interface -func (h *NullHandler) Write(b []byte) (n int, err error) { - return len(b), nil -} - -// Close implements Handler interface -func (h *NullHandler) Close() { - -} diff --git a/vendor/github.com/siddontang/go-log/log/log.go b/vendor/github.com/siddontang/go-log/log/log.go deleted file mode 100644 index 956186d9..00000000 --- a/vendor/github.com/siddontang/go-log/log/log.go +++ /dev/null @@ -1,137 +0,0 @@ -package log - -import ( - "fmt" - "os" -) - -var logger = NewDefault(newStdHandler()) - -// SetDefaultLogger changes the global logger -func SetDefaultLogger(l *Logger) { - logger = l -} - -// SetLevel changes the logger level -func SetLevel(level Level) { - logger.SetLevel(level) -} - -// SetLevelByName changes the logger level by name -func SetLevelByName(name string) { - logger.SetLevelByName(name) -} - -// Fatal records the log with fatal level and exits -func Fatal(args ...interface{}) { - logger.Output(2, LevelFatal, fmt.Sprint(args...)) - os.Exit(1) -} - -// Fatalf records the log with fatal level and exits -func Fatalf(format string, args ...interface{}) { - logger.Output(2, LevelFatal, fmt.Sprintf(format, args...)) - os.Exit(1) -} - -// Fatalln records the log with fatal level and exits -func Fatalln(args ...interface{}) { - logger.Output(2, LevelFatal, fmt.Sprintln(args...)) - os.Exit(1) -} - -// Panic records the log with fatal level and panics -func Panic(args ...interface{}) { - msg := fmt.Sprint(args...) - logger.Output(2, LevelError, msg) - panic(msg) -} - -// Panicf records the log with fatal level and panics -func Panicf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - logger.Output(2, LevelError, msg) - panic(msg) -} - -// Panicln records the log with fatal level and panics -func Panicln(args ...interface{}) { - msg := fmt.Sprintln(args...) - logger.Output(2, LevelError, msg) - panic(msg) -} - -// Print records the log with trace level -func Print(args ...interface{}) { - logger.Output(2, LevelTrace, fmt.Sprint(args...)) -} - -// Printf records the log with trace level -func Printf(format string, args ...interface{}) { - logger.Output(2, LevelTrace, fmt.Sprintf(format, args...)) -} - -// Println records the log with trace level -func Println(args ...interface{}) { - logger.Output(2, LevelTrace, fmt.Sprintln(args...)) -} - -// Debug records the log with debug level -func Debug(args ...interface{}) { - logger.Output(2, LevelDebug, fmt.Sprint(args...)) -} - -// Debugf records the log with debug level -func Debugf(format string, args ...interface{}) { - logger.Output(2, LevelDebug, fmt.Sprintf(format, args...)) -} - -// Debugln records the log with debug level -func Debugln(args ...interface{}) { - logger.Output(2, LevelDebug, fmt.Sprintln(args...)) -} - -// Error records the log with error level -func Error(args ...interface{}) { - logger.Output(2, LevelError, fmt.Sprint(args...)) -} - -// Errorf records the log with error level -func Errorf(format string, args ...interface{}) { - logger.Output(2, LevelError, fmt.Sprintf(format, args...)) -} - -// Errorln records the log with error level -func Errorln(args ...interface{}) { - logger.Output(2, LevelError, fmt.Sprintln(args...)) -} - -// Info records the log with info level -func Info(args ...interface{}) { - logger.Output(2, LevelInfo, fmt.Sprint(args...)) -} - -// Infof records the log with info level -func Infof(format string, args ...interface{}) { - logger.Output(2, LevelInfo, fmt.Sprintf(format, args...)) -} - -// Infoln records the log with info level -func Infoln(args ...interface{}) { - logger.Output(2, LevelInfo, fmt.Sprintln(args...)) -} - -// Warn records the log with warn level -func Warn(args ...interface{}) { - logger.Output(2, LevelWarn, fmt.Sprint(args...)) -} - -// Warnf records the log with warn level -func Warnf(format string, args ...interface{}) { - logger.Output(2, LevelWarn, fmt.Sprintf(format, args...)) -} - -// Warnln records the log with warn level -func Warnln(args ...interface{}) { - logger.Output(2, LevelWarn, fmt.Sprintln(args...)) -} diff --git a/vendor/github.com/siddontang/go-log/log/logger.go b/vendor/github.com/siddontang/go-log/log/logger.go deleted file mode 100644 index b2f7ed28..00000000 --- a/vendor/github.com/siddontang/go-log/log/logger.go +++ /dev/null @@ -1,340 +0,0 @@ -package log - -import ( - "fmt" - "os" - "runtime" - "strconv" - "strings" - "sync" - "time" - - "github.com/siddontang/go-log/loggers" -) - -const ( - timeFormat = "2006/01/02 15:04:05" - maxBufPoolSize = 16 -) - -// Logger flag -const ( - Ltime = 1 << iota // time format "2006/01/02 15:04:05" - Lfile // file.go:123 - Llevel // [Trace|Debug|Info...] -) - -// Level type -type Level int - -// Log level, from low to high, more high means more serious -const ( - LevelTrace Level = iota - LevelDebug - LevelInfo - LevelWarn - LevelError - LevelFatal -) - -// String returns level String -func (l Level) String() string { - switch l { - case LevelTrace: - return "trace" - case LevelDebug: - return "debug" - case LevelInfo: - return "info" - case LevelWarn: - return "warn" - case LevelError: - return "error" - case LevelFatal: - return "fatal" - } - // return default info - return "info" -} - -// Logger is the logger to record log -type Logger struct { - // TODO: support logger.Contextual - loggers.Advanced - - sync.Mutex - - level Level - flag int - - handler Handler - - quit chan struct{} - msg chan []byte - - bufs [][]byte -} - -// New creates a logger with specified handler and flag -func New(handler Handler, flag int) *Logger { - var l = new(Logger) - - l.level = LevelInfo - l.handler = handler - - l.flag = flag - - l.quit = make(chan struct{}) - - l.msg = make(chan []byte, 1024) - - l.bufs = make([][]byte, 0, 16) - - go l.run() - - return l -} - -// NewDefault creates default logger with specified handler and flag: Ltime|Lfile|Llevel -func NewDefault(handler Handler) *Logger { - return New(handler, Ltime|Lfile|Llevel) -} - -func newStdHandler() *StreamHandler { - h, _ := NewStreamHandler(os.Stdout) - return h -} - -func (l *Logger) run() { - for { - select { - case msg := <-l.msg: - l.handler.Write(msg) - l.putBuf(msg) - case <-l.quit: - l.handler.Close() - } - } -} - -func (l *Logger) popBuf() []byte { - l.Lock() - var buf []byte - if len(l.bufs) == 0 { - buf = make([]byte, 0, 1024) - } else { - buf = l.bufs[len(l.bufs)-1] - l.bufs = l.bufs[0 : len(l.bufs)-1] - } - l.Unlock() - - return buf -} - -func (l *Logger) putBuf(buf []byte) { - l.Lock() - if len(l.bufs) < maxBufPoolSize { - buf = buf[0:0] - l.bufs = append(l.bufs, buf) - } - l.Unlock() -} - -// Close closes the logger -func (l *Logger) Close() { - if l.quit == nil { - return - } - - close(l.quit) - l.quit = nil -} - -// SetLevel sets log level, any log level less than it will not log -func (l *Logger) SetLevel(level Level) { - l.level = level -} - -// SetLevelByName sets log level by name -func (l *Logger) SetLevelByName(name string) { - level := LevelInfo - switch strings.ToLower(name) { - case "trace": - level = LevelTrace - case "debug": - level = LevelDebug - case "warn", "warning": - level = LevelWarn - case "error": - level = LevelError - case "fatal": - level = LevelFatal - default: - level = LevelInfo - } - - l.SetLevel(level) -} - -// Output records the log with special callstack depth and log level. -func (l *Logger) Output(callDepth int, level Level, msg string) { - if l.level > level { - return - } - - buf := l.popBuf() - - if l.flag&Ltime > 0 { - now := time.Now().Format(timeFormat) - buf = append(buf, '[') - buf = append(buf, now...) - buf = append(buf, "] "...) - } - - if l.flag&Llevel > 0 { - buf = append(buf, '[') - buf = append(buf, level.String()...) - buf = append(buf, "] "...) - } - - if l.flag&Lfile > 0 { - _, file, line, ok := runtime.Caller(callDepth) - if !ok { - file = "???" - line = 0 - } else { - for i := len(file) - 1; i > 0; i-- { - if file[i] == '/' { - file = file[i+1:] - break - } - } - } - - buf = append(buf, file...) - buf = append(buf, ':') - - buf = strconv.AppendInt(buf, int64(line), 10) - buf = append(buf, ' ') - } - - buf = append(buf, msg...) - if len(msg) == 0 || msg[len(msg)-1] != '\n' { - buf = append(buf, '\n') - } - l.msg <- buf -} - -// Fatal records the log with fatal level and exits -func (l *Logger) Fatal(args ...interface{}) { - l.Output(2, LevelFatal, fmt.Sprint(args...)) - os.Exit(1) -} - -// Fatalf records the log with fatal level and exits -func (l *Logger) Fatalf(format string, args ...interface{}) { - l.Output(2, LevelFatal, fmt.Sprintf(format, args...)) - os.Exit(1) -} - -// Fatalln records the log with fatal level and exits -func (l *Logger) Fatalln(args ...interface{}) { - l.Output(2, LevelFatal, fmt.Sprintln(args...)) - os.Exit(1) -} - -// Panic records the log with fatal level and panics -func (l *Logger) Panic(args ...interface{}) { - msg := fmt.Sprint(args...) - l.Output(2, LevelError, msg) - panic(msg) -} - -// Panicf records the log with fatal level and panics -func (l *Logger) Panicf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Output(2, LevelError, msg) - panic(msg) -} - -// Panicln records the log with fatal level and panics -func (l *Logger) Panicln(args ...interface{}) { - msg := fmt.Sprintln(args...) - l.Output(2, LevelError, msg) - panic(msg) -} - -// Print records the log with trace level -func (l *Logger) Print(args ...interface{}) { - l.Output(2, LevelTrace, fmt.Sprint(args...)) -} - -// Printf records the log with trace level -func (l *Logger) Printf(format string, args ...interface{}) { - l.Output(2, LevelTrace, fmt.Sprintf(format, args...)) -} - -// Println records the log with trace level -func (l *Logger) Println(args ...interface{}) { - l.Output(2, LevelTrace, fmt.Sprintln(args...)) -} - -// Debug records the log with debug level -func (l *Logger) Debug(args ...interface{}) { - l.Output(2, LevelDebug, fmt.Sprint(args...)) -} - -// Debugf records the log with debug level -func (l *Logger) Debugf(format string, args ...interface{}) { - l.Output(2, LevelDebug, fmt.Sprintf(format, args...)) -} - -// Debugln records the log with debug level -func (l *Logger) Debugln(args ...interface{}) { - l.Output(2, LevelDebug, fmt.Sprintln(args...)) -} - -// Error records the log with error level -func (l *Logger) Error(args ...interface{}) { - l.Output(2, LevelError, fmt.Sprint(args...)) -} - -// Errorf records the log with error level -func (l *Logger) Errorf(format string, args ...interface{}) { - l.Output(2, LevelError, fmt.Sprintf(format, args...)) -} - -// Errorln records the log with error level -func (l *Logger) Errorln(args ...interface{}) { - l.Output(2, LevelError, fmt.Sprintln(args...)) -} - -// Info records the log with info level -func (l *Logger) Info(args ...interface{}) { - l.Output(2, LevelInfo, fmt.Sprint(args...)) -} - -// Infof records the log with info level -func (l *Logger) Infof(format string, args ...interface{}) { - l.Output(2, LevelInfo, fmt.Sprintf(format, args...)) -} - -// Infoln records the log with info level -func (l *Logger) Infoln(args ...interface{}) { - l.Output(2, LevelInfo, fmt.Sprintln(args...)) -} - -// Warn records the log with warn level -func (l *Logger) Warn(args ...interface{}) { - l.Output(2, LevelWarn, fmt.Sprint(args...)) -} - -// Warnf records the log with warn level -func (l *Logger) Warnf(format string, args ...interface{}) { - l.Output(2, LevelWarn, fmt.Sprintf(format, args...)) -} - -// Warnln records the log with warn level -func (l *Logger) Warnln(args ...interface{}) { - l.Output(2, LevelWarn, fmt.Sprintln(args...)) -} diff --git a/vendor/github.com/siddontang/go-log/loggers/loggers.go b/vendor/github.com/siddontang/go-log/loggers/loggers.go deleted file mode 100644 index 2723b24a..00000000 --- a/vendor/github.com/siddontang/go-log/loggers/loggers.go +++ /dev/null @@ -1,68 +0,0 @@ -// MIT License - -// Copyright (c) 2017 Birkir A. Barkarson - -// 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. - -package loggers - -// Standard is the interface used by Go's standard library's log package. -type Standard interface { - Fatal(args ...interface{}) - Fatalf(format string, args ...interface{}) - Fatalln(args ...interface{}) - - Panic(args ...interface{}) - Panicf(format string, args ...interface{}) - Panicln(args ...interface{}) - - Print(args ...interface{}) - Printf(format string, args ...interface{}) - Println(args ...interface{}) -} - -// Advanced is an interface with commonly used log level methods. -type Advanced interface { - Standard - - Debug(args ...interface{}) - Debugf(format string, args ...interface{}) - Debugln(args ...interface{}) - - Error(args ...interface{}) - Errorf(format string, args ...interface{}) - Errorln(args ...interface{}) - - Info(args ...interface{}) - Infof(format string, args ...interface{}) - Infoln(args ...interface{}) - - Warn(args ...interface{}) - Warnf(format string, args ...interface{}) - Warnln(args ...interface{}) -} - -// Contextual is an interface that allows context addition to a log statement before -// calling the final print (message/level) method. -type Contextual interface { - Advanced - - WithField(key string, value interface{}) Advanced - WithFields(fields ...interface{}) Advanced -} diff --git a/vendor/github.com/siddontang/go-mysql/LICENSE b/vendor/github.com/siddontang/go-mysql/LICENSE deleted file mode 100644 index 80511a0a..00000000 --- a/vendor/github.com/siddontang/go-mysql/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 siddontang - -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/github.com/siddontang/go-mysql/canal/canal.go b/vendor/github.com/siddontang/go-mysql/canal/canal.go deleted file mode 100644 index 1303fd5a..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/canal.go +++ /dev/null @@ -1,462 +0,0 @@ -package canal - -import ( - "context" - "fmt" - "io/ioutil" - "os" - "regexp" - "strconv" - "strings" - "sync" - "time" - - "github.com/juju/errors" - "github.com/siddontang/go-log/log" - "github.com/siddontang/go-mysql/client" - "github.com/siddontang/go-mysql/dump" - "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/replication" - "github.com/siddontang/go-mysql/schema" -) - -// Canal can sync your MySQL data into everywhere, like Elasticsearch, Redis, etc... -// MySQL must open row format for binlog -type Canal struct { - m sync.Mutex - - cfg *Config - - master *masterInfo - dumper *dump.Dumper - dumped bool - dumpDoneCh chan struct{} - syncer *replication.BinlogSyncer - - eventHandler EventHandler - - connLock sync.Mutex - conn *client.Conn - - tableLock sync.RWMutex - tables map[string]*schema.Table - errorTablesGetTime map[string]time.Time - - tableMatchCache map[string]bool - includeTableRegex []*regexp.Regexp - excludeTableRegex []*regexp.Regexp - - ctx context.Context - cancel context.CancelFunc -} - -// canal will retry fetching unknown table's meta after UnknownTableRetryPeriod -var UnknownTableRetryPeriod = time.Second * time.Duration(10) -var ErrExcludedTable = errors.New("excluded table meta") - -func NewCanal(cfg *Config) (*Canal, error) { - c := new(Canal) - c.cfg = cfg - - c.ctx, c.cancel = context.WithCancel(context.Background()) - - c.dumpDoneCh = make(chan struct{}) - c.eventHandler = &DummyEventHandler{} - - c.tables = make(map[string]*schema.Table) - if c.cfg.DiscardNoMetaRowEvent { - c.errorTablesGetTime = make(map[string]time.Time) - } - c.master = &masterInfo{} - - var err error - - if err = c.prepareDumper(); err != nil { - return nil, errors.Trace(err) - } - - if err = c.prepareSyncer(); err != nil { - return nil, errors.Trace(err) - } - - if err := c.checkBinlogRowFormat(); err != nil { - return nil, errors.Trace(err) - } - - // init table filter - if n := len(c.cfg.IncludeTableRegex); n > 0 { - c.includeTableRegex = make([]*regexp.Regexp, n) - for i, val := range c.cfg.IncludeTableRegex { - reg, err := regexp.Compile(val) - if err != nil { - return nil, errors.Trace(err) - } - c.includeTableRegex[i] = reg - } - } - - if n := len(c.cfg.ExcludeTableRegex); n > 0 { - c.excludeTableRegex = make([]*regexp.Regexp, n) - for i, val := range c.cfg.ExcludeTableRegex { - reg, err := regexp.Compile(val) - if err != nil { - return nil, errors.Trace(err) - } - c.excludeTableRegex[i] = reg - } - } - - if c.includeTableRegex != nil || c.excludeTableRegex != nil { - c.tableMatchCache = make(map[string]bool) - } - - return c, nil -} - -func (c *Canal) prepareDumper() error { - var err error - dumpPath := c.cfg.Dump.ExecutionPath - if len(dumpPath) == 0 { - // ignore mysqldump, use binlog only - return nil - } - - if c.dumper, err = dump.NewDumper(dumpPath, - c.cfg.Addr, c.cfg.User, c.cfg.Password); err != nil { - return errors.Trace(err) - } - - if c.dumper == nil { - //no mysqldump, use binlog only - return nil - } - - dbs := c.cfg.Dump.Databases - tables := c.cfg.Dump.Tables - tableDB := c.cfg.Dump.TableDB - - if len(tables) == 0 { - c.dumper.AddDatabases(dbs...) - } else { - c.dumper.AddTables(tableDB, tables...) - } - - charset := c.cfg.Charset - c.dumper.SetCharset(charset) - - c.dumper.SetWhere(c.cfg.Dump.Where) - c.dumper.SkipMasterData(c.cfg.Dump.SkipMasterData) - c.dumper.SetMaxAllowedPacket(c.cfg.Dump.MaxAllowedPacketMB) - // Use hex blob for mysqldump - c.dumper.SetHexBlob(true) - - for _, ignoreTable := range c.cfg.Dump.IgnoreTables { - if seps := strings.Split(ignoreTable, ","); len(seps) == 2 { - c.dumper.AddIgnoreTables(seps[0], seps[1]) - } - } - - if c.cfg.Dump.DiscardErr { - c.dumper.SetErrOut(ioutil.Discard) - } else { - c.dumper.SetErrOut(os.Stderr) - } - - return nil -} - -// Run will first try to dump all data from MySQL master `mysqldump`, -// then sync from the binlog position in the dump data. -// It will run forever until meeting an error or Canal closed. -func (c *Canal) Run() error { - return c.run() -} - -// RunFrom will sync from the binlog position directly, ignore mysqldump. -func (c *Canal) RunFrom(pos mysql.Position) error { - c.master.Update(pos) - - return c.Run() -} - -func (c *Canal) StartFromGTID(set mysql.GTIDSet) error { - c.master.UpdateGTIDSet(set) - - return c.Run() -} - -// Dump all data from MySQL master `mysqldump`, ignore sync binlog. -func (c *Canal) Dump() error { - if c.dumped { - return errors.New("the method Dump can't be called twice") - } - c.dumped = true - defer close(c.dumpDoneCh) - return c.dump() -} - -func (c *Canal) run() error { - defer func() { - c.cancel() - }() - - if !c.dumped { - c.dumped = true - - err := c.tryDump() - close(c.dumpDoneCh) - - if err != nil { - log.Errorf("canal dump mysql err: %v", err) - return errors.Trace(err) - } - } - - if err := c.runSyncBinlog(); err != nil { - log.Errorf("canal start sync binlog err: %v", err) - return errors.Trace(err) - } - - return nil -} - -func (c *Canal) Close() { - log.Infof("closing canal") - - c.m.Lock() - defer c.m.Unlock() - - c.cancel() - c.connLock.Lock() - c.conn.Close() - c.conn = nil - c.connLock.Unlock() - c.syncer.Close() - - c.eventHandler.OnPosSynced(c.master.Position(), true) -} - -func (c *Canal) WaitDumpDone() <-chan struct{} { - return c.dumpDoneCh -} - -func (c *Canal) Ctx() context.Context { - return c.ctx -} - -func (c *Canal) checkTableMatch(key string) bool { - // no filter, return true - if c.tableMatchCache == nil { - return true - } - - c.tableLock.RLock() - rst, ok := c.tableMatchCache[key] - c.tableLock.RUnlock() - if ok { - // cache hit - return rst - } - matchFlag := false - // check include - if c.includeTableRegex != nil { - for _, reg := range c.includeTableRegex { - if reg.MatchString(key) { - matchFlag = true - break - } - } - } - // check exclude - if matchFlag && c.excludeTableRegex != nil { - for _, reg := range c.excludeTableRegex { - if reg.MatchString(key) { - matchFlag = false - break - } - } - } - c.tableLock.Lock() - c.tableMatchCache[key] = matchFlag - c.tableLock.Unlock() - return matchFlag -} - -func (c *Canal) GetTable(db string, table string) (*schema.Table, error) { - key := fmt.Sprintf("%s.%s", db, table) - // if table is excluded, return error and skip parsing event or dump - if !c.checkTableMatch(key) { - return nil, ErrExcludedTable - } - c.tableLock.RLock() - t, ok := c.tables[key] - c.tableLock.RUnlock() - - if ok { - return t, nil - } - - if c.cfg.DiscardNoMetaRowEvent { - c.tableLock.RLock() - lastTime, ok := c.errorTablesGetTime[key] - c.tableLock.RUnlock() - if ok && time.Now().Sub(lastTime) < UnknownTableRetryPeriod { - return nil, schema.ErrMissingTableMeta - } - } - - t, err := schema.NewTable(c, db, table) - if err != nil { - // check table not exists - if ok, err1 := schema.IsTableExist(c, db, table); err1 == nil && !ok { - return nil, schema.ErrTableNotExist - } - // work around : RDS HAHeartBeat - // ref : https://github.com/alibaba/canal/blob/master/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java#L385 - // issue : https://github.com/alibaba/canal/issues/222 - // This is a common error in RDS that canal can't get HAHealthCheckSchema's meta, so we mock a table meta. - // If canal just skip and log error, as RDS HA heartbeat interval is very short, so too many HAHeartBeat errors will be logged. - if key == schema.HAHealthCheckSchema { - // mock ha_health_check meta - ta := &schema.Table{ - Schema: db, - Name: table, - Columns: make([]schema.TableColumn, 0, 2), - Indexes: make([]*schema.Index, 0), - } - ta.AddColumn("id", "bigint(20)", "", "") - ta.AddColumn("type", "char(1)", "", "") - c.tableLock.Lock() - c.tables[key] = ta - c.tableLock.Unlock() - return ta, nil - } - // if DiscardNoMetaRowEvent is true, we just log this error - if c.cfg.DiscardNoMetaRowEvent { - c.tableLock.Lock() - c.errorTablesGetTime[key] = time.Now() - c.tableLock.Unlock() - // log error and return ErrMissingTableMeta - log.Errorf("canal get table meta err: %v", errors.Trace(err)) - return nil, schema.ErrMissingTableMeta - } - return nil, err - } - - c.tableLock.Lock() - c.tables[key] = t - if c.cfg.DiscardNoMetaRowEvent { - // if get table info success, delete this key from errorTablesGetTime - delete(c.errorTablesGetTime, key) - } - c.tableLock.Unlock() - - return t, nil -} - -// ClearTableCache clear table cache -func (c *Canal) ClearTableCache(db []byte, table []byte) { - key := fmt.Sprintf("%s.%s", db, table) - c.tableLock.Lock() - delete(c.tables, key) - if c.cfg.DiscardNoMetaRowEvent { - delete(c.errorTablesGetTime, key) - } - c.tableLock.Unlock() -} - -// Check MySQL binlog row image, must be in FULL, MINIMAL, NOBLOB -func (c *Canal) CheckBinlogRowImage(image string) error { - // need to check MySQL binlog row image? full, minimal or noblob? - // now only log - if c.cfg.Flavor == mysql.MySQLFlavor { - if res, err := c.Execute(`SHOW GLOBAL VARIABLES LIKE "binlog_row_image"`); err != nil { - return errors.Trace(err) - } else { - // MySQL has binlog row image from 5.6, so older will return empty - rowImage, _ := res.GetString(0, 1) - if rowImage != "" && !strings.EqualFold(rowImage, image) { - return errors.Errorf("MySQL uses %s binlog row image, but we want %s", rowImage, image) - } - } - } - - return nil -} - -func (c *Canal) checkBinlogRowFormat() error { - res, err := c.Execute(`SHOW GLOBAL VARIABLES LIKE "binlog_format";`) - if err != nil { - return errors.Trace(err) - } else if f, _ := res.GetString(0, 1); f != "ROW" { - return errors.Errorf("binlog must ROW format, but %s now", f) - } - - return nil -} - -func (c *Canal) prepareSyncer() error { - seps := strings.Split(c.cfg.Addr, ":") - if len(seps) != 2 { - return errors.Errorf("invalid mysql addr format %s, must host:port", c.cfg.Addr) - } - - port, err := strconv.ParseUint(seps[1], 10, 16) - if err != nil { - return errors.Trace(err) - } - - cfg := replication.BinlogSyncerConfig{ - ServerID: c.cfg.ServerID, - Flavor: c.cfg.Flavor, - Host: seps[0], - Port: uint16(port), - User: c.cfg.User, - Password: c.cfg.Password, - Charset: c.cfg.Charset, - HeartbeatPeriod: c.cfg.HeartbeatPeriod, - ReadTimeout: c.cfg.ReadTimeout, - UseDecimal: c.cfg.UseDecimal, - SemiSyncEnabled: c.cfg.SemiSyncEnabled, - } - - c.syncer = replication.NewBinlogSyncer(cfg) - - return nil -} - -// Execute a SQL -func (c *Canal) Execute(cmd string, args ...interface{}) (rr *mysql.Result, err error) { - c.connLock.Lock() - defer c.connLock.Unlock() - - retryNum := 3 - for i := 0; i < retryNum; i++ { - if c.conn == nil { - c.conn, err = client.Connect(c.cfg.Addr, c.cfg.User, c.cfg.Password, "") - if err != nil { - return nil, errors.Trace(err) - } - } - - rr, err = c.conn.Execute(cmd, args...) - if err != nil && !mysql.ErrorEqual(err, mysql.ErrBadConn) { - return - } else if mysql.ErrorEqual(err, mysql.ErrBadConn) { - c.conn.Close() - c.conn = nil - continue - } else { - return - } - } - return -} - -func (c *Canal) SyncedPosition() mysql.Position { - return c.master.Position() -} - -func (c *Canal) SyncedGTIDSet() mysql.GTIDSet { - return c.master.GTIDSet() -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/config.go b/vendor/github.com/siddontang/go-mysql/canal/config.go deleted file mode 100644 index 991f32c3..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/config.go +++ /dev/null @@ -1,109 +0,0 @@ -package canal - -import ( - "io/ioutil" - "math/rand" - "time" - - "github.com/BurntSushi/toml" - "github.com/juju/errors" - "github.com/siddontang/go-mysql/mysql" -) - -type DumpConfig struct { - // mysqldump execution path, like mysqldump or /usr/bin/mysqldump, etc... - // If not set, ignore using mysqldump. - ExecutionPath string `toml:"mysqldump"` - - // Will override Databases, tables is in database table_db - Tables []string `toml:"tables"` - TableDB string `toml:"table_db"` - - Databases []string `toml:"dbs"` - - // Ignore table format is db.table - IgnoreTables []string `toml:"ignore_tables"` - - // Dump only selected records. Quotes are mandatory - Where string `toml:"where"` - - // If true, discard error msg, else, output to stderr - DiscardErr bool `toml:"discard_err"` - - // Set true to skip --master-data if we have no privilege to do - // 'FLUSH TABLES WITH READ LOCK' - SkipMasterData bool `toml:"skip_master_data"` - - // Set to change the default max_allowed_packet size - MaxAllowedPacketMB int `toml:"max_allowed_packet_mb"` -} - -type Config struct { - Addr string `toml:"addr"` - User string `toml:"user"` - Password string `toml:"password"` - - Charset string `toml:"charset"` - ServerID uint32 `toml:"server_id"` - Flavor string `toml:"flavor"` - HeartbeatPeriod time.Duration `toml:"heartbeat_period"` - ReadTimeout time.Duration `toml:"read_timeout"` - - // IncludeTableRegex or ExcludeTableRegex should contain database name - // Only a table which matches IncludeTableRegex and dismatches ExcludeTableRegex will be processed - // eg, IncludeTableRegex : [".*\\.canal"], ExcludeTableRegex : ["mysql\\..*"] - // this will include all database's 'canal' table, except database 'mysql' - // Default IncludeTableRegex and ExcludeTableRegex are empty, this will include all tables - IncludeTableRegex []string `toml:include_table_regex` - ExcludeTableRegex []string `toml:exclude_table_regex` - - // discard row event without table meta - DiscardNoMetaRowEvent bool `toml:"discard_no_meta_row_event"` - - Dump DumpConfig `toml:"dump"` - - UseDecimal bool `toml:"use_decimal"` - - // SemiSyncEnabled enables semi-sync or not. - SemiSyncEnabled bool `toml:"semi_sync_enabled"` -} - -func NewConfigWithFile(name string) (*Config, error) { - data, err := ioutil.ReadFile(name) - if err != nil { - return nil, errors.Trace(err) - } - - return NewConfig(string(data)) -} - -func NewConfig(data string) (*Config, error) { - var c Config - - _, err := toml.Decode(data, &c) - if err != nil { - return nil, errors.Trace(err) - } - - return &c, nil -} - -func NewDefaultConfig() *Config { - c := new(Config) - - c.Addr = "127.0.0.1:3306" - c.User = "root" - c.Password = "" - - c.Charset = mysql.DEFAULT_CHARSET - rand.Seed(time.Now().Unix()) - c.ServerID = uint32(rand.Intn(1000)) + 1001 - - c.Flavor = "mysql" - - c.Dump.ExecutionPath = "mysqldump" - c.Dump.DiscardErr = true - c.Dump.SkipMasterData = false - - return c -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/dump.go b/vendor/github.com/siddontang/go-mysql/canal/dump.go deleted file mode 100644 index 9cf153d7..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/dump.go +++ /dev/null @@ -1,174 +0,0 @@ -package canal - -import ( - "encoding/hex" - "fmt" - "strconv" - "strings" - "time" - - "github.com/juju/errors" - "github.com/siddontang/go-log/log" - "github.com/siddontang/go-mysql/dump" - "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/schema" -) - -type dumpParseHandler struct { - c *Canal - name string - pos uint64 - gset mysql.GTIDSet -} - -func (h *dumpParseHandler) BinLog(name string, pos uint64) error { - h.name = name - h.pos = pos - return nil -} - -func (h *dumpParseHandler) Data(db string, table string, values []string) error { - if err := h.c.ctx.Err(); err != nil { - return err - } - - tableInfo, err := h.c.GetTable(db, table) - if err != nil { - e := errors.Cause(err) - if e == ErrExcludedTable || - e == schema.ErrTableNotExist || - e == schema.ErrMissingTableMeta { - return nil - } - log.Errorf("get %s.%s information err: %v", db, table, err) - return errors.Trace(err) - } - - vs := make([]interface{}, len(values)) - - for i, v := range values { - if v == "NULL" { - vs[i] = nil - } else if v[0] != '\'' { - if tableInfo.Columns[i].Type == schema.TYPE_NUMBER { - n, err := strconv.ParseInt(v, 10, 64) - if err != nil { - log.Errorf("parse row %v at %d error %v, skip", values, i, err) - return dump.ErrSkip - } - vs[i] = n - } else if tableInfo.Columns[i].Type == schema.TYPE_FLOAT { - f, err := strconv.ParseFloat(v, 64) - if err != nil { - log.Errorf("parse row %v at %d error %v, skip", values, i, err) - return dump.ErrSkip - } - vs[i] = f - } else if strings.HasPrefix(v, "0x") { - buf, err := hex.DecodeString(v[2:]) - if err != nil { - log.Errorf("parse row %v at %d error %v, skip", values, i, err) - return dump.ErrSkip - } - vs[i] = string(buf) - } else { - log.Errorf("parse row %v error, invalid type at %d, skip", values, i) - return dump.ErrSkip - } - } else { - vs[i] = v[1 : len(v)-1] - } - } - - events := newRowsEvent(tableInfo, InsertAction, [][]interface{}{vs}, nil) - return h.c.eventHandler.OnRow(events) -} - -func (c *Canal) AddDumpDatabases(dbs ...string) { - if c.dumper == nil { - return - } - - c.dumper.AddDatabases(dbs...) -} - -func (c *Canal) AddDumpTables(db string, tables ...string) { - if c.dumper == nil { - return - } - - c.dumper.AddTables(db, tables...) -} - -func (c *Canal) AddDumpIgnoreTables(db string, tables ...string) { - if c.dumper == nil { - return - } - - c.dumper.AddIgnoreTables(db, tables...) -} - -func (c *Canal) dump() error { - if c.dumper == nil { - return errors.New("mysqldump does not exist") - } - - h := &dumpParseHandler{c: c} - // If users call StartFromGTID with empty position to start dumping with gtid, - // we record the current gtid position before dump starts. - // - // See tryDump() to see when dump is skipped. - if c.master.GTIDSet() != nil { - gset, err := c.GetMasterGTIDSet() - if err != nil { - return errors.Trace(err) - } - h.gset = gset - } - - if c.cfg.Dump.SkipMasterData { - pos, err := c.GetMasterPos() - if err != nil { - return errors.Trace(err) - } - log.Infof("skip master data, get current binlog position %v", pos) - h.name = pos.Name - h.pos = uint64(pos.Pos) - } - - start := time.Now() - log.Info("try dump MySQL and parse") - if err := c.dumper.DumpAndParse(h); err != nil { - return errors.Trace(err) - } - - pos := mysql.Position{h.name, uint32(h.pos)} - c.master.Update(pos) - c.eventHandler.OnPosSynced(pos, true) - var startPos fmt.Stringer = pos - if h.gset != nil { - c.master.UpdateGTIDSet(h.gset) - startPos = h.gset - } - log.Infof("dump MySQL and parse OK, use %0.2f seconds, start binlog replication at %s", - time.Now().Sub(start).Seconds(), startPos) - return nil -} - -func (c *Canal) tryDump() error { - pos := c.master.Position() - gset := c.master.GTIDSet() - if (len(pos.Name) > 0 && pos.Pos > 0) || - (gset != nil && gset.String() != "") { - // we will sync with binlog name and position - log.Infof("skip dump, use last binlog replication pos %s or GTID set %s", pos, gset) - return nil - } - - if c.dumper == nil { - log.Info("skip dump, no mysqldump") - return nil - } - - return c.dump() -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/handler.go b/vendor/github.com/siddontang/go-mysql/canal/handler.go deleted file mode 100644 index 4e47cb98..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/handler.go +++ /dev/null @@ -1,41 +0,0 @@ -package canal - -import ( - "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/replication" -) - -type EventHandler interface { - OnRotate(roateEvent *replication.RotateEvent) error - // OnTableChanged is called when the table is created, altered, renamed or dropped. - // You need to clear the associated data like cache with the table. - // It will be called before OnDDL. - OnTableChanged(schema string, table string) error - OnDDL(nextPos mysql.Position, queryEvent *replication.QueryEvent) error - OnRow(e *RowsEvent) error - OnXID(nextPos mysql.Position) error - OnGTID(gtid mysql.GTIDSet) error - // OnPosSynced Use your own way to sync position. When force is true, sync position immediately. - OnPosSynced(pos mysql.Position, force bool) error - String() string -} - -type DummyEventHandler struct { -} - -func (h *DummyEventHandler) OnRotate(*replication.RotateEvent) error { return nil } -func (h *DummyEventHandler) OnTableChanged(schema string, table string) error { return nil } -func (h *DummyEventHandler) OnDDL(nextPos mysql.Position, queryEvent *replication.QueryEvent) error { - return nil -} -func (h *DummyEventHandler) OnRow(*RowsEvent) error { return nil } -func (h *DummyEventHandler) OnXID(mysql.Position) error { return nil } -func (h *DummyEventHandler) OnGTID(mysql.GTIDSet) error { return nil } -func (h *DummyEventHandler) OnPosSynced(mysql.Position, bool) error { return nil } -func (h *DummyEventHandler) String() string { return "DummyEventHandler" } - -// `SetEventHandler` registers the sync handler, you must register your -// own handler before starting Canal. -func (c *Canal) SetEventHandler(h EventHandler) { - c.eventHandler = h -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/master.go b/vendor/github.com/siddontang/go-mysql/canal/master.go deleted file mode 100644 index 62bb4b77..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/master.go +++ /dev/null @@ -1,46 +0,0 @@ -package canal - -import ( - "sync" - - "github.com/siddontang/go-log/log" - "github.com/siddontang/go-mysql/mysql" -) - -type masterInfo struct { - sync.RWMutex - - pos mysql.Position - - gset mysql.GTIDSet -} - -func (m *masterInfo) Update(pos mysql.Position) { - log.Debugf("update master position %s", pos) - - m.Lock() - m.pos = pos - m.Unlock() -} - -func (m *masterInfo) UpdateGTIDSet(gset mysql.GTIDSet) { - log.Debugf("update master gtid set %s", gset) - - m.Lock() - m.gset = gset - m.Unlock() -} - -func (m *masterInfo) Position() mysql.Position { - m.RLock() - defer m.RUnlock() - - return m.pos -} - -func (m *masterInfo) GTIDSet() mysql.GTIDSet { - m.RLock() - defer m.RUnlock() - - return m.gset -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/rows.go b/vendor/github.com/siddontang/go-mysql/canal/rows.go deleted file mode 100644 index e246ee5a..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/rows.go +++ /dev/null @@ -1,75 +0,0 @@ -package canal - -import ( - "fmt" - - "github.com/siddontang/go-mysql/replication" - "github.com/siddontang/go-mysql/schema" -) - -// The action name for sync. -const ( - UpdateAction = "update" - InsertAction = "insert" - DeleteAction = "delete" -) - -// RowsEvent is the event for row replication. -type RowsEvent struct { - Table *schema.Table - Action string - // changed row list - // binlog has three update event version, v0, v1 and v2. - // for v1 and v2, the rows number must be even. - // Two rows for one event, format is [before update row, after update row] - // for update v0, only one row for a event, and we don't support this version. - Rows [][]interface{} - // Header can be used to inspect the event - Header *replication.EventHeader -} - -func newRowsEvent(table *schema.Table, action string, rows [][]interface{}, header *replication.EventHeader) *RowsEvent { - e := new(RowsEvent) - - e.Table = table - e.Action = action - e.Rows = rows - e.Header = header - - e.handleUnsigned() - - return e -} - -func (r *RowsEvent) handleUnsigned() { - // Handle Unsigned Columns here, for binlog replication, we can't know the integer is unsigned or not, - // so we use int type but this may cause overflow outside sometimes, so we must convert to the really . - // unsigned type - if len(r.Table.UnsignedColumns) == 0 { - return - } - - for i := 0; i < len(r.Rows); i++ { - for _, index := range r.Table.UnsignedColumns { - switch t := r.Rows[i][index].(type) { - case int8: - r.Rows[i][index] = uint8(t) - case int16: - r.Rows[i][index] = uint16(t) - case int32: - r.Rows[i][index] = uint32(t) - case int64: - r.Rows[i][index] = uint64(t) - case int: - r.Rows[i][index] = uint(t) - default: - // nothing to do - } - } - } -} - -// String implements fmt.Stringer interface. -func (r *RowsEvent) String() string { - return fmt.Sprintf("%s %s %v", r.Action, r.Table, r.Rows) -} diff --git a/vendor/github.com/siddontang/go-mysql/canal/sync.go b/vendor/github.com/siddontang/go-mysql/canal/sync.go deleted file mode 100644 index 77a8508d..00000000 --- a/vendor/github.com/siddontang/go-mysql/canal/sync.go +++ /dev/null @@ -1,271 +0,0 @@ -package canal - -import ( - "fmt" - "regexp" - "time" - - "github.com/juju/errors" - "github.com/satori/go.uuid" - "github.com/siddontang/go-log/log" - "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/replication" - "github.com/siddontang/go-mysql/schema" -) - -var ( - expCreateTable = regexp.MustCompile("(?i)^CREATE\\sTABLE(\\sIF\\sNOT\\sEXISTS)?\\s`{0,1}(.*?)`{0,1}\\.{0,1}`{0,1}([^`\\.]+?)`{0,1}\\s.*") - expAlterTable = regexp.MustCompile("(?i)^ALTER\\sTABLE\\s.*?`{0,1}(.*?)`{0,1}\\.{0,1}`{0,1}([^`\\.]+?)`{0,1}\\s.*") - expRenameTable = regexp.MustCompile("(?i)^RENAME\\sTABLE\\s.*?`{0,1}(.*?)`{0,1}\\.{0,1}`{0,1}([^`\\.]+?)`{0,1}\\s{1,}TO\\s.*?") - expDropTable = regexp.MustCompile("(?i)^DROP\\sTABLE(\\sIF\\sEXISTS){0,1}\\s`{0,1}(.*?)`{0,1}\\.{0,1}`{0,1}([^`\\.]+?)`{0,1}(?:$|\\s)") -) - -func (c *Canal) startSyncer() (*replication.BinlogStreamer, error) { - gset := c.master.GTIDSet() - if gset == nil { - pos := c.master.Position() - s, err := c.syncer.StartSync(pos) - if err != nil { - return nil, errors.Errorf("start sync replication at binlog %v error %v", pos, err) - } - log.Infof("start sync binlog at binlog file %v", pos) - return s, nil - } else { - s, err := c.syncer.StartSyncGTID(gset) - if err != nil { - return nil, errors.Errorf("start sync replication at GTID set %v error %v", gset, err) - } - log.Infof("start sync binlog at GTID set %v", gset) - return s, nil - } -} - -func (c *Canal) runSyncBinlog() error { - s, err := c.startSyncer() - if err != nil { - return err - } - - savePos := false - force := false - for { - ev, err := s.GetEvent(c.ctx) - - if err != nil { - return errors.Trace(err) - } - savePos = false - force = false - pos := c.master.Position() - - curPos := pos.Pos - //next binlog pos - pos.Pos = ev.Header.LogPos - - // We only save position with RotateEvent and XIDEvent. - // For RowsEvent, we can't save the position until meeting XIDEvent - // which tells the whole transaction is over. - // TODO: If we meet any DDL query, we must save too. - switch e := ev.Event.(type) { - case *replication.RotateEvent: - pos.Name = string(e.NextLogName) - pos.Pos = uint32(e.Position) - log.Infof("rotate binlog to %s", pos) - savePos = true - force = true - if err = c.eventHandler.OnRotate(e); err != nil { - return errors.Trace(err) - } - case *replication.RowsEvent: - // we only focus row based event - err = c.handleRowsEvent(ev) - if err != nil { - e := errors.Cause(err) - // if error is not ErrExcludedTable or ErrTableNotExist or ErrMissingTableMeta, stop canal - if e != ErrExcludedTable && - e != schema.ErrTableNotExist && - e != schema.ErrMissingTableMeta { - log.Errorf("handle rows event at (%s, %d) error %v", pos.Name, curPos, err) - return errors.Trace(err) - } - } - continue - case *replication.XIDEvent: - if e.GSet != nil { - c.master.UpdateGTIDSet(e.GSet) - } - savePos = true - // try to save the position later - if err := c.eventHandler.OnXID(pos); err != nil { - return errors.Trace(err) - } - case *replication.MariadbGTIDEvent: - // try to save the GTID later - gtid, err := mysql.ParseMariadbGTIDSet(e.GTID.String()) - if err != nil { - return errors.Trace(err) - } - if err := c.eventHandler.OnGTID(gtid); err != nil { - return errors.Trace(err) - } - case *replication.GTIDEvent: - u, _ := uuid.FromBytes(e.SID) - gtid, err := mysql.ParseMysqlGTIDSet(fmt.Sprintf("%s:%d", u.String(), e.GNO)) - if err != nil { - return errors.Trace(err) - } - if err := c.eventHandler.OnGTID(gtid); err != nil { - return errors.Trace(err) - } - case *replication.QueryEvent: - if e.GSet != nil { - c.master.UpdateGTIDSet(e.GSet) - } - var ( - mb [][]byte - schema []byte - table []byte - ) - regexps := []regexp.Regexp{*expCreateTable, *expAlterTable, *expRenameTable, *expDropTable} - for _, reg := range regexps { - mb = reg.FindSubmatch(e.Query) - if len(mb) != 0 { - break - } - } - mbLen := len(mb) - if mbLen == 0 { - continue - } - - // the first last is table name, the second last is database name(if exists) - if len(mb[mbLen-2]) == 0 { - schema = e.Schema - } else { - schema = mb[mbLen-2] - } - table = mb[mbLen-1] - - savePos = true - force = true - c.ClearTableCache(schema, table) - log.Infof("table structure changed, clear table cache: %s.%s\n", schema, table) - if err = c.eventHandler.OnTableChanged(string(schema), string(table)); err != nil { - return errors.Trace(err) - } - - // Now we only handle Table Changed DDL, maybe we will support more later. - if err = c.eventHandler.OnDDL(pos, e); err != nil { - return errors.Trace(err) - } - default: - continue - } - - if savePos { - c.master.Update(pos) - c.eventHandler.OnPosSynced(pos, force) - } - } - - return nil -} - -func (c *Canal) handleRowsEvent(e *replication.BinlogEvent) error { - ev := e.Event.(*replication.RowsEvent) - - // Caveat: table may be altered at runtime. - schema := string(ev.Table.Schema) - table := string(ev.Table.Table) - - t, err := c.GetTable(schema, table) - if err != nil { - return err - } - var action string - switch e.Header.EventType { - case replication.WRITE_ROWS_EVENTv1, replication.WRITE_ROWS_EVENTv2: - action = InsertAction - case replication.DELETE_ROWS_EVENTv1, replication.DELETE_ROWS_EVENTv2: - action = DeleteAction - case replication.UPDATE_ROWS_EVENTv1, replication.UPDATE_ROWS_EVENTv2: - action = UpdateAction - default: - return errors.Errorf("%s not supported now", e.Header.EventType) - } - events := newRowsEvent(t, action, ev.Rows, e.Header) - return c.eventHandler.OnRow(events) -} - -func (c *Canal) FlushBinlog() error { - _, err := c.Execute("FLUSH BINARY LOGS") - return errors.Trace(err) -} - -func (c *Canal) WaitUntilPos(pos mysql.Position, timeout time.Duration) error { - timer := time.NewTimer(timeout) - for { - select { - case <-timer.C: - return errors.Errorf("wait position %v too long > %s", pos, timeout) - default: - err := c.FlushBinlog() - if err != nil { - return errors.Trace(err) - } - curPos := c.master.Position() - if curPos.Compare(pos) >= 0 { - return nil - } else { - log.Debugf("master pos is %v, wait catching %v", curPos, pos) - time.Sleep(100 * time.Millisecond) - } - } - } - - return nil -} - -func (c *Canal) GetMasterPos() (mysql.Position, error) { - rr, err := c.Execute("SHOW MASTER STATUS") - if err != nil { - return mysql.Position{"", 0}, errors.Trace(err) - } - - name, _ := rr.GetString(0, 0) - pos, _ := rr.GetInt(0, 1) - - return mysql.Position{name, uint32(pos)}, nil -} - -func (c *Canal) GetMasterGTIDSet() (mysql.GTIDSet, error) { - query := "" - switch c.cfg.Flavor { - case mysql.MariaDBFlavor: - query = "SELECT @@GLOBAL.gtid_current_pos" - default: - query = "SELECT @@GLOBAL.GTID_EXECUTED" - } - rr, err := c.Execute(query) - if err != nil { - return nil, errors.Trace(err) - } - gx, err := rr.GetString(0, 0) - if err != nil { - return nil, errors.Trace(err) - } - gset, err := mysql.ParseGTIDSet(c.cfg.Flavor, gx) - if err != nil { - return nil, errors.Trace(err) - } - return gset, nil -} - -func (c *Canal) CatchMasterPos(timeout time.Duration) error { - pos, err := c.GetMasterPos() - if err != nil { - return errors.Trace(err) - } - - return c.WaitUntilPos(pos, timeout) -} diff --git a/vendor/github.com/siddontang/go-mysql/client/auth.go b/vendor/github.com/siddontang/go-mysql/client/auth.go deleted file mode 100644 index 85b688c2..00000000 --- a/vendor/github.com/siddontang/go-mysql/client/auth.go +++ /dev/null @@ -1,174 +0,0 @@ -package client - -import ( - "bytes" - "crypto/tls" - "encoding/binary" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/packet" -) - -func (c *Conn) readInitialHandshake() error { - data, err := c.ReadPacket() - if err != nil { - return errors.Trace(err) - } - - if data[0] == ERR_HEADER { - return errors.New("read initial handshake error") - } - - if data[0] < MinProtocolVersion { - return errors.Errorf("invalid protocol version %d, must >= 10", data[0]) - } - - //skip mysql version - //mysql version end with 0x00 - pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 - - //connection id length is 4 - c.connectionID = uint32(binary.LittleEndian.Uint32(data[pos : pos+4])) - pos += 4 - - c.salt = []byte{} - c.salt = append(c.salt, data[pos:pos+8]...) - - //skip filter - pos += 8 + 1 - - //capability lower 2 bytes - c.capability = uint32(binary.LittleEndian.Uint16(data[pos : pos+2])) - - pos += 2 - - if len(data) > pos { - //skip server charset - //c.charset = data[pos] - pos += 1 - - c.status = binary.LittleEndian.Uint16(data[pos : pos+2]) - pos += 2 - - c.capability = uint32(binary.LittleEndian.Uint16(data[pos:pos+2]))<<16 | c.capability - - pos += 2 - - //skip auth data len or [00] - //skip reserved (all [00]) - pos += 10 + 1 - - // The documentation is ambiguous about the length. - // The official Python library uses the fixed length 12 - // mysql-proxy also use 12 - // which is not documented but seems to work. - c.salt = append(c.salt, data[pos:pos+12]...) - } - - return nil -} - -func (c *Conn) writeAuthHandshake() error { - // Adjust client capability flags based on server support - capability := CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | - CLIENT_LONG_PASSWORD | CLIENT_TRANSACTIONS | CLIENT_LONG_FLAG - - // To enable TLS / SSL - if c.TLSConfig != nil { - capability |= CLIENT_PLUGIN_AUTH - capability |= CLIENT_SSL - } - - capability &= c.capability - - //packet length - //capbility 4 - //max-packet size 4 - //charset 1 - //reserved all[0] 23 - length := 4 + 4 + 1 + 23 - - //username - length += len(c.user) + 1 - - //we only support secure connection - auth := CalcPassword(c.salt, []byte(c.password)) - - length += 1 + len(auth) - - if len(c.db) > 0 { - capability |= CLIENT_CONNECT_WITH_DB - - length += len(c.db) + 1 - } - - // mysql_native_password + null-terminated - length += 21 + 1 - - c.capability = capability - - data := make([]byte, length+4) - - //capability [32 bit] - data[4] = byte(capability) - data[5] = byte(capability >> 8) - data[6] = byte(capability >> 16) - data[7] = byte(capability >> 24) - - //MaxPacketSize [32 bit] (none) - //data[8] = 0x00 - //data[9] = 0x00 - //data[10] = 0x00 - //data[11] = 0x00 - - //Charset [1 byte] - //use default collation id 33 here, is utf-8 - data[12] = byte(DEFAULT_COLLATION_ID) - - // SSL Connection Request Packet - // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest - if c.TLSConfig != nil { - // Send TLS / SSL request packet - if err := c.WritePacket(data[:(4+4+1+23)+4]); err != nil { - return err - } - - // Switch to TLS - tlsConn := tls.Client(c.Conn.Conn, c.TLSConfig) - if err := tlsConn.Handshake(); err != nil { - return err - } - - currentSequence := c.Sequence - c.Conn = packet.NewConn(tlsConn) - c.Sequence = currentSequence - } - - //Filler [23 bytes] (all 0x00) - pos := 13 + 23 - - //User [null terminated string] - if len(c.user) > 0 { - pos += copy(data[pos:], c.user) - } - data[pos] = 0x00 - pos++ - - // auth [length encoded integer] - data[pos] = byte(len(auth)) - pos += 1 + copy(data[pos+1:], auth) - - // db [null terminated string] - if len(c.db) > 0 { - pos += copy(data[pos:], c.db) - data[pos] = 0x00 - pos++ - } - - // Assume native client during response - pos += copy(data[pos:], "mysql_native_password") - data[pos] = 0x00 - - return c.WritePacket(data) -} diff --git a/vendor/github.com/siddontang/go-mysql/client/conn.go b/vendor/github.com/siddontang/go-mysql/client/conn.go deleted file mode 100644 index 54ee3f05..00000000 --- a/vendor/github.com/siddontang/go-mysql/client/conn.go +++ /dev/null @@ -1,254 +0,0 @@ -package client - -import ( - "crypto/tls" - "fmt" - "net" - "strings" - "time" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go-mysql/packet" -) - -type Conn struct { - *packet.Conn - - user string - password string - db string - TLSConfig *tls.Config - - capability uint32 - - status uint16 - - charset string - - salt []byte - - connectionID uint32 -} - -func getNetProto(addr string) string { - proto := "tcp" - if strings.Contains(addr, "/") { - proto = "unix" - } - return proto -} - -// Connect to a MySQL server, addr can be ip:port, or a unix socket domain like /var/sock. -// Accepts a series of configuration functions as a variadic argument. -func Connect(addr string, user string, password string, dbName string, options ...func(*Conn)) (*Conn, error) { - proto := getNetProto(addr) - - c := new(Conn) - - var err error - conn, err := net.DialTimeout(proto, addr, 10*time.Second) - if err != nil { - return nil, errors.Trace(err) - } - - c.Conn = packet.NewConn(conn) - c.user = user - c.password = password - c.db = dbName - - //use default charset here, utf-8 - c.charset = DEFAULT_CHARSET - - // Apply configuration functions. - for i := range options { - options[i](c) - } - - if err = c.handshake(); err != nil { - return nil, errors.Trace(err) - } - - return c, nil -} - -func (c *Conn) handshake() error { - var err error - if err = c.readInitialHandshake(); err != nil { - c.Close() - return errors.Trace(err) - } - - if err := c.writeAuthHandshake(); err != nil { - c.Close() - - return errors.Trace(err) - } - - if _, err := c.readOK(); err != nil { - c.Close() - return errors.Trace(err) - } - - return nil -} - -func (c *Conn) Close() error { - return c.Conn.Close() -} - -func (c *Conn) Ping() error { - if err := c.writeCommand(COM_PING); err != nil { - return errors.Trace(err) - } - - if _, err := c.readOK(); err != nil { - return errors.Trace(err) - } - - return nil -} - -func (c *Conn) UseDB(dbName string) error { - if c.db == dbName { - return nil - } - - if err := c.writeCommandStr(COM_INIT_DB, dbName); err != nil { - return errors.Trace(err) - } - - if _, err := c.readOK(); err != nil { - return errors.Trace(err) - } - - c.db = dbName - return nil -} - -func (c *Conn) GetDB() string { - return c.db -} - -func (c *Conn) Execute(command string, args ...interface{}) (*Result, error) { - if len(args) == 0 { - return c.exec(command) - } else { - if s, err := c.Prepare(command); err != nil { - return nil, errors.Trace(err) - } else { - var r *Result - r, err = s.Execute(args...) - s.Close() - return r, err - } - } -} - -func (c *Conn) Begin() error { - _, err := c.exec("BEGIN") - return errors.Trace(err) -} - -func (c *Conn) Commit() error { - _, err := c.exec("COMMIT") - return errors.Trace(err) -} - -func (c *Conn) Rollback() error { - _, err := c.exec("ROLLBACK") - return errors.Trace(err) -} - -func (c *Conn) SetCharset(charset string) error { - if c.charset == charset { - return nil - } - - if _, err := c.exec(fmt.Sprintf("SET NAMES %s", charset)); err != nil { - return errors.Trace(err) - } else { - c.charset = charset - return nil - } -} - -func (c *Conn) FieldList(table string, wildcard string) ([]*Field, error) { - if err := c.writeCommandStrStr(COM_FIELD_LIST, table, wildcard); err != nil { - return nil, errors.Trace(err) - } - - data, err := c.ReadPacket() - if err != nil { - return nil, errors.Trace(err) - } - - fs := make([]*Field, 0, 4) - var f *Field - if data[0] == ERR_HEADER { - return nil, c.handleErrorPacket(data) - } else { - for { - if data, err = c.ReadPacket(); err != nil { - return nil, errors.Trace(err) - } - - // EOF Packet - if c.isEOFPacket(data) { - return fs, nil - } - - if f, err = FieldData(data).Parse(); err != nil { - return nil, errors.Trace(err) - } - fs = append(fs, f) - } - } - return nil, fmt.Errorf("field list error") -} - -func (c *Conn) SetAutoCommit() error { - if !c.IsAutoCommit() { - if _, err := c.exec("SET AUTOCOMMIT = 1"); err != nil { - return errors.Trace(err) - } - } - return nil -} - -func (c *Conn) IsAutoCommit() bool { - return c.status&SERVER_STATUS_AUTOCOMMIT > 0 -} - -func (c *Conn) IsInTransaction() bool { - return c.status&SERVER_STATUS_IN_TRANS > 0 -} - -func (c *Conn) GetCharset() string { - return c.charset -} - -func (c *Conn) GetConnectionID() uint32 { - return c.connectionID -} - -func (c *Conn) HandleOKPacket(data []byte) *Result { - r, _ := c.handleOKPacket(data) - return r -} - -func (c *Conn) HandleErrorPacket(data []byte) error { - return c.handleErrorPacket(data) -} - -func (c *Conn) ReadOKPacket() (*Result, error) { - return c.readOK() -} - -func (c *Conn) exec(query string) (*Result, error) { - if err := c.writeCommandStr(COM_QUERY, query); err != nil { - return nil, errors.Trace(err) - } - - return c.readResult(false) -} diff --git a/vendor/github.com/siddontang/go-mysql/client/req.go b/vendor/github.com/siddontang/go-mysql/client/req.go deleted file mode 100644 index dde03e71..00000000 --- a/vendor/github.com/siddontang/go-mysql/client/req.go +++ /dev/null @@ -1,72 +0,0 @@ -package client - -func (c *Conn) writeCommand(command byte) error { - c.ResetSequence() - - return c.WritePacket([]byte{ - 0x01, //1 bytes long - 0x00, - 0x00, - 0x00, //sequence - command, - }) -} - -func (c *Conn) writeCommandBuf(command byte, arg []byte) error { - c.ResetSequence() - - length := len(arg) + 1 - - data := make([]byte, length+4) - - data[4] = command - - copy(data[5:], arg) - - return c.WritePacket(data) -} - -func (c *Conn) writeCommandStr(command byte, arg string) error { - c.ResetSequence() - - length := len(arg) + 1 - - data := make([]byte, length+4) - - data[4] = command - - copy(data[5:], arg) - - return c.WritePacket(data) -} - -func (c *Conn) writeCommandUint32(command byte, arg uint32) error { - c.ResetSequence() - - return c.WritePacket([]byte{ - 0x05, //5 bytes long - 0x00, - 0x00, - 0x00, //sequence - - command, - - byte(arg), - byte(arg >> 8), - byte(arg >> 16), - byte(arg >> 24), - }) -} - -func (c *Conn) writeCommandStrStr(command byte, arg1 string, arg2 string) error { - c.ResetSequence() - - data := make([]byte, 4, 6+len(arg1)+len(arg2)) - - data = append(data, command) - data = append(data, arg1...) - data = append(data, 0) - data = append(data, arg2...) - - return c.WritePacket(data) -} diff --git a/vendor/github.com/siddontang/go-mysql/client/resp.go b/vendor/github.com/siddontang/go-mysql/client/resp.go deleted file mode 100644 index 4e5f8559..00000000 --- a/vendor/github.com/siddontang/go-mysql/client/resp.go +++ /dev/null @@ -1,219 +0,0 @@ -package client - -import ( - "encoding/binary" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go/hack" -) - -func (c *Conn) readUntilEOF() (err error) { - var data []byte - - for { - data, err = c.ReadPacket() - - if err != nil { - return - } - - // EOF Packet - if c.isEOFPacket(data) { - return - } - } - return -} - -func (c *Conn) isEOFPacket(data []byte) bool { - return data[0] == EOF_HEADER && len(data) <= 5 -} - -func (c *Conn) handleOKPacket(data []byte) (*Result, error) { - var n int - var pos int = 1 - - r := new(Result) - - r.AffectedRows, _, n = LengthEncodedInt(data[pos:]) - pos += n - r.InsertId, _, n = LengthEncodedInt(data[pos:]) - pos += n - - if c.capability&CLIENT_PROTOCOL_41 > 0 { - r.Status = binary.LittleEndian.Uint16(data[pos:]) - c.status = r.Status - pos += 2 - - //todo:strict_mode, check warnings as error - //Warnings := binary.LittleEndian.Uint16(data[pos:]) - //pos += 2 - } else if c.capability&CLIENT_TRANSACTIONS > 0 { - r.Status = binary.LittleEndian.Uint16(data[pos:]) - c.status = r.Status - pos += 2 - } - - //new ok package will check CLIENT_SESSION_TRACK too, but I don't support it now. - - //skip info - return r, nil -} - -func (c *Conn) handleErrorPacket(data []byte) error { - e := new(MyError) - - var pos int = 1 - - e.Code = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - if c.capability&CLIENT_PROTOCOL_41 > 0 { - //skip '#' - pos++ - e.State = hack.String(data[pos : pos+5]) - pos += 5 - } - - e.Message = hack.String(data[pos:]) - - return e -} - -func (c *Conn) readOK() (*Result, error) { - data, err := c.ReadPacket() - if err != nil { - return nil, errors.Trace(err) - } - - if data[0] == OK_HEADER { - return c.handleOKPacket(data) - } else if data[0] == ERR_HEADER { - return nil, c.handleErrorPacket(data) - } else { - return nil, errors.New("invalid ok packet") - } -} - -func (c *Conn) readResult(binary bool) (*Result, error) { - data, err := c.ReadPacket() - if err != nil { - return nil, errors.Trace(err) - } - - if data[0] == OK_HEADER { - return c.handleOKPacket(data) - } else if data[0] == ERR_HEADER { - return nil, c.handleErrorPacket(data) - } else if data[0] == LocalInFile_HEADER { - return nil, ErrMalformPacket - } - - return c.readResultset(data, binary) -} - -func (c *Conn) readResultset(data []byte, binary bool) (*Result, error) { - result := &Result{ - Status: 0, - InsertId: 0, - AffectedRows: 0, - - Resultset: &Resultset{}, - } - - // column count - count, _, n := LengthEncodedInt(data) - - if n-len(data) != 0 { - return nil, ErrMalformPacket - } - - result.Fields = make([]*Field, count) - result.FieldNames = make(map[string]int, count) - - if err := c.readResultColumns(result); err != nil { - return nil, errors.Trace(err) - } - - if err := c.readResultRows(result, binary); err != nil { - return nil, errors.Trace(err) - } - - return result, nil -} - -func (c *Conn) readResultColumns(result *Result) (err error) { - var i int = 0 - var data []byte - - for { - data, err = c.ReadPacket() - if err != nil { - return - } - - // EOF Packet - if c.isEOFPacket(data) { - if c.capability&CLIENT_PROTOCOL_41 > 0 { - //result.Warnings = binary.LittleEndian.Uint16(data[1:]) - //todo add strict_mode, warning will be treat as error - result.Status = binary.LittleEndian.Uint16(data[3:]) - c.status = result.Status - } - - if i != len(result.Fields) { - err = ErrMalformPacket - } - - return - } - - result.Fields[i], err = FieldData(data).Parse() - if err != nil { - return - } - - result.FieldNames[hack.String(result.Fields[i].Name)] = i - - i++ - } -} - -func (c *Conn) readResultRows(result *Result, isBinary bool) (err error) { - var data []byte - - for { - data, err = c.ReadPacket() - - if err != nil { - return - } - - // EOF Packet - if c.isEOFPacket(data) { - if c.capability&CLIENT_PROTOCOL_41 > 0 { - //result.Warnings = binary.LittleEndian.Uint16(data[1:]) - //todo add strict_mode, warning will be treat as error - result.Status = binary.LittleEndian.Uint16(data[3:]) - c.status = result.Status - } - - break - } - - result.RowDatas = append(result.RowDatas, data) - } - - result.Values = make([][]interface{}, len(result.RowDatas)) - - for i := range result.Values { - result.Values[i], err = result.RowDatas[i].Parse(result.Fields, isBinary) - - if err != nil { - return errors.Trace(err) - } - } - - return nil -} diff --git a/vendor/github.com/siddontang/go-mysql/client/stmt.go b/vendor/github.com/siddontang/go-mysql/client/stmt.go deleted file mode 100644 index fd2dfd71..00000000 --- a/vendor/github.com/siddontang/go-mysql/client/stmt.go +++ /dev/null @@ -1,216 +0,0 @@ -package client - -import ( - "encoding/binary" - "fmt" - "math" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" -) - -type Stmt struct { - conn *Conn - id uint32 - query string - - params int - columns int -} - -func (s *Stmt) ParamNum() int { - return s.params -} - -func (s *Stmt) ColumnNum() int { - return s.columns -} - -func (s *Stmt) Execute(args ...interface{}) (*Result, error) { - if err := s.write(args...); err != nil { - return nil, errors.Trace(err) - } - - return s.conn.readResult(true) -} - -func (s *Stmt) Close() error { - if err := s.conn.writeCommandUint32(COM_STMT_CLOSE, s.id); err != nil { - return errors.Trace(err) - } - - return nil -} - -func (s *Stmt) write(args ...interface{}) error { - paramsNum := s.params - - if len(args) != paramsNum { - return fmt.Errorf("argument mismatch, need %d but got %d", s.params, len(args)) - } - - paramTypes := make([]byte, paramsNum<<1) - paramValues := make([][]byte, paramsNum) - - //NULL-bitmap, length: (num-params+7) - nullBitmap := make([]byte, (paramsNum+7)>>3) - - var length int = int(1 + 4 + 1 + 4 + ((paramsNum + 7) >> 3) + 1 + (paramsNum << 1)) - - var newParamBoundFlag byte = 0 - - for i := range args { - if args[i] == nil { - nullBitmap[i/8] |= (1 << (uint(i) % 8)) - paramTypes[i<<1] = MYSQL_TYPE_NULL - continue - } - - newParamBoundFlag = 1 - - switch v := args[i].(type) { - case int8: - paramTypes[i<<1] = MYSQL_TYPE_TINY - paramValues[i] = []byte{byte(v)} - case int16: - paramTypes[i<<1] = MYSQL_TYPE_SHORT - paramValues[i] = Uint16ToBytes(uint16(v)) - case int32: - paramTypes[i<<1] = MYSQL_TYPE_LONG - paramValues[i] = Uint32ToBytes(uint32(v)) - case int: - paramTypes[i<<1] = MYSQL_TYPE_LONGLONG - paramValues[i] = Uint64ToBytes(uint64(v)) - case int64: - paramTypes[i<<1] = MYSQL_TYPE_LONGLONG - paramValues[i] = Uint64ToBytes(uint64(v)) - case uint8: - paramTypes[i<<1] = MYSQL_TYPE_TINY - paramTypes[(i<<1)+1] = 0x80 - paramValues[i] = []byte{v} - case uint16: - paramTypes[i<<1] = MYSQL_TYPE_SHORT - paramTypes[(i<<1)+1] = 0x80 - paramValues[i] = Uint16ToBytes(uint16(v)) - case uint32: - paramTypes[i<<1] = MYSQL_TYPE_LONG - paramTypes[(i<<1)+1] = 0x80 - paramValues[i] = Uint32ToBytes(uint32(v)) - case uint: - paramTypes[i<<1] = MYSQL_TYPE_LONGLONG - paramTypes[(i<<1)+1] = 0x80 - paramValues[i] = Uint64ToBytes(uint64(v)) - case uint64: - paramTypes[i<<1] = MYSQL_TYPE_LONGLONG - paramTypes[(i<<1)+1] = 0x80 - paramValues[i] = Uint64ToBytes(uint64(v)) - case bool: - paramTypes[i<<1] = MYSQL_TYPE_TINY - if v { - paramValues[i] = []byte{1} - } else { - paramValues[i] = []byte{0} - - } - case float32: - paramTypes[i<<1] = MYSQL_TYPE_FLOAT - paramValues[i] = Uint32ToBytes(math.Float32bits(v)) - case float64: - paramTypes[i<<1] = MYSQL_TYPE_DOUBLE - paramValues[i] = Uint64ToBytes(math.Float64bits(v)) - case string: - paramTypes[i<<1] = MYSQL_TYPE_STRING - paramValues[i] = append(PutLengthEncodedInt(uint64(len(v))), v...) - case []byte: - paramTypes[i<<1] = MYSQL_TYPE_STRING - paramValues[i] = append(PutLengthEncodedInt(uint64(len(v))), v...) - default: - return fmt.Errorf("invalid argument type %T", args[i]) - } - - length += len(paramValues[i]) - } - - data := make([]byte, 4, 4+length) - - data = append(data, COM_STMT_EXECUTE) - data = append(data, byte(s.id), byte(s.id>>8), byte(s.id>>16), byte(s.id>>24)) - - //flag: CURSOR_TYPE_NO_CURSOR - data = append(data, 0x00) - - //iteration-count, always 1 - data = append(data, 1, 0, 0, 0) - - if s.params > 0 { - data = append(data, nullBitmap...) - - //new-params-bound-flag - data = append(data, newParamBoundFlag) - - if newParamBoundFlag == 1 { - //type of each parameter, length: num-params * 2 - data = append(data, paramTypes...) - - //value of each parameter - for _, v := range paramValues { - data = append(data, v...) - } - } - } - - s.conn.ResetSequence() - - return s.conn.WritePacket(data) -} - -func (c *Conn) Prepare(query string) (*Stmt, error) { - if err := c.writeCommandStr(COM_STMT_PREPARE, query); err != nil { - return nil, errors.Trace(err) - } - - data, err := c.ReadPacket() - if err != nil { - return nil, errors.Trace(err) - } - - if data[0] == ERR_HEADER { - return nil, c.handleErrorPacket(data) - } else if data[0] != OK_HEADER { - return nil, ErrMalformPacket - } - - s := new(Stmt) - s.conn = c - - pos := 1 - - //for statement id - s.id = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - //number columns - s.columns = int(binary.LittleEndian.Uint16(data[pos:])) - pos += 2 - - //number params - s.params = int(binary.LittleEndian.Uint16(data[pos:])) - pos += 2 - - //warnings - //warnings = binary.LittleEndian.Uint16(data[pos:]) - - if s.params > 0 { - if err := s.conn.readUntilEOF(); err != nil { - return nil, errors.Trace(err) - } - } - - if s.columns > 0 { - if err := s.conn.readUntilEOF(); err != nil { - return nil, errors.Trace(err) - } - } - - return s, nil -} diff --git a/vendor/github.com/siddontang/go-mysql/dump/dump.go b/vendor/github.com/siddontang/go-mysql/dump/dump.go deleted file mode 100644 index 8ebc4d65..00000000 --- a/vendor/github.com/siddontang/go-mysql/dump/dump.go +++ /dev/null @@ -1,216 +0,0 @@ -package dump - -import ( - "fmt" - "io" - "os" - "os/exec" - "strings" - - "github.com/juju/errors" - "github.com/siddontang/go-log/log" - . "github.com/siddontang/go-mysql/mysql" -) - -// Unlick mysqldump, Dumper is designed for parsing and syning data easily. -type Dumper struct { - // mysqldump execution path, like mysqldump or /usr/bin/mysqldump, etc... - ExecutionPath string - - Addr string - User string - Password string - - // Will override Databases - Tables []string - TableDB string - - Databases []string - - Where string - Charset string - - IgnoreTables map[string][]string - - ErrOut io.Writer - - masterDataSkipped bool - maxAllowedPacket int - hexBlob bool -} - -func NewDumper(executionPath string, addr string, user string, password string) (*Dumper, error) { - if len(executionPath) == 0 { - return nil, nil - } - - path, err := exec.LookPath(executionPath) - if err != nil { - return nil, errors.Trace(err) - } - - d := new(Dumper) - d.ExecutionPath = path - d.Addr = addr - d.User = user - d.Password = password - d.Tables = make([]string, 0, 16) - d.Databases = make([]string, 0, 16) - d.Charset = DEFAULT_CHARSET - d.IgnoreTables = make(map[string][]string) - d.masterDataSkipped = false - - d.ErrOut = os.Stderr - - return d, nil -} - -func (d *Dumper) SetCharset(charset string) { - d.Charset = charset -} - -func (d *Dumper) SetWhere(where string) { - d.Where = where -} - -func (d *Dumper) SetErrOut(o io.Writer) { - d.ErrOut = o -} - -// In some cloud MySQL, we have no privilege to use `--master-data`. -func (d *Dumper) SkipMasterData(v bool) { - d.masterDataSkipped = v -} - -func (d *Dumper) SetMaxAllowedPacket(i int) { - d.maxAllowedPacket = i -} - -func (d *Dumper) SetHexBlob(v bool) { - d.hexBlob = v -} - -func (d *Dumper) AddDatabases(dbs ...string) { - d.Databases = append(d.Databases, dbs...) -} - -func (d *Dumper) AddTables(db string, tables ...string) { - if d.TableDB != db { - d.TableDB = db - d.Tables = d.Tables[0:0] - } - - d.Tables = append(d.Tables, tables...) -} - -func (d *Dumper) AddIgnoreTables(db string, tables ...string) { - t, _ := d.IgnoreTables[db] - t = append(t, tables...) - d.IgnoreTables[db] = t -} - -func (d *Dumper) Reset() { - d.Tables = d.Tables[0:0] - d.TableDB = "" - d.IgnoreTables = make(map[string][]string) - d.Databases = d.Databases[0:0] - d.Where = "" -} - -func (d *Dumper) Dump(w io.Writer) error { - args := make([]string, 0, 16) - - // Common args - seps := strings.Split(d.Addr, ":") - args = append(args, fmt.Sprintf("--host=%s", seps[0])) - if len(seps) > 1 { - args = append(args, fmt.Sprintf("--port=%s", seps[1])) - } - - args = append(args, fmt.Sprintf("--user=%s", d.User)) - args = append(args, fmt.Sprintf("--password=%s", d.Password)) - - if !d.masterDataSkipped { - args = append(args, "--master-data") - } - - if d.maxAllowedPacket > 0 { - // mysqldump param should be --max-allowed-packet=%dM not be --max_allowed_packet=%dM - args = append(args, fmt.Sprintf("--max-allowed-packet=%dM", d.maxAllowedPacket)) - } - - args = append(args, "--single-transaction") - args = append(args, "--skip-lock-tables") - - // Disable uncessary data - args = append(args, "--compact") - args = append(args, "--skip-opt") - args = append(args, "--quick") - - // We only care about data - args = append(args, "--no-create-info") - - // Multi row is easy for us to parse the data - args = append(args, "--skip-extended-insert") - - if d.hexBlob { - // Use hex for the binary type - args = append(args, "--hex-blob") - } - - for db, tables := range d.IgnoreTables { - for _, table := range tables { - args = append(args, fmt.Sprintf("--ignore-table=%s.%s", db, table)) - } - } - - if len(d.Charset) != 0 { - args = append(args, fmt.Sprintf("--default-character-set=%s", d.Charset)) - } - - if len(d.Where) != 0 { - args = append(args, fmt.Sprintf("--where=%s", d.Where)) - } - - if len(d.Tables) == 0 && len(d.Databases) == 0 { - args = append(args, "--all-databases") - } else if len(d.Tables) == 0 { - args = append(args, "--databases") - args = append(args, d.Databases...) - } else { - args = append(args, d.TableDB) - args = append(args, d.Tables...) - - // If we only dump some tables, the dump data will not have database name - // which makes us hard to parse, so here we add it manually. - - w.Write([]byte(fmt.Sprintf("USE `%s`;\n", d.TableDB))) - } - - log.Infof("exec mysqldump with %v", args) - cmd := exec.Command(d.ExecutionPath, args...) - - cmd.Stderr = d.ErrOut - cmd.Stdout = w - - return cmd.Run() -} - -// Dump MySQL and parse immediately -func (d *Dumper) DumpAndParse(h ParseHandler) error { - r, w := io.Pipe() - - done := make(chan error, 1) - go func() { - err := Parse(r, h, !d.masterDataSkipped) - r.CloseWithError(err) - done <- err - }() - - err := d.Dump(w) - w.CloseWithError(err) - - err = <-done - - return errors.Trace(err) -} diff --git a/vendor/github.com/siddontang/go-mysql/dump/parser.go b/vendor/github.com/siddontang/go-mysql/dump/parser.go deleted file mode 100644 index ad409255..00000000 --- a/vendor/github.com/siddontang/go-mysql/dump/parser.go +++ /dev/null @@ -1,192 +0,0 @@ -package dump - -import ( - "bufio" - "fmt" - "io" - "regexp" - "strconv" - "strings" - - "github.com/juju/errors" - "github.com/siddontang/go-mysql/mysql" -) - -var ( - ErrSkip = errors.New("Handler error, but skipped") -) - -type ParseHandler interface { - // Parse CHANGE MASTER TO MASTER_LOG_FILE=name, MASTER_LOG_POS=pos; - BinLog(name string, pos uint64) error - - Data(schema string, table string, values []string) error -} - -var binlogExp *regexp.Regexp -var useExp *regexp.Regexp -var valuesExp *regexp.Regexp - -func init() { - binlogExp = regexp.MustCompile("^CHANGE MASTER TO MASTER_LOG_FILE='(.+)', MASTER_LOG_POS=(\\d+);") - useExp = regexp.MustCompile("^USE `(.+)`;") - valuesExp = regexp.MustCompile("^INSERT INTO `(.+?)` VALUES \\((.+)\\);$") -} - -// Parse the dump data with Dumper generate. -// It can not parse all the data formats with mysqldump outputs -func Parse(r io.Reader, h ParseHandler, parseBinlogPos bool) error { - rb := bufio.NewReaderSize(r, 1024*16) - - var db string - var binlogParsed bool - - for { - line, err := rb.ReadString('\n') - if err != nil && err != io.EOF { - return errors.Trace(err) - } else if mysql.ErrorEqual(err, io.EOF) { - break - } - - // Ignore '\n' on Linux or '\r\n' on Windows - line = strings.TrimRightFunc(line, func(c rune) bool { - return c == '\r' || c == '\n' - }) - - if parseBinlogPos && !binlogParsed { - if m := binlogExp.FindAllStringSubmatch(line, -1); len(m) == 1 { - name := m[0][1] - pos, err := strconv.ParseUint(m[0][2], 10, 64) - if err != nil { - return errors.Errorf("parse binlog %v err, invalid number", line) - } - - if err = h.BinLog(name, pos); err != nil && err != ErrSkip { - return errors.Trace(err) - } - - binlogParsed = true - } - } - - if m := useExp.FindAllStringSubmatch(line, -1); len(m) == 1 { - db = m[0][1] - } - - if m := valuesExp.FindAllStringSubmatch(line, -1); len(m) == 1 { - table := m[0][1] - - values, err := parseValues(m[0][2]) - if err != nil { - return errors.Errorf("parse values %v err", line) - } - - if err = h.Data(db, table, values); err != nil && err != ErrSkip { - return errors.Trace(err) - } - } - } - - return nil -} - -func parseValues(str string) ([]string, error) { - // values are seperated by comma, but we can not split using comma directly - // string is enclosed by single quote - - // a simple implementation, may be more robust later. - - values := make([]string, 0, 8) - - i := 0 - for i < len(str) { - if str[i] != '\'' { - // no string, read until comma - j := i + 1 - for ; j < len(str) && str[j] != ','; j++ { - } - values = append(values, str[i:j]) - // skip , - i = j + 1 - } else { - // read string until another single quote - j := i + 1 - - escaped := false - for j < len(str) { - if str[j] == '\\' { - // skip escaped character - j += 2 - escaped = true - continue - } else if str[j] == '\'' { - break - } else { - j++ - } - } - - if j >= len(str) { - return nil, fmt.Errorf("parse quote values error") - } - - value := str[i : j+1] - if escaped { - value = unescapeString(value) - } - values = append(values, value) - // skip ' and , - i = j + 2 - } - - // need skip blank??? - } - - return values, nil -} - -// unescapeString un-escapes the string. -// mysqldump will escape the string when dumps, -// Refer http://dev.mysql.com/doc/refman/5.7/en/string-literals.html -func unescapeString(s string) string { - i := 0 - - value := make([]byte, 0, len(s)) - for i < len(s) { - if s[i] == '\\' { - j := i + 1 - if j == len(s) { - // The last char is \, remove - break - } - - value = append(value, unescapeChar(s[j])) - i += 2 - } else { - value = append(value, s[i]) - i++ - } - } - - return string(value) -} - -func unescapeChar(ch byte) byte { - // \" \' \\ \n \0 \b \Z \r \t ==> escape to one char - switch ch { - case 'n': - ch = '\n' - case '0': - ch = 0 - case 'b': - ch = 8 - case 'Z': - ch = 26 - case 'r': - ch = '\r' - case 't': - ch = '\t' - } - return ch -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/const.go b/vendor/github.com/siddontang/go-mysql/mysql/const.go deleted file mode 100644 index a4862ea7..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/const.go +++ /dev/null @@ -1,164 +0,0 @@ -package mysql - -const ( - MinProtocolVersion byte = 10 - MaxPayloadLen int = 1<<24 - 1 - TimeFormat string = "2006-01-02 15:04:05" -) - -var ( - // maybe you can change for your specified name - ServerVersion string = "5.7.0" -) - -const ( - OK_HEADER byte = 0x00 - ERR_HEADER byte = 0xff - EOF_HEADER byte = 0xfe - LocalInFile_HEADER byte = 0xfb -) - -const ( - SERVER_STATUS_IN_TRANS uint16 = 0x0001 - SERVER_STATUS_AUTOCOMMIT uint16 = 0x0002 - SERVER_MORE_RESULTS_EXISTS uint16 = 0x0008 - SERVER_STATUS_NO_GOOD_INDEX_USED uint16 = 0x0010 - SERVER_STATUS_NO_INDEX_USED uint16 = 0x0020 - SERVER_STATUS_CURSOR_EXISTS uint16 = 0x0040 - SERVER_STATUS_LAST_ROW_SEND uint16 = 0x0080 - SERVER_STATUS_DB_DROPPED uint16 = 0x0100 - SERVER_STATUS_NO_BACKSLASH_ESCAPED uint16 = 0x0200 - SERVER_STATUS_METADATA_CHANGED uint16 = 0x0400 - SERVER_QUERY_WAS_SLOW uint16 = 0x0800 - SERVER_PS_OUT_PARAMS uint16 = 0x1000 -) - -const ( - COM_SLEEP byte = iota - COM_QUIT - COM_INIT_DB - COM_QUERY - COM_FIELD_LIST - COM_CREATE_DB - COM_DROP_DB - COM_REFRESH - COM_SHUTDOWN - COM_STATISTICS - COM_PROCESS_INFO - COM_CONNECT - COM_PROCESS_KILL - COM_DEBUG - COM_PING - COM_TIME - COM_DELAYED_INSERT - COM_CHANGE_USER - COM_BINLOG_DUMP - COM_TABLE_DUMP - COM_CONNECT_OUT - COM_REGISTER_SLAVE - COM_STMT_PREPARE - COM_STMT_EXECUTE - COM_STMT_SEND_LONG_DATA - COM_STMT_CLOSE - COM_STMT_RESET - COM_SET_OPTION - COM_STMT_FETCH - COM_DAEMON - COM_BINLOG_DUMP_GTID - COM_RESET_CONNECTION -) - -const ( - CLIENT_LONG_PASSWORD uint32 = 1 << iota - CLIENT_FOUND_ROWS - CLIENT_LONG_FLAG - CLIENT_CONNECT_WITH_DB - CLIENT_NO_SCHEMA - CLIENT_COMPRESS - CLIENT_ODBC - CLIENT_LOCAL_FILES - CLIENT_IGNORE_SPACE - CLIENT_PROTOCOL_41 - CLIENT_INTERACTIVE - CLIENT_SSL - CLIENT_IGNORE_SIGPIPE - CLIENT_TRANSACTIONS - CLIENT_RESERVED - CLIENT_SECURE_CONNECTION - CLIENT_MULTI_STATEMENTS - CLIENT_MULTI_RESULTS - CLIENT_PS_MULTI_RESULTS - CLIENT_PLUGIN_AUTH - CLIENT_CONNECT_ATTRS - CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA -) - -const ( - MYSQL_TYPE_DECIMAL byte = iota - MYSQL_TYPE_TINY - MYSQL_TYPE_SHORT - MYSQL_TYPE_LONG - MYSQL_TYPE_FLOAT - MYSQL_TYPE_DOUBLE - MYSQL_TYPE_NULL - MYSQL_TYPE_TIMESTAMP - MYSQL_TYPE_LONGLONG - MYSQL_TYPE_INT24 - MYSQL_TYPE_DATE - MYSQL_TYPE_TIME - MYSQL_TYPE_DATETIME - MYSQL_TYPE_YEAR - MYSQL_TYPE_NEWDATE - MYSQL_TYPE_VARCHAR - MYSQL_TYPE_BIT - - //mysql 5.6 - MYSQL_TYPE_TIMESTAMP2 - MYSQL_TYPE_DATETIME2 - MYSQL_TYPE_TIME2 -) - -const ( - MYSQL_TYPE_JSON byte = iota + 0xf5 - MYSQL_TYPE_NEWDECIMAL - MYSQL_TYPE_ENUM - MYSQL_TYPE_SET - MYSQL_TYPE_TINY_BLOB - MYSQL_TYPE_MEDIUM_BLOB - MYSQL_TYPE_LONG_BLOB - MYSQL_TYPE_BLOB - MYSQL_TYPE_VAR_STRING - MYSQL_TYPE_STRING - MYSQL_TYPE_GEOMETRY -) - -const ( - NOT_NULL_FLAG = 1 - PRI_KEY_FLAG = 2 - UNIQUE_KEY_FLAG = 4 - BLOB_FLAG = 16 - UNSIGNED_FLAG = 32 - ZEROFILL_FLAG = 64 - BINARY_FLAG = 128 - ENUM_FLAG = 256 - AUTO_INCREMENT_FLAG = 512 - TIMESTAMP_FLAG = 1024 - SET_FLAG = 2048 - NUM_FLAG = 32768 - PART_KEY_FLAG = 16384 - GROUP_FLAG = 32768 - UNIQUE_FLAG = 65536 -) - -const ( - AUTH_NAME = "mysql_native_password" - DEFAULT_CHARSET = "utf8" - DEFAULT_COLLATION_ID uint8 = 33 - DEFAULT_COLLATION_NAME string = "utf8_general_ci" -) - -// Like vitess, use flavor for different MySQL versions, -const ( - MySQLFlavor = "mysql" - MariaDBFlavor = "mariadb" -) diff --git a/vendor/github.com/siddontang/go-mysql/mysql/errcode.go b/vendor/github.com/siddontang/go-mysql/mysql/errcode.go deleted file mode 100644 index 8acff1ae..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/errcode.go +++ /dev/null @@ -1,870 +0,0 @@ -package mysql - -const ( - ER_ERROR_FIRST uint16 = 1000 - ER_HASHCHK = 1000 - ER_NISAMCHK = 1001 - ER_NO = 1002 - ER_YES = 1003 - ER_CANT_CREATE_FILE = 1004 - ER_CANT_CREATE_TABLE = 1005 - ER_CANT_CREATE_DB = 1006 - ER_DB_CREATE_EXISTS = 1007 - ER_DB_DROP_EXISTS = 1008 - ER_DB_DROP_DELETE = 1009 - ER_DB_DROP_RMDIR = 1010 - ER_CANT_DELETE_FILE = 1011 - ER_CANT_FIND_SYSTEM_REC = 1012 - ER_CANT_GET_STAT = 1013 - ER_CANT_GET_WD = 1014 - ER_CANT_LOCK = 1015 - ER_CANT_OPEN_FILE = 1016 - ER_FILE_NOT_FOUND = 1017 - ER_CANT_READ_DIR = 1018 - ER_CANT_SET_WD = 1019 - ER_CHECKREAD = 1020 - ER_DISK_FULL = 1021 - ER_DUP_KEY = 1022 - ER_ERROR_ON_CLOSE = 1023 - ER_ERROR_ON_READ = 1024 - ER_ERROR_ON_RENAME = 1025 - ER_ERROR_ON_WRITE = 1026 - ER_FILE_USED = 1027 - ER_FILSORT_ABORT = 1028 - ER_FORM_NOT_FOUND = 1029 - ER_GET_ERRNO = 1030 - ER_ILLEGAL_HA = 1031 - ER_KEY_NOT_FOUND = 1032 - ER_NOT_FORM_FILE = 1033 - ER_NOT_KEYFILE = 1034 - ER_OLD_KEYFILE = 1035 - ER_OPEN_AS_READONLY = 1036 - ER_OUTOFMEMORY = 1037 - ER_OUT_OF_SORTMEMORY = 1038 - ER_UNEXPECTED_EOF = 1039 - ER_CON_COUNT_ERROR = 1040 - ER_OUT_OF_RESOURCES = 1041 - ER_BAD_HOST_ERROR = 1042 - ER_HANDSHAKE_ERROR = 1043 - ER_DBACCESS_DENIED_ERROR = 1044 - ER_ACCESS_DENIED_ERROR = 1045 - ER_NO_DB_ERROR = 1046 - ER_UNKNOWN_COM_ERROR = 1047 - ER_BAD_NULL_ERROR = 1048 - ER_BAD_DB_ERROR = 1049 - ER_TABLE_EXISTS_ERROR = 1050 - ER_BAD_TABLE_ERROR = 1051 - ER_NON_UNIQ_ERROR = 1052 - ER_SERVER_SHUTDOWN = 1053 - ER_BAD_FIELD_ERROR = 1054 - ER_WRONG_FIELD_WITH_GROUP = 1055 - ER_WRONG_GROUP_FIELD = 1056 - ER_WRONG_SUM_SELECT = 1057 - ER_WRONG_VALUE_COUNT = 1058 - ER_TOO_LONG_IDENT = 1059 - ER_DUP_FIELDNAME = 1060 - ER_DUP_KEYNAME = 1061 - ER_DUP_ENTRY = 1062 - ER_WRONG_FIELD_SPEC = 1063 - ER_PARSE_ERROR = 1064 - ER_EMPTY_QUERY = 1065 - ER_NONUNIQ_TABLE = 1066 - ER_INVALID_DEFAULT = 1067 - ER_MULTIPLE_PRI_KEY = 1068 - ER_TOO_MANY_KEYS = 1069 - ER_TOO_MANY_KEY_PARTS = 1070 - ER_TOO_LONG_KEY = 1071 - ER_KEY_COLUMN_DOES_NOT_EXITS = 1072 - ER_BLOB_USED_AS_KEY = 1073 - ER_TOO_BIG_FIELDLENGTH = 1074 - ER_WRONG_AUTO_KEY = 1075 - ER_READY = 1076 - ER_NORMAL_SHUTDOWN = 1077 - ER_GOT_SIGNAL = 1078 - ER_SHUTDOWN_COMPLETE = 1079 - ER_FORCING_CLOSE = 1080 - ER_IPSOCK_ERROR = 1081 - ER_NO_SUCH_INDEX = 1082 - ER_WRONG_FIELD_TERMINATORS = 1083 - ER_BLOBS_AND_NO_TERMINATED = 1084 - ER_TEXTFILE_NOT_READABLE = 1085 - ER_FILE_EXISTS_ERROR = 1086 - ER_LOAD_INFO = 1087 - ER_ALTER_INFO = 1088 - ER_WRONG_SUB_KEY = 1089 - ER_CANT_REMOVE_ALL_FIELDS = 1090 - ER_CANT_DROP_FIELD_OR_KEY = 1091 - ER_INSERT_INFO = 1092 - ER_UPDATE_TABLE_USED = 1093 - ER_NO_SUCH_THREAD = 1094 - ER_KILL_DENIED_ERROR = 1095 - ER_NO_TABLES_USED = 1096 - ER_TOO_BIG_SET = 1097 - ER_NO_UNIQUE_LOGFILE = 1098 - ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099 - ER_TABLE_NOT_LOCKED = 1100 - ER_BLOB_CANT_HAVE_DEFAULT = 1101 - ER_WRONG_DB_NAME = 1102 - ER_WRONG_TABLE_NAME = 1103 - ER_TOO_BIG_SELECT = 1104 - ER_UNKNOWN_ERROR = 1105 - ER_UNKNOWN_PROCEDURE = 1106 - ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107 - ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108 - ER_UNKNOWN_TABLE = 1109 - ER_FIELD_SPECIFIED_TWICE = 1110 - ER_INVALID_GROUP_FUNC_USE = 1111 - ER_UNSUPPORTED_EXTENSION = 1112 - ER_TABLE_MUST_HAVE_COLUMNS = 1113 - ER_RECORD_FILE_FULL = 1114 - ER_UNKNOWN_CHARACTER_SET = 1115 - ER_TOO_MANY_TABLES = 1116 - ER_TOO_MANY_FIELDS = 1117 - ER_TOO_BIG_ROWSIZE = 1118 - ER_STACK_OVERRUN = 1119 - ER_WRONG_OUTER_JOIN = 1120 - ER_NULL_COLUMN_IN_INDEX = 1121 - ER_CANT_FIND_UDF = 1122 - ER_CANT_INITIALIZE_UDF = 1123 - ER_UDF_NO_PATHS = 1124 - ER_UDF_EXISTS = 1125 - ER_CANT_OPEN_LIBRARY = 1126 - ER_CANT_FIND_DL_ENTRY = 1127 - ER_FUNCTION_NOT_DEFINED = 1128 - ER_HOST_IS_BLOCKED = 1129 - ER_HOST_NOT_PRIVILEGED = 1130 - ER_PASSWORD_ANONYMOUS_USER = 1131 - ER_PASSWORD_NOT_ALLOWED = 1132 - ER_PASSWORD_NO_MATCH = 1133 - ER_UPDATE_INFO = 1134 - ER_CANT_CREATE_THREAD = 1135 - ER_WRONG_VALUE_COUNT_ON_ROW = 1136 - ER_CANT_REOPEN_TABLE = 1137 - ER_INVALID_USE_OF_NULL = 1138 - ER_REGEXP_ERROR = 1139 - ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140 - ER_NONEXISTING_GRANT = 1141 - ER_TABLEACCESS_DENIED_ERROR = 1142 - ER_COLUMNACCESS_DENIED_ERROR = 1143 - ER_ILLEGAL_GRANT_FOR_TABLE = 1144 - ER_GRANT_WRONG_HOST_OR_USER = 1145 - ER_NO_SUCH_TABLE = 1146 - ER_NONEXISTING_TABLE_GRANT = 1147 - ER_NOT_ALLOWED_COMMAND = 1148 - ER_SYNTAX_ERROR = 1149 - ER_DELAYED_CANT_CHANGE_LOCK = 1150 - ER_TOO_MANY_DELAYED_THREADS = 1151 - ER_ABORTING_CONNECTION = 1152 - ER_NET_PACKET_TOO_LARGE = 1153 - ER_NET_READ_ERROR_FROM_PIPE = 1154 - ER_NET_FCNTL_ERROR = 1155 - ER_NET_PACKETS_OUT_OF_ORDER = 1156 - ER_NET_UNCOMPRESS_ERROR = 1157 - ER_NET_READ_ERROR = 1158 - ER_NET_READ_INTERRUPTED = 1159 - ER_NET_ERROR_ON_WRITE = 1160 - ER_NET_WRITE_INTERRUPTED = 1161 - ER_TOO_LONG_STRING = 1162 - ER_TABLE_CANT_HANDLE_BLOB = 1163 - ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 - ER_DELAYED_INSERT_TABLE_LOCKED = 1165 - ER_WRONG_COLUMN_NAME = 1166 - ER_WRONG_KEY_COLUMN = 1167 - ER_WRONG_MRG_TABLE = 1168 - ER_DUP_UNIQUE = 1169 - ER_BLOB_KEY_WITHOUT_LENGTH = 1170 - ER_PRIMARY_CANT_HAVE_NULL = 1171 - ER_TOO_MANY_ROWS = 1172 - ER_REQUIRES_PRIMARY_KEY = 1173 - ER_NO_RAID_COMPILED = 1174 - ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 - ER_KEY_DOES_NOT_EXITS = 1176 - ER_CHECK_NO_SUCH_TABLE = 1177 - ER_CHECK_NOT_IMPLEMENTED = 1178 - ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179 - ER_ERROR_DURING_COMMIT = 1180 - ER_ERROR_DURING_ROLLBACK = 1181 - ER_ERROR_DURING_FLUSH_LOGS = 1182 - ER_ERROR_DURING_CHECKPOINT = 1183 - ER_NEW_ABORTING_CONNECTION = 1184 - ER_DUMP_NOT_IMPLEMENTED = 1185 - ER_FLUSH_MASTER_BINLOG_CLOSED = 1186 - ER_INDEX_REBUILD = 1187 - ER_MASTER = 1188 - ER_MASTER_NET_READ = 1189 - ER_MASTER_NET_WRITE = 1190 - ER_FT_MATCHING_KEY_NOT_FOUND = 1191 - ER_LOCK_OR_ACTIVE_TRANSACTION = 1192 - ER_UNKNOWN_SYSTEM_VARIABLE = 1193 - ER_CRASHED_ON_USAGE = 1194 - ER_CRASHED_ON_REPAIR = 1195 - ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196 - ER_TRANS_CACHE_FULL = 1197 - ER_SLAVE_MUST_STOP = 1198 - ER_SLAVE_NOT_RUNNING = 1199 - ER_BAD_SLAVE = 1200 - ER_MASTER_INFO = 1201 - ER_SLAVE_THREAD = 1202 - ER_TOO_MANY_USER_CONNECTIONS = 1203 - ER_SET_CONSTANTS_ONLY = 1204 - ER_LOCK_WAIT_TIMEOUT = 1205 - ER_LOCK_TABLE_FULL = 1206 - ER_READ_ONLY_TRANSACTION = 1207 - ER_DROP_DB_WITH_READ_LOCK = 1208 - ER_CREATE_DB_WITH_READ_LOCK = 1209 - ER_WRONG_ARGUMENTS = 1210 - ER_NO_PERMISSION_TO_CREATE_USER = 1211 - ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212 - ER_LOCK_DEADLOCK = 1213 - ER_TABLE_CANT_HANDLE_FT = 1214 - ER_CANNOT_ADD_FOREIGN = 1215 - ER_NO_REFERENCED_ROW = 1216 - ER_ROW_IS_REFERENCED = 1217 - ER_CONNECT_TO_MASTER = 1218 - ER_QUERY_ON_MASTER = 1219 - ER_ERROR_WHEN_EXECUTING_COMMAND = 1220 - ER_WRONG_USAGE = 1221 - ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 - ER_CANT_UPDATE_WITH_READLOCK = 1223 - ER_MIXING_NOT_ALLOWED = 1224 - ER_DUP_ARGUMENT = 1225 - ER_USER_LIMIT_REACHED = 1226 - ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227 - ER_LOCAL_VARIABLE = 1228 - ER_GLOBAL_VARIABLE = 1229 - ER_NO_DEFAULT = 1230 - ER_WRONG_VALUE_FOR_VAR = 1231 - ER_WRONG_TYPE_FOR_VAR = 1232 - ER_VAR_CANT_BE_READ = 1233 - ER_CANT_USE_OPTION_HERE = 1234 - ER_NOT_SUPPORTED_YET = 1235 - ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236 - ER_SLAVE_IGNORED_TABLE = 1237 - ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238 - ER_WRONG_FK_DEF = 1239 - ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240 - ER_OPERAND_COLUMNS = 1241 - ER_SUBQUERY_NO_1_ROW = 1242 - ER_UNKNOWN_STMT_HANDLER = 1243 - ER_CORRUPT_HELP_DB = 1244 - ER_CYCLIC_REFERENCE = 1245 - ER_AUTO_CONVERT = 1246 - ER_ILLEGAL_REFERENCE = 1247 - ER_DERIVED_MUST_HAVE_ALIAS = 1248 - ER_SELECT_REDUCED = 1249 - ER_TABLENAME_NOT_ALLOWED_HERE = 1250 - ER_NOT_SUPPORTED_AUTH_MODE = 1251 - ER_SPATIAL_CANT_HAVE_NULL = 1252 - ER_COLLATION_CHARSET_MISMATCH = 1253 - ER_SLAVE_WAS_RUNNING = 1254 - ER_SLAVE_WAS_NOT_RUNNING = 1255 - ER_TOO_BIG_FOR_UNCOMPRESS = 1256 - ER_ZLIB_Z_MEM_ERROR = 1257 - ER_ZLIB_Z_BUF_ERROR = 1258 - ER_ZLIB_Z_DATA_ERROR = 1259 - ER_CUT_VALUE_GROUP_CONCAT = 1260 - ER_WARN_TOO_FEW_RECORDS = 1261 - ER_WARN_TOO_MANY_RECORDS = 1262 - ER_WARN_NULL_TO_NOTNULL = 1263 - ER_WARN_DATA_OUT_OF_RANGE = 1264 - WARN_DATA_TRUNCATED = 1265 - ER_WARN_USING_OTHER_HANDLER = 1266 - ER_CANT_AGGREGATE_2COLLATIONS = 1267 - ER_DROP_USER = 1268 - ER_REVOKE_GRANTS = 1269 - ER_CANT_AGGREGATE_3COLLATIONS = 1270 - ER_CANT_AGGREGATE_NCOLLATIONS = 1271 - ER_VARIABLE_IS_NOT_STRUCT = 1272 - ER_UNKNOWN_COLLATION = 1273 - ER_SLAVE_IGNORED_SSL_PARAMS = 1274 - ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275 - ER_WARN_FIELD_RESOLVED = 1276 - ER_BAD_SLAVE_UNTIL_COND = 1277 - ER_MISSING_SKIP_SLAVE = 1278 - ER_UNTIL_COND_IGNORED = 1279 - ER_WRONG_NAME_FOR_INDEX = 1280 - ER_WRONG_NAME_FOR_CATALOG = 1281 - ER_WARN_QC_RESIZE = 1282 - ER_BAD_FT_COLUMN = 1283 - ER_UNKNOWN_KEY_CACHE = 1284 - ER_WARN_HOSTNAME_WONT_WORK = 1285 - ER_UNKNOWN_STORAGE_ENGINE = 1286 - ER_WARN_DEPRECATED_SYNTAX = 1287 - ER_NON_UPDATABLE_TABLE = 1288 - ER_FEATURE_DISABLED = 1289 - ER_OPTION_PREVENTS_STATEMENT = 1290 - ER_DUPLICATED_VALUE_IN_TYPE = 1291 - ER_TRUNCATED_WRONG_VALUE = 1292 - ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293 - ER_INVALID_ON_UPDATE = 1294 - ER_UNSUPPORTED_PS = 1295 - ER_GET_ERRMSG = 1296 - ER_GET_TEMPORARY_ERRMSG = 1297 - ER_UNKNOWN_TIME_ZONE = 1298 - ER_WARN_INVALID_TIMESTAMP = 1299 - ER_INVALID_CHARACTER_STRING = 1300 - ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301 - ER_CONFLICTING_DECLARATIONS = 1302 - ER_SP_NO_RECURSIVE_CREATE = 1303 - ER_SP_ALREADY_EXISTS = 1304 - ER_SP_DOES_NOT_EXIST = 1305 - ER_SP_DROP_FAILED = 1306 - ER_SP_STORE_FAILED = 1307 - ER_SP_LILABEL_MISMATCH = 1308 - ER_SP_LABEL_REDEFINE = 1309 - ER_SP_LABEL_MISMATCH = 1310 - ER_SP_UNINIT_VAR = 1311 - ER_SP_BADSELECT = 1312 - ER_SP_BADRETURN = 1313 - ER_SP_BADSTATEMENT = 1314 - ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315 - ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316 - ER_QUERY_INTERRUPTED = 1317 - ER_SP_WRONG_NO_OF_ARGS = 1318 - ER_SP_COND_MISMATCH = 1319 - ER_SP_NORETURN = 1320 - ER_SP_NORETURNEND = 1321 - ER_SP_BAD_CURSOR_QUERY = 1322 - ER_SP_BAD_CURSOR_SELECT = 1323 - ER_SP_CURSOR_MISMATCH = 1324 - ER_SP_CURSOR_ALREADY_OPEN = 1325 - ER_SP_CURSOR_NOT_OPEN = 1326 - ER_SP_UNDECLARED_VAR = 1327 - ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328 - ER_SP_FETCH_NO_DATA = 1329 - ER_SP_DUP_PARAM = 1330 - ER_SP_DUP_VAR = 1331 - ER_SP_DUP_COND = 1332 - ER_SP_DUP_CURS = 1333 - ER_SP_CANT_ALTER = 1334 - ER_SP_SUBSELECT_NYI = 1335 - ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336 - ER_SP_VARCOND_AFTER_CURSHNDLR = 1337 - ER_SP_CURSOR_AFTER_HANDLER = 1338 - ER_SP_CASE_NOT_FOUND = 1339 - ER_FPARSER_TOO_BIG_FILE = 1340 - ER_FPARSER_BAD_HEADER = 1341 - ER_FPARSER_EOF_IN_COMMENT = 1342 - ER_FPARSER_ERROR_IN_PARAMETER = 1343 - ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 - ER_VIEW_NO_EXPLAIN = 1345 - ER_FRM_UNKNOWN_TYPE = 1346 - ER_WRONG_OBJECT = 1347 - ER_NONUPDATEABLE_COLUMN = 1348 - ER_VIEW_SELECT_DERIVED = 1349 - ER_VIEW_SELECT_CLAUSE = 1350 - ER_VIEW_SELECT_VARIABLE = 1351 - ER_VIEW_SELECT_TMPTABLE = 1352 - ER_VIEW_WRONG_LIST = 1353 - ER_WARN_VIEW_MERGE = 1354 - ER_WARN_VIEW_WITHOUT_KEY = 1355 - ER_VIEW_INVALID = 1356 - ER_SP_NO_DROP_SP = 1357 - ER_SP_GOTO_IN_HNDLR = 1358 - ER_TRG_ALREADY_EXISTS = 1359 - ER_TRG_DOES_NOT_EXIST = 1360 - ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361 - ER_TRG_CANT_CHANGE_ROW = 1362 - ER_TRG_NO_SUCH_ROW_IN_TRG = 1363 - ER_NO_DEFAULT_FOR_FIELD = 1364 - ER_DIVISION_BY_ZERO = 1365 - ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366 - ER_ILLEGAL_VALUE_FOR_TYPE = 1367 - ER_VIEW_NONUPD_CHECK = 1368 - ER_VIEW_CHECK_FAILED = 1369 - ER_PROCACCESS_DENIED_ERROR = 1370 - ER_RELAY_LOG_FAIL = 1371 - ER_PASSWD_LENGTH = 1372 - ER_UNKNOWN_TARGET_BINLOG = 1373 - ER_IO_ERR_LOG_INDEX_READ = 1374 - ER_BINLOG_PURGE_PROHIBITED = 1375 - ER_FSEEK_FAIL = 1376 - ER_BINLOG_PURGE_FATAL_ERR = 1377 - ER_LOG_IN_USE = 1378 - ER_LOG_PURGE_UNKNOWN_ERR = 1379 - ER_RELAY_LOG_INIT = 1380 - ER_NO_BINARY_LOGGING = 1381 - ER_RESERVED_SYNTAX = 1382 - ER_WSAS_FAILED = 1383 - ER_DIFF_GROUPS_PROC = 1384 - ER_NO_GROUP_FOR_PROC = 1385 - ER_ORDER_WITH_PROC = 1386 - ER_LOGGING_PROHIBIT_CHANGING_OF = 1387 - ER_NO_FILE_MAPPING = 1388 - ER_WRONG_MAGIC = 1389 - ER_PS_MANY_PARAM = 1390 - ER_KEY_PART_0 = 1391 - ER_VIEW_CHECKSUM = 1392 - ER_VIEW_MULTIUPDATE = 1393 - ER_VIEW_NO_INSERT_FIELD_LIST = 1394 - ER_VIEW_DELETE_MERGE_VIEW = 1395 - ER_CANNOT_USER = 1396 - ER_XAER_NOTA = 1397 - ER_XAER_INVAL = 1398 - ER_XAER_RMFAIL = 1399 - ER_XAER_OUTSIDE = 1400 - ER_XAER_RMERR = 1401 - ER_XA_RBROLLBACK = 1402 - ER_NONEXISTING_PROC_GRANT = 1403 - ER_PROC_AUTO_GRANT_FAIL = 1404 - ER_PROC_AUTO_REVOKE_FAIL = 1405 - ER_DATA_TOO_LONG = 1406 - ER_SP_BAD_SQLSTATE = 1407 - ER_STARTUP = 1408 - ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409 - ER_CANT_CREATE_USER_WITH_GRANT = 1410 - ER_WRONG_VALUE_FOR_TYPE = 1411 - ER_TABLE_DEF_CHANGED = 1412 - ER_SP_DUP_HANDLER = 1413 - ER_SP_NOT_VAR_ARG = 1414 - ER_SP_NO_RETSET = 1415 - ER_CANT_CREATE_GEOMETRY_OBJECT = 1416 - ER_FAILED_ROUTINE_BREAK_BINLOG = 1417 - ER_BINLOG_UNSAFE_ROUTINE = 1418 - ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 - ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420 - ER_STMT_HAS_NO_OPEN_CURSOR = 1421 - ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 - ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423 - ER_SP_NO_RECURSION = 1424 - ER_TOO_BIG_SCALE = 1425 - ER_TOO_BIG_PRECISION = 1426 - ER_M_BIGGER_THAN_D = 1427 - ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428 - ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429 - ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430 - ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 - ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 - ER_FOREIGN_DATA_STRING_INVALID = 1433 - ER_CANT_CREATE_FEDERATED_TABLE = 1434 - ER_TRG_IN_WRONG_SCHEMA = 1435 - ER_STACK_OVERRUN_NEED_MORE = 1436 - ER_TOO_LONG_BODY = 1437 - ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438 - ER_TOO_BIG_DISPLAYWIDTH = 1439 - ER_XAER_DUPID = 1440 - ER_DATETIME_FUNCTION_OVERFLOW = 1441 - ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442 - ER_VIEW_PREVENT_UPDATE = 1443 - ER_PS_NO_RECURSION = 1444 - ER_SP_CANT_SET_AUTOCOMMIT = 1445 - ER_MALFORMED_DEFINER = 1446 - ER_VIEW_FRM_NO_USER = 1447 - ER_VIEW_OTHER_USER = 1448 - ER_NO_SUCH_USER = 1449 - ER_FORBID_SCHEMA_CHANGE = 1450 - ER_ROW_IS_REFERENCED_2 = 1451 - ER_NO_REFERENCED_ROW_2 = 1452 - ER_SP_BAD_VAR_SHADOW = 1453 - ER_TRG_NO_DEFINER = 1454 - ER_OLD_FILE_FORMAT = 1455 - ER_SP_RECURSION_LIMIT = 1456 - ER_SP_PROC_TABLE_CORRUPT = 1457 - ER_SP_WRONG_NAME = 1458 - ER_TABLE_NEEDS_UPGRADE = 1459 - ER_SP_NO_AGGREGATE = 1460 - ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461 - ER_VIEW_RECURSIVE = 1462 - ER_NON_GROUPING_FIELD_USED = 1463 - ER_TABLE_CANT_HANDLE_SPKEYS = 1464 - ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465 - ER_REMOVED_SPACES = 1466 - ER_AUTOINC_READ_FAILED = 1467 - ER_USERNAME = 1468 - ER_HOSTNAME = 1469 - ER_WRONG_STRING_LENGTH = 1470 - ER_NON_INSERTABLE_TABLE = 1471 - ER_ADMIN_WRONG_MRG_TABLE = 1472 - ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473 - ER_NAME_BECOMES_EMPTY = 1474 - ER_AMBIGUOUS_FIELD_TERM = 1475 - ER_FOREIGN_SERVER_EXISTS = 1476 - ER_FOREIGN_SERVER_DOESNT_EXIST = 1477 - ER_ILLEGAL_HA_CREATE_OPTION = 1478 - ER_PARTITION_REQUIRES_VALUES_ERROR = 1479 - ER_PARTITION_WRONG_VALUES_ERROR = 1480 - ER_PARTITION_MAXVALUE_ERROR = 1481 - ER_PARTITION_SUBPARTITION_ERROR = 1482 - ER_PARTITION_SUBPART_MIX_ERROR = 1483 - ER_PARTITION_WRONG_NO_PART_ERROR = 1484 - ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485 - ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486 - ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487 - ER_FIELD_NOT_FOUND_PART_ERROR = 1488 - ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489 - ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490 - ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491 - ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492 - ER_RANGE_NOT_INCREASING_ERROR = 1493 - ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494 - ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495 - ER_PARTITION_ENTRY_ERROR = 1496 - ER_MIX_HANDLER_ERROR = 1497 - ER_PARTITION_NOT_DEFINED_ERROR = 1498 - ER_TOO_MANY_PARTITIONS_ERROR = 1499 - ER_SUBPARTITION_ERROR = 1500 - ER_CANT_CREATE_HANDLER_FILE = 1501 - ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502 - ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503 - ER_NO_PARTS_ERROR = 1504 - ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505 - ER_FOREIGN_KEY_ON_PARTITIONED = 1506 - ER_DROP_PARTITION_NON_EXISTENT = 1507 - ER_DROP_LAST_PARTITION = 1508 - ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509 - ER_REORG_HASH_ONLY_ON_SAME_NO = 1510 - ER_REORG_NO_PARAM_ERROR = 1511 - ER_ONLY_ON_RANGE_LIST_PARTITION = 1512 - ER_ADD_PARTITION_SUBPART_ERROR = 1513 - ER_ADD_PARTITION_NO_NEW_PARTITION = 1514 - ER_COALESCE_PARTITION_NO_PARTITION = 1515 - ER_REORG_PARTITION_NOT_EXIST = 1516 - ER_SAME_NAME_PARTITION = 1517 - ER_NO_BINLOG_ERROR = 1518 - ER_CONSECUTIVE_REORG_PARTITIONS = 1519 - ER_REORG_OUTSIDE_RANGE = 1520 - ER_PARTITION_FUNCTION_FAILURE = 1521 - ER_PART_STATE_ERROR = 1522 - ER_LIMITED_PART_RANGE = 1523 - ER_PLUGIN_IS_NOT_LOADED = 1524 - ER_WRONG_VALUE = 1525 - ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526 - ER_FILEGROUP_OPTION_ONLY_ONCE = 1527 - ER_CREATE_FILEGROUP_FAILED = 1528 - ER_DROP_FILEGROUP_FAILED = 1529 - ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530 - ER_WRONG_SIZE_NUMBER = 1531 - ER_SIZE_OVERFLOW_ERROR = 1532 - ER_ALTER_FILEGROUP_FAILED = 1533 - ER_BINLOG_ROW_LOGGING_FAILED = 1534 - ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535 - ER_BINLOG_ROW_RBR_TO_SBR = 1536 - ER_EVENT_ALREADY_EXISTS = 1537 - ER_EVENT_STORE_FAILED = 1538 - ER_EVENT_DOES_NOT_EXIST = 1539 - ER_EVENT_CANT_ALTER = 1540 - ER_EVENT_DROP_FAILED = 1541 - ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542 - ER_EVENT_ENDS_BEFORE_STARTS = 1543 - ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544 - ER_EVENT_OPEN_TABLE_FAILED = 1545 - ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546 - ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547 - ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE = 1548 - ER_EVENT_CANNOT_DELETE = 1549 - ER_EVENT_COMPILE_ERROR = 1550 - ER_EVENT_SAME_NAME = 1551 - ER_EVENT_DATA_TOO_LONG = 1552 - ER_DROP_INDEX_FK = 1553 - ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554 - ER_CANT_WRITE_LOCK_LOG_TABLE = 1555 - ER_CANT_LOCK_LOG_TABLE = 1556 - ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED = 1557 - ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558 - ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559 - ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560 - ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561 - ER_PARTITION_NO_TEMPORARY = 1562 - ER_PARTITION_CONST_DOMAIN_ERROR = 1563 - ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564 - ER_DDL_LOG_ERROR = 1565 - ER_NULL_IN_VALUES_LESS_THAN = 1566 - ER_WRONG_PARTITION_NAME = 1567 - ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568 - ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569 - ER_EVENT_MODIFY_QUEUE_ERROR = 1570 - ER_EVENT_SET_VAR_ERROR = 1571 - ER_PARTITION_MERGE_ERROR = 1572 - ER_CANT_ACTIVATE_LOG = 1573 - ER_RBR_NOT_AVAILABLE = 1574 - ER_BASE64_DECODE_ERROR = 1575 - ER_EVENT_RECURSION_FORBIDDEN = 1576 - ER_EVENTS_DB_ERROR = 1577 - ER_ONLY_INTEGERS_ALLOWED = 1578 - ER_UNSUPORTED_LOG_ENGINE = 1579 - ER_BAD_LOG_STATEMENT = 1580 - ER_CANT_RENAME_LOG_TABLE = 1581 - ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582 - ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583 - ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584 - ER_NATIVE_FCT_NAME_COLLISION = 1585 - ER_DUP_ENTRY_WITH_KEY_NAME = 1586 - ER_BINLOG_PURGE_EMFILE = 1587 - ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588 - ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589 - ER_SLAVE_INCIDENT = 1590 - ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591 - ER_BINLOG_UNSAFE_STATEMENT = 1592 - ER_SLAVE_FATAL_ERROR = 1593 - ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594 - ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595 - ER_SLAVE_CREATE_EVENT_FAILURE = 1596 - ER_SLAVE_MASTER_COM_FAILURE = 1597 - ER_BINLOG_LOGGING_IMPOSSIBLE = 1598 - ER_VIEW_NO_CREATION_CTX = 1599 - ER_VIEW_INVALID_CREATION_CTX = 1600 - ER_SR_INVALID_CREATION_CTX = 1601 - ER_TRG_CORRUPTED_FILE = 1602 - ER_TRG_NO_CREATION_CTX = 1603 - ER_TRG_INVALID_CREATION_CTX = 1604 - ER_EVENT_INVALID_CREATION_CTX = 1605 - ER_TRG_CANT_OPEN_TABLE = 1606 - ER_CANT_CREATE_SROUTINE = 1607 - ER_NEVER_USED = 1608 - ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609 - ER_SLAVE_CORRUPT_EVENT = 1610 - ER_LOAD_DATA_INVALID_COLUMN = 1611 - ER_LOG_PURGE_NO_FILE = 1612 - ER_XA_RBTIMEOUT = 1613 - ER_XA_RBDEADLOCK = 1614 - ER_NEED_REPREPARE = 1615 - ER_DELAYED_NOT_SUPPORTED = 1616 - WARN_NO_MASTER_INFO = 1617 - WARN_OPTION_IGNORED = 1618 - WARN_PLUGIN_DELETE_BUILTIN = 1619 - WARN_PLUGIN_BUSY = 1620 - ER_VARIABLE_IS_READONLY = 1621 - ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622 - ER_SLAVE_HEARTBEAT_FAILURE = 1623 - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624 - ER_NDB_REPLICATION_SCHEMA_ERROR = 1625 - ER_CONFLICT_FN_PARSE_ERROR = 1626 - ER_EXCEPTIONS_WRITE_ERROR = 1627 - ER_TOO_LONG_TABLE_COMMENT = 1628 - ER_TOO_LONG_FIELD_COMMENT = 1629 - ER_FUNC_INEXISTENT_NAME_COLLISION = 1630 - ER_DATABASE_NAME = 1631 - ER_TABLE_NAME = 1632 - ER_PARTITION_NAME = 1633 - ER_SUBPARTITION_NAME = 1634 - ER_TEMPORARY_NAME = 1635 - ER_RENAMED_NAME = 1636 - ER_TOO_MANY_CONCURRENT_TRXS = 1637 - WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638 - ER_DEBUG_SYNC_TIMEOUT = 1639 - ER_DEBUG_SYNC_HIT_LIMIT = 1640 - ER_DUP_SIGNAL_SET = 1641 - ER_SIGNAL_WARN = 1642 - ER_SIGNAL_NOT_FOUND = 1643 - ER_SIGNAL_EXCEPTION = 1644 - ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645 - ER_SIGNAL_BAD_CONDITION_TYPE = 1646 - WARN_COND_ITEM_TRUNCATED = 1647 - ER_COND_ITEM_TOO_LONG = 1648 - ER_UNKNOWN_LOCALE = 1649 - ER_SLAVE_IGNORE_SERVER_IDS = 1650 - ER_QUERY_CACHE_DISABLED = 1651 - ER_SAME_NAME_PARTITION_FIELD = 1652 - ER_PARTITION_COLUMN_LIST_ERROR = 1653 - ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654 - ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655 - ER_MAXVALUE_IN_VALUES_IN = 1656 - ER_TOO_MANY_VALUES_ERROR = 1657 - ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658 - ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659 - ER_PARTITION_FIELDS_TOO_LONG = 1660 - ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661 - ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662 - ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663 - ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664 - ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665 - ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666 - ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667 - ER_BINLOG_UNSAFE_LIMIT = 1668 - ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669 - ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670 - ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671 - ER_BINLOG_UNSAFE_UDF = 1672 - ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673 - ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674 - ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675 - ER_MESSAGE_AND_STATEMENT = 1676 - ER_SLAVE_CONVERSION_FAILED = 1677 - ER_SLAVE_CANT_CREATE_CONVERSION = 1678 - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679 - ER_PATH_LENGTH = 1680 - ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681 - ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682 - ER_WRONG_PERFSCHEMA_USAGE = 1683 - ER_WARN_I_S_SKIPPED_TABLE = 1684 - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685 - ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686 - ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687 - ER_TOO_LONG_INDEX_COMMENT = 1688 - ER_LOCK_ABORTED = 1689 - ER_DATA_OUT_OF_RANGE = 1690 - ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691 - ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692 - ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693 - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694 - ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695 - ER_FAILED_READ_FROM_PAR_FILE = 1696 - ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697 - ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698 - ER_SET_PASSWORD_AUTH_PLUGIN = 1699 - ER_GRANT_PLUGIN_USER_EXISTS = 1700 - ER_TRUNCATE_ILLEGAL_FK = 1701 - ER_PLUGIN_IS_PERMANENT = 1702 - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703 - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704 - ER_STMT_CACHE_FULL = 1705 - ER_MULTI_UPDATE_KEY_CONFLICT = 1706 - ER_TABLE_NEEDS_REBUILD = 1707 - WARN_OPTION_BELOW_LIMIT = 1708 - ER_INDEX_COLUMN_TOO_LONG = 1709 - ER_ERROR_IN_TRIGGER_BODY = 1710 - ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711 - ER_INDEX_CORRUPT = 1712 - ER_UNDO_RECORD_TOO_BIG = 1713 - ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714 - ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715 - ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716 - ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717 - ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718 - ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719 - ER_PLUGIN_NO_UNINSTALL = 1720 - ER_PLUGIN_NO_INSTALL = 1721 - ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722 - ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723 - ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724 - ER_TABLE_IN_FK_CHECK = 1725 - ER_UNSUPPORTED_ENGINE = 1726 - ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727 - ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728 - ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729 - ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730 - ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731 - ER_PARTITION_EXCHANGE_PART_TABLE = 1732 - ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733 - ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734 - ER_UNKNOWN_PARTITION = 1735 - ER_TABLES_DIFFERENT_METADATA = 1736 - ER_ROW_DOES_NOT_MATCH_PARTITION = 1737 - ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738 - ER_WARN_INDEX_NOT_APPLICABLE = 1739 - ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740 - ER_NO_SUCH_KEY_VALUE = 1741 - ER_RPL_INFO_DATA_TOO_LONG = 1742 - ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743 - ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744 - ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745 - ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746 - ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747 - ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748 - ER_NO_SUCH_PARTITION__UNUSED = 1749 - ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750 - ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751 - ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752 - ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753 - ER_MTS_UPDATED_DBS_GREATER_MAX = 1754 - ER_MTS_CANT_PARALLEL = 1755 - ER_MTS_INCONSISTENT_DATA = 1756 - ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757 - ER_DA_INVALID_CONDITION_NUMBER = 1758 - ER_INSECURE_PLAIN_TEXT = 1759 - ER_INSECURE_CHANGE_MASTER = 1760 - ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761 - ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762 - ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763 - ER_TABLE_HAS_NO_FT = 1764 - ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765 - ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766 - ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767 - ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL = 1768 - ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769 - ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770 - ER_SKIPPING_LOGGED_TRANSACTION = 1771 - ER_MALFORMED_GTID_SET_SPECIFICATION = 1772 - ER_MALFORMED_GTID_SET_ENCODING = 1773 - ER_MALFORMED_GTID_SPECIFICATION = 1774 - ER_GNO_EXHAUSTED = 1775 - ER_BAD_SLAVE_AUTO_POSITION = 1776 - ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON = 1777 - ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778 - ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779 - ER_GTID_MODE_REQUIRES_BINLOG = 1780 - ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781 - ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782 - ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783 - ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784 - ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785 - ER_GTID_UNSAFE_CREATE_SELECT = 1786 - ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787 - ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788 - ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789 - ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790 - ER_UNKNOWN_EXPLAIN_FORMAT = 1791 - ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792 - ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793 - ER_SLAVE_CONFIGURATION = 1794 - ER_INNODB_FT_LIMIT = 1795 - ER_INNODB_NO_FT_TEMP_TABLE = 1796 - ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797 - ER_INNODB_FT_WRONG_DOCID_INDEX = 1798 - ER_INNODB_ONLINE_LOG_TOO_BIG = 1799 - ER_UNKNOWN_ALTER_ALGORITHM = 1800 - ER_UNKNOWN_ALTER_LOCK = 1801 - ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802 - ER_MTS_RECOVERY_FAILURE = 1803 - ER_MTS_RESET_WORKERS = 1804 - ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805 - ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806 - ER_DISCARD_FK_CHECKS_RUNNING = 1807 - ER_TABLE_SCHEMA_MISMATCH = 1808 - ER_TABLE_IN_SYSTEM_TABLESPACE = 1809 - ER_IO_READ_ERROR = 1810 - ER_IO_WRITE_ERROR = 1811 - ER_TABLESPACE_MISSING = 1812 - ER_TABLESPACE_EXISTS = 1813 - ER_TABLESPACE_DISCARDED = 1814 - ER_INTERNAL_ERROR = 1815 - ER_INNODB_IMPORT_ERROR = 1816 - ER_INNODB_INDEX_CORRUPT = 1817 - ER_INVALID_YEAR_COLUMN_LENGTH = 1818 - ER_NOT_VALID_PASSWORD = 1819 - ER_MUST_CHANGE_PASSWORD = 1820 - ER_FK_NO_INDEX_CHILD = 1821 - ER_FK_NO_INDEX_PARENT = 1822 - ER_FK_FAIL_ADD_SYSTEM = 1823 - ER_FK_CANNOT_OPEN_PARENT = 1824 - ER_FK_INCORRECT_OPTION = 1825 - ER_FK_DUP_NAME = 1826 - ER_PASSWORD_FORMAT = 1827 - ER_FK_COLUMN_CANNOT_DROP = 1828 - ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829 - ER_FK_COLUMN_NOT_NULL = 1830 - ER_DUP_INDEX = 1831 - ER_FK_COLUMN_CANNOT_CHANGE = 1832 - ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833 - ER_FK_CANNOT_DELETE_PARENT = 1834 - ER_MALFORMED_PACKET = 1835 - ER_READ_ONLY_MODE = 1836 - ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837 - ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838 - ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839 - ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840 - ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841 - ER_GTID_PURGED_WAS_CHANGED = 1842 - ER_GTID_EXECUTED_WAS_CHANGED = 1843 - ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844 - ER_ALTER_OPERATION_NOT_SUPPORTED = 1845 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857 - ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858 - ER_DUP_UNKNOWN_IN_INDEX = 1859 - ER_IDENT_CAUSES_TOO_LONG_PATH = 1860 - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861 - ER_MUST_CHANGE_PASSWORD_LOGIN = 1862 - ER_ROW_IN_WRONG_PARTITION = 1863 - ER_ERROR_LAST = 1863 -) diff --git a/vendor/github.com/siddontang/go-mysql/mysql/errname.go b/vendor/github.com/siddontang/go-mysql/mysql/errname.go deleted file mode 100644 index 7f8575a7..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/errname.go +++ /dev/null @@ -1,868 +0,0 @@ -package mysql - -var MySQLErrName = map[uint16]string{ - ER_HASHCHK: "hashchk", - ER_NISAMCHK: "isamchk", - ER_NO: "NO", - ER_YES: "YES", - ER_CANT_CREATE_FILE: "Can't create file '%-.200s' (errno: %d - %s)", - ER_CANT_CREATE_TABLE: "Can't create table '%-.200s' (errno: %d)", - ER_CANT_CREATE_DB: "Can't create database '%-.192s' (errno: %d)", - ER_DB_CREATE_EXISTS: "Can't create database '%-.192s'; database exists", - ER_DB_DROP_EXISTS: "Can't drop database '%-.192s'; database doesn't exist", - ER_DB_DROP_DELETE: "Error dropping database (can't delete '%-.192s', errno: %d)", - ER_DB_DROP_RMDIR: "Error dropping database (can't rmdir '%-.192s', errno: %d)", - ER_CANT_DELETE_FILE: "Error on delete of '%-.192s' (errno: %d - %s)", - ER_CANT_FIND_SYSTEM_REC: "Can't read record in system table", - ER_CANT_GET_STAT: "Can't get status of '%-.200s' (errno: %d - %s)", - ER_CANT_GET_WD: "Can't get working directory (errno: %d - %s)", - ER_CANT_LOCK: "Can't lock file (errno: %d - %s)", - ER_CANT_OPEN_FILE: "Can't open file: '%-.200s' (errno: %d - %s)", - ER_FILE_NOT_FOUND: "Can't find file: '%-.200s' (errno: %d - %s)", - ER_CANT_READ_DIR: "Can't read dir of '%-.192s' (errno: %d - %s)", - ER_CANT_SET_WD: "Can't change dir to '%-.192s' (errno: %d - %s)", - ER_CHECKREAD: "Record has changed since last read in table '%-.192s'", - ER_DISK_FULL: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", - ER_DUP_KEY: "Can't write; duplicate key in table '%-.192s'", - ER_ERROR_ON_CLOSE: "Error on close of '%-.192s' (errno: %d - %s)", - ER_ERROR_ON_READ: "Error reading file '%-.200s' (errno: %d - %s)", - ER_ERROR_ON_RENAME: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", - ER_ERROR_ON_WRITE: "Error writing file '%-.200s' (errno: %d - %s)", - ER_FILE_USED: "'%-.192s' is locked against change", - ER_FILSORT_ABORT: "Sort aborted", - ER_FORM_NOT_FOUND: "View '%-.192s' doesn't exist for '%-.192s'", - ER_GET_ERRNO: "Got error %d from storage engine", - ER_ILLEGAL_HA: "Table storage engine for '%-.192s' doesn't have this option", - ER_KEY_NOT_FOUND: "Can't find record in '%-.192s'", - ER_NOT_FORM_FILE: "Incorrect information in file: '%-.200s'", - ER_NOT_KEYFILE: "Incorrect key file for table '%-.200s'; try to repair it", - ER_OLD_KEYFILE: "Old key file for table '%-.192s'; repair it!", - ER_OPEN_AS_READONLY: "Table '%-.192s' is read only", - ER_OUTOFMEMORY: "Out of memory; restart server and try again (needed %d bytes)", - ER_OUT_OF_SORTMEMORY: "Out of sort memory, consider increasing server sort buffer size", - ER_UNEXPECTED_EOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", - ER_CON_COUNT_ERROR: "Too many connections", - ER_OUT_OF_RESOURCES: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", - ER_BAD_HOST_ERROR: "Can't get hostname for your address", - ER_HANDSHAKE_ERROR: "Bad handshake", - ER_DBACCESS_DENIED_ERROR: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", - ER_ACCESS_DENIED_ERROR: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", - ER_NO_DB_ERROR: "No database selected", - ER_UNKNOWN_COM_ERROR: "Unknown command", - ER_BAD_NULL_ERROR: "Column '%-.192s' cannot be null", - ER_BAD_DB_ERROR: "Unknown database '%-.192s'", - ER_TABLE_EXISTS_ERROR: "Table '%-.192s' already exists", - ER_BAD_TABLE_ERROR: "Unknown table '%-.100s'", - ER_NON_UNIQ_ERROR: "Column '%-.192s' in %-.192s is ambiguous", - ER_SERVER_SHUTDOWN: "Server shutdown in progress", - ER_BAD_FIELD_ERROR: "Unknown column '%-.192s' in '%-.192s'", - ER_WRONG_FIELD_WITH_GROUP: "'%-.192s' isn't in GROUP BY", - ER_WRONG_GROUP_FIELD: "Can't group on '%-.192s'", - ER_WRONG_SUM_SELECT: "Statement has sum functions and columns in same statement", - ER_WRONG_VALUE_COUNT: "Column count doesn't match value count", - ER_TOO_LONG_IDENT: "Identifier name '%-.100s' is too long", - ER_DUP_FIELDNAME: "Duplicate column name '%-.192s'", - ER_DUP_KEYNAME: "Duplicate key name '%-.192s'", - ER_DUP_ENTRY: "Duplicate entry '%-.192s' for key %d", - ER_WRONG_FIELD_SPEC: "Incorrect column specifier for column '%-.192s'", - ER_PARSE_ERROR: "%s near '%-.80s' at line %d", - ER_EMPTY_QUERY: "Query was empty", - ER_NONUNIQ_TABLE: "Not unique table/alias: '%-.192s'", - ER_INVALID_DEFAULT: "Invalid default value for '%-.192s'", - ER_MULTIPLE_PRI_KEY: "Multiple primary key defined", - ER_TOO_MANY_KEYS: "Too many keys specified; max %d keys allowed", - ER_TOO_MANY_KEY_PARTS: "Too many key parts specified; max %d parts allowed", - ER_TOO_LONG_KEY: "Specified key was too long; max key length is %d bytes", - ER_KEY_COLUMN_DOES_NOT_EXITS: "Key column '%-.192s' doesn't exist in table", - ER_BLOB_USED_AS_KEY: "BLOB column '%-.192s' can't be used in key specification with the used table type", - ER_TOO_BIG_FIELDLENGTH: "Column length too big for column '%-.192s' (max = %lu); use BLOB or TEXT instead", - ER_WRONG_AUTO_KEY: "Incorrect table definition; there can be only one auto column and it must be defined as a key", - ER_READY: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", - ER_NORMAL_SHUTDOWN: "%s: Normal shutdown\n", - ER_GOT_SIGNAL: "%s: Got signal %d. Aborting!\n", - ER_SHUTDOWN_COMPLETE: "%s: Shutdown complete\n", - ER_FORCING_CLOSE: "%s: Forcing close of thread %ld user: '%-.48s'\n", - ER_IPSOCK_ERROR: "Can't create IP socket", - ER_NO_SUCH_INDEX: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", - ER_WRONG_FIELD_TERMINATORS: "Field separator argument is not what is expected; check the manual", - ER_BLOBS_AND_NO_TERMINATED: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", - ER_TEXTFILE_NOT_READABLE: "The file '%-.128s' must be in the database directory or be readable by all", - ER_FILE_EXISTS_ERROR: "File '%-.200s' already exists", - ER_LOAD_INFO: "Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld", - ER_ALTER_INFO: "Records: %ld Duplicates: %ld", - ER_WRONG_SUB_KEY: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", - ER_CANT_REMOVE_ALL_FIELDS: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", - ER_CANT_DROP_FIELD_OR_KEY: "Can't DROP '%-.192s'; check that column/key exists", - ER_INSERT_INFO: "Records: %ld Duplicates: %ld Warnings: %ld", - ER_UPDATE_TABLE_USED: "You can't specify target table '%-.192s' for update in FROM clause", - ER_NO_SUCH_THREAD: "Unknown thread id: %lu", - ER_KILL_DENIED_ERROR: "You are not owner of thread %lu", - ER_NO_TABLES_USED: "No tables used", - ER_TOO_BIG_SET: "Too many strings for column %-.192s and SET", - ER_NO_UNIQUE_LOGFILE: "Can't generate a unique log-filename %-.200s.(1-999)\n", - ER_TABLE_NOT_LOCKED_FOR_WRITE: "Table '%-.192s' was locked with a READ lock and can't be updated", - ER_TABLE_NOT_LOCKED: "Table '%-.192s' was not locked with LOCK TABLES", - ER_BLOB_CANT_HAVE_DEFAULT: "BLOB/TEXT column '%-.192s' can't have a default value", - ER_WRONG_DB_NAME: "Incorrect database name '%-.100s'", - ER_WRONG_TABLE_NAME: "Incorrect table name '%-.100s'", - ER_TOO_BIG_SELECT: "The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay", - ER_UNKNOWN_ERROR: "Unknown error", - ER_UNKNOWN_PROCEDURE: "Unknown procedure '%-.192s'", - ER_WRONG_PARAMCOUNT_TO_PROCEDURE: "Incorrect parameter count to procedure '%-.192s'", - ER_WRONG_PARAMETERS_TO_PROCEDURE: "Incorrect parameters to procedure '%-.192s'", - ER_UNKNOWN_TABLE: "Unknown table '%-.192s' in %-.32s", - ER_FIELD_SPECIFIED_TWICE: "Column '%-.192s' specified twice", - ER_INVALID_GROUP_FUNC_USE: "Invalid use of group function", - ER_UNSUPPORTED_EXTENSION: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", - ER_TABLE_MUST_HAVE_COLUMNS: "A table must have at least 1 column", - ER_RECORD_FILE_FULL: "The table '%-.192s' is full", - ER_UNKNOWN_CHARACTER_SET: "Unknown character set: '%-.64s'", - ER_TOO_MANY_TABLES: "Too many tables; MySQL can only use %d tables in a join", - ER_TOO_MANY_FIELDS: "Too many columns", - ER_TOO_BIG_ROWSIZE: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %ld. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", - ER_STACK_OVERRUN: "Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld --thread_stack=#' to specify a bigger stack if needed", - ER_WRONG_OUTER_JOIN: "Cross dependency found in OUTER JOIN; examine your ON conditions", - ER_NULL_COLUMN_IN_INDEX: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", - ER_CANT_FIND_UDF: "Can't load function '%-.192s'", - ER_CANT_INITIALIZE_UDF: "Can't initialize function '%-.192s'; %-.80s", - ER_UDF_NO_PATHS: "No paths allowed for shared library", - ER_UDF_EXISTS: "Function '%-.192s' already exists", - ER_CANT_OPEN_LIBRARY: "Can't open shared library '%-.192s' (errno: %d %-.128s)", - ER_CANT_FIND_DL_ENTRY: "Can't find symbol '%-.128s' in library", - ER_FUNCTION_NOT_DEFINED: "Function '%-.192s' is not defined", - ER_HOST_IS_BLOCKED: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", - ER_HOST_NOT_PRIVILEGED: "Host '%-.64s' is not allowed to connect to this MySQL server", - ER_PASSWORD_ANONYMOUS_USER: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", - ER_PASSWORD_NOT_ALLOWED: "You must have privileges to update tables in the mysql database to be able to change passwords for others", - ER_PASSWORD_NO_MATCH: "Can't find any matching row in the user table", - ER_UPDATE_INFO: "Rows matched: %ld Changed: %ld Warnings: %ld", - ER_CANT_CREATE_THREAD: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", - ER_WRONG_VALUE_COUNT_ON_ROW: "Column count doesn't match value count at row %ld", - ER_CANT_REOPEN_TABLE: "Can't reopen table: '%-.192s'", - ER_INVALID_USE_OF_NULL: "Invalid use of NULL value", - ER_REGEXP_ERROR: "Got error '%-.64s' from regexp", - ER_MIX_OF_GROUP_FUNC_AND_FIELDS: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", - ER_NONEXISTING_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s'", - ER_TABLEACCESS_DENIED_ERROR: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", - ER_COLUMNACCESS_DENIED_ERROR: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", - ER_ILLEGAL_GRANT_FOR_TABLE: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", - ER_GRANT_WRONG_HOST_OR_USER: "The host or user argument to GRANT is too long", - ER_NO_SUCH_TABLE: "Table '%-.192s.%-.192s' doesn't exist", - ER_NONEXISTING_TABLE_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", - ER_NOT_ALLOWED_COMMAND: "The used command is not allowed with this MySQL version", - ER_SYNTAX_ERROR: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", - ER_DELAYED_CANT_CHANGE_LOCK: "Delayed insert thread couldn't get requested lock for table %-.192s", - ER_TOO_MANY_DELAYED_THREADS: "Too many delayed threads in use", - ER_ABORTING_CONNECTION: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' (%-.64s)", - ER_NET_PACKET_TOO_LARGE: "Got a packet bigger than 'max_allowed_packet' bytes", - ER_NET_READ_ERROR_FROM_PIPE: "Got a read error from the connection pipe", - ER_NET_FCNTL_ERROR: "Got an error from fcntl()", - ER_NET_PACKETS_OUT_OF_ORDER: "Got packets out of order", - ER_NET_UNCOMPRESS_ERROR: "Couldn't uncompress communication packet", - ER_NET_READ_ERROR: "Got an error reading communication packets", - ER_NET_READ_INTERRUPTED: "Got timeout reading communication packets", - ER_NET_ERROR_ON_WRITE: "Got an error writing communication packets", - ER_NET_WRITE_INTERRUPTED: "Got timeout writing communication packets", - ER_TOO_LONG_STRING: "Result string is longer than 'max_allowed_packet' bytes", - ER_TABLE_CANT_HANDLE_BLOB: "The used table type doesn't support BLOB/TEXT columns", - ER_TABLE_CANT_HANDLE_AUTO_INCREMENT: "The used table type doesn't support AUTO_INCREMENT columns", - ER_DELAYED_INSERT_TABLE_LOCKED: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", - ER_WRONG_COLUMN_NAME: "Incorrect column name '%-.100s'", - ER_WRONG_KEY_COLUMN: "The used storage engine can't index column '%-.192s'", - ER_WRONG_MRG_TABLE: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", - ER_DUP_UNIQUE: "Can't write, because of unique constraint, to table '%-.192s'", - ER_BLOB_KEY_WITHOUT_LENGTH: "BLOB/TEXT column '%-.192s' used in key specification without a key length", - ER_PRIMARY_CANT_HAVE_NULL: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", - ER_TOO_MANY_ROWS: "Result consisted of more than one row", - ER_REQUIRES_PRIMARY_KEY: "This table type requires a primary key", - ER_NO_RAID_COMPILED: "This version of MySQL is not compiled with RAID support", - ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", - ER_KEY_DOES_NOT_EXITS: "Key '%-.192s' doesn't exist in table '%-.192s'", - ER_CHECK_NO_SUCH_TABLE: "Can't open table", - ER_CHECK_NOT_IMPLEMENTED: "The storage engine for the table doesn't support %s", - ER_CANT_DO_THIS_DURING_AN_TRANSACTION: "You are not allowed to execute this command in a transaction", - ER_ERROR_DURING_COMMIT: "Got error %d during COMMIT", - ER_ERROR_DURING_ROLLBACK: "Got error %d during ROLLBACK", - ER_ERROR_DURING_FLUSH_LOGS: "Got error %d during FLUSH_LOGS", - ER_ERROR_DURING_CHECKPOINT: "Got error %d during CHECKPOINT", - ER_NEW_ABORTING_CONNECTION: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", - ER_DUMP_NOT_IMPLEMENTED: "The storage engine for the table does not support binary table dump", - ER_FLUSH_MASTER_BINLOG_CLOSED: "Binlog closed, cannot RESET MASTER", - ER_INDEX_REBUILD: "Failed rebuilding the index of dumped table '%-.192s'", - ER_MASTER: "Error from master: '%-.64s'", - ER_MASTER_NET_READ: "Net error reading from master", - ER_MASTER_NET_WRITE: "Net error writing to master", - ER_FT_MATCHING_KEY_NOT_FOUND: "Can't find FULLTEXT index matching the column list", - ER_LOCK_OR_ACTIVE_TRANSACTION: "Can't execute the given command because you have active locked tables or an active transaction", - ER_UNKNOWN_SYSTEM_VARIABLE: "Unknown system variable '%-.64s'", - ER_CRASHED_ON_USAGE: "Table '%-.192s' is marked as crashed and should be repaired", - ER_CRASHED_ON_REPAIR: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", - ER_WARNING_NOT_COMPLETE_ROLLBACK: "Some non-transactional changed tables couldn't be rolled back", - ER_TRANS_CACHE_FULL: "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again", - ER_SLAVE_MUST_STOP: "This operation cannot be performed with a running slave; run STOP SLAVE first", - ER_SLAVE_NOT_RUNNING: "This operation requires a running slave; configure slave and do START SLAVE", - ER_BAD_SLAVE: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", - ER_MASTER_INFO: "Could not initialize master info structure; more error messages can be found in the MySQL error log", - ER_SLAVE_THREAD: "Could not create slave thread; check system resources", - ER_TOO_MANY_USER_CONNECTIONS: "User %-.64s already has more than 'max_user_connections' active connections", - ER_SET_CONSTANTS_ONLY: "You may only use constant expressions with SET", - ER_LOCK_WAIT_TIMEOUT: "Lock wait timeout exceeded; try restarting transaction", - ER_LOCK_TABLE_FULL: "The total number of locks exceeds the lock table size", - ER_READ_ONLY_TRANSACTION: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", - ER_DROP_DB_WITH_READ_LOCK: "DROP DATABASE not allowed while thread is holding global read lock", - ER_CREATE_DB_WITH_READ_LOCK: "CREATE DATABASE not allowed while thread is holding global read lock", - ER_WRONG_ARGUMENTS: "Incorrect arguments to %s", - ER_NO_PERMISSION_TO_CREATE_USER: "'%-.48s'@'%-.64s' is not allowed to create new users", - ER_UNION_TABLES_IN_DIFFERENT_DIR: "Incorrect table definition; all MERGE tables must be in the same database", - ER_LOCK_DEADLOCK: "Deadlock found when trying to get lock; try restarting transaction", - ER_TABLE_CANT_HANDLE_FT: "The used table type doesn't support FULLTEXT indexes", - ER_CANNOT_ADD_FOREIGN: "Cannot add foreign key constraint", - ER_NO_REFERENCED_ROW: "Cannot add or update a child row: a foreign key constraint fails", - ER_ROW_IS_REFERENCED: "Cannot delete or update a parent row: a foreign key constraint fails", - ER_CONNECT_TO_MASTER: "Error connecting to master: %-.128s", - ER_QUERY_ON_MASTER: "Error running query on master: %-.128s", - ER_ERROR_WHEN_EXECUTING_COMMAND: "Error when executing command %s: %-.128s", - ER_WRONG_USAGE: "Incorrect usage of %s and %s", - ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT: "The used SELECT statements have a different number of columns", - ER_CANT_UPDATE_WITH_READLOCK: "Can't execute the query because you have a conflicting read lock", - ER_MIXING_NOT_ALLOWED: "Mixing of transactional and non-transactional tables is disabled", - ER_DUP_ARGUMENT: "Option '%s' used twice in statement", - ER_USER_LIMIT_REACHED: "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", - ER_SPECIFIC_ACCESS_DENIED_ERROR: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", - ER_LOCAL_VARIABLE: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", - ER_GLOBAL_VARIABLE: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", - ER_NO_DEFAULT: "Variable '%-.64s' doesn't have a default value", - ER_WRONG_VALUE_FOR_VAR: "Variable '%-.64s' can't be set to the value of '%-.200s'", - ER_WRONG_TYPE_FOR_VAR: "Incorrect argument type to variable '%-.64s'", - ER_VAR_CANT_BE_READ: "Variable '%-.64s' can only be set, not read", - ER_CANT_USE_OPTION_HERE: "Incorrect usage/placement of '%s'", - ER_NOT_SUPPORTED_YET: "This version of MySQL doesn't yet support '%s'", - ER_MASTER_FATAL_ERROR_READING_BINLOG: "Got fatal error %d from master when reading data from binary log: '%-.320s'", - ER_SLAVE_IGNORED_TABLE: "Slave SQL thread ignored the query because of replicate-*-table rules", - ER_INCORRECT_GLOBAL_LOCAL_VAR: "Variable '%-.192s' is a %s variable", - ER_WRONG_FK_DEF: "Incorrect foreign key definition for '%-.192s': %s", - ER_KEY_REF_DO_NOT_MATCH_TABLE_REF: "Key reference and table reference don't match", - ER_OPERAND_COLUMNS: "Operand should contain %d column(s)", - ER_SUBQUERY_NO_1_ROW: "Subquery returns more than 1 row", - ER_UNKNOWN_STMT_HANDLER: "Unknown prepared statement handler (%.*s) given to %s", - ER_CORRUPT_HELP_DB: "Help database is corrupt or does not exist", - ER_CYCLIC_REFERENCE: "Cyclic reference on subqueries", - ER_AUTO_CONVERT: "Converting column '%s' from %s to %s", - ER_ILLEGAL_REFERENCE: "Reference '%-.64s' not supported (%s)", - ER_DERIVED_MUST_HAVE_ALIAS: "Every derived table must have its own alias", - ER_SELECT_REDUCED: "Select %u was reduced during optimization", - ER_TABLENAME_NOT_ALLOWED_HERE: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", - ER_NOT_SUPPORTED_AUTH_MODE: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", - ER_SPATIAL_CANT_HAVE_NULL: "All parts of a SPATIAL index must be NOT NULL", - ER_COLLATION_CHARSET_MISMATCH: "COLLATION '%s' is not valid for CHARACTER SET '%s'", - ER_SLAVE_WAS_RUNNING: "Slave is already running", - ER_SLAVE_WAS_NOT_RUNNING: "Slave already has been stopped", - ER_TOO_BIG_FOR_UNCOMPRESS: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", - ER_ZLIB_Z_MEM_ERROR: "ZLIB: Not enough memory", - ER_ZLIB_Z_BUF_ERROR: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", - ER_ZLIB_Z_DATA_ERROR: "ZLIB: Input data corrupted", - ER_CUT_VALUE_GROUP_CONCAT: "Row %u was cut by GROUP_CONCAT()", - ER_WARN_TOO_FEW_RECORDS: "Row %ld doesn't contain data for all columns", - ER_WARN_TOO_MANY_RECORDS: "Row %ld was truncated; it contained more data than there were input columns", - ER_WARN_NULL_TO_NOTNULL: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %ld", - ER_WARN_DATA_OUT_OF_RANGE: "Out of range value for column '%s' at row %ld", - WARN_DATA_TRUNCATED: "Data truncated for column '%s' at row %ld", - ER_WARN_USING_OTHER_HANDLER: "Using storage engine %s for table '%s'", - ER_CANT_AGGREGATE_2COLLATIONS: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", - ER_DROP_USER: "Cannot drop one or more of the requested users", - ER_REVOKE_GRANTS: "Can't revoke all privileges for one or more of the requested users", - ER_CANT_AGGREGATE_3COLLATIONS: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", - ER_CANT_AGGREGATE_NCOLLATIONS: "Illegal mix of collations for operation '%s'", - ER_VARIABLE_IS_NOT_STRUCT: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variable_name)", - ER_UNKNOWN_COLLATION: "Unknown collation: '%-.64s'", - ER_SLAVE_IGNORED_SSL_PARAMS: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", - ER_SERVER_IS_IN_SECURE_AUTH_MODE: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", - ER_WARN_FIELD_RESOLVED: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", - ER_BAD_SLAVE_UNTIL_COND: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", - ER_MISSING_SKIP_SLAVE: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", - ER_UNTIL_COND_IGNORED: "SQL thread is not to be started so UNTIL options are ignored", - ER_WRONG_NAME_FOR_INDEX: "Incorrect index name '%-.100s'", - ER_WRONG_NAME_FOR_CATALOG: "Incorrect catalog name '%-.100s'", - ER_WARN_QC_RESIZE: "Query cache failed to set size %lu; new query cache size is %lu", - ER_BAD_FT_COLUMN: "Column '%-.192s' cannot be part of FULLTEXT index", - ER_UNKNOWN_KEY_CACHE: "Unknown key cache '%-.100s'", - ER_WARN_HOSTNAME_WONT_WORK: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", - ER_UNKNOWN_STORAGE_ENGINE: "Unknown storage engine '%s'", - ER_WARN_DEPRECATED_SYNTAX: "'%s' is deprecated and will be removed in a future release. Please use %s instead", - ER_NON_UPDATABLE_TABLE: "The target table %-.100s of the %s is not updatable", - ER_FEATURE_DISABLED: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", - ER_OPTION_PREVENTS_STATEMENT: "The MySQL server is running with the %s option so it cannot execute this statement", - ER_DUPLICATED_VALUE_IN_TYPE: "Column '%-.100s' has duplicated value '%-.64s' in %s", - ER_TRUNCATED_WRONG_VALUE: "Truncated incorrect %-.32s value: '%-.128s'", - ER_TOO_MUCH_AUTO_TIMESTAMP_COLS: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause", - ER_INVALID_ON_UPDATE: "Invalid ON UPDATE clause for '%-.192s' column", - ER_UNSUPPORTED_PS: "This command is not supported in the prepared statement protocol yet", - ER_GET_ERRMSG: "Got error %d '%-.100s' from %s", - ER_GET_TEMPORARY_ERRMSG: "Got temporary error %d '%-.100s' from %s", - ER_UNKNOWN_TIME_ZONE: "Unknown or incorrect time zone: '%-.64s'", - ER_WARN_INVALID_TIMESTAMP: "Invalid TIMESTAMP value in column '%s' at row %ld", - ER_INVALID_CHARACTER_STRING: "Invalid %s character string: '%.64s'", - ER_WARN_ALLOWED_PACKET_OVERFLOWED: "Result of %s() was larger than max_allowed_packet (%ld) - truncated", - ER_CONFLICTING_DECLARATIONS: "Conflicting declarations: '%s%s' and '%s%s'", - ER_SP_NO_RECURSIVE_CREATE: "Can't create a %s from within another stored routine", - ER_SP_ALREADY_EXISTS: "%s %s already exists", - ER_SP_DOES_NOT_EXIST: "%s %s does not exist", - ER_SP_DROP_FAILED: "Failed to DROP %s %s", - ER_SP_STORE_FAILED: "Failed to CREATE %s %s", - ER_SP_LILABEL_MISMATCH: "%s with no matching label: %s", - ER_SP_LABEL_REDEFINE: "Redefining label %s", - ER_SP_LABEL_MISMATCH: "End-label %s without match", - ER_SP_UNINIT_VAR: "Referring to uninitialized variable %s", - ER_SP_BADSELECT: "PROCEDURE %s can't return a result set in the given context", - ER_SP_BADRETURN: "RETURN is only allowed in a FUNCTION", - ER_SP_BADSTATEMENT: "%s is not allowed in stored procedures", - ER_UPDATE_LOG_DEPRECATED_IGNORED: "The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored.", - ER_UPDATE_LOG_DEPRECATED_TRANSLATED: "The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been translated to SET SQL_LOG_BIN.", - ER_QUERY_INTERRUPTED: "Query execution was interrupted", - ER_SP_WRONG_NO_OF_ARGS: "Incorrect number of arguments for %s %s; expected %u, got %u", - ER_SP_COND_MISMATCH: "Undefined CONDITION: %s", - ER_SP_NORETURN: "No RETURN found in FUNCTION %s", - ER_SP_NORETURNEND: "FUNCTION %s ended without RETURN", - ER_SP_BAD_CURSOR_QUERY: "Cursor statement must be a SELECT", - ER_SP_BAD_CURSOR_SELECT: "Cursor SELECT must not have INTO", - ER_SP_CURSOR_MISMATCH: "Undefined CURSOR: %s", - ER_SP_CURSOR_ALREADY_OPEN: "Cursor is already open", - ER_SP_CURSOR_NOT_OPEN: "Cursor is not open", - ER_SP_UNDECLARED_VAR: "Undeclared variable: %s", - ER_SP_WRONG_NO_OF_FETCH_ARGS: "Incorrect number of FETCH variables", - ER_SP_FETCH_NO_DATA: "No data - zero rows fetched, selected, or processed", - ER_SP_DUP_PARAM: "Duplicate parameter: %s", - ER_SP_DUP_VAR: "Duplicate variable: %s", - ER_SP_DUP_COND: "Duplicate condition: %s", - ER_SP_DUP_CURS: "Duplicate cursor: %s", - ER_SP_CANT_ALTER: "Failed to ALTER %s %s", - ER_SP_SUBSELECT_NYI: "Subquery value not supported", - ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG: "%s is not allowed in stored function or trigger", - ER_SP_VARCOND_AFTER_CURSHNDLR: "Variable or condition declaration after cursor or handler declaration", - ER_SP_CURSOR_AFTER_HANDLER: "Cursor declaration after handler declaration", - ER_SP_CASE_NOT_FOUND: "Case not found for CASE statement", - ER_FPARSER_TOO_BIG_FILE: "Configuration file '%-.192s' is too big", - ER_FPARSER_BAD_HEADER: "Malformed file type header in file '%-.192s'", - ER_FPARSER_EOF_IN_COMMENT: "Unexpected end of file while parsing comment '%-.200s'", - ER_FPARSER_ERROR_IN_PARAMETER: "Error while parsing parameter '%-.192s' (line: '%-.192s')", - ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER: "Unexpected end of file while skipping unknown parameter '%-.192s'", - ER_VIEW_NO_EXPLAIN: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", - ER_FRM_UNKNOWN_TYPE: "File '%-.192s' has unknown type '%-.64s' in its header", - ER_WRONG_OBJECT: "'%-.192s.%-.192s' is not %s", - ER_NONUPDATEABLE_COLUMN: "Column '%-.192s' is not updatable", - ER_VIEW_SELECT_DERIVED: "View's SELECT contains a subquery in the FROM clause", - ER_VIEW_SELECT_CLAUSE: "View's SELECT contains a '%s' clause", - ER_VIEW_SELECT_VARIABLE: "View's SELECT contains a variable or parameter", - ER_VIEW_SELECT_TMPTABLE: "View's SELECT refers to a temporary table '%-.192s'", - ER_VIEW_WRONG_LIST: "View's SELECT and view's field list have different column counts", - ER_WARN_VIEW_MERGE: "View merge algorithm can't be used here for now (assumed undefined algorithm)", - ER_WARN_VIEW_WITHOUT_KEY: "View being updated does not have complete key of underlying table in it", - ER_VIEW_INVALID: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", - ER_SP_NO_DROP_SP: "Can't drop or alter a %s from within another stored routine", - ER_SP_GOTO_IN_HNDLR: "GOTO is not allowed in a stored procedure handler", - ER_TRG_ALREADY_EXISTS: "Trigger already exists", - ER_TRG_DOES_NOT_EXIST: "Trigger does not exist", - ER_TRG_ON_VIEW_OR_TEMP_TABLE: "Trigger's '%-.192s' is view or temporary table", - ER_TRG_CANT_CHANGE_ROW: "Updating of %s row is not allowed in %strigger", - ER_TRG_NO_SUCH_ROW_IN_TRG: "There is no %s row in %s trigger", - ER_NO_DEFAULT_FOR_FIELD: "Field '%-.192s' doesn't have a default value", - ER_DIVISION_BY_ZERO: "Division by 0", - ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %ld", - ER_ILLEGAL_VALUE_FOR_TYPE: "Illegal %s '%-.192s' value found during parsing", - ER_VIEW_NONUPD_CHECK: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", - ER_VIEW_CHECK_FAILED: "CHECK OPTION failed '%-.192s.%-.192s'", - ER_PROCACCESS_DENIED_ERROR: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", - ER_RELAY_LOG_FAIL: "Failed purging old relay logs: %s", - ER_PASSWD_LENGTH: "Password hash should be a %d-digit hexadecimal number", - ER_UNKNOWN_TARGET_BINLOG: "Target log not found in binlog index", - ER_IO_ERR_LOG_INDEX_READ: "I/O error reading log index file", - ER_BINLOG_PURGE_PROHIBITED: "Server configuration does not permit binlog purge", - ER_FSEEK_FAIL: "Failed on fseek()", - ER_BINLOG_PURGE_FATAL_ERR: "Fatal error during log purge", - ER_LOG_IN_USE: "A purgeable log is in use, will not purge", - ER_LOG_PURGE_UNKNOWN_ERR: "Unknown error during log purge", - ER_RELAY_LOG_INIT: "Failed initializing relay log position: %s", - ER_NO_BINARY_LOGGING: "You are not using binary logging", - ER_RESERVED_SYNTAX: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", - ER_WSAS_FAILED: "WSAStartup Failed", - ER_DIFF_GROUPS_PROC: "Can't handle procedures with different groups yet", - ER_NO_GROUP_FOR_PROC: "Select must have a group with this procedure", - ER_ORDER_WITH_PROC: "Can't use ORDER clause with this procedure", - ER_LOGGING_PROHIBIT_CHANGING_OF: "Binary logging and replication forbid changing the global server %s", - ER_NO_FILE_MAPPING: "Can't map file: %-.200s, errno: %d", - ER_WRONG_MAGIC: "Wrong magic in %-.64s", - ER_PS_MANY_PARAM: "Prepared statement contains too many placeholders", - ER_KEY_PART_0: "Key part '%-.192s' length cannot be 0", - ER_VIEW_CHECKSUM: "View text checksum failed", - ER_VIEW_MULTIUPDATE: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", - ER_VIEW_NO_INSERT_FIELD_LIST: "Can not insert into join view '%-.192s.%-.192s' without fields list", - ER_VIEW_DELETE_MERGE_VIEW: "Can not delete from join view '%-.192s.%-.192s'", - ER_CANNOT_USER: "Operation %s failed for %.256s", - ER_XAER_NOTA: "XAER_NOTA: Unknown XID", - ER_XAER_INVAL: "XAER_INVAL: Invalid arguments (or unsupported command)", - ER_XAER_RMFAIL: "XAER_RMFAIL: The command cannot be executed when global transaction is in the %.64s state", - ER_XAER_OUTSIDE: "XAER_OUTSIDE: Some work is done outside global transaction", - ER_XAER_RMERR: "XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency", - ER_XA_RBROLLBACK: "XA_RBROLLBACK: Transaction branch was rolled back", - ER_NONEXISTING_PROC_GRANT: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", - ER_PROC_AUTO_GRANT_FAIL: "Failed to grant EXECUTE and ALTER ROUTINE privileges", - ER_PROC_AUTO_REVOKE_FAIL: "Failed to revoke all privileges to dropped routine", - ER_DATA_TOO_LONG: "Data too long for column '%s' at row %ld", - ER_SP_BAD_SQLSTATE: "Bad SQLSTATE: '%s'", - ER_STARTUP: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", - ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR: "Can't load value from file with fixed size rows to variable", - ER_CANT_CREATE_USER_WITH_GRANT: "You are not allowed to create a user with GRANT", - ER_WRONG_VALUE_FOR_TYPE: "Incorrect %-.32s value: '%-.128s' for function %-.32s", - ER_TABLE_DEF_CHANGED: "Table definition has changed, please retry transaction", - ER_SP_DUP_HANDLER: "Duplicate handler declared in the same block", - ER_SP_NOT_VAR_ARG: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", - ER_SP_NO_RETSET: "Not allowed to return a result set from a %s", - ER_CANT_CREATE_GEOMETRY_OBJECT: "Cannot get geometry object from data you send to the GEOMETRY field", - ER_FAILED_ROUTINE_BREAK_BINLOG: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", - ER_BINLOG_UNSAFE_ROUTINE: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)", - ER_BINLOG_CREATE_ROUTINE_NEED_SUPER: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)", - ER_EXEC_STMT_WITH_OPEN_CURSOR: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", - ER_STMT_HAS_NO_OPEN_CURSOR: "The statement (%lu) has no open cursor.", - ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG: "Explicit or implicit commit is not allowed in stored function or trigger.", - ER_NO_DEFAULT_FOR_VIEW_FIELD: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", - ER_SP_NO_RECURSION: "Recursive stored functions and triggers are not allowed.", - ER_TOO_BIG_SCALE: "Too big scale %d specified for column '%-.192s'. Maximum is %lu.", - ER_TOO_BIG_PRECISION: "Too big precision %d specified for column '%-.192s'. Maximum is %lu.", - ER_M_BIGGER_THAN_D: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", - ER_WRONG_LOCK_OF_SYSTEM_TABLE: "You can't combine write-locking of system tables with other tables or lock types", - ER_CONNECT_TO_FOREIGN_DATA_SOURCE: "Unable to connect to foreign data source: %.64s", - ER_QUERY_ON_FOREIGN_DATA_SOURCE: "There was a problem processing the query on the foreign data source. Data source error: %-.64s", - ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST: "The foreign data source you are trying to reference does not exist. Data source error: %-.64s", - ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", - ER_FOREIGN_DATA_STRING_INVALID: "The data source connection string '%-.64s' is not in the correct format", - ER_CANT_CREATE_FEDERATED_TABLE: "Can't create federated table. Foreign data src error: %-.64s", - ER_TRG_IN_WRONG_SCHEMA: "Trigger in wrong schema", - ER_STACK_OVERRUN_NEED_MORE: "Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.", - ER_TOO_LONG_BODY: "Routine body for '%-.100s' is too long", - ER_WARN_CANT_DROP_DEFAULT_KEYCACHE: "Cannot drop default keycache", - ER_TOO_BIG_DISPLAYWIDTH: "Display width out of range for column '%-.192s' (max = %lu)", - ER_XAER_DUPID: "XAER_DUPID: The XID already exists", - ER_DATETIME_FUNCTION_OVERFLOW: "Datetime function: %-.32s field overflow", - ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", - ER_VIEW_PREVENT_UPDATE: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", - ER_PS_NO_RECURSION: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", - ER_SP_CANT_SET_AUTOCOMMIT: "Not allowed to set autocommit from a stored function or trigger", - ER_MALFORMED_DEFINER: "Definer is not fully qualified", - ER_VIEW_FRM_NO_USER: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", - ER_VIEW_OTHER_USER: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", - ER_NO_SUCH_USER: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", - ER_FORBID_SCHEMA_CHANGE: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", - ER_ROW_IS_REFERENCED_2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", - ER_NO_REFERENCED_ROW_2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", - ER_SP_BAD_VAR_SHADOW: "Variable '%-.64s' must be quoted with `...`, or renamed", - ER_TRG_NO_DEFINER: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", - ER_OLD_FILE_FORMAT: "'%-.192s' has an old format, you should re-create the '%s' object(s)", - ER_SP_RECURSION_LIMIT: "Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %.192s", - ER_SP_PROC_TABLE_CORRUPT: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", - ER_SP_WRONG_NAME: "Incorrect routine name '%-.192s'", - ER_TABLE_NEEDS_UPGRADE: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\" or dump/reload to fix it!", - ER_SP_NO_AGGREGATE: "AGGREGATE is not supported for stored functions", - ER_MAX_PREPARED_STMT_COUNT_REACHED: "Can't create more than max_prepared_stmt_count statements (current value: %lu)", - ER_VIEW_RECURSIVE: "`%-.192s`.`%-.192s` contains view recursion", - ER_NON_GROUPING_FIELD_USED: "Non-grouping field '%-.192s' is used in %-.64s clause", - ER_TABLE_CANT_HANDLE_SPKEYS: "The used table type doesn't support SPATIAL indexes", - ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA: "Triggers can not be created on system tables", - ER_REMOVED_SPACES: "Leading spaces are removed from name '%s'", - ER_AUTOINC_READ_FAILED: "Failed to read auto-increment value from storage engine", - ER_USERNAME: "user name", - ER_HOSTNAME: "host name", - ER_WRONG_STRING_LENGTH: "String '%-.70s' is too long for %s (should be no longer than %d)", - ER_NON_INSERTABLE_TABLE: "The target table %-.100s of the %s is not insertable-into", - ER_ADMIN_WRONG_MRG_TABLE: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", - ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT: "Too high level of nesting for select", - ER_NAME_BECOMES_EMPTY: "Name '%-.64s' has become ''", - ER_AMBIGUOUS_FIELD_TERM: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", - ER_FOREIGN_SERVER_EXISTS: "The foreign server, %s, you are trying to create already exists.", - ER_FOREIGN_SERVER_DOESNT_EXIST: "The foreign server name you are trying to reference does not exist. Data source error: %-.64s", - ER_ILLEGAL_HA_CREATE_OPTION: "Table storage engine '%-.64s' does not support the create option '%.64s'", - ER_PARTITION_REQUIRES_VALUES_ERROR: "Syntax error: %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", - ER_PARTITION_WRONG_VALUES_ERROR: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", - ER_PARTITION_MAXVALUE_ERROR: "MAXVALUE can only be used in last partition definition", - ER_PARTITION_SUBPARTITION_ERROR: "Subpartitions can only be hash partitions and by key", - ER_PARTITION_SUBPART_MIX_ERROR: "Must define subpartitions on all partitions if on one partition", - ER_PARTITION_WRONG_NO_PART_ERROR: "Wrong number of partitions defined, mismatch with previous setting", - ER_PARTITION_WRONG_NO_SUBPART_ERROR: "Wrong number of subpartitions defined, mismatch with previous setting", - ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", - ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR: "Expression in RANGE/LIST VALUES must be constant", - ER_FIELD_NOT_FOUND_PART_ERROR: "Field in list of fields for partition function not found in table", - ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR: "List of fields is only allowed in KEY partitions", - ER_INCONSISTENT_PARTITION_INFO_ERROR: "The partition info in the frm file is not consistent with what can be written into the frm file", - ER_PARTITION_FUNC_NOT_ALLOWED_ERROR: "The %-.192s function returns the wrong type", - ER_PARTITIONS_MUST_BE_DEFINED_ERROR: "For %-.64s partitions each partition must be defined", - ER_RANGE_NOT_INCREASING_ERROR: "VALUES LESS THAN value must be strictly increasing for each partition", - ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR: "VALUES value must be of same type as partition function", - ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR: "Multiple definition of same constant in list partitioning", - ER_PARTITION_ENTRY_ERROR: "Partitioning can not be used stand-alone in query", - ER_MIX_HANDLER_ERROR: "The mix of handlers in the partitions is not allowed in this version of MySQL", - ER_PARTITION_NOT_DEFINED_ERROR: "For the partitioned engine it is necessary to define all %-.64s", - ER_TOO_MANY_PARTITIONS_ERROR: "Too many partitions (including subpartitions) were defined", - ER_SUBPARTITION_ERROR: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", - ER_CANT_CREATE_HANDLER_FILE: "Failed to create specific handler file", - ER_BLOB_FIELD_IN_PART_FUNC_ERROR: "A BLOB field is not allowed in partition function", - ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF: "A %-.192s must include all columns in the table's partitioning function", - ER_NO_PARTS_ERROR: "Number of %-.64s = 0 is not an allowed value", - ER_PARTITION_MGMT_ON_NONPARTITIONED: "Partition management on a not partitioned table is not possible", - ER_FOREIGN_KEY_ON_PARTITIONED: "Foreign key clause is not yet supported in conjunction with partitioning", - ER_DROP_PARTITION_NON_EXISTENT: "Error in list of partitions to %-.64s", - ER_DROP_LAST_PARTITION: "Cannot remove all partitions, use DROP TABLE instead", - ER_COALESCE_ONLY_ON_HASH_PARTITION: "COALESCE PARTITION can only be used on HASH/KEY partitions", - ER_REORG_HASH_ONLY_ON_SAME_NO: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", - ER_REORG_NO_PARAM_ERROR: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", - ER_ONLY_ON_RANGE_LIST_PARTITION: "%-.64s PARTITION can only be used on RANGE/LIST partitions", - ER_ADD_PARTITION_SUBPART_ERROR: "Trying to Add partition(s) with wrong number of subpartitions", - ER_ADD_PARTITION_NO_NEW_PARTITION: "At least one partition must be added", - ER_COALESCE_PARTITION_NO_PARTITION: "At least one partition must be coalesced", - ER_REORG_PARTITION_NOT_EXIST: "More partitions to reorganize than there are partitions", - ER_SAME_NAME_PARTITION: "Duplicate partition name %-.192s", - ER_NO_BINLOG_ERROR: "It is not allowed to shut off binlog on this command", - ER_CONSECUTIVE_REORG_PARTITIONS: "When reorganizing a set of partitions they must be in consecutive order", - ER_REORG_OUTSIDE_RANGE: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", - ER_PARTITION_FUNCTION_FAILURE: "Partition function not supported in this version for this handler", - ER_PART_STATE_ERROR: "Partition state cannot be defined from CREATE/ALTER TABLE", - ER_LIMITED_PART_RANGE: "The %-.64s handler only supports 32 bit integers in VALUES", - ER_PLUGIN_IS_NOT_LOADED: "Plugin '%-.192s' is not loaded", - ER_WRONG_VALUE: "Incorrect %-.32s value: '%-.128s'", - ER_NO_PARTITION_FOR_GIVEN_VALUE: "Table has no partition for value %-.64s", - ER_FILEGROUP_OPTION_ONLY_ONCE: "It is not allowed to specify %s more than once", - ER_CREATE_FILEGROUP_FAILED: "Failed to create %s", - ER_DROP_FILEGROUP_FAILED: "Failed to drop %s", - ER_TABLESPACE_AUTO_EXTEND_ERROR: "The handler doesn't support autoextend of tablespaces", - ER_WRONG_SIZE_NUMBER: "A size parameter was incorrectly specified, either number or on the form 10M", - ER_SIZE_OVERFLOW_ERROR: "The size number was correct but we don't allow the digit part to be more than 2 billion", - ER_ALTER_FILEGROUP_FAILED: "Failed to alter: %s", - ER_BINLOG_ROW_LOGGING_FAILED: "Writing one row to the row-based binary log failed", - ER_BINLOG_ROW_WRONG_TABLE_DEF: "Table definition on master and slave does not match: %s", - ER_BINLOG_ROW_RBR_TO_SBR: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", - ER_EVENT_ALREADY_EXISTS: "Event '%-.192s' already exists", - ER_EVENT_STORE_FAILED: "Failed to store event %s. Error code %d from storage engine.", - ER_EVENT_DOES_NOT_EXIST: "Unknown event '%-.192s'", - ER_EVENT_CANT_ALTER: "Failed to alter event '%-.192s'", - ER_EVENT_DROP_FAILED: "Failed to drop %s", - ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG: "INTERVAL is either not positive or too big", - ER_EVENT_ENDS_BEFORE_STARTS: "ENDS is either invalid or before STARTS", - ER_EVENT_EXEC_TIME_IN_THE_PAST: "Event execution time is in the past. Event has been disabled", - ER_EVENT_OPEN_TABLE_FAILED: "Failed to open mysql.event", - ER_EVENT_NEITHER_M_EXPR_NOR_M_AT: "No datetime expression provided", - ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE: "Cannot load from mysql.%s. The table is probably corrupted", - ER_EVENT_CANNOT_DELETE: "Failed to delete the event from mysql.event", - ER_EVENT_COMPILE_ERROR: "Error during compilation of event's body", - ER_EVENT_SAME_NAME: "Same old and new event name", - ER_EVENT_DATA_TOO_LONG: "Data for column '%s' too long", - ER_DROP_INDEX_FK: "Cannot drop index '%-.192s': needed in a foreign key constraint", - ER_WARN_DEPRECATED_SYNTAX_WITH_VER: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", - ER_CANT_WRITE_LOCK_LOG_TABLE: "You can't write-lock a log table. Only read access is possible", - ER_CANT_LOCK_LOG_TABLE: "You can't use locks with log tables.", - ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", - ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error.", - ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR: "Cannot switch out of the row-based binary log format when the session has open temporary tables", - ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT: "Cannot change the binary logging format inside a stored function or trigger", - ER_NDB_CANT_SWITCH_BINLOG_FORMAT: "The NDB cluster engine does not support changing the binlog format on the fly yet", - ER_PARTITION_NO_TEMPORARY: "Cannot create temporary table with partitions", - ER_PARTITION_CONST_DOMAIN_ERROR: "Partition constant is out of partition function domain", - ER_PARTITION_FUNCTION_IS_NOT_ALLOWED: "This partition function is not allowed", - ER_DDL_LOG_ERROR: "Error in DDL log", - ER_NULL_IN_VALUES_LESS_THAN: "Not allowed to use NULL value in VALUES LESS THAN", - ER_WRONG_PARTITION_NAME: "Incorrect partition name", - ER_CANT_CHANGE_TX_CHARACTERISTICS: "Transaction characteristics can't be changed while a transaction is in progress", - ER_DUP_ENTRY_AUTOINCREMENT_CASE: "ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", - ER_EVENT_MODIFY_QUEUE_ERROR: "Internal scheduler error %d", - ER_EVENT_SET_VAR_ERROR: "Error during starting/stopping of the scheduler. Error code %u", - ER_PARTITION_MERGE_ERROR: "Engine cannot be used in partitioned tables", - ER_CANT_ACTIVATE_LOG: "Cannot activate '%-.64s' log", - ER_RBR_NOT_AVAILABLE: "The server was not built with row-based replication", - ER_BASE64_DECODE_ERROR: "Decoding of base64 string failed", - ER_EVENT_RECURSION_FORBIDDEN: "Recursion of EVENT DDL statements is forbidden when body is present", - ER_EVENTS_DB_ERROR: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", - ER_ONLY_INTEGERS_ALLOWED: "Only integers allowed as number here", - ER_UNSUPORTED_LOG_ENGINE: "This storage engine cannot be used for log tables\"", - ER_BAD_LOG_STATEMENT: "You cannot '%s' a log table if logging is enabled", - ER_CANT_RENAME_LOG_TABLE: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", - ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: "Incorrect parameter count in the call to native function '%-.192s'", - ER_WRONG_PARAMETERS_TO_NATIVE_FCT: "Incorrect parameters in the call to native function '%-.192s'", - ER_WRONG_PARAMETERS_TO_STORED_FCT: "Incorrect parameters in the call to stored function '%-.192s'", - ER_NATIVE_FCT_NAME_COLLISION: "This function '%-.192s' has the same name as a native function", - ER_DUP_ENTRY_WITH_KEY_NAME: "Duplicate entry '%-.64s' for key '%-.192s'", - ER_BINLOG_PURGE_EMFILE: "Too many files opened, please execute the command again", - ER_EVENT_CANNOT_CREATE_IN_THE_PAST: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", - ER_EVENT_CANNOT_ALTER_IN_THE_PAST: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", - ER_SLAVE_INCIDENT: "The incident %s occured on the master. Message: %-.64s", - ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT: "Table has no partition for some existing values", - ER_BINLOG_UNSAFE_STATEMENT: "Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. %s", - ER_SLAVE_FATAL_ERROR: "Fatal error: %s", - ER_SLAVE_RELAY_LOG_READ_FAILURE: "Relay log read failure: %s", - ER_SLAVE_RELAY_LOG_WRITE_FAILURE: "Relay log write failure: %s", - ER_SLAVE_CREATE_EVENT_FAILURE: "Failed to create %s", - ER_SLAVE_MASTER_COM_FAILURE: "Master command %s failed: %s", - ER_BINLOG_LOGGING_IMPOSSIBLE: "Binary logging not possible. Message: %s", - ER_VIEW_NO_CREATION_CTX: "View `%-.64s`.`%-.64s` has no creation context", - ER_VIEW_INVALID_CREATION_CTX: "Creation context of view `%-.64s`.`%-.64s' is invalid", - ER_SR_INVALID_CREATION_CTX: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", - ER_TRG_CORRUPTED_FILE: "Corrupted TRG file for table `%-.64s`.`%-.64s`", - ER_TRG_NO_CREATION_CTX: "Triggers for table `%-.64s`.`%-.64s` have no creation context", - ER_TRG_INVALID_CREATION_CTX: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", - ER_EVENT_INVALID_CREATION_CTX: "Creation context of event `%-.64s`.`%-.64s` is invalid", - ER_TRG_CANT_OPEN_TABLE: "Cannot open table for trigger `%-.64s`.`%-.64s`", - ER_CANT_CREATE_SROUTINE: "Cannot create stored routine `%-.64s`. Check warnings", - ER_NEVER_USED: "Ambiguous slave modes combination. %s", - ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", - ER_SLAVE_CORRUPT_EVENT: "Corrupted replication event was detected", - ER_LOAD_DATA_INVALID_COLUMN: "Invalid column reference (%-.64s) in LOAD DATA", - ER_LOG_PURGE_NO_FILE: "Being purged log %s was not found", - ER_XA_RBTIMEOUT: "XA_RBTIMEOUT: Transaction branch was rolled back: took too long", - ER_XA_RBDEADLOCK: "XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected", - ER_NEED_REPREPARE: "Prepared statement needs to be re-prepared", - ER_DELAYED_NOT_SUPPORTED: "DELAYED option not supported for table '%-.192s'", - WARN_NO_MASTER_INFO: "The master info structure does not exist", - WARN_OPTION_IGNORED: "<%-.64s> option ignored", - WARN_PLUGIN_DELETE_BUILTIN: "Built-in plugins cannot be deleted", - WARN_PLUGIN_BUSY: "Plugin is busy and will be uninstalled on shutdown", - ER_VARIABLE_IS_READONLY: "%s variable '%s' is read-only. Use SET %s to assign the value", - ER_WARN_ENGINE_TRANSACTION_ROLLBACK: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", - ER_SLAVE_HEARTBEAT_FAILURE: "Unexpected master's heartbeat data: %s", - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", - ER_NDB_REPLICATION_SCHEMA_ERROR: "Bad schema for mysql.ndb_replication table. Message: %-.64s", - ER_CONFLICT_FN_PARSE_ERROR: "Error in parsing conflict function. Message: %-.64s", - ER_EXCEPTIONS_WRITE_ERROR: "Write to exceptions table failed. Message: %-.128s\"", - ER_TOO_LONG_TABLE_COMMENT: "Comment for table '%-.64s' is too long (max = %lu)", - ER_TOO_LONG_FIELD_COMMENT: "Comment for field '%-.64s' is too long (max = %lu)", - ER_FUNC_INEXISTENT_NAME_COLLISION: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", - ER_DATABASE_NAME: "Database", - ER_TABLE_NAME: "Table", - ER_PARTITION_NAME: "Partition", - ER_SUBPARTITION_NAME: "Subpartition", - ER_TEMPORARY_NAME: "Temporary", - ER_RENAMED_NAME: "Renamed", - ER_TOO_MANY_CONCURRENT_TRXS: "Too many active concurrent transactions", - WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED: "Non-ASCII separator arguments are not fully supported", - ER_DEBUG_SYNC_TIMEOUT: "debug sync point wait timed out", - ER_DEBUG_SYNC_HIT_LIMIT: "debug sync point hit limit reached", - ER_DUP_SIGNAL_SET: "Duplicate condition information item '%s'", - ER_SIGNAL_WARN: "Unhandled user-defined warning condition", - ER_SIGNAL_NOT_FOUND: "Unhandled user-defined not found condition", - ER_SIGNAL_EXCEPTION: "Unhandled user-defined exception condition", - ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER: "RESIGNAL when handler not active", - ER_SIGNAL_BAD_CONDITION_TYPE: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", - WARN_COND_ITEM_TRUNCATED: "Data truncated for condition item '%s'", - ER_COND_ITEM_TOO_LONG: "Data too long for condition item '%s'", - ER_UNKNOWN_LOCALE: "Unknown locale: '%-.64s'", - ER_SLAVE_IGNORE_SERVER_IDS: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", - ER_QUERY_CACHE_DISABLED: "Query cache is disabled; restart the server with query_cache_type=1 to enable it", - ER_SAME_NAME_PARTITION_FIELD: "Duplicate partition field name '%-.192s'", - ER_PARTITION_COLUMN_LIST_ERROR: "Inconsistency in usage of column lists for partitioning", - ER_WRONG_TYPE_COLUMN_VALUE_ERROR: "Partition column values of incorrect type", - ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR: "Too many fields in '%-.192s'", - ER_MAXVALUE_IN_VALUES_IN: "Cannot use MAXVALUE as value in VALUES IN", - ER_TOO_MANY_VALUES_ERROR: "Cannot have more than one value for this type of %-.64s partitioning", - ER_ROW_SINGLE_PARTITION_FIELD_ERROR: "Row expressions in VALUES IN only allowed for multi-field column partitioning", - ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD: "Field '%-.192s' is of a not allowed type for this type of partitioning", - ER_PARTITION_FIELDS_TOO_LONG: "The total length of the partitioning fields is too large", - ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", - ER_BINLOG_ROW_MODE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", - ER_BINLOG_UNSAFE_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOG_FORMAT = MIXED. %s", - ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", - ER_BINLOG_STMT_MODE_AND_ROW_ENGINE: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", - ER_BINLOG_ROW_INJECTION_AND_STMT_MODE: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.", - ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", - ER_BINLOG_UNSAFE_LIMIT: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", - ER_BINLOG_UNSAFE_INSERT_DELAYED: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", - ER_BINLOG_UNSAFE_SYSTEM_TABLE: "The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves.", - ER_BINLOG_UNSAFE_AUTOINC_COLUMNS: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.", - ER_BINLOG_UNSAFE_UDF: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", - ER_BINLOG_UNSAFE_SYSTEM_VARIABLE: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", - ER_BINLOG_UNSAFE_SYSTEM_FUNCTION: "Statement is unsafe because it uses a system function that may return a different value on the slave.", - ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", - ER_MESSAGE_AND_STATEMENT: "%s Statement: %s", - ER_SLAVE_CONVERSION_FAILED: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", - ER_SLAVE_CANT_CREATE_CONVERSION: "Can't create conversion table for table '%-.192s.%-.192s'", - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT: "Cannot modify @@session.binlog_format inside a transaction", - ER_PATH_LENGTH: "The path specified for %.64s is too long.", - ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT: "'%s' is deprecated and will be removed in a future release.", - ER_WRONG_NATIVE_TABLE_STRUCTURE: "Native table '%-.64s'.'%-.64s' has the wrong structure", - ER_WRONG_PERFSCHEMA_USAGE: "Invalid performance_schema usage.", - ER_WARN_I_S_SKIPPED_TABLE: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT: "Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction", - ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT: "Cannot change the binlog direct flag inside a stored function or trigger", - ER_SPATIAL_MUST_HAVE_GEOM_COL: "A SPATIAL index may only contain a geometrical type column", - ER_TOO_LONG_INDEX_COMMENT: "Comment for index '%-.64s' is too long (max = %lu)", - ER_LOCK_ABORTED: "Wait on a lock was aborted due to a pending exclusive lock", - ER_DATA_OUT_OF_RANGE: "%s value is out of range in '%s'", - ER_WRONG_SPVAR_TYPE_IN_LIMIT: "A variable of a non-integer based type in LIMIT clause", - ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", - ER_BINLOG_UNSAFE_MIXED_STATEMENT: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", - ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN: "Cannot modify @@session.sql_log_bin inside a transaction", - ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN: "Cannot change the sql_log_bin inside a stored function or trigger", - ER_FAILED_READ_FROM_PAR_FILE: "Failed to read from the .par file", - ER_VALUES_IS_NOT_INT_TYPE_ERROR: "VALUES value for partition '%-.64s' must have type INT", - ER_ACCESS_DENIED_NO_PASSWORD_ERROR: "Access denied for user '%-.48s'@'%-.64s'", - ER_SET_PASSWORD_AUTH_PLUGIN: "SET PASSWORD has no significance for users authenticating via plugins", - ER_GRANT_PLUGIN_USER_EXISTS: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", - ER_TRUNCATE_ILLEGAL_FK: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", - ER_PLUGIN_IS_PERMANENT: "Plugin '%s' is force_plus_permanent and can not be unloaded", - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", - ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX: "The requested value for the heartbeat period exceeds the value of `slave_net_timeout' seconds. A sensible value for the period should be less than the timeout.", - ER_STMT_CACHE_FULL: "Multi-row statements required more than 'max_binlog_stmt_cache_size' bytes of storage; increase this mysqld variable and try again", - ER_MULTI_UPDATE_KEY_CONFLICT: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", - ER_TABLE_NEEDS_REBUILD: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", - WARN_OPTION_BELOW_LIMIT: "The value of '%s' should be no less than the value of '%s'", - ER_INDEX_COLUMN_TOO_LONG: "Index column size too large. The maximum column size is %lu bytes.", - ER_ERROR_IN_TRIGGER_BODY: "Trigger '%-.64s' has an error in its body: '%-.256s'", - ER_ERROR_IN_UNKNOWN_TRIGGER_BODY: "Unknown trigger has an error in its body: '%-.256s'", - ER_INDEX_CORRUPT: "Index %s is corrupted", - ER_UNDO_RECORD_TOO_BIG: "Undo log record is too big.", - ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_REPLACE_SELECT: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_UPDATE_IGNORE: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ER_PLUGIN_NO_UNINSTALL: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", - ER_PLUGIN_NO_INSTALL: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", - ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", - ER_BINLOG_UNSAFE_INSERT_TWO_KEYS: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", - ER_TABLE_IN_FK_CHECK: "Table is being used in foreign key check.", - ER_UNSUPPORTED_ENGINE: "Storage engine '%s' does not support system tables. [%s.%s]", - ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", - ER_CANNOT_LOAD_FROM_TABLE_V2: "Cannot load from %s.%s. The table is probably corrupted", - ER_MASTER_DELAY_VALUE_OUT_OF_RANGE: "The requested value %u for the master delay exceeds the maximum %u", - ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT: "Only Format_description_log_event and row events are allowed in BINLOG statements (but %s was provided)", - ER_PARTITION_EXCHANGE_DIFFERENT_OPTION: "Non matching attribute '%-.64s' between partition and table", - ER_PARTITION_EXCHANGE_PART_TABLE: "Table to exchange with partition is partitioned: '%-.64s'", - ER_PARTITION_EXCHANGE_TEMP_TABLE: "Table to exchange with partition is temporary: '%-.64s'", - ER_PARTITION_INSTEAD_OF_SUBPARTITION: "Subpartitioned table, use subpartition instead of partition", - ER_UNKNOWN_PARTITION: "Unknown partition '%-.64s' in table '%-.64s'", - ER_TABLES_DIFFERENT_METADATA: "Tables have different definitions", - ER_ROW_DOES_NOT_MATCH_PARTITION: "Found a row that does not match the partition", - ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX: "Option binlog_cache_size (%lu) is greater than max_binlog_cache_size (%lu); setting binlog_cache_size equal to max_binlog_cache_size.", - ER_WARN_INDEX_NOT_APPLICABLE: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", - ER_PARTITION_EXCHANGE_FOREIGN_KEY: "Table to exchange with partition has foreign key references: '%-.64s'", - ER_NO_SUCH_KEY_VALUE: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", - ER_RPL_INFO_DATA_TOO_LONG: "Data for column '%s' too long", - ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from network.", - ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from a log file.", - ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX: "Option binlog_stmt_cache_size (%lu) is greater than max_binlog_stmt_cache_size (%lu); setting binlog_stmt_cache_size equal to max_binlog_stmt_cache_size.", - ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT: "Can't update table '%-.192s' while '%-.192s' is being created.", - ER_PARTITION_CLAUSE_ON_NONPARTITIONED: "PARTITION () clause on non partitioned table", - ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET: "Found a row not matching the given partition set", - ER_NO_SUCH_PARTITION__UNUSED: "partition '%-.64s' doesn't exist", - ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE: "Failure while changing the type of replication repository: %s.", - ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE: "The creation of some temporary tables could not be rolled back.", - ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE: "Some temporary tables were dropped, but these operations could not be rolled back.", - ER_MTS_FEATURE_IS_NOT_SUPPORTED: "%s is not supported in multi-threaded slave mode. %s", - ER_MTS_UPDATED_DBS_GREATER_MAX: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", - ER_MTS_CANT_PARALLEL: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", - ER_MTS_INCONSISTENT_DATA: "%s", - ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING: "FULLTEXT index is not supported for partitioned tables.", - ER_DA_INVALID_CONDITION_NUMBER: "Invalid condition number", - ER_INSECURE_PLAIN_TEXT: "Sending passwords in plain text without SSL/TLS is extremely insecure.", - ER_INSECURE_CHANGE_MASTER: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", - ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", - ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", - ER_SQLTHREAD_WITH_SECURE_SLAVE: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", - ER_TABLE_HAS_NO_FT: "The table does not have FULLTEXT index to support this query", - ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER: "The system variable %.200s cannot be set in stored functions or triggers.", - ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION: "The system variable %.200s cannot be set when there is an ongoing transaction.", - ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST: "The system variable @@SESSION.GTID_NEXT has the value %.200s, which is not listed in @@SESSION.GTID_NEXT_LIST.", - ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL: "When @@SESSION.GTID_NEXT_LIST == NULL, the system variable @@SESSION.GTID_NEXT cannot change inside a transaction.", - ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION: "The statement 'SET %.200s' cannot invoke a stored function.", - ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL: "The system variable @@SESSION.GTID_NEXT cannot be 'AUTOMATIC' when @@SESSION.GTID_NEXT_LIST is non-NULL.", - ER_SKIPPING_LOGGED_TRANSACTION: "Skipping transaction %.200s because it has already been executed and logged.", - ER_MALFORMED_GTID_SET_SPECIFICATION: "Malformed GTID set specification '%.200s'.", - ER_MALFORMED_GTID_SET_ENCODING: "Malformed GTID set encoding.", - ER_MALFORMED_GTID_SPECIFICATION: "Malformed GTID specification '%.200s'.", - ER_GNO_EXHAUSTED: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new server_uuid.", - ER_BAD_SLAVE_AUTO_POSITION: "Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.", - ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON: "CHANGE MASTER TO MASTER_AUTO_POSITION = 1 can only be executed when @@GLOBAL.GTID_MODE = ON.", - ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTID_NEXT != AUTOMATIC or @@SESSION.GTID_NEXT_LIST != NULL.", - ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON: "@@GLOBAL.GTID_MODE = ON or UPGRADE_STEP_2 requires @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.", - ER_GTID_MODE_REQUIRES_BINLOG: "@@GLOBAL.GTID_MODE = ON or UPGRADE_STEP_1 or UPGRADE_STEP_2 requires --log-bin and --log-slave-updates.", - ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF: "@@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.", - ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON: "@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.", - ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF: "@@SESSION.GTID_NEXT_LIST cannot be set to a non-NULL value when @@GLOBAL.GTID_MODE = OFF.", - ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF: "Found a Gtid_log_event or Previous_gtids_log_event when @@GLOBAL.GTID_MODE = OFF.", - ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE: "When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", - ER_GTID_UNSAFE_CREATE_SELECT: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.", - ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION: "When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", - ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME: "The value of @@GLOBAL.GTID_MODE can only change one step at a time: OFF <-> UPGRADE_STEP_1 <-> UPGRADE_STEP_2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", - ER_MASTER_HAS_PURGED_REQUIRED_GTIDS: "The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", - ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID: "@@SESSION.GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", - ER_UNKNOWN_EXPLAIN_FORMAT: "Unknown EXPLAIN format name: '%s'", - ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION: "Cannot execute statement in a READ ONLY transaction.", - ER_TOO_LONG_TABLE_PARTITION_COMMENT: "Comment for table partition '%-.64s' is too long (max = %lu)", - ER_SLAVE_CONFIGURATION: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", - ER_INNODB_FT_LIMIT: "InnoDB presently supports one FULLTEXT index creation at a time", - ER_INNODB_NO_FT_TEMP_TABLE: "Cannot create FULLTEXT index on temporary InnoDB table", - ER_INNODB_FT_WRONG_DOCID_COLUMN: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ER_INNODB_FT_WRONG_DOCID_INDEX: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ER_INNODB_ONLINE_LOG_TOO_BIG: "Creating index '%-.192s' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.", - ER_UNKNOWN_ALTER_ALGORITHM: "Unknown ALGORITHM '%s'", - ER_UNKNOWN_ALTER_LOCK: "Unknown LOCK type '%s'", - ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", - ER_MTS_RECOVERY_FAILURE: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", - ER_MTS_RESET_WORKERS: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", - ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ER_SLAVE_SILENT_RETRY_TRANSACTION: "Slave must silently retry current transaction", - ER_DISCARD_FK_CHECKS_RUNNING: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", - ER_TABLE_SCHEMA_MISMATCH: "Schema mismatch (%s)", - ER_TABLE_IN_SYSTEM_TABLESPACE: "Table '%-.192s' in system tablespace", - ER_IO_READ_ERROR: "IO Read error: (%lu, %s) %s", - ER_IO_WRITE_ERROR: "IO Write error: (%lu, %s) %s", - ER_TABLESPACE_MISSING: "Tablespace is missing for table '%-.192s'", - ER_TABLESPACE_EXISTS: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", - ER_TABLESPACE_DISCARDED: "Tablespace has been discarded for table '%-.192s'", - ER_INTERNAL_ERROR: "Internal error: %s", - ER_INNODB_IMPORT_ERROR: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %lu : '%s'", - ER_INNODB_INDEX_CORRUPT: "Index corrupt: %s", - ER_INVALID_YEAR_COLUMN_LENGTH: "YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead.", - ER_NOT_VALID_PASSWORD: "Your password does not satisfy the current policy requirements", - ER_MUST_CHANGE_PASSWORD: "You must SET PASSWORD before executing this statement", - ER_FK_NO_INDEX_CHILD: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", - ER_FK_NO_INDEX_PARENT: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", - ER_FK_FAIL_ADD_SYSTEM: "Failed to add the foreign key constraint '%s' to system tables", - ER_FK_CANNOT_OPEN_PARENT: "Failed to open the referenced table '%s'", - ER_FK_INCORRECT_OPTION: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", - ER_FK_DUP_NAME: "Duplicate foreign key constraint name '%s'", - ER_PASSWORD_FORMAT: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", - ER_FK_COLUMN_CANNOT_DROP: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", - ER_FK_COLUMN_CANNOT_DROP_CHILD: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", - ER_FK_COLUMN_NOT_NULL: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", - ER_DUP_INDEX: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", - ER_FK_COLUMN_CANNOT_CHANGE: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", - ER_FK_COLUMN_CANNOT_CHANGE_CHILD: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", - ER_FK_CANNOT_DELETE_PARENT: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", - ER_MALFORMED_PACKET: "Malformed communication packet.", - ER_READ_ONLY_MODE: "Running in read-only mode", - ER_GTID_NEXT_TYPE_UNDEFINED_GROUP: "When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTID_NEXT before a transaction and forgot to set @@SESSION.GTID_NEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTID_NEXT is '%s'.", - ER_VARIABLE_NOT_SETTABLE_IN_SP: "The system variable %.200s cannot be set in stored procedures.", - ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF: "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON.", - ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY: "@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.", - ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY: "@@GLOBAL.GTID_PURGED can only be set when there are no ongoing transactions (not even in other clients).", - ER_GTID_PURGED_WAS_CHANGED: "@@GLOBAL.GTID_PURGED was changed from '%s' to '%s'.", - ER_GTID_EXECUTED_WAS_CHANGED: "@@GLOBAL.GTID_EXECUTED was changed from '%s' to '%s'.", - ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES: "Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT, and both replicated and non replicated tables are written to.", - ER_ALTER_OPERATION_NOT_SUPPORTED: "%s is not supported for this operation. Try %s.", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON: "%s is not supported. Reason: %s. Try %s.", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY: "COPY algorithm requires a lock", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION: "Partition specific operations do not yet support LOCK/ALGORITHM", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME: "Columns participating in a foreign key are renamed", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE: "Cannot change column type INPLACE", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK: "Adding foreign keys needs foreign_key_checks=OFF", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK: "Dropping a primary key is not allowed without also adding a new primary key", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC: "Adding an auto-increment column requires a lock", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS: "Cannot replace hidden FTS_DOC_ID with a user-visible one", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS: "Cannot drop or rename FTS_DOC_ID", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS: "Fulltext index creation requires a lock", - ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE: "sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", - ER_DUP_UNKNOWN_IN_INDEX: "Duplicate entry for key '%-.192s'", - ER_IDENT_CAUSES_TOO_LONG_PATH: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL: "cannot silently convert NULL values, as required in this SQL_MODE", - ER_MUST_CHANGE_PASSWORD_LOGIN: "Your password has expired. To log in you must change it using a client that supports expired passwords.", - ER_ROW_IN_WRONG_PARTITION: "Found a row in wrong partition %s", -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/error.go b/vendor/github.com/siddontang/go-mysql/mysql/error.go deleted file mode 100644 index 876a4082..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/error.go +++ /dev/null @@ -1,66 +0,0 @@ -package mysql - -import ( - "fmt" - - "github.com/juju/errors" -) - -var ( - ErrBadConn = errors.New("connection was bad") - ErrMalformPacket = errors.New("Malform packet error") - - ErrTxDone = errors.New("sql: Transaction has already been committed or rolled back") -) - -type MyError struct { - Code uint16 - Message string - State string -} - -func (e *MyError) Error() string { - return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) -} - -//default mysql error, must adapt errname message format -func NewDefaultError(errCode uint16, args ...interface{}) *MyError { - e := new(MyError) - e.Code = errCode - - if s, ok := MySQLState[errCode]; ok { - e.State = s - } else { - e.State = DEFAULT_MYSQL_STATE - } - - if format, ok := MySQLErrName[errCode]; ok { - e.Message = fmt.Sprintf(format, args...) - } else { - e.Message = fmt.Sprint(args...) - } - - return e -} - -func NewError(errCode uint16, message string) *MyError { - e := new(MyError) - e.Code = errCode - - if s, ok := MySQLState[errCode]; ok { - e.State = s - } else { - e.State = DEFAULT_MYSQL_STATE - } - - e.Message = message - - return e -} - -func ErrorCode(errMsg string) (code int) { - var tmpStr string - // golang scanf doesn't support %*,so I used a temporary variable - fmt.Sscanf(errMsg, "%s%d", &tmpStr, &code) - return -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/field.go b/vendor/github.com/siddontang/go-mysql/mysql/field.go deleted file mode 100644 index c26f6a29..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/field.go +++ /dev/null @@ -1,157 +0,0 @@ -package mysql - -import ( - "encoding/binary" -) - -type FieldData []byte - -type Field struct { - Data FieldData - Schema []byte - Table []byte - OrgTable []byte - Name []byte - OrgName []byte - Charset uint16 - ColumnLength uint32 - Type uint8 - Flag uint16 - Decimal uint8 - - DefaultValueLength uint64 - DefaultValue []byte -} - -func (p FieldData) Parse() (f *Field, err error) { - f = new(Field) - - f.Data = p - - var n int - pos := 0 - //skip catelog, always def - n, err = SkipLengthEnodedString(p) - if err != nil { - return - } - pos += n - - //schema - f.Schema, _, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return - } - pos += n - - //table - f.Table, _, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return - } - pos += n - - //org_table - f.OrgTable, _, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return - } - pos += n - - //name - f.Name, _, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return - } - pos += n - - //org_name - f.OrgName, _, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return - } - pos += n - - //skip oc - pos += 1 - - //charset - f.Charset = binary.LittleEndian.Uint16(p[pos:]) - pos += 2 - - //column length - f.ColumnLength = binary.LittleEndian.Uint32(p[pos:]) - pos += 4 - - //type - f.Type = p[pos] - pos++ - - //flag - f.Flag = binary.LittleEndian.Uint16(p[pos:]) - pos += 2 - - //decimals 1 - f.Decimal = p[pos] - pos++ - - //filter [0x00][0x00] - pos += 2 - - f.DefaultValue = nil - //if more data, command was field list - if len(p) > pos { - //length of default value lenenc-int - f.DefaultValueLength, _, n = LengthEncodedInt(p[pos:]) - pos += n - - if pos+int(f.DefaultValueLength) > len(p) { - err = ErrMalformPacket - return - } - - //default value string[$len] - f.DefaultValue = p[pos:(pos + int(f.DefaultValueLength))] - } - - return -} - -func (f *Field) Dump() []byte { - if f == nil { - f = &Field{} - } - if f.Data != nil { - return []byte(f.Data) - } - - l := len(f.Schema) + len(f.Table) + len(f.OrgTable) + len(f.Name) + len(f.OrgName) + len(f.DefaultValue) + 48 - - data := make([]byte, 0, l) - - data = append(data, PutLengthEncodedString([]byte("def"))...) - - data = append(data, PutLengthEncodedString(f.Schema)...) - - data = append(data, PutLengthEncodedString(f.Table)...) - data = append(data, PutLengthEncodedString(f.OrgTable)...) - - data = append(data, PutLengthEncodedString(f.Name)...) - data = append(data, PutLengthEncodedString(f.OrgName)...) - - data = append(data, 0x0c) - - data = append(data, Uint16ToBytes(f.Charset)...) - data = append(data, Uint32ToBytes(f.ColumnLength)...) - data = append(data, f.Type) - data = append(data, Uint16ToBytes(f.Flag)...) - data = append(data, f.Decimal) - data = append(data, 0, 0) - - if f.DefaultValue != nil { - data = append(data, Uint64ToBytes(f.DefaultValueLength)...) - data = append(data, f.DefaultValue...) - } - - return data -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/gtid.go b/vendor/github.com/siddontang/go-mysql/mysql/gtid.go deleted file mode 100644 index cde99015..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/gtid.go +++ /dev/null @@ -1,29 +0,0 @@ -package mysql - -import "github.com/juju/errors" - -type GTIDSet interface { - String() string - - // Encode GTID set into binary format used in binlog dump commands - Encode() []byte - - Equal(o GTIDSet) bool - - Contain(o GTIDSet) bool - - Update(GTIDStr string) error - - Clone() GTIDSet -} - -func ParseGTIDSet(flavor string, s string) (GTIDSet, error) { - switch flavor { - case MySQLFlavor: - return ParseMysqlGTIDSet(s) - case MariaDBFlavor: - return ParseMariadbGTIDSet(s) - default: - return nil, errors.Errorf("invalid flavor %s", flavor) - } -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/mariadb_gtid.go b/vendor/github.com/siddontang/go-mysql/mysql/mariadb_gtid.go deleted file mode 100644 index 6f73767e..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/mariadb_gtid.go +++ /dev/null @@ -1,217 +0,0 @@ -package mysql - -import ( - "bytes" - "fmt" - "strconv" - "strings" - - "github.com/juju/errors" - "github.com/siddontang/go/hack" -) - -// MariadbGTID represent mariadb gtid, [domain ID]-[server-id]-[sequence] -type MariadbGTID struct { - DomainID uint32 - ServerID uint32 - SequenceNumber uint64 -} - -// ParseMariadbGTID parses mariadb gtid, [domain ID]-[server-id]-[sequence] -func ParseMariadbGTID(str string) (*MariadbGTID, error) { - if len(str) == 0 { - return &MariadbGTID{0, 0, 0}, nil - } - - seps := strings.Split(str, "-") - - gtid := new(MariadbGTID) - - if len(seps) != 3 { - return gtid, errors.Errorf("invalid Mariadb GTID %v, must domain-server-sequence", str) - } - - domainID, err := strconv.ParseUint(seps[0], 10, 32) - if err != nil { - return gtid, errors.Errorf("invalid MariaDB GTID Domain ID (%v): %v", seps[0], err) - } - - serverID, err := strconv.ParseUint(seps[1], 10, 32) - if err != nil { - return gtid, errors.Errorf("invalid MariaDB GTID Server ID (%v): %v", seps[1], err) - } - - sequenceID, err := strconv.ParseUint(seps[2], 10, 64) - if err != nil { - return gtid, errors.Errorf("invalid MariaDB GTID Sequence number (%v): %v", seps[2], err) - } - - return &MariadbGTID{ - DomainID: uint32(domainID), - ServerID: uint32(serverID), - SequenceNumber: sequenceID}, nil -} - -func (gtid *MariadbGTID) String() string { - if gtid.DomainID == 0 && gtid.ServerID == 0 && gtid.SequenceNumber == 0 { - return "" - } - - return fmt.Sprintf("%d-%d-%d", gtid.DomainID, gtid.ServerID, gtid.SequenceNumber) -} - -// Contain return whether one mariadb gtid covers another mariadb gtid -func (gtid *MariadbGTID) Contain(other *MariadbGTID) bool { - return gtid.DomainID == other.DomainID && gtid.SequenceNumber >= other.SequenceNumber -} - -// Clone clones a mariadb gtid -func (gtid *MariadbGTID) Clone() *MariadbGTID { - o := new(MariadbGTID) - *o = *gtid - return o -} - -func (gtid *MariadbGTID) forward(newer *MariadbGTID) error { - if newer.DomainID != gtid.DomainID { - return errors.Errorf("%s is not same with doamin of %s", newer, gtid) - } - - if newer.SequenceNumber <= gtid.SequenceNumber { - return errors.Errorf("out of order binlog appears with gtid %s vs current position gtid %s", newer, gtid) - } - - gtid.ServerID = newer.ServerID - gtid.SequenceNumber = newer.SequenceNumber - return nil -} - -// MariadbGTIDSet is a set of mariadb gtid -type MariadbGTIDSet struct { - Sets map[uint32]*MariadbGTID -} - -// ParseMariadbGTIDSet parses str into mariadb gtid sets -func ParseMariadbGTIDSet(str string) (GTIDSet, error) { - s := new(MariadbGTIDSet) - s.Sets = make(map[uint32]*MariadbGTID) - if str == "" { - return s, nil - } - - sp := strings.Split(str, ",") - - //todo, handle redundant same uuid - for i := 0; i < len(sp); i++ { - err := s.Update(sp[i]) - if err != nil { - return nil, errors.Trace(err) - } - } - return s, nil -} -// AddSet adds mariadb gtid into mariadb gtid set -func (s *MariadbGTIDSet) AddSet(gtid *MariadbGTID) error { - if gtid == nil { - return nil - } - - o, ok := s.Sets[gtid.DomainID] - if ok { - err := o.forward(gtid) - if err != nil { - return errors.Trace(err) - } - } else { - s.Sets[gtid.DomainID] = gtid - } - - return nil -} - -// Update updates mariadb gtid set -func (s *MariadbGTIDSet) Update(GTIDStr string) error { - gtid, err := ParseMariadbGTID(GTIDStr) - if err != nil { - return err - } - - err = s.AddSet(gtid) - return errors.Trace(err) -} - - -func (s *MariadbGTIDSet) String() string { - return hack.String(s.Encode()) -} - -// Encode encodes mariadb gtid set -func (s *MariadbGTIDSet) Encode() []byte { - var buf bytes.Buffer - sep := "" - for _, gtid := range s.Sets { - buf.WriteString(sep) - buf.WriteString(gtid.String()) - sep = "," - } - - return buf.Bytes() -} - -// Clone clones a mariadb gtid set -func (s *MariadbGTIDSet) Clone() GTIDSet { - clone := &MariadbGTIDSet{ - Sets: make(map[uint32]*MariadbGTID), - } - for domainID, gtid := range s.Sets { - clone.Sets[domainID] = gtid.Clone() - } - - return clone -} - -// Equal returns true if two mariadb gtid set is same, otherwise return false -func (s *MariadbGTIDSet) Equal(o GTIDSet) bool { - other, ok := o.(*MariadbGTIDSet) - if !ok { - return false - } - - if len(other.Sets) != len(s.Sets) { - return false - } - - for domainID, gtid := range other.Sets { - o, ok := s.Sets[domainID] - if !ok { - return false - } - - if *gtid != *o { - return false - } - } - - return true -} - -// Contain return whether one mariadb gtid set covers another mariadb gtid set -func (s *MariadbGTIDSet) Contain(o GTIDSet) bool { - other, ok := o.(*MariadbGTIDSet) - if !ok { - return false - } - - for doaminID, gtid := range other.Sets { - o, ok := s.Sets[doaminID] - if !ok { - return false - } - - if !o.Contain(gtid) { - return false - } - } - - return true -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/mysql_gtid.go b/vendor/github.com/siddontang/go-mysql/mysql/mysql_gtid.go deleted file mode 100644 index 618b7ebe..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/mysql_gtid.go +++ /dev/null @@ -1,435 +0,0 @@ -package mysql - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "sort" - "strconv" - "strings" - - "github.com/juju/errors" - "github.com/satori/go.uuid" - "github.com/siddontang/go/hack" -) - -// Like MySQL GTID Interval struct, [start, stop), left closed and right open -// See MySQL rpl_gtid.h -type Interval struct { - // The first GID of this interval. - Start int64 - // The first GID after this interval. - Stop int64 -} - -// Interval is [start, stop), but the GTID string's format is [n] or [n1-n2], closed interval -func parseInterval(str string) (i Interval, err error) { - p := strings.Split(str, "-") - switch len(p) { - case 1: - i.Start, err = strconv.ParseInt(p[0], 10, 64) - i.Stop = i.Start + 1 - case 2: - i.Start, err = strconv.ParseInt(p[0], 10, 64) - i.Stop, err = strconv.ParseInt(p[1], 10, 64) - i.Stop = i.Stop + 1 - default: - err = errors.Errorf("invalid interval format, must n[-n]") - } - - if err != nil { - return - } - - if i.Stop <= i.Start { - err = errors.Errorf("invalid interval format, must n[-n] and the end must >= start") - } - - return -} - -func (i Interval) String() string { - if i.Stop == i.Start+1 { - return fmt.Sprintf("%d", i.Start) - } else { - return fmt.Sprintf("%d-%d", i.Start, i.Stop-1) - } -} - -type IntervalSlice []Interval - -func (s IntervalSlice) Len() int { - return len(s) -} - -func (s IntervalSlice) Less(i, j int) bool { - if s[i].Start < s[j].Start { - return true - } else if s[i].Start > s[j].Start { - return false - } else { - return s[i].Stop < s[j].Stop - } -} - -func (s IntervalSlice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s IntervalSlice) Sort() { - sort.Sort(s) -} - -func (s IntervalSlice) Normalize() IntervalSlice { - var n IntervalSlice - if len(s) == 0 { - return n - } - - s.Sort() - - n = append(n, s[0]) - - for i := 1; i < len(s); i++ { - last := n[len(n)-1] - if s[i].Start > last.Stop { - n = append(n, s[i]) - continue - } else { - stop := s[i].Stop - if last.Stop > stop { - stop = last.Stop - } - n[len(n)-1] = Interval{last.Start, stop} - } - } - - return n -} - -// Return true if sub in s -func (s IntervalSlice) Contain(sub IntervalSlice) bool { - j := 0 - for i := 0; i < len(sub); i++ { - for ; j < len(s); j++ { - if sub[i].Start > s[j].Stop { - continue - } else { - break - } - } - if j == len(s) { - return false - } - - if sub[i].Start < s[j].Start || sub[i].Stop > s[j].Stop { - return false - } - } - - return true -} - -func (s IntervalSlice) Equal(o IntervalSlice) bool { - if len(s) != len(o) { - return false - } - - for i := 0; i < len(s); i++ { - if s[i].Start != o[i].Start || s[i].Stop != o[i].Stop { - return false - } - } - - return true -} - -func (s IntervalSlice) Compare(o IntervalSlice) int { - if s.Equal(o) { - return 0 - } else if s.Contain(o) { - return 1 - } else { - return -1 - } -} - -// Refer http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html -type UUIDSet struct { - SID uuid.UUID - - Intervals IntervalSlice -} - -func ParseUUIDSet(str string) (*UUIDSet, error) { - str = strings.TrimSpace(str) - sep := strings.Split(str, ":") - if len(sep) < 2 { - return nil, errors.Errorf("invalid GTID format, must UUID:interval[:interval]") - } - - var err error - s := new(UUIDSet) - if s.SID, err = uuid.FromString(sep[0]); err != nil { - return nil, errors.Trace(err) - } - - // Handle interval - for i := 1; i < len(sep); i++ { - if in, err := parseInterval(sep[i]); err != nil { - return nil, errors.Trace(err) - } else { - s.Intervals = append(s.Intervals, in) - } - } - - s.Intervals = s.Intervals.Normalize() - - return s, nil -} - -func NewUUIDSet(sid uuid.UUID, in ...Interval) *UUIDSet { - s := new(UUIDSet) - s.SID = sid - - s.Intervals = in - s.Intervals = s.Intervals.Normalize() - - return s -} - -func (s *UUIDSet) Contain(sub *UUIDSet) bool { - if !bytes.Equal(s.SID.Bytes(), sub.SID.Bytes()) { - return false - } - - return s.Intervals.Contain(sub.Intervals) -} - -func (s *UUIDSet) Bytes() []byte { - var buf bytes.Buffer - - buf.WriteString(s.SID.String()) - - for _, i := range s.Intervals { - buf.WriteString(":") - buf.WriteString(i.String()) - } - - return buf.Bytes() -} - -func (s *UUIDSet) AddInterval(in IntervalSlice) { - s.Intervals = append(s.Intervals, in...) - s.Intervals = s.Intervals.Normalize() -} - -func (s *UUIDSet) String() string { - return hack.String(s.Bytes()) -} - -func (s *UUIDSet) encode(w io.Writer) { - w.Write(s.SID.Bytes()) - n := int64(len(s.Intervals)) - - binary.Write(w, binary.LittleEndian, n) - - for _, i := range s.Intervals { - binary.Write(w, binary.LittleEndian, i.Start) - binary.Write(w, binary.LittleEndian, i.Stop) - } -} - -func (s *UUIDSet) Encode() []byte { - var buf bytes.Buffer - - s.encode(&buf) - - return buf.Bytes() -} - -func (s *UUIDSet) decode(data []byte) (int, error) { - if len(data) < 24 { - return 0, errors.Errorf("invalid uuid set buffer, less 24") - } - - pos := 0 - var err error - if s.SID, err = uuid.FromBytes(data[0:16]); err != nil { - return 0, err - } - pos += 16 - - n := int64(binary.LittleEndian.Uint64(data[pos: pos+8])) - pos += 8 - if len(data) < int(16*n)+pos { - return 0, errors.Errorf("invalid uuid set buffer, must %d, but %d", pos+int(16*n), len(data)) - } - - s.Intervals = make([]Interval, 0, n) - - var in Interval - for i := int64(0); i < n; i++ { - in.Start = int64(binary.LittleEndian.Uint64(data[pos: pos+8])) - pos += 8 - in.Stop = int64(binary.LittleEndian.Uint64(data[pos: pos+8])) - pos += 8 - s.Intervals = append(s.Intervals, in) - } - - return pos, nil -} - -func (s *UUIDSet) Decode(data []byte) error { - n, err := s.decode(data) - if n != len(data) { - return errors.Errorf("invalid uuid set buffer, must %d, but %d", n, len(data)) - } - return err -} - -type MysqlGTIDSet struct { - Sets map[string]*UUIDSet -} - -func ParseMysqlGTIDSet(str string) (GTIDSet, error) { - s := new(MysqlGTIDSet) - s.Sets = make(map[string]*UUIDSet) - if str == "" { - return s, nil - } - - sp := strings.Split(str, ",") - - //todo, handle redundant same uuid - for i := 0; i < len(sp); i++ { - if set, err := ParseUUIDSet(sp[i]); err != nil { - return nil, errors.Trace(err) - } else { - s.AddSet(set) - } - - } - return s, nil -} - -func DecodeMysqlGTIDSet(data []byte) (*MysqlGTIDSet, error) { - s := new(MysqlGTIDSet) - - if len(data) < 8 { - return nil, errors.Errorf("invalid gtid set buffer, less 4") - } - - n := int(binary.LittleEndian.Uint64(data)) - s.Sets = make(map[string]*UUIDSet, n) - - pos := 8 - - for i := 0; i < n; i++ { - set := new(UUIDSet) - if n, err := set.decode(data[pos:]); err != nil { - return nil, errors.Trace(err) - } else { - pos += n - - s.AddSet(set) - } - } - return s, nil -} - -func (s *MysqlGTIDSet) AddSet(set *UUIDSet) { - if set == nil { - return - } - sid := set.SID.String() - o, ok := s.Sets[sid] - if ok { - o.AddInterval(set.Intervals) - } else { - s.Sets[sid] = set - } -} - -func (s *MysqlGTIDSet) Update(GTIDStr string) error { - uuidSet, err := ParseUUIDSet(GTIDStr) - if err != nil { - return err - } - - s.AddSet(uuidSet) - - return nil -} - -func (s *MysqlGTIDSet) Contain(o GTIDSet) bool { - sub, ok := o.(*MysqlGTIDSet) - if !ok { - return false - } - - for key, set := range sub.Sets { - o, ok := s.Sets[key] - if !ok { - return false - } - - if !o.Contain(set) { - return false - } - } - - return true -} - -func (s *MysqlGTIDSet) Equal(o GTIDSet) bool { - sub, ok := o.(*MysqlGTIDSet) - if !ok { - return false - } - - for key, set := range sub.Sets { - o, ok := s.Sets[key] - if !ok { - return false - } - - if !o.Intervals.Equal(set.Intervals) { - return false - } - } - - return true - -} - -func (s *MysqlGTIDSet) String() string { - var buf bytes.Buffer - sep := "" - for _, set := range s.Sets { - buf.WriteString(sep) - buf.WriteString(set.String()) - sep = "," - } - - return hack.String(buf.Bytes()) -} - -func (s *MysqlGTIDSet) Encode() []byte { - var buf bytes.Buffer - - binary.Write(&buf, binary.LittleEndian, uint64(len(s.Sets))) - - for i, _ := range s.Sets { - s.Sets[i].encode(&buf) - } - - return buf.Bytes() -} - -func (gtid *MysqlGTIDSet) Clone() GTIDSet { - clone := new(MysqlGTIDSet) - *clone = *gtid - return clone -} \ No newline at end of file diff --git a/vendor/github.com/siddontang/go-mysql/mysql/parse_binary.go b/vendor/github.com/siddontang/go-mysql/mysql/parse_binary.go deleted file mode 100644 index b9b8179a..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/parse_binary.go +++ /dev/null @@ -1,53 +0,0 @@ -package mysql - -import ( - "encoding/binary" - "math" -) - -func ParseBinaryInt8(data []byte) int8 { - return int8(data[0]) -} -func ParseBinaryUint8(data []byte) uint8 { - return data[0] -} - -func ParseBinaryInt16(data []byte) int16 { - return int16(binary.LittleEndian.Uint16(data)) -} -func ParseBinaryUint16(data []byte) uint16 { - return binary.LittleEndian.Uint16(data) -} - -func ParseBinaryInt24(data []byte) int32 { - u32 := uint32(ParseBinaryUint24(data)) - if u32&0x00800000 != 0 { - u32 |= 0xFF000000 - } - return int32(u32) -} -func ParseBinaryUint24(data []byte) uint32 { - return uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16 -} - -func ParseBinaryInt32(data []byte) int32 { - return int32(binary.LittleEndian.Uint32(data)) -} -func ParseBinaryUint32(data []byte) uint32 { - return binary.LittleEndian.Uint32(data) -} - -func ParseBinaryInt64(data []byte) int64 { - return int64(binary.LittleEndian.Uint64(data)) -} -func ParseBinaryUint64(data []byte) uint64 { - return binary.LittleEndian.Uint64(data) -} - -func ParseBinaryFloat32(data []byte) float32 { - return math.Float32frombits(binary.LittleEndian.Uint32(data)) -} - -func ParseBinaryFloat64(data []byte) float64 { - return math.Float64frombits(binary.LittleEndian.Uint64(data)) -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/position.go b/vendor/github.com/siddontang/go-mysql/mysql/position.go deleted file mode 100644 index bee5485d..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/position.go +++ /dev/null @@ -1,33 +0,0 @@ -package mysql - -import ( - "fmt" -) - -// For binlog filename + position based replication -type Position struct { - Name string - Pos uint32 -} - -func (p Position) Compare(o Position) int { - // First compare binlog name - if p.Name > o.Name { - return 1 - } else if p.Name < o.Name { - return -1 - } else { - // Same binlog file, compare position - if p.Pos > o.Pos { - return 1 - } else if p.Pos < o.Pos { - return -1 - } else { - return 0 - } - } -} - -func (p Position) String() string { - return fmt.Sprintf("(%s, %d)", p.Name, p.Pos) -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/result.go b/vendor/github.com/siddontang/go-mysql/mysql/result.go deleted file mode 100644 index d6c80e42..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/result.go +++ /dev/null @@ -1,14 +0,0 @@ -package mysql - -type Result struct { - Status uint16 - - InsertId uint64 - AffectedRows uint64 - - *Resultset -} - -type Executer interface { - Execute(query string, args ...interface{}) (*Result, error) -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/resultset.go b/vendor/github.com/siddontang/go-mysql/mysql/resultset.go deleted file mode 100644 index 08040508..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/resultset.go +++ /dev/null @@ -1,439 +0,0 @@ -package mysql - -import ( - "fmt" - "strconv" - - "github.com/juju/errors" - "github.com/siddontang/go/hack" -) - -type RowData []byte - -func (p RowData) Parse(f []*Field, binary bool) ([]interface{}, error) { - if binary { - return p.ParseBinary(f) - } else { - return p.ParseText(f) - } -} - -func (p RowData) ParseText(f []*Field) ([]interface{}, error) { - data := make([]interface{}, len(f)) - - var err error - var v []byte - var isNull bool - var pos int = 0 - var n int = 0 - - for i := range f { - v, isNull, n, err = LengthEnodedString(p[pos:]) - if err != nil { - return nil, errors.Trace(err) - } - - pos += n - - if isNull { - data[i] = nil - } else { - isUnsigned := f[i].Flag&UNSIGNED_FLAG != 0 - - switch f[i].Type { - case MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_INT24, - MYSQL_TYPE_LONGLONG, MYSQL_TYPE_YEAR: - if isUnsigned { - data[i], err = strconv.ParseUint(string(v), 10, 64) - } else { - data[i], err = strconv.ParseInt(string(v), 10, 64) - } - case MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE: - data[i], err = strconv.ParseFloat(string(v), 64) - default: - data[i] = v - } - - if err != nil { - return nil, errors.Trace(err) - } - } - } - - return data, nil -} - -func (p RowData) ParseBinary(f []*Field) ([]interface{}, error) { - data := make([]interface{}, len(f)) - - if p[0] != OK_HEADER { - return nil, ErrMalformPacket - } - - pos := 1 + ((len(f) + 7 + 2) >> 3) - - nullBitmap := p[1:pos] - - var isNull bool - var n int - var err error - var v []byte - for i := range data { - if nullBitmap[(i+2)/8]&(1<<(uint(i+2)%8)) > 0 { - data[i] = nil - continue - } - - isUnsigned := f[i].Flag&UNSIGNED_FLAG != 0 - - switch f[i].Type { - case MYSQL_TYPE_NULL: - data[i] = nil - continue - - case MYSQL_TYPE_TINY: - if isUnsigned { - data[i] = ParseBinaryUint8(p[pos : pos+1]) - } else { - data[i] = ParseBinaryInt8(p[pos : pos+1]) - } - pos++ - continue - - case MYSQL_TYPE_SHORT, MYSQL_TYPE_YEAR: - if isUnsigned { - data[i] = ParseBinaryUint16(p[pos : pos+2]) - } else { - data[i] = ParseBinaryInt16(p[pos : pos+2]) - } - pos += 2 - continue - - case MYSQL_TYPE_INT24: - if isUnsigned { - data[i] = ParseBinaryUint24(p[pos : pos+3]) - } else { - data[i] = ParseBinaryInt24(p[pos : pos+3]) - } - //3 byte - pos += 3 - continue - - case MYSQL_TYPE_LONG: - if isUnsigned { - data[i] = ParseBinaryUint32(p[pos : pos+4]) - } else { - data[i] = ParseBinaryInt32(p[pos : pos+4]) - } - pos += 4 - continue - - case MYSQL_TYPE_LONGLONG: - if isUnsigned { - data[i] = ParseBinaryUint64(p[pos : pos+8]) - } else { - data[i] = ParseBinaryInt64(p[pos : pos+8]) - } - pos += 8 - continue - - case MYSQL_TYPE_FLOAT: - data[i] = ParseBinaryFloat32(p[pos : pos+4]) - pos += 4 - continue - - case MYSQL_TYPE_DOUBLE: - data[i] = ParseBinaryFloat64(p[pos : pos+8]) - pos += 8 - continue - - case MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, - MYSQL_TYPE_BIT, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TINY_BLOB, - MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, - MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_STRING, MYSQL_TYPE_GEOMETRY: - v, isNull, n, err = LengthEnodedString(p[pos:]) - pos += n - if err != nil { - return nil, errors.Trace(err) - } - - if !isNull { - data[i] = v - continue - } else { - data[i] = nil - continue - } - case MYSQL_TYPE_DATE, MYSQL_TYPE_NEWDATE: - var num uint64 - num, isNull, n = LengthEncodedInt(p[pos:]) - - pos += n - - if isNull { - data[i] = nil - continue - } - - data[i], err = FormatBinaryDate(int(num), p[pos:]) - pos += int(num) - - if err != nil { - return nil, errors.Trace(err) - } - - case MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_DATETIME: - var num uint64 - num, isNull, n = LengthEncodedInt(p[pos:]) - - pos += n - - if isNull { - data[i] = nil - continue - } - - data[i], err = FormatBinaryDateTime(int(num), p[pos:]) - pos += int(num) - - if err != nil { - return nil, errors.Trace(err) - } - - case MYSQL_TYPE_TIME: - var num uint64 - num, isNull, n = LengthEncodedInt(p[pos:]) - - pos += n - - if isNull { - data[i] = nil - continue - } - - data[i], err = FormatBinaryTime(int(num), p[pos:]) - pos += int(num) - - if err != nil { - return nil, errors.Trace(err) - } - - default: - return nil, errors.Errorf("Stmt Unknown FieldType %d %s", f[i].Type, f[i].Name) - } - } - - return data, nil -} - -type Resultset struct { - Fields []*Field - FieldNames map[string]int - Values [][]interface{} - - RowDatas []RowData -} - -func (r *Resultset) RowNumber() int { - return len(r.Values) -} - -func (r *Resultset) ColumnNumber() int { - return len(r.Fields) -} - -func (r *Resultset) GetValue(row, column int) (interface{}, error) { - if row >= len(r.Values) || row < 0 { - return nil, errors.Errorf("invalid row index %d", row) - } - - if column >= len(r.Fields) || column < 0 { - return nil, errors.Errorf("invalid column index %d", column) - } - - return r.Values[row][column], nil -} - -func (r *Resultset) NameIndex(name string) (int, error) { - if column, ok := r.FieldNames[name]; ok { - return column, nil - } else { - return 0, errors.Errorf("invalid field name %s", name) - } -} - -func (r *Resultset) GetValueByName(row int, name string) (interface{}, error) { - if column, err := r.NameIndex(name); err != nil { - return nil, errors.Trace(err) - } else { - return r.GetValue(row, column) - } -} - -func (r *Resultset) IsNull(row, column int) (bool, error) { - d, err := r.GetValue(row, column) - if err != nil { - return false, err - } - - return d == nil, nil -} - -func (r *Resultset) IsNullByName(row int, name string) (bool, error) { - if column, err := r.NameIndex(name); err != nil { - return false, err - } else { - return r.IsNull(row, column) - } -} - -func (r *Resultset) GetUint(row, column int) (uint64, error) { - d, err := r.GetValue(row, column) - if err != nil { - return 0, err - } - - switch v := d.(type) { - case int: - return uint64(v), nil - case int8: - return uint64(v), nil - case int16: - return uint64(v), nil - case int32: - return uint64(v), nil - case int64: - return uint64(v), nil - case uint: - return uint64(v), nil - case uint8: - return uint64(v), nil - case uint16: - return uint64(v), nil - case uint32: - return uint64(v), nil - case uint64: - return uint64(v), nil - case float32: - return uint64(v), nil - case float64: - return uint64(v), nil - case string: - return strconv.ParseUint(v, 10, 64) - case []byte: - return strconv.ParseUint(string(v), 10, 64) - case nil: - return 0, nil - default: - return 0, errors.Errorf("data type is %T", v) - } -} - -func (r *Resultset) GetUintByName(row int, name string) (uint64, error) { - if column, err := r.NameIndex(name); err != nil { - return 0, err - } else { - return r.GetUint(row, column) - } -} - -func (r *Resultset) GetInt(row, column int) (int64, error) { - v, err := r.GetUint(row, column) - if err != nil { - return 0, err - } - - return int64(v), nil -} - -func (r *Resultset) GetIntByName(row int, name string) (int64, error) { - v, err := r.GetUintByName(row, name) - if err != nil { - return 0, err - } - - return int64(v), nil -} - -func (r *Resultset) GetFloat(row, column int) (float64, error) { - d, err := r.GetValue(row, column) - if err != nil { - return 0, err - } - - switch v := d.(type) { - case int: - return float64(v), nil - case int8: - return float64(v), nil - case int16: - return float64(v), nil - case int32: - return float64(v), nil - case int64: - return float64(v), nil - case uint: - return float64(v), nil - case uint8: - return float64(v), nil - case uint16: - return float64(v), nil - case uint32: - return float64(v), nil - case uint64: - return float64(v), nil - case float32: - return float64(v), nil - case float64: - return v, nil - case string: - return strconv.ParseFloat(v, 64) - case []byte: - return strconv.ParseFloat(string(v), 64) - case nil: - return 0, nil - default: - return 0, errors.Errorf("data type is %T", v) - } -} - -func (r *Resultset) GetFloatByName(row int, name string) (float64, error) { - if column, err := r.NameIndex(name); err != nil { - return 0, err - } else { - return r.GetFloat(row, column) - } -} - -func (r *Resultset) GetString(row, column int) (string, error) { - d, err := r.GetValue(row, column) - if err != nil { - return "", err - } - - switch v := d.(type) { - case string: - return v, nil - case []byte: - return hack.String(v), nil - case int, int8, int16, int32, int64, - uint, uint8, uint16, uint32, uint64: - return fmt.Sprintf("%d", v), nil - case float32: - return strconv.FormatFloat(float64(v), 'f', -1, 64), nil - case float64: - return strconv.FormatFloat(v, 'f', -1, 64), nil - case nil: - return "", nil - default: - return "", errors.Errorf("data type is %T", v) - } -} - -func (r *Resultset) GetStringByName(row int, name string) (string, error) { - if column, err := r.NameIndex(name); err != nil { - return "", err - } else { - return r.GetString(row, column) - } -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/resultset_helper.go b/vendor/github.com/siddontang/go-mysql/mysql/resultset_helper.go deleted file mode 100644 index 307684db..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/resultset_helper.go +++ /dev/null @@ -1,248 +0,0 @@ -package mysql - -import ( - "math" - "strconv" - - "github.com/juju/errors" - "github.com/siddontang/go/hack" -) - -func formatTextValue(value interface{}) ([]byte, error) { - switch v := value.(type) { - case int8: - return strconv.AppendInt(nil, int64(v), 10), nil - case int16: - return strconv.AppendInt(nil, int64(v), 10), nil - case int32: - return strconv.AppendInt(nil, int64(v), 10), nil - case int64: - return strconv.AppendInt(nil, int64(v), 10), nil - case int: - return strconv.AppendInt(nil, int64(v), 10), nil - case uint8: - return strconv.AppendUint(nil, uint64(v), 10), nil - case uint16: - return strconv.AppendUint(nil, uint64(v), 10), nil - case uint32: - return strconv.AppendUint(nil, uint64(v), 10), nil - case uint64: - return strconv.AppendUint(nil, uint64(v), 10), nil - case uint: - return strconv.AppendUint(nil, uint64(v), 10), nil - case float32: - return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil - case float64: - return strconv.AppendFloat(nil, float64(v), 'f', -1, 64), nil - case []byte: - return v, nil - case string: - return hack.Slice(v), nil - case nil: - return nil, nil - default: - return nil, errors.Errorf("invalid type %T", value) - } -} - -func formatBinaryValue(value interface{}) ([]byte, error) { - switch v := value.(type) { - case int8: - return Uint64ToBytes(uint64(v)), nil - case int16: - return Uint64ToBytes(uint64(v)), nil - case int32: - return Uint64ToBytes(uint64(v)), nil - case int64: - return Uint64ToBytes(uint64(v)), nil - case int: - return Uint64ToBytes(uint64(v)), nil - case uint8: - return Uint64ToBytes(uint64(v)), nil - case uint16: - return Uint64ToBytes(uint64(v)), nil - case uint32: - return Uint64ToBytes(uint64(v)), nil - case uint64: - return Uint64ToBytes(uint64(v)), nil - case uint: - return Uint64ToBytes(uint64(v)), nil - case float32: - return Uint64ToBytes(math.Float64bits(float64(v))), nil - case float64: - return Uint64ToBytes(math.Float64bits(v)), nil - case []byte: - return v, nil - case string: - return hack.Slice(v), nil - default: - return nil, errors.Errorf("invalid type %T", value) - } -} - -func fieldType(value interface{}) (typ uint8, err error) { - switch value.(type) { - case int8, int16, int32, int64, int: - typ = MYSQL_TYPE_LONGLONG - case uint8, uint16, uint32, uint64, uint: - typ = MYSQL_TYPE_LONGLONG - case float32, float64: - typ = MYSQL_TYPE_DOUBLE - case string, []byte: - typ = MYSQL_TYPE_VAR_STRING - case nil: - typ = MYSQL_TYPE_NULL - default: - err = errors.Errorf("unsupport type %T for resultset", value) - } - return -} - -func formatField(field *Field, value interface{}) error { - switch value.(type) { - case int8, int16, int32, int64, int: - field.Charset = 63 - field.Flag = BINARY_FLAG | NOT_NULL_FLAG - case uint8, uint16, uint32, uint64, uint: - field.Charset = 63 - field.Flag = BINARY_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG - case float32, float64: - field.Charset = 63 - field.Flag = BINARY_FLAG | NOT_NULL_FLAG - case string, []byte: - field.Charset = 33 - case nil: - field.Charset = 33 - default: - return errors.Errorf("unsupport type %T for resultset", value) - } - return nil -} - -func BuildSimpleTextResultset(names []string, values [][]interface{}) (*Resultset, error) { - r := new(Resultset) - - r.Fields = make([]*Field, len(names)) - - var b []byte - - if len(values) == 0 { - for i, name := range names { - r.Fields[i] = &Field{Name: hack.Slice(name), Charset: 33, Type: MYSQL_TYPE_NULL} - } - return r, nil - } - - for i, vs := range values { - if len(vs) != len(r.Fields) { - return nil, errors.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) - } - - var row []byte - for j, value := range vs { - typ, err := fieldType(value) - if err != nil { - return nil, errors.Trace(err) - } - if r.Fields[j] == nil { - r.Fields[j] = &Field{Name: hack.Slice(names[j]), Type: typ} - formatField(r.Fields[j], value) - } else if typ != r.Fields[j].Type { - // we got another type in the same column. in general, we treat it as an error, except - // the case, when old value was null, and the new one isn't null, so we can update - // type info for fields. - oldIsNull, newIsNull := r.Fields[j].Type == MYSQL_TYPE_NULL, typ == MYSQL_TYPE_NULL - if oldIsNull && !newIsNull { // old is null, new isn't, update type info. - r.Fields[j].Type = typ - formatField(r.Fields[j], value) - } else if !oldIsNull && !newIsNull { // different non-null types, that's an error. - return nil, errors.Errorf("row types aren't consistent") - } - } - b, err = formatTextValue(value) - - if err != nil { - return nil, errors.Trace(err) - } - - if b == nil { - // NULL value is encoded as 0xfb here (without additional info about length) - row = append(row, 0xfb) - } else { - row = append(row, PutLengthEncodedString(b)...) - } - } - - r.RowDatas = append(r.RowDatas, row) - } - - return r, nil -} - -func BuildSimpleBinaryResultset(names []string, values [][]interface{}) (*Resultset, error) { - r := new(Resultset) - - r.Fields = make([]*Field, len(names)) - - var b []byte - - bitmapLen := ((len(names) + 7 + 2) >> 3) - - for i, vs := range values { - if len(vs) != len(r.Fields) { - return nil, errors.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) - } - - var row []byte - nullBitmap := make([]byte, bitmapLen) - - row = append(row, 0) - row = append(row, nullBitmap...) - - for j, value := range vs { - typ, err := fieldType(value) - if err != nil { - return nil, errors.Trace(err) - } - if i == 0 { - field := &Field{Type: typ} - r.Fields[j] = field - field.Name = hack.Slice(names[j]) - - if err = formatField(field, value); err != nil { - return nil, errors.Trace(err) - } - } - if value == nil { - nullBitmap[(i+2)/8] |= (1 << (uint(i+2) % 8)) - continue - } - - b, err = formatBinaryValue(value) - - if err != nil { - return nil, errors.Trace(err) - } - - if r.Fields[j].Type == MYSQL_TYPE_VAR_STRING { - row = append(row, PutLengthEncodedString(b)...) - } else { - row = append(row, b...) - } - } - - copy(row[1:], nullBitmap) - - r.RowDatas = append(r.RowDatas, row) - } - - return r, nil -} - -func BuildSimpleResultset(names []string, values [][]interface{}, binary bool) (*Resultset, error) { - if binary { - return BuildSimpleBinaryResultset(names, values) - } else { - return BuildSimpleTextResultset(names, values) - } -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/state.go b/vendor/github.com/siddontang/go-mysql/mysql/state.go deleted file mode 100644 index 568d84b6..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/state.go +++ /dev/null @@ -1,233 +0,0 @@ -package mysql - -const ( - DEFAULT_MYSQL_STATE = "HY000" -) - -var MySQLState = map[uint16]string{ - ER_DUP_KEY: "23000", - ER_OUTOFMEMORY: "HY001", - ER_OUT_OF_SORTMEMORY: "HY001", - ER_CON_COUNT_ERROR: "08004", - ER_BAD_HOST_ERROR: "08S01", - ER_HANDSHAKE_ERROR: "08S01", - ER_DBACCESS_DENIED_ERROR: "42000", - ER_ACCESS_DENIED_ERROR: "28000", - ER_NO_DB_ERROR: "3D000", - ER_UNKNOWN_COM_ERROR: "08S01", - ER_BAD_NULL_ERROR: "23000", - ER_BAD_DB_ERROR: "42000", - ER_TABLE_EXISTS_ERROR: "42S01", - ER_BAD_TABLE_ERROR: "42S02", - ER_NON_UNIQ_ERROR: "23000", - ER_SERVER_SHUTDOWN: "08S01", - ER_BAD_FIELD_ERROR: "42S22", - ER_WRONG_FIELD_WITH_GROUP: "42000", - ER_WRONG_SUM_SELECT: "42000", - ER_WRONG_GROUP_FIELD: "42000", - ER_WRONG_VALUE_COUNT: "21S01", - ER_TOO_LONG_IDENT: "42000", - ER_DUP_FIELDNAME: "42S21", - ER_DUP_KEYNAME: "42000", - ER_DUP_ENTRY: "23000", - ER_WRONG_FIELD_SPEC: "42000", - ER_PARSE_ERROR: "42000", - ER_EMPTY_QUERY: "42000", - ER_NONUNIQ_TABLE: "42000", - ER_INVALID_DEFAULT: "42000", - ER_MULTIPLE_PRI_KEY: "42000", - ER_TOO_MANY_KEYS: "42000", - ER_TOO_MANY_KEY_PARTS: "42000", - ER_TOO_LONG_KEY: "42000", - ER_KEY_COLUMN_DOES_NOT_EXITS: "42000", - ER_BLOB_USED_AS_KEY: "42000", - ER_TOO_BIG_FIELDLENGTH: "42000", - ER_WRONG_AUTO_KEY: "42000", - ER_FORCING_CLOSE: "08S01", - ER_IPSOCK_ERROR: "08S01", - ER_NO_SUCH_INDEX: "42S12", - ER_WRONG_FIELD_TERMINATORS: "42000", - ER_BLOBS_AND_NO_TERMINATED: "42000", - ER_CANT_REMOVE_ALL_FIELDS: "42000", - ER_CANT_DROP_FIELD_OR_KEY: "42000", - ER_BLOB_CANT_HAVE_DEFAULT: "42000", - ER_WRONG_DB_NAME: "42000", - ER_WRONG_TABLE_NAME: "42000", - ER_TOO_BIG_SELECT: "42000", - ER_UNKNOWN_PROCEDURE: "42000", - ER_WRONG_PARAMCOUNT_TO_PROCEDURE: "42000", - ER_UNKNOWN_TABLE: "42S02", - ER_FIELD_SPECIFIED_TWICE: "42000", - ER_UNSUPPORTED_EXTENSION: "42000", - ER_TABLE_MUST_HAVE_COLUMNS: "42000", - ER_UNKNOWN_CHARACTER_SET: "42000", - ER_TOO_BIG_ROWSIZE: "42000", - ER_WRONG_OUTER_JOIN: "42000", - ER_NULL_COLUMN_IN_INDEX: "42000", - ER_PASSWORD_ANONYMOUS_USER: "42000", - ER_PASSWORD_NOT_ALLOWED: "42000", - ER_PASSWORD_NO_MATCH: "42000", - ER_WRONG_VALUE_COUNT_ON_ROW: "21S01", - ER_INVALID_USE_OF_NULL: "22004", - ER_REGEXP_ERROR: "42000", - ER_MIX_OF_GROUP_FUNC_AND_FIELDS: "42000", - ER_NONEXISTING_GRANT: "42000", - ER_TABLEACCESS_DENIED_ERROR: "42000", - ER_COLUMNACCESS_DENIED_ERROR: "42000", - ER_ILLEGAL_GRANT_FOR_TABLE: "42000", - ER_GRANT_WRONG_HOST_OR_USER: "42000", - ER_NO_SUCH_TABLE: "42S02", - ER_NONEXISTING_TABLE_GRANT: "42000", - ER_NOT_ALLOWED_COMMAND: "42000", - ER_SYNTAX_ERROR: "42000", - ER_ABORTING_CONNECTION: "08S01", - ER_NET_PACKET_TOO_LARGE: "08S01", - ER_NET_READ_ERROR_FROM_PIPE: "08S01", - ER_NET_FCNTL_ERROR: "08S01", - ER_NET_PACKETS_OUT_OF_ORDER: "08S01", - ER_NET_UNCOMPRESS_ERROR: "08S01", - ER_NET_READ_ERROR: "08S01", - ER_NET_READ_INTERRUPTED: "08S01", - ER_NET_ERROR_ON_WRITE: "08S01", - ER_NET_WRITE_INTERRUPTED: "08S01", - ER_TOO_LONG_STRING: "42000", - ER_TABLE_CANT_HANDLE_BLOB: "42000", - ER_TABLE_CANT_HANDLE_AUTO_INCREMENT: "42000", - ER_WRONG_COLUMN_NAME: "42000", - ER_WRONG_KEY_COLUMN: "42000", - ER_DUP_UNIQUE: "23000", - ER_BLOB_KEY_WITHOUT_LENGTH: "42000", - ER_PRIMARY_CANT_HAVE_NULL: "42000", - ER_TOO_MANY_ROWS: "42000", - ER_REQUIRES_PRIMARY_KEY: "42000", - ER_KEY_DOES_NOT_EXITS: "42000", - ER_CHECK_NO_SUCH_TABLE: "42000", - ER_CHECK_NOT_IMPLEMENTED: "42000", - ER_CANT_DO_THIS_DURING_AN_TRANSACTION: "25000", - ER_NEW_ABORTING_CONNECTION: "08S01", - ER_MASTER_NET_READ: "08S01", - ER_MASTER_NET_WRITE: "08S01", - ER_TOO_MANY_USER_CONNECTIONS: "42000", - ER_READ_ONLY_TRANSACTION: "25000", - ER_NO_PERMISSION_TO_CREATE_USER: "42000", - ER_LOCK_DEADLOCK: "40001", - ER_NO_REFERENCED_ROW: "23000", - ER_ROW_IS_REFERENCED: "23000", - ER_CONNECT_TO_MASTER: "08S01", - ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT: "21000", - ER_USER_LIMIT_REACHED: "42000", - ER_SPECIFIC_ACCESS_DENIED_ERROR: "42000", - ER_NO_DEFAULT: "42000", - ER_WRONG_VALUE_FOR_VAR: "42000", - ER_WRONG_TYPE_FOR_VAR: "42000", - ER_CANT_USE_OPTION_HERE: "42000", - ER_NOT_SUPPORTED_YET: "42000", - ER_WRONG_FK_DEF: "42000", - ER_OPERAND_COLUMNS: "21000", - ER_SUBQUERY_NO_1_ROW: "21000", - ER_ILLEGAL_REFERENCE: "42S22", - ER_DERIVED_MUST_HAVE_ALIAS: "42000", - ER_SELECT_REDUCED: "01000", - ER_TABLENAME_NOT_ALLOWED_HERE: "42000", - ER_NOT_SUPPORTED_AUTH_MODE: "08004", - ER_SPATIAL_CANT_HAVE_NULL: "42000", - ER_COLLATION_CHARSET_MISMATCH: "42000", - ER_WARN_TOO_FEW_RECORDS: "01000", - ER_WARN_TOO_MANY_RECORDS: "01000", - ER_WARN_NULL_TO_NOTNULL: "22004", - ER_WARN_DATA_OUT_OF_RANGE: "22003", - WARN_DATA_TRUNCATED: "01000", - ER_WRONG_NAME_FOR_INDEX: "42000", - ER_WRONG_NAME_FOR_CATALOG: "42000", - ER_UNKNOWN_STORAGE_ENGINE: "42000", - ER_TRUNCATED_WRONG_VALUE: "22007", - ER_SP_NO_RECURSIVE_CREATE: "2F003", - ER_SP_ALREADY_EXISTS: "42000", - ER_SP_DOES_NOT_EXIST: "42000", - ER_SP_LILABEL_MISMATCH: "42000", - ER_SP_LABEL_REDEFINE: "42000", - ER_SP_LABEL_MISMATCH: "42000", - ER_SP_UNINIT_VAR: "01000", - ER_SP_BADSELECT: "0A000", - ER_SP_BADRETURN: "42000", - ER_SP_BADSTATEMENT: "0A000", - ER_UPDATE_LOG_DEPRECATED_IGNORED: "42000", - ER_UPDATE_LOG_DEPRECATED_TRANSLATED: "42000", - ER_QUERY_INTERRUPTED: "70100", - ER_SP_WRONG_NO_OF_ARGS: "42000", - ER_SP_COND_MISMATCH: "42000", - ER_SP_NORETURN: "42000", - ER_SP_NORETURNEND: "2F005", - ER_SP_BAD_CURSOR_QUERY: "42000", - ER_SP_BAD_CURSOR_SELECT: "42000", - ER_SP_CURSOR_MISMATCH: "42000", - ER_SP_CURSOR_ALREADY_OPEN: "24000", - ER_SP_CURSOR_NOT_OPEN: "24000", - ER_SP_UNDECLARED_VAR: "42000", - ER_SP_FETCH_NO_DATA: "02000", - ER_SP_DUP_PARAM: "42000", - ER_SP_DUP_VAR: "42000", - ER_SP_DUP_COND: "42000", - ER_SP_DUP_CURS: "42000", - ER_SP_SUBSELECT_NYI: "0A000", - ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG: "0A000", - ER_SP_VARCOND_AFTER_CURSHNDLR: "42000", - ER_SP_CURSOR_AFTER_HANDLER: "42000", - ER_SP_CASE_NOT_FOUND: "20000", - ER_DIVISION_BY_ZERO: "22012", - ER_ILLEGAL_VALUE_FOR_TYPE: "22007", - ER_PROCACCESS_DENIED_ERROR: "42000", - ER_XAER_NOTA: "XAE04", - ER_XAER_INVAL: "XAE05", - ER_XAER_RMFAIL: "XAE07", - ER_XAER_OUTSIDE: "XAE09", - ER_XAER_RMERR: "XAE03", - ER_XA_RBROLLBACK: "XA100", - ER_NONEXISTING_PROC_GRANT: "42000", - ER_DATA_TOO_LONG: "22001", - ER_SP_BAD_SQLSTATE: "42000", - ER_CANT_CREATE_USER_WITH_GRANT: "42000", - ER_SP_DUP_HANDLER: "42000", - ER_SP_NOT_VAR_ARG: "42000", - ER_SP_NO_RETSET: "0A000", - ER_CANT_CREATE_GEOMETRY_OBJECT: "22003", - ER_TOO_BIG_SCALE: "42000", - ER_TOO_BIG_PRECISION: "42000", - ER_M_BIGGER_THAN_D: "42000", - ER_TOO_LONG_BODY: "42000", - ER_TOO_BIG_DISPLAYWIDTH: "42000", - ER_XAER_DUPID: "XAE08", - ER_DATETIME_FUNCTION_OVERFLOW: "22008", - ER_ROW_IS_REFERENCED_2: "23000", - ER_NO_REFERENCED_ROW_2: "23000", - ER_SP_BAD_VAR_SHADOW: "42000", - ER_SP_WRONG_NAME: "42000", - ER_SP_NO_AGGREGATE: "42000", - ER_MAX_PREPARED_STMT_COUNT_REACHED: "42000", - ER_NON_GROUPING_FIELD_USED: "42000", - ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED: "23000", - ER_CANT_CHANGE_TX_CHARACTERISTICS: "25001", - ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT: "42000", - ER_WRONG_PARAMETERS_TO_NATIVE_FCT: "42000", - ER_WRONG_PARAMETERS_TO_STORED_FCT: "42000", - ER_DUP_ENTRY_WITH_KEY_NAME: "23000", - ER_XA_RBTIMEOUT: "XA106", - ER_XA_RBDEADLOCK: "XA102", - ER_FUNC_INEXISTENT_NAME_COLLISION: "42000", - ER_DUP_SIGNAL_SET: "42000", - ER_SIGNAL_WARN: "01000", - ER_SIGNAL_NOT_FOUND: "02000", - ER_SIGNAL_EXCEPTION: "HY000", - ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER: "0K000", - ER_SPATIAL_MUST_HAVE_GEOM_COL: "42000", - ER_DATA_OUT_OF_RANGE: "22003", - ER_ACCESS_DENIED_NO_PASSWORD_ERROR: "28000", - ER_TRUNCATE_ILLEGAL_FK: "42000", - ER_DA_INVALID_CONDITION_NUMBER: "35000", - ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO: "23000", - ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO: "23000", - ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION: "25006", - ER_ALTER_OPERATION_NOT_SUPPORTED: "0A000", - ER_ALTER_OPERATION_NOT_SUPPORTED_REASON: "0A000", - ER_DUP_UNKNOWN_IN_INDEX: "23000", -} diff --git a/vendor/github.com/siddontang/go-mysql/mysql/util.go b/vendor/github.com/siddontang/go-mysql/mysql/util.go deleted file mode 100644 index 7fe41fa2..00000000 --- a/vendor/github.com/siddontang/go-mysql/mysql/util.go +++ /dev/null @@ -1,354 +0,0 @@ -package mysql - -import ( - "crypto/rand" - "crypto/sha1" - "encoding/binary" - "fmt" - "io" - "runtime" - "strings" - - "github.com/juju/errors" - "github.com/siddontang/go/hack" -) - -func Pstack() string { - buf := make([]byte, 1024) - n := runtime.Stack(buf, false) - return string(buf[0:n]) -} - -func CalcPassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - // stage1Hash = SHA1(password) - crypt := sha1.New() - crypt.Write(password) - stage1 := crypt.Sum(nil) - - // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) - // inner Hash - crypt.Reset() - crypt.Write(stage1) - hash := crypt.Sum(nil) - - // outer Hash - crypt.Reset() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= stage1[i] - } - return scramble -} - -func RandomBuf(size int) ([]byte, error) { - buf := make([]byte, size) - - if _, err := io.ReadFull(rand.Reader, buf); err != nil { - return nil, errors.Trace(err) - } - - // avoid to generate '\0' - for i, b := range buf { - if uint8(b) == 0 { - buf[i] = '0' - } - } - - return buf, nil -} - -// little endian -func FixedLengthInt(buf []byte) uint64 { - var num uint64 = 0 - for i, b := range buf { - num |= uint64(b) << (uint(i) * 8) - } - return num -} - -// big endian -func BFixedLengthInt(buf []byte) uint64 { - var num uint64 = 0 - for i, b := range buf { - num |= uint64(b) << (uint(len(buf)-i-1) * 8) - } - return num -} - -func LengthEncodedInt(b []byte) (num uint64, isNull bool, n int) { - switch b[0] { - - // 251: NULL - case 0xfb: - n = 1 - isNull = true - return - - // 252: value of following 2 - case 0xfc: - num = uint64(b[1]) | uint64(b[2])<<8 - n = 3 - return - - // 253: value of following 3 - case 0xfd: - num = uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 - n = 4 - return - - // 254: value of following 8 - case 0xfe: - num = uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 | - uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 | - uint64(b[7])<<48 | uint64(b[8])<<56 - n = 9 - return - } - - // 0-250: value of first byte - num = uint64(b[0]) - n = 1 - return -} - -func PutLengthEncodedInt(n uint64) []byte { - switch { - case n <= 250: - return []byte{byte(n)} - - case n <= 0xffff: - return []byte{0xfc, byte(n), byte(n >> 8)} - - case n <= 0xffffff: - return []byte{0xfd, byte(n), byte(n >> 8), byte(n >> 16)} - - case n <= 0xffffffffffffffff: - return []byte{0xfe, byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24), - byte(n >> 32), byte(n >> 40), byte(n >> 48), byte(n >> 56)} - } - return nil -} - -func LengthEnodedString(b []byte) ([]byte, bool, int, error) { - // Get length - num, isNull, n := LengthEncodedInt(b) - if num < 1 { - return nil, isNull, n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return b[n-int(num) : n], false, n, nil - } - return nil, false, n, io.EOF -} - -func SkipLengthEnodedString(b []byte) (int, error) { - // Get length - num, _, n := LengthEncodedInt(b) - if num < 1 { - return n, nil - } - - n += int(num) - - // Check data length - if len(b) >= n { - return n, nil - } - return n, io.EOF -} - -func PutLengthEncodedString(b []byte) []byte { - data := make([]byte, 0, len(b)+9) - data = append(data, PutLengthEncodedInt(uint64(len(b)))...) - data = append(data, b...) - return data -} - -func Uint16ToBytes(n uint16) []byte { - return []byte{ - byte(n), - byte(n >> 8), - } -} - -func Uint32ToBytes(n uint32) []byte { - return []byte{ - byte(n), - byte(n >> 8), - byte(n >> 16), - byte(n >> 24), - } -} - -func Uint64ToBytes(n uint64) []byte { - return []byte{ - byte(n), - byte(n >> 8), - byte(n >> 16), - byte(n >> 24), - byte(n >> 32), - byte(n >> 40), - byte(n >> 48), - byte(n >> 56), - } -} - -func FormatBinaryDate(n int, data []byte) ([]byte, error) { - switch n { - case 0: - return []byte("0000-00-00"), nil - case 4: - return []byte(fmt.Sprintf("%04d-%02d-%02d", - binary.LittleEndian.Uint16(data[:2]), - data[2], - data[3])), nil - default: - return nil, errors.Errorf("invalid date packet length %d", n) - } -} - -func FormatBinaryDateTime(n int, data []byte) ([]byte, error) { - switch n { - case 0: - return []byte("0000-00-00 00:00:00"), nil - case 4: - return []byte(fmt.Sprintf("%04d-%02d-%02d 00:00:00", - binary.LittleEndian.Uint16(data[:2]), - data[2], - data[3])), nil - case 7: - return []byte(fmt.Sprintf( - "%04d-%02d-%02d %02d:%02d:%02d", - binary.LittleEndian.Uint16(data[:2]), - data[2], - data[3], - data[4], - data[5], - data[6])), nil - case 11: - return []byte(fmt.Sprintf( - "%04d-%02d-%02d %02d:%02d:%02d.%06d", - binary.LittleEndian.Uint16(data[:2]), - data[2], - data[3], - data[4], - data[5], - data[6], - binary.LittleEndian.Uint32(data[7:11]))), nil - default: - return nil, errors.Errorf("invalid datetime packet length %d", n) - } -} - -func FormatBinaryTime(n int, data []byte) ([]byte, error) { - if n == 0 { - return []byte("0000-00-00"), nil - } - - var sign byte - if data[0] == 1 { - sign = byte('-') - } - - switch n { - case 8: - return []byte(fmt.Sprintf( - "%c%02d:%02d:%02d", - sign, - uint16(data[1])*24+uint16(data[5]), - data[6], - data[7], - )), nil - case 12: - return []byte(fmt.Sprintf( - "%c%02d:%02d:%02d.%06d", - sign, - uint16(data[1])*24+uint16(data[5]), - data[6], - data[7], - binary.LittleEndian.Uint32(data[8:12]), - )), nil - default: - return nil, errors.Errorf("invalid time packet length %d", n) - } -} - -var ( - DONTESCAPE = byte(255) - - EncodeMap [256]byte -) - -// only support utf-8 -func Escape(sql string) string { - dest := make([]byte, 0, 2*len(sql)) - - for _, w := range hack.Slice(sql) { - if c := EncodeMap[w]; c == DONTESCAPE { - dest = append(dest, w) - } else { - dest = append(dest, '\\', c) - } - } - - return string(dest) -} - -func GetNetProto(addr string) string { - if strings.Contains(addr, "/") { - return "unix" - } else { - return "tcp" - } -} - -// ErrorEqual returns a boolean indicating whether err1 is equal to err2. -func ErrorEqual(err1, err2 error) bool { - e1 := errors.Cause(err1) - e2 := errors.Cause(err2) - - if e1 == e2 { - return true - } - - if e1 == nil || e2 == nil { - return e1 == e2 - } - - return e1.Error() == e2.Error() -} - -var encodeRef = map[byte]byte{ - '\x00': '0', - '\'': '\'', - '"': '"', - '\b': 'b', - '\n': 'n', - '\r': 'r', - '\t': 't', - 26: 'Z', // ctl-Z - '\\': '\\', -} - -func init() { - for i := range EncodeMap { - EncodeMap[i] = DONTESCAPE - } - for i := range EncodeMap { - if to, ok := encodeRef[byte(i)]; ok { - EncodeMap[byte(i)] = to - } - } -} diff --git a/vendor/github.com/siddontang/go-mysql/packet/conn.go b/vendor/github.com/siddontang/go-mysql/packet/conn.go deleted file mode 100644 index 3772e1a3..00000000 --- a/vendor/github.com/siddontang/go-mysql/packet/conn.go +++ /dev/null @@ -1,163 +0,0 @@ -package packet - -import ( - "bufio" - "bytes" - "io" - "net" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" -) - -/* - Conn is the base class to handle MySQL protocol. -*/ -type Conn struct { - net.Conn - br *bufio.Reader - - Sequence uint8 -} - -func NewConn(conn net.Conn) *Conn { - c := new(Conn) - - c.br = bufio.NewReaderSize(conn, 4096) - c.Conn = conn - - return c -} - -func (c *Conn) ReadPacket() ([]byte, error) { - var buf bytes.Buffer - - if err := c.ReadPacketTo(&buf); err != nil { - return nil, errors.Trace(err) - } else { - return buf.Bytes(), nil - } - - // header := []byte{0, 0, 0, 0} - - // if _, err := io.ReadFull(c.br, header); err != nil { - // return nil, ErrBadConn - // } - - // length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) - // if length < 1 { - // return nil, fmt.Errorf("invalid payload length %d", length) - // } - - // sequence := uint8(header[3]) - - // if sequence != c.Sequence { - // return nil, fmt.Errorf("invalid sequence %d != %d", sequence, c.Sequence) - // } - - // c.Sequence++ - - // data := make([]byte, length) - // if _, err := io.ReadFull(c.br, data); err != nil { - // return nil, ErrBadConn - // } else { - // if length < MaxPayloadLen { - // return data, nil - // } - - // var buf []byte - // buf, err = c.ReadPacket() - // if err != nil { - // return nil, ErrBadConn - // } else { - // return append(data, buf...), nil - // } - // } -} - -func (c *Conn) ReadPacketTo(w io.Writer) error { - header := []byte{0, 0, 0, 0} - - if _, err := io.ReadFull(c.br, header); err != nil { - return ErrBadConn - } - - length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16) - if length < 1 { - return errors.Errorf("invalid payload length %d", length) - } - - sequence := uint8(header[3]) - - if sequence != c.Sequence { - return errors.Errorf("invalid sequence %d != %d", sequence, c.Sequence) - } - - c.Sequence++ - - if n, err := io.CopyN(w, c.br, int64(length)); err != nil { - return ErrBadConn - } else if n != int64(length) { - return ErrBadConn - } else { - if length < MaxPayloadLen { - return nil - } - - if err := c.ReadPacketTo(w); err != nil { - return err - } - } - - return nil -} - -// data already has 4 bytes header -// will modify data inplace -func (c *Conn) WritePacket(data []byte) error { - length := len(data) - 4 - - for length >= MaxPayloadLen { - data[0] = 0xff - data[1] = 0xff - data[2] = 0xff - - data[3] = c.Sequence - - if n, err := c.Write(data[:4+MaxPayloadLen]); err != nil { - return ErrBadConn - } else if n != (4 + MaxPayloadLen) { - return ErrBadConn - } else { - c.Sequence++ - length -= MaxPayloadLen - data = data[MaxPayloadLen:] - } - } - - data[0] = byte(length) - data[1] = byte(length >> 8) - data[2] = byte(length >> 16) - data[3] = c.Sequence - - if n, err := c.Write(data); err != nil { - return ErrBadConn - } else if n != len(data) { - return ErrBadConn - } else { - c.Sequence++ - return nil - } -} - -func (c *Conn) ResetSequence() { - c.Sequence = 0 -} - -func (c *Conn) Close() error { - c.Sequence = 0 - if c.Conn != nil { - return c.Conn.Close() - } - return nil -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/backup.go b/vendor/github.com/siddontang/go-mysql/replication/backup.go deleted file mode 100644 index 24a25aea..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/backup.go +++ /dev/null @@ -1,96 +0,0 @@ -package replication - -import ( - "context" - "io" - "os" - "path" - "time" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" -) - -// Like mysqlbinlog remote raw backup -// Backup remote binlog from position (filename, offset) and write in backupDir -func (b *BinlogSyncer) StartBackup(backupDir string, p Position, timeout time.Duration) error { - if timeout == 0 { - // a very long timeout here - timeout = 30 * 3600 * 24 * time.Second - } - - // Force use raw mode - b.parser.SetRawMode(true) - - os.MkdirAll(backupDir, 0755) - - s, err := b.StartSync(p) - if err != nil { - return errors.Trace(err) - } - - var filename string - var offset uint32 - - var f *os.File - defer func() { - if f != nil { - f.Close() - } - }() - - for { - ctx, cancel := context.WithTimeout(context.Background(), timeout) - e, err := s.GetEvent(ctx) - cancel() - - if err == context.DeadlineExceeded { - return nil - } - - if err != nil { - return errors.Trace(err) - } - - offset = e.Header.LogPos - - if e.Header.EventType == ROTATE_EVENT { - rotateEvent := e.Event.(*RotateEvent) - filename = string(rotateEvent.NextLogName) - - if e.Header.Timestamp == 0 || offset == 0 { - // fake rotate event - continue - } - } else if e.Header.EventType == FORMAT_DESCRIPTION_EVENT { - // FormateDescriptionEvent is the first event in binlog, we will close old one and create a new - - if f != nil { - f.Close() - } - - if len(filename) == 0 { - return errors.Errorf("empty binlog filename for FormateDescriptionEvent") - } - - f, err = os.OpenFile(path.Join(backupDir, filename), os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return errors.Trace(err) - } - - // write binlog header fe'bin' - if _, err = f.Write(BinLogFileHeader); err != nil { - return errors.Trace(err) - } - - } - - if n, err := f.Write(e.RawData); err != nil { - return errors.Trace(err) - } else if n != len(e.RawData) { - return errors.Trace(io.ErrShortWrite) - } - } - - return nil -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/binlogstreamer.go b/vendor/github.com/siddontang/go-mysql/replication/binlogstreamer.go deleted file mode 100644 index 2dcd0c16..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/binlogstreamer.go +++ /dev/null @@ -1,71 +0,0 @@ -package replication - -import ( - "context" - - "github.com/juju/errors" - "github.com/siddontang/go-log/log" -) - -var ( - ErrNeedSyncAgain = errors.New("Last sync error or closed, try sync and get event again") - ErrSyncClosed = errors.New("Sync was closed") -) - -// BinlogStreamer gets the streaming event. -type BinlogStreamer struct { - ch chan *BinlogEvent - ech chan error - err error -} - -// GetEvent gets the binlog event one by one, it will block until Syncer receives any events from MySQL -// or meets a sync error. You can pass a context (like Cancel or Timeout) to break the block. -func (s *BinlogStreamer) GetEvent(ctx context.Context) (*BinlogEvent, error) { - if s.err != nil { - return nil, ErrNeedSyncAgain - } - - select { - case c := <-s.ch: - return c, nil - case s.err = <-s.ech: - return nil, s.err - case <-ctx.Done(): - return nil, ctx.Err() - } -} - -// DumpEvents dumps all left events -func (s *BinlogStreamer) DumpEvents() []*BinlogEvent { - count := len(s.ch) - events := make([]*BinlogEvent, 0, count) - for i := 0; i < count; i++ { - events = append(events, <-s.ch) - } - return events -} - -func (s *BinlogStreamer) close() { - s.closeWithError(ErrSyncClosed) -} - -func (s *BinlogStreamer) closeWithError(err error) { - if err == nil { - err = ErrSyncClosed - } - log.Errorf("close sync with err: %v", err) - select { - case s.ech <- err: - default: - } -} - -func newBinlogStreamer() *BinlogStreamer { - s := new(BinlogStreamer) - - s.ch = make(chan *BinlogEvent, 10240) - s.ech = make(chan error, 4) - - return s -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/binlogsyncer.go b/vendor/github.com/siddontang/go-mysql/replication/binlogsyncer.go deleted file mode 100644 index b4913c97..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/binlogsyncer.go +++ /dev/null @@ -1,758 +0,0 @@ -package replication - -import ( - "context" - "crypto/tls" - "encoding/binary" - "fmt" - "net" - "os" - "sync" - "time" - - "github.com/juju/errors" - "github.com/satori/go.uuid" - "github.com/siddontang/go-log/log" - "github.com/siddontang/go-mysql/client" - . "github.com/siddontang/go-mysql/mysql" -) - -var ( - errSyncRunning = errors.New("Sync is running, must Close first") -) - -// BinlogSyncerConfig is the configuration for BinlogSyncer. -type BinlogSyncerConfig struct { - // ServerID is the unique ID in cluster. - ServerID uint32 - // Flavor is "mysql" or "mariadb", if not set, use "mysql" default. - Flavor string - - // Host is for MySQL server host. - Host string - // Port is for MySQL server port. - Port uint16 - // User is for MySQL user. - User string - // Password is for MySQL password. - Password string - - // Localhost is local hostname if register salve. - // If not set, use os.Hostname() instead. - Localhost string - - // Charset is for MySQL client character set - Charset string - - // SemiSyncEnabled enables semi-sync or not. - SemiSyncEnabled bool - - // RawModeEnabled is for not parsing binlog event. - RawModeEnabled bool - - // If not nil, use the provided tls.Config to connect to the database using TLS/SSL. - TLSConfig *tls.Config - - // Use replication.Time structure for timestamp and datetime. - // We will use Local location for timestamp and UTC location for datatime. - ParseTime bool - - // Use decimal.Decimal structure for decimals. - UseDecimal bool - - // RecvBufferSize sets the size in bytes of the operating system's receive buffer associated with the connection. - RecvBufferSize int - - // master heartbeat period - HeartbeatPeriod time.Duration - - // read timeout - ReadTimeout time.Duration - - // maximum number of attempts to re-establish a broken connection - MaxReconnectAttempts int -} - -// BinlogSyncer syncs binlog event from server. -type BinlogSyncer struct { - m sync.RWMutex - - cfg BinlogSyncerConfig - - c *client.Conn - - wg sync.WaitGroup - - parser *BinlogParser - - nextPos Position - - gset GTIDSet - - running bool - - ctx context.Context - cancel context.CancelFunc - - lastConnectionID uint32 - - retryCount int -} - -// NewBinlogSyncer creates the BinlogSyncer with cfg. -func NewBinlogSyncer(cfg BinlogSyncerConfig) *BinlogSyncer { - if cfg.ServerID == 0 { - log.Fatal("can't use 0 as the server ID") - } - - // Clear the Password to avoid outputing it in log. - pass := cfg.Password - cfg.Password = "" - log.Infof("create BinlogSyncer with config %v", cfg) - cfg.Password = pass - - b := new(BinlogSyncer) - - b.cfg = cfg - b.parser = NewBinlogParser() - b.parser.SetRawMode(b.cfg.RawModeEnabled) - b.parser.SetParseTime(b.cfg.ParseTime) - b.parser.SetUseDecimal(b.cfg.UseDecimal) - b.running = false - b.ctx, b.cancel = context.WithCancel(context.Background()) - - return b -} - -// Close closes the BinlogSyncer. -func (b *BinlogSyncer) Close() { - b.m.Lock() - defer b.m.Unlock() - - b.close() -} - -func (b *BinlogSyncer) close() { - if b.isClosed() { - return - } - - log.Info("syncer is closing...") - - b.running = false - b.cancel() - - if b.c != nil { - b.c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) - } - - b.wg.Wait() - - if b.c != nil { - b.c.Close() - } - - log.Info("syncer is closed") -} - -func (b *BinlogSyncer) isClosed() bool { - select { - case <-b.ctx.Done(): - return true - default: - return false - } -} - -func (b *BinlogSyncer) registerSlave() error { - if b.c != nil { - b.c.Close() - } - - log.Infof("register slave for master server %s:%d", b.cfg.Host, b.cfg.Port) - var err error - b.c, err = client.Connect(fmt.Sprintf("%s:%d", b.cfg.Host, b.cfg.Port), b.cfg.User, b.cfg.Password, "", func(c *client.Conn) { - c.TLSConfig = b.cfg.TLSConfig - }) - if err != nil { - return errors.Trace(err) - } - - if len(b.cfg.Charset) != 0 { - b.c.SetCharset(b.cfg.Charset) - } - - //set read timeout - if b.cfg.ReadTimeout > 0 { - b.c.SetReadDeadline(time.Now().Add(b.cfg.ReadTimeout)) - } - - if b.cfg.RecvBufferSize > 0 { - if tcp, ok := b.c.Conn.Conn.(*net.TCPConn); ok { - tcp.SetReadBuffer(b.cfg.RecvBufferSize) - } - } - - // kill last connection id - if b.lastConnectionID > 0 { - cmd := fmt.Sprintf("KILL %d", b.lastConnectionID) - if _, err := b.c.Execute(cmd); err != nil { - log.Errorf("kill connection %d error %v", b.lastConnectionID, err) - // Unknown thread id - if code := ErrorCode(err.Error()); code != ER_NO_SUCH_THREAD { - return errors.Trace(err) - } - } - log.Infof("kill last connection id %d", b.lastConnectionID) - } - - // save last last connection id for kill - b.lastConnectionID = b.c.GetConnectionID() - - //for mysql 5.6+, binlog has a crc32 checksum - //before mysql 5.6, this will not work, don't matter.:-) - if r, err := b.c.Execute("SHOW GLOBAL VARIABLES LIKE 'BINLOG_CHECKSUM'"); err != nil { - return errors.Trace(err) - } else { - s, _ := r.GetString(0, 1) - if s != "" { - // maybe CRC32 or NONE - - // mysqlbinlog.cc use NONE, see its below comments: - // Make a notice to the server that this client - // is checksum-aware. It does not need the first fake Rotate - // necessary checksummed. - // That preference is specified below. - - if _, err = b.c.Execute(`SET @master_binlog_checksum='NONE'`); err != nil { - return errors.Trace(err) - } - - // if _, err = b.c.Execute(`SET @master_binlog_checksum=@@global.binlog_checksum`); err != nil { - // return errors.Trace(err) - // } - - } - } - - if b.cfg.Flavor == MariaDBFlavor { - // Refer https://github.com/alibaba/canal/wiki/BinlogChange(MariaDB5&10) - // Tell the server that we understand GTIDs by setting our slave capability - // to MARIA_SLAVE_CAPABILITY_GTID = 4 (MariaDB >= 10.0.1). - if _, err := b.c.Execute("SET @mariadb_slave_capability=4"); err != nil { - return errors.Errorf("failed to set @mariadb_slave_capability=4: %v", err) - } - } - - if b.cfg.HeartbeatPeriod > 0 { - _, err = b.c.Execute(fmt.Sprintf("SET @master_heartbeat_period=%d;", b.cfg.HeartbeatPeriod)) - if err != nil { - log.Error("failed to set @master_heartbeat_period=%d", b.cfg.HeartbeatPeriod, err) - return errors.Trace(err) - } - } - - if err = b.writeRegisterSlaveCommand(); err != nil { - return errors.Trace(err) - } - - if _, err = b.c.ReadOKPacket(); err != nil { - return errors.Trace(err) - } - - return nil -} - -func (b *BinlogSyncer) enableSemiSync() error { - if !b.cfg.SemiSyncEnabled { - return nil - } - - if r, err := b.c.Execute("SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';"); err != nil { - return errors.Trace(err) - } else { - s, _ := r.GetString(0, 1) - if s != "ON" { - log.Errorf("master does not support semi synchronous replication, use no semi-sync") - b.cfg.SemiSyncEnabled = false - return nil - } - } - - _, err := b.c.Execute(`SET @rpl_semi_sync_slave = 1;`) - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func (b *BinlogSyncer) prepare() error { - if b.isClosed() { - return errors.Trace(ErrSyncClosed) - } - - if err := b.registerSlave(); err != nil { - return errors.Trace(err) - } - - if err := b.enableSemiSync(); err != nil { - return errors.Trace(err) - } - - return nil -} - -func (b *BinlogSyncer) startDumpStream() *BinlogStreamer { - b.running = true - - s := newBinlogStreamer() - - b.wg.Add(1) - go b.onStream(s) - return s -} - -// GetNextPosition returns the next position of the syncer -func (b *BinlogSyncer) GetNextPosition() Position { - return b.nextPos -} - -// StartSync starts syncing from the `pos` position. -func (b *BinlogSyncer) StartSync(pos Position) (*BinlogStreamer, error) { - log.Infof("begin to sync binlog from position %s", pos) - - b.m.Lock() - defer b.m.Unlock() - - if b.running { - return nil, errors.Trace(errSyncRunning) - } - - if err := b.prepareSyncPos(pos); err != nil { - return nil, errors.Trace(err) - } - - return b.startDumpStream(), nil -} - -// StartSyncGTID starts syncing from the `gset` GTIDSet. -func (b *BinlogSyncer) StartSyncGTID(gset GTIDSet) (*BinlogStreamer, error) { - log.Infof("begin to sync binlog from GTID set %s", gset) - - b.gset = gset - - b.m.Lock() - defer b.m.Unlock() - - if b.running { - return nil, errors.Trace(errSyncRunning) - } - - if err := b.prepare(); err != nil { - return nil, errors.Trace(err) - } - - var err error - switch b.cfg.Flavor { - case MariaDBFlavor: - err = b.writeBinlogDumpMariadbGTIDCommand(gset) - default: - // default use MySQL - err = b.writeBinlogDumpMysqlGTIDCommand(gset) - } - - if err != nil { - return nil, err - } - - return b.startDumpStream(), nil -} - -func (b *BinlogSyncer) writeBinlogDumpCommand(p Position) error { - b.c.ResetSequence() - - data := make([]byte, 4+1+4+2+4+len(p.Name)) - - pos := 4 - data[pos] = COM_BINLOG_DUMP - pos++ - - binary.LittleEndian.PutUint32(data[pos:], p.Pos) - pos += 4 - - binary.LittleEndian.PutUint16(data[pos:], BINLOG_DUMP_NEVER_STOP) - pos += 2 - - binary.LittleEndian.PutUint32(data[pos:], b.cfg.ServerID) - pos += 4 - - copy(data[pos:], p.Name) - - return b.c.WritePacket(data) -} - -func (b *BinlogSyncer) writeBinlogDumpMysqlGTIDCommand(gset GTIDSet) error { - p := Position{"", 4} - gtidData := gset.Encode() - - b.c.ResetSequence() - - data := make([]byte, 4+1+2+4+4+len(p.Name)+8+4+len(gtidData)) - pos := 4 - data[pos] = COM_BINLOG_DUMP_GTID - pos++ - - binary.LittleEndian.PutUint16(data[pos:], 0) - pos += 2 - - binary.LittleEndian.PutUint32(data[pos:], b.cfg.ServerID) - pos += 4 - - binary.LittleEndian.PutUint32(data[pos:], uint32(len(p.Name))) - pos += 4 - - n := copy(data[pos:], p.Name) - pos += n - - binary.LittleEndian.PutUint64(data[pos:], uint64(p.Pos)) - pos += 8 - - binary.LittleEndian.PutUint32(data[pos:], uint32(len(gtidData))) - pos += 4 - n = copy(data[pos:], gtidData) - pos += n - - data = data[0:pos] - - return b.c.WritePacket(data) -} - -func (b *BinlogSyncer) writeBinlogDumpMariadbGTIDCommand(gset GTIDSet) error { - // Copy from vitess - - startPos := gset.String() - - // Set the slave_connect_state variable before issuing COM_BINLOG_DUMP to - // provide the start position in GTID form. - query := fmt.Sprintf("SET @slave_connect_state='%s'", startPos) - - if _, err := b.c.Execute(query); err != nil { - return errors.Errorf("failed to set @slave_connect_state='%s': %v", startPos, err) - } - - // Real slaves set this upon connecting if their gtid_strict_mode option was - // enabled. We always use gtid_strict_mode because we need it to make our - // internal GTID comparisons safe. - if _, err := b.c.Execute("SET @slave_gtid_strict_mode=1"); err != nil { - return errors.Errorf("failed to set @slave_gtid_strict_mode=1: %v", err) - } - - // Since we use @slave_connect_state, the file and position here are ignored. - return b.writeBinlogDumpCommand(Position{"", 0}) -} - -// localHostname returns the hostname that register slave would register as. -func (b *BinlogSyncer) localHostname() string { - if len(b.cfg.Localhost) == 0 { - h, _ := os.Hostname() - return h - } - return b.cfg.Localhost -} - -func (b *BinlogSyncer) writeRegisterSlaveCommand() error { - b.c.ResetSequence() - - hostname := b.localHostname() - - // This should be the name of slave host not the host we are connecting to. - data := make([]byte, 4+1+4+1+len(hostname)+1+len(b.cfg.User)+1+len(b.cfg.Password)+2+4+4) - pos := 4 - - data[pos] = COM_REGISTER_SLAVE - pos++ - - binary.LittleEndian.PutUint32(data[pos:], b.cfg.ServerID) - pos += 4 - - // This should be the name of slave hostname not the host we are connecting to. - data[pos] = uint8(len(hostname)) - pos++ - n := copy(data[pos:], hostname) - pos += n - - data[pos] = uint8(len(b.cfg.User)) - pos++ - n = copy(data[pos:], b.cfg.User) - pos += n - - data[pos] = uint8(len(b.cfg.Password)) - pos++ - n = copy(data[pos:], b.cfg.Password) - pos += n - - binary.LittleEndian.PutUint16(data[pos:], b.cfg.Port) - pos += 2 - - //replication rank, not used - binary.LittleEndian.PutUint32(data[pos:], 0) - pos += 4 - - // master ID, 0 is OK - binary.LittleEndian.PutUint32(data[pos:], 0) - - return b.c.WritePacket(data) -} - -func (b *BinlogSyncer) replySemiSyncACK(p Position) error { - b.c.ResetSequence() - - data := make([]byte, 4+1+8+len(p.Name)) - pos := 4 - // semi sync indicator - data[pos] = SemiSyncIndicator - pos++ - - binary.LittleEndian.PutUint64(data[pos:], uint64(p.Pos)) - pos += 8 - - copy(data[pos:], p.Name) - - err := b.c.WritePacket(data) - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func (b *BinlogSyncer) retrySync() error { - b.m.Lock() - defer b.m.Unlock() - - b.parser.Reset() - - if b.gset != nil { - log.Infof("begin to re-sync from %s", b.gset.String()) - if err := b.prepareSyncGTID(b.gset); err != nil { - return errors.Trace(err) - } - } else { - log.Infof("begin to re-sync from %s", b.nextPos) - if err := b.prepareSyncPos(b.nextPos); err != nil { - return errors.Trace(err) - } - } - - return nil -} - -func (b *BinlogSyncer) prepareSyncPos(pos Position) error { - // always start from position 4 - if pos.Pos < 4 { - pos.Pos = 4 - } - - if err := b.prepare(); err != nil { - return errors.Trace(err) - } - - if err := b.writeBinlogDumpCommand(pos); err != nil { - return errors.Trace(err) - } - - return nil -} - -func (b *BinlogSyncer) prepareSyncGTID(gset GTIDSet) error { - var err error - - if err = b.prepare(); err != nil { - return errors.Trace(err) - } - - switch b.cfg.Flavor { - case MariaDBFlavor: - err = b.writeBinlogDumpMariadbGTIDCommand(gset) - default: - // default use MySQL - err = b.writeBinlogDumpMysqlGTIDCommand(gset) - } - - if err != nil { - return err - } - return nil -} - -func (b *BinlogSyncer) onStream(s *BinlogStreamer) { - defer func() { - if e := recover(); e != nil { - s.closeWithError(fmt.Errorf("Err: %v\n Stack: %s", e, Pstack())) - } - b.wg.Done() - }() - - for { - data, err := b.c.ReadPacket() - if err != nil { - log.Error(err) - - // we meet connection error, should re-connect again with - // last nextPos or nextGTID we got. - if len(b.nextPos.Name) == 0 && b.gset == nil { - // we can't get the correct position, close. - s.closeWithError(err) - return - } - - for { - select { - case <-b.ctx.Done(): - s.close() - return - case <-time.After(time.Second): - b.retryCount++ - if err = b.retrySync(); err != nil { - if b.cfg.MaxReconnectAttempts > 0 && b.retryCount >= b.cfg.MaxReconnectAttempts { - log.Errorf("retry sync err: %v, exceeded max retries (%d)", err, b.cfg.MaxReconnectAttempts) - s.closeWithError(err) - return - } - - log.Errorf("retry sync err: %v, wait 1s and retry again", err) - continue - } - } - - break - } - - // we connect the server and begin to re-sync again. - continue - } - - //set read timeout - if b.cfg.ReadTimeout > 0 { - b.c.SetReadDeadline(time.Now().Add(b.cfg.ReadTimeout)) - } - - // Reset retry count on successful packet receieve - b.retryCount = 0 - - switch data[0] { - case OK_HEADER: - if err = b.parseEvent(s, data); err != nil { - s.closeWithError(err) - return - } - case ERR_HEADER: - err = b.c.HandleErrorPacket(data) - s.closeWithError(err) - return - case EOF_HEADER: - // Refer http://dev.mysql.com/doc/internals/en/packet-EOF_Packet.html - // In the MySQL client/server protocol, EOF and OK packets serve the same purpose. - // Some users told me that they received EOF packet here, but I don't know why. - // So we only log a message and retry ReadPacket. - log.Info("receive EOF packet, retry ReadPacket") - continue - default: - log.Errorf("invalid stream header %c", data[0]) - continue - } - } -} - -func (b *BinlogSyncer) parseEvent(s *BinlogStreamer, data []byte) error { - //skip OK byte, 0x00 - data = data[1:] - - needACK := false - if b.cfg.SemiSyncEnabled && (data[0] == SemiSyncIndicator) { - needACK = (data[1] == 0x01) - //skip semi sync header - data = data[2:] - } - - e, err := b.parser.Parse(data) - if err != nil { - return errors.Trace(err) - } - - if e.Header.LogPos > 0 { - // Some events like FormatDescriptionEvent return 0, ignore. - b.nextPos.Pos = e.Header.LogPos - } - switch event := e.Event.(type) { - case *RotateEvent: - b.nextPos.Name = string(event.NextLogName) - b.nextPos.Pos = uint32(event.Position) - log.Infof("rotate to %s", b.nextPos) - case *GTIDEvent: - if b.gset == nil { - break - } - u, _ := uuid.FromBytes(event.SID) - err := b.gset.Update(fmt.Sprintf("%s:%d", u.String(), event.GNO)) - if err != nil { - return errors.Trace(err) - } - case *MariadbGTIDEvent: - if b.gset == nil { - break - } - GTID := event.GTID - err := b.gset.Update(fmt.Sprintf("%d-%d-%d", GTID.DomainID, GTID.ServerID, GTID.SequenceNumber)) - if err != nil { - return errors.Trace(err) - } - case *XIDEvent: - event.GSet = b.getGtidSet() - case *QueryEvent: - event.GSet = b.getGtidSet() - } - - needStop := false - select { - case s.ch <- e: - case <-b.ctx.Done(): - needStop = true - } - - if needACK { - err := b.replySemiSyncACK(b.nextPos) - if err != nil { - return errors.Trace(err) - } - } - - if needStop { - return errors.New("sync is been closing...") - } - - return nil -} - -func (b *BinlogSyncer) getGtidSet() GTIDSet { - var gtidSet GTIDSet - - if b.gset == nil { - return nil - } - - switch b.cfg.Flavor { - case MariaDBFlavor: - gtidSet, _ = ParseGTIDSet(MariaDBFlavor, b.gset.String()) - default: - gtidSet, _ = ParseGTIDSet(MySQLFlavor, b.gset.String()) - } - - return gtidSet -} - -// LastConnectionID returns last connectionID. -func (b *BinlogSyncer) LastConnectionID() uint32 { - return b.lastConnectionID -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/const.go b/vendor/github.com/siddontang/go-mysql/replication/const.go deleted file mode 100644 index ef82b6ce..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/const.go +++ /dev/null @@ -1,185 +0,0 @@ -package replication - -const ( - //we only support MySQL 5.0.0+ binlog format, maybe??? - MinBinlogVersion = 4 -) - -var ( - //binlog header [ fe `bin` ] - BinLogFileHeader []byte = []byte{0xfe, 0x62, 0x69, 0x6e} - - SemiSyncIndicator byte = 0xef -) - -const ( - LOG_EVENT_BINLOG_IN_USE_F uint16 = 0x0001 - LOG_EVENT_FORCED_ROTATE_F uint16 = 0x0002 - LOG_EVENT_THREAD_SPECIFIC_F uint16 = 0x0004 - LOG_EVENT_SUPPRESS_USE_F uint16 = 0x0008 - LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F uint16 = 0x0010 - LOG_EVENT_ARTIFICIAL_F uint16 = 0x0020 - LOG_EVENT_RELAY_LOG_F uint16 = 0x0040 - LOG_EVENT_IGNORABLE_F uint16 = 0x0080 - LOG_EVENT_NO_FILTER_F uint16 = 0x0100 - LOG_EVENT_MTS_ISOLATE_F uint16 = 0x0200 -) - -const ( - BINLOG_DUMP_NEVER_STOP uint16 = 0x00 - BINLOG_DUMP_NON_BLOCK uint16 = 0x01 - BINLOG_THROUGH_POSITION uint16 = 0x02 - BINLOG_THROUGH_GTID uint16 = 0x04 -) - -const ( - BINLOG_ROW_IMAGE_FULL = "FULL" - BINLOG_ROW_IAMGE_MINIMAL = "MINIMAL" - BINLOG_ROW_IMAGE_NOBLOB = "NOBLOB" -) - -type EventType byte - -const ( - UNKNOWN_EVENT EventType = iota - START_EVENT_V3 - QUERY_EVENT - STOP_EVENT - ROTATE_EVENT - INTVAR_EVENT - LOAD_EVENT - SLAVE_EVENT - CREATE_FILE_EVENT - APPEND_BLOCK_EVENT - EXEC_LOAD_EVENT - DELETE_FILE_EVENT - NEW_LOAD_EVENT - RAND_EVENT - USER_VAR_EVENT - FORMAT_DESCRIPTION_EVENT - XID_EVENT - BEGIN_LOAD_QUERY_EVENT - EXECUTE_LOAD_QUERY_EVENT - TABLE_MAP_EVENT - WRITE_ROWS_EVENTv0 - UPDATE_ROWS_EVENTv0 - DELETE_ROWS_EVENTv0 - WRITE_ROWS_EVENTv1 - UPDATE_ROWS_EVENTv1 - DELETE_ROWS_EVENTv1 - INCIDENT_EVENT - HEARTBEAT_EVENT - IGNORABLE_EVENT - ROWS_QUERY_EVENT - WRITE_ROWS_EVENTv2 - UPDATE_ROWS_EVENTv2 - DELETE_ROWS_EVENTv2 - GTID_EVENT - ANONYMOUS_GTID_EVENT - PREVIOUS_GTIDS_EVENT -) - -const ( - // MariaDB event starts from 160 - MARIADB_ANNOTATE_ROWS_EVENT EventType = 160 + iota - MARIADB_BINLOG_CHECKPOINT_EVENT - MARIADB_GTID_EVENT - MARIADB_GTID_LIST_EVENT -) - -func (e EventType) String() string { - switch e { - case UNKNOWN_EVENT: - return "UnknownEvent" - case START_EVENT_V3: - return "StartEventV3" - case QUERY_EVENT: - return "QueryEvent" - case STOP_EVENT: - return "StopEvent" - case ROTATE_EVENT: - return "RotateEvent" - case INTVAR_EVENT: - return "IntVarEvent" - case LOAD_EVENT: - return "LoadEvent" - case SLAVE_EVENT: - return "SlaveEvent" - case CREATE_FILE_EVENT: - return "CreateFileEvent" - case APPEND_BLOCK_EVENT: - return "AppendBlockEvent" - case EXEC_LOAD_EVENT: - return "ExecLoadEvent" - case DELETE_FILE_EVENT: - return "DeleteFileEvent" - case NEW_LOAD_EVENT: - return "NewLoadEvent" - case RAND_EVENT: - return "RandEvent" - case USER_VAR_EVENT: - return "UserVarEvent" - case FORMAT_DESCRIPTION_EVENT: - return "FormatDescriptionEvent" - case XID_EVENT: - return "XIDEvent" - case BEGIN_LOAD_QUERY_EVENT: - return "BeginLoadQueryEvent" - case EXECUTE_LOAD_QUERY_EVENT: - return "ExectueLoadQueryEvent" - case TABLE_MAP_EVENT: - return "TableMapEvent" - case WRITE_ROWS_EVENTv0: - return "WriteRowsEventV0" - case UPDATE_ROWS_EVENTv0: - return "UpdateRowsEventV0" - case DELETE_ROWS_EVENTv0: - return "DeleteRowsEventV0" - case WRITE_ROWS_EVENTv1: - return "WriteRowsEventV1" - case UPDATE_ROWS_EVENTv1: - return "UpdateRowsEventV1" - case DELETE_ROWS_EVENTv1: - return "DeleteRowsEventV1" - case INCIDENT_EVENT: - return "IncidentEvent" - case HEARTBEAT_EVENT: - return "HeartbeatEvent" - case IGNORABLE_EVENT: - return "IgnorableEvent" - case ROWS_QUERY_EVENT: - return "RowsQueryEvent" - case WRITE_ROWS_EVENTv2: - return "WriteRowsEventV2" - case UPDATE_ROWS_EVENTv2: - return "UpdateRowsEventV2" - case DELETE_ROWS_EVENTv2: - return "DeleteRowsEventV2" - case GTID_EVENT: - return "GTIDEvent" - case ANONYMOUS_GTID_EVENT: - return "AnonymousGTIDEvent" - case PREVIOUS_GTIDS_EVENT: - return "PreviousGTIDsEvent" - case MARIADB_ANNOTATE_ROWS_EVENT: - return "MariadbAnnotateRowsEvent" - case MARIADB_BINLOG_CHECKPOINT_EVENT: - return "MariadbBinLogCheckPointEvent" - case MARIADB_GTID_EVENT: - return "MariadbGTIDEvent" - case MARIADB_GTID_LIST_EVENT: - return "MariadbGTIDListEvent" - - default: - return "UnknownEvent" - } -} - -const ( - BINLOG_CHECKSUM_ALG_OFF byte = 0 // Events are without checksum though its generator - // is checksum-capable New Master (NM). - BINLOG_CHECKSUM_ALG_CRC32 byte = 1 // CRC32 of zlib algorithm. - // BINLOG_CHECKSUM_ALG_ENUM_END, // the cut line: valid alg range is [1, 0x7f]. - BINLOG_CHECKSUM_ALG_UNDEF byte = 255 // special value to tag undetermined yet checksum - // or events from checksum-unaware servers -) diff --git a/vendor/github.com/siddontang/go-mysql/replication/doc.go b/vendor/github.com/siddontang/go-mysql/replication/doc.go deleted file mode 100644 index 790eb452..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -/* -Replication package is to handle MySQL replication protocol. - -Todo: - -+ Get table information when handing rows event. -*/ -package replication diff --git a/vendor/github.com/siddontang/go-mysql/replication/event.go b/vendor/github.com/siddontang/go-mysql/replication/event.go deleted file mode 100644 index 091181b1..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/event.go +++ /dev/null @@ -1,487 +0,0 @@ -package replication - -import ( - "encoding/binary" - //"encoding/hex" - "fmt" - "io" - "strconv" - "strings" - "time" - "unicode" - - "github.com/juju/errors" - "github.com/satori/go.uuid" - . "github.com/siddontang/go-mysql/mysql" -) - -const ( - EventHeaderSize = 19 - SidLength = 16 - LogicalTimestampTypeCode = 2 - PartLogicalTimestampLength = 8 -) - -type BinlogEvent struct { - // raw binlog data, including crc32 checksum if exists - RawData []byte - - Header *EventHeader - Event Event -} - -func (e *BinlogEvent) Dump(w io.Writer) { - e.Header.Dump(w) - e.Event.Dump(w) -} - -type Event interface { - //Dump Event, format like python-mysql-replication - Dump(w io.Writer) - - Decode(data []byte) error -} - -type EventError struct { - Header *EventHeader - - //Error message - Err string - - //Event data - Data []byte -} - -func (e *EventError) Error() string { - return fmt.Sprintf("Header %#v, Data %q, Err: %v", e.Header, e.Data, e.Err) -} - -type EventHeader struct { - Timestamp uint32 - EventType EventType - ServerID uint32 - EventSize uint32 - LogPos uint32 - Flags uint16 -} - -func (h *EventHeader) Decode(data []byte) error { - if len(data) < EventHeaderSize { - return errors.Errorf("header size too short %d, must 19", len(data)) - } - - pos := 0 - - h.Timestamp = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - h.EventType = EventType(data[pos]) - pos++ - - h.ServerID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - h.EventSize = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - h.LogPos = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - h.Flags = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - if h.EventSize < uint32(EventHeaderSize) { - return errors.Errorf("invalid event size %d, must >= 19", h.EventSize) - } - - return nil -} - -func (h *EventHeader) Dump(w io.Writer) { - fmt.Fprintf(w, "=== %s ===\n", EventType(h.EventType)) - fmt.Fprintf(w, "Date: %s\n", time.Unix(int64(h.Timestamp), 0).Format(TimeFormat)) - fmt.Fprintf(w, "Log position: %d\n", h.LogPos) - fmt.Fprintf(w, "Event size: %d\n", h.EventSize) -} - -var ( - checksumVersionSplitMysql []int = []int{5, 6, 1} - checksumVersionProductMysql int = (checksumVersionSplitMysql[0]*256+checksumVersionSplitMysql[1])*256 + checksumVersionSplitMysql[2] - - checksumVersionSplitMariaDB []int = []int{5, 3, 0} - checksumVersionProductMariaDB int = (checksumVersionSplitMariaDB[0]*256+checksumVersionSplitMariaDB[1])*256 + checksumVersionSplitMariaDB[2] -) - -// server version format X.Y.Zabc, a is not . or number -func splitServerVersion(server string) []int { - seps := strings.Split(server, ".") - if len(seps) < 3 { - return []int{0, 0, 0} - } - - x, _ := strconv.Atoi(seps[0]) - y, _ := strconv.Atoi(seps[1]) - - index := 0 - for i, c := range seps[2] { - if !unicode.IsNumber(c) { - index = i - break - } - } - - z, _ := strconv.Atoi(seps[2][0:index]) - - return []int{x, y, z} -} - -func calcVersionProduct(server string) int { - versionSplit := splitServerVersion(server) - - return ((versionSplit[0]*256+versionSplit[1])*256 + versionSplit[2]) -} - -type FormatDescriptionEvent struct { - Version uint16 - //len = 50 - ServerVersion []byte - CreateTimestamp uint32 - EventHeaderLength uint8 - EventTypeHeaderLengths []byte - - // 0 is off, 1 is for CRC32, 255 is undefined - ChecksumAlgorithm byte -} - -func (e *FormatDescriptionEvent) Decode(data []byte) error { - pos := 0 - e.Version = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - e.ServerVersion = make([]byte, 50) - copy(e.ServerVersion, data[pos:]) - pos += 50 - - e.CreateTimestamp = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.EventHeaderLength = data[pos] - pos++ - - if e.EventHeaderLength != byte(EventHeaderSize) { - return errors.Errorf("invalid event header length %d, must 19", e.EventHeaderLength) - } - - server := string(e.ServerVersion) - checksumProduct := checksumVersionProductMysql - if strings.Contains(strings.ToLower(server), "mariadb") { - checksumProduct = checksumVersionProductMariaDB - } - - if calcVersionProduct(string(e.ServerVersion)) >= checksumProduct { - // here, the last 5 bytes is 1 byte check sum alg type and 4 byte checksum if exists - e.ChecksumAlgorithm = data[len(data)-5] - e.EventTypeHeaderLengths = data[pos : len(data)-5] - } else { - e.ChecksumAlgorithm = BINLOG_CHECKSUM_ALG_UNDEF - e.EventTypeHeaderLengths = data[pos:] - } - - return nil -} - -func (e *FormatDescriptionEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Version: %d\n", e.Version) - fmt.Fprintf(w, "Server version: %s\n", e.ServerVersion) - //fmt.Fprintf(w, "Create date: %s\n", time.Unix(int64(e.CreateTimestamp), 0).Format(TimeFormat)) - fmt.Fprintf(w, "Checksum algorithm: %d\n", e.ChecksumAlgorithm) - //fmt.Fprintf(w, "Event header lengths: \n%s", hex.Dump(e.EventTypeHeaderLengths)) - fmt.Fprintln(w) -} - -type RotateEvent struct { - Position uint64 - NextLogName []byte -} - -func (e *RotateEvent) Decode(data []byte) error { - e.Position = binary.LittleEndian.Uint64(data[0:]) - e.NextLogName = data[8:] - - return nil -} - -func (e *RotateEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Position: %d\n", e.Position) - fmt.Fprintf(w, "Next log name: %s\n", e.NextLogName) - fmt.Fprintln(w) -} - -type XIDEvent struct { - XID uint64 - - // in fact XIDEvent dosen't have the GTIDSet information, just for beneficial to use - GSet GTIDSet -} - -func (e *XIDEvent) Decode(data []byte) error { - e.XID = binary.LittleEndian.Uint64(data) - return nil -} - -func (e *XIDEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "XID: %d\n", e.XID) - if e.GSet != nil { - fmt.Fprintf(w, "GTIDSet: %s\n", e.GSet.String()) - } - fmt.Fprintln(w) -} - -type QueryEvent struct { - SlaveProxyID uint32 - ExecutionTime uint32 - ErrorCode uint16 - StatusVars []byte - Schema []byte - Query []byte - - // in fact QueryEvent dosen't have the GTIDSet information, just for beneficial to use - GSet GTIDSet -} - -func (e *QueryEvent) Decode(data []byte) error { - pos := 0 - - e.SlaveProxyID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.ExecutionTime = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - schemaLength := uint8(data[pos]) - pos++ - - e.ErrorCode = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - statusVarsLength := binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - e.StatusVars = data[pos : pos+int(statusVarsLength)] - pos += int(statusVarsLength) - - e.Schema = data[pos : pos+int(schemaLength)] - pos += int(schemaLength) - - //skip 0x00 - pos++ - - e.Query = data[pos:] - return nil -} - -func (e *QueryEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Slave proxy ID: %d\n", e.SlaveProxyID) - fmt.Fprintf(w, "Execution time: %d\n", e.ExecutionTime) - fmt.Fprintf(w, "Error code: %d\n", e.ErrorCode) - //fmt.Fprintf(w, "Status vars: \n%s", hex.Dump(e.StatusVars)) - fmt.Fprintf(w, "Schema: %s\n", e.Schema) - fmt.Fprintf(w, "Query: %s\n", e.Query) - if e.GSet != nil { - fmt.Fprintf(w, "GTIDSet: %s\n", e.GSet.String()) - } - fmt.Fprintln(w) -} - -type GTIDEvent struct { - CommitFlag uint8 - SID []byte - GNO int64 - LastCommitted int64 - SequenceNumber int64 -} - -func (e *GTIDEvent) Decode(data []byte) error { - pos := 0 - e.CommitFlag = uint8(data[pos]) - pos++ - e.SID = data[pos : pos+SidLength] - pos += SidLength - e.GNO = int64(binary.LittleEndian.Uint64(data[pos:])) - pos += 8 - if len(data) >= 42 { - if uint8(data[pos]) == LogicalTimestampTypeCode { - pos++ - e.LastCommitted = int64(binary.LittleEndian.Uint64(data[pos:])) - pos += PartLogicalTimestampLength - e.SequenceNumber = int64(binary.LittleEndian.Uint64(data[pos:])) - } - } - return nil -} - -func (e *GTIDEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Commit flag: %d\n", e.CommitFlag) - u, _ := uuid.FromBytes(e.SID) - fmt.Fprintf(w, "GTID_NEXT: %s:%d\n", u.String(), e.GNO) - fmt.Fprintf(w, "LAST_COMMITTED: %d\n", e.LastCommitted) - fmt.Fprintf(w, "SEQUENCE_NUMBER: %d\n", e.SequenceNumber) - fmt.Fprintln(w) -} - -type BeginLoadQueryEvent struct { - FileID uint32 - BlockData []byte -} - -func (e *BeginLoadQueryEvent) Decode(data []byte) error { - pos := 0 - - e.FileID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.BlockData = data[pos:] - - return nil -} - -func (e *BeginLoadQueryEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "File ID: %d\n", e.FileID) - fmt.Fprintf(w, "Block data: %s\n", e.BlockData) - fmt.Fprintln(w) -} - -type ExecuteLoadQueryEvent struct { - SlaveProxyID uint32 - ExecutionTime uint32 - SchemaLength uint8 - ErrorCode uint16 - StatusVars uint16 - FileID uint32 - StartPos uint32 - EndPos uint32 - DupHandlingFlags uint8 -} - -func (e *ExecuteLoadQueryEvent) Decode(data []byte) error { - pos := 0 - - e.SlaveProxyID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.ExecutionTime = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.SchemaLength = uint8(data[pos]) - pos++ - - e.ErrorCode = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - e.StatusVars = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - e.FileID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.StartPos = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.EndPos = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - e.DupHandlingFlags = uint8(data[pos]) - - return nil -} - -func (e *ExecuteLoadQueryEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Slave proxy ID: %d\n", e.SlaveProxyID) - fmt.Fprintf(w, "Execution time: %d\n", e.ExecutionTime) - fmt.Fprintf(w, "Schame length: %d\n", e.SchemaLength) - fmt.Fprintf(w, "Error code: %d\n", e.ErrorCode) - fmt.Fprintf(w, "Status vars length: %d\n", e.StatusVars) - fmt.Fprintf(w, "File ID: %d\n", e.FileID) - fmt.Fprintf(w, "Start pos: %d\n", e.StartPos) - fmt.Fprintf(w, "End pos: %d\n", e.EndPos) - fmt.Fprintf(w, "Dup handling flags: %d\n", e.DupHandlingFlags) - fmt.Fprintln(w) -} - -// case MARIADB_ANNOTATE_ROWS_EVENT: -// return "MariadbAnnotateRowsEvent" - -type MariadbAnnotateRowsEvent struct { - Query []byte -} - -func (e *MariadbAnnotateRowsEvent) Decode(data []byte) error { - e.Query = data - return nil -} - -func (e *MariadbAnnotateRowsEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Query: %s\n", e.Query) - fmt.Fprintln(w) -} - -type MariadbBinlogCheckPointEvent struct { - Info []byte -} - -func (e *MariadbBinlogCheckPointEvent) Decode(data []byte) error { - e.Info = data - return nil -} - -func (e *MariadbBinlogCheckPointEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Info: %s\n", e.Info) - fmt.Fprintln(w) -} - -type MariadbGTIDEvent struct { - GTID MariadbGTID -} - -func (e *MariadbGTIDEvent) Decode(data []byte) error { - e.GTID.SequenceNumber = binary.LittleEndian.Uint64(data) - e.GTID.DomainID = binary.LittleEndian.Uint32(data[8:]) - - // we don't care commit id now, maybe later - - return nil -} - -func (e *MariadbGTIDEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "GTID: %v\n", e.GTID) - fmt.Fprintln(w) -} - -type MariadbGTIDListEvent struct { - GTIDs []MariadbGTID -} - -func (e *MariadbGTIDListEvent) Decode(data []byte) error { - pos := 0 - v := binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - - count := v & uint32((1<<28)-1) - - e.GTIDs = make([]MariadbGTID, count) - - for i := uint32(0); i < count; i++ { - e.GTIDs[i].DomainID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - e.GTIDs[i].ServerID = binary.LittleEndian.Uint32(data[pos:]) - pos += 4 - e.GTIDs[i].SequenceNumber = binary.LittleEndian.Uint64(data[pos:]) - } - - return nil -} - -func (e *MariadbGTIDListEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Lists: %v\n", e.GTIDs) - fmt.Fprintln(w) -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/generic_event.go b/vendor/github.com/siddontang/go-mysql/replication/generic_event.go deleted file mode 100644 index b0fa83a3..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/generic_event.go +++ /dev/null @@ -1,171 +0,0 @@ -package replication - -import ( - "encoding/hex" - "fmt" - "io" -) - -// we don't parse all event, so some we will use GenericEvent instead -type GenericEvent struct { - Data []byte -} - -func (e *GenericEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Event data: \n%s", hex.Dump(e.Data)) - fmt.Fprintln(w) -} - -func (e *GenericEvent) Decode(data []byte) error { - e.Data = data - - return nil -} - -//below events are generic events, maybe later I will consider handle some. - -// type StartEventV3 struct { -// Version uint16 -// ServerVersion [50]byte -// CreateTimestamp uint32 -// } - -// type StopEvent struct{} - -// type LoadEvent struct { -// SlaveProxyID uint32 -// ExecTime uint32 -// SkipLines uint32 -// TableNameLen uint8 -// SchemaLen uint8 -// NumFileds uint32 -// FieldTerm uint8 -// EnclosedBy uint8 -// LineTerm uint8 -// LineStart uint8 -// EscapedBy uint8 -// OptFlags uint8 -// EmptyFlags uint8 - -// //len = 1 * NumFields -// FieldNameLengths []byte - -// //len = sum(FieldNameLengths) + NumFields -// //array of nul-terminated strings -// FieldNames []byte - -// //len = TableNameLen + 1, nul-terminated string -// TableName []byte - -// //len = SchemaLen + 1, nul-terminated string -// SchemaName []byte - -// //string.NUL -// FileName []byte -// } - -// type NewLoadEvent struct { -// SlaveProxyID uint32 -// ExecTime uint32 -// SkipLines uint32 -// TableNameLen uint8 -// SchemaLen uint8 -// NumFields uint32 -// FieldTermLen uint8 -// FieldTerm []byte -// EnclosedByLen uint8 -// EnclosedBy []byte -// LineTermLen uint8 -// LineTerm []byte -// LineStartLen uint8 -// LineStart []byte -// EscapedByLen uint8 -// EscapedBy []byte -// OptFlags uint8 - -// //len = 1 * NumFields -// FieldNameLengths []byte - -// //len = sum(FieldNameLengths) + NumFields -// //array of nul-terminated strings -// FieldNames []byte - -// //len = TableNameLen, nul-terminated string -// TableName []byte - -// //len = SchemaLen, nul-terminated string -// SchemaName []byte - -// //string.EOF -// FileName []byte -// } - -// type CreateFileEvent struct { -// FileID uint32 -// BlockData []byte -// } - -// type AppendBlockEvent struct { -// FileID uint32 -// BlockData []byte -// } - -// type ExecLoadEvent struct { -// FileID uint32 -// } - -// type BeginLoadQueryEvent struct { -// FileID uint32 -// BlockData []byte -// } - -// type ExecuteLoadQueryEvent struct { -// SlaveProxyID uint32 -// ExecutionTime uint32 -// SchemaLength uint8 -// ErrorCode uint16 -// StatusVarsLength uint16 - -// FileID uint32 -// StartPos uint32 -// EndPos uint32 -// DupHandlingFlags uint8 -// } - -// type DeleteFileEvent struct { -// FileID uint32 -// } - -// type RandEvent struct { -// Seed1 uint64 -// Seed2 uint64 -// } - -// type IntVarEvent struct { -// Type uint8 -// Value uint64 -// } - -// type UserVarEvent struct { -// NameLength uint32 -// Name []byte -// IsNull uint8 - -// //if not is null -// Type uint8 -// Charset uint32 -// ValueLength uint32 -// Value []byte - -// //if more data -// Flags uint8 -// } - -// type IncidentEvent struct { -// Type uint16 -// MessageLength uint8 -// Message []byte -// } - -// type HeartbeatEvent struct { -// } diff --git a/vendor/github.com/siddontang/go-mysql/replication/json_binary.go b/vendor/github.com/siddontang/go-mysql/replication/json_binary.go deleted file mode 100644 index ca754df7..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/json_binary.go +++ /dev/null @@ -1,485 +0,0 @@ -package replication - -import ( - "encoding/json" - "fmt" - "math" - - "github.com/juju/errors" - . "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go/hack" -) - -const ( - JSONB_SMALL_OBJECT byte = iota // small JSON object - JSONB_LARGE_OBJECT // large JSON object - JSONB_SMALL_ARRAY // small JSON array - JSONB_LARGE_ARRAY // large JSON array - JSONB_LITERAL // literal (true/false/null) - JSONB_INT16 // int16 - JSONB_UINT16 // uint16 - JSONB_INT32 // int32 - JSONB_UINT32 // uint32 - JSONB_INT64 // int64 - JSONB_UINT64 // uint64 - JSONB_DOUBLE // double - JSONB_STRING // string - JSONB_OPAQUE byte = 0x0f // custom data (any MySQL data type) -) - -const ( - JSONB_NULL_LITERAL byte = 0x00 - JSONB_TRUE_LITERAL byte = 0x01 - JSONB_FALSE_LITERAL byte = 0x02 -) - -const ( - jsonbSmallOffsetSize = 2 - jsonbLargeOffsetSize = 4 - - jsonbKeyEntrySizeSmall = 2 + jsonbSmallOffsetSize - jsonbKeyEntrySizeLarge = 2 + jsonbLargeOffsetSize - - jsonbValueEntrySizeSmall = 1 + jsonbSmallOffsetSize - jsonbValueEntrySizeLarge = 1 + jsonbLargeOffsetSize -) - -func jsonbGetOffsetSize(isSmall bool) int { - if isSmall { - return jsonbSmallOffsetSize - } - - return jsonbLargeOffsetSize -} - -func jsonbGetKeyEntrySize(isSmall bool) int { - if isSmall { - return jsonbKeyEntrySizeSmall - } - - return jsonbKeyEntrySizeLarge -} - -func jsonbGetValueEntrySize(isSmall bool) int { - if isSmall { - return jsonbValueEntrySizeSmall - } - - return jsonbValueEntrySizeLarge -} - -// decodeJsonBinary decodes the JSON binary encoding data and returns -// the common JSON encoding data. -func (e *RowsEvent) decodeJsonBinary(data []byte) ([]byte, error) { - // Sometimes, we can insert a NULL JSON even we set the JSON field as NOT NULL. - // If we meet this case, we can return an empty slice. - if len(data) == 0 { - return []byte{}, nil - } - d := jsonBinaryDecoder{useDecimal: e.useDecimal} - - if d.isDataShort(data, 1) { - return nil, d.err - } - - v := d.decodeValue(data[0], data[1:]) - if d.err != nil { - return nil, d.err - } - - return json.Marshal(v) -} - -type jsonBinaryDecoder struct { - useDecimal bool - err error -} - -func (d *jsonBinaryDecoder) decodeValue(tp byte, data []byte) interface{} { - if d.err != nil { - return nil - } - - switch tp { - case JSONB_SMALL_OBJECT: - return d.decodeObjectOrArray(data, true, true) - case JSONB_LARGE_OBJECT: - return d.decodeObjectOrArray(data, false, true) - case JSONB_SMALL_ARRAY: - return d.decodeObjectOrArray(data, true, false) - case JSONB_LARGE_ARRAY: - return d.decodeObjectOrArray(data, false, false) - case JSONB_LITERAL: - return d.decodeLiteral(data) - case JSONB_INT16: - return d.decodeInt16(data) - case JSONB_UINT16: - return d.decodeUint16(data) - case JSONB_INT32: - return d.decodeInt32(data) - case JSONB_UINT32: - return d.decodeUint32(data) - case JSONB_INT64: - return d.decodeInt64(data) - case JSONB_UINT64: - return d.decodeUint64(data) - case JSONB_DOUBLE: - return d.decodeDouble(data) - case JSONB_STRING: - return d.decodeString(data) - case JSONB_OPAQUE: - return d.decodeOpaque(data) - default: - d.err = errors.Errorf("invalid json type %d", tp) - } - - return nil -} - -func (d *jsonBinaryDecoder) decodeObjectOrArray(data []byte, isSmall bool, isObject bool) interface{} { - offsetSize := jsonbGetOffsetSize(isSmall) - if d.isDataShort(data, 2*offsetSize) { - return nil - } - - count := d.decodeCount(data, isSmall) - size := d.decodeCount(data[offsetSize:], isSmall) - - if d.isDataShort(data, int(size)) { - return nil - } - - keyEntrySize := jsonbGetKeyEntrySize(isSmall) - valueEntrySize := jsonbGetValueEntrySize(isSmall) - - headerSize := 2*offsetSize + count*valueEntrySize - - if isObject { - headerSize += count * keyEntrySize - } - - if headerSize > size { - d.err = errors.Errorf("header size %d > size %d", headerSize, size) - return nil - } - - var keys []string - if isObject { - keys = make([]string, count) - for i := 0; i < count; i++ { - // decode key - entryOffset := 2*offsetSize + keyEntrySize*i - keyOffset := d.decodeCount(data[entryOffset:], isSmall) - keyLength := int(d.decodeUint16(data[entryOffset+offsetSize:])) - - // Key must start after value entry - if keyOffset < headerSize { - d.err = errors.Errorf("invalid key offset %d, must > %d", keyOffset, headerSize) - return nil - } - - if d.isDataShort(data, keyOffset+keyLength) { - return nil - } - - keys[i] = hack.String(data[keyOffset : keyOffset+keyLength]) - } - } - - if d.err != nil { - return nil - } - - values := make([]interface{}, count) - for i := 0; i < count; i++ { - // decode value - entryOffset := 2*offsetSize + valueEntrySize*i - if isObject { - entryOffset += keyEntrySize * count - } - - tp := data[entryOffset] - - if isInlineValue(tp, isSmall) { - values[i] = d.decodeValue(tp, data[entryOffset+1:entryOffset+valueEntrySize]) - continue - } - - valueOffset := d.decodeCount(data[entryOffset+1:], isSmall) - - if d.isDataShort(data, valueOffset) { - return nil - } - - values[i] = d.decodeValue(tp, data[valueOffset:]) - } - - if d.err != nil { - return nil - } - - if !isObject { - return values - } - - m := make(map[string]interface{}, count) - for i := 0; i < count; i++ { - m[keys[i]] = values[i] - } - - return m -} - -func isInlineValue(tp byte, isSmall bool) bool { - switch tp { - case JSONB_INT16, JSONB_UINT16, JSONB_LITERAL: - return true - case JSONB_INT32, JSONB_UINT32: - return !isSmall - } - - return false -} - -func (d *jsonBinaryDecoder) decodeLiteral(data []byte) interface{} { - if d.isDataShort(data, 1) { - return nil - } - - tp := data[0] - - switch tp { - case JSONB_NULL_LITERAL: - return nil - case JSONB_TRUE_LITERAL: - return true - case JSONB_FALSE_LITERAL: - return false - } - - d.err = errors.Errorf("invalid literal %c", tp) - - return nil -} - -func (d *jsonBinaryDecoder) isDataShort(data []byte, expected int) bool { - if d.err != nil { - return true - } - - if len(data) < expected { - d.err = errors.Errorf("data len %d < expected %d", len(data), expected) - } - - return d.err != nil -} - -func (d *jsonBinaryDecoder) decodeInt16(data []byte) int16 { - if d.isDataShort(data, 2) { - return 0 - } - - v := ParseBinaryInt16(data[0:2]) - return v -} - -func (d *jsonBinaryDecoder) decodeUint16(data []byte) uint16 { - if d.isDataShort(data, 2) { - return 0 - } - - v := ParseBinaryUint16(data[0:2]) - return v -} - -func (d *jsonBinaryDecoder) decodeInt32(data []byte) int32 { - if d.isDataShort(data, 4) { - return 0 - } - - v := ParseBinaryInt32(data[0:4]) - return v -} - -func (d *jsonBinaryDecoder) decodeUint32(data []byte) uint32 { - if d.isDataShort(data, 4) { - return 0 - } - - v := ParseBinaryUint32(data[0:4]) - return v -} - -func (d *jsonBinaryDecoder) decodeInt64(data []byte) int64 { - if d.isDataShort(data, 8) { - return 0 - } - - v := ParseBinaryInt64(data[0:8]) - return v -} - -func (d *jsonBinaryDecoder) decodeUint64(data []byte) uint64 { - if d.isDataShort(data, 8) { - return 0 - } - - v := ParseBinaryUint64(data[0:8]) - return v -} - -func (d *jsonBinaryDecoder) decodeDouble(data []byte) float64 { - if d.isDataShort(data, 8) { - return 0 - } - - v := ParseBinaryFloat64(data[0:8]) - return v -} - -func (d *jsonBinaryDecoder) decodeString(data []byte) string { - if d.err != nil { - return "" - } - - l, n := d.decodeVariableLength(data) - - if d.isDataShort(data, l+n) { - return "" - } - - data = data[n:] - - v := hack.String(data[0:l]) - return v -} - -func (d *jsonBinaryDecoder) decodeOpaque(data []byte) interface{} { - if d.isDataShort(data, 1) { - return nil - } - - tp := data[0] - data = data[1:] - - l, n := d.decodeVariableLength(data) - - if d.isDataShort(data, l+n) { - return nil - } - - data = data[n : l+n] - - switch tp { - case MYSQL_TYPE_NEWDECIMAL: - return d.decodeDecimal(data) - case MYSQL_TYPE_TIME: - return d.decodeTime(data) - case MYSQL_TYPE_DATE, MYSQL_TYPE_DATETIME, MYSQL_TYPE_TIMESTAMP: - return d.decodeDateTime(data) - default: - return hack.String(data) - } - - return nil -} - -func (d *jsonBinaryDecoder) decodeDecimal(data []byte) interface{} { - precision := int(data[0]) - scale := int(data[1]) - - v, _, err := decodeDecimal(data[2:], precision, scale, d.useDecimal) - d.err = err - - return v -} - -func (d *jsonBinaryDecoder) decodeTime(data []byte) interface{} { - v := d.decodeInt64(data) - - if v == 0 { - return "00:00:00" - } - - sign := "" - if v < 0 { - sign = "-" - v = -v - } - - intPart := v >> 24 - hour := (intPart >> 12) % (1 << 10) - min := (intPart >> 6) % (1 << 6) - sec := intPart % (1 << 6) - frac := v % (1 << 24) - - return fmt.Sprintf("%s%02d:%02d:%02d.%06d", sign, hour, min, sec, frac) -} - -func (d *jsonBinaryDecoder) decodeDateTime(data []byte) interface{} { - v := d.decodeInt64(data) - if v == 0 { - return "0000-00-00 00:00:00" - } - - // handle negative? - if v < 0 { - v = -v - } - - intPart := v >> 24 - ymd := intPart >> 17 - ym := ymd >> 5 - hms := intPart % (1 << 17) - - year := ym / 13 - month := ym % 13 - day := ymd % (1 << 5) - hour := (hms >> 12) - minute := (hms >> 6) % (1 << 6) - second := hms % (1 << 6) - frac := v % (1 << 24) - - return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d.%06d", year, month, day, hour, minute, second, frac) - -} - -func (d *jsonBinaryDecoder) decodeCount(data []byte, isSmall bool) int { - if isSmall { - v := d.decodeUint16(data) - return int(v) - } - - return int(d.decodeUint32(data)) -} - -func (d *jsonBinaryDecoder) decodeVariableLength(data []byte) (int, int) { - // The max size for variable length is math.MaxUint32, so - // here we can use 5 bytes to save it. - maxCount := 5 - if len(data) < maxCount { - maxCount = len(data) - } - - pos := 0 - length := uint64(0) - for ; pos < maxCount; pos++ { - v := data[pos] - length |= uint64(v&0x7F) << uint(7*pos) - - if v&0x80 == 0 { - if length > math.MaxUint32 { - d.err = errors.Errorf("variable length %d must <= %d", length, math.MaxUint32) - return 0, 0 - } - - pos += 1 - // TODO: should consider length overflow int here. - return int(length), pos - } - } - - d.err = errors.New("decode variable length failed") - - return 0, 0 -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/parser.go b/vendor/github.com/siddontang/go-mysql/replication/parser.go deleted file mode 100644 index ad325921..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/parser.go +++ /dev/null @@ -1,341 +0,0 @@ -package replication - -import ( - "bytes" - "fmt" - "io" - "os" - "sync/atomic" - - "github.com/juju/errors" -) - -type BinlogParser struct { - format *FormatDescriptionEvent - - tables map[uint64]*TableMapEvent - - // for rawMode, we only parse FormatDescriptionEvent and RotateEvent - rawMode bool - - parseTime bool - - // used to start/stop processing - stopProcessing uint32 - - useDecimal bool -} - -func NewBinlogParser() *BinlogParser { - p := new(BinlogParser) - - p.tables = make(map[uint64]*TableMapEvent) - // p.stop = make(uint32) - - return p -} - -func (p *BinlogParser) Stop() { - atomic.StoreUint32(&p.stopProcessing, 1) -} - -func (p *BinlogParser) Resume() { - atomic.StoreUint32(&p.stopProcessing, 0) -} - -func (p *BinlogParser) Reset() { - p.format = nil -} - -type OnEventFunc func(*BinlogEvent) error - -func (p *BinlogParser) ParseFile(name string, offset int64, onEvent OnEventFunc) error { - f, err := os.Open(name) - if err != nil { - return errors.Trace(err) - } - defer f.Close() - - b := make([]byte, 4) - if _, err = f.Read(b); err != nil { - return errors.Trace(err) - } else if !bytes.Equal(b, BinLogFileHeader) { - return errors.Errorf("%s is not a valid binlog file, head 4 bytes must fe'bin' ", name) - } - - if offset < 4 { - offset = 4 - } else if offset > 4 { - // FORMAT_DESCRIPTION event should be read by default always (despite that fact passed offset may be higher than 4) - if _, err = f.Seek(4, os.SEEK_SET); err != nil { - return errors.Errorf("seek %s to %d error %v", name, offset, err) - } - - if err = p.parseFormatDescriptionEvent(f, onEvent); err != nil { - return errors.Annotatef(err, "parse FormatDescriptionEvent") - } - } - - if _, err = f.Seek(offset, os.SEEK_SET); err != nil { - return errors.Errorf("seek %s to %d error %v", name, offset, err) - } - - return p.ParseReader(f, onEvent) -} - -func (p *BinlogParser) parseFormatDescriptionEvent(r io.Reader, onEvent OnEventFunc) error { - _, err := p.parseSingleEvent(r, onEvent) - return err -} - -// ParseSingleEvent parses single binlog event and passes the event to onEvent function. -func (p *BinlogParser) ParseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool, error) { - return p.parseSingleEvent(r, onEvent) -} - -func (p *BinlogParser) parseSingleEvent(r io.Reader, onEvent OnEventFunc) (bool, error) { - var err error - var n int64 - - headBuf := make([]byte, EventHeaderSize) - - if _, err = io.ReadFull(r, headBuf); err == io.EOF { - return true, nil - } else if err != nil { - return false, errors.Trace(err) - } - - var h *EventHeader - h, err = p.parseHeader(headBuf) - if err != nil { - return false, errors.Trace(err) - } - - if h.EventSize <= uint32(EventHeaderSize) { - return false, errors.Errorf("invalid event header, event size is %d, too small", h.EventSize) - } - - var buf bytes.Buffer - if n, err = io.CopyN(&buf, r, int64(h.EventSize)-int64(EventHeaderSize)); err != nil { - return false, errors.Errorf("get event body err %v, need %d - %d, but got %d", err, h.EventSize, EventHeaderSize, n) - } - - data := buf.Bytes() - rawData := data - - eventLen := int(h.EventSize) - EventHeaderSize - - if len(data) != eventLen { - return false, errors.Errorf("invalid data size %d in event %s, less event length %d", len(data), h.EventType, eventLen) - } - - var e Event - e, err = p.parseEvent(h, data) - if err != nil { - if _, ok := err.(errMissingTableMapEvent); ok { - return false, nil - } - return false, errors.Trace(err) - } - - if err = onEvent(&BinlogEvent{rawData, h, e}); err != nil { - return false, errors.Trace(err) - } - - return false, nil -} - -func (p *BinlogParser) ParseReader(r io.Reader, onEvent OnEventFunc) error { - - for { - if atomic.LoadUint32(&p.stopProcessing) == 1 { - break - } - - done, err := p.parseSingleEvent(r, onEvent) - if err != nil { - if _, ok := err.(errMissingTableMapEvent); ok { - continue - } - return errors.Trace(err) - } - - if done { - break - } - } - - return nil -} - -func (p *BinlogParser) SetRawMode(mode bool) { - p.rawMode = mode -} - -func (p *BinlogParser) SetParseTime(parseTime bool) { - p.parseTime = parseTime -} - -func (p *BinlogParser) SetUseDecimal(useDecimal bool) { - p.useDecimal = useDecimal -} - -func (p *BinlogParser) parseHeader(data []byte) (*EventHeader, error) { - h := new(EventHeader) - err := h.Decode(data) - if err != nil { - return nil, err - } - - return h, nil -} - -func (p *BinlogParser) parseEvent(h *EventHeader, data []byte) (Event, error) { - var e Event - - if h.EventType == FORMAT_DESCRIPTION_EVENT { - p.format = &FormatDescriptionEvent{} - e = p.format - } else { - if p.format != nil && p.format.ChecksumAlgorithm == BINLOG_CHECKSUM_ALG_CRC32 { - data = data[0 : len(data)-4] - } - - if h.EventType == ROTATE_EVENT { - e = &RotateEvent{} - } else if !p.rawMode { - switch h.EventType { - case QUERY_EVENT: - e = &QueryEvent{} - case XID_EVENT: - e = &XIDEvent{} - case TABLE_MAP_EVENT: - te := &TableMapEvent{} - if p.format.EventTypeHeaderLengths[TABLE_MAP_EVENT-1] == 6 { - te.tableIDSize = 4 - } else { - te.tableIDSize = 6 - } - e = te - case WRITE_ROWS_EVENTv0, - UPDATE_ROWS_EVENTv0, - DELETE_ROWS_EVENTv0, - WRITE_ROWS_EVENTv1, - DELETE_ROWS_EVENTv1, - UPDATE_ROWS_EVENTv1, - WRITE_ROWS_EVENTv2, - UPDATE_ROWS_EVENTv2, - DELETE_ROWS_EVENTv2: - e = p.newRowsEvent(h) - case ROWS_QUERY_EVENT: - e = &RowsQueryEvent{} - case GTID_EVENT: - e = >IDEvent{} - case BEGIN_LOAD_QUERY_EVENT: - e = &BeginLoadQueryEvent{} - case EXECUTE_LOAD_QUERY_EVENT: - e = &ExecuteLoadQueryEvent{} - case MARIADB_ANNOTATE_ROWS_EVENT: - e = &MariadbAnnotateRowsEvent{} - case MARIADB_BINLOG_CHECKPOINT_EVENT: - e = &MariadbBinlogCheckPointEvent{} - case MARIADB_GTID_LIST_EVENT: - e = &MariadbGTIDListEvent{} - case MARIADB_GTID_EVENT: - ee := &MariadbGTIDEvent{} - ee.GTID.ServerID = h.ServerID - e = ee - default: - e = &GenericEvent{} - } - } else { - e = &GenericEvent{} - } - } - - if err := e.Decode(data); err != nil { - return nil, &EventError{h, err.Error(), data} - } - - if te, ok := e.(*TableMapEvent); ok { - p.tables[te.TableID] = te - } - - if re, ok := e.(*RowsEvent); ok { - if (re.Flags & RowsEventStmtEndFlag) > 0 { - // Refer https://github.com/alibaba/canal/blob/38cc81b7dab29b51371096fb6763ca3a8432ffee/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogEvent.java#L176 - p.tables = make(map[uint64]*TableMapEvent) - } - } - - return e, nil -} - -// Given the bytes for a a binary log event: return the decoded event. -// With the exception of the FORMAT_DESCRIPTION_EVENT event type -// there must have previously been passed a FORMAT_DESCRIPTION_EVENT -// into the parser for this to work properly on any given event. -// Passing a new FORMAT_DESCRIPTION_EVENT into the parser will replace -// an existing one. -func (p *BinlogParser) Parse(data []byte) (*BinlogEvent, error) { - rawData := data - - h, err := p.parseHeader(data) - - if err != nil { - return nil, err - } - - data = data[EventHeaderSize:] - eventLen := int(h.EventSize) - EventHeaderSize - - if len(data) != eventLen { - return nil, fmt.Errorf("invalid data size %d in event %s, less event length %d", len(data), h.EventType, eventLen) - } - - e, err := p.parseEvent(h, data) - if err != nil { - return nil, err - } - - return &BinlogEvent{rawData, h, e}, nil -} - -func (p *BinlogParser) newRowsEvent(h *EventHeader) *RowsEvent { - e := &RowsEvent{} - if p.format.EventTypeHeaderLengths[h.EventType-1] == 6 { - e.tableIDSize = 4 - } else { - e.tableIDSize = 6 - } - - e.needBitmap2 = false - e.tables = p.tables - e.parseTime = p.parseTime - e.useDecimal = p.useDecimal - - switch h.EventType { - case WRITE_ROWS_EVENTv0: - e.Version = 0 - case UPDATE_ROWS_EVENTv0: - e.Version = 0 - case DELETE_ROWS_EVENTv0: - e.Version = 0 - case WRITE_ROWS_EVENTv1: - e.Version = 1 - case DELETE_ROWS_EVENTv1: - e.Version = 1 - case UPDATE_ROWS_EVENTv1: - e.Version = 1 - e.needBitmap2 = true - case WRITE_ROWS_EVENTv2: - e.Version = 2 - case UPDATE_ROWS_EVENTv2: - e.Version = 2 - e.needBitmap2 = true - case DELETE_ROWS_EVENTv2: - e.Version = 2 - } - - return e -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/row_event.go b/vendor/github.com/siddontang/go-mysql/replication/row_event.go deleted file mode 100644 index 6d4d972c..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/row_event.go +++ /dev/null @@ -1,852 +0,0 @@ -package replication - -import ( - "bytes" - "encoding/binary" - "encoding/hex" - "fmt" - "io" - "strconv" - "time" - - "github.com/juju/errors" - "github.com/shopspring/decimal" - "github.com/siddontang/go-log/log" - . "github.com/siddontang/go-mysql/mysql" - "github.com/siddontang/go/hack" -) - -type errMissingTableMapEvent error - -type TableMapEvent struct { - tableIDSize int - - TableID uint64 - - Flags uint16 - - Schema []byte - Table []byte - - ColumnCount uint64 - ColumnType []byte - ColumnMeta []uint16 - - //len = (ColumnCount + 7) / 8 - NullBitmap []byte -} - -func (e *TableMapEvent) Decode(data []byte) error { - pos := 0 - e.TableID = FixedLengthInt(data[0:e.tableIDSize]) - pos += e.tableIDSize - - e.Flags = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - schemaLength := data[pos] - pos++ - - e.Schema = data[pos : pos+int(schemaLength)] - pos += int(schemaLength) - - //skip 0x00 - pos++ - - tableLength := data[pos] - pos++ - - e.Table = data[pos : pos+int(tableLength)] - pos += int(tableLength) - - //skip 0x00 - pos++ - - var n int - e.ColumnCount, _, n = LengthEncodedInt(data[pos:]) - pos += n - - e.ColumnType = data[pos : pos+int(e.ColumnCount)] - pos += int(e.ColumnCount) - - var err error - var metaData []byte - if metaData, _, n, err = LengthEnodedString(data[pos:]); err != nil { - return errors.Trace(err) - } - - if err = e.decodeMeta(metaData); err != nil { - return errors.Trace(err) - } - - pos += n - - if len(data[pos:]) != bitmapByteSize(int(e.ColumnCount)) { - return io.EOF - } - - e.NullBitmap = data[pos:] - - return nil -} - -func bitmapByteSize(columnCount int) int { - return int(columnCount+7) / 8 -} - -// see mysql sql/log_event.h -/* - 0 byte - MYSQL_TYPE_DECIMAL - MYSQL_TYPE_TINY - MYSQL_TYPE_SHORT - MYSQL_TYPE_LONG - MYSQL_TYPE_NULL - MYSQL_TYPE_TIMESTAMP - MYSQL_TYPE_LONGLONG - MYSQL_TYPE_INT24 - MYSQL_TYPE_DATE - MYSQL_TYPE_TIME - MYSQL_TYPE_DATETIME - MYSQL_TYPE_YEAR - - 1 byte - MYSQL_TYPE_FLOAT - MYSQL_TYPE_DOUBLE - MYSQL_TYPE_BLOB - MYSQL_TYPE_GEOMETRY - - //maybe - MYSQL_TYPE_TIME2 - MYSQL_TYPE_DATETIME2 - MYSQL_TYPE_TIMESTAMP2 - - 2 byte - MYSQL_TYPE_VARCHAR - MYSQL_TYPE_BIT - MYSQL_TYPE_NEWDECIMAL - MYSQL_TYPE_VAR_STRING - MYSQL_TYPE_STRING - - This enumeration value is only used internally and cannot exist in a binlog. - MYSQL_TYPE_NEWDATE - MYSQL_TYPE_ENUM - MYSQL_TYPE_SET - MYSQL_TYPE_TINY_BLOB - MYSQL_TYPE_MEDIUM_BLOB - MYSQL_TYPE_LONG_BLOB -*/ -func (e *TableMapEvent) decodeMeta(data []byte) error { - pos := 0 - e.ColumnMeta = make([]uint16, e.ColumnCount) - for i, t := range e.ColumnType { - switch t { - case MYSQL_TYPE_STRING: - var x uint16 = uint16(data[pos]) << 8 //real type - x += uint16(data[pos+1]) //pack or field length - e.ColumnMeta[i] = x - pos += 2 - case MYSQL_TYPE_NEWDECIMAL: - var x uint16 = uint16(data[pos]) << 8 //precision - x += uint16(data[pos+1]) //decimals - e.ColumnMeta[i] = x - pos += 2 - case MYSQL_TYPE_VAR_STRING, - MYSQL_TYPE_VARCHAR, - MYSQL_TYPE_BIT: - e.ColumnMeta[i] = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - case MYSQL_TYPE_BLOB, - MYSQL_TYPE_DOUBLE, - MYSQL_TYPE_FLOAT, - MYSQL_TYPE_GEOMETRY, - MYSQL_TYPE_JSON: - e.ColumnMeta[i] = uint16(data[pos]) - pos++ - case MYSQL_TYPE_TIME2, - MYSQL_TYPE_DATETIME2, - MYSQL_TYPE_TIMESTAMP2: - e.ColumnMeta[i] = uint16(data[pos]) - pos++ - case MYSQL_TYPE_NEWDATE, - MYSQL_TYPE_ENUM, - MYSQL_TYPE_SET, - MYSQL_TYPE_TINY_BLOB, - MYSQL_TYPE_MEDIUM_BLOB, - MYSQL_TYPE_LONG_BLOB: - return errors.Errorf("unsupport type in binlog %d", t) - default: - e.ColumnMeta[i] = 0 - } - } - - return nil -} - -func (e *TableMapEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "TableID: %d\n", e.TableID) - fmt.Fprintf(w, "TableID size: %d\n", e.tableIDSize) - fmt.Fprintf(w, "Flags: %d\n", e.Flags) - fmt.Fprintf(w, "Schema: %s\n", e.Schema) - fmt.Fprintf(w, "Table: %s\n", e.Table) - fmt.Fprintf(w, "Column count: %d\n", e.ColumnCount) - fmt.Fprintf(w, "Column type: \n%s", hex.Dump(e.ColumnType)) - fmt.Fprintf(w, "NULL bitmap: \n%s", hex.Dump(e.NullBitmap)) - fmt.Fprintln(w) -} - -// RowsEventStmtEndFlag is set in the end of the statement. -const RowsEventStmtEndFlag = 0x01 - -type RowsEvent struct { - //0, 1, 2 - Version int - - tableIDSize int - tables map[uint64]*TableMapEvent - needBitmap2 bool - - Table *TableMapEvent - - TableID uint64 - - Flags uint16 - - //if version == 2 - ExtraData []byte - - //lenenc_int - ColumnCount uint64 - //len = (ColumnCount + 7) / 8 - ColumnBitmap1 []byte - - //if UPDATE_ROWS_EVENTv1 or v2 - //len = (ColumnCount + 7) / 8 - ColumnBitmap2 []byte - - //rows: invalid: int64, float64, bool, []byte, string - Rows [][]interface{} - - parseTime bool - useDecimal bool -} - -func (e *RowsEvent) Decode(data []byte) error { - pos := 0 - e.TableID = FixedLengthInt(data[0:e.tableIDSize]) - pos += e.tableIDSize - - e.Flags = binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - if e.Version == 2 { - dataLen := binary.LittleEndian.Uint16(data[pos:]) - pos += 2 - - e.ExtraData = data[pos : pos+int(dataLen-2)] - pos += int(dataLen - 2) - } - - var n int - e.ColumnCount, _, n = LengthEncodedInt(data[pos:]) - pos += n - - bitCount := bitmapByteSize(int(e.ColumnCount)) - e.ColumnBitmap1 = data[pos : pos+bitCount] - pos += bitCount - - if e.needBitmap2 { - e.ColumnBitmap2 = data[pos : pos+bitCount] - pos += bitCount - } - - var ok bool - e.Table, ok = e.tables[e.TableID] - if !ok { - if len(e.tables) > 0 { - return errors.Errorf("invalid table id %d, no corresponding table map event", e.TableID) - } else { - return errMissingTableMapEvent(errors.Errorf("invalid table id %d, no corresponding table map event", e.TableID)) - } - } - - var err error - - // ... repeat rows until event-end - defer func() { - if r := recover(); r != nil { - log.Fatalf("parse rows event panic %v, data %q, parsed rows %#v, table map %#v\n%s", r, data, e, e.Table, Pstack()) - } - }() - - for pos < len(data) { - if n, err = e.decodeRows(data[pos:], e.Table, e.ColumnBitmap1); err != nil { - return errors.Trace(err) - } - pos += n - - if e.needBitmap2 { - if n, err = e.decodeRows(data[pos:], e.Table, e.ColumnBitmap2); err != nil { - return errors.Trace(err) - } - pos += n - } - } - - return nil -} - -func isBitSet(bitmap []byte, i int) bool { - return bitmap[i>>3]&(1<<(uint(i)&7)) > 0 -} - -func (e *RowsEvent) decodeRows(data []byte, table *TableMapEvent, bitmap []byte) (int, error) { - row := make([]interface{}, e.ColumnCount) - - pos := 0 - - // refer: https://github.com/alibaba/canal/blob/c3e38e50e269adafdd38a48c63a1740cde304c67/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java#L63 - count := 0 - for i := 0; i < int(e.ColumnCount); i++ { - if isBitSet(bitmap, i) { - count++ - } - } - count = (count + 7) / 8 - - nullBitmap := data[pos : pos+count] - pos += count - - nullbitIndex := 0 - - var n int - var err error - for i := 0; i < int(e.ColumnCount); i++ { - if !isBitSet(bitmap, i) { - continue - } - - isNull := (uint32(nullBitmap[nullbitIndex/8]) >> uint32(nullbitIndex%8)) & 0x01 - nullbitIndex++ - - if isNull > 0 { - row[i] = nil - continue - } - - row[i], n, err = e.decodeValue(data[pos:], table.ColumnType[i], table.ColumnMeta[i]) - - if err != nil { - return 0, err - } - pos += n - } - - e.Rows = append(e.Rows, row) - return pos, nil -} - -func (e *RowsEvent) parseFracTime(t interface{}) interface{} { - v, ok := t.(fracTime) - if !ok { - return t - } - - if !e.parseTime { - // Don't parse time, return string directly - return v.String() - } - - // return Golang time directly - return v.Time -} - -// see mysql sql/log_event.cc log_event_print_value -func (e *RowsEvent) decodeValue(data []byte, tp byte, meta uint16) (v interface{}, n int, err error) { - var length int = 0 - - if tp == MYSQL_TYPE_STRING { - if meta >= 256 { - b0 := uint8(meta >> 8) - b1 := uint8(meta & 0xFF) - - if b0&0x30 != 0x30 { - length = int(uint16(b1) | (uint16((b0&0x30)^0x30) << 4)) - tp = byte(b0 | 0x30) - } else { - length = int(meta & 0xFF) - tp = b0 - } - } else { - length = int(meta) - } - } - - switch tp { - case MYSQL_TYPE_NULL: - return nil, 0, nil - case MYSQL_TYPE_LONG: - n = 4 - v = ParseBinaryInt32(data) - case MYSQL_TYPE_TINY: - n = 1 - v = ParseBinaryInt8(data) - case MYSQL_TYPE_SHORT: - n = 2 - v = ParseBinaryInt16(data) - case MYSQL_TYPE_INT24: - n = 3 - v = ParseBinaryInt24(data) - case MYSQL_TYPE_LONGLONG: - n = 8 - v = ParseBinaryInt64(data) - case MYSQL_TYPE_NEWDECIMAL: - prec := uint8(meta >> 8) - scale := uint8(meta & 0xFF) - v, n, err = decodeDecimal(data, int(prec), int(scale), e.useDecimal) - case MYSQL_TYPE_FLOAT: - n = 4 - v = ParseBinaryFloat32(data) - case MYSQL_TYPE_DOUBLE: - n = 8 - v = ParseBinaryFloat64(data) - case MYSQL_TYPE_BIT: - nbits := ((meta >> 8) * 8) + (meta & 0xFF) - n = int(nbits+7) / 8 - - //use int64 for bit - v, err = decodeBit(data, int(nbits), int(n)) - case MYSQL_TYPE_TIMESTAMP: - n = 4 - t := binary.LittleEndian.Uint32(data) - if t == 0 { - v = formatZeroTime(0, 0) - } else { - v = e.parseFracTime(fracTime{time.Unix(int64(t), 0), 0}) - } - case MYSQL_TYPE_TIMESTAMP2: - v, n, err = decodeTimestamp2(data, meta) - v = e.parseFracTime(v) - case MYSQL_TYPE_DATETIME: - n = 8 - i64 := binary.LittleEndian.Uint64(data) - if i64 == 0 { - v = formatZeroTime(0, 0) - } else { - d := i64 / 1000000 - t := i64 % 1000000 - v = e.parseFracTime(fracTime{time.Date(int(d/10000), - time.Month((d%10000)/100), - int(d%100), - int(t/10000), - int((t%10000)/100), - int(t%100), - 0, - time.UTC), 0}) - } - case MYSQL_TYPE_DATETIME2: - v, n, err = decodeDatetime2(data, meta) - v = e.parseFracTime(v) - case MYSQL_TYPE_TIME: - n = 3 - i32 := uint32(FixedLengthInt(data[0:3])) - if i32 == 0 { - v = "00:00:00" - } else { - sign := "" - if i32 < 0 { - sign = "-" - } - v = fmt.Sprintf("%s%02d:%02d:%02d", sign, i32/10000, (i32%10000)/100, i32%100) - } - case MYSQL_TYPE_TIME2: - v, n, err = decodeTime2(data, meta) - case MYSQL_TYPE_DATE: - n = 3 - i32 := uint32(FixedLengthInt(data[0:3])) - if i32 == 0 { - v = "0000-00-00" - } else { - v = fmt.Sprintf("%04d-%02d-%02d", i32/(16*32), i32/32%16, i32%32) - } - - case MYSQL_TYPE_YEAR: - n = 1 - v = int(data[0]) + 1900 - case MYSQL_TYPE_ENUM: - l := meta & 0xFF - switch l { - case 1: - v = int64(data[0]) - n = 1 - case 2: - v = int64(binary.BigEndian.Uint16(data)) - n = 2 - default: - err = fmt.Errorf("Unknown ENUM packlen=%d", l) - } - case MYSQL_TYPE_SET: - n = int(meta & 0xFF) - nbits := n * 8 - - v, err = decodeBit(data, nbits, n) - case MYSQL_TYPE_BLOB: - v, n, err = decodeBlob(data, meta) - case MYSQL_TYPE_VARCHAR, - MYSQL_TYPE_VAR_STRING: - length = int(meta) - v, n = decodeString(data, length) - case MYSQL_TYPE_STRING: - v, n = decodeString(data, length) - case MYSQL_TYPE_JSON: - // Refer: https://github.com/shyiko/mysql-binlog-connector-java/blob/master/src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/AbstractRowsEventDataDeserializer.java#L404 - length = int(FixedLengthInt(data[0:meta])) - n = length + int(meta) - v, err = e.decodeJsonBinary(data[meta:n]) - case MYSQL_TYPE_GEOMETRY: - // MySQL saves Geometry as Blob in binlog - // Seem that the binary format is SRID (4 bytes) + WKB, outer can use - // MySQL GeoFromWKB or others to create the geometry data. - // Refer https://dev.mysql.com/doc/refman/5.7/en/gis-wkb-functions.html - // I also find some go libs to handle WKB if possible - // see https://github.com/twpayne/go-geom or https://github.com/paulmach/go.geo - v, n, err = decodeBlob(data, meta) - default: - err = fmt.Errorf("unsupport type %d in binlog and don't know how to handle", tp) - } - return -} - -func decodeString(data []byte, length int) (v string, n int) { - if length < 256 { - length = int(data[0]) - - n = int(length) + 1 - v = hack.String(data[1:n]) - } else { - length = int(binary.LittleEndian.Uint16(data[0:])) - n = length + 2 - v = hack.String(data[2:n]) - } - - return -} - -const digitsPerInteger int = 9 - -var compressedBytes = []int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} - -func decodeDecimalDecompressValue(compIndx int, data []byte, mask uint8) (size int, value uint32) { - size = compressedBytes[compIndx] - databuff := make([]byte, size) - for i := 0; i < size; i++ { - databuff[i] = data[i] ^ mask - } - value = uint32(BFixedLengthInt(databuff)) - return -} - -func decodeDecimal(data []byte, precision int, decimals int, useDecimal bool) (interface{}, int, error) { - //see python mysql replication and https://github.com/jeremycole/mysql_binlog - integral := (precision - decimals) - uncompIntegral := int(integral / digitsPerInteger) - uncompFractional := int(decimals / digitsPerInteger) - compIntegral := integral - (uncompIntegral * digitsPerInteger) - compFractional := decimals - (uncompFractional * digitsPerInteger) - - binSize := uncompIntegral*4 + compressedBytes[compIntegral] + - uncompFractional*4 + compressedBytes[compFractional] - - buf := make([]byte, binSize) - copy(buf, data[:binSize]) - - //must copy the data for later change - data = buf - - // Support negative - // The sign is encoded in the high bit of the the byte - // But this bit can also be used in the value - value := uint32(data[0]) - var res bytes.Buffer - var mask uint32 = 0 - if value&0x80 == 0 { - mask = uint32((1 << 32) - 1) - res.WriteString("-") - } - - //clear sign - data[0] ^= 0x80 - - pos, value := decodeDecimalDecompressValue(compIntegral, data, uint8(mask)) - res.WriteString(fmt.Sprintf("%d", value)) - - for i := 0; i < uncompIntegral; i++ { - value = binary.BigEndian.Uint32(data[pos:]) ^ mask - pos += 4 - res.WriteString(fmt.Sprintf("%09d", value)) - } - - res.WriteString(".") - - for i := 0; i < uncompFractional; i++ { - value = binary.BigEndian.Uint32(data[pos:]) ^ mask - pos += 4 - res.WriteString(fmt.Sprintf("%09d", value)) - } - - if size, value := decodeDecimalDecompressValue(compFractional, data[pos:], uint8(mask)); size > 0 { - res.WriteString(fmt.Sprintf("%0*d", compFractional, value)) - pos += size - } - - if useDecimal { - f, err := decimal.NewFromString(hack.String(res.Bytes())) - return f, pos, err - } - - f, err := strconv.ParseFloat(hack.String(res.Bytes()), 64) - return f, pos, err -} - -func decodeBit(data []byte, nbits int, length int) (value int64, err error) { - if nbits > 1 { - switch length { - case 1: - value = int64(data[0]) - case 2: - value = int64(binary.BigEndian.Uint16(data)) - case 3: - value = int64(BFixedLengthInt(data[0:3])) - case 4: - value = int64(binary.BigEndian.Uint32(data)) - case 5: - value = int64(BFixedLengthInt(data[0:5])) - case 6: - value = int64(BFixedLengthInt(data[0:6])) - case 7: - value = int64(BFixedLengthInt(data[0:7])) - case 8: - value = int64(binary.BigEndian.Uint64(data)) - default: - err = fmt.Errorf("invalid bit length %d", length) - } - } else { - if length != 1 { - err = fmt.Errorf("invalid bit length %d", length) - } else { - value = int64(data[0]) - } - } - return -} - -func decodeTimestamp2(data []byte, dec uint16) (interface{}, int, error) { - //get timestamp binary length - n := int(4 + (dec+1)/2) - sec := int64(binary.BigEndian.Uint32(data[0:4])) - usec := int64(0) - switch dec { - case 1, 2: - usec = int64(data[4]) * 10000 - case 3, 4: - usec = int64(binary.BigEndian.Uint16(data[4:])) * 100 - case 5, 6: - usec = int64(BFixedLengthInt(data[4:7])) - } - - if sec == 0 { - return formatZeroTime(int(usec), int(dec)), n, nil - } - - return fracTime{time.Unix(sec, usec*1000), int(dec)}, n, nil -} - -const DATETIMEF_INT_OFS int64 = 0x8000000000 - -func decodeDatetime2(data []byte, dec uint16) (interface{}, int, error) { - //get datetime binary length - n := int(5 + (dec+1)/2) - - intPart := int64(BFixedLengthInt(data[0:5])) - DATETIMEF_INT_OFS - var frac int64 = 0 - - switch dec { - case 1, 2: - frac = int64(data[5]) * 10000 - case 3, 4: - frac = int64(binary.BigEndian.Uint16(data[5:7])) * 100 - case 5, 6: - frac = int64(BFixedLengthInt(data[5:8])) - } - - if intPart == 0 { - return formatZeroTime(int(frac), int(dec)), n, nil - } - - tmp := intPart<<24 + frac - //handle sign??? - if tmp < 0 { - tmp = -tmp - } - - // var secPart int64 = tmp % (1 << 24) - ymdhms := tmp >> 24 - - ymd := ymdhms >> 17 - ym := ymd >> 5 - hms := ymdhms % (1 << 17) - - day := int(ymd % (1 << 5)) - month := int(ym % 13) - year := int(ym / 13) - - second := int(hms % (1 << 6)) - minute := int((hms >> 6) % (1 << 6)) - hour := int((hms >> 12)) - - return fracTime{time.Date(year, time.Month(month), day, hour, minute, second, int(frac*1000), time.UTC), int(dec)}, n, nil -} - -const TIMEF_OFS int64 = 0x800000000000 -const TIMEF_INT_OFS int64 = 0x800000 - -func decodeTime2(data []byte, dec uint16) (string, int, error) { - //time binary length - n := int(3 + (dec+1)/2) - - tmp := int64(0) - intPart := int64(0) - frac := int64(0) - switch dec { - case 1: - case 2: - intPart = int64(BFixedLengthInt(data[0:3])) - TIMEF_INT_OFS - frac = int64(data[3]) - if intPart < 0 && frac > 0 { - /* - Negative values are stored with reverse fractional part order, - for binary sort compatibility. - - Disk value intpart frac Time value Memory value - 800000.00 0 0 00:00:00.00 0000000000.000000 - 7FFFFF.FF -1 255 -00:00:00.01 FFFFFFFFFF.FFD8F0 - 7FFFFF.9D -1 99 -00:00:00.99 FFFFFFFFFF.F0E4D0 - 7FFFFF.00 -1 0 -00:00:01.00 FFFFFFFFFF.000000 - 7FFFFE.FF -1 255 -00:00:01.01 FFFFFFFFFE.FFD8F0 - 7FFFFE.F6 -2 246 -00:00:01.10 FFFFFFFFFE.FE7960 - - Formula to convert fractional part from disk format - (now stored in "frac" variable) to absolute value: "0x100 - frac". - To reconstruct in-memory value, we shift - to the next integer value and then substruct fractional part. - */ - intPart++ /* Shift to the next integer value */ - frac -= 0x100 /* -(0x100 - frac) */ - } - tmp = intPart<<24 + frac*10000 - case 3: - case 4: - intPart = int64(BFixedLengthInt(data[0:3])) - TIMEF_INT_OFS - frac = int64(binary.BigEndian.Uint16(data[3:5])) - if intPart < 0 && frac > 0 { - /* - Fix reverse fractional part order: "0x10000 - frac". - See comments for FSP=1 and FSP=2 above. - */ - intPart++ /* Shift to the next integer value */ - frac -= 0x10000 /* -(0x10000-frac) */ - } - tmp = intPart<<24 + frac*100 - - case 5: - case 6: - tmp = int64(BFixedLengthInt(data[0:6])) - TIMEF_OFS - default: - intPart = int64(BFixedLengthInt(data[0:3])) - TIMEF_INT_OFS - tmp = intPart << 24 - } - - if intPart == 0 { - return "00:00:00", n, nil - } - - hms := int64(0) - sign := "" - if tmp < 0 { - tmp = -tmp - sign = "-" - } - - hms = tmp >> 24 - - hour := (hms >> 12) % (1 << 10) /* 10 bits starting at 12th */ - minute := (hms >> 6) % (1 << 6) /* 6 bits starting at 6th */ - second := hms % (1 << 6) /* 6 bits starting at 0th */ - secPart := tmp % (1 << 24) - - if secPart != 0 { - return fmt.Sprintf("%s%02d:%02d:%02d.%06d", sign, hour, minute, second, secPart), n, nil - } - - return fmt.Sprintf("%s%02d:%02d:%02d", sign, hour, minute, second), n, nil -} - -func decodeBlob(data []byte, meta uint16) (v []byte, n int, err error) { - var length int - switch meta { - case 1: - length = int(data[0]) - v = data[1 : 1+length] - n = length + 1 - case 2: - length = int(binary.LittleEndian.Uint16(data)) - v = data[2 : 2+length] - n = length + 2 - case 3: - length = int(FixedLengthInt(data[0:3])) - v = data[3 : 3+length] - n = length + 3 - case 4: - length = int(binary.LittleEndian.Uint32(data)) - v = data[4 : 4+length] - n = length + 4 - default: - err = fmt.Errorf("invalid blob packlen = %d", meta) - } - - return -} - -func (e *RowsEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "TableID: %d\n", e.TableID) - fmt.Fprintf(w, "Flags: %d\n", e.Flags) - fmt.Fprintf(w, "Column count: %d\n", e.ColumnCount) - - fmt.Fprintf(w, "Values:\n") - for _, rows := range e.Rows { - fmt.Fprintf(w, "--\n") - for j, d := range rows { - if _, ok := d.([]byte); ok { - fmt.Fprintf(w, "%d:%q\n", j, d) - } else { - fmt.Fprintf(w, "%d:%#v\n", j, d) - } - } - } - fmt.Fprintln(w) -} - -type RowsQueryEvent struct { - Query []byte -} - -func (e *RowsQueryEvent) Decode(data []byte) error { - //ignore length byte 1 - e.Query = data[1:] - return nil -} - -func (e *RowsQueryEvent) Dump(w io.Writer) { - fmt.Fprintf(w, "Query: %s\n", e.Query) - fmt.Fprintln(w) -} diff --git a/vendor/github.com/siddontang/go-mysql/replication/time.go b/vendor/github.com/siddontang/go-mysql/replication/time.go deleted file mode 100644 index 88691064..00000000 --- a/vendor/github.com/siddontang/go-mysql/replication/time.go +++ /dev/null @@ -1,43 +0,0 @@ -package replication - -import ( - "fmt" - "strings" - "time" -) - -var ( - fracTimeFormat []string -) - -// fracTime is a help structure wrapping Golang Time. -type fracTime struct { - time.Time - - // Dec must in [0, 6] - Dec int -} - -func (t fracTime) String() string { - return t.Format(fracTimeFormat[t.Dec]) -} - -func formatZeroTime(frac int, dec int) string { - if dec == 0 { - return "0000-00-00 00:00:00" - } - - s := fmt.Sprintf("0000-00-00 00:00:00.%06d", frac) - - // dec must < 6, if frac is 924000, but dec is 3, we must output 924 here. - return s[0 : len(s)-(6-dec)] -} - -func init() { - fracTimeFormat = make([]string, 7) - fracTimeFormat[0] = "2006-01-02 15:04:05" - - for i := 1; i <= 6; i++ { - fracTimeFormat[i] = fmt.Sprintf("2006-01-02 15:04:05.%s", strings.Repeat("0", i)) - } -} diff --git a/vendor/github.com/siddontang/go-mysql/schema/schema.go b/vendor/github.com/siddontang/go-mysql/schema/schema.go deleted file mode 100644 index cb3740ab..00000000 --- a/vendor/github.com/siddontang/go-mysql/schema/schema.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2012, Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package schema - -import ( - "database/sql" - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/siddontang/go-mysql/mysql" -) - -var ErrTableNotExist = errors.New("table is not exist") -var ErrMissingTableMeta = errors.New("missing table meta") -var HAHealthCheckSchema = "mysql.ha_health_check" - -const ( - TYPE_NUMBER = iota + 1 // tinyint, smallint, mediumint, int, bigint, year - TYPE_FLOAT // float, double - TYPE_ENUM // enum - TYPE_SET // set - TYPE_STRING // other - TYPE_DATETIME // datetime - TYPE_TIMESTAMP // timestamp - TYPE_DATE // date - TYPE_TIME // time - TYPE_BIT // bit - TYPE_JSON // json -) - -type TableColumn struct { - Name string - Type int - Collation string - RawType string - IsAuto bool - IsUnsigned bool - EnumValues []string - SetValues []string -} - -type Index struct { - Name string - Columns []string - Cardinality []uint64 -} - -type Table struct { - Schema string - Name string - - Columns []TableColumn - Indexes []*Index - PKColumns []int - - UnsignedColumns []int -} - -func (ta *Table) String() string { - return fmt.Sprintf("%s.%s", ta.Schema, ta.Name) -} - -func (ta *Table) AddColumn(name string, columnType string, collation string, extra string) { - index := len(ta.Columns) - ta.Columns = append(ta.Columns, TableColumn{Name: name, Collation: collation}) - ta.Columns[index].RawType = columnType - - if strings.HasPrefix(columnType, "float") || - strings.HasPrefix(columnType, "double") || - strings.HasPrefix(columnType, "decimal") { - ta.Columns[index].Type = TYPE_FLOAT - } else if strings.HasPrefix(columnType, "enum") { - ta.Columns[index].Type = TYPE_ENUM - ta.Columns[index].EnumValues = strings.Split(strings.Replace( - strings.TrimSuffix( - strings.TrimPrefix( - columnType, "enum("), - ")"), - "'", "", -1), - ",") - } else if strings.HasPrefix(columnType, "set") { - ta.Columns[index].Type = TYPE_SET - ta.Columns[index].SetValues = strings.Split(strings.Replace( - strings.TrimSuffix( - strings.TrimPrefix( - columnType, "set("), - ")"), - "'", "", -1), - ",") - } else if strings.HasPrefix(columnType, "datetime") { - ta.Columns[index].Type = TYPE_DATETIME - } else if strings.HasPrefix(columnType, "timestamp") { - ta.Columns[index].Type = TYPE_TIMESTAMP - } else if strings.HasPrefix(columnType, "time") { - ta.Columns[index].Type = TYPE_TIME - } else if "date" == columnType { - ta.Columns[index].Type = TYPE_DATE - } else if strings.HasPrefix(columnType, "bit") { - ta.Columns[index].Type = TYPE_BIT - } else if strings.HasPrefix(columnType, "json") { - ta.Columns[index].Type = TYPE_JSON - } else if strings.Contains(columnType, "int") || strings.HasPrefix(columnType, "year") { - ta.Columns[index].Type = TYPE_NUMBER - } else { - ta.Columns[index].Type = TYPE_STRING - } - - if strings.Contains(columnType, "unsigned") || strings.Contains(columnType, "zerofill") { - ta.Columns[index].IsUnsigned = true - ta.UnsignedColumns = append(ta.UnsignedColumns, index) - } - - if extra == "auto_increment" { - ta.Columns[index].IsAuto = true - } -} - -func (ta *Table) FindColumn(name string) int { - for i, col := range ta.Columns { - if col.Name == name { - return i - } - } - return -1 -} - -func (ta *Table) GetPKColumn(index int) *TableColumn { - return &ta.Columns[ta.PKColumns[index]] -} - -func (ta *Table) AddIndex(name string) (index *Index) { - index = NewIndex(name) - ta.Indexes = append(ta.Indexes, index) - return index -} - -func NewIndex(name string) *Index { - return &Index{name, make([]string, 0, 8), make([]uint64, 0, 8)} -} - -func (idx *Index) AddColumn(name string, cardinality uint64) { - idx.Columns = append(idx.Columns, name) - if cardinality == 0 { - cardinality = uint64(len(idx.Cardinality) + 1) - } - idx.Cardinality = append(idx.Cardinality, cardinality) -} - -func (idx *Index) FindColumn(name string) int { - for i, colName := range idx.Columns { - if name == colName { - return i - } - } - return -1 -} - -func IsTableExist(conn mysql.Executer, schema string, name string) (bool, error) { - query := fmt.Sprintf("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '%s' and TABLE_NAME = '%s' LIMIT 1", schema, name) - r, err := conn.Execute(query) - if err != nil { - return false, errors.Trace(err) - } - - return r.RowNumber() == 1, nil -} - -func NewTableFromSqlDB(conn *sql.DB, schema string, name string) (*Table, error) { - ta := &Table{ - Schema: schema, - Name: name, - Columns: make([]TableColumn, 0, 16), - Indexes: make([]*Index, 0, 8), - } - - if err := ta.fetchColumnsViaSqlDB(conn); err != nil { - return nil, errors.Trace(err) - } - - if err := ta.fetchIndexesViaSqlDB(conn); err != nil { - return nil, errors.Trace(err) - } - - return ta, nil -} - -func NewTable(conn mysql.Executer, schema string, name string) (*Table, error) { - ta := &Table{ - Schema: schema, - Name: name, - Columns: make([]TableColumn, 0, 16), - Indexes: make([]*Index, 0, 8), - } - - if err := ta.fetchColumns(conn); err != nil { - return nil, errors.Trace(err) - } - - if err := ta.fetchIndexes(conn); err != nil { - return nil, errors.Trace(err) - } - - return ta, nil -} - -func (ta *Table) fetchColumns(conn mysql.Executer) error { - r, err := conn.Execute(fmt.Sprintf("show full columns from `%s`.`%s`", ta.Schema, ta.Name)) - if err != nil { - return errors.Trace(err) - } - - for i := 0; i < r.RowNumber(); i++ { - name, _ := r.GetString(i, 0) - colType, _ := r.GetString(i, 1) - collation, _ := r.GetString(i, 2) - extra, _ := r.GetString(i, 6) - - ta.AddColumn(name, colType, collation, extra) - } - - return nil -} - -func (ta *Table) fetchColumnsViaSqlDB(conn *sql.DB) error { - r, err := conn.Query(fmt.Sprintf("show full columns from `%s`.`%s`", ta.Schema, ta.Name)) - if err != nil { - return errors.Trace(err) - } - - defer r.Close() - - var unusedVal interface{} - unused := &unusedVal - - for r.Next() { - var name, colType, extra string - var collation sql.NullString - err := r.Scan(&name, &colType, &collation, &unused, &unused, &unused, &extra, &unused, &unused) - if err != nil { - return errors.Trace(err) - } - ta.AddColumn(name, colType, collation.String, extra) - } - - return r.Err() -} - -func (ta *Table) fetchIndexes(conn mysql.Executer) error { - r, err := conn.Execute(fmt.Sprintf("show index from `%s`.`%s`", ta.Schema, ta.Name)) - if err != nil { - return errors.Trace(err) - } - var currentIndex *Index - currentName := "" - - for i := 0; i < r.RowNumber(); i++ { - indexName, _ := r.GetString(i, 2) - if currentName != indexName { - currentIndex = ta.AddIndex(indexName) - currentName = indexName - } - cardinality, _ := r.GetUint(i, 6) - colName, _ := r.GetString(i, 4) - currentIndex.AddColumn(colName, cardinality) - } - - return ta.fetchPrimaryKeyColumns() - -} - -func (ta *Table) fetchIndexesViaSqlDB(conn *sql.DB) error { - r, err := conn.Query(fmt.Sprintf("show index from `%s`.`%s`", ta.Schema, ta.Name)) - if err != nil { - return errors.Trace(err) - } - - defer r.Close() - - var currentIndex *Index - currentName := "" - - var unusedVal interface{} - unused := &unusedVal - - for r.Next() { - var indexName, colName string - var cardinality interface{} - - err := r.Scan( - &unused, - &unused, - &indexName, - &unused, - &colName, - &unused, - &cardinality, - &unused, - &unused, - &unused, - &unused, - &unused, - &unused, - ) - if err != nil { - return errors.Trace(err) - } - - if currentName != indexName { - currentIndex = ta.AddIndex(indexName) - currentName = indexName - } - - c := toUint64(cardinality) - currentIndex.AddColumn(colName, c) - } - - return ta.fetchPrimaryKeyColumns() -} - -func toUint64(i interface{}) uint64 { - switch i := i.(type) { - case int: - return uint64(i) - case int8: - return uint64(i) - case int16: - return uint64(i) - case int32: - return uint64(i) - case int64: - return uint64(i) - case uint: - return uint64(i) - case uint8: - return uint64(i) - case uint16: - return uint64(i) - case uint32: - return uint64(i) - case uint64: - return uint64(i) - } - - return 0 -} - -func (ta *Table) fetchPrimaryKeyColumns() error { - if len(ta.Indexes) == 0 { - return nil - } - - pkIndex := ta.Indexes[0] - if pkIndex.Name != "PRIMARY" { - return nil - } - - ta.PKColumns = make([]int, len(pkIndex.Columns)) - for i, pkCol := range pkIndex.Columns { - ta.PKColumns[i] = ta.FindColumn(pkCol) - } - - return nil -} - -// Get primary keys in one row for a table, a table may use multi fields as the PK -func (ta *Table) GetPKValues(row []interface{}) ([]interface{}, error) { - indexes := ta.PKColumns - if len(indexes) == 0 { - return nil, errors.Errorf("table %s has no PK", ta) - } else if len(ta.Columns) != len(row) { - return nil, errors.Errorf("table %s has %d columns, but row data %v len is %d", ta, - len(ta.Columns), row, len(row)) - } - - values := make([]interface{}, 0, len(indexes)) - - for _, index := range indexes { - values = append(values, row[index]) - } - - return values, nil -} - -// Get term column's value -func (ta *Table) GetColumnValue(column string, row []interface{}) (interface{}, error) { - index := ta.FindColumn(column) - if index == -1 { - return nil, errors.Errorf("table %s has no column name %s", ta, column) - } - - return row[index], nil -} diff --git a/vendor/github.com/siddontang/go/LICENSE b/vendor/github.com/siddontang/go/LICENSE deleted file mode 100644 index 80511a0a..00000000 --- a/vendor/github.com/siddontang/go/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 siddontang - -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/github.com/siddontang/go/bson/LICENSE b/vendor/github.com/siddontang/go/bson/LICENSE deleted file mode 100644 index 89032601..00000000 --- a/vendor/github.com/siddontang/go/bson/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSON library for Go - -Copyright (c) 2010-2012 - Gustavo Niemeyer - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. 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 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/github.com/siddontang/go/filelock/LICENSE b/vendor/github.com/siddontang/go/filelock/LICENSE deleted file mode 100644 index fec05ce1..00000000 --- a/vendor/github.com/siddontang/go/filelock/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The LevelDB-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/github.com/siddontang/go/hack/hack.go b/vendor/github.com/siddontang/go/hack/hack.go deleted file mode 100644 index 74ee83cb..00000000 --- a/vendor/github.com/siddontang/go/hack/hack.go +++ /dev/null @@ -1,27 +0,0 @@ -package hack - -import ( - "reflect" - "unsafe" -) - -// no copy to change slice to string -// use your own risk -func String(b []byte) (s string) { - pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) - pstring.Data = pbytes.Data - pstring.Len = pbytes.Len - return -} - -// no copy to change string to slice -// use your own risk -func Slice(s string) (b []byte) { - pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) - pbytes.Data = pstring.Data - pbytes.Len = pstring.Len - pbytes.Cap = pstring.Len - return -} diff --git a/vendor/github.com/siddontang/go/ioutil2/ioutil.go b/vendor/github.com/siddontang/go/ioutil2/ioutil.go deleted file mode 100644 index 35c0ad3c..00000000 --- a/vendor/github.com/siddontang/go/ioutil2/ioutil.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2012, Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ioutil2 - -import ( - "io" - "io/ioutil" - "os" - "path" -) - -// Write file to temp and atomically move when everything else succeeds. -func WriteFileAtomic(filename string, data []byte, perm os.FileMode) error { - dir, name := path.Dir(filename), path.Base(filename) - f, err := ioutil.TempFile(dir, name) - if err != nil { - return err - } - n, err := f.Write(data) - f.Close() - if err == nil && n < len(data) { - err = io.ErrShortWrite - } else { - err = os.Chmod(f.Name(), perm) - } - if err != nil { - os.Remove(f.Name()) - return err - } - return os.Rename(f.Name(), filename) -} - -// Check file exists or not -func FileExists(name string) bool { - _, err := os.Stat(name) - return !os.IsNotExist(err) -} diff --git a/vendor/github.com/siddontang/go/ioutil2/sectionwriter.go b/vendor/github.com/siddontang/go/ioutil2/sectionwriter.go deleted file mode 100644 index c02ab0d5..00000000 --- a/vendor/github.com/siddontang/go/ioutil2/sectionwriter.go +++ /dev/null @@ -1,69 +0,0 @@ -package ioutil2 - -import ( - "errors" - "io" -) - -var ErrExceedLimit = errors.New("write exceed limit") - -func NewSectionWriter(w io.WriterAt, off int64, n int64) *SectionWriter { - return &SectionWriter{w, off, off, off + n} -} - -type SectionWriter struct { - w io.WriterAt - base int64 - off int64 - limit int64 -} - -func (s *SectionWriter) Write(p []byte) (n int, err error) { - if s.off >= s.limit { - return 0, ErrExceedLimit - } - - if max := s.limit - s.off; int64(len(p)) > max { - return 0, ErrExceedLimit - } - - n, err = s.w.WriteAt(p, s.off) - s.off += int64(n) - return -} - -var errWhence = errors.New("Seek: invalid whence") -var errOffset = errors.New("Seek: invalid offset") - -func (s *SectionWriter) Seek(offset int64, whence int) (int64, error) { - switch whence { - default: - return 0, errWhence - case 0: - offset += s.base - case 1: - offset += s.off - case 2: - offset += s.limit - } - if offset < s.base { - return 0, errOffset - } - s.off = offset - return offset - s.base, nil -} - -func (s *SectionWriter) WriteAt(p []byte, off int64) (n int, err error) { - if off < 0 || off >= s.limit-s.base { - return 0, errOffset - } - off += s.base - if max := s.limit - off; int64(len(p)) > max { - return 0, ErrExceedLimit - } - - return s.w.WriteAt(p, off) -} - -// Size returns the size of the section in bytes. -func (s *SectionWriter) Size() int64 { return s.limit - s.base } diff --git a/vendor/github.com/siddontang/go/snappy/LICENSE b/vendor/github.com/siddontang/go/snappy/LICENSE deleted file mode 100644 index 6050c10f..00000000 --- a/vendor/github.com/siddontang/go/snappy/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -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/github.com/siddontang/go/sync2/atomic.go b/vendor/github.com/siddontang/go/sync2/atomic.go deleted file mode 100644 index 382fc20d..00000000 --- a/vendor/github.com/siddontang/go/sync2/atomic.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2013, Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sync2 - -import ( - "sync" - "sync/atomic" - "time" -) - -type AtomicInt32 int32 - -func (i *AtomicInt32) Add(n int32) int32 { - return atomic.AddInt32((*int32)(i), n) -} - -func (i *AtomicInt32) Set(n int32) { - atomic.StoreInt32((*int32)(i), n) -} - -func (i *AtomicInt32) Get() int32 { - return atomic.LoadInt32((*int32)(i)) -} - -func (i *AtomicInt32) CompareAndSwap(oldval, newval int32) (swapped bool) { - return atomic.CompareAndSwapInt32((*int32)(i), oldval, newval) -} - -type AtomicUint32 uint32 - -func (i *AtomicUint32) Add(n uint32) uint32 { - return atomic.AddUint32((*uint32)(i), n) -} - -func (i *AtomicUint32) Set(n uint32) { - atomic.StoreUint32((*uint32)(i), n) -} - -func (i *AtomicUint32) Get() uint32 { - return atomic.LoadUint32((*uint32)(i)) -} - -func (i *AtomicUint32) CompareAndSwap(oldval, newval uint32) (swapped bool) { - return atomic.CompareAndSwapUint32((*uint32)(i), oldval, newval) -} - -type AtomicInt64 int64 - -func (i *AtomicInt64) Add(n int64) int64 { - return atomic.AddInt64((*int64)(i), n) -} - -func (i *AtomicInt64) Set(n int64) { - atomic.StoreInt64((*int64)(i), n) -} - -func (i *AtomicInt64) Get() int64 { - return atomic.LoadInt64((*int64)(i)) -} - -func (i *AtomicInt64) CompareAndSwap(oldval, newval int64) (swapped bool) { - return atomic.CompareAndSwapInt64((*int64)(i), oldval, newval) -} - -type AtomicUint64 uint64 - -func (i *AtomicUint64) Add(n uint64) uint64 { - return atomic.AddUint64((*uint64)(i), n) -} - -func (i *AtomicUint64) Set(n uint64) { - atomic.StoreUint64((*uint64)(i), n) -} - -func (i *AtomicUint64) Get() uint64 { - return atomic.LoadUint64((*uint64)(i)) -} - -func (i *AtomicUint64) CompareAndSwap(oldval, newval uint64) (swapped bool) { - return atomic.CompareAndSwapUint64((*uint64)(i), oldval, newval) -} - -type AtomicDuration int64 - -func (d *AtomicDuration) Add(duration time.Duration) time.Duration { - return time.Duration(atomic.AddInt64((*int64)(d), int64(duration))) -} - -func (d *AtomicDuration) Set(duration time.Duration) { - atomic.StoreInt64((*int64)(d), int64(duration)) -} - -func (d *AtomicDuration) Get() time.Duration { - return time.Duration(atomic.LoadInt64((*int64)(d))) -} - -func (d *AtomicDuration) CompareAndSwap(oldval, newval time.Duration) (swapped bool) { - return atomic.CompareAndSwapInt64((*int64)(d), int64(oldval), int64(newval)) -} - -// AtomicString gives you atomic-style APIs for string, but -// it's only a convenience wrapper that uses a mutex. So, it's -// not as efficient as the rest of the atomic types. -type AtomicString struct { - mu sync.Mutex - str string -} - -func (s *AtomicString) Set(str string) { - s.mu.Lock() - s.str = str - s.mu.Unlock() -} - -func (s *AtomicString) Get() string { - s.mu.Lock() - str := s.str - s.mu.Unlock() - return str -} - -func (s *AtomicString) CompareAndSwap(oldval, newval string) (swapped bool) { - s.mu.Lock() - defer s.mu.Unlock() - if s.str == oldval { - s.str = newval - return true - } - return false -} - -type AtomicBool int32 - -func (b *AtomicBool) Set(v bool) { - if v { - atomic.StoreInt32((*int32)(b), 1) - } else { - atomic.StoreInt32((*int32)(b), 0) - } -} - -func (b *AtomicBool) Get() bool { - return atomic.LoadInt32((*int32)(b)) == 1 -} diff --git a/vendor/github.com/siddontang/go/sync2/semaphore.go b/vendor/github.com/siddontang/go/sync2/semaphore.go deleted file mode 100644 index d310da72..00000000 --- a/vendor/github.com/siddontang/go/sync2/semaphore.go +++ /dev/null @@ -1,65 +0,0 @@ -package sync2 - -import ( - "sync" - "sync/atomic" - "time" -) - -func NewSemaphore(initialCount int) *Semaphore { - res := &Semaphore{ - counter: int64(initialCount), - } - res.cond.L = &res.lock - return res -} - -type Semaphore struct { - lock sync.Mutex - cond sync.Cond - counter int64 -} - -func (s *Semaphore) Release() { - s.lock.Lock() - s.counter += 1 - if s.counter >= 0 { - s.cond.Signal() - } - s.lock.Unlock() -} - -func (s *Semaphore) Acquire() { - s.lock.Lock() - for s.counter < 1 { - s.cond.Wait() - } - s.counter -= 1 - s.lock.Unlock() -} - -func (s *Semaphore) AcquireTimeout(timeout time.Duration) bool { - done := make(chan bool, 1) - // Gate used to communicate between the threads and decide what the result - // is. If the main thread decides, we have timed out, otherwise we succeed. - decided := new(int32) - go func() { - s.Acquire() - if atomic.SwapInt32(decided, 1) == 0 { - done <- true - } else { - // If we already decided the result, and this thread did not win - s.Release() - } - }() - select { - case <-done: - return true - case <-time.NewTimer(timeout).C: - if atomic.SwapInt32(decided, 1) == 1 { - // The other thread already decided the result - return true - } - return false - } -}