Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
corteza
corteza-server
Commits
a6257143
Commit
a6257143
authored
4 years ago
by
Denis Arh
Browse files
Options
Download
Email Patches
Plain Diff
Moduels updated, added vendor/github.com/ngrok/sqlmw
parent
ef59b4de
Changes
117
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
16 additions
and
3376 deletions
+16
-3376
go.mod
go.mod
+5
-5
go.sum
go.sum
+11
-10
vendor/github.com/gomodule/redigo/LICENSE
vendor/github.com/gomodule/redigo/LICENSE
+0
-175
vendor/github.com/gomodule/redigo/internal/commandinfo.go
vendor/github.com/gomodule/redigo/internal/commandinfo.go
+0
-54
vendor/github.com/gomodule/redigo/redis/conn.go
vendor/github.com/gomodule/redigo/redis/conn.go
+0
-673
vendor/github.com/gomodule/redigo/redis/doc.go
vendor/github.com/gomodule/redigo/redis/doc.go
+0
-177
vendor/github.com/gomodule/redigo/redis/go16.go
vendor/github.com/gomodule/redigo/redis/go16.go
+0
-27
vendor/github.com/gomodule/redigo/redis/go17.go
vendor/github.com/gomodule/redigo/redis/go17.go
+0
-29
vendor/github.com/gomodule/redigo/redis/go18.go
vendor/github.com/gomodule/redigo/redis/go18.go
+0
-9
vendor/github.com/gomodule/redigo/redis/log.go
vendor/github.com/gomodule/redigo/redis/log.go
+0
-134
vendor/github.com/gomodule/redigo/redis/pool.go
vendor/github.com/gomodule/redigo/redis/pool.go
+0
-562
vendor/github.com/gomodule/redigo/redis/pool17.go
vendor/github.com/gomodule/redigo/redis/pool17.go
+0
-35
vendor/github.com/gomodule/redigo/redis/pubsub.go
vendor/github.com/gomodule/redigo/redis/pubsub.go
+0
-148
vendor/github.com/gomodule/redigo/redis/redis.go
vendor/github.com/gomodule/redigo/redis/redis.go
+0
-117
vendor/github.com/gomodule/redigo/redis/reply.go
vendor/github.com/gomodule/redigo/redis/reply.go
+0
-479
vendor/github.com/gomodule/redigo/redis/scan.go
vendor/github.com/gomodule/redigo/redis/scan.go
+0
-585
vendor/github.com/gomodule/redigo/redis/script.go
vendor/github.com/gomodule/redigo/redis/script.go
+0
-91
vendor/github.com/mitchellh/colorstring/.travis.yml
vendor/github.com/mitchellh/colorstring/.travis.yml
+0
-15
vendor/github.com/mitchellh/colorstring/LICENSE
vendor/github.com/mitchellh/colorstring/LICENSE
+0
-21
vendor/github.com/mitchellh/colorstring/README.md
vendor/github.com/mitchellh/colorstring/README.md
+0
-30
No files found.
go.mod
View file @
a6257143
...
...
@@ -11,7 +11,7 @@ require (
github.com/Masterminds/semver
v1.5.0 // indirect
github.com/Masterminds/sprig
v2.22.0+incompatible
github.com/Masterminds/squirrel
v1.1.1-0.20191017225151-12f2162c8d8d
github.com/PaesslerAG/gval
v1.0.1
github.com/PaesslerAG/gval
v1.0.1
// indirect
github.com/PaesslerAG/jsonpath
v0.1.1 // indirect
github.com/SentimensRG/ctx
v0.0.0-20180729130232-0bfd988c655d
github.com/crusttech/go-oidc
v0.0.0-20180918092017-982855dad3e1
...
...
@@ -28,7 +28,7 @@ require (
github.com/go-sql-driver/mysql
v1.5.0
github.com/golang/mock
v1.3.1
github.com/golang/protobuf
v1.3.3
github.com/go
module/redigo
v2.0.0+incompatible
github.com/go
ogle/go-cmp
v0.5.1 // indirect
github.com/google/uuid
v1.1.1 // indirect
github.com/gorhill/cronexpr
v0.0.0-20180427100037-88b0669f7d75
github.com/gorilla/mux
v1.7.1 // indirect
...
...
@@ -46,12 +46,12 @@ require (
github.com/mattn/go-sqlite3
v1.14.0
github.com/minio/minio-go/v6
v6.0.39
github.com/mitchellh/copystructure
v1.0.0 // indirect
github.com/ngrok/sqlmw
v0.0.0-20200129213757-d5c93a81bec6
github.com/niemeyer/pretty
v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/pkg/errors
v0.8.1
github.com/pquerna/cachecontrol
v0.0.0-20180517163645-1555304b9b35 // indirect
github.com/prometheus/client_golang
v0.9.3
github.com/rwcarlsen/goexif
v0.0.0-20190401172101-9e8deecbddbd // indirect
github.com/schollz/progressbar/v2
v2.15.0
github.com/smartystreets/goconvey
v1.6.4 // indirect
github.com/sony/sonyflake
v0.0.0-20181109022403-6d5bd6181009
github.com/spf13/afero
v1.2.2
...
...
@@ -60,12 +60,12 @@ require (
github.com/spf13/pflag
v1.0.3 // indirect
github.com/steinfletcher/apitest
v1.3.8
github.com/steinfletcher/apitest-jsonpath
v1.3.0
github.com/stretchr/testify
v1.6.
0
github.com/stretchr/testify
v1.6.
1
github.com/titpetric/factory
v0.0.0-20190828134837-8466c9bef13f
go.uber.org/atomic
v1.6.0
go.uber.org/zap
v1.15.0
golang.org/x/crypto
v0.0.0-20190605123033-f99c8df09eb5
google.golang.org/grpc
v1.
29.1
google.golang.org/grpc
v1.
31.0
gopkg.in/alexcesaro/quotedprintable.v3
v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/check.v1
v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/ini.v1
v1.51.0 // indirect
...
...
This diff is collapsed.
Click to expand it.
go.sum
View file @
a6257143
...
...
@@ -98,13 +98,14 @@ github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs
github.com/golang/protobuf
v1.3.2/go.mod h1:
6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf
v1.3.3 h1:
gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf
v1.3.3/go.mod h1:
vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/gomodule/redigo
v2.0.0+incompatible h1:
K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
github.com/gomodule/redigo
v2.0.0+incompatible/go.mod h1:
B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/google/btree
v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:
lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree
v1.0.0/go.mod h1:
lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp
v0.2.0/go.mod h1:
oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp
v0.3.0 h1:
crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp
v0.3.0/go.mod h1:
8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp
v0.4.0/go.mod h1:
v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp
v0.5.1 h1:
JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
github.com/google/go-cmp
v0.5.1/go.mod h1:
v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/martian
v2.1.0+incompatible/go.mod h1:
9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof
v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:
zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof
v0.0.0-20190515194954-54271f7e092f/go.mod h1:
zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
...
...
@@ -177,8 +178,6 @@ github.com/minio/minio-go/v6 v6.0.39 h1:9qmKCTBpQpMdGlDAbs3mbb4mmL45/lwRUvHL1VLh
github.com/minio/minio-go/v6
v6.0.39/go.mod h1:
qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg=
github.com/minio/sha256-simd
v0.1.1 h1:
5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
github.com/minio/sha256-simd
v0.1.1/go.mod h1:
B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/mitchellh/colorstring
v0.0.0-20190213212951-d06e56a500db h1:
62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring
v0.0.0-20190213212951-d06e56a500db/go.mod h1:
l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/copystructure
v1.0.0 h1:
Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
github.com/mitchellh/copystructure
v1.0.0/go.mod h1:
SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/go-homedir
v1.1.0 h1:
lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
...
...
@@ -189,6 +188,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
github.com/mohae/deepcopy
v0.0.0-20170929034955-c48cc78d4826/go.mod h1:
TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/mrjones/oauth
v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:
skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
github.com/mwitkow/go-conntrack
v0.0.0-20161129095857-cc309e4a2223/go.mod h1:
qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/ngrok/sqlmw
v0.0.0-20200129213757-d5c93a81bec6 h1:
evlcQnJY+v8XRRchV3hXzpHDl6GcEZeLXAhlH9Csdww=
github.com/ngrok/sqlmw
v0.0.0-20200129213757-d5c93a81bec6/go.mod h1:
E26fwEtRNigBfFfHDWsklmo0T7Ixbg0XXgck+Hq4O9k=
github.com/niemeyer/pretty
v0.0.0-20200227124842-a10e7caefd8e h1:
fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty
v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:
zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid
v1.3.1/go.mod h1:
CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
...
...
@@ -219,8 +220,6 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T
github.com/rogpeppe/go-internal
v1.3.0/go.mod h1:
M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rwcarlsen/goexif
v0.0.0-20190401172101-9e8deecbddbd h1:
CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc=
github.com/rwcarlsen/goexif
v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:
hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
github.com/schollz/progressbar/v2
v2.15.0 h1:
dVzHQ8fHRmtPjD3K10jT3Qgn/+H+92jhPrhmxIJfDz8=
github.com/schollz/progressbar/v2
v2.15.0/go.mod h1:
UdPq3prGkfQ7MOzZKlDRpYKcFqEMczbD7YmbPgpzKMI=
github.com/sirupsen/logrus
v1.2.0/go.mod h1:
LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus
v1.4.2/go.mod h1:
tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/smartystreets/assertions
v0.0.0-20180927180507-b2de0cb4f26d h1:
zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
...
...
@@ -251,8 +250,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify
v1.3.0/go.mod h1:
M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify
v1.4.0 h1:
2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify
v1.4.0/go.mod h1:
j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify
v1.6.
0
h1:
jlIyCplCJFULU/01vCkhKuTyc3OorI3bJFuw6obfgho
=
github.com/stretchr/testify
v1.6.
0
/go.mod h1:
6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify
v1.6.
1
h1:
hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0
=
github.com/stretchr/testify
v1.6.
1
/go.mod h1:
6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/titpetric/factory
v0.0.0-20190828134837-8466c9bef13f h1:
sTgdEUlmmNSU3QKe8n20jR26zYEKw6ciSuj919XobV4=
github.com/titpetric/factory
v0.0.0-20190828134837-8466c9bef13f/go.mod h1:
VFd2XRrQZoX9cOxpeZezKpOlXDwU/dbRejKLjwP+xY8=
go.opencensus.io
v0.21.0/go.mod h1:
mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
...
...
@@ -352,6 +351,8 @@ golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools
v0.0.0-20191029190741-b9c20aec41a5 h1:
hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
golang.org/x/tools
v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:
b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors
v0.0.0-20190717185122-a985d3407aa7/go.mod h1:
I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors
v0.0.0-20191204190536-9bdfabe68543 h1:
E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors
v0.0.0-20191204190536-9bdfabe68543/go.mod h1:
I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api
v0.4.0/go.mod h1:
8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api
v0.7.0/go.mod h1:
WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api
v0.8.0/go.mod h1:
o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
...
...
@@ -375,8 +376,8 @@ google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiq
google.golang.org/grpc
v1.21.1/go.mod h1:
oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc
v1.23.0/go.mod h1:
Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc
v1.25.1/go.mod h1:
c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc
v1.
29.1 h1:
EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4
=
google.golang.org/grpc
v1.
29.1
/go.mod h1:
itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoK
k=
google.golang.org/grpc
v1.
31.0 h1:
T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI
=
google.golang.org/grpc
v1.
31.0
/go.mod h1:
N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pa
k=
gopkg.in/alecthomas/kingpin.v2
v2.2.6/go.mod h1:
FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/alexcesaro/quotedprintable.v3
v3.0.0-20150716171945-2caba252f4dc h1:
2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
gopkg.in/alexcesaro/quotedprintable.v3
v3.0.0-20150716171945-2caba252f4dc/go.mod h1:
m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
...
...
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/LICENSE
deleted
100644 → 0
View file @
ef59b4de
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/internal/commandinfo.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2014 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
internal
// import "github.com/gomodule/redigo/internal"
import
(
"strings"
)
const
(
WatchState
=
1
<<
iota
MultiState
SubscribeState
MonitorState
)
type
CommandInfo
struct
{
Set
,
Clear
int
}
var
commandInfos
=
map
[
string
]
CommandInfo
{
"WATCH"
:
{
Set
:
WatchState
},
"UNWATCH"
:
{
Clear
:
WatchState
},
"MULTI"
:
{
Set
:
MultiState
},
"EXEC"
:
{
Clear
:
WatchState
|
MultiState
},
"DISCARD"
:
{
Clear
:
WatchState
|
MultiState
},
"PSUBSCRIBE"
:
{
Set
:
SubscribeState
},
"SUBSCRIBE"
:
{
Set
:
SubscribeState
},
"MONITOR"
:
{
Set
:
MonitorState
},
}
func
init
()
{
for
n
,
ci
:=
range
commandInfos
{
commandInfos
[
strings
.
ToLower
(
n
)]
=
ci
}
}
func
LookupCommandInfo
(
commandName
string
)
CommandInfo
{
if
ci
,
ok
:=
commandInfos
[
commandName
];
ok
{
return
ci
}
return
commandInfos
[
strings
.
ToUpper
(
commandName
)]
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/conn.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"bufio"
"bytes"
"crypto/tls"
"errors"
"fmt"
"io"
"net"
"net/url"
"regexp"
"strconv"
"sync"
"time"
)
var
(
_
ConnWithTimeout
=
(
*
conn
)(
nil
)
)
// conn is the low-level implementation of Conn
type
conn
struct
{
// Shared
mu
sync
.
Mutex
pending
int
err
error
conn
net
.
Conn
// Read
readTimeout
time
.
Duration
br
*
bufio
.
Reader
// Write
writeTimeout
time
.
Duration
bw
*
bufio
.
Writer
// Scratch space for formatting argument length.
// '*' or '$', length, "\r\n"
lenScratch
[
32
]
byte
// Scratch space for formatting integers and floats.
numScratch
[
40
]
byte
}
// DialTimeout acts like Dial but takes timeouts for establishing the
// connection to the server, writing a command and reading a reply.
//
// Deprecated: Use Dial with options instead.
func
DialTimeout
(
network
,
address
string
,
connectTimeout
,
readTimeout
,
writeTimeout
time
.
Duration
)
(
Conn
,
error
)
{
return
Dial
(
network
,
address
,
DialConnectTimeout
(
connectTimeout
),
DialReadTimeout
(
readTimeout
),
DialWriteTimeout
(
writeTimeout
))
}
// DialOption specifies an option for dialing a Redis server.
type
DialOption
struct
{
f
func
(
*
dialOptions
)
}
type
dialOptions
struct
{
readTimeout
time
.
Duration
writeTimeout
time
.
Duration
dialer
*
net
.
Dialer
dial
func
(
network
,
addr
string
)
(
net
.
Conn
,
error
)
db
int
password
string
useTLS
bool
skipVerify
bool
tlsConfig
*
tls
.
Config
}
// DialReadTimeout specifies the timeout for reading a single command reply.
func
DialReadTimeout
(
d
time
.
Duration
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
readTimeout
=
d
}}
}
// DialWriteTimeout specifies the timeout for writing a single command.
func
DialWriteTimeout
(
d
time
.
Duration
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
writeTimeout
=
d
}}
}
// DialConnectTimeout specifies the timeout for connecting to the Redis server when
// no DialNetDial option is specified.
func
DialConnectTimeout
(
d
time
.
Duration
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
dialer
.
Timeout
=
d
}}
}
// DialKeepAlive specifies the keep-alive period for TCP connections to the Redis server
// when no DialNetDial option is specified.
// If zero, keep-alives are not enabled. If no DialKeepAlive option is specified then
// the default of 5 minutes is used to ensure that half-closed TCP sessions are detected.
func
DialKeepAlive
(
d
time
.
Duration
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
dialer
.
KeepAlive
=
d
}}
}
// DialNetDial specifies a custom dial function for creating TCP
// connections, otherwise a net.Dialer customized via the other options is used.
// DialNetDial overrides DialConnectTimeout and DialKeepAlive.
func
DialNetDial
(
dial
func
(
network
,
addr
string
)
(
net
.
Conn
,
error
))
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
dial
=
dial
}}
}
// DialDatabase specifies the database to select when dialing a connection.
func
DialDatabase
(
db
int
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
db
=
db
}}
}
// DialPassword specifies the password to use when connecting to
// the Redis server.
func
DialPassword
(
password
string
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
password
=
password
}}
}
// DialTLSConfig specifies the config to use when a TLS connection is dialed.
// Has no effect when not dialing a TLS connection.
func
DialTLSConfig
(
c
*
tls
.
Config
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
tlsConfig
=
c
}}
}
// DialTLSSkipVerify disables server name verification when connecting over
// TLS. Has no effect when not dialing a TLS connection.
func
DialTLSSkipVerify
(
skip
bool
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
skipVerify
=
skip
}}
}
// DialUseTLS specifies whether TLS should be used when connecting to the
// server. This option is ignore by DialURL.
func
DialUseTLS
(
useTLS
bool
)
DialOption
{
return
DialOption
{
func
(
do
*
dialOptions
)
{
do
.
useTLS
=
useTLS
}}
}
// Dial connects to the Redis server at the given network and
// address using the specified options.
func
Dial
(
network
,
address
string
,
options
...
DialOption
)
(
Conn
,
error
)
{
do
:=
dialOptions
{
dialer
:
&
net
.
Dialer
{
KeepAlive
:
time
.
Minute
*
5
,
},
}
for
_
,
option
:=
range
options
{
option
.
f
(
&
do
)
}
if
do
.
dial
==
nil
{
do
.
dial
=
do
.
dialer
.
Dial
}
netConn
,
err
:=
do
.
dial
(
network
,
address
)
if
err
!=
nil
{
return
nil
,
err
}
if
do
.
useTLS
{
var
tlsConfig
*
tls
.
Config
if
do
.
tlsConfig
==
nil
{
tlsConfig
=
&
tls
.
Config
{
InsecureSkipVerify
:
do
.
skipVerify
}
}
else
{
tlsConfig
=
cloneTLSConfig
(
do
.
tlsConfig
)
}
if
tlsConfig
.
ServerName
==
""
{
host
,
_
,
err
:=
net
.
SplitHostPort
(
address
)
if
err
!=
nil
{
netConn
.
Close
()
return
nil
,
err
}
tlsConfig
.
ServerName
=
host
}
tlsConn
:=
tls
.
Client
(
netConn
,
tlsConfig
)
if
err
:=
tlsConn
.
Handshake
();
err
!=
nil
{
netConn
.
Close
()
return
nil
,
err
}
netConn
=
tlsConn
}
c
:=
&
conn
{
conn
:
netConn
,
bw
:
bufio
.
NewWriter
(
netConn
),
br
:
bufio
.
NewReader
(
netConn
),
readTimeout
:
do
.
readTimeout
,
writeTimeout
:
do
.
writeTimeout
,
}
if
do
.
password
!=
""
{
if
_
,
err
:=
c
.
Do
(
"AUTH"
,
do
.
password
);
err
!=
nil
{
netConn
.
Close
()
return
nil
,
err
}
}
if
do
.
db
!=
0
{
if
_
,
err
:=
c
.
Do
(
"SELECT"
,
do
.
db
);
err
!=
nil
{
netConn
.
Close
()
return
nil
,
err
}
}
return
c
,
nil
}
var
pathDBRegexp
=
regexp
.
MustCompile
(
`/(\d*)\z`
)
// DialURL connects to a Redis server at the given URL using the Redis
// URI scheme. URLs should follow the draft IANA specification for the
// scheme (https://www.iana.org/assignments/uri-schemes/prov/redis).
func
DialURL
(
rawurl
string
,
options
...
DialOption
)
(
Conn
,
error
)
{
u
,
err
:=
url
.
Parse
(
rawurl
)
if
err
!=
nil
{
return
nil
,
err
}
if
u
.
Scheme
!=
"redis"
&&
u
.
Scheme
!=
"rediss"
{
return
nil
,
fmt
.
Errorf
(
"invalid redis URL scheme: %s"
,
u
.
Scheme
)
}
// As per the IANA draft spec, the host defaults to localhost and
// the port defaults to 6379.
host
,
port
,
err
:=
net
.
SplitHostPort
(
u
.
Host
)
if
err
!=
nil
{
// assume port is missing
host
=
u
.
Host
port
=
"6379"
}
if
host
==
""
{
host
=
"localhost"
}
address
:=
net
.
JoinHostPort
(
host
,
port
)
if
u
.
User
!=
nil
{
password
,
isSet
:=
u
.
User
.
Password
()
if
isSet
{
options
=
append
(
options
,
DialPassword
(
password
))
}
}
match
:=
pathDBRegexp
.
FindStringSubmatch
(
u
.
Path
)
if
len
(
match
)
==
2
{
db
:=
0
if
len
(
match
[
1
])
>
0
{
db
,
err
=
strconv
.
Atoi
(
match
[
1
])
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"invalid database: %s"
,
u
.
Path
[
1
:
])
}
}
if
db
!=
0
{
options
=
append
(
options
,
DialDatabase
(
db
))
}
}
else
if
u
.
Path
!=
""
{
return
nil
,
fmt
.
Errorf
(
"invalid database: %s"
,
u
.
Path
[
1
:
])
}
options
=
append
(
options
,
DialUseTLS
(
u
.
Scheme
==
"rediss"
))
return
Dial
(
"tcp"
,
address
,
options
...
)
}
// NewConn returns a new Redigo connection for the given net connection.
func
NewConn
(
netConn
net
.
Conn
,
readTimeout
,
writeTimeout
time
.
Duration
)
Conn
{
return
&
conn
{
conn
:
netConn
,
bw
:
bufio
.
NewWriter
(
netConn
),
br
:
bufio
.
NewReader
(
netConn
),
readTimeout
:
readTimeout
,
writeTimeout
:
writeTimeout
,
}
}
func
(
c
*
conn
)
Close
()
error
{
c
.
mu
.
Lock
()
err
:=
c
.
err
if
c
.
err
==
nil
{
c
.
err
=
errors
.
New
(
"redigo: closed"
)
err
=
c
.
conn
.
Close
()
}
c
.
mu
.
Unlock
()
return
err
}
func
(
c
*
conn
)
fatal
(
err
error
)
error
{
c
.
mu
.
Lock
()
if
c
.
err
==
nil
{
c
.
err
=
err
// Close connection to force errors on subsequent calls and to unblock
// other reader or writer.
c
.
conn
.
Close
()
}
c
.
mu
.
Unlock
()
return
err
}
func
(
c
*
conn
)
Err
()
error
{
c
.
mu
.
Lock
()
err
:=
c
.
err
c
.
mu
.
Unlock
()
return
err
}
func
(
c
*
conn
)
writeLen
(
prefix
byte
,
n
int
)
error
{
c
.
lenScratch
[
len
(
c
.
lenScratch
)
-
1
]
=
'\n'
c
.
lenScratch
[
len
(
c
.
lenScratch
)
-
2
]
=
'\r'
i
:=
len
(
c
.
lenScratch
)
-
3
for
{
c
.
lenScratch
[
i
]
=
byte
(
'0'
+
n
%
10
)
i
-=
1
n
=
n
/
10
if
n
==
0
{
break
}
}
c
.
lenScratch
[
i
]
=
prefix
_
,
err
:=
c
.
bw
.
Write
(
c
.
lenScratch
[
i
:
])
return
err
}
func
(
c
*
conn
)
writeString
(
s
string
)
error
{
c
.
writeLen
(
'$'
,
len
(
s
))
c
.
bw
.
WriteString
(
s
)
_
,
err
:=
c
.
bw
.
WriteString
(
"
\r\n
"
)
return
err
}
func
(
c
*
conn
)
writeBytes
(
p
[]
byte
)
error
{
c
.
writeLen
(
'$'
,
len
(
p
))
c
.
bw
.
Write
(
p
)
_
,
err
:=
c
.
bw
.
WriteString
(
"
\r\n
"
)
return
err
}
func
(
c
*
conn
)
writeInt64
(
n
int64
)
error
{
return
c
.
writeBytes
(
strconv
.
AppendInt
(
c
.
numScratch
[
:
0
],
n
,
10
))
}
func
(
c
*
conn
)
writeFloat64
(
n
float64
)
error
{
return
c
.
writeBytes
(
strconv
.
AppendFloat
(
c
.
numScratch
[
:
0
],
n
,
'g'
,
-
1
,
64
))
}
func
(
c
*
conn
)
writeCommand
(
cmd
string
,
args
[]
interface
{})
error
{
c
.
writeLen
(
'*'
,
1
+
len
(
args
))
if
err
:=
c
.
writeString
(
cmd
);
err
!=
nil
{
return
err
}
for
_
,
arg
:=
range
args
{
if
err
:=
c
.
writeArg
(
arg
,
true
);
err
!=
nil
{
return
err
}
}
return
nil
}
func
(
c
*
conn
)
writeArg
(
arg
interface
{},
argumentTypeOK
bool
)
(
err
error
)
{
switch
arg
:=
arg
.
(
type
)
{
case
string
:
return
c
.
writeString
(
arg
)
case
[]
byte
:
return
c
.
writeBytes
(
arg
)
case
int
:
return
c
.
writeInt64
(
int64
(
arg
))
case
int64
:
return
c
.
writeInt64
(
arg
)
case
float64
:
return
c
.
writeFloat64
(
arg
)
case
bool
:
if
arg
{
return
c
.
writeString
(
"1"
)
}
else
{
return
c
.
writeString
(
"0"
)
}
case
nil
:
return
c
.
writeString
(
""
)
case
Argument
:
if
argumentTypeOK
{
return
c
.
writeArg
(
arg
.
RedisArg
(),
false
)
}
// See comment in default clause below.
var
buf
bytes
.
Buffer
fmt
.
Fprint
(
&
buf
,
arg
)
return
c
.
writeBytes
(
buf
.
Bytes
())
default
:
// This default clause is intended to handle builtin numeric types.
// The function should return an error for other types, but this is not
// done for compatibility with previous versions of the package.
var
buf
bytes
.
Buffer
fmt
.
Fprint
(
&
buf
,
arg
)
return
c
.
writeBytes
(
buf
.
Bytes
())
}
}
type
protocolError
string
func
(
pe
protocolError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"redigo: %s (possible server error or unsupported concurrent read by application)"
,
string
(
pe
))
}
func
(
c
*
conn
)
readLine
()
([]
byte
,
error
)
{
p
,
err
:=
c
.
br
.
ReadSlice
(
'\n'
)
if
err
==
bufio
.
ErrBufferFull
{
return
nil
,
protocolError
(
"long response line"
)
}
if
err
!=
nil
{
return
nil
,
err
}
i
:=
len
(
p
)
-
2
if
i
<
0
||
p
[
i
]
!=
'\r'
{
return
nil
,
protocolError
(
"bad response line terminator"
)
}
return
p
[
:
i
],
nil
}
// parseLen parses bulk string and array lengths.
func
parseLen
(
p
[]
byte
)
(
int
,
error
)
{
if
len
(
p
)
==
0
{
return
-
1
,
protocolError
(
"malformed length"
)
}
if
p
[
0
]
==
'-'
&&
len
(
p
)
==
2
&&
p
[
1
]
==
'1'
{
// handle $-1 and $-1 null replies.
return
-
1
,
nil
}
var
n
int
for
_
,
b
:=
range
p
{
n
*=
10
if
b
<
'0'
||
b
>
'9'
{
return
-
1
,
protocolError
(
"illegal bytes in length"
)
}
n
+=
int
(
b
-
'0'
)
}
return
n
,
nil
}
// parseInt parses an integer reply.
func
parseInt
(
p
[]
byte
)
(
interface
{},
error
)
{
if
len
(
p
)
==
0
{
return
0
,
protocolError
(
"malformed integer"
)
}
var
negate
bool
if
p
[
0
]
==
'-'
{
negate
=
true
p
=
p
[
1
:
]
if
len
(
p
)
==
0
{
return
0
,
protocolError
(
"malformed integer"
)
}
}
var
n
int64
for
_
,
b
:=
range
p
{
n
*=
10
if
b
<
'0'
||
b
>
'9'
{
return
0
,
protocolError
(
"illegal bytes in length"
)
}
n
+=
int64
(
b
-
'0'
)
}
if
negate
{
n
=
-
n
}
return
n
,
nil
}
var
(
okReply
interface
{}
=
"OK"
pongReply
interface
{}
=
"PONG"
)
func
(
c
*
conn
)
readReply
()
(
interface
{},
error
)
{
line
,
err
:=
c
.
readLine
()
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
line
)
==
0
{
return
nil
,
protocolError
(
"short response line"
)
}
switch
line
[
0
]
{
case
'+'
:
switch
{
case
len
(
line
)
==
3
&&
line
[
1
]
==
'O'
&&
line
[
2
]
==
'K'
:
// Avoid allocation for frequent "+OK" response.
return
okReply
,
nil
case
len
(
line
)
==
5
&&
line
[
1
]
==
'P'
&&
line
[
2
]
==
'O'
&&
line
[
3
]
==
'N'
&&
line
[
4
]
==
'G'
:
// Avoid allocation in PING command benchmarks :)
return
pongReply
,
nil
default
:
return
string
(
line
[
1
:
]),
nil
}
case
'-'
:
return
Error
(
string
(
line
[
1
:
])),
nil
case
':'
:
return
parseInt
(
line
[
1
:
])
case
'$'
:
n
,
err
:=
parseLen
(
line
[
1
:
])
if
n
<
0
||
err
!=
nil
{
return
nil
,
err
}
p
:=
make
([]
byte
,
n
)
_
,
err
=
io
.
ReadFull
(
c
.
br
,
p
)
if
err
!=
nil
{
return
nil
,
err
}
if
line
,
err
:=
c
.
readLine
();
err
!=
nil
{
return
nil
,
err
}
else
if
len
(
line
)
!=
0
{
return
nil
,
protocolError
(
"bad bulk string format"
)
}
return
p
,
nil
case
'*'
:
n
,
err
:=
parseLen
(
line
[
1
:
])
if
n
<
0
||
err
!=
nil
{
return
nil
,
err
}
r
:=
make
([]
interface
{},
n
)
for
i
:=
range
r
{
r
[
i
],
err
=
c
.
readReply
()
if
err
!=
nil
{
return
nil
,
err
}
}
return
r
,
nil
}
return
nil
,
protocolError
(
"unexpected response line"
)
}
func
(
c
*
conn
)
Send
(
cmd
string
,
args
...
interface
{})
error
{
c
.
mu
.
Lock
()
c
.
pending
+=
1
c
.
mu
.
Unlock
()
if
c
.
writeTimeout
!=
0
{
c
.
conn
.
SetWriteDeadline
(
time
.
Now
()
.
Add
(
c
.
writeTimeout
))
}
if
err
:=
c
.
writeCommand
(
cmd
,
args
);
err
!=
nil
{
return
c
.
fatal
(
err
)
}
return
nil
}
func
(
c
*
conn
)
Flush
()
error
{
if
c
.
writeTimeout
!=
0
{
c
.
conn
.
SetWriteDeadline
(
time
.
Now
()
.
Add
(
c
.
writeTimeout
))
}
if
err
:=
c
.
bw
.
Flush
();
err
!=
nil
{
return
c
.
fatal
(
err
)
}
return
nil
}
func
(
c
*
conn
)
Receive
()
(
interface
{},
error
)
{
return
c
.
ReceiveWithTimeout
(
c
.
readTimeout
)
}
func
(
c
*
conn
)
ReceiveWithTimeout
(
timeout
time
.
Duration
)
(
reply
interface
{},
err
error
)
{
var
deadline
time
.
Time
if
timeout
!=
0
{
deadline
=
time
.
Now
()
.
Add
(
timeout
)
}
c
.
conn
.
SetReadDeadline
(
deadline
)
if
reply
,
err
=
c
.
readReply
();
err
!=
nil
{
return
nil
,
c
.
fatal
(
err
)
}
// When using pub/sub, the number of receives can be greater than the
// number of sends. To enable normal use of the connection after
// unsubscribing from all channels, we do not decrement pending to a
// negative value.
//
// The pending field is decremented after the reply is read to handle the
// case where Receive is called before Send.
c
.
mu
.
Lock
()
if
c
.
pending
>
0
{
c
.
pending
-=
1
}
c
.
mu
.
Unlock
()
if
err
,
ok
:=
reply
.
(
Error
);
ok
{
return
nil
,
err
}
return
}
func
(
c
*
conn
)
Do
(
cmd
string
,
args
...
interface
{})
(
interface
{},
error
)
{
return
c
.
DoWithTimeout
(
c
.
readTimeout
,
cmd
,
args
...
)
}
func
(
c
*
conn
)
DoWithTimeout
(
readTimeout
time
.
Duration
,
cmd
string
,
args
...
interface
{})
(
interface
{},
error
)
{
c
.
mu
.
Lock
()
pending
:=
c
.
pending
c
.
pending
=
0
c
.
mu
.
Unlock
()
if
cmd
==
""
&&
pending
==
0
{
return
nil
,
nil
}
if
c
.
writeTimeout
!=
0
{
c
.
conn
.
SetWriteDeadline
(
time
.
Now
()
.
Add
(
c
.
writeTimeout
))
}
if
cmd
!=
""
{
if
err
:=
c
.
writeCommand
(
cmd
,
args
);
err
!=
nil
{
return
nil
,
c
.
fatal
(
err
)
}
}
if
err
:=
c
.
bw
.
Flush
();
err
!=
nil
{
return
nil
,
c
.
fatal
(
err
)
}
var
deadline
time
.
Time
if
readTimeout
!=
0
{
deadline
=
time
.
Now
()
.
Add
(
readTimeout
)
}
c
.
conn
.
SetReadDeadline
(
deadline
)
if
cmd
==
""
{
reply
:=
make
([]
interface
{},
pending
)
for
i
:=
range
reply
{
r
,
e
:=
c
.
readReply
()
if
e
!=
nil
{
return
nil
,
c
.
fatal
(
e
)
}
reply
[
i
]
=
r
}
return
reply
,
nil
}
var
err
error
var
reply
interface
{}
for
i
:=
0
;
i
<=
pending
;
i
++
{
var
e
error
if
reply
,
e
=
c
.
readReply
();
e
!=
nil
{
return
nil
,
c
.
fatal
(
e
)
}
if
e
,
ok
:=
reply
.
(
Error
);
ok
&&
err
==
nil
{
err
=
e
}
}
return
reply
,
err
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/doc.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
// Package redis is a client for the Redis database.
//
// The Redigo FAQ (https://github.com/gomodule/redigo/wiki/FAQ) contains more
// documentation about this package.
//
// Connections
//
// The Conn interface is the primary interface for working with Redis.
// Applications create connections by calling the Dial, DialWithTimeout or
// NewConn functions. In the future, functions will be added for creating
// sharded and other types of connections.
//
// The application must call the connection Close method when the application
// is done with the connection.
//
// Executing Commands
//
// The Conn interface has a generic method for executing Redis commands:
//
// Do(commandName string, args ...interface{}) (reply interface{}, err error)
//
// The Redis command reference (http://redis.io/commands) lists the available
// commands. An example of using the Redis APPEND command is:
//
// n, err := conn.Do("APPEND", "key", "value")
//
// The Do method converts command arguments to bulk strings for transmission
// to the server as follows:
//
// Go Type Conversion
// []byte Sent as is
// string Sent as is
// int, int64 strconv.FormatInt(v)
// float64 strconv.FormatFloat(v, 'g', -1, 64)
// bool true -> "1", false -> "0"
// nil ""
// all other types fmt.Fprint(w, v)
//
// Redis command reply types are represented using the following Go types:
//
// Redis type Go type
// error redis.Error
// integer int64
// simple string string
// bulk string []byte or nil if value not present.
// array []interface{} or nil if value not present.
//
// Use type assertions or the reply helper functions to convert from
// interface{} to the specific Go type for the command result.
//
// Pipelining
//
// Connections support pipelining using the Send, Flush and Receive methods.
//
// Send(commandName string, args ...interface{}) error
// Flush() error
// Receive() (reply interface{}, err error)
//
// Send writes the command to the connection's output buffer. Flush flushes the
// connection's output buffer to the server. Receive reads a single reply from
// the server. The following example shows a simple pipeline.
//
// c.Send("SET", "foo", "bar")
// c.Send("GET", "foo")
// c.Flush()
// c.Receive() // reply from SET
// v, err = c.Receive() // reply from GET
//
// The Do method combines the functionality of the Send, Flush and Receive
// methods. The Do method starts by writing the command and flushing the output
// buffer. Next, the Do method receives all pending replies including the reply
// for the command just sent by Do. If any of the received replies is an error,
// then Do returns the error. If there are no errors, then Do returns the last
// reply. If the command argument to the Do method is "", then the Do method
// will flush the output buffer and receive pending replies without sending a
// command.
//
// Use the Send and Do methods to implement pipelined transactions.
//
// c.Send("MULTI")
// c.Send("INCR", "foo")
// c.Send("INCR", "bar")
// r, err := c.Do("EXEC")
// fmt.Println(r) // prints [1, 1]
//
// Concurrency
//
// Connections support one concurrent caller to the Receive method and one
// concurrent caller to the Send and Flush methods. No other concurrency is
// supported including concurrent calls to the Do method.
//
// For full concurrent access to Redis, use the thread-safe Pool to get, use
// and release a connection from within a goroutine. Connections returned from
// a Pool have the concurrency restrictions described in the previous
// paragraph.
//
// Publish and Subscribe
//
// Use the Send, Flush and Receive methods to implement Pub/Sub subscribers.
//
// c.Send("SUBSCRIBE", "example")
// c.Flush()
// for {
// reply, err := c.Receive()
// if err != nil {
// return err
// }
// // process pushed message
// }
//
// The PubSubConn type wraps a Conn with convenience methods for implementing
// subscribers. The Subscribe, PSubscribe, Unsubscribe and PUnsubscribe methods
// send and flush a subscription management command. The receive method
// converts a pushed message to convenient types for use in a type switch.
//
// psc := redis.PubSubConn{Conn: c}
// psc.Subscribe("example")
// for {
// switch v := psc.Receive().(type) {
// case redis.Message:
// fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
// case redis.Subscription:
// fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
// case error:
// return v
// }
// }
//
// Reply Helpers
//
// The Bool, Int, Bytes, String, Strings and Values functions convert a reply
// to a value of a specific type. To allow convenient wrapping of calls to the
// connection Do and Receive methods, the functions take a second argument of
// type error. If the error is non-nil, then the helper function returns the
// error. If the error is nil, the function converts the reply to the specified
// type:
//
// exists, err := redis.Bool(c.Do("EXISTS", "foo"))
// if err != nil {
// // handle error return from c.Do or type conversion error.
// }
//
// The Scan function converts elements of a array reply to Go types:
//
// var value1 int
// var value2 string
// reply, err := redis.Values(c.Do("MGET", "key1", "key2"))
// if err != nil {
// // handle error
// }
// if _, err := redis.Scan(reply, &value1, &value2); err != nil {
// // handle error
// }
//
// Errors
//
// Connection methods return error replies from the server as type redis.Error.
//
// Call the connection Err() method to determine if the connection encountered
// non-recoverable error such as a network error or protocol parsing error. If
// Err() returns a non-nil value, then the connection is not usable and should
// be closed.
package
redis
// import "github.com/gomodule/redigo/redis"
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/go16.go
deleted
100644 → 0
View file @
ef59b4de
// +build !go1.7
package
redis
import
"crypto/tls"
func
cloneTLSConfig
(
cfg
*
tls
.
Config
)
*
tls
.
Config
{
return
&
tls
.
Config
{
Rand
:
cfg
.
Rand
,
Time
:
cfg
.
Time
,
Certificates
:
cfg
.
Certificates
,
NameToCertificate
:
cfg
.
NameToCertificate
,
GetCertificate
:
cfg
.
GetCertificate
,
RootCAs
:
cfg
.
RootCAs
,
NextProtos
:
cfg
.
NextProtos
,
ServerName
:
cfg
.
ServerName
,
ClientAuth
:
cfg
.
ClientAuth
,
ClientCAs
:
cfg
.
ClientCAs
,
InsecureSkipVerify
:
cfg
.
InsecureSkipVerify
,
CipherSuites
:
cfg
.
CipherSuites
,
PreferServerCipherSuites
:
cfg
.
PreferServerCipherSuites
,
ClientSessionCache
:
cfg
.
ClientSessionCache
,
MinVersion
:
cfg
.
MinVersion
,
MaxVersion
:
cfg
.
MaxVersion
,
CurvePreferences
:
cfg
.
CurvePreferences
,
}
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/go17.go
deleted
100644 → 0
View file @
ef59b4de
// +build go1.7,!go1.8
package
redis
import
"crypto/tls"
func
cloneTLSConfig
(
cfg
*
tls
.
Config
)
*
tls
.
Config
{
return
&
tls
.
Config
{
Rand
:
cfg
.
Rand
,
Time
:
cfg
.
Time
,
Certificates
:
cfg
.
Certificates
,
NameToCertificate
:
cfg
.
NameToCertificate
,
GetCertificate
:
cfg
.
GetCertificate
,
RootCAs
:
cfg
.
RootCAs
,
NextProtos
:
cfg
.
NextProtos
,
ServerName
:
cfg
.
ServerName
,
ClientAuth
:
cfg
.
ClientAuth
,
ClientCAs
:
cfg
.
ClientCAs
,
InsecureSkipVerify
:
cfg
.
InsecureSkipVerify
,
CipherSuites
:
cfg
.
CipherSuites
,
PreferServerCipherSuites
:
cfg
.
PreferServerCipherSuites
,
ClientSessionCache
:
cfg
.
ClientSessionCache
,
MinVersion
:
cfg
.
MinVersion
,
MaxVersion
:
cfg
.
MaxVersion
,
CurvePreferences
:
cfg
.
CurvePreferences
,
DynamicRecordSizingDisabled
:
cfg
.
DynamicRecordSizingDisabled
,
Renegotiation
:
cfg
.
Renegotiation
,
}
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/go18.go
deleted
100644 → 0
View file @
ef59b4de
// +build go1.8
package
redis
import
"crypto/tls"
func
cloneTLSConfig
(
cfg
*
tls
.
Config
)
*
tls
.
Config
{
return
cfg
.
Clone
()
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/log.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"bytes"
"fmt"
"log"
"time"
)
var
(
_
ConnWithTimeout
=
(
*
loggingConn
)(
nil
)
)
// NewLoggingConn returns a logging wrapper around a connection.
func
NewLoggingConn
(
conn
Conn
,
logger
*
log
.
Logger
,
prefix
string
)
Conn
{
if
prefix
!=
""
{
prefix
=
prefix
+
"."
}
return
&
loggingConn
{
conn
,
logger
,
prefix
}
}
type
loggingConn
struct
{
Conn
logger
*
log
.
Logger
prefix
string
}
func
(
c
*
loggingConn
)
Close
()
error
{
err
:=
c
.
Conn
.
Close
()
var
buf
bytes
.
Buffer
fmt
.
Fprintf
(
&
buf
,
"%sClose() -> (%v)"
,
c
.
prefix
,
err
)
c
.
logger
.
Output
(
2
,
buf
.
String
())
return
err
}
func
(
c
*
loggingConn
)
printValue
(
buf
*
bytes
.
Buffer
,
v
interface
{})
{
const
chop
=
32
switch
v
:=
v
.
(
type
)
{
case
[]
byte
:
if
len
(
v
)
>
chop
{
fmt
.
Fprintf
(
buf
,
"%q..."
,
v
[
:
chop
])
}
else
{
fmt
.
Fprintf
(
buf
,
"%q"
,
v
)
}
case
string
:
if
len
(
v
)
>
chop
{
fmt
.
Fprintf
(
buf
,
"%q..."
,
v
[
:
chop
])
}
else
{
fmt
.
Fprintf
(
buf
,
"%q"
,
v
)
}
case
[]
interface
{}
:
if
len
(
v
)
==
0
{
buf
.
WriteString
(
"[]"
)
}
else
{
sep
:=
"["
fin
:=
"]"
if
len
(
v
)
>
chop
{
v
=
v
[
:
chop
]
fin
=
"...]"
}
for
_
,
vv
:=
range
v
{
buf
.
WriteString
(
sep
)
c
.
printValue
(
buf
,
vv
)
sep
=
", "
}
buf
.
WriteString
(
fin
)
}
default
:
fmt
.
Fprint
(
buf
,
v
)
}
}
func
(
c
*
loggingConn
)
print
(
method
,
commandName
string
,
args
[]
interface
{},
reply
interface
{},
err
error
)
{
var
buf
bytes
.
Buffer
fmt
.
Fprintf
(
&
buf
,
"%s%s("
,
c
.
prefix
,
method
)
if
method
!=
"Receive"
{
buf
.
WriteString
(
commandName
)
for
_
,
arg
:=
range
args
{
buf
.
WriteString
(
", "
)
c
.
printValue
(
&
buf
,
arg
)
}
}
buf
.
WriteString
(
") -> ("
)
if
method
!=
"Send"
{
c
.
printValue
(
&
buf
,
reply
)
buf
.
WriteString
(
", "
)
}
fmt
.
Fprintf
(
&
buf
,
"%v)"
,
err
)
c
.
logger
.
Output
(
3
,
buf
.
String
())
}
func
(
c
*
loggingConn
)
Do
(
commandName
string
,
args
...
interface
{})
(
interface
{},
error
)
{
reply
,
err
:=
c
.
Conn
.
Do
(
commandName
,
args
...
)
c
.
print
(
"Do"
,
commandName
,
args
,
reply
,
err
)
return
reply
,
err
}
func
(
c
*
loggingConn
)
DoWithTimeout
(
timeout
time
.
Duration
,
commandName
string
,
args
...
interface
{})
(
interface
{},
error
)
{
reply
,
err
:=
DoWithTimeout
(
c
.
Conn
,
timeout
,
commandName
,
args
...
)
c
.
print
(
"DoWithTimeout"
,
commandName
,
args
,
reply
,
err
)
return
reply
,
err
}
func
(
c
*
loggingConn
)
Send
(
commandName
string
,
args
...
interface
{})
error
{
err
:=
c
.
Conn
.
Send
(
commandName
,
args
...
)
c
.
print
(
"Send"
,
commandName
,
args
,
nil
,
err
)
return
err
}
func
(
c
*
loggingConn
)
Receive
()
(
interface
{},
error
)
{
reply
,
err
:=
c
.
Conn
.
Receive
()
c
.
print
(
"Receive"
,
""
,
nil
,
reply
,
err
)
return
reply
,
err
}
func
(
c
*
loggingConn
)
ReceiveWithTimeout
(
timeout
time
.
Duration
)
(
interface
{},
error
)
{
reply
,
err
:=
ReceiveWithTimeout
(
c
.
Conn
,
timeout
)
c
.
print
(
"ReceiveWithTimeout"
,
""
,
nil
,
reply
,
err
)
return
reply
,
err
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/pool.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"bytes"
"crypto/rand"
"crypto/sha1"
"errors"
"io"
"strconv"
"sync"
"sync/atomic"
"time"
"github.com/gomodule/redigo/internal"
)
var
(
_
ConnWithTimeout
=
(
*
activeConn
)(
nil
)
_
ConnWithTimeout
=
(
*
errorConn
)(
nil
)
)
var
nowFunc
=
time
.
Now
// for testing
// ErrPoolExhausted is returned from a pool connection method (Do, Send,
// Receive, Flush, Err) when the maximum number of database connections in the
// pool has been reached.
var
ErrPoolExhausted
=
errors
.
New
(
"redigo: connection pool exhausted"
)
var
(
errPoolClosed
=
errors
.
New
(
"redigo: connection pool closed"
)
errConnClosed
=
errors
.
New
(
"redigo: connection closed"
)
)
// Pool maintains a pool of connections. The application calls the Get method
// to get a connection from the pool and the connection's Close method to
// return the connection's resources to the pool.
//
// The following example shows how to use a pool in a web application. The
// application creates a pool at application startup and makes it available to
// request handlers using a package level variable. The pool configuration used
// here is an example, not a recommendation.
//
// func newPool(addr string) *redis.Pool {
// return &redis.Pool{
// MaxIdle: 3,
// IdleTimeout: 240 * time.Second,
// Dial: func () (redis.Conn, error) { return redis.Dial("tcp", addr) },
// }
// }
//
// var (
// pool *redis.Pool
// redisServer = flag.String("redisServer", ":6379", "")
// )
//
// func main() {
// flag.Parse()
// pool = newPool(*redisServer)
// ...
// }
//
// A request handler gets a connection from the pool and closes the connection
// when the handler is done:
//
// func serveHome(w http.ResponseWriter, r *http.Request) {
// conn := pool.Get()
// defer conn.Close()
// ...
// }
//
// Use the Dial function to authenticate connections with the AUTH command or
// select a database with the SELECT command:
//
// pool := &redis.Pool{
// // Other pool configuration not shown in this example.
// Dial: func () (redis.Conn, error) {
// c, err := redis.Dial("tcp", server)
// if err != nil {
// return nil, err
// }
// if _, err := c.Do("AUTH", password); err != nil {
// c.Close()
// return nil, err
// }
// if _, err := c.Do("SELECT", db); err != nil {
// c.Close()
// return nil, err
// }
// return c, nil
// },
// }
//
// Use the TestOnBorrow function to check the health of an idle connection
// before the connection is returned to the application. This example PINGs
// connections that have been idle more than a minute:
//
// pool := &redis.Pool{
// // Other pool configuration not shown in this example.
// TestOnBorrow: func(c redis.Conn, t time.Time) error {
// if time.Since(t) < time.Minute {
// return nil
// }
// _, err := c.Do("PING")
// return err
// },
// }
//
type
Pool
struct
{
// Dial is an application supplied function for creating and configuring a
// connection.
//
// The connection returned from Dial must not be in a special state
// (subscribed to pubsub channel, transaction started, ...).
Dial
func
()
(
Conn
,
error
)
// TestOnBorrow is an optional application supplied function for checking
// the health of an idle connection before the connection is used again by
// the application. Argument t is the time that the connection was returned
// to the pool. If the function returns an error, then the connection is
// closed.
TestOnBorrow
func
(
c
Conn
,
t
time
.
Time
)
error
// Maximum number of idle connections in the pool.
MaxIdle
int
// Maximum number of connections allocated by the pool at a given time.
// When zero, there is no limit on the number of connections in the pool.
MaxActive
int
// Close connections after remaining idle for this duration. If the value
// is zero, then idle connections are not closed. Applications should set
// the timeout to a value less than the server's timeout.
IdleTimeout
time
.
Duration
// If Wait is true and the pool is at the MaxActive limit, then Get() waits
// for a connection to be returned to the pool before returning.
Wait
bool
// Close connections older than this duration. If the value is zero, then
// the pool does not close connections based on age.
MaxConnLifetime
time
.
Duration
chInitialized
uint32
// set to 1 when field ch is initialized
mu
sync
.
Mutex
// mu protects the following fields
closed
bool
// set to true when the pool is closed.
active
int
// the number of open connections in the pool
ch
chan
struct
{}
// limits open connections when p.Wait is true
idle
idleList
// idle connections
}
// NewPool creates a new pool.
//
// Deprecated: Initialize the Pool directory as shown in the example.
func
NewPool
(
newFn
func
()
(
Conn
,
error
),
maxIdle
int
)
*
Pool
{
return
&
Pool
{
Dial
:
newFn
,
MaxIdle
:
maxIdle
}
}
// Get gets a connection. The application must close the returned connection.
// This method always returns a valid connection so that applications can defer
// error handling to the first use of the connection. If there is an error
// getting an underlying connection, then the connection Err, Do, Send, Flush
// and Receive methods return that error.
func
(
p
*
Pool
)
Get
()
Conn
{
pc
,
err
:=
p
.
get
(
nil
)
if
err
!=
nil
{
return
errorConn
{
err
}
}
return
&
activeConn
{
p
:
p
,
pc
:
pc
}
}
// PoolStats contains pool statistics.
type
PoolStats
struct
{
// ActiveCount is the number of connections in the pool. The count includes
// idle connections and connections in use.
ActiveCount
int
// IdleCount is the number of idle connections in the pool.
IdleCount
int
}
// Stats returns pool's statistics.
func
(
p
*
Pool
)
Stats
()
PoolStats
{
p
.
mu
.
Lock
()
stats
:=
PoolStats
{
ActiveCount
:
p
.
active
,
IdleCount
:
p
.
idle
.
count
,
}
p
.
mu
.
Unlock
()
return
stats
}
// ActiveCount returns the number of connections in the pool. The count
// includes idle connections and connections in use.
func
(
p
*
Pool
)
ActiveCount
()
int
{
p
.
mu
.
Lock
()
active
:=
p
.
active
p
.
mu
.
Unlock
()
return
active
}
// IdleCount returns the number of idle connections in the pool.
func
(
p
*
Pool
)
IdleCount
()
int
{
p
.
mu
.
Lock
()
idle
:=
p
.
idle
.
count
p
.
mu
.
Unlock
()
return
idle
}
// Close releases the resources used by the pool.
func
(
p
*
Pool
)
Close
()
error
{
p
.
mu
.
Lock
()
if
p
.
closed
{
p
.
mu
.
Unlock
()
return
nil
}
p
.
closed
=
true
p
.
active
-=
p
.
idle
.
count
pc
:=
p
.
idle
.
front
p
.
idle
.
count
=
0
p
.
idle
.
front
,
p
.
idle
.
back
=
nil
,
nil
if
p
.
ch
!=
nil
{
close
(
p
.
ch
)
}
p
.
mu
.
Unlock
()
for
;
pc
!=
nil
;
pc
=
pc
.
next
{
pc
.
c
.
Close
()
}
return
nil
}
func
(
p
*
Pool
)
lazyInit
()
{
// Fast path.
if
atomic
.
LoadUint32
(
&
p
.
chInitialized
)
==
1
{
return
}
// Slow path.
p
.
mu
.
Lock
()
if
p
.
chInitialized
==
0
{
p
.
ch
=
make
(
chan
struct
{},
p
.
MaxActive
)
if
p
.
closed
{
close
(
p
.
ch
)
}
else
{
for
i
:=
0
;
i
<
p
.
MaxActive
;
i
++
{
p
.
ch
<-
struct
{}{}
}
}
atomic
.
StoreUint32
(
&
p
.
chInitialized
,
1
)
}
p
.
mu
.
Unlock
()
}
// get prunes stale connections and returns a connection from the idle list or
// creates a new connection.
func
(
p
*
Pool
)
get
(
ctx
interface
{
Done
()
<-
chan
struct
{}
Err
()
error
})
(
*
poolConn
,
error
)
{
// Handle limit for p.Wait == true.
if
p
.
Wait
&&
p
.
MaxActive
>
0
{
p
.
lazyInit
()
if
ctx
==
nil
{
<-
p
.
ch
}
else
{
select
{
case
<-
p
.
ch
:
case
<-
ctx
.
Done
()
:
return
nil
,
ctx
.
Err
()
}
}
}
p
.
mu
.
Lock
()
// Prune stale connections at the back of the idle list.
if
p
.
IdleTimeout
>
0
{
n
:=
p
.
idle
.
count
for
i
:=
0
;
i
<
n
&&
p
.
idle
.
back
!=
nil
&&
p
.
idle
.
back
.
t
.
Add
(
p
.
IdleTimeout
)
.
Before
(
nowFunc
());
i
++
{
pc
:=
p
.
idle
.
back
p
.
idle
.
popBack
()
p
.
mu
.
Unlock
()
pc
.
c
.
Close
()
p
.
mu
.
Lock
()
p
.
active
--
}
}
// Get idle connection from the front of idle list.
for
p
.
idle
.
front
!=
nil
{
pc
:=
p
.
idle
.
front
p
.
idle
.
popFront
()
p
.
mu
.
Unlock
()
if
(
p
.
TestOnBorrow
==
nil
||
p
.
TestOnBorrow
(
pc
.
c
,
pc
.
t
)
==
nil
)
&&
(
p
.
MaxConnLifetime
==
0
||
nowFunc
()
.
Sub
(
pc
.
created
)
<
p
.
MaxConnLifetime
)
{
return
pc
,
nil
}
pc
.
c
.
Close
()
p
.
mu
.
Lock
()
p
.
active
--
}
// Check for pool closed before dialing a new connection.
if
p
.
closed
{
p
.
mu
.
Unlock
()
return
nil
,
errors
.
New
(
"redigo: get on closed pool"
)
}
// Handle limit for p.Wait == false.
if
!
p
.
Wait
&&
p
.
MaxActive
>
0
&&
p
.
active
>=
p
.
MaxActive
{
p
.
mu
.
Unlock
()
return
nil
,
ErrPoolExhausted
}
p
.
active
++
p
.
mu
.
Unlock
()
c
,
err
:=
p
.
Dial
()
if
err
!=
nil
{
c
=
nil
p
.
mu
.
Lock
()
p
.
active
--
if
p
.
ch
!=
nil
&&
!
p
.
closed
{
p
.
ch
<-
struct
{}{}
}
p
.
mu
.
Unlock
()
}
return
&
poolConn
{
c
:
c
,
created
:
nowFunc
()},
err
}
func
(
p
*
Pool
)
put
(
pc
*
poolConn
,
forceClose
bool
)
error
{
p
.
mu
.
Lock
()
if
!
p
.
closed
&&
!
forceClose
{
pc
.
t
=
nowFunc
()
p
.
idle
.
pushFront
(
pc
)
if
p
.
idle
.
count
>
p
.
MaxIdle
{
pc
=
p
.
idle
.
back
p
.
idle
.
popBack
()
}
else
{
pc
=
nil
}
}
if
pc
!=
nil
{
p
.
mu
.
Unlock
()
pc
.
c
.
Close
()
p
.
mu
.
Lock
()
p
.
active
--
}
if
p
.
ch
!=
nil
&&
!
p
.
closed
{
p
.
ch
<-
struct
{}{}
}
p
.
mu
.
Unlock
()
return
nil
}
type
activeConn
struct
{
p
*
Pool
pc
*
poolConn
state
int
}
var
(
sentinel
[]
byte
sentinelOnce
sync
.
Once
)
func
initSentinel
()
{
p
:=
make
([]
byte
,
64
)
if
_
,
err
:=
rand
.
Read
(
p
);
err
==
nil
{
sentinel
=
p
}
else
{
h
:=
sha1
.
New
()
io
.
WriteString
(
h
,
"Oops, rand failed. Use time instead."
)
io
.
WriteString
(
h
,
strconv
.
FormatInt
(
time
.
Now
()
.
UnixNano
(),
10
))
sentinel
=
h
.
Sum
(
nil
)
}
}
func
(
ac
*
activeConn
)
Close
()
error
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
nil
}
ac
.
pc
=
nil
if
ac
.
state
&
internal
.
MultiState
!=
0
{
pc
.
c
.
Send
(
"DISCARD"
)
ac
.
state
&^=
(
internal
.
MultiState
|
internal
.
WatchState
)
}
else
if
ac
.
state
&
internal
.
WatchState
!=
0
{
pc
.
c
.
Send
(
"UNWATCH"
)
ac
.
state
&^=
internal
.
WatchState
}
if
ac
.
state
&
internal
.
SubscribeState
!=
0
{
pc
.
c
.
Send
(
"UNSUBSCRIBE"
)
pc
.
c
.
Send
(
"PUNSUBSCRIBE"
)
// To detect the end of the message stream, ask the server to echo
// a sentinel value and read until we see that value.
sentinelOnce
.
Do
(
initSentinel
)
pc
.
c
.
Send
(
"ECHO"
,
sentinel
)
pc
.
c
.
Flush
()
for
{
p
,
err
:=
pc
.
c
.
Receive
()
if
err
!=
nil
{
break
}
if
p
,
ok
:=
p
.
([]
byte
);
ok
&&
bytes
.
Equal
(
p
,
sentinel
)
{
ac
.
state
&^=
internal
.
SubscribeState
break
}
}
}
pc
.
c
.
Do
(
""
)
ac
.
p
.
put
(
pc
,
ac
.
state
!=
0
||
pc
.
c
.
Err
()
!=
nil
)
return
nil
}
func
(
ac
*
activeConn
)
Err
()
error
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
errConnClosed
}
return
pc
.
c
.
Err
()
}
func
(
ac
*
activeConn
)
Do
(
commandName
string
,
args
...
interface
{})
(
reply
interface
{},
err
error
)
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
nil
,
errConnClosed
}
ci
:=
internal
.
LookupCommandInfo
(
commandName
)
ac
.
state
=
(
ac
.
state
|
ci
.
Set
)
&^
ci
.
Clear
return
pc
.
c
.
Do
(
commandName
,
args
...
)
}
func
(
ac
*
activeConn
)
DoWithTimeout
(
timeout
time
.
Duration
,
commandName
string
,
args
...
interface
{})
(
reply
interface
{},
err
error
)
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
nil
,
errConnClosed
}
cwt
,
ok
:=
pc
.
c
.
(
ConnWithTimeout
)
if
!
ok
{
return
nil
,
errTimeoutNotSupported
}
ci
:=
internal
.
LookupCommandInfo
(
commandName
)
ac
.
state
=
(
ac
.
state
|
ci
.
Set
)
&^
ci
.
Clear
return
cwt
.
DoWithTimeout
(
timeout
,
commandName
,
args
...
)
}
func
(
ac
*
activeConn
)
Send
(
commandName
string
,
args
...
interface
{})
error
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
errConnClosed
}
ci
:=
internal
.
LookupCommandInfo
(
commandName
)
ac
.
state
=
(
ac
.
state
|
ci
.
Set
)
&^
ci
.
Clear
return
pc
.
c
.
Send
(
commandName
,
args
...
)
}
func
(
ac
*
activeConn
)
Flush
()
error
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
errConnClosed
}
return
pc
.
c
.
Flush
()
}
func
(
ac
*
activeConn
)
Receive
()
(
reply
interface
{},
err
error
)
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
nil
,
errConnClosed
}
return
pc
.
c
.
Receive
()
}
func
(
ac
*
activeConn
)
ReceiveWithTimeout
(
timeout
time
.
Duration
)
(
reply
interface
{},
err
error
)
{
pc
:=
ac
.
pc
if
pc
==
nil
{
return
nil
,
errConnClosed
}
cwt
,
ok
:=
pc
.
c
.
(
ConnWithTimeout
)
if
!
ok
{
return
nil
,
errTimeoutNotSupported
}
return
cwt
.
ReceiveWithTimeout
(
timeout
)
}
type
errorConn
struct
{
err
error
}
func
(
ec
errorConn
)
Do
(
string
,
...
interface
{})
(
interface
{},
error
)
{
return
nil
,
ec
.
err
}
func
(
ec
errorConn
)
DoWithTimeout
(
time
.
Duration
,
string
,
...
interface
{})
(
interface
{},
error
)
{
return
nil
,
ec
.
err
}
func
(
ec
errorConn
)
Send
(
string
,
...
interface
{})
error
{
return
ec
.
err
}
func
(
ec
errorConn
)
Err
()
error
{
return
ec
.
err
}
func
(
ec
errorConn
)
Close
()
error
{
return
nil
}
func
(
ec
errorConn
)
Flush
()
error
{
return
ec
.
err
}
func
(
ec
errorConn
)
Receive
()
(
interface
{},
error
)
{
return
nil
,
ec
.
err
}
func
(
ec
errorConn
)
ReceiveWithTimeout
(
time
.
Duration
)
(
interface
{},
error
)
{
return
nil
,
ec
.
err
}
type
idleList
struct
{
count
int
front
,
back
*
poolConn
}
type
poolConn
struct
{
c
Conn
t
time
.
Time
created
time
.
Time
next
,
prev
*
poolConn
}
func
(
l
*
idleList
)
pushFront
(
pc
*
poolConn
)
{
pc
.
next
=
l
.
front
pc
.
prev
=
nil
if
l
.
count
==
0
{
l
.
back
=
pc
}
else
{
l
.
front
.
prev
=
pc
}
l
.
front
=
pc
l
.
count
++
return
}
func
(
l
*
idleList
)
popFront
()
{
pc
:=
l
.
front
l
.
count
--
if
l
.
count
==
0
{
l
.
front
,
l
.
back
=
nil
,
nil
}
else
{
pc
.
next
.
prev
=
nil
l
.
front
=
pc
.
next
}
pc
.
next
,
pc
.
prev
=
nil
,
nil
}
func
(
l
*
idleList
)
popBack
()
{
pc
:=
l
.
back
l
.
count
--
if
l
.
count
==
0
{
l
.
front
,
l
.
back
=
nil
,
nil
}
else
{
pc
.
prev
.
next
=
nil
l
.
back
=
pc
.
prev
}
pc
.
next
,
pc
.
prev
=
nil
,
nil
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/pool17.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2018 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
// +build go1.7
package
redis
import
"context"
// GetContext gets a connection using the provided context.
//
// The provided Context must be non-nil. If the context expires before the
// connection is complete, an error is returned. Any expiration on the context
// will not affect the returned connection.
//
// If the function completes without error, then the application must close the
// returned connection.
func
(
p
*
Pool
)
GetContext
(
ctx
context
.
Context
)
(
Conn
,
error
)
{
pc
,
err
:=
p
.
get
(
ctx
)
if
err
!=
nil
{
return
errorConn
{
err
},
err
}
return
&
activeConn
{
p
:
p
,
pc
:
pc
},
nil
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/pubsub.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"errors"
"time"
)
// Subscription represents a subscribe or unsubscribe notification.
type
Subscription
struct
{
// Kind is "subscribe", "unsubscribe", "psubscribe" or "punsubscribe"
Kind
string
// The channel that was changed.
Channel
string
// The current number of subscriptions for connection.
Count
int
}
// Message represents a message notification.
type
Message
struct
{
// The originating channel.
Channel
string
// The matched pattern, if any
Pattern
string
// The message data.
Data
[]
byte
}
// Pong represents a pubsub pong notification.
type
Pong
struct
{
Data
string
}
// PubSubConn wraps a Conn with convenience methods for subscribers.
type
PubSubConn
struct
{
Conn
Conn
}
// Close closes the connection.
func
(
c
PubSubConn
)
Close
()
error
{
return
c
.
Conn
.
Close
()
}
// Subscribe subscribes the connection to the specified channels.
func
(
c
PubSubConn
)
Subscribe
(
channel
...
interface
{})
error
{
c
.
Conn
.
Send
(
"SUBSCRIBE"
,
channel
...
)
return
c
.
Conn
.
Flush
()
}
// PSubscribe subscribes the connection to the given patterns.
func
(
c
PubSubConn
)
PSubscribe
(
channel
...
interface
{})
error
{
c
.
Conn
.
Send
(
"PSUBSCRIBE"
,
channel
...
)
return
c
.
Conn
.
Flush
()
}
// Unsubscribe unsubscribes the connection from the given channels, or from all
// of them if none is given.
func
(
c
PubSubConn
)
Unsubscribe
(
channel
...
interface
{})
error
{
c
.
Conn
.
Send
(
"UNSUBSCRIBE"
,
channel
...
)
return
c
.
Conn
.
Flush
()
}
// PUnsubscribe unsubscribes the connection from the given patterns, or from all
// of them if none is given.
func
(
c
PubSubConn
)
PUnsubscribe
(
channel
...
interface
{})
error
{
c
.
Conn
.
Send
(
"PUNSUBSCRIBE"
,
channel
...
)
return
c
.
Conn
.
Flush
()
}
// Ping sends a PING to the server with the specified data.
//
// The connection must be subscribed to at least one channel or pattern when
// calling this method.
func
(
c
PubSubConn
)
Ping
(
data
string
)
error
{
c
.
Conn
.
Send
(
"PING"
,
data
)
return
c
.
Conn
.
Flush
()
}
// Receive returns a pushed message as a Subscription, Message, Pong or error.
// The return value is intended to be used directly in a type switch as
// illustrated in the PubSubConn example.
func
(
c
PubSubConn
)
Receive
()
interface
{}
{
return
c
.
receiveInternal
(
c
.
Conn
.
Receive
())
}
// ReceiveWithTimeout is like Receive, but it allows the application to
// override the connection's default timeout.
func
(
c
PubSubConn
)
ReceiveWithTimeout
(
timeout
time
.
Duration
)
interface
{}
{
return
c
.
receiveInternal
(
ReceiveWithTimeout
(
c
.
Conn
,
timeout
))
}
func
(
c
PubSubConn
)
receiveInternal
(
replyArg
interface
{},
errArg
error
)
interface
{}
{
reply
,
err
:=
Values
(
replyArg
,
errArg
)
if
err
!=
nil
{
return
err
}
var
kind
string
reply
,
err
=
Scan
(
reply
,
&
kind
)
if
err
!=
nil
{
return
err
}
switch
kind
{
case
"message"
:
var
m
Message
if
_
,
err
:=
Scan
(
reply
,
&
m
.
Channel
,
&
m
.
Data
);
err
!=
nil
{
return
err
}
return
m
case
"pmessage"
:
var
m
Message
if
_
,
err
:=
Scan
(
reply
,
&
m
.
Pattern
,
&
m
.
Channel
,
&
m
.
Data
);
err
!=
nil
{
return
err
}
return
m
case
"subscribe"
,
"psubscribe"
,
"unsubscribe"
,
"punsubscribe"
:
s
:=
Subscription
{
Kind
:
kind
}
if
_
,
err
:=
Scan
(
reply
,
&
s
.
Channel
,
&
s
.
Count
);
err
!=
nil
{
return
err
}
return
s
case
"pong"
:
var
p
Pong
if
_
,
err
:=
Scan
(
reply
,
&
p
.
Data
);
err
!=
nil
{
return
err
}
return
p
}
return
errors
.
New
(
"redigo: unknown pubsub notification"
)
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/redis.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"errors"
"time"
)
// Error represents an error returned in a command reply.
type
Error
string
func
(
err
Error
)
Error
()
string
{
return
string
(
err
)
}
// Conn represents a connection to a Redis server.
type
Conn
interface
{
// Close closes the connection.
Close
()
error
// Err returns a non-nil value when the connection is not usable.
Err
()
error
// Do sends a command to the server and returns the received reply.
Do
(
commandName
string
,
args
...
interface
{})
(
reply
interface
{},
err
error
)
// Send writes the command to the client's output buffer.
Send
(
commandName
string
,
args
...
interface
{})
error
// Flush flushes the output buffer to the Redis server.
Flush
()
error
// Receive receives a single reply from the Redis server
Receive
()
(
reply
interface
{},
err
error
)
}
// Argument is the interface implemented by an object which wants to control how
// the object is converted to Redis bulk strings.
type
Argument
interface
{
// RedisArg returns a value to be encoded as a bulk string per the
// conversions listed in the section 'Executing Commands'.
// Implementations should typically return a []byte or string.
RedisArg
()
interface
{}
}
// Scanner is implemented by an object which wants to control its value is
// interpreted when read from Redis.
type
Scanner
interface
{
// RedisScan assigns a value from a Redis value. The argument src is one of
// the reply types listed in the section `Executing Commands`.
//
// An error should be returned if the value cannot be stored without
// loss of information.
RedisScan
(
src
interface
{})
error
}
// ConnWithTimeout is an optional interface that allows the caller to override
// a connection's default read timeout. This interface is useful for executing
// the BLPOP, BRPOP, BRPOPLPUSH, XREAD and other commands that block at the
// server.
//
// A connection's default read timeout is set with the DialReadTimeout dial
// option. Applications should rely on the default timeout for commands that do
// not block at the server.
//
// All of the Conn implementations in this package satisfy the ConnWithTimeout
// interface.
//
// Use the DoWithTimeout and ReceiveWithTimeout helper functions to simplify
// use of this interface.
type
ConnWithTimeout
interface
{
Conn
// Do sends a command to the server and returns the received reply.
// The timeout overrides the read timeout set when dialing the
// connection.
DoWithTimeout
(
timeout
time
.
Duration
,
commandName
string
,
args
...
interface
{})
(
reply
interface
{},
err
error
)
// Receive receives a single reply from the Redis server. The timeout
// overrides the read timeout set when dialing the connection.
ReceiveWithTimeout
(
timeout
time
.
Duration
)
(
reply
interface
{},
err
error
)
}
var
errTimeoutNotSupported
=
errors
.
New
(
"redis: connection does not support ConnWithTimeout"
)
// DoWithTimeout executes a Redis command with the specified read timeout. If
// the connection does not satisfy the ConnWithTimeout interface, then an error
// is returned.
func
DoWithTimeout
(
c
Conn
,
timeout
time
.
Duration
,
cmd
string
,
args
...
interface
{})
(
interface
{},
error
)
{
cwt
,
ok
:=
c
.
(
ConnWithTimeout
)
if
!
ok
{
return
nil
,
errTimeoutNotSupported
}
return
cwt
.
DoWithTimeout
(
timeout
,
cmd
,
args
...
)
}
// ReceiveWithTimeout receives a reply with the specified read timeout. If the
// connection does not satisfy the ConnWithTimeout interface, then an error is
// returned.
func
ReceiveWithTimeout
(
c
Conn
,
timeout
time
.
Duration
)
(
interface
{},
error
)
{
cwt
,
ok
:=
c
.
(
ConnWithTimeout
)
if
!
ok
{
return
nil
,
errTimeoutNotSupported
}
return
cwt
.
ReceiveWithTimeout
(
timeout
)
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/reply.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"errors"
"fmt"
"strconv"
)
// ErrNil indicates that a reply value is nil.
var
ErrNil
=
errors
.
New
(
"redigo: nil returned"
)
// Int is a helper that converts a command reply to an integer. If err is not
// equal to nil, then Int returns 0, err. Otherwise, Int converts the
// reply to an int as follows:
//
// Reply type Result
// integer int(reply), nil
// bulk string parsed reply, nil
// nil 0, ErrNil
// other 0, error
func
Int
(
reply
interface
{},
err
error
)
(
int
,
error
)
{
if
err
!=
nil
{
return
0
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
int64
:
x
:=
int
(
reply
)
if
int64
(
x
)
!=
reply
{
return
0
,
strconv
.
ErrRange
}
return
x
,
nil
case
[]
byte
:
n
,
err
:=
strconv
.
ParseInt
(
string
(
reply
),
10
,
0
)
return
int
(
n
),
err
case
nil
:
return
0
,
ErrNil
case
Error
:
return
0
,
reply
}
return
0
,
fmt
.
Errorf
(
"redigo: unexpected type for Int, got type %T"
,
reply
)
}
// Int64 is a helper that converts a command reply to 64 bit integer. If err is
// not equal to nil, then Int returns 0, err. Otherwise, Int64 converts the
// reply to an int64 as follows:
//
// Reply type Result
// integer reply, nil
// bulk string parsed reply, nil
// nil 0, ErrNil
// other 0, error
func
Int64
(
reply
interface
{},
err
error
)
(
int64
,
error
)
{
if
err
!=
nil
{
return
0
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
int64
:
return
reply
,
nil
case
[]
byte
:
n
,
err
:=
strconv
.
ParseInt
(
string
(
reply
),
10
,
64
)
return
n
,
err
case
nil
:
return
0
,
ErrNil
case
Error
:
return
0
,
reply
}
return
0
,
fmt
.
Errorf
(
"redigo: unexpected type for Int64, got type %T"
,
reply
)
}
var
errNegativeInt
=
errors
.
New
(
"redigo: unexpected value for Uint64"
)
// Uint64 is a helper that converts a command reply to 64 bit integer. If err is
// not equal to nil, then Int returns 0, err. Otherwise, Int64 converts the
// reply to an int64 as follows:
//
// Reply type Result
// integer reply, nil
// bulk string parsed reply, nil
// nil 0, ErrNil
// other 0, error
func
Uint64
(
reply
interface
{},
err
error
)
(
uint64
,
error
)
{
if
err
!=
nil
{
return
0
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
int64
:
if
reply
<
0
{
return
0
,
errNegativeInt
}
return
uint64
(
reply
),
nil
case
[]
byte
:
n
,
err
:=
strconv
.
ParseUint
(
string
(
reply
),
10
,
64
)
return
n
,
err
case
nil
:
return
0
,
ErrNil
case
Error
:
return
0
,
reply
}
return
0
,
fmt
.
Errorf
(
"redigo: unexpected type for Uint64, got type %T"
,
reply
)
}
// Float64 is a helper that converts a command reply to 64 bit float. If err is
// not equal to nil, then Float64 returns 0, err. Otherwise, Float64 converts
// the reply to an int as follows:
//
// Reply type Result
// bulk string parsed reply, nil
// nil 0, ErrNil
// other 0, error
func
Float64
(
reply
interface
{},
err
error
)
(
float64
,
error
)
{
if
err
!=
nil
{
return
0
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
[]
byte
:
n
,
err
:=
strconv
.
ParseFloat
(
string
(
reply
),
64
)
return
n
,
err
case
nil
:
return
0
,
ErrNil
case
Error
:
return
0
,
reply
}
return
0
,
fmt
.
Errorf
(
"redigo: unexpected type for Float64, got type %T"
,
reply
)
}
// String is a helper that converts a command reply to a string. If err is not
// equal to nil, then String returns "", err. Otherwise String converts the
// reply to a string as follows:
//
// Reply type Result
// bulk string string(reply), nil
// simple string reply, nil
// nil "", ErrNil
// other "", error
func
String
(
reply
interface
{},
err
error
)
(
string
,
error
)
{
if
err
!=
nil
{
return
""
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
[]
byte
:
return
string
(
reply
),
nil
case
string
:
return
reply
,
nil
case
nil
:
return
""
,
ErrNil
case
Error
:
return
""
,
reply
}
return
""
,
fmt
.
Errorf
(
"redigo: unexpected type for String, got type %T"
,
reply
)
}
// Bytes is a helper that converts a command reply to a slice of bytes. If err
// is not equal to nil, then Bytes returns nil, err. Otherwise Bytes converts
// the reply to a slice of bytes as follows:
//
// Reply type Result
// bulk string reply, nil
// simple string []byte(reply), nil
// nil nil, ErrNil
// other nil, error
func
Bytes
(
reply
interface
{},
err
error
)
([]
byte
,
error
)
{
if
err
!=
nil
{
return
nil
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
[]
byte
:
return
reply
,
nil
case
string
:
return
[]
byte
(
reply
),
nil
case
nil
:
return
nil
,
ErrNil
case
Error
:
return
nil
,
reply
}
return
nil
,
fmt
.
Errorf
(
"redigo: unexpected type for Bytes, got type %T"
,
reply
)
}
// Bool is a helper that converts a command reply to a boolean. If err is not
// equal to nil, then Bool returns false, err. Otherwise Bool converts the
// reply to boolean as follows:
//
// Reply type Result
// integer value != 0, nil
// bulk string strconv.ParseBool(reply)
// nil false, ErrNil
// other false, error
func
Bool
(
reply
interface
{},
err
error
)
(
bool
,
error
)
{
if
err
!=
nil
{
return
false
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
int64
:
return
reply
!=
0
,
nil
case
[]
byte
:
return
strconv
.
ParseBool
(
string
(
reply
))
case
nil
:
return
false
,
ErrNil
case
Error
:
return
false
,
reply
}
return
false
,
fmt
.
Errorf
(
"redigo: unexpected type for Bool, got type %T"
,
reply
)
}
// MultiBulk is a helper that converts an array command reply to a []interface{}.
//
// Deprecated: Use Values instead.
func
MultiBulk
(
reply
interface
{},
err
error
)
([]
interface
{},
error
)
{
return
Values
(
reply
,
err
)
}
// Values is a helper that converts an array command reply to a []interface{}.
// If err is not equal to nil, then Values returns nil, err. Otherwise, Values
// converts the reply as follows:
//
// Reply type Result
// array reply, nil
// nil nil, ErrNil
// other nil, error
func
Values
(
reply
interface
{},
err
error
)
([]
interface
{},
error
)
{
if
err
!=
nil
{
return
nil
,
err
}
switch
reply
:=
reply
.
(
type
)
{
case
[]
interface
{}
:
return
reply
,
nil
case
nil
:
return
nil
,
ErrNil
case
Error
:
return
nil
,
reply
}
return
nil
,
fmt
.
Errorf
(
"redigo: unexpected type for Values, got type %T"
,
reply
)
}
func
sliceHelper
(
reply
interface
{},
err
error
,
name
string
,
makeSlice
func
(
int
),
assign
func
(
int
,
interface
{})
error
)
error
{
if
err
!=
nil
{
return
err
}
switch
reply
:=
reply
.
(
type
)
{
case
[]
interface
{}
:
makeSlice
(
len
(
reply
))
for
i
:=
range
reply
{
if
reply
[
i
]
==
nil
{
continue
}
if
err
:=
assign
(
i
,
reply
[
i
]);
err
!=
nil
{
return
err
}
}
return
nil
case
nil
:
return
ErrNil
case
Error
:
return
reply
}
return
fmt
.
Errorf
(
"redigo: unexpected type for %s, got type %T"
,
name
,
reply
)
}
// Float64s is a helper that converts an array command reply to a []float64. If
// err is not equal to nil, then Float64s returns nil, err. Nil array items are
// converted to 0 in the output slice. Floats64 returns an error if an array
// item is not a bulk string or nil.
func
Float64s
(
reply
interface
{},
err
error
)
([]
float64
,
error
)
{
var
result
[]
float64
err
=
sliceHelper
(
reply
,
err
,
"Float64s"
,
func
(
n
int
)
{
result
=
make
([]
float64
,
n
)
},
func
(
i
int
,
v
interface
{})
error
{
p
,
ok
:=
v
.
([]
byte
)
if
!
ok
{
return
fmt
.
Errorf
(
"redigo: unexpected element type for Floats64, got type %T"
,
v
)
}
f
,
err
:=
strconv
.
ParseFloat
(
string
(
p
),
64
)
result
[
i
]
=
f
return
err
})
return
result
,
err
}
// Strings is a helper that converts an array command reply to a []string. If
// err is not equal to nil, then Strings returns nil, err. Nil array items are
// converted to "" in the output slice. Strings returns an error if an array
// item is not a bulk string or nil.
func
Strings
(
reply
interface
{},
err
error
)
([]
string
,
error
)
{
var
result
[]
string
err
=
sliceHelper
(
reply
,
err
,
"Strings"
,
func
(
n
int
)
{
result
=
make
([]
string
,
n
)
},
func
(
i
int
,
v
interface
{})
error
{
switch
v
:=
v
.
(
type
)
{
case
string
:
result
[
i
]
=
v
return
nil
case
[]
byte
:
result
[
i
]
=
string
(
v
)
return
nil
default
:
return
fmt
.
Errorf
(
"redigo: unexpected element type for Strings, got type %T"
,
v
)
}
})
return
result
,
err
}
// ByteSlices is a helper that converts an array command reply to a [][]byte.
// If err is not equal to nil, then ByteSlices returns nil, err. Nil array
// items are stay nil. ByteSlices returns an error if an array item is not a
// bulk string or nil.
func
ByteSlices
(
reply
interface
{},
err
error
)
([][]
byte
,
error
)
{
var
result
[][]
byte
err
=
sliceHelper
(
reply
,
err
,
"ByteSlices"
,
func
(
n
int
)
{
result
=
make
([][]
byte
,
n
)
},
func
(
i
int
,
v
interface
{})
error
{
p
,
ok
:=
v
.
([]
byte
)
if
!
ok
{
return
fmt
.
Errorf
(
"redigo: unexpected element type for ByteSlices, got type %T"
,
v
)
}
result
[
i
]
=
p
return
nil
})
return
result
,
err
}
// Int64s is a helper that converts an array command reply to a []int64.
// If err is not equal to nil, then Int64s returns nil, err. Nil array
// items are stay nil. Int64s returns an error if an array item is not a
// bulk string or nil.
func
Int64s
(
reply
interface
{},
err
error
)
([]
int64
,
error
)
{
var
result
[]
int64
err
=
sliceHelper
(
reply
,
err
,
"Int64s"
,
func
(
n
int
)
{
result
=
make
([]
int64
,
n
)
},
func
(
i
int
,
v
interface
{})
error
{
switch
v
:=
v
.
(
type
)
{
case
int64
:
result
[
i
]
=
v
return
nil
case
[]
byte
:
n
,
err
:=
strconv
.
ParseInt
(
string
(
v
),
10
,
64
)
result
[
i
]
=
n
return
err
default
:
return
fmt
.
Errorf
(
"redigo: unexpected element type for Int64s, got type %T"
,
v
)
}
})
return
result
,
err
}
// Ints is a helper that converts an array command reply to a []in.
// If err is not equal to nil, then Ints returns nil, err. Nil array
// items are stay nil. Ints returns an error if an array item is not a
// bulk string or nil.
func
Ints
(
reply
interface
{},
err
error
)
([]
int
,
error
)
{
var
result
[]
int
err
=
sliceHelper
(
reply
,
err
,
"Ints"
,
func
(
n
int
)
{
result
=
make
([]
int
,
n
)
},
func
(
i
int
,
v
interface
{})
error
{
switch
v
:=
v
.
(
type
)
{
case
int64
:
n
:=
int
(
v
)
if
int64
(
n
)
!=
v
{
return
strconv
.
ErrRange
}
result
[
i
]
=
n
return
nil
case
[]
byte
:
n
,
err
:=
strconv
.
Atoi
(
string
(
v
))
result
[
i
]
=
n
return
err
default
:
return
fmt
.
Errorf
(
"redigo: unexpected element type for Ints, got type %T"
,
v
)
}
})
return
result
,
err
}
// StringMap is a helper that converts an array of strings (alternating key, value)
// into a map[string]string. The HGETALL and CONFIG GET commands return replies in this format.
// Requires an even number of values in result.
func
StringMap
(
result
interface
{},
err
error
)
(
map
[
string
]
string
,
error
)
{
values
,
err
:=
Values
(
result
,
err
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
values
)
%
2
!=
0
{
return
nil
,
errors
.
New
(
"redigo: StringMap expects even number of values result"
)
}
m
:=
make
(
map
[
string
]
string
,
len
(
values
)
/
2
)
for
i
:=
0
;
i
<
len
(
values
);
i
+=
2
{
key
,
okKey
:=
values
[
i
]
.
([]
byte
)
value
,
okValue
:=
values
[
i
+
1
]
.
([]
byte
)
if
!
okKey
||
!
okValue
{
return
nil
,
errors
.
New
(
"redigo: StringMap key not a bulk string value"
)
}
m
[
string
(
key
)]
=
string
(
value
)
}
return
m
,
nil
}
// IntMap is a helper that converts an array of strings (alternating key, value)
// into a map[string]int. The HGETALL commands return replies in this format.
// Requires an even number of values in result.
func
IntMap
(
result
interface
{},
err
error
)
(
map
[
string
]
int
,
error
)
{
values
,
err
:=
Values
(
result
,
err
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
values
)
%
2
!=
0
{
return
nil
,
errors
.
New
(
"redigo: IntMap expects even number of values result"
)
}
m
:=
make
(
map
[
string
]
int
,
len
(
values
)
/
2
)
for
i
:=
0
;
i
<
len
(
values
);
i
+=
2
{
key
,
ok
:=
values
[
i
]
.
([]
byte
)
if
!
ok
{
return
nil
,
errors
.
New
(
"redigo: IntMap key not a bulk string value"
)
}
value
,
err
:=
Int
(
values
[
i
+
1
],
nil
)
if
err
!=
nil
{
return
nil
,
err
}
m
[
string
(
key
)]
=
value
}
return
m
,
nil
}
// Int64Map is a helper that converts an array of strings (alternating key, value)
// into a map[string]int64. The HGETALL commands return replies in this format.
// Requires an even number of values in result.
func
Int64Map
(
result
interface
{},
err
error
)
(
map
[
string
]
int64
,
error
)
{
values
,
err
:=
Values
(
result
,
err
)
if
err
!=
nil
{
return
nil
,
err
}
if
len
(
values
)
%
2
!=
0
{
return
nil
,
errors
.
New
(
"redigo: Int64Map expects even number of values result"
)
}
m
:=
make
(
map
[
string
]
int64
,
len
(
values
)
/
2
)
for
i
:=
0
;
i
<
len
(
values
);
i
+=
2
{
key
,
ok
:=
values
[
i
]
.
([]
byte
)
if
!
ok
{
return
nil
,
errors
.
New
(
"redigo: Int64Map key not a bulk string value"
)
}
value
,
err
:=
Int64
(
values
[
i
+
1
],
nil
)
if
err
!=
nil
{
return
nil
,
err
}
m
[
string
(
key
)]
=
value
}
return
m
,
nil
}
// Positions is a helper that converts an array of positions (lat, long)
// into a [][2]float64. The GEOPOS command returns replies in this format.
func
Positions
(
result
interface
{},
err
error
)
([]
*
[
2
]
float64
,
error
)
{
values
,
err
:=
Values
(
result
,
err
)
if
err
!=
nil
{
return
nil
,
err
}
positions
:=
make
([]
*
[
2
]
float64
,
len
(
values
))
for
i
:=
range
values
{
if
values
[
i
]
==
nil
{
continue
}
p
,
ok
:=
values
[
i
]
.
([]
interface
{})
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"redigo: unexpected element type for interface slice, got type %T"
,
values
[
i
])
}
if
len
(
p
)
!=
2
{
return
nil
,
fmt
.
Errorf
(
"redigo: unexpected number of values for a member position, got %d"
,
len
(
p
))
}
lat
,
err
:=
Float64
(
p
[
0
],
nil
)
if
err
!=
nil
{
return
nil
,
err
}
long
,
err
:=
Float64
(
p
[
1
],
nil
)
if
err
!=
nil
{
return
nil
,
err
}
positions
[
i
]
=
&
[
2
]
float64
{
lat
,
long
}
}
return
positions
,
nil
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/scan.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"errors"
"fmt"
"reflect"
"strconv"
"strings"
"sync"
)
func
ensureLen
(
d
reflect
.
Value
,
n
int
)
{
if
n
>
d
.
Cap
()
{
d
.
Set
(
reflect
.
MakeSlice
(
d
.
Type
(),
n
,
n
))
}
else
{
d
.
SetLen
(
n
)
}
}
func
cannotConvert
(
d
reflect
.
Value
,
s
interface
{})
error
{
var
sname
string
switch
s
.
(
type
)
{
case
string
:
sname
=
"Redis simple string"
case
Error
:
sname
=
"Redis error"
case
int64
:
sname
=
"Redis integer"
case
[]
byte
:
sname
=
"Redis bulk string"
case
[]
interface
{}
:
sname
=
"Redis array"
default
:
sname
=
reflect
.
TypeOf
(
s
)
.
String
()
}
return
fmt
.
Errorf
(
"cannot convert from %s to %s"
,
sname
,
d
.
Type
())
}
func
convertAssignBulkString
(
d
reflect
.
Value
,
s
[]
byte
)
(
err
error
)
{
switch
d
.
Type
()
.
Kind
()
{
case
reflect
.
Float32
,
reflect
.
Float64
:
var
x
float64
x
,
err
=
strconv
.
ParseFloat
(
string
(
s
),
d
.
Type
()
.
Bits
())
d
.
SetFloat
(
x
)
case
reflect
.
Int
,
reflect
.
Int8
,
reflect
.
Int16
,
reflect
.
Int32
,
reflect
.
Int64
:
var
x
int64
x
,
err
=
strconv
.
ParseInt
(
string
(
s
),
10
,
d
.
Type
()
.
Bits
())
d
.
SetInt
(
x
)
case
reflect
.
Uint
,
reflect
.
Uint8
,
reflect
.
Uint16
,
reflect
.
Uint32
,
reflect
.
Uint64
:
var
x
uint64
x
,
err
=
strconv
.
ParseUint
(
string
(
s
),
10
,
d
.
Type
()
.
Bits
())
d
.
SetUint
(
x
)
case
reflect
.
Bool
:
var
x
bool
x
,
err
=
strconv
.
ParseBool
(
string
(
s
))
d
.
SetBool
(
x
)
case
reflect
.
String
:
d
.
SetString
(
string
(
s
))
case
reflect
.
Slice
:
if
d
.
Type
()
.
Elem
()
.
Kind
()
!=
reflect
.
Uint8
{
err
=
cannotConvert
(
d
,
s
)
}
else
{
d
.
SetBytes
(
s
)
}
default
:
err
=
cannotConvert
(
d
,
s
)
}
return
}
func
convertAssignInt
(
d
reflect
.
Value
,
s
int64
)
(
err
error
)
{
switch
d
.
Type
()
.
Kind
()
{
case
reflect
.
Int
,
reflect
.
Int8
,
reflect
.
Int16
,
reflect
.
Int32
,
reflect
.
Int64
:
d
.
SetInt
(
s
)
if
d
.
Int
()
!=
s
{
err
=
strconv
.
ErrRange
d
.
SetInt
(
0
)
}
case
reflect
.
Uint
,
reflect
.
Uint8
,
reflect
.
Uint16
,
reflect
.
Uint32
,
reflect
.
Uint64
:
if
s
<
0
{
err
=
strconv
.
ErrRange
}
else
{
x
:=
uint64
(
s
)
d
.
SetUint
(
x
)
if
d
.
Uint
()
!=
x
{
err
=
strconv
.
ErrRange
d
.
SetUint
(
0
)
}
}
case
reflect
.
Bool
:
d
.
SetBool
(
s
!=
0
)
default
:
err
=
cannotConvert
(
d
,
s
)
}
return
}
func
convertAssignValue
(
d
reflect
.
Value
,
s
interface
{})
(
err
error
)
{
if
d
.
Kind
()
!=
reflect
.
Ptr
{
if
d
.
CanAddr
()
{
d2
:=
d
.
Addr
()
if
d2
.
CanInterface
()
{
if
scanner
,
ok
:=
d2
.
Interface
()
.
(
Scanner
);
ok
{
return
scanner
.
RedisScan
(
s
)
}
}
}
}
else
if
d
.
CanInterface
()
{
// Already a reflect.Ptr
if
d
.
IsNil
()
{
d
.
Set
(
reflect
.
New
(
d
.
Type
()
.
Elem
()))
}
if
scanner
,
ok
:=
d
.
Interface
()
.
(
Scanner
);
ok
{
return
scanner
.
RedisScan
(
s
)
}
}
switch
s
:=
s
.
(
type
)
{
case
[]
byte
:
err
=
convertAssignBulkString
(
d
,
s
)
case
int64
:
err
=
convertAssignInt
(
d
,
s
)
default
:
err
=
cannotConvert
(
d
,
s
)
}
return
err
}
func
convertAssignArray
(
d
reflect
.
Value
,
s
[]
interface
{})
error
{
if
d
.
Type
()
.
Kind
()
!=
reflect
.
Slice
{
return
cannotConvert
(
d
,
s
)
}
ensureLen
(
d
,
len
(
s
))
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
if
err
:=
convertAssignValue
(
d
.
Index
(
i
),
s
[
i
]);
err
!=
nil
{
return
err
}
}
return
nil
}
func
convertAssign
(
d
interface
{},
s
interface
{})
(
err
error
)
{
if
scanner
,
ok
:=
d
.
(
Scanner
);
ok
{
return
scanner
.
RedisScan
(
s
)
}
// Handle the most common destination types using type switches and
// fall back to reflection for all other types.
switch
s
:=
s
.
(
type
)
{
case
nil
:
// ignore
case
[]
byte
:
switch
d
:=
d
.
(
type
)
{
case
*
string
:
*
d
=
string
(
s
)
case
*
int
:
*
d
,
err
=
strconv
.
Atoi
(
string
(
s
))
case
*
bool
:
*
d
,
err
=
strconv
.
ParseBool
(
string
(
s
))
case
*
[]
byte
:
*
d
=
s
case
*
interface
{}
:
*
d
=
s
case
nil
:
// skip value
default
:
if
d
:=
reflect
.
ValueOf
(
d
);
d
.
Type
()
.
Kind
()
!=
reflect
.
Ptr
{
err
=
cannotConvert
(
d
,
s
)
}
else
{
err
=
convertAssignBulkString
(
d
.
Elem
(),
s
)
}
}
case
int64
:
switch
d
:=
d
.
(
type
)
{
case
*
int
:
x
:=
int
(
s
)
if
int64
(
x
)
!=
s
{
err
=
strconv
.
ErrRange
x
=
0
}
*
d
=
x
case
*
bool
:
*
d
=
s
!=
0
case
*
interface
{}
:
*
d
=
s
case
nil
:
// skip value
default
:
if
d
:=
reflect
.
ValueOf
(
d
);
d
.
Type
()
.
Kind
()
!=
reflect
.
Ptr
{
err
=
cannotConvert
(
d
,
s
)
}
else
{
err
=
convertAssignInt
(
d
.
Elem
(),
s
)
}
}
case
string
:
switch
d
:=
d
.
(
type
)
{
case
*
string
:
*
d
=
s
case
*
interface
{}
:
*
d
=
s
case
nil
:
// skip value
default
:
err
=
cannotConvert
(
reflect
.
ValueOf
(
d
),
s
)
}
case
[]
interface
{}
:
switch
d
:=
d
.
(
type
)
{
case
*
[]
interface
{}
:
*
d
=
s
case
*
interface
{}
:
*
d
=
s
case
nil
:
// skip value
default
:
if
d
:=
reflect
.
ValueOf
(
d
);
d
.
Type
()
.
Kind
()
!=
reflect
.
Ptr
{
err
=
cannotConvert
(
d
,
s
)
}
else
{
err
=
convertAssignArray
(
d
.
Elem
(),
s
)
}
}
case
Error
:
err
=
s
default
:
err
=
cannotConvert
(
reflect
.
ValueOf
(
d
),
s
)
}
return
}
// Scan copies from src to the values pointed at by dest.
//
// Scan uses RedisScan if available otherwise:
//
// The values pointed at by dest must be an integer, float, boolean, string,
// []byte, interface{} or slices of these types. Scan uses the standard strconv
// package to convert bulk strings to numeric and boolean types.
//
// If a dest value is nil, then the corresponding src value is skipped.
//
// If a src element is nil, then the corresponding dest value is not modified.
//
// To enable easy use of Scan in a loop, Scan returns the slice of src
// following the copied values.
func
Scan
(
src
[]
interface
{},
dest
...
interface
{})
([]
interface
{},
error
)
{
if
len
(
src
)
<
len
(
dest
)
{
return
nil
,
errors
.
New
(
"redigo.Scan: array short"
)
}
var
err
error
for
i
,
d
:=
range
dest
{
err
=
convertAssign
(
d
,
src
[
i
])
if
err
!=
nil
{
err
=
fmt
.
Errorf
(
"redigo.Scan: cannot assign to dest %d: %v"
,
i
,
err
)
break
}
}
return
src
[
len
(
dest
)
:
],
err
}
type
fieldSpec
struct
{
name
string
index
[]
int
omitEmpty
bool
}
type
structSpec
struct
{
m
map
[
string
]
*
fieldSpec
l
[]
*
fieldSpec
}
func
(
ss
*
structSpec
)
fieldSpec
(
name
[]
byte
)
*
fieldSpec
{
return
ss
.
m
[
string
(
name
)]
}
func
compileStructSpec
(
t
reflect
.
Type
,
depth
map
[
string
]
int
,
index
[]
int
,
ss
*
structSpec
)
{
for
i
:=
0
;
i
<
t
.
NumField
();
i
++
{
f
:=
t
.
Field
(
i
)
switch
{
case
f
.
PkgPath
!=
""
&&
!
f
.
Anonymous
:
// Ignore unexported fields.
case
f
.
Anonymous
:
// TODO: Handle pointers. Requires change to decoder and
// protection against infinite recursion.
if
f
.
Type
.
Kind
()
==
reflect
.
Struct
{
compileStructSpec
(
f
.
Type
,
depth
,
append
(
index
,
i
),
ss
)
}
default
:
fs
:=
&
fieldSpec
{
name
:
f
.
Name
}
tag
:=
f
.
Tag
.
Get
(
"redis"
)
p
:=
strings
.
Split
(
tag
,
","
)
if
len
(
p
)
>
0
{
if
p
[
0
]
==
"-"
{
continue
}
if
len
(
p
[
0
])
>
0
{
fs
.
name
=
p
[
0
]
}
for
_
,
s
:=
range
p
[
1
:
]
{
switch
s
{
case
"omitempty"
:
fs
.
omitEmpty
=
true
default
:
panic
(
fmt
.
Errorf
(
"redigo: unknown field tag %s for type %s"
,
s
,
t
.
Name
()))
}
}
}
d
,
found
:=
depth
[
fs
.
name
]
if
!
found
{
d
=
1
<<
30
}
switch
{
case
len
(
index
)
==
d
:
// At same depth, remove from result.
delete
(
ss
.
m
,
fs
.
name
)
j
:=
0
for
i
:=
0
;
i
<
len
(
ss
.
l
);
i
++
{
if
fs
.
name
!=
ss
.
l
[
i
]
.
name
{
ss
.
l
[
j
]
=
ss
.
l
[
i
]
j
+=
1
}
}
ss
.
l
=
ss
.
l
[
:
j
]
case
len
(
index
)
<
d
:
fs
.
index
=
make
([]
int
,
len
(
index
)
+
1
)
copy
(
fs
.
index
,
index
)
fs
.
index
[
len
(
index
)]
=
i
depth
[
fs
.
name
]
=
len
(
index
)
ss
.
m
[
fs
.
name
]
=
fs
ss
.
l
=
append
(
ss
.
l
,
fs
)
}
}
}
}
var
(
structSpecMutex
sync
.
RWMutex
structSpecCache
=
make
(
map
[
reflect
.
Type
]
*
structSpec
)
defaultFieldSpec
=
&
fieldSpec
{}
)
func
structSpecForType
(
t
reflect
.
Type
)
*
structSpec
{
structSpecMutex
.
RLock
()
ss
,
found
:=
structSpecCache
[
t
]
structSpecMutex
.
RUnlock
()
if
found
{
return
ss
}
structSpecMutex
.
Lock
()
defer
structSpecMutex
.
Unlock
()
ss
,
found
=
structSpecCache
[
t
]
if
found
{
return
ss
}
ss
=
&
structSpec
{
m
:
make
(
map
[
string
]
*
fieldSpec
)}
compileStructSpec
(
t
,
make
(
map
[
string
]
int
),
nil
,
ss
)
structSpecCache
[
t
]
=
ss
return
ss
}
var
errScanStructValue
=
errors
.
New
(
"redigo.ScanStruct: value must be non-nil pointer to a struct"
)
// ScanStruct scans alternating names and values from src to a struct. The
// HGETALL and CONFIG GET commands return replies in this format.
//
// ScanStruct uses exported field names to match values in the response. Use
// 'redis' field tag to override the name:
//
// Field int `redis:"myName"`
//
// Fields with the tag redis:"-" are ignored.
//
// Each field uses RedisScan if available otherwise:
// Integer, float, boolean, string and []byte fields are supported. Scan uses the
// standard strconv package to convert bulk string values to numeric and
// boolean types.
//
// If a src element is nil, then the corresponding field is not modified.
func
ScanStruct
(
src
[]
interface
{},
dest
interface
{})
error
{
d
:=
reflect
.
ValueOf
(
dest
)
if
d
.
Kind
()
!=
reflect
.
Ptr
||
d
.
IsNil
()
{
return
errScanStructValue
}
d
=
d
.
Elem
()
if
d
.
Kind
()
!=
reflect
.
Struct
{
return
errScanStructValue
}
ss
:=
structSpecForType
(
d
.
Type
())
if
len
(
src
)
%
2
!=
0
{
return
errors
.
New
(
"redigo.ScanStruct: number of values not a multiple of 2"
)
}
for
i
:=
0
;
i
<
len
(
src
);
i
+=
2
{
s
:=
src
[
i
+
1
]
if
s
==
nil
{
continue
}
name
,
ok
:=
src
[
i
]
.
([]
byte
)
if
!
ok
{
return
fmt
.
Errorf
(
"redigo.ScanStruct: key %d not a bulk string value"
,
i
)
}
fs
:=
ss
.
fieldSpec
(
name
)
if
fs
==
nil
{
continue
}
if
err
:=
convertAssignValue
(
d
.
FieldByIndex
(
fs
.
index
),
s
);
err
!=
nil
{
return
fmt
.
Errorf
(
"redigo.ScanStruct: cannot assign field %s: %v"
,
fs
.
name
,
err
)
}
}
return
nil
}
var
(
errScanSliceValue
=
errors
.
New
(
"redigo.ScanSlice: dest must be non-nil pointer to a struct"
)
)
// ScanSlice scans src to the slice pointed to by dest. The elements the dest
// slice must be integer, float, boolean, string, struct or pointer to struct
// values.
//
// Struct fields must be integer, float, boolean or string values. All struct
// fields are used unless a subset is specified using fieldNames.
func
ScanSlice
(
src
[]
interface
{},
dest
interface
{},
fieldNames
...
string
)
error
{
d
:=
reflect
.
ValueOf
(
dest
)
if
d
.
Kind
()
!=
reflect
.
Ptr
||
d
.
IsNil
()
{
return
errScanSliceValue
}
d
=
d
.
Elem
()
if
d
.
Kind
()
!=
reflect
.
Slice
{
return
errScanSliceValue
}
isPtr
:=
false
t
:=
d
.
Type
()
.
Elem
()
if
t
.
Kind
()
==
reflect
.
Ptr
&&
t
.
Elem
()
.
Kind
()
==
reflect
.
Struct
{
isPtr
=
true
t
=
t
.
Elem
()
}
if
t
.
Kind
()
!=
reflect
.
Struct
{
ensureLen
(
d
,
len
(
src
))
for
i
,
s
:=
range
src
{
if
s
==
nil
{
continue
}
if
err
:=
convertAssignValue
(
d
.
Index
(
i
),
s
);
err
!=
nil
{
return
fmt
.
Errorf
(
"redigo.ScanSlice: cannot assign element %d: %v"
,
i
,
err
)
}
}
return
nil
}
ss
:=
structSpecForType
(
t
)
fss
:=
ss
.
l
if
len
(
fieldNames
)
>
0
{
fss
=
make
([]
*
fieldSpec
,
len
(
fieldNames
))
for
i
,
name
:=
range
fieldNames
{
fss
[
i
]
=
ss
.
m
[
name
]
if
fss
[
i
]
==
nil
{
return
fmt
.
Errorf
(
"redigo.ScanSlice: ScanSlice bad field name %s"
,
name
)
}
}
}
if
len
(
fss
)
==
0
{
return
errors
.
New
(
"redigo.ScanSlice: no struct fields"
)
}
n
:=
len
(
src
)
/
len
(
fss
)
if
n
*
len
(
fss
)
!=
len
(
src
)
{
return
errors
.
New
(
"redigo.ScanSlice: length not a multiple of struct field count"
)
}
ensureLen
(
d
,
n
)
for
i
:=
0
;
i
<
n
;
i
++
{
d
:=
d
.
Index
(
i
)
if
isPtr
{
if
d
.
IsNil
()
{
d
.
Set
(
reflect
.
New
(
t
))
}
d
=
d
.
Elem
()
}
for
j
,
fs
:=
range
fss
{
s
:=
src
[
i
*
len
(
fss
)
+
j
]
if
s
==
nil
{
continue
}
if
err
:=
convertAssignValue
(
d
.
FieldByIndex
(
fs
.
index
),
s
);
err
!=
nil
{
return
fmt
.
Errorf
(
"redigo.ScanSlice: cannot assign element %d to field %s: %v"
,
i
*
len
(
fss
)
+
j
,
fs
.
name
,
err
)
}
}
}
return
nil
}
// Args is a helper for constructing command arguments from structured values.
type
Args
[]
interface
{}
// Add returns the result of appending value to args.
func
(
args
Args
)
Add
(
value
...
interface
{})
Args
{
return
append
(
args
,
value
...
)
}
// AddFlat returns the result of appending the flattened value of v to args.
//
// Maps are flattened by appending the alternating keys and map values to args.
//
// Slices are flattened by appending the slice elements to args.
//
// Structs are flattened by appending the alternating names and values of
// exported fields to args. If v is a nil struct pointer, then nothing is
// appended. The 'redis' field tag overrides struct field names. See ScanStruct
// for more information on the use of the 'redis' field tag.
//
// Other types are appended to args as is.
func
(
args
Args
)
AddFlat
(
v
interface
{})
Args
{
rv
:=
reflect
.
ValueOf
(
v
)
switch
rv
.
Kind
()
{
case
reflect
.
Struct
:
args
=
flattenStruct
(
args
,
rv
)
case
reflect
.
Slice
:
for
i
:=
0
;
i
<
rv
.
Len
();
i
++
{
args
=
append
(
args
,
rv
.
Index
(
i
)
.
Interface
())
}
case
reflect
.
Map
:
for
_
,
k
:=
range
rv
.
MapKeys
()
{
args
=
append
(
args
,
k
.
Interface
(),
rv
.
MapIndex
(
k
)
.
Interface
())
}
case
reflect
.
Ptr
:
if
rv
.
Type
()
.
Elem
()
.
Kind
()
==
reflect
.
Struct
{
if
!
rv
.
IsNil
()
{
args
=
flattenStruct
(
args
,
rv
.
Elem
())
}
}
else
{
args
=
append
(
args
,
v
)
}
default
:
args
=
append
(
args
,
v
)
}
return
args
}
func
flattenStruct
(
args
Args
,
v
reflect
.
Value
)
Args
{
ss
:=
structSpecForType
(
v
.
Type
())
for
_
,
fs
:=
range
ss
.
l
{
fv
:=
v
.
FieldByIndex
(
fs
.
index
)
if
fs
.
omitEmpty
{
var
empty
=
false
switch
fv
.
Kind
()
{
case
reflect
.
Array
,
reflect
.
Map
,
reflect
.
Slice
,
reflect
.
String
:
empty
=
fv
.
Len
()
==
0
case
reflect
.
Bool
:
empty
=
!
fv
.
Bool
()
case
reflect
.
Int
,
reflect
.
Int8
,
reflect
.
Int16
,
reflect
.
Int32
,
reflect
.
Int64
:
empty
=
fv
.
Int
()
==
0
case
reflect
.
Uint
,
reflect
.
Uint8
,
reflect
.
Uint16
,
reflect
.
Uint32
,
reflect
.
Uint64
,
reflect
.
Uintptr
:
empty
=
fv
.
Uint
()
==
0
case
reflect
.
Float32
,
reflect
.
Float64
:
empty
=
fv
.
Float
()
==
0
case
reflect
.
Interface
,
reflect
.
Ptr
:
empty
=
fv
.
IsNil
()
}
if
empty
{
continue
}
}
args
=
append
(
args
,
fs
.
name
,
fv
.
Interface
())
}
return
args
}
This diff is collapsed.
Click to expand it.
vendor/github.com/gomodule/redigo/redis/script.go
deleted
100644 → 0
View file @
ef59b4de
// Copyright 2012 Gary Burd
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package
redis
import
(
"crypto/sha1"
"encoding/hex"
"io"
"strings"
)
// Script encapsulates the source, hash and key count for a Lua script. See
// http://redis.io/commands/eval for information on scripts in Redis.
type
Script
struct
{
keyCount
int
src
string
hash
string
}
// NewScript returns a new script object. If keyCount is greater than or equal
// to zero, then the count is automatically inserted in the EVAL command
// argument list. If keyCount is less than zero, then the application supplies
// the count as the first value in the keysAndArgs argument to the Do, Send and
// SendHash methods.
func
NewScript
(
keyCount
int
,
src
string
)
*
Script
{
h
:=
sha1
.
New
()
io
.
WriteString
(
h
,
src
)
return
&
Script
{
keyCount
,
src
,
hex
.
EncodeToString
(
h
.
Sum
(
nil
))}
}
func
(
s
*
Script
)
args
(
spec
string
,
keysAndArgs
[]
interface
{})
[]
interface
{}
{
var
args
[]
interface
{}
if
s
.
keyCount
<
0
{
args
=
make
([]
interface
{},
1
+
len
(
keysAndArgs
))
args
[
0
]
=
spec
copy
(
args
[
1
:
],
keysAndArgs
)
}
else
{
args
=
make
([]
interface
{},
2
+
len
(
keysAndArgs
))
args
[
0
]
=
spec
args
[
1
]
=
s
.
keyCount
copy
(
args
[
2
:
],
keysAndArgs
)
}
return
args
}
// Hash returns the script hash.
func
(
s
*
Script
)
Hash
()
string
{
return
s
.
hash
}
// Do evaluates the script. Under the covers, Do optimistically evaluates the
// script using the EVALSHA command. If the command fails because the script is
// not loaded, then Do evaluates the script using the EVAL command (thus
// causing the script to load).
func
(
s
*
Script
)
Do
(
c
Conn
,
keysAndArgs
...
interface
{})
(
interface
{},
error
)
{
v
,
err
:=
c
.
Do
(
"EVALSHA"
,
s
.
args
(
s
.
hash
,
keysAndArgs
)
...
)
if
e
,
ok
:=
err
.
(
Error
);
ok
&&
strings
.
HasPrefix
(
string
(
e
),
"NOSCRIPT "
)
{
v
,
err
=
c
.
Do
(
"EVAL"
,
s
.
args
(
s
.
src
,
keysAndArgs
)
...
)
}
return
v
,
err
}
// SendHash evaluates the script without waiting for the reply. The script is
// evaluated with the EVALSHA command. The application must ensure that the
// script is loaded by a previous call to Send, Do or Load methods.
func
(
s
*
Script
)
SendHash
(
c
Conn
,
keysAndArgs
...
interface
{})
error
{
return
c
.
Send
(
"EVALSHA"
,
s
.
args
(
s
.
hash
,
keysAndArgs
)
...
)
}
// Send evaluates the script without waiting for the reply.
func
(
s
*
Script
)
Send
(
c
Conn
,
keysAndArgs
...
interface
{})
error
{
return
c
.
Send
(
"EVAL"
,
s
.
args
(
s
.
src
,
keysAndArgs
)
...
)
}
// Load loads the script without evaluating it.
func
(
s
*
Script
)
Load
(
c
Conn
)
error
{
_
,
err
:=
c
.
Do
(
"SCRIPT"
,
"LOAD"
,
s
.
src
)
return
err
}
This diff is collapsed.
Click to expand it.
vendor/github.com/mitchellh/colorstring/.travis.yml
deleted
100644 → 0
View file @
ef59b4de
language
:
go
go
:
-
1.0
-
1.1
-
1.2
-
1.3
-
tip
script
:
-
go test
matrix
:
allow_failures
:
-
go
:
tip
This diff is collapsed.
Click to expand it.
vendor/github.com/mitchellh/colorstring/LICENSE
deleted
100644 → 0
View file @
ef59b4de
The MIT License (MIT)
Copyright (c) 2014 Mitchell Hashimoto
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.
This diff is collapsed.
Click to expand it.
vendor/github.com/mitchellh/colorstring/README.md
deleted
100644 → 0
View file @
ef59b4de
# colorstring [](https://travis-ci.org/mitchellh/colorstring)
colorstring is a
[
Go
](
http://www.golang.org
)
library for outputting colored
strings to a console using a simple inline syntax in your string to specify
the color to print as.
For example, the string
`[blue]hello [red]world`
would output the text
"hello world" in two colors. The API of colorstring allows for easily disabling
colors, adding aliases, etc.
## Installation
Standard
`go get`
:
```
$ go get github.com/mitchellh/colorstring
```
## Usage & Example
For usage and examples see the
[
Godoc
](
http://godoc.org/github.com/mitchellh/colorstring
)
.
Usage is easy enough:
```
go
colorstring
.
Println
(
"[blue]Hello [red]World!"
)
```
Additionally, the
`Colorize`
struct can be used to set options such as
custom colors, color disabling, etc.
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment