mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-26 16:15:30 +08:00
Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ccb997ed8 | ||
|
|
01c92a6bc5 | ||
|
|
c9a2a60e28 | ||
|
|
b0739d63c0 | ||
|
|
c22f84cb5f | ||
|
|
60450bab02 | ||
|
|
3e8cec5c78 | ||
|
|
74ee163761 | ||
|
|
ea4f680052 | ||
|
|
58cdba2c5d | ||
|
|
a2fbc14c70 | ||
|
|
158df8c270 | ||
|
|
30ec236a87 | ||
|
|
ac3653b3f9 | ||
|
|
8520db4fd9 | ||
|
|
14141fed62 | ||
|
|
5d86cc2f20 | ||
|
|
8a6e4b7580 | ||
|
|
453f949638 | ||
|
|
75a330184d | ||
|
|
546fcd8bab | ||
|
|
3022f93b6d | ||
|
|
8ffc392c66 | ||
|
|
ae7d85dadf | ||
|
|
e89268ac37 | ||
|
|
aaa3623404 | ||
|
|
8998f16054 | ||
|
|
94417be018 | ||
|
|
f300408fc0 | ||
|
|
aaa39e17a3 | ||
|
|
73906f996d | ||
|
|
73417f54db | ||
|
|
491213afb8 | ||
|
|
edf743cd72 | ||
|
|
78a88be787 | ||
|
|
9f6a574f97 | ||
|
|
ea01cc78f0 | ||
|
|
a87978568a | ||
|
|
14cecb9b31 | ||
|
|
0ce54100a4 | ||
|
|
d28ac35ff7 | ||
|
|
a5962f677f | ||
|
|
8478474f7f | ||
|
|
df5ae9507f | ||
|
|
faf4d7e3bb | ||
|
|
f64fe5eb5e | ||
|
|
97d889103a | ||
|
|
9a44310d00 | ||
|
|
06eeef2cf3 | ||
|
|
9adc7d4cb9 | ||
|
|
006f78c3d5 | ||
|
|
64a8e65f4a | ||
|
|
8fd1e76d29 | ||
|
|
0466af5e49 | ||
|
|
7405d7f506 | ||
|
|
afd9ff889e | ||
|
|
7e087de6e6 | ||
|
|
5aded99df5 | ||
|
|
08fb980ad2 | ||
|
|
b94d7aa532 | ||
|
|
ee630b8b57 | ||
|
|
bd82b7d8de | ||
|
|
3d729c77a6 | ||
|
|
e944b59bb3 | ||
|
|
54b5e3f4b2 | ||
|
|
b913229028 | ||
|
|
9963ffb1c1 | ||
|
|
8cb6490724 | ||
|
|
05e37ee20f | ||
|
|
d88da4cc88 | ||
|
|
425430f67c | ||
|
|
4e0d91f6c0 | ||
|
|
8584351b6d | ||
|
|
b19c5223a9 | ||
|
|
99a2d95433 | ||
|
|
9db222bf5b | ||
|
|
ac648d08cb | ||
|
|
6df7fa619c | ||
|
|
bbb4ce586f |
102
CONTRIBUTING.md
Normal file
102
CONTRIBUTING.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Welcome to go-zero!
|
||||||
|
|
||||||
|
- [Before you get started](#before-you-get-started)
|
||||||
|
- [Code of Conduct](#code-of-conduct)
|
||||||
|
- [Community Expectations](#community-expectations)
|
||||||
|
- [Getting started](#getting-started)
|
||||||
|
- [Your First Contribution](#your-first-contribution)
|
||||||
|
- [Find something to work on](#find-something-to-work-on)
|
||||||
|
- [Find a good first topic](#find-a-good-first-topic)
|
||||||
|
- [Work on an Issue](#work-on-an-issue)
|
||||||
|
- [File an Issue](#file-an-issue)
|
||||||
|
- [Contributor Workflow](#contributor-workflow)
|
||||||
|
- [Creating Pull Requests](#creating-pull-requests)
|
||||||
|
- [Code Review](#code-review)
|
||||||
|
- [Testing](#testing)
|
||||||
|
|
||||||
|
# Before you get started
|
||||||
|
|
||||||
|
## Code of Conduct
|
||||||
|
|
||||||
|
Please make sure to read and observe our [Code of Conduct](/code-of-conduct.md).
|
||||||
|
|
||||||
|
## Community Expectations
|
||||||
|
|
||||||
|
go-zero is a community project driven by its community which strives to promote a healthy, friendly and productive environment.
|
||||||
|
go-zero is a web and rpc framework written in Go. It's born to ensure the stability of the busy sites with resilient design. Builtin goctl greatly improves the development productivity.
|
||||||
|
|
||||||
|
# Getting started
|
||||||
|
|
||||||
|
- Fork the repository on GitHub.
|
||||||
|
- Make your changes on your fork repository.
|
||||||
|
- Submit a PR.
|
||||||
|
|
||||||
|
|
||||||
|
# Your First Contribution
|
||||||
|
|
||||||
|
We will help you to contribute in different areas like filing issues, developing features, fixing critical bugs and
|
||||||
|
getting your work reviewed and merged.
|
||||||
|
|
||||||
|
If you have questions about the development process,
|
||||||
|
feel free to [file an issue](https://github.com/tal-tech/go-zero/issues/new/choose).
|
||||||
|
|
||||||
|
## Find something to work on
|
||||||
|
|
||||||
|
We are always in need of help, be it fixing documentation, reporting bugs or writing some code.
|
||||||
|
Look at places where you feel best coding practices aren't followed, code refactoring is needed or tests are missing.
|
||||||
|
Here is how you get started.
|
||||||
|
|
||||||
|
### Find a good first topic
|
||||||
|
|
||||||
|
[go-zero](https://github.com/tal-tech/go-zero) has beginner-friendly issues that provide a good first issue.
|
||||||
|
For example, [go-zero](https://github.com/tal-tech/go-zero) has
|
||||||
|
[help wanted](https://github.com/tal-tech/go-zero/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) and
|
||||||
|
[good first issue](https://github.com/tal-tech/go-zero/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
|
||||||
|
labels for issues that should not need deep knowledge of the system.
|
||||||
|
We can help new contributors who wish to work on such issues.
|
||||||
|
|
||||||
|
Another good way to contribute is to find a documentation improvement, such as a missing/broken link.
|
||||||
|
Please see [Contributing](#contributing) below for the workflow.
|
||||||
|
|
||||||
|
#### Work on an issue
|
||||||
|
|
||||||
|
When you are willing to take on an issue, just reply on the issue. The maintainer will assign it to you.
|
||||||
|
|
||||||
|
### File an Issue
|
||||||
|
|
||||||
|
While we encourage everyone to contribute code, it is also appreciated when someone reports an issue.
|
||||||
|
|
||||||
|
Please follow the prompted submission guidelines while opening an issue.
|
||||||
|
|
||||||
|
# Contributor Workflow
|
||||||
|
|
||||||
|
Please do not ever hesitate to ask a question or send a pull request.
|
||||||
|
|
||||||
|
This is a rough outline of what a contributor's workflow looks like:
|
||||||
|
|
||||||
|
- Create a topic branch from where to base the contribution. This is usually master.
|
||||||
|
- Make commits of logical units.
|
||||||
|
- Push changes in a topic branch to a personal fork of the repository.
|
||||||
|
- Submit a pull request to [go-zero](https://github.com/tal-tech/go-zero).
|
||||||
|
|
||||||
|
## Creating Pull Requests
|
||||||
|
|
||||||
|
Pull requests are often called simply "PR".
|
||||||
|
go-zero generally follows the standard [github pull request](https://help.github.com/articles/about-pull-requests/) process.
|
||||||
|
To submit a proposed change, please develop the code/fix and add new test cases.
|
||||||
|
After that, run these local verifications before submitting pull request to predict the pass or
|
||||||
|
fail of continuous integration.
|
||||||
|
|
||||||
|
* Format the code with `gofmt`
|
||||||
|
* Run the test with data race enabled `go test -race ./…`
|
||||||
|
|
||||||
|
## Code Review
|
||||||
|
|
||||||
|
To make it easier for your PR to receive reviews, consider the reviewers will need you to:
|
||||||
|
|
||||||
|
* follow [good coding guidelines](https://github.com/golang/go/wiki/CodeReviewComments).
|
||||||
|
* write [good commit messages](https://chris.beams.io/posts/git-commit/).
|
||||||
|
* break large changes into a logical series of smaller patches which individually make easily understandable changes, and in aggregate solve a broader issue.
|
||||||
|
|
||||||
21
ROADMAP.md
Normal file
21
ROADMAP.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# go-zero Roadmap
|
||||||
|
|
||||||
|
This document defines a high level roadmap for go-zero development and upcoming releases.
|
||||||
|
Community and contributor involvement is vital for successfully implementing all desired items for each release.
|
||||||
|
We hope that the items listed below will inspire further engagement from the community to keep go-zero progressing and shipping exciting and valuable features.
|
||||||
|
|
||||||
|
## 2021 Q2
|
||||||
|
- Support TLS in redis connections
|
||||||
|
- Support service discovery through K8S watch api
|
||||||
|
- Log full sql statements for easier sql problem solving
|
||||||
|
|
||||||
|
## 2021 Q3
|
||||||
|
- Support `goctl mock` command to start a mocking server with given `.api` file
|
||||||
|
- Adapt builtin tracing mechanism to opentracing solutions
|
||||||
|
- Support `goctl model pg` to support PostgreSQL code generation
|
||||||
|
|
||||||
|
## 2021 Q4
|
||||||
|
- Support `goctl doctor` command to report potential issues for given service
|
||||||
|
- Support `context` in redis related methods for timeout and tracing
|
||||||
|
- Support `context` in sql related methods for timeout and tracing
|
||||||
|
- Support `context` in mongodb related methods for timeout and tracing
|
||||||
76
code-of-conduct.md
Normal file
76
code-of-conduct.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to make participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||||
|
level of experience, education, socio-economic status, nationality, personal
|
||||||
|
appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all project spaces, and it also applies when
|
||||||
|
an individual is representing the project or its community in public spaces.
|
||||||
|
Examples of representing a project or community include using an official
|
||||||
|
project e-mail address, posting via an official social media account, or acting
|
||||||
|
as an appointed representative at an online or offline event. Representation of
|
||||||
|
a project may be further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see
|
||||||
|
https://www.contributor-covenant.org/faq
|
||||||
@@ -122,8 +122,7 @@ func BenchmarkGoogleBreaker(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockedPromise struct {
|
type mockedPromise struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (m *mockedPromise) Accept() {
|
func (m *mockedPromise) Accept() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ func (b *googleBreaker) markFailure() {
|
|||||||
b.stat.Add(0)
|
b.stat.Add(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *googleBreaker) history() (accepts int64, total int64) {
|
func (b *googleBreaker) history() (accepts, total int64) {
|
||||||
b.stat.Reduce(func(b *collection.Bucket) {
|
b.stat.Reduce(func(b *collection.Bucket) {
|
||||||
accepts += int64(b.Sum)
|
accepts += int64(b.Sum)
|
||||||
total += b.Count
|
total += b.Count
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ func TestAesEcbBase64(t *testing.T) {
|
|||||||
// more than 32 chars
|
// more than 32 chars
|
||||||
badKey2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
badKey2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||||
)
|
)
|
||||||
var key = []byte("q4t7w!z%C*F-JaNdRgUjXn2r5u8x/A?D")
|
key := []byte("q4t7w!z%C*F-JaNdRgUjXn2r5u8x/A?D")
|
||||||
b64Key := base64.StdEncoding.EncodeToString(key)
|
b64Key := base64.StdEncoding.EncodeToString(key)
|
||||||
b64Val := base64.StdEncoding.EncodeToString([]byte(val))
|
b64Val := base64.StdEncoding.EncodeToString([]byte(val))
|
||||||
_, err := EcbEncryptBase64(badKey1, val)
|
_, err := EcbEncryptBase64(badKey1, val)
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ func TestRollingWindowBucketTimeBoundary(t *testing.T) {
|
|||||||
func TestRollingWindowDataRace(t *testing.T) {
|
func TestRollingWindowDataRace(t *testing.T) {
|
||||||
const size = 3
|
const size = 3
|
||||||
r := NewRollingWindow(size, duration)
|
r := NewRollingWindow(size, duration)
|
||||||
var stop = make(chan bool)
|
stop := make(chan bool)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ func (tw *TimingWheel) drainAll(fn func(key, value interface{})) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tw *TimingWheel) getPositionAndCircle(d time.Duration) (pos int, circle int) {
|
func (tw *TimingWheel) getPositionAndCircle(d time.Duration) (pos, circle int) {
|
||||||
steps := int(d / tw.interval)
|
steps := int(d / tw.interval)
|
||||||
pos = (tw.tickedPos + steps) % tw.numSlots
|
pos = (tw.tickedPos + steps) % tw.numSlots
|
||||||
circle = (steps - 1) / tw.numSlots
|
circle = (steps - 1) / tw.numSlots
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func LoadConfig(file string, v interface{}, opts ...Option) error {
|
|||||||
|
|
||||||
loader, ok := loaders[path.Ext(file)]
|
loader, ok := loaders[path.Ext(file)]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("unrecoginized file type: %s", file)
|
return fmt.Errorf("unrecognized file type: %s", file)
|
||||||
}
|
}
|
||||||
|
|
||||||
var opt options
|
var opt options
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
package contextx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ShrinkDeadline returns a new Context with proper deadline base on the given ctx and timeout.
|
|
||||||
// And returns a cancel function as well.
|
|
||||||
func ShrinkDeadline(ctx context.Context, timeout time.Duration) (context.Context, func()) {
|
|
||||||
if deadline, ok := ctx.Deadline(); ok {
|
|
||||||
leftTime := time.Until(deadline)
|
|
||||||
if leftTime < timeout {
|
|
||||||
timeout = leftTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return context.WithDeadline(ctx, time.Now().Add(timeout))
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
package contextx
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestShrinkDeadlineLess(t *testing.T) {
|
|
||||||
deadline := time.Now().Add(time.Second)
|
|
||||||
ctx, cancel := context.WithDeadline(context.Background(), deadline)
|
|
||||||
defer cancel()
|
|
||||||
ctx, cancel = ShrinkDeadline(ctx, time.Minute)
|
|
||||||
defer cancel()
|
|
||||||
dl, ok := ctx.Deadline()
|
|
||||||
assert.True(t, ok)
|
|
||||||
assert.Equal(t, deadline, dl)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestShrinkDeadlineMore(t *testing.T) {
|
|
||||||
deadline := time.Now().Add(time.Minute)
|
|
||||||
ctx, cancel := context.WithDeadline(context.Background(), deadline)
|
|
||||||
defer cancel()
|
|
||||||
ctx, cancel = ShrinkDeadline(ctx, time.Second)
|
|
||||||
defer cancel()
|
|
||||||
dl, ok := ctx.Deadline()
|
|
||||||
assert.True(t, ok)
|
|
||||||
assert.True(t, dl.Before(deadline))
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ package internal
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"go.etcd.io/etcd/clientv3"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,11 @@ package internal
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
gomock "github.com/golang/mock/gomock"
|
|
||||||
clientv3 "go.etcd.io/etcd/clientv3"
|
|
||||||
grpc "google.golang.org/grpc"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
|
gomock "github.com/golang/mock/gomock"
|
||||||
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockEtcdClient is a mock of EtcdClient interface
|
// MockEtcdClient is a mock of EtcdClient interface
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ package internal
|
|||||||
|
|
||||||
// Listener interface wraps the OnUpdate method.
|
// Listener interface wraps the OnUpdate method.
|
||||||
type Listener interface {
|
type Listener interface {
|
||||||
OnUpdate(keys []string, values []string, newKey string)
|
OnUpdate(keys, values []string, newKey string)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import (
|
|||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
"github.com/tal-tech/go-zero/core/syncx"
|
"github.com/tal-tech/go-zero/core/syncx"
|
||||||
"github.com/tal-tech/go-zero/core/threading"
|
"github.com/tal-tech/go-zero/core/threading"
|
||||||
"go.etcd.io/etcd/clientv3"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -260,26 +260,34 @@ func (c *cluster) reload(cli EtcdClient) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *cluster) watch(cli EtcdClient, key string) {
|
func (c *cluster) watch(cli EtcdClient, key string) {
|
||||||
|
for {
|
||||||
|
if c.watchStream(cli, key) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *cluster) watchStream(cli EtcdClient, key string) bool {
|
||||||
rch := cli.Watch(clientv3.WithRequireLeader(c.context(cli)), makeKeyPrefix(key), clientv3.WithPrefix())
|
rch := cli.Watch(clientv3.WithRequireLeader(c.context(cli)), makeKeyPrefix(key), clientv3.WithPrefix())
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case wresp, ok := <-rch:
|
case wresp, ok := <-rch:
|
||||||
if !ok {
|
if !ok {
|
||||||
logx.Error("etcd monitor chan has been closed")
|
logx.Error("etcd monitor chan has been closed")
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
if wresp.Canceled {
|
if wresp.Canceled {
|
||||||
logx.Error("etcd monitor chan has been canceled")
|
logx.Errorf("etcd monitor chan has been canceled, error: %v", wresp.Err())
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
if wresp.Err() != nil {
|
if wresp.Err() != nil {
|
||||||
logx.Error(fmt.Sprintf("etcd monitor chan error: %v", wresp.Err()))
|
logx.Error(fmt.Sprintf("etcd monitor chan error: %v", wresp.Err()))
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
c.handleWatchEvents(key, wresp.Events)
|
c.handleWatchEvents(key, wresp.Events)
|
||||||
case <-c.done:
|
case <-c.done:
|
||||||
return
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,11 @@ import (
|
|||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/tal-tech/go-zero/core/contextx"
|
"github.com/tal-tech/go-zero/core/contextx"
|
||||||
|
"github.com/tal-tech/go-zero/core/lang"
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
"github.com/tal-tech/go-zero/core/stringx"
|
"github.com/tal-tech/go-zero/core/stringx"
|
||||||
"go.etcd.io/etcd/clientv3"
|
"go.etcd.io/etcd/api/v3/mvccpb"
|
||||||
"go.etcd.io/etcd/mvcc/mvccpb"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var mockLock sync.Mutex
|
var mockLock sync.Mutex
|
||||||
@@ -202,11 +203,13 @@ func TestClusterWatch_RespFailures(t *testing.T) {
|
|||||||
restore := setMockClient(cli)
|
restore := setMockClient(cli)
|
||||||
defer restore()
|
defer restore()
|
||||||
ch := make(chan clientv3.WatchResponse)
|
ch := make(chan clientv3.WatchResponse)
|
||||||
cli.EXPECT().Watch(gomock.Any(), "any/", gomock.Any()).Return(ch)
|
cli.EXPECT().Watch(gomock.Any(), "any/", gomock.Any()).Return(ch).AnyTimes()
|
||||||
cli.EXPECT().Ctx().Return(context.Background()).AnyTimes()
|
cli.EXPECT().Ctx().Return(context.Background()).AnyTimes()
|
||||||
c := new(cluster)
|
c := new(cluster)
|
||||||
|
c.done = make(chan lang.PlaceholderType)
|
||||||
go func() {
|
go func() {
|
||||||
ch <- resp
|
ch <- resp
|
||||||
|
close(c.done)
|
||||||
}()
|
}()
|
||||||
c.watch(cli, "any")
|
c.watch(cli, "any")
|
||||||
})
|
})
|
||||||
@@ -220,11 +223,13 @@ func TestClusterWatch_CloseChan(t *testing.T) {
|
|||||||
restore := setMockClient(cli)
|
restore := setMockClient(cli)
|
||||||
defer restore()
|
defer restore()
|
||||||
ch := make(chan clientv3.WatchResponse)
|
ch := make(chan clientv3.WatchResponse)
|
||||||
cli.EXPECT().Watch(gomock.Any(), "any/", gomock.Any()).Return(ch)
|
cli.EXPECT().Watch(gomock.Any(), "any/", gomock.Any()).Return(ch).AnyTimes()
|
||||||
cli.EXPECT().Ctx().Return(context.Background()).AnyTimes()
|
cli.EXPECT().Ctx().Return(context.Background()).AnyTimes()
|
||||||
c := new(cluster)
|
c := new(cluster)
|
||||||
|
c.done = make(chan lang.PlaceholderType)
|
||||||
go func() {
|
go func() {
|
||||||
close(ch)
|
close(ch)
|
||||||
|
close(c.done)
|
||||||
}()
|
}()
|
||||||
c.watch(cli, "any")
|
c.watch(cli, "any")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/tal-tech/go-zero/core/proc"
|
"github.com/tal-tech/go-zero/core/proc"
|
||||||
"github.com/tal-tech/go-zero/core/syncx"
|
"github.com/tal-tech/go-zero/core/syncx"
|
||||||
"github.com/tal-tech/go-zero/core/threading"
|
"github.com/tal-tech/go-zero/core/threading"
|
||||||
"go.etcd.io/etcd/clientv3"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"github.com/tal-tech/go-zero/core/discov/internal"
|
"github.com/tal-tech/go-zero/core/discov/internal"
|
||||||
"github.com/tal-tech/go-zero/core/lang"
|
"github.com/tal-tech/go-zero/core/lang"
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
"go.etcd.io/etcd/clientv3"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestChain(t *testing.T) {
|
func TestChain(t *testing.T) {
|
||||||
var errDummy = errors.New("dummy")
|
errDummy := errors.New("dummy")
|
||||||
assert.Nil(t, Chain(func() error {
|
assert.Nil(t, Chain(func() error {
|
||||||
return nil
|
return nil
|
||||||
}, func() error {
|
}, func() error {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ type (
|
|||||||
|
|
||||||
// DoWithRetry runs fn, and retries if failed. Default to retry 3 times.
|
// DoWithRetry runs fn, and retries if failed. Default to retry 3 times.
|
||||||
func DoWithRetry(fn func() error, opts ...RetryOption) error {
|
func DoWithRetry(fn func() error, opts ...RetryOption) error {
|
||||||
var options = newRetryOptions()
|
options := newRetryOptions()
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt(options)
|
opt(options)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func TestRetry(t *testing.T) {
|
|||||||
return errors.New("any")
|
return errors.New("any")
|
||||||
}))
|
}))
|
||||||
|
|
||||||
var total = 2 * defaultRetryTimes
|
total := 2 * defaultRetryTimes
|
||||||
times = 0
|
times = 0
|
||||||
assert.Nil(t, DoWithRetry(func() error {
|
assert.Nil(t, DoWithRetry(func() error {
|
||||||
times++
|
times++
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ type (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Concat returns a concatenated Stream.
|
||||||
|
func Concat(s Stream, others ...Stream) Stream {
|
||||||
|
return s.Concat(others...)
|
||||||
|
}
|
||||||
|
|
||||||
// From constructs a Stream from the given GenerateFunc.
|
// From constructs a Stream from the given GenerateFunc.
|
||||||
func From(generate GenerateFunc) Stream {
|
func From(generate GenerateFunc) Stream {
|
||||||
source := make(chan interface{})
|
source := make(chan interface{})
|
||||||
@@ -79,16 +84,42 @@ func Range(source <-chan interface{}) Stream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AllMach returns whether all elements of this stream match the provided predicate.
|
||||||
|
// May not evaluate the predicate on all elements if not necessary for determining the result.
|
||||||
|
// If the stream is empty then true is returned and the predicate is not evaluated.
|
||||||
|
func (s Stream) AllMach(predicate func(item interface{}) bool) bool {
|
||||||
|
for item := range s.source {
|
||||||
|
if !predicate(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnyMach returns whether any elements of this stream match the provided predicate.
|
||||||
|
// May not evaluate the predicate on all elements if not necessary for determining the result.
|
||||||
|
// If the stream is empty then false is returned and the predicate is not evaluated.
|
||||||
|
func (s Stream) AnyMach(predicate func(item interface{}) bool) bool {
|
||||||
|
for item := range s.source {
|
||||||
|
if predicate(item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Buffer buffers the items into a queue with size n.
|
// Buffer buffers the items into a queue with size n.
|
||||||
// It can balance the producer and the consumer if their processing throughput don't match.
|
// It can balance the producer and the consumer if their processing throughput don't match.
|
||||||
func (p Stream) Buffer(n int) Stream {
|
func (s Stream) Buffer(n int) Stream {
|
||||||
if n < 0 {
|
if n < 0 {
|
||||||
n = 0
|
n = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
source := make(chan interface{}, n)
|
source := make(chan interface{}, n)
|
||||||
go func() {
|
go func() {
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
source <- item
|
source <- item
|
||||||
}
|
}
|
||||||
close(source)
|
close(source)
|
||||||
@@ -97,23 +128,51 @@ func (p Stream) Buffer(n int) Stream {
|
|||||||
return Range(source)
|
return Range(source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Concat returns a Stream that concatenated other streams
|
||||||
|
func (s Stream) Concat(others ...Stream) Stream {
|
||||||
|
source := make(chan interface{})
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
group := threading.NewRoutineGroup()
|
||||||
|
group.Run(func() {
|
||||||
|
for item := range s.source {
|
||||||
|
source <- item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, each := range others {
|
||||||
|
each := each
|
||||||
|
group.Run(func() {
|
||||||
|
for item := range each.source {
|
||||||
|
source <- item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
group.Wait()
|
||||||
|
close(source)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return Range(source)
|
||||||
|
}
|
||||||
|
|
||||||
// Count counts the number of elements in the result.
|
// Count counts the number of elements in the result.
|
||||||
func (p Stream) Count() (count int) {
|
func (s Stream) Count() (count int) {
|
||||||
for range p.source {
|
for range s.source {
|
||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Distinct removes the duplicated items base on the given KeyFunc.
|
// Distinct removes the duplicated items base on the given KeyFunc.
|
||||||
func (p Stream) Distinct(fn KeyFunc) Stream {
|
func (s Stream) Distinct(fn KeyFunc) Stream {
|
||||||
source := make(chan interface{})
|
source := make(chan interface{})
|
||||||
|
|
||||||
threading.GoSafe(func() {
|
threading.GoSafe(func() {
|
||||||
defer close(source)
|
defer close(source)
|
||||||
|
|
||||||
keys := make(map[interface{}]lang.PlaceholderType)
|
keys := make(map[interface{}]lang.PlaceholderType)
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
key := fn(item)
|
key := fn(item)
|
||||||
if _, ok := keys[key]; !ok {
|
if _, ok := keys[key]; !ok {
|
||||||
source <- item
|
source <- item
|
||||||
@@ -126,14 +185,14 @@ func (p Stream) Distinct(fn KeyFunc) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Done waits all upstreaming operations to be done.
|
// Done waits all upstreaming operations to be done.
|
||||||
func (p Stream) Done() {
|
func (s Stream) Done() {
|
||||||
for range p.source {
|
for range s.source {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter filters the items by the given FilterFunc.
|
// Filter filters the items by the given FilterFunc.
|
||||||
func (p Stream) Filter(fn FilterFunc, opts ...Option) Stream {
|
func (s Stream) Filter(fn FilterFunc, opts ...Option) Stream {
|
||||||
return p.Walk(func(item interface{}, pipe chan<- interface{}) {
|
return s.Walk(func(item interface{}, pipe chan<- interface{}) {
|
||||||
if fn(item) {
|
if fn(item) {
|
||||||
pipe <- item
|
pipe <- item
|
||||||
}
|
}
|
||||||
@@ -141,21 +200,21 @@ func (p Stream) Filter(fn FilterFunc, opts ...Option) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ForAll handles the streaming elements from the source and no later streams.
|
// ForAll handles the streaming elements from the source and no later streams.
|
||||||
func (p Stream) ForAll(fn ForAllFunc) {
|
func (s Stream) ForAll(fn ForAllFunc) {
|
||||||
fn(p.source)
|
fn(s.source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForEach seals the Stream with the ForEachFunc on each item, no successive operations.
|
// ForEach seals the Stream with the ForEachFunc on each item, no successive operations.
|
||||||
func (p Stream) ForEach(fn ForEachFunc) {
|
func (s Stream) ForEach(fn ForEachFunc) {
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
fn(item)
|
fn(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Group groups the elements into different groups based on their keys.
|
// Group groups the elements into different groups based on their keys.
|
||||||
func (p Stream) Group(fn KeyFunc) Stream {
|
func (s Stream) Group(fn KeyFunc) Stream {
|
||||||
groups := make(map[interface{}][]interface{})
|
groups := make(map[interface{}][]interface{})
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
key := fn(item)
|
key := fn(item)
|
||||||
groups[key] = append(groups[key], item)
|
groups[key] = append(groups[key], item)
|
||||||
}
|
}
|
||||||
@@ -172,7 +231,7 @@ func (p Stream) Group(fn KeyFunc) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Head returns the first n elements in p.
|
// Head returns the first n elements in p.
|
||||||
func (p Stream) Head(n int64) Stream {
|
func (s Stream) Head(n int64) Stream {
|
||||||
if n < 1 {
|
if n < 1 {
|
||||||
panic("n must be greater than 0")
|
panic("n must be greater than 0")
|
||||||
}
|
}
|
||||||
@@ -180,7 +239,7 @@ func (p Stream) Head(n int64) Stream {
|
|||||||
source := make(chan interface{})
|
source := make(chan interface{})
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
n--
|
n--
|
||||||
if n >= 0 {
|
if n >= 0 {
|
||||||
source <- item
|
source <- item
|
||||||
@@ -201,16 +260,16 @@ func (p Stream) Head(n int64) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Map converts each item to another corresponding item, which means it's a 1:1 model.
|
// Map converts each item to another corresponding item, which means it's a 1:1 model.
|
||||||
func (p Stream) Map(fn MapFunc, opts ...Option) Stream {
|
func (s Stream) Map(fn MapFunc, opts ...Option) Stream {
|
||||||
return p.Walk(func(item interface{}, pipe chan<- interface{}) {
|
return s.Walk(func(item interface{}, pipe chan<- interface{}) {
|
||||||
pipe <- fn(item)
|
pipe <- fn(item)
|
||||||
}, opts...)
|
}, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge merges all the items into a slice and generates a new stream.
|
// Merge merges all the items into a slice and generates a new stream.
|
||||||
func (p Stream) Merge() Stream {
|
func (s Stream) Merge() Stream {
|
||||||
var items []interface{}
|
var items []interface{}
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
items = append(items, item)
|
items = append(items, item)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,21 +281,21 @@ func (p Stream) Merge() Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parallel applies the given ParallelFunc to each item concurrently with given number of workers.
|
// Parallel applies the given ParallelFunc to each item concurrently with given number of workers.
|
||||||
func (p Stream) Parallel(fn ParallelFunc, opts ...Option) {
|
func (s Stream) Parallel(fn ParallelFunc, opts ...Option) {
|
||||||
p.Walk(func(item interface{}, pipe chan<- interface{}) {
|
s.Walk(func(item interface{}, pipe chan<- interface{}) {
|
||||||
fn(item)
|
fn(item)
|
||||||
}, opts...).Done()
|
}, opts...).Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reduce is a utility method to let the caller deal with the underlying channel.
|
// Reduce is a utility method to let the caller deal with the underlying channel.
|
||||||
func (p Stream) Reduce(fn ReduceFunc) (interface{}, error) {
|
func (s Stream) Reduce(fn ReduceFunc) (interface{}, error) {
|
||||||
return fn(p.source)
|
return fn(s.source)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reverse reverses the elements in the stream.
|
// Reverse reverses the elements in the stream.
|
||||||
func (p Stream) Reverse() Stream {
|
func (s Stream) Reverse() Stream {
|
||||||
var items []interface{}
|
var items []interface{}
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
items = append(items, item)
|
items = append(items, item)
|
||||||
}
|
}
|
||||||
// reverse, official method
|
// reverse, official method
|
||||||
@@ -248,10 +307,36 @@ func (p Stream) Reverse() Stream {
|
|||||||
return Just(items...)
|
return Just(items...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Skip returns a Stream that skips size elements.
|
||||||
|
func (s Stream) Skip(n int64) Stream {
|
||||||
|
if n < 0 {
|
||||||
|
panic("n must not be negative")
|
||||||
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
source := make(chan interface{})
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for item := range s.source {
|
||||||
|
n--
|
||||||
|
if n >= 0 {
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
source <- item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(source)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return Range(source)
|
||||||
|
}
|
||||||
|
|
||||||
// Sort sorts the items from the underlying source.
|
// Sort sorts the items from the underlying source.
|
||||||
func (p Stream) Sort(less LessFunc) Stream {
|
func (s Stream) Sort(less LessFunc) Stream {
|
||||||
var items []interface{}
|
var items []interface{}
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
items = append(items, item)
|
items = append(items, item)
|
||||||
}
|
}
|
||||||
sort.Slice(items, func(i, j int) bool {
|
sort.Slice(items, func(i, j int) bool {
|
||||||
@@ -263,7 +348,7 @@ func (p Stream) Sort(less LessFunc) Stream {
|
|||||||
|
|
||||||
// Split splits the elements into chunk with size up to n,
|
// Split splits the elements into chunk with size up to n,
|
||||||
// might be less than n on tailing elements.
|
// might be less than n on tailing elements.
|
||||||
func (p Stream) Split(n int) Stream {
|
func (s Stream) Split(n int) Stream {
|
||||||
if n < 1 {
|
if n < 1 {
|
||||||
panic("n should be greater than 0")
|
panic("n should be greater than 0")
|
||||||
}
|
}
|
||||||
@@ -271,7 +356,7 @@ func (p Stream) Split(n int) Stream {
|
|||||||
source := make(chan interface{})
|
source := make(chan interface{})
|
||||||
go func() {
|
go func() {
|
||||||
var chunk []interface{}
|
var chunk []interface{}
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
chunk = append(chunk, item)
|
chunk = append(chunk, item)
|
||||||
if len(chunk) == n {
|
if len(chunk) == n {
|
||||||
source <- chunk
|
source <- chunk
|
||||||
@@ -288,7 +373,7 @@ func (p Stream) Split(n int) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tail returns the last n elements in p.
|
// Tail returns the last n elements in p.
|
||||||
func (p Stream) Tail(n int64) Stream {
|
func (s Stream) Tail(n int64) Stream {
|
||||||
if n < 1 {
|
if n < 1 {
|
||||||
panic("n should be greater than 0")
|
panic("n should be greater than 0")
|
||||||
}
|
}
|
||||||
@@ -297,7 +382,7 @@ func (p Stream) Tail(n int64) Stream {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
ring := collection.NewRing(int(n))
|
ring := collection.NewRing(int(n))
|
||||||
for item := range p.source {
|
for item := range s.source {
|
||||||
ring.Add(item)
|
ring.Add(item)
|
||||||
}
|
}
|
||||||
for _, item := range ring.Take() {
|
for _, item := range ring.Take() {
|
||||||
@@ -310,16 +395,16 @@ func (p Stream) Tail(n int64) Stream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Walk lets the callers handle each item, the caller may write zero, one or more items base on the given item.
|
// Walk lets the callers handle each item, the caller may write zero, one or more items base on the given item.
|
||||||
func (p Stream) Walk(fn WalkFunc, opts ...Option) Stream {
|
func (s Stream) Walk(fn WalkFunc, opts ...Option) Stream {
|
||||||
option := buildOptions(opts...)
|
option := buildOptions(opts...)
|
||||||
if option.unlimitedWorkers {
|
if option.unlimitedWorkers {
|
||||||
return p.walkUnlimited(fn, option)
|
return s.walkUnlimited(fn, option)
|
||||||
}
|
}
|
||||||
|
|
||||||
return p.walkLimited(fn, option)
|
return s.walkLimited(fn, option)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Stream) walkLimited(fn WalkFunc, option *rxOptions) Stream {
|
func (s Stream) walkLimited(fn WalkFunc, option *rxOptions) Stream {
|
||||||
pipe := make(chan interface{}, option.workers)
|
pipe := make(chan interface{}, option.workers)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
@@ -328,7 +413,7 @@ func (p Stream) walkLimited(fn WalkFunc, option *rxOptions) Stream {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
pool <- lang.Placeholder
|
pool <- lang.Placeholder
|
||||||
item, ok := <-p.source
|
item, ok := <-s.source
|
||||||
if !ok {
|
if !ok {
|
||||||
<-pool
|
<-pool
|
||||||
break
|
break
|
||||||
@@ -353,14 +438,14 @@ func (p Stream) walkLimited(fn WalkFunc, option *rxOptions) Stream {
|
|||||||
return Range(pipe)
|
return Range(pipe)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Stream) walkUnlimited(fn WalkFunc, option *rxOptions) Stream {
|
func (s Stream) walkUnlimited(fn WalkFunc, option *rxOptions) Stream {
|
||||||
pipe := make(chan interface{}, defaultWorkers)
|
pipe := make(chan interface{}, defaultWorkers)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
for {
|
for {
|
||||||
item, ok := <-p.source
|
item, ok := <-s.source
|
||||||
if !ok {
|
if !ok {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ package fx
|
|||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"math/rand"
|
||||||
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -330,6 +333,29 @@ func TestWalk(t *testing.T) {
|
|||||||
assert.Equal(t, 9, result)
|
assert.Equal(t, 9, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkParallelMapReduce(b *testing.B) {
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
mapper := func(v interface{}) interface{} {
|
||||||
|
return v.(int64) * v.(int64)
|
||||||
|
}
|
||||||
|
reducer := func(input <-chan interface{}) (interface{}, error) {
|
||||||
|
var result int64
|
||||||
|
for v := range input {
|
||||||
|
result += v.(int64)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
From(func(input chan<- interface{}) {
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
for pb.Next() {
|
||||||
|
input <- int64(rand.Int())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).Map(mapper).Reduce(reducer)
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkMapReduce(b *testing.B) {
|
func BenchmarkMapReduce(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
|
||||||
@@ -343,12 +369,103 @@ func BenchmarkMapReduce(b *testing.B) {
|
|||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
b.ResetTimer()
|
||||||
|
From(func(input chan<- interface{}) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
input <- int64(rand.Int())
|
||||||
|
}
|
||||||
|
}).Map(mapper).Reduce(reducer)
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
func equal(t *testing.T, stream Stream, data []interface{}) {
|
||||||
From(func(input chan<- interface{}) {
|
items := make([]interface{}, 0)
|
||||||
for j := 0; j < 2; j++ {
|
for item := range stream.source {
|
||||||
input <- int64(j)
|
items = append(items, item)
|
||||||
}
|
}
|
||||||
}).Map(mapper).Reduce(reducer)
|
if !reflect.DeepEqual(items, data) {
|
||||||
|
t.Errorf(" %v, want %v", items, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func assetEqual(t *testing.T, except, data interface{}) {
|
||||||
|
if !reflect.DeepEqual(except, data) {
|
||||||
|
t.Errorf(" %v, want %v", data, except)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStream_AnyMach(t *testing.T) {
|
||||||
|
assetEqual(t, false, Just(1, 2, 3).AnyMach(func(item interface{}) bool {
|
||||||
|
return 4 == item.(int)
|
||||||
|
}))
|
||||||
|
assetEqual(t, false, Just(1, 2, 3).AnyMach(func(item interface{}) bool {
|
||||||
|
return 0 == item.(int)
|
||||||
|
}))
|
||||||
|
assetEqual(t, true, Just(1, 2, 3).AnyMach(func(item interface{}) bool {
|
||||||
|
return 2 == item.(int)
|
||||||
|
}))
|
||||||
|
assetEqual(t, true, Just(1, 2, 3).AnyMach(func(item interface{}) bool {
|
||||||
|
return 2 == item.(int)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStream_AllMach(t *testing.T) {
|
||||||
|
assetEqual(
|
||||||
|
t, true, Just(1, 2, 3).AllMach(func(item interface{}) bool {
|
||||||
|
return true
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
assetEqual(
|
||||||
|
t, false, Just(1, 2, 3).AllMach(func(item interface{}) bool {
|
||||||
|
return false
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
assetEqual(
|
||||||
|
t, false, Just(1, 2, 3).AllMach(func(item interface{}) bool {
|
||||||
|
return item.(int) == 1
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConcat(t *testing.T) {
|
||||||
|
a1 := []interface{}{1, 2, 3}
|
||||||
|
a2 := []interface{}{4, 5, 6}
|
||||||
|
s1 := Just(a1...)
|
||||||
|
s2 := Just(a2...)
|
||||||
|
stream := Concat(s1, s2)
|
||||||
|
var items []interface{}
|
||||||
|
for item := range stream.source {
|
||||||
|
items = append(items, item)
|
||||||
|
}
|
||||||
|
sort.Slice(items, func(i, j int) bool {
|
||||||
|
return items[i].(int) < items[j].(int)
|
||||||
|
})
|
||||||
|
ints := make([]interface{}, 0)
|
||||||
|
ints = append(ints, a1...)
|
||||||
|
ints = append(ints, a2...)
|
||||||
|
assetEqual(t, ints, items)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStream_Skip(t *testing.T) {
|
||||||
|
assetEqual(t, 3, Just(1, 2, 3, 4).Skip(1).Count())
|
||||||
|
assetEqual(t, 1, Just(1, 2, 3, 4).Skip(3).Count())
|
||||||
|
assetEqual(t, 4, Just(1, 2, 3, 4).Skip(0).Count())
|
||||||
|
equal(t, Just(1, 2, 3, 4).Skip(3), []interface{}{4})
|
||||||
|
assert.Panics(t, func() {
|
||||||
|
Just(1, 2, 3, 4).Skip(-1)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStream_Concat(t *testing.T) {
|
||||||
|
stream := Just(1).Concat(Just(2), Just(3))
|
||||||
|
var items []interface{}
|
||||||
|
for item := range stream.source {
|
||||||
|
items = append(items, item)
|
||||||
|
}
|
||||||
|
sort.Slice(items, func(i, j int) bool {
|
||||||
|
return items[i].(int) < items[j].(int)
|
||||||
|
})
|
||||||
|
assetEqual(t, []interface{}{1, 2, 3}, items)
|
||||||
|
|
||||||
|
just := Just(1)
|
||||||
|
equal(t, just.Concat(just), []interface{}{1})
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package fx
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tal-tech/go-zero/core/contextx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -23,7 +21,7 @@ func DoWithTimeout(fn func() error, timeout time.Duration, opts ...DoOption) err
|
|||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
parentCtx = opt()
|
parentCtx = opt()
|
||||||
}
|
}
|
||||||
ctx, cancel := contextx.ShrinkDeadline(parentCtx, timeout)
|
ctx, cancel := context.WithTimeout(parentCtx, timeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
// create channel with buffer size 1 to avoid goroutine leak
|
// create channel with buffer size 1 to avoid goroutine leak
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ func (h *ConsistentHash) AddWithReplicas(node interface{}, replicas int) {
|
|||||||
h.ring[hash] = append(h.ring[hash], node)
|
h.ring[hash] = append(h.ring[hash], node)
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Slice(h.keys, func(i int, j int) bool {
|
sort.Slice(h.keys, func(i, j int) bool {
|
||||||
return h.keys[i] < h.keys[j]
|
return h.keys[i] < h.keys[j]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ func (h *ConsistentHash) Remove(node interface{}) {
|
|||||||
index := sort.Search(len(h.keys), func(i int) bool {
|
index := sort.Search(len(h.keys), func(i int) bool {
|
||||||
return h.keys[i] >= hash
|
return h.keys[i] >= hash
|
||||||
})
|
})
|
||||||
if index < len(h.keys) {
|
if index < len(h.keys) && h.keys[index] == hash {
|
||||||
h.keys = append(h.keys[:index], h.keys[index+1:]...)
|
h.keys = append(h.keys[:index], h.keys[index+1:]...)
|
||||||
}
|
}
|
||||||
h.removeRingNode(hash, nodeRepr)
|
h.removeRingNode(hash, nodeRepr)
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ func (as *adaptiveShedder) maxPass() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (as *adaptiveShedder) minRt() float64 {
|
func (as *adaptiveShedder) minRt() float64 {
|
||||||
var result = defaultMinRt
|
result := defaultMinRt
|
||||||
|
|
||||||
as.rtCounter.Reduce(func(b *collection.Bucket) {
|
as.rtCounter.Reduce(func(b *collection.Bucket) {
|
||||||
if b.Count <= 0 {
|
if b.Count <= 0 {
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ func BenchmarkAdaptiveShedder_Allow(b *testing.B) {
|
|||||||
logx.Disable()
|
logx.Disable()
|
||||||
|
|
||||||
bench := func(b *testing.B) {
|
bench := func(b *testing.B) {
|
||||||
var shedder = NewAdaptiveShedder()
|
shedder := NewAdaptiveShedder()
|
||||||
proba := mathx.NewProba()
|
proba := mathx.NewProba()
|
||||||
for i := 0; i < 6000; i++ {
|
for i := 0; i < 6000; i++ {
|
||||||
p, err := shedder.Allow()
|
p, err := shedder.Allow()
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package load
|
package load
|
||||||
|
|
||||||
type nopShedder struct {
|
type nopShedder struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func newNopShedder() Shedder {
|
func newNopShedder() Shedder {
|
||||||
return nopShedder{}
|
return nopShedder{}
|
||||||
@@ -11,8 +10,7 @@ func (s nopShedder) Allow() (Promise, error) {
|
|||||||
return nopPromise{}, nil
|
return nopPromise{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type nopPromise struct {
|
type nopPromise struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (p nopPromise) Pass() {
|
func (p nopPromise) Pass() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ const (
|
|||||||
dateFormat = "2006-01-02"
|
dateFormat = "2006-01-02"
|
||||||
hoursPerDay = 24
|
hoursPerDay = 24
|
||||||
bufferSize = 100
|
bufferSize = 100
|
||||||
defaultDirMode = 0755
|
defaultDirMode = 0o755
|
||||||
defaultFileMode = 0600
|
defaultFileMode = 0o600
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrLogFileClosed is an error that indicates the log file is already closed.
|
// ErrLogFileClosed is an error that indicates the log file is already closed.
|
||||||
|
|||||||
@@ -112,5 +112,5 @@ func (t mockTrace) Follow(ctx context.Context, serviceName, operationName string
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t mockTrace) Visit(fn func(key string, val string) bool) {
|
func (t mockTrace) Visit(fn func(key, val string) bool) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -457,6 +457,10 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, map
|
|||||||
} else {
|
} else {
|
||||||
conv.Index(i).Set(target.Elem())
|
conv.Index(i).Set(target.Elem())
|
||||||
}
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
|
if err := u.fillSliceValue(conv, i, dereffedBaseKind, ithValue); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -492,18 +496,31 @@ func (u *Unmarshaler) fillSliceFromString(fieldType reflect.Type, value reflect.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *Unmarshaler) fillSliceValue(slice reflect.Value, index int, baseKind reflect.Kind, value interface{}) error {
|
func (u *Unmarshaler) fillSliceValue(slice reflect.Value, index int, baseKind reflect.Kind, value interface{}) error {
|
||||||
|
ithVal := slice.Index(index)
|
||||||
switch v := value.(type) {
|
switch v := value.(type) {
|
||||||
case json.Number:
|
case json.Number:
|
||||||
return setValue(baseKind, slice.Index(index), v.String())
|
return setValue(baseKind, ithVal, v.String())
|
||||||
default:
|
default:
|
||||||
// don't need to consider the difference between int, int8, int16, int32, int64,
|
// don't need to consider the difference between int, int8, int16, int32, int64,
|
||||||
// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
|
// uint, uint8, uint16, uint32, uint64, because they're handled as json.Number.
|
||||||
if slice.Index(index).Kind() != reflect.TypeOf(value).Kind() {
|
if ithVal.Kind() == reflect.Ptr {
|
||||||
return errTypeMismatch
|
baseType := Deref(ithVal.Type())
|
||||||
}
|
if baseType.Kind() != reflect.TypeOf(value).Kind() {
|
||||||
|
return errTypeMismatch
|
||||||
|
}
|
||||||
|
|
||||||
slice.Index(index).Set(reflect.ValueOf(value))
|
target := reflect.New(baseType).Elem()
|
||||||
return nil
|
target.Set(reflect.ValueOf(value))
|
||||||
|
ithVal.Set(target.Addr())
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
if ithVal.Kind() != reflect.TypeOf(value).Kind() {
|
||||||
|
return errTypeMismatch
|
||||||
|
}
|
||||||
|
|
||||||
|
ithVal.Set(reflect.ValueOf(value))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mapping
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -752,7 +753,7 @@ func TestUnmarshalJsonNumberInt64(t *testing.T) {
|
|||||||
for i := 0; i <= maxUintBitsToTest; i++ {
|
for i := 0; i <= maxUintBitsToTest; i++ {
|
||||||
var intValue int64 = 1 << uint(i)
|
var intValue int64 = 1 << uint(i)
|
||||||
strValue := strconv.FormatInt(intValue, 10)
|
strValue := strconv.FormatInt(intValue, 10)
|
||||||
var number = json.Number(strValue)
|
number := json.Number(strValue)
|
||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"ID": number,
|
"ID": number,
|
||||||
}
|
}
|
||||||
@@ -768,7 +769,7 @@ func TestUnmarshalJsonNumberUint64(t *testing.T) {
|
|||||||
for i := 0; i <= maxUintBitsToTest; i++ {
|
for i := 0; i <= maxUintBitsToTest; i++ {
|
||||||
var intValue uint64 = 1 << uint(i)
|
var intValue uint64 = 1 << uint(i)
|
||||||
strValue := strconv.FormatUint(intValue, 10)
|
strValue := strconv.FormatUint(intValue, 10)
|
||||||
var number = json.Number(strValue)
|
number := json.Number(strValue)
|
||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"ID": number,
|
"ID": number,
|
||||||
}
|
}
|
||||||
@@ -784,7 +785,7 @@ func TestUnmarshalJsonNumberUint64Ptr(t *testing.T) {
|
|||||||
for i := 0; i <= maxUintBitsToTest; i++ {
|
for i := 0; i <= maxUintBitsToTest; i++ {
|
||||||
var intValue uint64 = 1 << uint(i)
|
var intValue uint64 = 1 << uint(i)
|
||||||
strValue := strconv.FormatUint(intValue, 10)
|
strValue := strconv.FormatUint(intValue, 10)
|
||||||
var number = json.Number(strValue)
|
number := json.Number(strValue)
|
||||||
m := map[string]interface{}{
|
m := map[string]interface{}{
|
||||||
"ID": number,
|
"ID": number,
|
||||||
}
|
}
|
||||||
@@ -2480,3 +2481,40 @@ func BenchmarkUnmarshal(b *testing.B) {
|
|||||||
UnmarshalKey(data, &an)
|
UnmarshalKey(data, &an)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderMultiArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B [][]string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 2, len(res.B))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderPtrMultiArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": [["add", "cccd"], ["eeee"]]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B [][]*string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 2, len(res.B))
|
||||||
|
assert.Equal(t, 2, len(res.B[0]))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalJsonReaderPtrArray(t *testing.T) {
|
||||||
|
payload := `{"a": "133", "b": ["add", "cccd", "eeee"]}`
|
||||||
|
var res struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B []*string `json:"b"`
|
||||||
|
}
|
||||||
|
reader := strings.NewReader(payload)
|
||||||
|
err := UnmarshalJsonReader(reader, &res)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 3, len(res.B))
|
||||||
|
}
|
||||||
|
|||||||
@@ -170,6 +170,28 @@ func implicitValueRequiredStruct(tag string, tp reflect.Type) (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isLeftInclude(b byte) (bool, error) {
|
||||||
|
switch b {
|
||||||
|
case '[':
|
||||||
|
return true, nil
|
||||||
|
case '(':
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
return false, errNumberRange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isRightInclude(b byte) (bool, error) {
|
||||||
|
switch b {
|
||||||
|
case ']':
|
||||||
|
return true, nil
|
||||||
|
case ')':
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
return false, errNumberRange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func maybeNewValue(field reflect.StructField, value reflect.Value) {
|
func maybeNewValue(field reflect.StructField, value reflect.Value) {
|
||||||
if field.Type.Kind() == reflect.Ptr && value.IsNil() {
|
if field.Type.Kind() == reflect.Ptr && value.IsNil() {
|
||||||
value.Set(reflect.New(value.Type().Elem()))
|
value.Set(reflect.New(value.Type().Elem()))
|
||||||
@@ -211,14 +233,9 @@ func parseNumberRange(str string) (*numberRange, error) {
|
|||||||
return nil, errNumberRange
|
return nil, errNumberRange
|
||||||
}
|
}
|
||||||
|
|
||||||
var leftInclude bool
|
leftInclude, err := isLeftInclude(str[0])
|
||||||
switch str[0] {
|
if err != nil {
|
||||||
case '[':
|
return nil, err
|
||||||
leftInclude = true
|
|
||||||
case '(':
|
|
||||||
leftInclude = false
|
|
||||||
default:
|
|
||||||
return nil, errNumberRange
|
|
||||||
}
|
}
|
||||||
|
|
||||||
str = str[1:]
|
str = str[1:]
|
||||||
@@ -226,14 +243,9 @@ func parseNumberRange(str string) (*numberRange, error) {
|
|||||||
return nil, errNumberRange
|
return nil, errNumberRange
|
||||||
}
|
}
|
||||||
|
|
||||||
var rightInclude bool
|
rightInclude, err := isRightInclude(str[len(str)-1])
|
||||||
switch str[len(str)-1] {
|
if err != nil {
|
||||||
case ']':
|
return nil, err
|
||||||
rightInclude = true
|
|
||||||
case ')':
|
|
||||||
rightInclude = false
|
|
||||||
default:
|
|
||||||
return nil, errNumberRange
|
|
||||||
}
|
}
|
||||||
|
|
||||||
str = str[:len(str)-1]
|
str = str[:len(str)-1]
|
||||||
@@ -274,7 +286,7 @@ func parseNumberRange(str string) (*numberRange, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseOption(fieldOpts *fieldOptions, fieldName string, option string) error {
|
func parseOption(fieldOpts *fieldOptions, fieldName, option string) error {
|
||||||
switch {
|
switch {
|
||||||
case option == stringOption:
|
case option == stringOption:
|
||||||
fieldOpts.FromString = true
|
fieldOpts.FromString = true
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ type Foo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDeferInt(t *testing.T) {
|
func TestDeferInt(t *testing.T) {
|
||||||
var i = 1
|
i := 1
|
||||||
var s = "hello"
|
s := "hello"
|
||||||
number := struct {
|
number := struct {
|
||||||
f float64
|
f float64
|
||||||
}{
|
}{
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ func (u Unstable) AroundDuration(base time.Duration) time.Duration {
|
|||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
// AroundInt returns a randome int64 with given base and deviation.
|
// AroundInt returns a random int64 with given base and deviation.
|
||||||
func (u Unstable) AroundInt(base int64) int64 {
|
func (u Unstable) AroundInt(base int64) int64 {
|
||||||
u.lock.Lock()
|
u.lock.Lock()
|
||||||
val := int64((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base))
|
val := int64((1 + u.deviation - 2*u.deviation*u.r.Float64()) * float64(base))
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ type (
|
|||||||
// CounterVec interface represents a counter vector.
|
// CounterVec interface represents a counter vector.
|
||||||
CounterVec interface {
|
CounterVec interface {
|
||||||
// Inc increments labels.
|
// Inc increments labels.
|
||||||
Inc(lables ...string)
|
Inc(labels ...string)
|
||||||
// Add adds labels with v.
|
// Add adds labels with v.
|
||||||
Add(v float64, labels ...string)
|
Add(v float64, labels ...string)
|
||||||
close() bool
|
close() bool
|
||||||
@@ -50,8 +50,8 @@ func (cv *promCounterVec) Inc(labels ...string) {
|
|||||||
cv.counter.WithLabelValues(labels...).Inc()
|
cv.counter.WithLabelValues(labels...).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cv *promCounterVec) Add(v float64, lables ...string) {
|
func (cv *promCounterVec) Add(v float64, labels ...string) {
|
||||||
cv.counter.WithLabelValues(lables...).Add(v)
|
cv.counter.WithLabelValues(labels...).Add(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cv *promCounterVec) close() bool {
|
func (cv *promCounterVec) close() bool {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type (
|
|||||||
close() bool
|
close() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
promGuageVec struct {
|
promGaugeVec struct {
|
||||||
gauge *prom.GaugeVec
|
gauge *prom.GaugeVec
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -39,7 +39,7 @@ func NewGaugeVec(cfg *GaugeVecOpts) GaugeVec {
|
|||||||
Help: cfg.Help,
|
Help: cfg.Help,
|
||||||
}, cfg.Labels)
|
}, cfg.Labels)
|
||||||
prom.MustRegister(vec)
|
prom.MustRegister(vec)
|
||||||
gv := &promGuageVec{
|
gv := &promGaugeVec{
|
||||||
gauge: vec,
|
gauge: vec,
|
||||||
}
|
}
|
||||||
proc.AddShutdownListener(func() {
|
proc.AddShutdownListener(func() {
|
||||||
@@ -49,18 +49,18 @@ func NewGaugeVec(cfg *GaugeVecOpts) GaugeVec {
|
|||||||
return gv
|
return gv
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gv *promGuageVec) Inc(labels ...string) {
|
func (gv *promGaugeVec) Inc(labels ...string) {
|
||||||
gv.gauge.WithLabelValues(labels...).Inc()
|
gv.gauge.WithLabelValues(labels...).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gv *promGuageVec) Add(v float64, lables ...string) {
|
func (gv *promGaugeVec) Add(v float64, labels ...string) {
|
||||||
gv.gauge.WithLabelValues(lables...).Add(v)
|
gv.gauge.WithLabelValues(labels...).Add(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gv *promGuageVec) Set(v float64, lables ...string) {
|
func (gv *promGaugeVec) Set(v float64, labels ...string) {
|
||||||
gv.gauge.WithLabelValues(lables...).Set(v)
|
gv.gauge.WithLabelValues(labels...).Set(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gv *promGuageVec) close() bool {
|
func (gv *promGaugeVec) close() bool {
|
||||||
return prom.Unregister(gv.gauge)
|
return prom.Unregister(gv.gauge)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func TestGaugeInc(t *testing.T) {
|
|||||||
Labels: []string{"path"},
|
Labels: []string{"path"},
|
||||||
})
|
})
|
||||||
defer gaugeVec.close()
|
defer gaugeVec.close()
|
||||||
gv, _ := gaugeVec.(*promGuageVec)
|
gv, _ := gaugeVec.(*promGaugeVec)
|
||||||
gv.Inc("/users")
|
gv.Inc("/users")
|
||||||
gv.Inc("/users")
|
gv.Inc("/users")
|
||||||
r := testutil.ToFloat64(gv.gauge)
|
r := testutil.ToFloat64(gv.gauge)
|
||||||
@@ -45,7 +45,7 @@ func TestGaugeAdd(t *testing.T) {
|
|||||||
Labels: []string{"path"},
|
Labels: []string{"path"},
|
||||||
})
|
})
|
||||||
defer gaugeVec.close()
|
defer gaugeVec.close()
|
||||||
gv, _ := gaugeVec.(*promGuageVec)
|
gv, _ := gaugeVec.(*promGaugeVec)
|
||||||
gv.Add(-10, "/classroom")
|
gv.Add(-10, "/classroom")
|
||||||
gv.Add(30, "/classroom")
|
gv.Add(30, "/classroom")
|
||||||
r := testutil.ToFloat64(gv.gauge)
|
r := testutil.ToFloat64(gv.gauge)
|
||||||
@@ -61,7 +61,7 @@ func TestGaugeSet(t *testing.T) {
|
|||||||
Labels: []string{"path"},
|
Labels: []string{"path"},
|
||||||
})
|
})
|
||||||
gaugeVec.close()
|
gaugeVec.close()
|
||||||
gv, _ := gaugeVec.(*promGuageVec)
|
gv, _ := gaugeVec.(*promGaugeVec)
|
||||||
gv.Set(666, "/users")
|
gv.Set(666, "/users")
|
||||||
r := testutil.ToFloat64(gv.gauge)
|
r := testutil.ToFloat64(gv.gauge)
|
||||||
assert.Equal(t, float64(666), r)
|
assert.Equal(t, float64(666), r)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ type (
|
|||||||
// A HistogramVec interface represents a histogram vector.
|
// A HistogramVec interface represents a histogram vector.
|
||||||
HistogramVec interface {
|
HistogramVec interface {
|
||||||
// Observe adds observation v to labels.
|
// Observe adds observation v to labels.
|
||||||
Observe(v int64, lables ...string)
|
Observe(v int64, labels ...string)
|
||||||
close() bool
|
close() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ func Map(generate GenerateFunc, mapper MapFunc, opts ...Option) chan interface{}
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MapReduce maps all elements generated from given generate func,
|
// MapReduce maps all elements generated from given generate func,
|
||||||
// and reduces the output elemenets with given reducer.
|
// and reduces the output elements with given reducer.
|
||||||
func MapReduce(generate GenerateFunc, mapper MapperFunc, reducer ReducerFunc, opts ...Option) (interface{}, error) {
|
func MapReduce(generate GenerateFunc, mapper MapperFunc, reducer ReducerFunc, opts ...Option) (interface{}, error) {
|
||||||
source := buildSource(generate)
|
source := buildSource(generate)
|
||||||
return MapReduceWithSource(source, mapper, reducer, opts...)
|
return MapReduceWithSource(source, mapper, reducer, opts...)
|
||||||
@@ -136,14 +136,16 @@ func MapReduceWithSource(source <-chan interface{}, mapper MapperFunc, reducer R
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
|
drain(collector)
|
||||||
|
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
cancel(fmt.Errorf("%v", r))
|
cancel(fmt.Errorf("%v", r))
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
reducer(collector, writer, cancel)
|
reducer(collector, writer, cancel)
|
||||||
drain(collector)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go executeMappers(func(item interface{}, w Writer) {
|
go executeMappers(func(item interface{}, w Writer) {
|
||||||
@@ -165,7 +167,6 @@ func MapReduceWithSource(source <-chan interface{}, mapper MapperFunc, reducer R
|
|||||||
func MapReduceVoid(generate GenerateFunc, mapper MapperFunc, reducer VoidReducerFunc, opts ...Option) error {
|
func MapReduceVoid(generate GenerateFunc, mapper MapperFunc, reducer VoidReducerFunc, opts ...Option) error {
|
||||||
_, err := MapReduce(generate, mapper, func(input <-chan interface{}, writer Writer, cancel func(error)) {
|
_, err := MapReduce(generate, mapper, func(input <-chan interface{}, writer Writer, cancel func(error)) {
|
||||||
reducer(input, cancel)
|
reducer(input, cancel)
|
||||||
drain(input)
|
|
||||||
// We need to write a placeholder to let MapReduce to continue on reducer done,
|
// We need to write a placeholder to let MapReduce to continue on reducer done,
|
||||||
// otherwise, all goroutines are waiting. The placeholder will be discarded by MapReduce.
|
// otherwise, all goroutines are waiting. The placeholder will be discarded by MapReduce.
|
||||||
writer.Write(lang.Placeholder)
|
writer.Write(lang.Placeholder)
|
||||||
|
|||||||
@@ -7,10 +7,19 @@ import (
|
|||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
|
"github.com/tal-tech/go-zero/core/syncx"
|
||||||
"github.com/tal-tech/go-zero/core/threading"
|
"github.com/tal-tech/go-zero/core/threading"
|
||||||
)
|
)
|
||||||
|
|
||||||
var once sync.Once
|
var (
|
||||||
|
once sync.Once
|
||||||
|
enabled syncx.AtomicBool
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enabled returns if prometheus is enabled.
|
||||||
|
func Enabled() bool {
|
||||||
|
return enabled.True()
|
||||||
|
}
|
||||||
|
|
||||||
// StartAgent starts a prometheus agent.
|
// StartAgent starts a prometheus agent.
|
||||||
func StartAgent(c Config) {
|
func StartAgent(c Config) {
|
||||||
@@ -19,6 +28,7 @@ func StartAgent(c Config) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enabled.Set(true)
|
||||||
threading.GoSafe(func() {
|
threading.GoSafe(func() {
|
||||||
http.Handle(c.Path, promhttp.Handler())
|
http.Handle(c.Path, promhttp.Handler())
|
||||||
addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
|
addr := fmt.Sprintf("%s:%d", c.Host, c.Port)
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ func NewQueue(producerFactory ProducerFactory, consumerFactory ConsumerFactory)
|
|||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddListener adds a litener to q.
|
// AddListener adds a listener to q.
|
||||||
func (q *Queue) AddListener(listener Listener) {
|
func (q *Queue) AddListener(listener Listener) {
|
||||||
q.listeners = append(q.listeners, listener)
|
q.listeners = append(q.listeners, listener)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ func (p *mockedProducer) Produce() (string, bool) {
|
|||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockedListener struct {
|
type mockedListener struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (l *mockedListener) OnPause() {
|
func (l *mockedListener) OnPause() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package search
|
package search
|
||||||
|
|
||||||
import "errors"
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
colon = ':'
|
colon = ':'
|
||||||
@@ -8,16 +11,16 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrDupItem means adding duplicated item.
|
// errDupItem means adding duplicated item.
|
||||||
ErrDupItem = errors.New("duplicated item")
|
errDupItem = errors.New("duplicated item")
|
||||||
// ErrDupSlash means item is started with more than one slash.
|
// errDupSlash means item is started with more than one slash.
|
||||||
ErrDupSlash = errors.New("duplicated slash")
|
errDupSlash = errors.New("duplicated slash")
|
||||||
// ErrEmptyItem means adding empty item.
|
// errEmptyItem means adding empty item.
|
||||||
ErrEmptyItem = errors.New("empty item")
|
errEmptyItem = errors.New("empty item")
|
||||||
// ErrInvalidState means search tree is in an invalid state.
|
// errInvalidState means search tree is in an invalid state.
|
||||||
ErrInvalidState = errors.New("search tree is in an invalid state")
|
errInvalidState = errors.New("search tree is in an invalid state")
|
||||||
// ErrNotFromRoot means path is not starting with slash.
|
// errNotFromRoot means path is not starting with slash.
|
||||||
ErrNotFromRoot = errors.New("path should start with /")
|
errNotFromRoot = errors.New("path should start with /")
|
||||||
|
|
||||||
// NotFound is used to hold the not found result.
|
// NotFound is used to hold the not found result.
|
||||||
NotFound Result
|
NotFound Result
|
||||||
@@ -58,14 +61,22 @@ func NewTree() *Tree {
|
|||||||
// Add adds item to associate with route.
|
// Add adds item to associate with route.
|
||||||
func (t *Tree) Add(route string, item interface{}) error {
|
func (t *Tree) Add(route string, item interface{}) error {
|
||||||
if len(route) == 0 || route[0] != slash {
|
if len(route) == 0 || route[0] != slash {
|
||||||
return ErrNotFromRoot
|
return errNotFromRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
if item == nil {
|
if item == nil {
|
||||||
return ErrEmptyItem
|
return errEmptyItem
|
||||||
}
|
}
|
||||||
|
|
||||||
return add(t.root, route[1:], item)
|
err := add(t.root, route[1:], item)
|
||||||
|
switch err {
|
||||||
|
case errDupItem:
|
||||||
|
return duplicatedItem(route)
|
||||||
|
case errDupSlash:
|
||||||
|
return duplicatedSlash(route)
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search searches item that associates with given route.
|
// Search searches item that associates with given route.
|
||||||
@@ -86,22 +97,22 @@ func (t *Tree) next(n *node, route string, result *Result) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i := range route {
|
for i := range route {
|
||||||
if route[i] == slash {
|
if route[i] != slash {
|
||||||
token := route[:i]
|
continue
|
||||||
return n.forEach(func(k string, v *node) bool {
|
|
||||||
if r := match(k, token); r.found {
|
|
||||||
if t.next(v, route[i+1:], result) {
|
|
||||||
if r.named {
|
|
||||||
addParam(result, r.key, r.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
token := route[:i]
|
||||||
|
return n.forEach(func(k string, v *node) bool {
|
||||||
|
r := match(k, token)
|
||||||
|
if !r.found || !t.next(v, route[i+1:], result) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if r.named {
|
||||||
|
addParam(result, r.key, r.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return n.forEach(func(k string, v *node) bool {
|
return n.forEach(func(k string, v *node) bool {
|
||||||
@@ -141,7 +152,7 @@ func (nd *node) getChildren(route string) map[string]*node {
|
|||||||
func add(nd *node, route string, item interface{}) error {
|
func add(nd *node, route string, item interface{}) error {
|
||||||
if len(route) == 0 {
|
if len(route) == 0 {
|
||||||
if nd.item != nil {
|
if nd.item != nil {
|
||||||
return ErrDupItem
|
return errDupItem
|
||||||
}
|
}
|
||||||
|
|
||||||
nd.item = item
|
nd.item = item
|
||||||
@@ -149,31 +160,33 @@ func add(nd *node, route string, item interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if route[0] == slash {
|
if route[0] == slash {
|
||||||
return ErrDupSlash
|
return errDupSlash
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range route {
|
for i := range route {
|
||||||
if route[i] == slash {
|
if route[i] != slash {
|
||||||
token := route[:i]
|
continue
|
||||||
children := nd.getChildren(token)
|
}
|
||||||
if child, ok := children[token]; ok {
|
|
||||||
if child != nil {
|
|
||||||
return add(child, route[i+1:], item)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ErrInvalidState
|
token := route[:i]
|
||||||
|
children := nd.getChildren(token)
|
||||||
|
if child, ok := children[token]; ok {
|
||||||
|
if child != nil {
|
||||||
|
return add(child, route[i+1:], item)
|
||||||
}
|
}
|
||||||
|
|
||||||
child := newNode(nil)
|
return errInvalidState
|
||||||
children[token] = child
|
|
||||||
return add(child, route[i+1:], item)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
child := newNode(nil)
|
||||||
|
children[token] = child
|
||||||
|
return add(child, route[i+1:], item)
|
||||||
}
|
}
|
||||||
|
|
||||||
children := nd.getChildren(route)
|
children := nd.getChildren(route)
|
||||||
if child, ok := children[route]; ok {
|
if child, ok := children[route]; ok {
|
||||||
if child.item != nil {
|
if child.item != nil {
|
||||||
return ErrDupItem
|
return errDupItem
|
||||||
}
|
}
|
||||||
|
|
||||||
child.item = item
|
child.item = item
|
||||||
@@ -192,6 +205,14 @@ func addParam(result *Result, k, v string) {
|
|||||||
result.Params[k] = v
|
result.Params[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func duplicatedItem(item string) error {
|
||||||
|
return fmt.Errorf("duplicated item for %s", item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func duplicatedSlash(item string) error {
|
||||||
|
return fmt.Errorf("duplicated slash for %s", item)
|
||||||
|
}
|
||||||
|
|
||||||
func match(pat, token string) innerResult {
|
func match(pat, token string) innerResult {
|
||||||
if pat[0] == colon {
|
if pat[0] == colon {
|
||||||
return innerResult{
|
return innerResult{
|
||||||
|
|||||||
@@ -151,9 +151,9 @@ func TestAddDuplicate(t *testing.T) {
|
|||||||
err := tree.Add("/a/b", 1)
|
err := tree.Add("/a/b", 1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = tree.Add("/a/b", 2)
|
err = tree.Add("/a/b", 2)
|
||||||
assert.Equal(t, ErrDupItem, err)
|
assert.Error(t, errDupItem, err)
|
||||||
err = tree.Add("/a/b/", 2)
|
err = tree.Add("/a/b/", 2)
|
||||||
assert.Equal(t, ErrDupItem, err)
|
assert.Error(t, errDupItem, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPlain(t *testing.T) {
|
func TestPlain(t *testing.T) {
|
||||||
@@ -169,19 +169,19 @@ func TestPlain(t *testing.T) {
|
|||||||
func TestSearchWithDoubleSlashes(t *testing.T) {
|
func TestSearchWithDoubleSlashes(t *testing.T) {
|
||||||
tree := NewTree()
|
tree := NewTree()
|
||||||
err := tree.Add("//a", 1)
|
err := tree.Add("//a", 1)
|
||||||
assert.Error(t, ErrDupSlash, err)
|
assert.Error(t, errDupSlash, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSearchInvalidRoute(t *testing.T) {
|
func TestSearchInvalidRoute(t *testing.T) {
|
||||||
tree := NewTree()
|
tree := NewTree()
|
||||||
err := tree.Add("", 1)
|
err := tree.Add("", 1)
|
||||||
assert.Equal(t, ErrNotFromRoot, err)
|
assert.Equal(t, errNotFromRoot, err)
|
||||||
err = tree.Add("bad", 1)
|
err = tree.Add("bad", 1)
|
||||||
assert.Equal(t, ErrNotFromRoot, err)
|
assert.Equal(t, errNotFromRoot, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSearchInvalidItem(t *testing.T) {
|
func TestSearchInvalidItem(t *testing.T) {
|
||||||
tree := NewTree()
|
tree := NewTree()
|
||||||
err := tree.Add("/", nil)
|
err := tree.Add("/", nil)
|
||||||
assert.Equal(t, ErrEmptyItem, err)
|
assert.Equal(t, errEmptyItem, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ const (
|
|||||||
DevMode = "dev"
|
DevMode = "dev"
|
||||||
// TestMode means test mode.
|
// TestMode means test mode.
|
||||||
TestMode = "test"
|
TestMode = "test"
|
||||||
|
// RtMode means regression test mode.
|
||||||
|
RtMode = "rt"
|
||||||
// PreMode means pre-release mode.
|
// PreMode means pre-release mode.
|
||||||
PreMode = "pre"
|
PreMode = "pre"
|
||||||
// ProMode means production mode.
|
// ProMode means production mode.
|
||||||
@@ -56,7 +58,7 @@ func (sc ServiceConf) SetUp() error {
|
|||||||
|
|
||||||
func (sc ServiceConf) initMode() {
|
func (sc ServiceConf) initMode() {
|
||||||
switch sc.Mode {
|
switch sc.Mode {
|
||||||
case DevMode, TestMode, PreMode:
|
case DevMode, TestMode, RtMode, PreMode:
|
||||||
load.Disable()
|
load.Disable()
|
||||||
stat.SetReporter(nil)
|
stat.SetReporter(nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,8 +95,7 @@ func WithStarter(start Starter) Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type (
|
type (
|
||||||
stopper struct {
|
stopper struct{}
|
||||||
}
|
|
||||||
|
|
||||||
startOnlyService struct {
|
startOnlyService struct {
|
||||||
start func()
|
start func()
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ func TestServiceGroup_WithStart(t *testing.T) {
|
|||||||
wait.Add(len(multipliers))
|
wait.Add(len(multipliers))
|
||||||
group := NewServiceGroup()
|
group := NewServiceGroup()
|
||||||
for _, multiplier := range multipliers {
|
for _, multiplier := range multipliers {
|
||||||
var mul = multiplier
|
mul := multiplier
|
||||||
group.Add(WithStart(func() {
|
group.Add(WithStart(func() {
|
||||||
lock.Lock()
|
lock.Lock()
|
||||||
want *= mul
|
want *= mul
|
||||||
@@ -97,7 +97,7 @@ func TestServiceGroup_WithStarter(t *testing.T) {
|
|||||||
wait.Add(len(multipliers))
|
wait.Add(len(multipliers))
|
||||||
group := NewServiceGroup()
|
group := NewServiceGroup()
|
||||||
for _, multiplier := range multipliers {
|
for _, multiplier := range multipliers {
|
||||||
var mul = multiplier
|
mul := multiplier
|
||||||
group.Add(WithStarter(mockedStarter{
|
group.Add(WithStarter(mockedStarter{
|
||||||
fn: func() {
|
fn: func() {
|
||||||
lock.Lock()
|
lock.Lock()
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ var (
|
|||||||
cores uint64
|
cores uint64
|
||||||
)
|
)
|
||||||
|
|
||||||
// if /proc not present, ignore the cpu calcuation, like wsl linux
|
// if /proc not present, ignore the cpu calculation, like wsl linux
|
||||||
func init() {
|
func init() {
|
||||||
cpus, err := perCpuUsage()
|
cpus, err := perCpuUsage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
12
core/stores/cache/cachenode.go
vendored
12
core/stores/cache/cachenode.go
vendored
@@ -59,7 +59,7 @@ func NewNode(rds *redis.Redis, barrier syncx.SharedCalls, st *Stat,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelCache deletes cached values with keys.
|
// Del deletes cached values with keys.
|
||||||
func (c cacheNode) Del(keys ...string) error {
|
func (c cacheNode) Del(keys ...string) error {
|
||||||
if len(keys) == 0 {
|
if len(keys) == 0 {
|
||||||
return nil
|
return nil
|
||||||
@@ -73,7 +73,7 @@ func (c cacheNode) Del(keys ...string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCache gets the cache with key and fills into v.
|
// Get gets the cache with key and fills into v.
|
||||||
func (c cacheNode) Get(key string, v interface{}) error {
|
func (c cacheNode) Get(key string, v interface{}) error {
|
||||||
err := c.doGetCache(key, v)
|
err := c.doGetCache(key, v)
|
||||||
if err == errPlaceholder {
|
if err == errPlaceholder {
|
||||||
@@ -88,12 +88,12 @@ func (c cacheNode) IsNotFound(err error) bool {
|
|||||||
return err == c.errNotFound
|
return err == c.errNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCache sets the cache with key and v, using c.expiry.
|
// Set sets the cache with key and v, using c.expiry.
|
||||||
func (c cacheNode) Set(key string, v interface{}) error {
|
func (c cacheNode) Set(key string, v interface{}) error {
|
||||||
return c.SetWithExpire(key, v, c.aroundDuration(c.expiry))
|
return c.SetWithExpire(key, v, c.aroundDuration(c.expiry))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetCacheWithExpire sets the cache with key and v, using given expire.
|
// SetWithExpire sets the cache with key and v, using given expire.
|
||||||
func (c cacheNode) SetWithExpire(key string, v interface{}, expire time.Duration) error {
|
func (c cacheNode) SetWithExpire(key string, v interface{}, expire time.Duration) error {
|
||||||
data, err := jsonx.Marshal(v)
|
data, err := jsonx.Marshal(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -108,7 +108,7 @@ func (c cacheNode) String() string {
|
|||||||
return c.rds.Addr
|
return c.rds.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// TakeWithExpire takes the result from cache first, if not found,
|
// Take takes the result from cache first, if not found,
|
||||||
// query from DB and set cache using c.expiry, then return the result.
|
// query from DB and set cache using c.expiry, then return the result.
|
||||||
func (c cacheNode) Take(v interface{}, key string, query func(v interface{}) error) error {
|
func (c cacheNode) Take(v interface{}, key string, query func(v interface{}) error) error {
|
||||||
return c.doTake(v, key, query, func(v interface{}) error {
|
return c.doTake(v, key, query, func(v interface{}) error {
|
||||||
@@ -205,7 +205,7 @@ func (c cacheNode) doTake(v interface{}, key string, query func(v interface{}) e
|
|||||||
return jsonx.Unmarshal(val.([]byte), v)
|
return jsonx.Unmarshal(val.([]byte), v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c cacheNode) processCache(key string, data string, v interface{}) error {
|
func (c cacheNode) processCache(key, data string, v interface{}) error {
|
||||||
err := jsonx.Unmarshal([]byte(data), v)
|
err := jsonx.Unmarshal([]byte(data), v)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
2
core/stores/cache/cachenode_test.go
vendored
2
core/stores/cache/cachenode_test.go
vendored
@@ -129,7 +129,7 @@ func TestCacheNode_TakeNotFound(t *testing.T) {
|
|||||||
assert.True(t, cn.IsNotFound(cn.Get("any", &str)))
|
assert.True(t, cn.IsNotFound(cn.Get("any", &str)))
|
||||||
|
|
||||||
store.Del("any")
|
store.Del("any")
|
||||||
var errDummy = errors.New("dummy")
|
errDummy := errors.New("dummy")
|
||||||
err = cn.Take(&str, "any", func(v interface{}) error {
|
err = cn.Take(&str, "any", func(v interface{}) error {
|
||||||
return errDummy
|
return errDummy
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ type (
|
|||||||
// Store interface represents a KV store.
|
// Store interface represents a KV store.
|
||||||
Store interface {
|
Store interface {
|
||||||
Del(keys ...string) (int, error)
|
Del(keys ...string) (int, error)
|
||||||
Eval(script string, key string, args ...interface{}) (interface{}, error)
|
Eval(script, key string, args ...interface{}) (interface{}, error)
|
||||||
Exists(key string) (bool, error)
|
Exists(key string) (bool, error)
|
||||||
Expire(key string, seconds int) error
|
Expire(key string, seconds int) error
|
||||||
Expireat(key string, expireTime int64) error
|
Expireat(key string, expireTime int64) error
|
||||||
@@ -39,7 +39,7 @@ type (
|
|||||||
Llen(key string) (int, error)
|
Llen(key string) (int, error)
|
||||||
Lpop(key string) (string, error)
|
Lpop(key string) (string, error)
|
||||||
Lpush(key string, values ...interface{}) (int, error)
|
Lpush(key string, values ...interface{}) (int, error)
|
||||||
Lrange(key string, start int, stop int) ([]string, error)
|
Lrange(key string, start, stop int) ([]string, error)
|
||||||
Lrem(key string, count int, value string) (int, error)
|
Lrem(key string, count int, value string) (int, error)
|
||||||
Persist(key string) (bool, error)
|
Persist(key string) (bool, error)
|
||||||
Pfadd(key string, values ...interface{}) (bool, error)
|
Pfadd(key string, values ...interface{}) (bool, error)
|
||||||
@@ -47,7 +47,7 @@ type (
|
|||||||
Rpush(key string, values ...interface{}) (int, error)
|
Rpush(key string, values ...interface{}) (int, error)
|
||||||
Sadd(key string, values ...interface{}) (int, error)
|
Sadd(key string, values ...interface{}) (int, error)
|
||||||
Scard(key string) (int64, error)
|
Scard(key string) (int64, error)
|
||||||
Set(key string, value string) error
|
Set(key, value string) error
|
||||||
Setex(key, value string, seconds int) error
|
Setex(key, value string, seconds int) error
|
||||||
Setnx(key, value string) (bool, error)
|
Setnx(key, value string) (bool, error)
|
||||||
SetnxEx(key, value string, seconds int) (bool, error)
|
SetnxEx(key, value string, seconds int) (bool, error)
|
||||||
@@ -74,7 +74,7 @@ type (
|
|||||||
Zrevrange(key string, start, stop int64) ([]string, error)
|
Zrevrange(key string, start, stop int64) ([]string, error)
|
||||||
ZrevrangebyscoreWithScores(key string, start, stop int64) ([]redis.Pair, error)
|
ZrevrangebyscoreWithScores(key string, start, stop int64) ([]redis.Pair, error)
|
||||||
ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) ([]redis.Pair, error)
|
ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) ([]redis.Pair, error)
|
||||||
Zscore(key string, value string) (int64, error)
|
Zscore(key, value string) (int64, error)
|
||||||
Zrevrank(key, field string) (int64, error)
|
Zrevrank(key, field string) (int64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ func (cs clusterStore) Del(keys ...string) (int, error) {
|
|||||||
return val, be.Err()
|
return val, be.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs clusterStore) Eval(script string, key string, args ...interface{}) (interface{}, error) {
|
func (cs clusterStore) Eval(script, key string, args ...interface{}) (interface{}, error) {
|
||||||
node, err := cs.getRedis(key)
|
node, err := cs.getRedis(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -321,7 +321,7 @@ func (cs clusterStore) Lpush(key string, values ...interface{}) (int, error) {
|
|||||||
return node.Lpush(key, values...)
|
return node.Lpush(key, values...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs clusterStore) Lrange(key string, start int, stop int) ([]string, error) {
|
func (cs clusterStore) Lrange(key string, start, stop int) ([]string, error) {
|
||||||
node, err := cs.getRedis(key)
|
node, err := cs.getRedis(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -393,7 +393,7 @@ func (cs clusterStore) Scard(key string) (int64, error) {
|
|||||||
return node.Scard(key)
|
return node.Scard(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs clusterStore) Set(key string, value string) error {
|
func (cs clusterStore) Set(key, value string) error {
|
||||||
node, err := cs.getRedis(key)
|
node, err := cs.getRedis(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -648,7 +648,7 @@ func (cs clusterStore) Zrevrank(key, field string) (int64, error) {
|
|||||||
return node.Zrevrank(key, field)
|
return node.Zrevrank(key, field)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cs clusterStore) Zscore(key string, value string) (int64, error) {
|
func (cs clusterStore) Zscore(key, value string) (int64, error) {
|
||||||
node, err := cs.getRedis(key)
|
node, err := cs.getRedis(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|||||||
@@ -12,8 +12,10 @@ import (
|
|||||||
"github.com/tal-tech/go-zero/core/stringx"
|
"github.com/tal-tech/go-zero/core/stringx"
|
||||||
)
|
)
|
||||||
|
|
||||||
var s1, _ = miniredis.Run()
|
var (
|
||||||
var s2, _ = miniredis.Run()
|
s1, _ = miniredis.Run()
|
||||||
|
s2, _ = miniredis.Run()
|
||||||
|
)
|
||||||
|
|
||||||
func TestRedis_Exists(t *testing.T) {
|
func TestRedis_Exists(t *testing.T) {
|
||||||
store := clusterStore{dispatcher: hash.NewConsistentHash()}
|
store := clusterStore{dispatcher: hash.NewConsistentHash()}
|
||||||
|
|||||||
@@ -279,8 +279,7 @@ func (p *mockPromise) Reject(reason string) {
|
|||||||
p.reason = reason
|
p.reason = reason
|
||||||
}
|
}
|
||||||
|
|
||||||
type dropBreaker struct {
|
type dropBreaker struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (d *dropBreaker) Name() string {
|
func (d *dropBreaker) Name() string {
|
||||||
return "dummy"
|
return "dummy"
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ type (
|
|||||||
CachedCollection interface {
|
CachedCollection interface {
|
||||||
Count(query interface{}) (int, error)
|
Count(query interface{}) (int, error)
|
||||||
DelCache(keys ...string) error
|
DelCache(keys ...string) error
|
||||||
FindAllNoCache(v interface{}, query interface{}, opts ...QueryOption) error
|
FindAllNoCache(v, query interface{}, opts ...QueryOption) error
|
||||||
FindOne(v interface{}, key string, query interface{}) error
|
FindOne(v interface{}, key string, query interface{}) error
|
||||||
FindOneNoCache(v interface{}, query interface{}) error
|
FindOneNoCache(v, query interface{}) error
|
||||||
FindOneId(v interface{}, key string, id interface{}) error
|
FindOneId(v interface{}, key string, id interface{}) error
|
||||||
FindOneIdNoCache(v interface{}, id interface{}) error
|
FindOneIdNoCache(v, id interface{}) error
|
||||||
GetCache(key string, v interface{}) error
|
GetCache(key string, v interface{}) error
|
||||||
Insert(docs ...interface{}) error
|
Insert(docs ...interface{}) error
|
||||||
Pipe(pipeline interface{}) mongo.Pipe
|
Pipe(pipeline interface{}) mongo.Pipe
|
||||||
@@ -68,7 +68,7 @@ func (c *cachedCollection) DelCache(keys ...string) error {
|
|||||||
return c.cache.Del(keys...)
|
return c.cache.Del(keys...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cachedCollection) FindAllNoCache(v interface{}, query interface{}, opts ...QueryOption) error {
|
func (c *cachedCollection) FindAllNoCache(v, query interface{}, opts ...QueryOption) error {
|
||||||
q := c.collection.Find(query)
|
q := c.collection.Find(query)
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
q = opt(q)
|
q = opt(q)
|
||||||
@@ -83,7 +83,7 @@ func (c *cachedCollection) FindOne(v interface{}, key string, query interface{})
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cachedCollection) FindOneNoCache(v interface{}, query interface{}) error {
|
func (c *cachedCollection) FindOneNoCache(v, query interface{}) error {
|
||||||
q := c.collection.Find(query)
|
q := c.collection.Find(query)
|
||||||
return q.One(v)
|
return q.One(v)
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ func (c *cachedCollection) FindOneId(v interface{}, key string, id interface{})
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cachedCollection) FindOneIdNoCache(v interface{}, id interface{}) error {
|
func (c *cachedCollection) FindOneIdNoCache(v, id interface{}) error {
|
||||||
q := c.collection.FindId(id)
|
q := c.collection.FindId(id)
|
||||||
return q.One(v)
|
return q.One(v)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ func (mm *Model) GetCollection(session *mgo.Session) CachedCollection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FindAllNoCache finds all records without cache.
|
// FindAllNoCache finds all records without cache.
|
||||||
func (mm *Model) FindAllNoCache(v interface{}, query interface{}, opts ...QueryOption) error {
|
func (mm *Model) FindAllNoCache(v, query interface{}, opts ...QueryOption) error {
|
||||||
return mm.execute(func(c CachedCollection) error {
|
return mm.execute(func(c CachedCollection) error {
|
||||||
return c.FindAllNoCache(v, query, opts...)
|
return c.FindAllNoCache(v, query, opts...)
|
||||||
})
|
})
|
||||||
@@ -89,7 +89,7 @@ func (mm *Model) FindOne(v interface{}, key string, query interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FindOneNoCache unmarshals a record into v with query, without cache.
|
// FindOneNoCache unmarshals a record into v with query, without cache.
|
||||||
func (mm *Model) FindOneNoCache(v interface{}, query interface{}) error {
|
func (mm *Model) FindOneNoCache(v, query interface{}) error {
|
||||||
return mm.execute(func(c CachedCollection) error {
|
return mm.execute(func(c CachedCollection) error {
|
||||||
return c.FindOneNoCache(v, query)
|
return c.FindOneNoCache(v, query)
|
||||||
})
|
})
|
||||||
@@ -103,7 +103,7 @@ func (mm *Model) FindOneId(v interface{}, key string, id interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FindOneIdNoCache unmarshals a record into v with query, without cache.
|
// FindOneIdNoCache unmarshals a record into v with query, without cache.
|
||||||
func (mm *Model) FindOneIdNoCache(v interface{}, id interface{}) error {
|
func (mm *Model) FindOneIdNoCache(v, id interface{}) error {
|
||||||
return mm.execute(func(c CachedCollection) error {
|
return mm.execute(func(c CachedCollection) error {
|
||||||
return c.FindOneIdNoCache(v, id)
|
return c.FindOneIdNoCache(v, id)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ type (
|
|||||||
Host string
|
Host string
|
||||||
Type string `json:",default=node,options=node|cluster"`
|
Type string `json:",default=node,options=node|cluster"`
|
||||||
Pass string `json:",optional"`
|
Pass string `json:",optional"`
|
||||||
|
Tls bool `json:",default=false,options=true|false"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// A RedisKeyConf is a redis config with key.
|
// A RedisKeyConf is a redis config with key.
|
||||||
@@ -28,7 +29,18 @@ type (
|
|||||||
|
|
||||||
// NewRedis returns a Redis.
|
// NewRedis returns a Redis.
|
||||||
func (rc RedisConf) NewRedis() *Redis {
|
func (rc RedisConf) NewRedis() *Redis {
|
||||||
return NewRedis(rc.Host, rc.Type, rc.Pass)
|
var opts []Option
|
||||||
|
if rc.Type == ClusterType {
|
||||||
|
opts = append(opts, Cluster())
|
||||||
|
}
|
||||||
|
if len(rc.Pass) > 0 {
|
||||||
|
opts = append(opts, WithPass(rc.Pass))
|
||||||
|
}
|
||||||
|
if rc.Tls {
|
||||||
|
opts = append(opts, WithTLS())
|
||||||
|
}
|
||||||
|
|
||||||
|
return New(rc.Host, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate validates the RedisConf.
|
// Validate validates the RedisConf.
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ const (
|
|||||||
var ErrNilNode = errors.New("nil redis node")
|
var ErrNilNode = errors.New("nil redis node")
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
// Option defines the method to customize a Redis.
|
||||||
|
Option func(r *Redis)
|
||||||
|
|
||||||
// A Pair is a key/pair set used in redis zset.
|
// A Pair is a key/pair set used in redis zset.
|
||||||
Pair struct {
|
Pair struct {
|
||||||
Key string
|
Key string
|
||||||
@@ -40,6 +43,7 @@ type (
|
|||||||
Addr string
|
Addr string
|
||||||
Type string
|
Type string
|
||||||
Pass string
|
Pass string
|
||||||
|
tls bool
|
||||||
brk breaker.Breaker
|
brk breaker.Breaker
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,19 +73,32 @@ type (
|
|||||||
FloatCmd = red.FloatCmd
|
FloatCmd = red.FloatCmd
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewRedis returns a Redis.
|
// New returns a Redis with given options.
|
||||||
func NewRedis(redisAddr, redisType string, redisPass ...string) *Redis {
|
func New(addr string, opts ...Option) *Redis {
|
||||||
var pass string
|
r := &Redis{
|
||||||
for _, v := range redisPass {
|
Addr: addr,
|
||||||
pass = v
|
Type: NodeType,
|
||||||
}
|
|
||||||
|
|
||||||
return &Redis{
|
|
||||||
Addr: redisAddr,
|
|
||||||
Type: redisType,
|
|
||||||
Pass: pass,
|
|
||||||
brk: breaker.NewBreaker(),
|
brk: breaker.NewBreaker(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRedis returns a Redis.
|
||||||
|
func NewRedis(redisAddr, redisType string, redisPass ...string) *Redis {
|
||||||
|
var opts []Option
|
||||||
|
if redisType == ClusterType {
|
||||||
|
opts = append(opts, Cluster())
|
||||||
|
}
|
||||||
|
for _, v := range redisPass {
|
||||||
|
opts = append(opts, WithPass(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return New(redisAddr, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// BitCount is redis bitcount command implementation.
|
// BitCount is redis bitcount command implementation.
|
||||||
@@ -163,7 +180,7 @@ func (s *Redis) BitOpXor(destKey string, keys ...string) (val int64, err error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BitPos is redis bitpos command implementation.
|
// BitPos is redis bitpos command implementation.
|
||||||
func (s *Redis) BitPos(key string, bit int64, start, end int64) (val int64, err error) {
|
func (s *Redis) BitPos(key string, bit, start, end int64) (val int64, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -329,7 +346,7 @@ func (s *Redis) GeoAdd(key string, geoLocation ...*GeoLocation) (val int64, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GeoDist is the implementation of redis geodist command.
|
// GeoDist is the implementation of redis geodist command.
|
||||||
func (s *Redis) GeoDist(key string, member1, member2, unit string) (val float64, err error) {
|
func (s *Redis) GeoDist(key, member1, member2, unit string) (val float64, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -778,7 +795,7 @@ func (s *Redis) Lpush(key string, values ...interface{}) (val int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Lrange is the implementation of redis lrange command.
|
// Lrange is the implementation of redis lrange command.
|
||||||
func (s *Redis) Lrange(key string, start int, stop int) (val []string, err error) {
|
func (s *Redis) Lrange(key string, start, stop int) (val []string, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -928,7 +945,6 @@ func (s *Redis) Pipelined(fn func(Pipeliner) error) (err error) {
|
|||||||
|
|
||||||
_, err = conn.Pipelined(fn)
|
_, err = conn.Pipelined(fn)
|
||||||
return err
|
return err
|
||||||
|
|
||||||
}, acceptable)
|
}, acceptable)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -1058,7 +1074,7 @@ func (s *Redis) ScriptLoad(script string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set is the implementation of redis set command.
|
// Set is the implementation of redis set command.
|
||||||
func (s *Redis) Set(key string, value string) error {
|
func (s *Redis) Set(key, value string) error {
|
||||||
return s.brk.DoWithAcceptable(func() error {
|
return s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1266,6 +1282,41 @@ func (s *Redis) Sdiffstore(destination string, keys ...string) (val int, err err
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sinter is the implementation of redis sinter command.
|
||||||
|
func (s *Redis) Sinter(keys ...string) (val []string, err error) {
|
||||||
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
|
conn, err := getRedis(s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
val, err = conn.SInter(keys...).Result()
|
||||||
|
return err
|
||||||
|
}, acceptable)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sinterstore is the implementation of redis sinterstore command.
|
||||||
|
func (s *Redis) Sinterstore(destination string, keys ...string) (val int, err error) {
|
||||||
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
|
conn, err := getRedis(s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := conn.SInterStore(destination, keys...).Result()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
val = int(v)
|
||||||
|
return nil
|
||||||
|
}, acceptable)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Ttl is the implementation of redis ttl command.
|
// Ttl is the implementation of redis ttl command.
|
||||||
func (s *Redis) Ttl(key string) (val int, err error) {
|
func (s *Redis) Ttl(key string) (val int, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
@@ -1396,7 +1447,7 @@ func (s *Redis) Zincrby(key string, increment int64, field string) (val int64, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Zscore is the implementation of redis zscore command.
|
// Zscore is the implementation of redis zscore command.
|
||||||
func (s *Redis) Zscore(key string, value string) (val int64, err error) {
|
func (s *Redis) Zscore(key, value string) (val int64, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1668,7 +1719,7 @@ func (s *Redis) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Zrevrank is the implementation of redis zrevrank command.
|
// Zrevrank is the implementation of redis zrevrank command.
|
||||||
func (s *Redis) Zrevrank(key string, field string) (val int64, err error) {
|
func (s *Redis) Zrevrank(key, field string) (val int64, err error) {
|
||||||
err = s.brk.DoWithAcceptable(func() error {
|
err = s.brk.DoWithAcceptable(func() error {
|
||||||
conn, err := getRedis(s)
|
conn, err := getRedis(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1697,6 +1748,27 @@ func (s *Redis) Zunionstore(dest string, store ZStore, keys ...string) (val int6
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cluster customizes the given Redis as a cluster.
|
||||||
|
func Cluster() Option {
|
||||||
|
return func(r *Redis) {
|
||||||
|
r.Type = ClusterType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPass customizes the given Redis with given password.
|
||||||
|
func WithPass(pass string) Option {
|
||||||
|
return func(r *Redis) {
|
||||||
|
r.Pass = pass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithTLS customizes the given Redis with TLS enabled.
|
||||||
|
func WithTLS() Option {
|
||||||
|
return func(r *Redis) {
|
||||||
|
r.tls = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func acceptable(err error) bool {
|
func acceptable(err error) bool {
|
||||||
return err == nil || err == red.Nil
|
return err == nil || err == red.Nil
|
||||||
}
|
}
|
||||||
@@ -1704,9 +1776,9 @@ func acceptable(err error) bool {
|
|||||||
func getRedis(r *Redis) (RedisNode, error) {
|
func getRedis(r *Redis) (RedisNode, error) {
|
||||||
switch r.Type {
|
switch r.Type {
|
||||||
case ClusterType:
|
case ClusterType:
|
||||||
return getCluster(r.Addr, r.Pass)
|
return getCluster(r)
|
||||||
case NodeType:
|
case NodeType:
|
||||||
return getClient(r.Addr, r.Pass)
|
return getClient(r)
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("redis type '%s' is not supported", r.Type)
|
return nil, fmt.Errorf("redis type '%s' is not supported", r.Type)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package redis
|
package redis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -14,7 +15,7 @@ import (
|
|||||||
|
|
||||||
func TestRedis_Exists(t *testing.T) {
|
func TestRedis_Exists(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Exists("a")
|
_, err := New(client.Addr, badType()).Exists("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Exists("a")
|
ok, err := client.Exists("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -26,9 +27,23 @@ func TestRedis_Exists(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRedisTLS_Exists(t *testing.T) {
|
||||||
|
runOnRedisTLS(t, func(client *Redis) {
|
||||||
|
_, err := New(client.Addr, badType()).Exists("a")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
ok, err := client.Exists("a")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
assert.False(t, ok)
|
||||||
|
assert.NotNil(t, client.Set("a", "b"))
|
||||||
|
ok, err = client.Exists("a")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
assert.False(t, ok)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestRedis_Eval(t *testing.T) {
|
func TestRedis_Eval(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
|
_, err := New(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
|
_, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})
|
||||||
assert.Equal(t, Nil, err)
|
assert.Equal(t, Nil, err)
|
||||||
@@ -53,7 +68,7 @@ func TestRedis_Hgetall(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hgetall("a")
|
_, err := New(client.Addr, badType()).Hgetall("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Hgetall("a")
|
vals, err := client.Hgetall("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -66,10 +81,10 @@ func TestRedis_Hgetall(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_Hvals(t *testing.T) {
|
func TestRedis_Hvals(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.NotNil(t, NewRedis(client.Addr, "").Hset("a", "aa", "aaa"))
|
assert.NotNil(t, New(client.Addr, badType()).Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hvals("a")
|
_, err := New(client.Addr, badType()).Hvals("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Hvals("a")
|
vals, err := client.Hvals("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -81,7 +96,7 @@ func TestRedis_Hsetnx(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hsetnx("a", "bb", "ccc")
|
_, err := New(client.Addr, badType()).Hsetnx("a", "bb", "ccc")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Hsetnx("a", "bb", "ccc")
|
ok, err := client.Hsetnx("a", "bb", "ccc")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -99,7 +114,7 @@ func TestRedis_HdelHlen(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hlen("a")
|
_, err := New(client.Addr, badType()).Hlen("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err := client.Hlen("a")
|
num, err := client.Hlen("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -115,7 +130,7 @@ func TestRedis_HdelHlen(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_HIncrBy(t *testing.T) {
|
func TestRedis_HIncrBy(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Hincrby("key", "field", 2)
|
_, err := New(client.Addr, badType()).Hincrby("key", "field", 2)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Hincrby("key", "field", 2)
|
val, err := client.Hincrby("key", "field", 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -130,7 +145,7 @@ func TestRedis_Hkeys(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hkeys("a")
|
_, err := New(client.Addr, badType()).Hkeys("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Hkeys("a")
|
vals, err := client.Hkeys("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -142,7 +157,7 @@ func TestRedis_Hmget(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
assert.Nil(t, client.Hset("a", "aa", "aaa"))
|
||||||
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
assert.Nil(t, client.Hset("a", "bb", "bbb"))
|
||||||
_, err := NewRedis(client.Addr, "").Hmget("a", "aa", "bb")
|
_, err := New(client.Addr, badType()).Hmget("a", "aa", "bb")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Hmget("a", "aa", "bb")
|
vals, err := client.Hmget("a", "aa", "bb")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -155,7 +170,7 @@ func TestRedis_Hmget(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_Hmset(t *testing.T) {
|
func TestRedis_Hmset(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.NotNil(t, NewRedis(client.Addr, "").Hmset("a", nil))
|
assert.NotNil(t, New(client.Addr, badType()).Hmset("a", nil))
|
||||||
assert.Nil(t, client.Hmset("a", map[string]string{
|
assert.Nil(t, client.Hmset("a", map[string]string{
|
||||||
"aa": "aaa",
|
"aa": "aaa",
|
||||||
"bb": "bbb",
|
"bb": "bbb",
|
||||||
@@ -179,7 +194,7 @@ func TestRedis_Hscan(t *testing.T) {
|
|||||||
var cursor uint64 = 0
|
var cursor uint64 = 0
|
||||||
sum := 0
|
sum := 0
|
||||||
for {
|
for {
|
||||||
_, _, err := NewRedis(client.Addr, "").Hscan(key, cursor, "*", 100)
|
_, _, err := New(client.Addr, badType()).Hscan(key, cursor, "*", 100)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
reMap, next, err := client.Hscan(key, cursor, "*", 100)
|
reMap, next, err := client.Hscan(key, cursor, "*", 100)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -191,7 +206,7 @@ func TestRedis_Hscan(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, sum, 3100)
|
assert.Equal(t, sum, 3100)
|
||||||
_, err = NewRedis(client.Addr, "").Del(key)
|
_, err = New(client.Addr, badType()).Del(key)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = client.Del(key)
|
_, err = client.Del(key)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -200,7 +215,7 @@ func TestRedis_Hscan(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_Incr(t *testing.T) {
|
func TestRedis_Incr(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Incr("a")
|
_, err := New(client.Addr, badType()).Incr("a")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Incr("a")
|
val, err := client.Incr("a")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -213,7 +228,7 @@ func TestRedis_Incr(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_IncrBy(t *testing.T) {
|
func TestRedis_IncrBy(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Incrby("a", 2)
|
_, err := New(client.Addr, badType()).Incrby("a", 2)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Incrby("a", 2)
|
val, err := client.Incrby("a", 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -230,7 +245,7 @@ func TestRedis_Keys(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "value2")
|
err = client.Set("key2", "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Keys("*")
|
_, err = New(client.Addr, badType()).Keys("*")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
keys, err := client.Keys("*")
|
keys, err := client.Keys("*")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -241,7 +256,7 @@ func TestRedis_Keys(t *testing.T) {
|
|||||||
func TestRedis_HyperLogLog(t *testing.T) {
|
func TestRedis_HyperLogLog(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
client.Ping()
|
client.Ping()
|
||||||
r := NewRedis(client.Addr, "")
|
r := New(client.Addr, badType())
|
||||||
_, err := r.Pfadd("key1")
|
_, err := r.Pfadd("key1")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = r.Pfcount("*")
|
_, err = r.Pfcount("*")
|
||||||
@@ -253,17 +268,17 @@ func TestRedis_HyperLogLog(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_List(t *testing.T) {
|
func TestRedis_List(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Lpush("key", "value1", "value2")
|
_, err := New(client.Addr, badType()).Lpush("key", "value1", "value2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Lpush("key", "value1", "value2")
|
val, err := client.Lpush("key", "value1", "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, val)
|
assert.Equal(t, 2, val)
|
||||||
_, err = NewRedis(client.Addr, "").Rpush("key", "value3", "value4")
|
_, err = New(client.Addr, badType()).Rpush("key", "value3", "value4")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err = client.Rpush("key", "value3", "value4")
|
val, err = client.Rpush("key", "value3", "value4")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 4, val)
|
assert.Equal(t, 4, val)
|
||||||
_, err = NewRedis(client.Addr, "").Llen("key")
|
_, err = New(client.Addr, badType()).Llen("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err = client.Llen("key")
|
val, err = client.Llen("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -271,7 +286,7 @@ func TestRedis_List(t *testing.T) {
|
|||||||
vals, err := client.Lrange("key", 0, 10)
|
vals, err := client.Lrange("key", 0, 10)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.EqualValues(t, []string{"value2", "value1", "value3", "value4"}, vals)
|
assert.EqualValues(t, []string{"value2", "value1", "value3", "value4"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").Lpop("key")
|
_, err = New(client.Addr, badType()).Lpop("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
v, err := client.Lpop("key")
|
v, err := client.Lpop("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -279,7 +294,7 @@ func TestRedis_List(t *testing.T) {
|
|||||||
val, err = client.Lpush("key", "value1", "value2")
|
val, err = client.Lpush("key", "value1", "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 5, val)
|
assert.Equal(t, 5, val)
|
||||||
_, err = NewRedis(client.Addr, "").Rpop("key")
|
_, err = New(client.Addr, badType()).Rpop("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
v, err = client.Rpop("key")
|
v, err = client.Rpop("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -287,12 +302,12 @@ func TestRedis_List(t *testing.T) {
|
|||||||
val, err = client.Rpush("key", "value4", "value3", "value3")
|
val, err = client.Rpush("key", "value4", "value3", "value3")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 7, val)
|
assert.Equal(t, 7, val)
|
||||||
_, err = NewRedis(client.Addr, "").Lrem("key", 2, "value1")
|
_, err = New(client.Addr, badType()).Lrem("key", 2, "value1")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
n, err := client.Lrem("key", 2, "value1")
|
n, err := client.Lrem("key", 2, "value1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, n)
|
assert.Equal(t, 2, n)
|
||||||
_, err = NewRedis(client.Addr, "").Lrange("key", 0, 10)
|
_, err = New(client.Addr, badType()).Lrange("key", 0, 10)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Lrange("key", 0, 10)
|
vals, err = client.Lrange("key", 0, 10)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -312,7 +327,7 @@ func TestRedis_Mget(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "value2")
|
err = client.Set("key2", "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Mget("key1", "key0", "key2", "key3")
|
_, err = New(client.Addr, badType()).Mget("key1", "key0", "key2", "key3")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Mget("key1", "key0", "key2", "key3")
|
vals, err := client.Mget("key1", "key0", "key2", "key3")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -322,7 +337,7 @@ func TestRedis_Mget(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_SetBit(t *testing.T) {
|
func TestRedis_SetBit(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := NewRedis(client.Addr, "").SetBit("key", 1, 1)
|
err := New(client.Addr, badType()).SetBit("key", 1, 1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
err = client.SetBit("key", 1, 1)
|
err = client.SetBit("key", 1, 1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -333,7 +348,7 @@ func TestRedis_GetBit(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := client.SetBit("key", 2, 1)
|
err := client.SetBit("key", 2, 1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").GetBit("key", 2)
|
_, err = New(client.Addr, badType()).GetBit("key", 2)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.GetBit("key", 2)
|
val, err := client.GetBit("key", 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -348,7 +363,7 @@ func TestRedis_BitCount(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := NewRedis(client.Addr, "").BitCount("key", 0, -1)
|
_, err := New(client.Addr, badType()).BitCount("key", 0, -1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitCount("key", 0, -1)
|
val, err := client.BitCount("key", 0, -1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -369,7 +384,6 @@ func TestRedis_BitCount(t *testing.T) {
|
|||||||
val, err = client.BitCount("key", 2, 2)
|
val, err = client.BitCount("key", 2, 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(0), val)
|
assert.Equal(t, int64(0), val)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,14 +393,14 @@ func TestRedis_BitOpAnd(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "1")
|
err = client.Set("key2", "1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").BitOpAnd("destKey", "key1", "key2")
|
_, err = New(client.Addr, badType()).BitOpAnd("destKey", "key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitOpAnd("destKey", "key1", "key2")
|
val, err := client.BitOpAnd("destKey", "key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(1), val)
|
assert.Equal(t, int64(1), val)
|
||||||
valStr, err := client.Get("destKey")
|
valStr, err := client.Get("destKey")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
//destKey binary 110000 ascii 0
|
// destKey binary 110000 ascii 0
|
||||||
assert.Equal(t, "0", valStr)
|
assert.Equal(t, "0", valStr)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -395,7 +409,7 @@ func TestRedis_BitOpNot(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := client.Set("key1", "\u0000")
|
err := client.Set("key1", "\u0000")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").BitOpNot("destKey", "key1")
|
_, err = New(client.Addr, badType()).BitOpNot("destKey", "key1")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitOpNot("destKey", "key1")
|
val, err := client.BitOpNot("destKey", "key1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -412,7 +426,7 @@ func TestRedis_BitOpOr(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "0")
|
err = client.Set("key2", "0")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").BitOpOr("destKey", "key1", "key2")
|
_, err = New(client.Addr, badType()).BitOpOr("destKey", "key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitOpOr("destKey", "key1", "key2")
|
val, err := client.BitOpOr("destKey", "key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -429,7 +443,7 @@ func TestRedis_BitOpXor(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "\x0f")
|
err = client.Set("key2", "\x0f")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").BitOpXor("destKey", "key1", "key2")
|
_, err = New(client.Addr, badType()).BitOpXor("destKey", "key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitOpXor("destKey", "key1", "key2")
|
val, err := client.BitOpXor("destKey", "key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -439,13 +453,14 @@ func TestRedis_BitOpXor(t *testing.T) {
|
|||||||
assert.Equal(t, "\xf0", valStr)
|
assert.Equal(t, "\xf0", valStr)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRedis_BitPos(t *testing.T) {
|
func TestRedis_BitPos(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
//11111111 11110000 00000000
|
// 11111111 11110000 00000000
|
||||||
err := client.Set("key", "\xff\xf0\x00")
|
err := client.Set("key", "\xff\xf0\x00")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
||||||
_, err = NewRedis(client.Addr, "").BitPos("key", 0, 0, -1)
|
_, err = New(client.Addr, badType()).BitPos("key", 0, 0, -1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.BitPos("key", 0, 0, 2)
|
val, err := client.BitPos("key", 0, 0, 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -466,13 +481,12 @@ func TestRedis_BitPos(t *testing.T) {
|
|||||||
val, err = client.BitPos("key", 1, 2, 2)
|
val, err = client.BitPos("key", 1, 2, 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(-1), val)
|
assert.Equal(t, int64(-1), val)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRedis_Persist(t *testing.T) {
|
func TestRedis_Persist(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Persist("key")
|
_, err := New(client.Addr, badType()).Persist("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Persist("key")
|
ok, err := client.Persist("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -482,14 +496,14 @@ func TestRedis_Persist(t *testing.T) {
|
|||||||
ok, err = client.Persist("key")
|
ok, err = client.Persist("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.False(t, ok)
|
assert.False(t, ok)
|
||||||
err = NewRedis(client.Addr, "").Expire("key", 5)
|
err = New(client.Addr, badType()).Expire("key", 5)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
err = client.Expire("key", 5)
|
err = client.Expire("key", 5)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
ok, err = client.Persist("key")
|
ok, err = client.Persist("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
err = NewRedis(client.Addr, "").Expireat("key", time.Now().Unix()+5)
|
err = New(client.Addr, badType()).Expireat("key", time.Now().Unix()+5)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
err = client.Expireat("key", time.Now().Unix()+5)
|
err = client.Expireat("key", time.Now().Unix()+5)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -512,7 +526,7 @@ func TestRedis_Scan(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
err = client.Set("key2", "value2")
|
err = client.Set("key2", "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, _, err = NewRedis(client.Addr, "").Scan(0, "*", 100)
|
_, _, err = New(client.Addr, badType()).Scan(0, "*", 100)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
keys, _, err := client.Scan(0, "*", 100)
|
keys, _, err := client.Scan(0, "*", 100)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -534,7 +548,7 @@ func TestRedis_Sscan(t *testing.T) {
|
|||||||
var cursor uint64 = 0
|
var cursor uint64 = 0
|
||||||
sum := 0
|
sum := 0
|
||||||
for {
|
for {
|
||||||
_, _, err := NewRedis(client.Addr, "").Sscan(key, cursor, "", 100)
|
_, _, err := New(client.Addr, badType()).Sscan(key, cursor, "", 100)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
keys, next, err := client.Sscan(key, cursor, "", 100)
|
keys, next, err := client.Sscan(key, cursor, "", 100)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -546,7 +560,7 @@ func TestRedis_Sscan(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, sum, 1550)
|
assert.Equal(t, sum, 1550)
|
||||||
_, err = NewRedis(client.Addr, "").Del(key)
|
_, err = New(client.Addr, badType()).Del(key)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = client.Del(key)
|
_, err = client.Del(key)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -555,48 +569,48 @@ func TestRedis_Sscan(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_Set(t *testing.T) {
|
func TestRedis_Set(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
_, err := NewRedis(client.Addr, "").Sadd("key", 1, 2, 3, 4)
|
_, err := New(client.Addr, badType()).Sadd("key", 1, 2, 3, 4)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err := client.Sadd("key", 1, 2, 3, 4)
|
num, err := client.Sadd("key", 1, 2, 3, 4)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 4, num)
|
assert.Equal(t, 4, num)
|
||||||
_, err = NewRedis(client.Addr, "").Scard("key")
|
_, err = New(client.Addr, badType()).Scard("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Scard("key")
|
val, err := client.Scard("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(4), val)
|
assert.Equal(t, int64(4), val)
|
||||||
_, err = NewRedis(client.Addr, "").Sismember("key", 2)
|
_, err = New(client.Addr, badType()).Sismember("key", 2)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Sismember("key", 2)
|
ok, err := client.Sismember("key", 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
_, err = NewRedis(client.Addr, "").Srem("key", 3, 4)
|
_, err = New(client.Addr, badType()).Srem("key", 3, 4)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Srem("key", 3, 4)
|
num, err = client.Srem("key", 3, 4)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, num)
|
assert.Equal(t, 2, num)
|
||||||
_, err = NewRedis(client.Addr, "").Smembers("key")
|
_, err = New(client.Addr, badType()).Smembers("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Smembers("key")
|
vals, err := client.Smembers("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.ElementsMatch(t, []string{"1", "2"}, vals)
|
assert.ElementsMatch(t, []string{"1", "2"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").Srandmember("key", 1)
|
_, err = New(client.Addr, badType()).Srandmember("key", 1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
members, err := client.Srandmember("key", 1)
|
members, err := client.Srandmember("key", 1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Len(t, members, 1)
|
assert.Len(t, members, 1)
|
||||||
assert.Contains(t, []string{"1", "2"}, members[0])
|
assert.Contains(t, []string{"1", "2"}, members[0])
|
||||||
_, err = NewRedis(client.Addr, "").Spop("key")
|
_, err = New(client.Addr, badType()).Spop("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
member, err := client.Spop("key")
|
member, err := client.Spop("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Contains(t, []string{"1", "2"}, member)
|
assert.Contains(t, []string{"1", "2"}, member)
|
||||||
_, err = NewRedis(client.Addr, "").Smembers("key")
|
_, err = New(client.Addr, badType()).Smembers("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Smembers("key")
|
vals, err = client.Smembers("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.NotContains(t, vals, member)
|
assert.NotContains(t, vals, member)
|
||||||
_, err = NewRedis(client.Addr, "").Sadd("key1", 1, 2, 3, 4)
|
_, err = New(client.Addr, badType()).Sadd("key1", 1, 2, 3, 4)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Sadd("key1", 1, 2, 3, 4)
|
num, err = client.Sadd("key1", 1, 2, 3, 4)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -604,36 +618,46 @@ func TestRedis_Set(t *testing.T) {
|
|||||||
num, err = client.Sadd("key2", 2, 3, 4, 5)
|
num, err = client.Sadd("key2", 2, 3, 4, 5)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 4, num)
|
assert.Equal(t, 4, num)
|
||||||
_, err = NewRedis(client.Addr, "").Sunion("key1", "key2")
|
_, err = New(client.Addr, badType()).Sunion("key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Sunion("key1", "key2")
|
vals, err = client.Sunion("key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.ElementsMatch(t, []string{"1", "2", "3", "4", "5"}, vals)
|
assert.ElementsMatch(t, []string{"1", "2", "3", "4", "5"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").Sunionstore("key3", "key1", "key2")
|
_, err = New(client.Addr, badType()).Sunionstore("key3", "key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Sunionstore("key3", "key1", "key2")
|
num, err = client.Sunionstore("key3", "key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 5, num)
|
assert.Equal(t, 5, num)
|
||||||
_, err = NewRedis(client.Addr, "").Sdiff("key1", "key2")
|
_, err = New(client.Addr, badType()).Sdiff("key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Sdiff("key1", "key2")
|
vals, err = client.Sdiff("key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.EqualValues(t, []string{"1"}, vals)
|
assert.EqualValues(t, []string{"1"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").Sdiffstore("key4", "key1", "key2")
|
_, err = New(client.Addr, badType()).Sdiffstore("key4", "key1", "key2")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Sdiffstore("key4", "key1", "key2")
|
num, err = client.Sdiffstore("key4", "key1", "key2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 1, num)
|
assert.Equal(t, 1, num)
|
||||||
|
_, err = New(client.Addr, badType()).Sinter("key1", "key2")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
vals, err = client.Sinter("key1", "key2")
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.ElementsMatch(t, []string{"2", "3", "4"}, vals)
|
||||||
|
_, err = New(client.Addr, badType()).Sinterstore("key4", "key1", "key2")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
num, err = client.Sinterstore("key4", "key1", "key2")
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.Equal(t, 3, num)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRedis_SetGetDel(t *testing.T) {
|
func TestRedis_SetGetDel(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := NewRedis(client.Addr, "").Set("hello", "world")
|
err := New(client.Addr, badType()).Set("hello", "world")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
err = client.Set("hello", "world")
|
err = client.Set("hello", "world")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Get("hello")
|
_, err = New(client.Addr, badType()).Get("hello")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Get("hello")
|
val, err := client.Get("hello")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -646,11 +670,11 @@ func TestRedis_SetGetDel(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_SetExNx(t *testing.T) {
|
func TestRedis_SetExNx(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := NewRedis(client.Addr, "").Setex("hello", "world", 5)
|
err := New(client.Addr, badType()).Setex("hello", "world", 5)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
err = client.Setex("hello", "world", 5)
|
err = client.Setex("hello", "world", 5)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Setnx("hello", "newworld")
|
_, err = New(client.Addr, badType()).Setnx("hello", "newworld")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Setnx("hello", "newworld")
|
ok, err := client.Setnx("hello", "newworld")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -667,7 +691,7 @@ func TestRedis_SetExNx(t *testing.T) {
|
|||||||
ttl, err := client.Ttl("hello")
|
ttl, err := client.Ttl("hello")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ttl > 0)
|
assert.True(t, ttl > 0)
|
||||||
_, err = NewRedis(client.Addr, "").SetnxEx("newhello", "newworld", 5)
|
_, err = New(client.Addr, badType()).SetnxEx("newhello", "newworld", 5)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err = client.SetnxEx("newhello", "newworld", 5)
|
ok, err = client.SetnxEx("newhello", "newworld", 5)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -688,17 +712,17 @@ func TestRedis_SetGetDelHashField(t *testing.T) {
|
|||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
err := client.Hset("key", "field", "value")
|
err := client.Hset("key", "field", "value")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Hget("key", "field")
|
_, err = New(client.Addr, badType()).Hget("key", "field")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err := client.Hget("key", "field")
|
val, err := client.Hget("key", "field")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, "value", val)
|
assert.Equal(t, "value", val)
|
||||||
_, err = NewRedis(client.Addr, "").Hexists("key", "field")
|
_, err = New(client.Addr, badType()).Hexists("key", "field")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err := client.Hexists("key", "field")
|
ok, err := client.Hexists("key", "field")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
_, err = NewRedis(client.Addr, "").Hdel("key", "field")
|
_, err = New(client.Addr, badType()).Hdel("key", "field")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ret, err := client.Hdel("key", "field")
|
ret, err := client.Hdel("key", "field")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -720,17 +744,17 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
val, err := client.Zscore("key", "value1")
|
val, err := client.Zscore("key", "value1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(2), val)
|
assert.Equal(t, int64(2), val)
|
||||||
_, err = NewRedis(client.Addr, "").Zincrby("key", 3, "value1")
|
_, err = New(client.Addr, badType()).Zincrby("key", 3, "value1")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err = client.Zincrby("key", 3, "value1")
|
val, err = client.Zincrby("key", 3, "value1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(5), val)
|
assert.Equal(t, int64(5), val)
|
||||||
_, err = NewRedis(client.Addr, "").Zscore("key", "value1")
|
_, err = New(client.Addr, badType()).Zscore("key", "value1")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err = client.Zscore("key", "value1")
|
val, err = client.Zscore("key", "value1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(5), val)
|
assert.Equal(t, int64(5), val)
|
||||||
_, err = NewRedis(client.Addr, "").Zadds("key")
|
_, err = New(client.Addr, badType()).Zadds("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
val, err = client.Zadds("key", Pair{
|
val, err = client.Zadds("key", Pair{
|
||||||
Key: "value2",
|
Key: "value2",
|
||||||
@@ -741,7 +765,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
})
|
})
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(2), val)
|
assert.Equal(t, int64(2), val)
|
||||||
_, err = NewRedis(client.Addr, "").ZRevRangeWithScores("key", 1, 3)
|
_, err = New(client.Addr, badType()).ZRevRangeWithScores("key", 1, 3)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err := client.ZRevRangeWithScores("key", 1, 3)
|
pairs, err := client.ZRevRangeWithScores("key", 1, 3)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -761,11 +785,11 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
rank, err = client.Zrevrank("key", "value1")
|
rank, err = client.Zrevrank("key", "value1")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(2), rank)
|
assert.Equal(t, int64(2), rank)
|
||||||
_, err = NewRedis(client.Addr, "").Zrank("key", "value4")
|
_, err = New(client.Addr, badType()).Zrank("key", "value4")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = client.Zrank("key", "value4")
|
_, err = client.Zrank("key", "value4")
|
||||||
assert.Equal(t, Nil, err)
|
assert.Equal(t, Nil, err)
|
||||||
_, err = NewRedis(client.Addr, "").Zrem("key", "value2", "value3")
|
_, err = New(client.Addr, badType()).Zrem("key", "value2", "value3")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err := client.Zrem("key", "value2", "value3")
|
num, err := client.Zrem("key", "value2", "value3")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -779,7 +803,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
ok, err = client.Zadd("key", 8, "value4")
|
ok, err = client.Zadd("key", 8, "value4")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
_, err = NewRedis(client.Addr, "").Zremrangebyscore("key", 6, 7)
|
_, err = New(client.Addr, badType()).Zremrangebyscore("key", 6, 7)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Zremrangebyscore("key", 6, 7)
|
num, err = client.Zremrangebyscore("key", 6, 7)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -787,37 +811,37 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
ok, err = client.Zadd("key", 6, "value2")
|
ok, err = client.Zadd("key", 6, "value2")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
_, err = NewRedis(client.Addr, "").Zadd("key", 7, "value3")
|
_, err = New(client.Addr, badType()).Zadd("key", 7, "value3")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ok, err = client.Zadd("key", 7, "value3")
|
ok, err = client.Zadd("key", 7, "value3")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.True(t, ok)
|
assert.True(t, ok)
|
||||||
_, err = NewRedis(client.Addr, "").Zcount("key", 6, 7)
|
_, err = New(client.Addr, badType()).Zcount("key", 6, 7)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Zcount("key", 6, 7)
|
num, err = client.Zcount("key", 6, 7)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, num)
|
assert.Equal(t, 2, num)
|
||||||
_, err = NewRedis(client.Addr, "").Zremrangebyrank("key", 1, 2)
|
_, err = New(client.Addr, badType()).Zremrangebyrank("key", 1, 2)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
num, err = client.Zremrangebyrank("key", 1, 2)
|
num, err = client.Zremrangebyrank("key", 1, 2)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, num)
|
assert.Equal(t, 2, num)
|
||||||
_, err = NewRedis(client.Addr, "").Zcard("key")
|
_, err = New(client.Addr, badType()).Zcard("key")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
card, err := client.Zcard("key")
|
card, err := client.Zcard("key")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 2, card)
|
assert.Equal(t, 2, card)
|
||||||
_, err = NewRedis(client.Addr, "").Zrange("key", 0, -1)
|
_, err = New(client.Addr, badType()).Zrange("key", 0, -1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err := client.Zrange("key", 0, -1)
|
vals, err := client.Zrange("key", 0, -1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.EqualValues(t, []string{"value1", "value4"}, vals)
|
assert.EqualValues(t, []string{"value1", "value4"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").Zrevrange("key", 0, -1)
|
_, err = New(client.Addr, badType()).Zrevrange("key", 0, -1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Zrevrange("key", 0, -1)
|
vals, err = client.Zrevrange("key", 0, -1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.EqualValues(t, []string{"value4", "value1"}, vals)
|
assert.EqualValues(t, []string{"value4", "value1"}, vals)
|
||||||
_, err = NewRedis(client.Addr, "").ZrangeWithScores("key", 0, -1)
|
_, err = New(client.Addr, badType()).ZrangeWithScores("key", 0, -1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err = client.ZrangeWithScores("key", 0, -1)
|
pairs, err = client.ZrangeWithScores("key", 0, -1)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -831,7 +855,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
Score: 8,
|
Score: 8,
|
||||||
},
|
},
|
||||||
}, pairs)
|
}, pairs)
|
||||||
_, err = NewRedis(client.Addr, "").ZrangebyscoreWithScores("key", 5, 8)
|
_, err = New(client.Addr, badType()).ZrangebyscoreWithScores("key", 5, 8)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err = client.ZrangebyscoreWithScores("key", 5, 8)
|
pairs, err = client.ZrangebyscoreWithScores("key", 5, 8)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -845,7 +869,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
Score: 8,
|
Score: 8,
|
||||||
},
|
},
|
||||||
}, pairs)
|
}, pairs)
|
||||||
_, err = NewRedis(client.Addr, "").ZrangebyscoreWithScoresAndLimit(
|
_, err = New(client.Addr, badType()).ZrangebyscoreWithScoresAndLimit(
|
||||||
"key", 5, 8, 1, 1)
|
"key", 5, 8, 1, 1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
|
pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
|
||||||
@@ -859,7 +883,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
|
pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(pairs))
|
assert.Equal(t, 0, len(pairs))
|
||||||
_, err = NewRedis(client.Addr, "").ZrevrangebyscoreWithScores("key", 5, 8)
|
_, err = New(client.Addr, badType()).ZrevrangebyscoreWithScores("key", 5, 8)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err = client.ZrevrangebyscoreWithScores("key", 5, 8)
|
pairs, err = client.ZrevrangebyscoreWithScores("key", 5, 8)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -873,7 +897,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
Score: 5,
|
Score: 5,
|
||||||
},
|
},
|
||||||
}, pairs)
|
}, pairs)
|
||||||
_, err = NewRedis(client.Addr, "").ZrevrangebyscoreWithScoresAndLimit(
|
_, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresAndLimit(
|
||||||
"key", 5, 8, 1, 1)
|
"key", 5, 8, 1, 1)
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
|
pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1)
|
||||||
@@ -887,7 +911,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
|
pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 0, len(pairs))
|
assert.Equal(t, 0, len(pairs))
|
||||||
_, err = NewRedis(client.Addr, "").Zrevrank("key", "value")
|
_, err = New(client.Addr, badType()).Zrevrank("key", "value")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
client.Zadd("second", 2, "aa")
|
client.Zadd("second", 2, "aa")
|
||||||
client.Zadd("third", 3, "bbb")
|
client.Zadd("third", 3, "bbb")
|
||||||
@@ -897,6 +921,8 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
}, "second", "third")
|
}, "second", "third")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(2), val)
|
assert.Equal(t, int64(2), val)
|
||||||
|
_, err = New(client.Addr, badType()).Zunionstore("union", ZStore{})
|
||||||
|
assert.NotNil(t, err)
|
||||||
vals, err = client.Zrange("union", 0, 10000)
|
vals, err = client.Zrange("union", 0, 10000)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.EqualValues(t, []string{"aa", "bbb"}, vals)
|
assert.EqualValues(t, []string{"aa", "bbb"}, vals)
|
||||||
@@ -908,7 +934,7 @@ func TestRedis_SortedSet(t *testing.T) {
|
|||||||
|
|
||||||
func TestRedis_Pipelined(t *testing.T) {
|
func TestRedis_Pipelined(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
assert.NotNil(t, NewRedis(client.Addr, "").Pipelined(func(pipeliner Pipeliner) error {
|
assert.NotNil(t, New(client.Addr, badType()).Pipelined(func(pipeliner Pipeliner) error {
|
||||||
return nil
|
return nil
|
||||||
}))
|
}))
|
||||||
err := client.Pipelined(
|
err := client.Pipelined(
|
||||||
@@ -920,7 +946,7 @@ func TestRedis_Pipelined(t *testing.T) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
_, err = NewRedis(client.Addr, "").Ttl("pipelined_counter")
|
_, err = New(client.Addr, badType()).Ttl("pipelined_counter")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
ttl, err := client.Ttl("pipelined_counter")
|
ttl, err := client.Ttl("pipelined_counter")
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -940,14 +966,14 @@ func TestRedisString(t *testing.T) {
|
|||||||
_, err := getRedis(NewRedis(client.Addr, ClusterType))
|
_, err := getRedis(NewRedis(client.Addr, ClusterType))
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, client.Addr, client.String())
|
assert.Equal(t, client.Addr, client.String())
|
||||||
assert.NotNil(t, NewRedis(client.Addr, "").Ping())
|
assert.NotNil(t, New(client.Addr, badType()).Ping())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRedisScriptLoad(t *testing.T) {
|
func TestRedisScriptLoad(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
client.Ping()
|
client.Ping()
|
||||||
_, err := NewRedis(client.Addr, "").ScriptLoad("foo")
|
_, err := New(client.Addr, badType()).ScriptLoad("foo")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
_, err = client.ScriptLoad("foo")
|
_, err = client.ScriptLoad("foo")
|
||||||
assert.NotNil(t, err)
|
assert.NotNil(t, err)
|
||||||
@@ -1018,7 +1044,7 @@ func TestRedisBlpopEx(t *testing.T) {
|
|||||||
func TestRedisGeo(t *testing.T) {
|
func TestRedisGeo(t *testing.T) {
|
||||||
runOnRedis(t, func(client *Redis) {
|
runOnRedis(t, func(client *Redis) {
|
||||||
client.Ping()
|
client.Ping()
|
||||||
var geoLocation = []*GeoLocation{{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"}, {Longitude: 15.087269, Latitude: 37.502669, Name: "Catania"}}
|
geoLocation := []*GeoLocation{{Longitude: 13.361389, Latitude: 38.115556, Name: "Palermo"}, {Longitude: 15.087269, Latitude: 37.502669, Name: "Catania"}}
|
||||||
v, err := client.GeoAdd("sicily", geoLocation...)
|
v, err := client.GeoAdd("sicily", geoLocation...)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(2), v)
|
assert.Equal(t, int64(2), v)
|
||||||
@@ -1036,7 +1062,7 @@ func TestRedisGeo(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(v4[0].Dist), int64(190))
|
assert.Equal(t, int64(v4[0].Dist), int64(190))
|
||||||
assert.Equal(t, int64(v4[1].Dist), int64(56))
|
assert.Equal(t, int64(v4[1].Dist), int64(56))
|
||||||
var geoLocation2 = []*GeoLocation{{Longitude: 13.583333, Latitude: 37.316667, Name: "Agrigento"}}
|
geoLocation2 := []*GeoLocation{{Longitude: 13.583333, Latitude: 37.316667, Name: "Agrigento"}}
|
||||||
v5, err := client.GeoAdd("sicily", geoLocation2...)
|
v5, err := client.GeoAdd("sicily", geoLocation2...)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, int64(1), v5)
|
assert.Equal(t, int64(1), v5)
|
||||||
@@ -1047,6 +1073,13 @@ func TestRedisGeo(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRedis_WithPass(t *testing.T) {
|
||||||
|
runOnRedis(t, func(client *Redis) {
|
||||||
|
err := NewRedis(client.Addr, NodeType, "any").Ping()
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func runOnRedis(t *testing.T, fn func(client *Redis)) {
|
func runOnRedis(t *testing.T, fn func(client *Redis)) {
|
||||||
s, err := miniredis.Run()
|
s, err := miniredis.Run()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -1062,10 +1095,35 @@ func runOnRedis(t *testing.T, fn func(client *Redis)) {
|
|||||||
client.Close()
|
client.Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
fn(NewRedis(s.Addr(), NodeType))
|
fn(NewRedis(s.Addr(), NodeType))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func runOnRedisTLS(t *testing.T, fn func(client *Redis)) {
|
||||||
|
s, err := miniredis.RunTLS(&tls.Config{
|
||||||
|
Certificates: make([]tls.Certificate, 1),
|
||||||
|
InsecureSkipVerify: true,
|
||||||
|
})
|
||||||
|
assert.Nil(t, err)
|
||||||
|
defer func() {
|
||||||
|
client, err := clientManager.GetResource(s.Addr(), func() (io.Closer, error) {
|
||||||
|
return nil, errors.New("should already exist")
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if client != nil {
|
||||||
|
client.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
fn(New(s.Addr(), WithTLS()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func badType() Option {
|
||||||
|
return func(r *Redis) {
|
||||||
|
r.Type = "bad"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type mockedNode struct {
|
type mockedNode struct {
|
||||||
RedisNode
|
RedisNode
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package redis
|
package redis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
red "github.com/go-redis/redis"
|
red "github.com/go-redis/redis"
|
||||||
@@ -15,14 +16,21 @@ const (
|
|||||||
|
|
||||||
var clientManager = syncx.NewResourceManager()
|
var clientManager = syncx.NewResourceManager()
|
||||||
|
|
||||||
func getClient(server, pass string) (*red.Client, error) {
|
func getClient(r *Redis) (*red.Client, error) {
|
||||||
val, err := clientManager.GetResource(server, func() (io.Closer, error) {
|
val, err := clientManager.GetResource(r.Addr, func() (io.Closer, error) {
|
||||||
|
var tlsConfig *tls.Config
|
||||||
|
if r.tls {
|
||||||
|
tlsConfig = &tls.Config{
|
||||||
|
InsecureSkipVerify: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
store := red.NewClient(&red.Options{
|
store := red.NewClient(&red.Options{
|
||||||
Addr: server,
|
Addr: r.Addr,
|
||||||
Password: pass,
|
Password: r.Pass,
|
||||||
DB: defaultDatabase,
|
DB: defaultDatabase,
|
||||||
MaxRetries: maxRetries,
|
MaxRetries: maxRetries,
|
||||||
MinIdleConns: idleConns,
|
MinIdleConns: idleConns,
|
||||||
|
TLSConfig: tlsConfig,
|
||||||
})
|
})
|
||||||
store.WrapProcess(process)
|
store.WrapProcess(process)
|
||||||
return store, nil
|
return store, nil
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package redis
|
package redis
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
red "github.com/go-redis/redis"
|
red "github.com/go-redis/redis"
|
||||||
@@ -9,13 +10,20 @@ import (
|
|||||||
|
|
||||||
var clusterManager = syncx.NewResourceManager()
|
var clusterManager = syncx.NewResourceManager()
|
||||||
|
|
||||||
func getCluster(server, pass string) (*red.ClusterClient, error) {
|
func getCluster(r *Redis) (*red.ClusterClient, error) {
|
||||||
val, err := clusterManager.GetResource(server, func() (io.Closer, error) {
|
val, err := clusterManager.GetResource(r.Addr, func() (io.Closer, error) {
|
||||||
|
var tlsConfig *tls.Config
|
||||||
|
if r.tls {
|
||||||
|
tlsConfig = &tls.Config{
|
||||||
|
InsecureSkipVerify: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
store := red.NewClusterClient(&red.ClusterOptions{
|
store := red.NewClusterClient(&red.ClusterOptions{
|
||||||
Addrs: []string{server},
|
Addrs: []string{r.Addr},
|
||||||
Password: pass,
|
Password: r.Pass,
|
||||||
MaxRetries: maxRetries,
|
MaxRetries: maxRetries,
|
||||||
MinIdleConns: idleConns,
|
MinIdleConns: idleConns,
|
||||||
|
TLSConfig: tlsConfig,
|
||||||
})
|
})
|
||||||
store.WrapProcess(process)
|
store.WrapProcess(process)
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ func NewRedisLock(store *Redis, key string) *RedisLock {
|
|||||||
func (rl *RedisLock) Acquire() (bool, error) {
|
func (rl *RedisLock) Acquire() (bool, error) {
|
||||||
seconds := atomic.LoadUint32(&rl.seconds)
|
seconds := atomic.LoadUint32(&rl.seconds)
|
||||||
resp, err := rl.store.Eval(lockCommand, []string{rl.key}, []string{
|
resp, err := rl.store.Eval(lockCommand, []string{rl.key}, []string{
|
||||||
rl.id, strconv.Itoa(int(seconds)*millisPerSecond + tolerance)})
|
rl.id, strconv.Itoa(int(seconds)*millisPerSecond + tolerance),
|
||||||
|
})
|
||||||
if err == red.Nil {
|
if err == red.Nil {
|
||||||
return false, nil
|
return false, nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ func TestUnmarshalRowString(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowStruct(t *testing.T) {
|
func TestUnmarshalRowStruct(t *testing.T) {
|
||||||
var value = new(struct {
|
value := new(struct {
|
||||||
Name string
|
Name string
|
||||||
Age int
|
Age int
|
||||||
})
|
})
|
||||||
@@ -224,7 +224,7 @@ func TestUnmarshalRowStruct(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowStructWithTags(t *testing.T) {
|
func TestUnmarshalRowStructWithTags(t *testing.T) {
|
||||||
var value = new(struct {
|
value := new(struct {
|
||||||
Age int `db:"age"`
|
Age int `db:"age"`
|
||||||
Name string `db:"name"`
|
Name string `db:"name"`
|
||||||
})
|
})
|
||||||
@@ -242,7 +242,7 @@ func TestUnmarshalRowStructWithTags(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowStructWithTagsWrongColumns(t *testing.T) {
|
func TestUnmarshalRowStructWithTagsWrongColumns(t *testing.T) {
|
||||||
var value = new(struct {
|
value := new(struct {
|
||||||
Age *int `db:"age"`
|
Age *int `db:"age"`
|
||||||
Name string `db:"name"`
|
Name string `db:"name"`
|
||||||
})
|
})
|
||||||
@@ -259,7 +259,7 @@ func TestUnmarshalRowStructWithTagsWrongColumns(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsBool(t *testing.T) {
|
func TestUnmarshalRowsBool(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []bool{true, false}
|
expect := []bool{true, false}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -273,7 +273,7 @@ func TestUnmarshalRowsBool(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsInt(t *testing.T) {
|
func TestUnmarshalRowsInt(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []int{2, 3}
|
expect := []int{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -287,7 +287,7 @@ func TestUnmarshalRowsInt(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsInt8(t *testing.T) {
|
func TestUnmarshalRowsInt8(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []int8{2, 3}
|
expect := []int8{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -301,7 +301,7 @@ func TestUnmarshalRowsInt8(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsInt16(t *testing.T) {
|
func TestUnmarshalRowsInt16(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []int16{2, 3}
|
expect := []int16{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -315,7 +315,7 @@ func TestUnmarshalRowsInt16(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsInt32(t *testing.T) {
|
func TestUnmarshalRowsInt32(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []int32{2, 3}
|
expect := []int32{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -329,7 +329,7 @@ func TestUnmarshalRowsInt32(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsInt64(t *testing.T) {
|
func TestUnmarshalRowsInt64(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []int64{2, 3}
|
expect := []int64{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -343,7 +343,7 @@ func TestUnmarshalRowsInt64(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsUint(t *testing.T) {
|
func TestUnmarshalRowsUint(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []uint{2, 3}
|
expect := []uint{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -357,7 +357,7 @@ func TestUnmarshalRowsUint(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsUint8(t *testing.T) {
|
func TestUnmarshalRowsUint8(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []uint8{2, 3}
|
expect := []uint8{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -371,7 +371,7 @@ func TestUnmarshalRowsUint8(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsUint16(t *testing.T) {
|
func TestUnmarshalRowsUint16(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []uint16{2, 3}
|
expect := []uint16{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@ func TestUnmarshalRowsUint16(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsUint32(t *testing.T) {
|
func TestUnmarshalRowsUint32(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []uint32{2, 3}
|
expect := []uint32{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -399,7 +399,7 @@ func TestUnmarshalRowsUint32(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsUint64(t *testing.T) {
|
func TestUnmarshalRowsUint64(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []uint64{2, 3}
|
expect := []uint64{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -413,7 +413,7 @@ func TestUnmarshalRowsUint64(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsFloat32(t *testing.T) {
|
func TestUnmarshalRowsFloat32(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []float32{2, 3}
|
expect := []float32{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -427,7 +427,7 @@ func TestUnmarshalRowsFloat32(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsFloat64(t *testing.T) {
|
func TestUnmarshalRowsFloat64(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []float64{2, 3}
|
expect := []float64{2, 3}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -441,7 +441,7 @@ func TestUnmarshalRowsFloat64(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnmarshalRowsString(t *testing.T) {
|
func TestUnmarshalRowsString(t *testing.T) {
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []string{"hello", "world"}
|
expect := []string{"hello", "world"}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -457,7 +457,7 @@ func TestUnmarshalRowsBoolPtr(t *testing.T) {
|
|||||||
yes := true
|
yes := true
|
||||||
no := false
|
no := false
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*bool{&yes, &no}
|
expect := []*bool{&yes, &no}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("1\n0")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -473,7 +473,7 @@ func TestUnmarshalRowsIntPtr(t *testing.T) {
|
|||||||
two := 2
|
two := 2
|
||||||
three := 3
|
three := 3
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*int{&two, &three}
|
expect := []*int{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -489,7 +489,7 @@ func TestUnmarshalRowsInt8Ptr(t *testing.T) {
|
|||||||
two := int8(2)
|
two := int8(2)
|
||||||
three := int8(3)
|
three := int8(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*int8{&two, &three}
|
expect := []*int8{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -505,7 +505,7 @@ func TestUnmarshalRowsInt16Ptr(t *testing.T) {
|
|||||||
two := int16(2)
|
two := int16(2)
|
||||||
three := int16(3)
|
three := int16(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*int16{&two, &three}
|
expect := []*int16{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -521,7 +521,7 @@ func TestUnmarshalRowsInt32Ptr(t *testing.T) {
|
|||||||
two := int32(2)
|
two := int32(2)
|
||||||
three := int32(3)
|
three := int32(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*int32{&two, &three}
|
expect := []*int32{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -537,7 +537,7 @@ func TestUnmarshalRowsInt64Ptr(t *testing.T) {
|
|||||||
two := int64(2)
|
two := int64(2)
|
||||||
three := int64(3)
|
three := int64(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*int64{&two, &three}
|
expect := []*int64{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -553,7 +553,7 @@ func TestUnmarshalRowsUintPtr(t *testing.T) {
|
|||||||
two := uint(2)
|
two := uint(2)
|
||||||
three := uint(3)
|
three := uint(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*uint{&two, &three}
|
expect := []*uint{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -569,7 +569,7 @@ func TestUnmarshalRowsUint8Ptr(t *testing.T) {
|
|||||||
two := uint8(2)
|
two := uint8(2)
|
||||||
three := uint8(3)
|
three := uint8(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*uint8{&two, &three}
|
expect := []*uint8{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -585,7 +585,7 @@ func TestUnmarshalRowsUint16Ptr(t *testing.T) {
|
|||||||
two := uint16(2)
|
two := uint16(2)
|
||||||
three := uint16(3)
|
three := uint16(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*uint16{&two, &three}
|
expect := []*uint16{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -601,7 +601,7 @@ func TestUnmarshalRowsUint32Ptr(t *testing.T) {
|
|||||||
two := uint32(2)
|
two := uint32(2)
|
||||||
three := uint32(3)
|
three := uint32(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*uint32{&two, &three}
|
expect := []*uint32{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -617,7 +617,7 @@ func TestUnmarshalRowsUint64Ptr(t *testing.T) {
|
|||||||
two := uint64(2)
|
two := uint64(2)
|
||||||
three := uint64(3)
|
three := uint64(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*uint64{&two, &three}
|
expect := []*uint64{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -633,7 +633,7 @@ func TestUnmarshalRowsFloat32Ptr(t *testing.T) {
|
|||||||
two := float32(2)
|
two := float32(2)
|
||||||
three := float32(3)
|
three := float32(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*float32{&two, &three}
|
expect := []*float32{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -649,7 +649,7 @@ func TestUnmarshalRowsFloat64Ptr(t *testing.T) {
|
|||||||
two := float64(2)
|
two := float64(2)
|
||||||
three := float64(3)
|
three := float64(3)
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*float64{&two, &three}
|
expect := []*float64{&two, &three}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("2\n3")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -665,7 +665,7 @@ func TestUnmarshalRowsStringPtr(t *testing.T) {
|
|||||||
hello := "hello"
|
hello := "hello"
|
||||||
world := "world"
|
world := "world"
|
||||||
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
runOrmTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) {
|
||||||
var expect = []*string{&hello, &world}
|
expect := []*string{&hello, &world}
|
||||||
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
|
rs := sqlmock.NewRows([]string{"value"}).FromCSVString("hello\nworld")
|
||||||
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
mock.ExpectQuery("select (.+) from users where user=?").WithArgs("anyone").WillReturnRows(rs)
|
||||||
|
|
||||||
@@ -678,7 +678,7 @@ func TestUnmarshalRowsStringPtr(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStruct(t *testing.T) {
|
func TestUnmarshalRowsStruct(t *testing.T) {
|
||||||
var expect = []struct {
|
expect := []struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
}{
|
}{
|
||||||
@@ -711,7 +711,7 @@ func TestUnmarshalRowsStruct(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStructWithNullStringType(t *testing.T) {
|
func TestUnmarshalRowsStructWithNullStringType(t *testing.T) {
|
||||||
var expect = []struct {
|
expect := []struct {
|
||||||
Name string
|
Name string
|
||||||
NullString sql.NullString
|
NullString sql.NullString
|
||||||
}{
|
}{
|
||||||
@@ -752,7 +752,7 @@ func TestUnmarshalRowsStructWithNullStringType(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStructWithTags(t *testing.T) {
|
func TestUnmarshalRowsStructWithTags(t *testing.T) {
|
||||||
var expect = []struct {
|
expect := []struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
}{
|
}{
|
||||||
@@ -789,7 +789,7 @@ func TestUnmarshalRowsStructAndEmbeddedAnonymousStructWithTags(t *testing.T) {
|
|||||||
Value int64 `db:"value"`
|
Value int64 `db:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var expect = []struct {
|
expect := []struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
Value int64
|
Value int64
|
||||||
@@ -831,7 +831,7 @@ func TestUnmarshalRowsStructAndEmbeddedStructPtrAnonymousWithTags(t *testing.T)
|
|||||||
Value int64 `db:"value"`
|
Value int64 `db:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var expect = []struct {
|
expect := []struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
Value int64
|
Value int64
|
||||||
@@ -869,7 +869,7 @@ func TestUnmarshalRowsStructAndEmbeddedStructPtrAnonymousWithTags(t *testing.T)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStructPtr(t *testing.T) {
|
func TestUnmarshalRowsStructPtr(t *testing.T) {
|
||||||
var expect = []*struct {
|
expect := []*struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
}{
|
}{
|
||||||
@@ -902,7 +902,7 @@ func TestUnmarshalRowsStructPtr(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStructWithTagsPtr(t *testing.T) {
|
func TestUnmarshalRowsStructWithTagsPtr(t *testing.T) {
|
||||||
var expect = []*struct {
|
expect := []*struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
}{
|
}{
|
||||||
@@ -935,7 +935,7 @@ func TestUnmarshalRowsStructWithTagsPtr(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalRowsStructWithTagsPtrWithInnerPtr(t *testing.T) {
|
func TestUnmarshalRowsStructWithTagsPtrWithInnerPtr(t *testing.T) {
|
||||||
var expect = []*struct {
|
expect := []*struct {
|
||||||
Name string
|
Name string
|
||||||
Age int64
|
Age int64
|
||||||
}{
|
}{
|
||||||
|
|||||||
@@ -56,7 +56,8 @@ type (
|
|||||||
}
|
}
|
||||||
|
|
||||||
statement struct {
|
statement struct {
|
||||||
stmt *sql.Stmt
|
query string
|
||||||
|
stmt *sql.Stmt
|
||||||
}
|
}
|
||||||
|
|
||||||
stmtConn interface {
|
stmtConn interface {
|
||||||
@@ -111,7 +112,8 @@ func (db *commonSqlConn) Prepare(query string) (stmt StmtSession, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stmt = statement{
|
stmt = statement{
|
||||||
stmt: st,
|
query: query,
|
||||||
|
stmt: st,
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}, db.acceptable)
|
}, db.acceptable)
|
||||||
@@ -181,29 +183,29 @@ func (s statement) Close() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s statement) Exec(args ...interface{}) (sql.Result, error) {
|
func (s statement) Exec(args ...interface{}) (sql.Result, error) {
|
||||||
return execStmt(s.stmt, args...)
|
return execStmt(s.stmt, s.query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s statement) QueryRow(v interface{}, args ...interface{}) error {
|
func (s statement) QueryRow(v interface{}, args ...interface{}) error {
|
||||||
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
||||||
return unmarshalRow(v, rows, true)
|
return unmarshalRow(v, rows, true)
|
||||||
}, args...)
|
}, s.query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s statement) QueryRowPartial(v interface{}, args ...interface{}) error {
|
func (s statement) QueryRowPartial(v interface{}, args ...interface{}) error {
|
||||||
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
||||||
return unmarshalRow(v, rows, false)
|
return unmarshalRow(v, rows, false)
|
||||||
}, args...)
|
}, s.query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s statement) QueryRows(v interface{}, args ...interface{}) error {
|
func (s statement) QueryRows(v interface{}, args ...interface{}) error {
|
||||||
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
||||||
return unmarshalRows(v, rows, true)
|
return unmarshalRows(v, rows, true)
|
||||||
}, args...)
|
}, s.query, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s statement) QueryRowsPartial(v interface{}, args ...interface{}) error {
|
func (s statement) QueryRowsPartial(v interface{}, args ...interface{}) error {
|
||||||
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
return queryStmt(s.stmt, func(rows *sql.Rows) error {
|
||||||
return unmarshalRows(v, rows, false)
|
return unmarshalRows(v, rows, false)
|
||||||
}, args...)
|
}, s.query, args...)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package sqlx
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
@@ -12,10 +11,14 @@ import (
|
|||||||
const slowThreshold = time.Millisecond * 500
|
const slowThreshold = time.Millisecond * 500
|
||||||
|
|
||||||
func exec(conn sessionConn, q string, args ...interface{}) (sql.Result, error) {
|
func exec(conn sessionConn, q string, args ...interface{}) (sql.Result, error) {
|
||||||
|
stmt, err := format(q, args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
startTime := timex.Now()
|
startTime := timex.Now()
|
||||||
result, err := conn.Exec(q, args...)
|
result, err := conn.Exec(q, args...)
|
||||||
duration := timex.Since(startTime)
|
duration := timex.Since(startTime)
|
||||||
stmt := formatForPrint(q, args)
|
|
||||||
if duration > slowThreshold {
|
if duration > slowThreshold {
|
||||||
logx.WithDuration(duration).Slowf("[SQL] exec: slowcall - %s", stmt)
|
logx.WithDuration(duration).Slowf("[SQL] exec: slowcall - %s", stmt)
|
||||||
} else {
|
} else {
|
||||||
@@ -28,11 +31,15 @@ func exec(conn sessionConn, q string, args ...interface{}) (sql.Result, error) {
|
|||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func execStmt(conn stmtConn, args ...interface{}) (sql.Result, error) {
|
func execStmt(conn stmtConn, q string, args ...interface{}) (sql.Result, error) {
|
||||||
|
stmt, err := format(q, args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
startTime := timex.Now()
|
startTime := timex.Now()
|
||||||
result, err := conn.Exec(args...)
|
result, err := conn.Exec(args...)
|
||||||
duration := timex.Since(startTime)
|
duration := timex.Since(startTime)
|
||||||
stmt := fmt.Sprint(args...)
|
|
||||||
if duration > slowThreshold {
|
if duration > slowThreshold {
|
||||||
logx.WithDuration(duration).Slowf("[SQL] execStmt: slowcall - %s", stmt)
|
logx.WithDuration(duration).Slowf("[SQL] execStmt: slowcall - %s", stmt)
|
||||||
} else {
|
} else {
|
||||||
@@ -46,10 +53,14 @@ func execStmt(conn stmtConn, args ...interface{}) (sql.Result, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func query(conn sessionConn, scanner func(*sql.Rows) error, q string, args ...interface{}) error {
|
func query(conn sessionConn, scanner func(*sql.Rows) error, q string, args ...interface{}) error {
|
||||||
|
stmt, err := format(q, args...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
startTime := timex.Now()
|
startTime := timex.Now()
|
||||||
rows, err := conn.Query(q, args...)
|
rows, err := conn.Query(q, args...)
|
||||||
duration := timex.Since(startTime)
|
duration := timex.Since(startTime)
|
||||||
stmt := fmt.Sprint(args...)
|
|
||||||
if duration > slowThreshold {
|
if duration > slowThreshold {
|
||||||
logx.WithDuration(duration).Slowf("[SQL] query: slowcall - %s", stmt)
|
logx.WithDuration(duration).Slowf("[SQL] query: slowcall - %s", stmt)
|
||||||
} else {
|
} else {
|
||||||
@@ -64,8 +75,12 @@ func query(conn sessionConn, scanner func(*sql.Rows) error, q string, args ...in
|
|||||||
return scanner(rows)
|
return scanner(rows)
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryStmt(conn stmtConn, scanner func(*sql.Rows) error, args ...interface{}) error {
|
func queryStmt(conn stmtConn, scanner func(*sql.Rows) error, q string, args ...interface{}) error {
|
||||||
stmt := fmt.Sprint(args...)
|
stmt, err := format(q, args...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
startTime := timex.Now()
|
startTime := timex.Now()
|
||||||
rows, err := conn.Query(args...)
|
rows, err := conn.Query(args...)
|
||||||
duration := timex.Since(startTime)
|
duration := timex.Since(startTime)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ var errMockedPlaceholder = errors.New("placeholder")
|
|||||||
func TestStmt_exec(t *testing.T) {
|
func TestStmt_exec(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
query string
|
||||||
args []interface{}
|
args []interface{}
|
||||||
delay bool
|
delay bool
|
||||||
hasError bool
|
hasError bool
|
||||||
@@ -23,18 +24,28 @@ func TestStmt_exec(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "normal",
|
name: "normal",
|
||||||
|
query: "select user from users where id=?",
|
||||||
args: []interface{}{1},
|
args: []interface{}{1},
|
||||||
lastInsertId: 1,
|
lastInsertId: 1,
|
||||||
rowsAffected: 2,
|
rowsAffected: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "exec error",
|
name: "exec error",
|
||||||
|
query: "select user from users where id=?",
|
||||||
|
args: []interface{}{1},
|
||||||
|
hasError: true,
|
||||||
|
err: errors.New("exec"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "exec more args error",
|
||||||
|
query: "select user from users where id=? and name=?",
|
||||||
args: []interface{}{1},
|
args: []interface{}{1},
|
||||||
hasError: true,
|
hasError: true,
|
||||||
err: errors.New("exec"),
|
err: errors.New("exec"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "slowcall",
|
name: "slowcall",
|
||||||
|
query: "select user from users where id=?",
|
||||||
args: []interface{}{1},
|
args: []interface{}{1},
|
||||||
delay: true,
|
delay: true,
|
||||||
lastInsertId: 1,
|
lastInsertId: 1,
|
||||||
@@ -51,7 +62,7 @@ func TestStmt_exec(t *testing.T) {
|
|||||||
rowsAffected: test.rowsAffected,
|
rowsAffected: test.rowsAffected,
|
||||||
err: test.err,
|
err: test.err,
|
||||||
delay: test.delay,
|
delay: test.delay,
|
||||||
}, "select user from users where id=?", args...)
|
}, test.query, args...)
|
||||||
},
|
},
|
||||||
func(args ...interface{}) (sql.Result, error) {
|
func(args ...interface{}) (sql.Result, error) {
|
||||||
return execStmt(&mockedStmtConn{
|
return execStmt(&mockedStmtConn{
|
||||||
@@ -59,7 +70,7 @@ func TestStmt_exec(t *testing.T) {
|
|||||||
rowsAffected: test.rowsAffected,
|
rowsAffected: test.rowsAffected,
|
||||||
err: test.err,
|
err: test.err,
|
||||||
delay: test.delay,
|
delay: test.delay,
|
||||||
}, args...)
|
}, test.query, args...)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,23 +100,34 @@ func TestStmt_exec(t *testing.T) {
|
|||||||
func TestStmt_query(t *testing.T) {
|
func TestStmt_query(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
query string
|
||||||
args []interface{}
|
args []interface{}
|
||||||
delay bool
|
delay bool
|
||||||
hasError bool
|
hasError bool
|
||||||
err error
|
err error
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "normal",
|
name: "normal",
|
||||||
args: []interface{}{1},
|
query: "select user from users where id=?",
|
||||||
|
args: []interface{}{1},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "query error",
|
name: "query error",
|
||||||
|
query: "select user from users where id=?",
|
||||||
|
args: []interface{}{1},
|
||||||
|
hasError: true,
|
||||||
|
err: errors.New("exec"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "query more args error",
|
||||||
|
query: "select user from users where id=? and name=?",
|
||||||
args: []interface{}{1},
|
args: []interface{}{1},
|
||||||
hasError: true,
|
hasError: true,
|
||||||
err: errors.New("exec"),
|
err: errors.New("exec"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "slowcall",
|
name: "slowcall",
|
||||||
|
query: "select user from users where id=?",
|
||||||
args: []interface{}{1},
|
args: []interface{}{1},
|
||||||
delay: true,
|
delay: true,
|
||||||
},
|
},
|
||||||
@@ -120,7 +142,7 @@ func TestStmt_query(t *testing.T) {
|
|||||||
delay: test.delay,
|
delay: test.delay,
|
||||||
}, func(rows *sql.Rows) error {
|
}, func(rows *sql.Rows) error {
|
||||||
return nil
|
return nil
|
||||||
}, "select user from users where id=?", args...)
|
}, test.query, args...)
|
||||||
},
|
},
|
||||||
func(args ...interface{}) error {
|
func(args ...interface{}) error {
|
||||||
return queryStmt(&mockedStmtConn{
|
return queryStmt(&mockedStmtConn{
|
||||||
@@ -128,7 +150,7 @@ func TestStmt_query(t *testing.T) {
|
|||||||
delay: test.delay,
|
delay: test.delay,
|
||||||
}, func(rows *sql.Rows) error {
|
}, func(rows *sql.Rows) error {
|
||||||
return nil
|
return nil
|
||||||
}, args...)
|
}, test.query, args...)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +165,7 @@ func TestStmt_query(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, errMockedPlaceholder, err)
|
assert.NotNil(t, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package sqlx
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
"github.com/tal-tech/go-zero/core/logx"
|
||||||
@@ -45,24 +46,6 @@ func escape(input string) string {
|
|||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatForPrint(query string, args ...interface{}) string {
|
|
||||||
if len(args) == 0 {
|
|
||||||
return query
|
|
||||||
}
|
|
||||||
|
|
||||||
var vals []string
|
|
||||||
for _, arg := range args {
|
|
||||||
vals = append(vals, fmt.Sprintf("%q", mapping.Repr(arg)))
|
|
||||||
}
|
|
||||||
|
|
||||||
var b strings.Builder
|
|
||||||
b.WriteByte('[')
|
|
||||||
b.WriteString(strings.Join(vals, ", "))
|
|
||||||
b.WriteByte(']')
|
|
||||||
|
|
||||||
return strings.Join([]string{query, b.String()}, " ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func format(query string, args ...interface{}) (string, error) {
|
func format(query string, args ...interface{}) (string, error) {
|
||||||
numArgs := len(args)
|
numArgs := len(args)
|
||||||
if numArgs == 0 {
|
if numArgs == 0 {
|
||||||
@@ -70,38 +53,52 @@ func format(query string, args ...interface{}) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
argIndex := 0
|
var argIndex int
|
||||||
|
bytes := len(query)
|
||||||
|
|
||||||
for _, ch := range query {
|
for i := 0; i < bytes; i++ {
|
||||||
if ch == '?' {
|
ch := query[i]
|
||||||
|
switch ch {
|
||||||
|
case '?':
|
||||||
if argIndex >= numArgs {
|
if argIndex >= numArgs {
|
||||||
return "", fmt.Errorf("error: %d ? in sql, but less arguments provided", argIndex)
|
return "", fmt.Errorf("error: %d ? in sql, but less arguments provided", argIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
arg := args[argIndex]
|
writeValue(&b, args[argIndex])
|
||||||
argIndex++
|
argIndex++
|
||||||
|
case '$':
|
||||||
switch v := arg.(type) {
|
var j int
|
||||||
case bool:
|
for j = i + 1; j < bytes; j++ {
|
||||||
if v {
|
char := query[j]
|
||||||
b.WriteByte('1')
|
if char < '0' || '9' < char {
|
||||||
} else {
|
break
|
||||||
b.WriteByte('0')
|
|
||||||
}
|
}
|
||||||
case string:
|
|
||||||
b.WriteByte('\'')
|
|
||||||
b.WriteString(escape(v))
|
|
||||||
b.WriteByte('\'')
|
|
||||||
default:
|
|
||||||
b.WriteString(mapping.Repr(v))
|
|
||||||
}
|
}
|
||||||
} else {
|
if j > i+1 {
|
||||||
b.WriteRune(ch)
|
index, err := strconv.Atoi(query[i+1 : j])
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// index starts from 1 for pg
|
||||||
|
if index > argIndex {
|
||||||
|
argIndex = index
|
||||||
|
}
|
||||||
|
index--
|
||||||
|
if index < 0 || numArgs <= index {
|
||||||
|
return "", fmt.Errorf("error: wrong index %d in sql", index)
|
||||||
|
}
|
||||||
|
|
||||||
|
writeValue(&b, args[index])
|
||||||
|
i = j - 1
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
b.WriteByte(ch)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if argIndex < numArgs {
|
if argIndex < numArgs {
|
||||||
return "", fmt.Errorf("error: %d ? in sql, but more arguments provided", argIndex)
|
return "", fmt.Errorf("error: %d arguments provided, not matching sql", argIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
return b.String(), nil
|
return b.String(), nil
|
||||||
@@ -117,3 +114,20 @@ func logSqlError(stmt string, err error) {
|
|||||||
logx.Errorf("stmt: %s, error: %s", stmt, err.Error())
|
logx.Errorf("stmt: %s, error: %s", stmt, err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeValue(buf *strings.Builder, arg interface{}) {
|
||||||
|
switch v := arg.(type) {
|
||||||
|
case bool:
|
||||||
|
if v {
|
||||||
|
buf.WriteByte('1')
|
||||||
|
} else {
|
||||||
|
buf.WriteByte('0')
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
buf.WriteByte('\'')
|
||||||
|
buf.WriteString(escape(v))
|
||||||
|
buf.WriteByte('\'')
|
||||||
|
default:
|
||||||
|
buf.WriteString(mapping.Repr(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,30 +29,63 @@ func TestDesensitize_WithoutAccount(t *testing.T) {
|
|||||||
assert.True(t, strings.Contains(datasource, "tcp(111.222.333.44:3306)"))
|
assert.True(t, strings.Contains(datasource, "tcp(111.222.333.44:3306)"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFormatForPrint(t *testing.T) {
|
func TestFormat(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
query string
|
query string
|
||||||
args []interface{}
|
args []interface{}
|
||||||
expect string
|
expect string
|
||||||
|
hasErr bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "no args",
|
name: "mysql normal",
|
||||||
query: "select user, name from table where id=?",
|
query: "select name, age from users where bool=? and phone=?",
|
||||||
expect: `select user, name from table where id=?`,
|
args: []interface{}{true, "133"},
|
||||||
|
expect: "select name, age from users where bool=1 and phone='133'",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "one arg",
|
name: "mysql normal",
|
||||||
query: "select user, name from table where id=?",
|
query: "select name, age from users where bool=? and phone=?",
|
||||||
args: []interface{}{"kevin"},
|
args: []interface{}{false, "133"},
|
||||||
expect: `select user, name from table where id=? ["kevin"]`,
|
expect: "select name, age from users where bool=0 and phone='133'",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "pg normal",
|
||||||
|
query: "select name, age from users where bool=$1 and phone=$2",
|
||||||
|
args: []interface{}{true, "133"},
|
||||||
|
expect: "select name, age from users where bool=1 and phone='133'",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "pg normal reverse",
|
||||||
|
query: "select name, age from users where bool=$2 and phone=$1",
|
||||||
|
args: []interface{}{"133", false},
|
||||||
|
expect: "select name, age from users where bool=0 and phone='133'",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "pg error not number",
|
||||||
|
query: "select name, age from users where bool=$a and phone=$1",
|
||||||
|
args: []interface{}{"133", false},
|
||||||
|
hasErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "pg error more args",
|
||||||
|
query: "select name, age from users where bool=$2 and phone=$1 and nickname=$3",
|
||||||
|
args: []interface{}{"133", false},
|
||||||
|
hasErr: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
test := test
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
actual := formatForPrint(test.query, test.args...)
|
t.Parallel()
|
||||||
assert.Equal(t, test.expect, actual)
|
|
||||||
|
actual, err := format(test.query, test.args...)
|
||||||
|
if test.hasErr {
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
} else {
|
||||||
|
assert.Equal(t, test.expect, actual)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ type (
|
|||||||
|
|
||||||
// NewReplacer returns a Replacer.
|
// NewReplacer returns a Replacer.
|
||||||
func NewReplacer(mapping map[string]string) Replacer {
|
func NewReplacer(mapping map[string]string) Replacer {
|
||||||
var rep = &replacer{
|
rep := &replacer{
|
||||||
mapping: mapping,
|
mapping: mapping,
|
||||||
}
|
}
|
||||||
for k := range mapping {
|
for k := range mapping {
|
||||||
@@ -28,9 +28,9 @@ func NewReplacer(mapping map[string]string) Replacer {
|
|||||||
|
|
||||||
func (r *replacer) Replace(text string) string {
|
func (r *replacer) Replace(text string) string {
|
||||||
var builder strings.Builder
|
var builder strings.Builder
|
||||||
var chars = []rune(text)
|
chars := []rune(text)
|
||||||
var size = len(chars)
|
size := len(chars)
|
||||||
var start = -1
|
start := -1
|
||||||
|
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
child, ok := r.children[chars[i]]
|
child, ok := r.children[chars[i]]
|
||||||
@@ -42,12 +42,12 @@ func (r *replacer) Replace(text string) string {
|
|||||||
if start < 0 {
|
if start < 0 {
|
||||||
start = i
|
start = i
|
||||||
}
|
}
|
||||||
var end = -1
|
end := -1
|
||||||
if child.end {
|
if child.end {
|
||||||
end = i + 1
|
end = i + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
var j = i + 1
|
j := i + 1
|
||||||
for ; j < size; j++ {
|
for ; j < size; j++ {
|
||||||
grandchild, ok := child.children[chars[j]]
|
grandchild, ok := child.children[chars[j]]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestReplacer_Replace(t *testing.T) {
|
func TestReplacer_Replace(t *testing.T) {
|
||||||
var mapping = map[string]string{
|
mapping := map[string]string{
|
||||||
"一二三四": "1234",
|
"一二三四": "1234",
|
||||||
"二三": "23",
|
"二三": "23",
|
||||||
"二": "2",
|
"二": "2",
|
||||||
@@ -16,28 +16,28 @@ func TestReplacer_Replace(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReplacer_ReplaceSingleChar(t *testing.T) {
|
func TestReplacer_ReplaceSingleChar(t *testing.T) {
|
||||||
var mapping = map[string]string{
|
mapping := map[string]string{
|
||||||
"二": "2",
|
"二": "2",
|
||||||
}
|
}
|
||||||
assert.Equal(t, "零一2三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
assert.Equal(t, "零一2三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReplacer_ReplaceExceedRange(t *testing.T) {
|
func TestReplacer_ReplaceExceedRange(t *testing.T) {
|
||||||
var mapping = map[string]string{
|
mapping := map[string]string{
|
||||||
"二三四五六": "23456",
|
"二三四五六": "23456",
|
||||||
}
|
}
|
||||||
assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReplacer_ReplacePartialMatch(t *testing.T) {
|
func TestReplacer_ReplacePartialMatch(t *testing.T) {
|
||||||
var mapping = map[string]string{
|
mapping := map[string]string{
|
||||||
"二三四七": "2347",
|
"二三四七": "2347",
|
||||||
}
|
}
|
||||||
assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
assert.Equal(t, "零一二三四五", NewReplacer(mapping).Replace("零一二三四五"))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReplacer_ReplaceMultiMatches(t *testing.T) {
|
func TestReplacer_ReplaceMultiMatches(t *testing.T) {
|
||||||
var mapping = map[string]string{
|
mapping := map[string]string{
|
||||||
"二三": "23",
|
"二三": "23",
|
||||||
}
|
}
|
||||||
assert.Equal(t, "零一23四五一23四五", NewReplacer(mapping).Replace("零一二三四五一二三四五"))
|
assert.Equal(t, "零一23四五一23四五", NewReplacer(mapping).Replace("零一二三四五一二三四五"))
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ func Reverse(s string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Substr returns runes between start and stop [start, stop) regardless of the chars are ascii or utf8.
|
// Substr returns runes between start and stop [start, stop) regardless of the chars are ascii or utf8.
|
||||||
func Substr(str string, start int, stop int) (string, error) {
|
func Substr(str string, start, stop int) (string, error) {
|
||||||
rs := []rune(str)
|
rs := []rune(str)
|
||||||
length := len(rs)
|
length := len(rs)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,12 @@ type Barrier struct {
|
|||||||
|
|
||||||
// Guard guards the given fn on the resource.
|
// Guard guards the given fn on the resource.
|
||||||
func (b *Barrier) Guard(fn func()) {
|
func (b *Barrier) Guard(fn func()) {
|
||||||
b.lock.Lock()
|
Guard(&b.lock, fn)
|
||||||
defer b.lock.Unlock()
|
}
|
||||||
|
|
||||||
|
// Guard guards the given fn with lock.
|
||||||
|
func Guard(lock sync.Locker, fn func()) {
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
fn()
|
fn()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,3 +38,19 @@ func TestBarrierPtr_Guard(t *testing.T) {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
assert.Equal(t, total, count)
|
assert.Equal(t, total, count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGuard(t *testing.T) {
|
||||||
|
const total = 10000
|
||||||
|
var count int
|
||||||
|
var lock sync.Mutex
|
||||||
|
wg := new(sync.WaitGroup)
|
||||||
|
wg.Add(total)
|
||||||
|
for i := 0; i < total; i++ {
|
||||||
|
go Guard(&lock, func() {
|
||||||
|
count++
|
||||||
|
wg.Done()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
assert.Equal(t, total, count)
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func NewManagedResource(generate func() interface{}, equals func(a, b interface{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarkBroken marks the resouce broken.
|
// MarkBroken marks the resource broken.
|
||||||
func (mr *ManagedResource) MarkBroken(resource interface{}) {
|
func (mr *ManagedResource) MarkBroken(resource interface{}) {
|
||||||
mr.lock.Lock()
|
mr.lock.Lock()
|
||||||
defer mr.lock.Unlock()
|
defer mr.lock.Unlock()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package syncx
|
|||||||
|
|
||||||
import "sync"
|
import "sync"
|
||||||
|
|
||||||
// Once returns a func that guanartees fn can only called once.
|
// Once returns a func that guarantees fn can only called once.
|
||||||
func Once(fn func()) func() {
|
func Once(fn func()) func() {
|
||||||
once := new(sync.Once)
|
once := new(sync.Once)
|
||||||
return func() {
|
return func() {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package syncx
|
|||||||
|
|
||||||
import "sync/atomic"
|
import "sync/atomic"
|
||||||
|
|
||||||
// A OnceGuard is used to make sure a resouce can be taken once.
|
// A OnceGuard is used to make sure a resource can be taken once.
|
||||||
type OnceGuard struct {
|
type OnceGuard struct {
|
||||||
done uint32
|
done uint32
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ type (
|
|||||||
|
|
||||||
// A Pool is used to pool resources.
|
// A Pool is used to pool resources.
|
||||||
// The difference between sync.Pool is that:
|
// The difference between sync.Pool is that:
|
||||||
// 1. the limit of the resouces
|
// 1. the limit of the resources
|
||||||
// 2. max age of the resources can be set
|
// 2. max age of the resources can be set
|
||||||
// 3. the method to destroy resources can be customized
|
// 3. the method to destroy resources can be customized
|
||||||
Pool struct {
|
Pool struct {
|
||||||
@@ -56,7 +56,7 @@ func NewPool(n int, create func() interface{}, destroy func(interface{}), opts .
|
|||||||
return pool
|
return pool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get gets a resouce.
|
// Get gets a resource.
|
||||||
func (p *Pool) Get() interface{} {
|
func (p *Pool) Get() interface{} {
|
||||||
p.lock.Lock()
|
p.lock.Lock()
|
||||||
defer p.lock.Unlock()
|
defer p.lock.Unlock()
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
// ErrUseOfCleaned is an error that indicates using a cleaned resource.
|
// ErrUseOfCleaned is an error that indicates using a cleaned resource.
|
||||||
var ErrUseOfCleaned = errors.New("using a cleaned resource")
|
var ErrUseOfCleaned = errors.New("using a cleaned resource")
|
||||||
|
|
||||||
// A RefResource is used to reference counting a resouce.
|
// A RefResource is used to reference counting a resource.
|
||||||
type RefResource struct {
|
type RefResource struct {
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
ref int32
|
ref int32
|
||||||
|
|||||||
40
go.mod
40
go.mod
@@ -6,7 +6,6 @@ require (
|
|||||||
github.com/ClickHouse/clickhouse-go v1.4.3
|
github.com/ClickHouse/clickhouse-go v1.4.3
|
||||||
github.com/DATA-DOG/go-sqlmock v1.4.1
|
github.com/DATA-DOG/go-sqlmock v1.4.1
|
||||||
github.com/alicebob/miniredis/v2 v2.14.1
|
github.com/alicebob/miniredis/v2 v2.14.1
|
||||||
github.com/antlr/antlr4 v0.0.0-20210105212045-464bcbc32de2
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/emicklei/proto v1.9.0
|
github.com/emicklei/proto v1.9.0
|
||||||
@@ -17,47 +16,36 @@ require (
|
|||||||
github.com/go-redis/redis v6.15.7+incompatible
|
github.com/go-redis/redis v6.15.7+incompatible
|
||||||
github.com/go-sql-driver/mysql v1.5.0
|
github.com/go-sql-driver/mysql v1.5.0
|
||||||
github.com/go-xorm/builder v0.3.4
|
github.com/go-xorm/builder v0.3.4
|
||||||
github.com/gogo/protobuf v1.3.1 // indirect
|
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
|
||||||
github.com/golang/mock v1.4.3
|
github.com/golang/mock v1.4.3
|
||||||
github.com/golang/protobuf v1.4.2
|
github.com/golang/protobuf v1.5.2
|
||||||
github.com/google/uuid v1.1.1
|
github.com/google/uuid v1.1.2
|
||||||
github.com/gorilla/websocket v1.4.2 // indirect
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect
|
|
||||||
github.com/iancoleman/strcase v0.1.2
|
github.com/iancoleman/strcase v0.1.2
|
||||||
github.com/justinas/alice v1.2.0
|
github.com/justinas/alice v1.2.0
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
|
||||||
github.com/kr/pretty v0.2.0 // indirect
|
github.com/kr/pretty v0.2.0 // indirect
|
||||||
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/lib/pq v1.3.0
|
github.com/lib/pq v1.3.0
|
||||||
github.com/logrusorgru/aurora v2.0.3+incompatible
|
github.com/logrusorgru/aurora v2.0.3+incompatible
|
||||||
github.com/mattn/go-colorable v0.1.6 // indirect
|
github.com/mattn/go-colorable v0.1.6 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
github.com/olekukonko/tablewriter v0.0.5
|
||||||
github.com/olekukonko/tablewriter v0.0.4
|
|
||||||
github.com/onsi/ginkgo v1.7.0 // indirect
|
github.com/onsi/ginkgo v1.7.0 // indirect
|
||||||
github.com/onsi/gomega v1.5.0 // indirect
|
github.com/onsi/gomega v1.5.0 // indirect
|
||||||
github.com/pierrec/lz4 v2.5.1+incompatible // indirect
|
github.com/pierrec/lz4 v2.5.1+incompatible // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/prometheus/client_golang v1.11.0
|
||||||
github.com/prometheus/client_golang v1.5.1
|
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/spaolacci/murmur3 v1.1.0
|
github.com/spaolacci/murmur3 v1.1.0
|
||||||
github.com/stretchr/testify v1.5.1
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 // indirect
|
|
||||||
github.com/urfave/cli v1.22.5
|
github.com/urfave/cli v1.22.5
|
||||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2
|
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2
|
||||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698
|
github.com/zeromicro/antlr v0.0.1
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.0
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.0
|
||||||
go.uber.org/automaxprocs v1.3.0
|
go.uber.org/automaxprocs v1.3.0
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
|
golang.org/x/net v0.0.0-20210614182718-04defd469f4e
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 // indirect
|
||||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect
|
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
|
||||||
golang.org/x/text v0.3.3 // indirect
|
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced // indirect
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0
|
google.golang.org/grpc v1.38.0
|
||||||
golang.org/x/tools v0.0.0-20200410132612-ae9902aceb98 // indirect
|
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f // indirect
|
|
||||||
google.golang.org/grpc v1.29.1
|
|
||||||
google.golang.org/protobuf v1.25.0 // indirect
|
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28
|
gopkg.in/cheggaaa/pb.v1 v1.0.28
|
||||||
gopkg.in/h2non/gock.v1 v1.0.15
|
gopkg.in/h2non/gock.v1 v1.0.15
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4 // indirect
|
|
||||||
sigs.k8s.io/yaml v1.2.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
|||||||
284
go.sum
284
go.sum
@@ -1,30 +1,26 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/ClickHouse/clickhouse-go v1.4.3 h1:iAFMa2UrQdR5bHJ2/yaSLffZkxpcOYQMCUuKeNXGdqc=
|
github.com/ClickHouse/clickhouse-go v1.4.3 h1:iAFMa2UrQdR5bHJ2/yaSLffZkxpcOYQMCUuKeNXGdqc=
|
||||||
github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
|
github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM=
|
github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1MRDJM=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||||
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
|
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
|
||||||
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
|
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
|
||||||
github.com/alicebob/miniredis/v2 v2.14.1 h1:GjlbSeoJ24bzdLRs13HoMEeaRZx9kg5nHoRW7QV/nCs=
|
github.com/alicebob/miniredis/v2 v2.14.1 h1:GjlbSeoJ24bzdLRs13HoMEeaRZx9kg5nHoRW7QV/nCs=
|
||||||
github.com/alicebob/miniredis/v2 v2.14.1/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg=
|
github.com/alicebob/miniredis/v2 v2.14.1/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg=
|
||||||
github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/antlr/antlr4 v0.0.0-20210105212045-464bcbc32de2 h1:rL2miklL5rhxUaZO7hntBcy/VHaiyuPQ4EJoy/NMwaM=
|
|
||||||
github.com/antlr/antlr4 v0.0.0-20210105212045-464bcbc32de2/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
|
||||||
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
|
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
|
||||||
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
|
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
@@ -35,31 +31,28 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
|
|||||||
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
|
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
|
||||||
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
|
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
|
||||||
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
|
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
|
||||||
github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 h1:qk/FSDDxo05wdJH28W+p5yivv7LuLYLRXPPD8KQCtZs=
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
|
||||||
github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc=
|
github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc=
|
||||||
github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
|
github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
|
||||||
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
|
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
|
||||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
||||||
@@ -73,137 +66,111 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7a
|
|||||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
|
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
|
github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
|
||||||
github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-xorm/builder v0.3.4 h1:FxkeGB4Cggdw3tPwutLCpfjng2jugfkg6LDMrd/KsoY=
|
github.com/go-xorm/builder v0.3.4 h1:FxkeGB4Cggdw3tPwutLCpfjng2jugfkg6LDMrd/KsoY=
|
||||||
github.com/go-xorm/builder v0.3.4/go.mod h1:KxkQkNN1DpPKTedxXyTQcmH+rXfvk4LZ9SOOBoZBAxw=
|
github.com/go-xorm/builder v0.3.4/go.mod h1:KxkQkNN1DpPKTedxXyTQcmH+rXfvk4LZ9SOOBoZBAxw=
|
||||||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
|
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
|
||||||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
|
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
|
||||||
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
|
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw=
|
github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw=
|
||||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
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.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||||
github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
|
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
|
||||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0=
|
|
||||||
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
|
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
|
||||||
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
|
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/iancoleman/strcase v0.1.2 h1:gnomlvw9tnV3ITTAxzKSgTF+8kFWcU/f+TgttpXGz1U=
|
github.com/iancoleman/strcase v0.1.2 h1:gnomlvw9tnV3ITTAxzKSgTF+8kFWcU/f+TgttpXGz1U=
|
||||||
github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
|
github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
|
||||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
|
||||||
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
|
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
|
github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
|
||||||
github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
|
github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
||||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||||
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
||||||
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
|
||||||
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
|
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
|
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
|
||||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
|
||||||
github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
|
|
||||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
|
||||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
||||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4=
|
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4=
|
||||||
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
|
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
|
||||||
github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8=
|
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
||||||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
|
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
|
||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
@@ -213,7 +180,6 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi
|
|||||||
github.com/pierrec/lz4 v2.5.1+incompatible h1:Yq0up0149Hh5Ekhm/91lgkZuD1ZDnXNM26bycpTzYBM=
|
github.com/pierrec/lz4 v2.5.1+incompatible h1:Yq0up0149Hh5Ekhm/91lgkZuD1ZDnXNM26bycpTzYBM=
|
||||||
github.com/pierrec/lz4 v2.5.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.5.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
@@ -221,121 +187,114 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA=
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
|
||||||
|
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
|
||||||
|
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
|
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
|
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||||
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
|
||||||
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
|
|
||||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
|
||||||
github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
|
github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
|
||||||
github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
|
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
|
||||||
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
|
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0=
|
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0=
|
||||||
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
|
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
|
||||||
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
|
github.com/zeromicro/antlr v0.0.1 h1:CQpIn/dc0pUjgGQ81y98s/NGOm2Hfru2NNio2I9mQgk=
|
||||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
github.com/zeromicro/antlr v0.0.1/go.mod h1:nfpjEwFR6Q4xGDJMcZnCL9tEfQRgszMwu3rDz2Z+p5M=
|
||||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698 h1:jWtjCJX1qxhHISBMLRztWwR+EXkI7MJAF2HjHAE/x/I=
|
go.etcd.io/etcd/api/v3 v3.5.0 h1:GsV3S+OfZEOCNXdtNkBSR7kgLobAa/SO6tCxRa0GAYw=
|
||||||
go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM=
|
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
go.etcd.io/etcd/client/pkg/v3 v3.5.0 h1:2aQv6F436YnN7I4VbI8PPYrBhu+SmrTaADcf8Mi/6PU=
|
||||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.0 h1:62Eh0XOro+rDwkrypAGDfgmNh5Joq+z+W9HZdlXMzek=
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
|
||||||
|
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||||
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0=
|
go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0=
|
||||||
go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
|
go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
|
||||||
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
|
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
||||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U=
|
||||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo=
|
|
||||||
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
|
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
|
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
|
golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
|
||||||
|
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
|
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@@ -343,80 +302,84 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
|
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
|
||||||
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
|
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
|
||||||
|
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.0.0-20200410132612-ae9902aceb98 h1:ibc1eDGW5ajwA4qzFTj0WHlD9eofMe1gAre+A0a3Vhs=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200410132612-ae9902aceb98/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
|
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/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=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f h1:ohwtWcCwB/fZUxh/vjazHorYmBnua3NmY3CAjwC7mEA=
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced h1:c5geK1iMU3cDKtFrCVQIcjR3W+JOZMuhIyICMCTbtus=
|
||||||
|
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
|
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg=
|
|
||||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
|
||||||
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||||
google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
|
||||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
|
||||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
|
gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
@@ -424,30 +387,23 @@ gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
|||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/h2non/gock.v1 v1.0.15 h1:SzLqcIlb/fDfg7UvukMpNcWsu7sI5tWwL+KCATZqks0=
|
gopkg.in/h2non/gock.v1 v1.0.15 h1:SzLqcIlb/fDfg7UvukMpNcWsu7sI5tWwL+KCATZqks0=
|
||||||
gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE=
|
gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
|
|
||||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
|
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
|
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
|
||||||
rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY=
|
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
|
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
|||||||
78
readme-cn.md
78
readme-cn.md
@@ -26,7 +26,7 @@ go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的
|
|||||||
* 自动校验客户端请求参数合法性
|
* 自动校验客户端请求参数合法性
|
||||||
* 大量微服务治理和并发工具包
|
* 大量微服务治理和并发工具包
|
||||||
|
|
||||||
<img src="https://gitee.com/kevwan/static/raw/master/doc/images/architecture.png" alt="架构图" width="1500" />
|

|
||||||
|
|
||||||
## 1. go-zero 框架背景
|
## 1. go-zero 框架背景
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ go-zero 是一个集成了各种工程实践的包含 web 和 rpc 框架,有
|
|||||||
|
|
||||||
如下图,我们从多个层面保障了整体服务的高可用:
|
如下图,我们从多个层面保障了整体服务的高可用:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
觉得不错的话,别忘 **star** 👏
|
觉得不错的话,别忘 **star** 👏
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/
|
|||||||
|
|
||||||
## 6. Benchmark
|
## 6. Benchmark
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
[测试代码见这里](https://github.com/smallnest/go-web-framework-benchmark)
|
[测试代码见这里](https://github.com/smallnest/go-web-framework-benchmark)
|
||||||
|
|
||||||
@@ -159,7 +159,17 @@ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/
|
|||||||
|
|
||||||
* API 文档
|
* API 文档
|
||||||
|
|
||||||
[https://zeromicro.github.io/go-zero](https://zeromicro.github.io/go-zero)
|
[https://go-zero.dev/cn/](https://go-zero.dev/cn/)
|
||||||
|
|
||||||
|
* 常见问题
|
||||||
|
|
||||||
|
* 因为 `etcd` 和 `grpc` 兼容性问题,请使用 `grpc@v1.29.1`
|
||||||
|
|
||||||
|
`google.golang.org/grpc v1.29.1`
|
||||||
|
|
||||||
|
* 因为 `protobuf` 兼容性问题,请使用 `protocol-gen@v1.3.2`
|
||||||
|
|
||||||
|
`go get -u github.com/golang/protobuf/protoc-gen-go@v1.3.2`
|
||||||
|
|
||||||
* awesome 系列(更多文章见『微服务实践』公众号)
|
* awesome 系列(更多文章见『微服务实践』公众号)
|
||||||
* [快速构建高并发微服务](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl.md)
|
* [快速构建高并发微服务](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl.md)
|
||||||
@@ -175,13 +185,55 @@ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/
|
|||||||
| [goctl-android](https://github.com/zeromicro/goctl-android) | 生成 `java (android)` 端 `http client` 请求代码 |
|
| [goctl-android](https://github.com/zeromicro/goctl-android) | 生成 `java (android)` 端 `http client` 请求代码 |
|
||||||
| [goctl-go-compact](https://github.com/zeromicro/goctl-go-compact) | 合并 `api` 里同一个 `group` 里的 `handler` 到一个 `go` 文件 |
|
| [goctl-go-compact](https://github.com/zeromicro/goctl-go-compact) | 合并 `api` 里同一个 `group` 里的 `handler` 到一个 `go` 文件 |
|
||||||
|
|
||||||
## 8. 微信公众号
|
## 8. go-zero 用户
|
||||||
|
|
||||||
`go-zero` 相关文章都会在 `微服务实践` 公众号整理呈现,欢迎扫码关注,也可以通过公众号私信我 👏
|
go-zero 已被许多公司用于生产部署,接入场景如在线教育、电商业务、游戏、区块链等,目前为止,已使用 go-zero 的公司包括但不限于:
|
||||||
|
|
||||||
<img src="https://gitee.com/kevwan/static/raw/master/images/wechat-micro.jpg" alt="wechat" width="300" />
|
>1. 好未来
|
||||||
|
>2. 上海晓信信息科技有限公司(晓黑板)
|
||||||
|
>3. 上海玉数科技有限公司
|
||||||
|
>4. 常州千帆网络科技有限公司
|
||||||
|
>5. 上班族科技
|
||||||
|
>6. 英雄体育(VSPN)
|
||||||
|
>7. githubmemory
|
||||||
|
>8. 释空(上海)品牌策划有限公司(senkoo)
|
||||||
|
>9. 鞍山三合众鑫科技有限公司
|
||||||
|
>10. 广州星梦工场网络科技有限公司
|
||||||
|
>11. 杭州复杂美科技有限公司
|
||||||
|
>12. 赛凌科技
|
||||||
|
>13. 捞月狗
|
||||||
|
>14. 浙江三合通信科技有限公司
|
||||||
|
>15. 爱克萨
|
||||||
|
>16. 郑州众合互联信息技术有限公司
|
||||||
|
>17. 三七游戏
|
||||||
|
>18. 成都创道夫科技有限公司
|
||||||
|
>19. 联想Lenovo
|
||||||
|
>20. 云犀
|
||||||
|
>21. 高盈国际
|
||||||
|
>22. 北京中科生活服务有限公司
|
||||||
|
>23. Indochat 印尼艾希英
|
||||||
|
>24. 数赞
|
||||||
|
>25. 量冠科技
|
||||||
|
>26. 杭州又拍云科技有限公司
|
||||||
|
>27. 深圳市点购电子商务控股股份有限公司
|
||||||
|
>28. 深圳市宁克沃德科技有限公司
|
||||||
|
>29. 桂林优利特医疗电子有限公司
|
||||||
|
>30. 成都智橙互动科技有限公司
|
||||||
|
>31. 深圳市班班科技有限公司
|
||||||
|
>32. 飞视(苏州)数字技术有限公司
|
||||||
|
>33. 上海鲸思智能科技有限公司
|
||||||
|
>34. 南宁宸升计算机科技有限公司
|
||||||
|
>35. 秦皇岛2084team
|
||||||
|
|
||||||
## 9. 微信交流群
|
如果贵公司也已使用 go-zero,欢迎在 [登记地址](https://github.com/tal-tech/go-zero/issues/602) 登记,仅仅为了推广,不做其它用途。
|
||||||
|
|
||||||
|
## 9. 微信公众号
|
||||||
|
|
||||||
|
`go-zero` 相关文章和视频都会在 `微服务实践` 公众号整理呈现,欢迎扫码关注 👏
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/tal-tech/zero-doc/main/doc/images/wechat-micro.jpg" alt="wechat" width="300" />
|
||||||
|
|
||||||
|
## 10. 微信交流群
|
||||||
|
|
||||||
如果文档中未能覆盖的任何疑问,欢迎您在群里提出,我们会尽快答复。
|
如果文档中未能覆盖的任何疑问,欢迎您在群里提出,我们会尽快答复。
|
||||||
|
|
||||||
@@ -189,12 +241,6 @@ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/
|
|||||||
|
|
||||||
如果您发现 ***bug*** 请及时提 ***issue***,我们会尽快确认并修改。
|
如果您发现 ***bug*** 请及时提 ***issue***,我们会尽快确认并修改。
|
||||||
|
|
||||||
为了防止广告用户、识别技术同行,请 ***star*** 后加我时注明 **github** 当前 ***star*** 数,我再拉进 **go-zero** 群,感谢!
|
加群之前有劳点一下 ***star***,一个小小的 ***star*** 是作者们回答海量问题的动力🤝
|
||||||
|
|
||||||
加我之前有劳点一下 ***star***,一个小小的 ***star*** 是作者们回答海量问题的动力🤝
|
<img src="https://raw.githubusercontent.com/tal-tech/zero-doc/main/doc/images/wechat.jpg" alt="wechat" width="300" />
|
||||||
|
|
||||||
<img src="https://gitee.com/kevwan/static/raw/master/images/wechat.jpg" alt="wechat" width="300" />
|
|
||||||
|
|
||||||
项目地址:[https://github.com/tal-tech/go-zero](https://github.com/tal-tech/go-zero)
|
|
||||||
|
|
||||||
码云地址:[https://gitee.com/kevwan/go-zero](https://gitee.com/kevwan/go-zero) (国内用户可访问gitee,每日自动从github同步代码)
|
|
||||||
15
readme.md
15
readme.md
@@ -12,7 +12,7 @@ English | [简体中文](readme-cn.md)
|
|||||||
|
|
||||||
## 0. what is go-zero
|
## 0. what is go-zero
|
||||||
|
|
||||||
go-zero is a web and rpc framework that with lots of engineering practices builtin. It’s born to ensure the stability of the busy services with resilience design, and has been serving sites with tens of millions users for years.
|
go-zero is a web and rpc framework with lots of builtin engineering practices. It’s born to ensure the stability of the busy services with resilience design, and has been serving sites with tens of millions users for years.
|
||||||
|
|
||||||
go-zero contains simple API description syntax and code generation tool called `goctl`. You can generate Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript from .api files with `goctl`.
|
go-zero contains simple API description syntax and code generation tool called `goctl`. You can generate Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript from .api files with `goctl`.
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ go get -u github.com/tal-tech/go-zero
|
|||||||
|
|
||||||
[Rapid development of microservice systems](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl-en.md)
|
[Rapid development of microservice systems](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl-en.md)
|
||||||
|
|
||||||
[Rapid development of microservice systems - multiple RPCs](https://github.com/tal-tech/zero-doc/blob/main/doc/bookstore-en.md)
|
[Rapid development of microservice systems - multiple RPCs](https://github.com/tal-tech/zero-doc/blob/main/docs/zero/bookstore-en.md)
|
||||||
|
|
||||||
1. install goctl
|
1. install goctl
|
||||||
|
|
||||||
@@ -206,6 +206,7 @@ go get -u github.com/tal-tech/go-zero
|
|||||||
|
|
||||||
## 8. Documents (adding)
|
## 8. Documents (adding)
|
||||||
|
|
||||||
|
* [Documents](https://go-zero.dev/en/)
|
||||||
* [Rapid development of microservice systems](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl-en.md)
|
* [Rapid development of microservice systems](https://github.com/tal-tech/zero-doc/blob/main/doc/shorturl-en.md)
|
||||||
* [Rapid development of microservice systems - multiple RPCs](https://github.com/tal-tech/zero-doc/blob/main/docs/zero/bookstore-en.md)
|
* [Rapid development of microservice systems - multiple RPCs](https://github.com/tal-tech/zero-doc/blob/main/docs/zero/bookstore-en.md)
|
||||||
* [Examples](https://github.com/zeromicro/zero-examples)
|
* [Examples](https://github.com/zeromicro/zero-examples)
|
||||||
@@ -216,6 +217,14 @@ go get -u github.com/tal-tech/go-zero
|
|||||||
|
|
||||||
`google.golang.org/grpc v1.29.1`
|
`google.golang.org/grpc v1.29.1`
|
||||||
|
|
||||||
|
* For protobuf compatibility, use `protocol-gen@v1.3.2`.
|
||||||
|
|
||||||
|
` go get -u github.com/golang/protobuf/protoc-gen-go@v1.3.2`
|
||||||
|
|
||||||
## 10. Chat group
|
## 10. Chat group
|
||||||
|
|
||||||
Join the chat via https://join.slack.com/t/go-zeroworkspace/shared_invite/zt-m39xssxc-kgIqERa7aVsujKNj~XuPKg
|
Join the chat via https://join.slack.com/t/go-zero/shared_invite/zt-qxlclrv9-MWrCNkB2DpSgtEK2tVXJcw
|
||||||
|
|
||||||
|
## Give a Star! ⭐
|
||||||
|
|
||||||
|
If you like or are using this project to learn or start your solution, please give it a star. Thanks!
|
||||||
@@ -109,13 +109,13 @@ func (s *engine) bindRoute(fr featuredRoutes, router httpx.Router, metrics *stat
|
|||||||
chain := alice.New(
|
chain := alice.New(
|
||||||
handler.TracingHandler,
|
handler.TracingHandler,
|
||||||
s.getLogHandler(),
|
s.getLogHandler(),
|
||||||
|
handler.PrometheusHandler(route.Path),
|
||||||
handler.MaxConns(s.conf.MaxConns),
|
handler.MaxConns(s.conf.MaxConns),
|
||||||
handler.BreakerHandler(route.Method, route.Path, metrics),
|
handler.BreakerHandler(route.Method, route.Path, metrics),
|
||||||
handler.SheddingHandler(s.getShedder(fr.priority), metrics),
|
handler.SheddingHandler(s.getShedder(fr.priority), metrics),
|
||||||
handler.TimeoutHandler(time.Duration(s.conf.Timeout)*time.Millisecond),
|
handler.TimeoutHandler(time.Duration(s.conf.Timeout)*time.Millisecond),
|
||||||
handler.RecoverHandler,
|
handler.RecoverHandler,
|
||||||
handler.MetricHandler(metrics),
|
handler.MetricHandler(metrics),
|
||||||
handler.PrometheusHandler(route.Path),
|
|
||||||
handler.MaxBytesHandler(s.conf.MaxBytes),
|
handler.MaxBytesHandler(s.conf.MaxBytes),
|
||||||
handler.GunzipHandler,
|
handler.GunzipHandler,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -154,13 +154,12 @@ Verbose: true
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockedRouter struct {
|
type mockedRouter struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (m mockedRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
|
func (m mockedRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m mockedRouter) Handle(method string, path string, handler http.Handler) error {
|
func (m mockedRouter) Handle(method, path string, handler http.Handler) error {
|
||||||
return errors.New("foo")
|
return errors.New("foo")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/tal-tech/go-zero/core/metric"
|
"github.com/tal-tech/go-zero/core/metric"
|
||||||
|
"github.com/tal-tech/go-zero/core/prometheus"
|
||||||
"github.com/tal-tech/go-zero/core/timex"
|
"github.com/tal-tech/go-zero/core/timex"
|
||||||
"github.com/tal-tech/go-zero/rest/internal/security"
|
"github.com/tal-tech/go-zero/rest/internal/security"
|
||||||
)
|
)
|
||||||
@@ -34,6 +35,10 @@ var (
|
|||||||
// PrometheusHandler returns a middleware that reports stats to prometheus.
|
// PrometheusHandler returns a middleware that reports stats to prometheus.
|
||||||
func PrometheusHandler(path string) func(http.Handler) http.Handler {
|
func PrometheusHandler(path string) func(http.Handler) http.Handler {
|
||||||
return func(next http.Handler) http.Handler {
|
return func(next http.Handler) http.Handler {
|
||||||
|
if !prometheus.Enabled() {
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
startTime := timex.Now()
|
startTime := timex.Now()
|
||||||
cw := &security.WithCodeResponseWriter{Writer: w}
|
cw := &security.WithCodeResponseWriter{Writer: w}
|
||||||
|
|||||||
@@ -6,9 +6,26 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/tal-tech/go-zero/core/prometheus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPromMetricHandler(t *testing.T) {
|
func TestPromMetricHandler_Disabled(t *testing.T) {
|
||||||
|
promMetricHandler := PrometheusHandler("/user/login")
|
||||||
|
handler := promMetricHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}))
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "http://localhost", nil)
|
||||||
|
resp := httptest.NewRecorder()
|
||||||
|
handler.ServeHTTP(resp, req)
|
||||||
|
assert.Equal(t, http.StatusOK, resp.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPromMetricHandler_Enabled(t *testing.T) {
|
||||||
|
prometheus.StartAgent(prometheus.Config{
|
||||||
|
Host: "localhost",
|
||||||
|
Path: "/",
|
||||||
|
})
|
||||||
promMetricHandler := PrometheusHandler("/user/login")
|
promMetricHandler := PrometheusHandler("/user/login")
|
||||||
handler := promMetricHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
handler := promMetricHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
|
|||||||
@@ -94,8 +94,7 @@ func (s mockShedder) Allow() (load.Promise, error) {
|
|||||||
return nil, load.ErrServiceOverloaded
|
return nil, load.ErrServiceOverloaded
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockPromise struct {
|
type mockPromise struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (p mockPromise) Pass() {
|
func (p mockPromise) Pass() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import "net/http"
|
|||||||
// Router interface represents a http router that handles http requests.
|
// Router interface represents a http router that handles http requests.
|
||||||
type Router interface {
|
type Router interface {
|
||||||
http.Handler
|
http.Handler
|
||||||
Handle(method string, path string, handler http.Handler) error
|
Handle(method, path string, handler http.Handler) error
|
||||||
SetNotFoundHandler(handler http.Handler)
|
SetNotFoundHandler(handler http.Handler)
|
||||||
SetNotAllowedHandler(handler http.Handler)
|
SetNotAllowedHandler(handler http.Handler)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ func WithJwt(secret string) RouteOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithJwtTransition returns a func to enable jwt authentication as well as jwt secret transition.
|
// WithJwtTransition returns a func to enable jwt authentication as well as jwt secret transition.
|
||||||
// Which means old and new jwt secrets work together for a peroid.
|
// Which means old and new jwt secrets work together for a period.
|
||||||
func WithJwtTransition(secret, prevSecret string) RouteOption {
|
func WithJwtTransition(secret, prevSecret string) RouteOption {
|
||||||
return func(r *featuredRoutes) {
|
return func(r *featuredRoutes) {
|
||||||
// why not validate prevSecret, because prevSecret is an already used one,
|
// why not validate prevSecret, because prevSecret is an already used one,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ Future {{pathToFuncName .Path}}( {{if ne .Method "get"}}{{with .RequestType}}{{.
|
|||||||
{{end}}`
|
{{end}}`
|
||||||
|
|
||||||
func genApi(dir string, api *spec.ApiSpec) error {
|
func genApi(dir string, api *spec.ApiSpec) error {
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(dir, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ func genApi(dir string, api *spec.ApiSpec) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.OpenFile(dir+api.Service.Name+".dart", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
file, err := os.OpenFile(dir+api.Service.Name+".dart", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ func genApiFile(dir string) error {
|
|||||||
if fileExists(path) {
|
if fileExists(path) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
apiFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
apiFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class {{.Name}}{
|
|||||||
`
|
`
|
||||||
|
|
||||||
func genData(dir string, api *spec.ApiSpec) error {
|
func genData(dir string, api *spec.ApiSpec) error {
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(dir, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ func genData(dir string, api *spec.ApiSpec) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.OpenFile(dir+api.Service.Name+".dart", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
file, err := os.OpenFile(dir+api.Service.Name+".dart", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ func genTokens(dir string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
tokensFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
tokensFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,20 +41,20 @@ Future<Tokens> getTokens() async {
|
|||||||
`
|
`
|
||||||
|
|
||||||
func genVars(dir string) error {
|
func genVars(dir string) error {
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(dir, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !fileExists(dir + "vars.dart") {
|
if !fileExists(dir + "vars.dart") {
|
||||||
err = ioutil.WriteFile(dir+"vars.dart", []byte(`const serverHost='demo-crm.xiaoheiban.cn';`), 0644)
|
err = ioutil.WriteFile(dir+"vars.dart", []byte(`const serverHost='demo-crm.xiaoheiban.cn';`), 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !fileExists(dir + "kv.dart") {
|
if !fileExists(dir + "kv.dart") {
|
||||||
err = ioutil.WriteFile(dir+"kv.dart", []byte(varTemplate), 0644)
|
err = ioutil.WriteFile(dir+"kv.dart", []byte(varTemplate), 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ const (
|
|||||||
`
|
`
|
||||||
)
|
)
|
||||||
|
|
||||||
func genDoc(api *spec.ApiSpec, dir string, filename string) error {
|
func genDoc(api *spec.ApiSpec, dir, filename string) error {
|
||||||
fp, _, err := util.MaybeCreateFile(dir, "", filename)
|
fp, _, err := util.MaybeCreateFile(dir, "", filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -84,7 +84,7 @@ func buildDoc(route spec.Type) (string, error) {
|
|||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var tps = make([]spec.Type, 0)
|
tps := make([]spec.Type, 0)
|
||||||
tps = append(tps, route)
|
tps = append(tps, route)
|
||||||
if definedType, ok := route.(spec.DefineStruct); ok {
|
if definedType, ok := route.(spec.DefineStruct); ok {
|
||||||
associatedTypes(definedType, &tps)
|
associatedTypes(definedType, &tps)
|
||||||
@@ -98,7 +98,7 @@ func buildDoc(route spec.Type) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func associatedTypes(tp spec.DefineStruct, tps *[]spec.Type) {
|
func associatedTypes(tp spec.DefineStruct, tps *[]spec.Type) {
|
||||||
var hasAdded = false
|
hasAdded := false
|
||||||
for _, item := range *tps {
|
for _, item := range *tps {
|
||||||
if item.Name() == tp.Name() {
|
if item.Name() == tp.Name() {
|
||||||
hasAdded = true
|
hasAdded = true
|
||||||
|
|||||||
@@ -86,12 +86,17 @@ func ApiFormatByPath(apiFilePath string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := apiFormat(string(data))
|
abs, err := filepath.Abs(apiFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = parser.ParseContent(result)
|
result, err := apiFormat(string(data), abs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = parser.ParseContent(result, abs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -99,16 +104,16 @@ func ApiFormatByPath(apiFilePath string) error {
|
|||||||
return ioutil.WriteFile(apiFilePath, []byte(result), os.ModePerm)
|
return ioutil.WriteFile(apiFilePath, []byte(result), os.ModePerm)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiFormat(data string) (string, error) {
|
func apiFormat(data string, filename ...string) (string, error) {
|
||||||
_, err := parser.ParseContent(data)
|
_, err := parser.ParseContent(data, filename...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
var builder strings.Builder
|
var builder strings.Builder
|
||||||
s := bufio.NewScanner(strings.NewReader(data))
|
s := bufio.NewScanner(strings.NewReader(data))
|
||||||
var tapCount = 0
|
tapCount := 0
|
||||||
var newLineCount = 0
|
newLineCount := 0
|
||||||
var preLine string
|
var preLine string
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
line := strings.TrimSpace(s.Text())
|
line := strings.TrimSpace(s.Text())
|
||||||
|
|||||||
@@ -54,14 +54,19 @@ func DoGenProject(apiFile, dir, style string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logx.Must(util.MkdirIfNotExist(dir))
|
logx.Must(util.MkdirIfNotExist(dir))
|
||||||
|
rootPkg, err := getParentPackage(dir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
logx.Must(genEtc(dir, cfg, api))
|
logx.Must(genEtc(dir, cfg, api))
|
||||||
logx.Must(genConfig(dir, cfg, api))
|
logx.Must(genConfig(dir, cfg, api))
|
||||||
logx.Must(genMain(dir, cfg, api))
|
logx.Must(genMain(dir, rootPkg, cfg, api))
|
||||||
logx.Must(genServiceContext(dir, cfg, api))
|
logx.Must(genServiceContext(dir, rootPkg, cfg, api))
|
||||||
logx.Must(genTypes(dir, cfg, api))
|
logx.Must(genTypes(dir, cfg, api))
|
||||||
logx.Must(genRoutes(dir, cfg, api))
|
logx.Must(genRoutes(dir, rootPkg, cfg, api))
|
||||||
logx.Must(genHandlers(dir, cfg, api))
|
logx.Must(genHandlers(dir, rootPkg, cfg, api))
|
||||||
logx.Must(genLogic(dir, cfg, api))
|
logx.Must(genLogic(dir, rootPkg, cfg, api))
|
||||||
logx.Must(genMiddleware(dir, cfg, api))
|
logx.Must(genMiddleware(dir, cfg, api))
|
||||||
|
|
||||||
if err := backupAndSweep(apiFile); err != nil {
|
if err := backupAndSweep(apiFile); err != nil {
|
||||||
|
|||||||
@@ -35,12 +35,12 @@ func genConfig(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var authNames = getAuths(api)
|
authNames := getAuths(api)
|
||||||
var auths []string
|
var auths []string
|
||||||
for _, item := range authNames {
|
for _, item := range authNames {
|
||||||
auths = append(auths, fmt.Sprintf("%s %s", item, jwtTemplate))
|
auths = append(auths, fmt.Sprintf("%s %s", item, jwtTemplate))
|
||||||
}
|
}
|
||||||
var authImportStr = fmt.Sprintf("\"%s/rest\"", vars.ProjectOpenSourceURL)
|
authImportStr := fmt.Sprintf("\"%s/rest\"", vars.ProjectOpenSourceURL)
|
||||||
|
|
||||||
return genFile(fileGenConfig{
|
return genFile(fileGenConfig{
|
||||||
dir: dir,
|
dir: dir,
|
||||||
|
|||||||
@@ -49,18 +49,14 @@ type handlerInfo struct {
|
|||||||
HasRequest bool
|
HasRequest bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func genHandler(dir string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
func genHandler(dir, rootPkg string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
||||||
handler := getHandlerName(route)
|
handler := getHandlerName(route)
|
||||||
if getHandlerFolderPath(group, route) != handlerDir {
|
if getHandlerFolderPath(group, route) != handlerDir {
|
||||||
handler = strings.Title(handler)
|
handler = strings.Title(handler)
|
||||||
}
|
}
|
||||||
parentPkg, err := getParentPackage(dir)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return doGenToFile(dir, handler, cfg, group, route, handlerInfo{
|
return doGenToFile(dir, handler, cfg, group, route, handlerInfo{
|
||||||
ImportPackages: genHandlerImports(group, route, parentPkg),
|
ImportPackages: genHandlerImports(group, route, rootPkg),
|
||||||
HandlerName: handler,
|
HandlerName: handler,
|
||||||
RequestType: util.Title(route.RequestTypeName()),
|
RequestType: util.Title(route.RequestTypeName()),
|
||||||
LogicType: strings.Title(getLogicName(route)),
|
LogicType: strings.Title(getLogicName(route)),
|
||||||
@@ -89,10 +85,10 @@ func doGenToFile(dir, handler string, cfg *config.Config, group spec.Group,
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func genHandlers(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
func genHandlers(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||||
for _, group := range api.Service.Groups {
|
for _, group := range api.Service.Groups {
|
||||||
for _, route := range group.Routes {
|
for _, route := range group.Routes {
|
||||||
if err := genHandler(dir, cfg, group, route); err != nil {
|
if err := genHandler(dir, rootPkg, cfg, group, route); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,10 +39,10 @@ func (l *{{.logic}}) {{.function}}({{.request}}) {{.responseType}} {
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
func genLogic(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
func genLogic(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||||
for _, g := range api.Service.Groups {
|
for _, g := range api.Service.Groups {
|
||||||
for _, r := range g.Routes {
|
for _, r := range g.Routes {
|
||||||
err := genLogicByRoute(dir, cfg, g, r)
|
err := genLogicByRoute(dir, rootPkg, cfg, g, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -51,19 +51,14 @@ func genLogic(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func genLogicByRoute(dir string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
func genLogicByRoute(dir, rootPkg string, cfg *config.Config, group spec.Group, route spec.Route) error {
|
||||||
logic := getLogicName(route)
|
logic := getLogicName(route)
|
||||||
goFile, err := format.FileNamingFormat(cfg.NamingFormat, logic)
|
goFile, err := format.FileNamingFormat(cfg.NamingFormat, logic)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
parentPkg, err := getParentPackage(dir)
|
imports := genLogicImports(route, rootPkg)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
imports := genLogicImports(route, parentPkg)
|
|
||||||
var responseString string
|
var responseString string
|
||||||
var returnString string
|
var returnString string
|
||||||
var requestString string
|
var requestString string
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
func genMain(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
func genMain(dir, rootPkg string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||||
name := strings.ToLower(api.Service.Name)
|
name := strings.ToLower(api.Service.Name)
|
||||||
if strings.HasSuffix(name, "-api") {
|
if strings.HasSuffix(name, "-api") {
|
||||||
name = strings.ReplaceAll(name, "-api", "")
|
name = strings.ReplaceAll(name, "-api", "")
|
||||||
@@ -49,11 +49,6 @@ func genMain(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
parentPkg, err := getParentPackage(dir)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return genFile(fileGenConfig{
|
return genFile(fileGenConfig{
|
||||||
dir: dir,
|
dir: dir,
|
||||||
subdir: "",
|
subdir: "",
|
||||||
@@ -63,7 +58,7 @@ func genMain(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
|||||||
templateFile: mainTemplateFile,
|
templateFile: mainTemplateFile,
|
||||||
builtinTemplate: mainTemplate,
|
builtinTemplate: mainTemplate,
|
||||||
data: map[string]string{
|
data: map[string]string{
|
||||||
"importPackages": genMainImports(parentPkg),
|
"importPackages": genMainImports(rootPkg),
|
||||||
"serviceName": api.Service.Name,
|
"serviceName": api.Service.Name,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func (m *{{.name}})Handle(next http.HandlerFunc) http.HandlerFunc {
|
|||||||
`
|
`
|
||||||
|
|
||||||
func genMiddleware(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
func genMiddleware(dir string, cfg *config.Config, api *spec.ApiSpec) error {
|
||||||
var middlewares = getMiddleware(api)
|
middlewares := getMiddleware(api)
|
||||||
for _, item := range middlewares {
|
for _, item := range middlewares {
|
||||||
middlewareFilename := strings.TrimSuffix(strings.ToLower(item), "middleware") + "_middleware"
|
middlewareFilename := strings.TrimSuffix(strings.ToLower(item), "middleware") + "_middleware"
|
||||||
filename, err := format.FileNamingFormat(cfg.NamingFormat, middlewareFilename)
|
filename, err := format.FileNamingFormat(cfg.NamingFormat, middlewareFilename)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user