re vendor
This commit is contained in:
parent
f7fba882bf
commit
da26ccbc1b
25
Godeps/Godeps.json
generated
25
Godeps/Godeps.json
generated
@ -24,11 +24,6 @@
|
|||||||
"ImportPath": "github.com/beorn7/perks/quantile",
|
"ImportPath": "github.com/beorn7/perks/quantile",
|
||||||
"Rev": "b965b613227fddccbfffe13eae360ed3fa822f8d"
|
"Rev": "b965b613227fddccbfffe13eae360ed3fa822f8d"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/codegangsta/negroni",
|
|
||||||
"Comment": "v0.1-70-gc7477ad",
|
|
||||||
"Rev": "c7477ad8e330bef55bf1ebe300cf8aa67c492d1b"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/coreos/go-systemd/journal",
|
"ImportPath": "github.com/coreos/go-systemd/journal",
|
||||||
"Comment": "v4-34-g4f14f6d",
|
"Comment": "v4-34-g4f14f6d",
|
||||||
@ -170,16 +165,6 @@
|
|||||||
"Comment": "go1.0-cutoff-86-gdd3290b",
|
"Comment": "go1.0-cutoff-86-gdd3290b",
|
||||||
"Rev": "dd3290b2f71a8b30bee8e4e75a337a825263d26f"
|
"Rev": "dd3290b2f71a8b30bee8e4e75a337a825263d26f"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/lib/pq/hstore",
|
|
||||||
"Comment": "go1.0-cutoff-86-gdd3290b",
|
|
||||||
"Rev": "dd3290b2f71a8b30bee8e4e75a337a825263d26f"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ImportPath": "github.com/lib/pq/listen_example",
|
|
||||||
"Comment": "go1.0-cutoff-86-gdd3290b",
|
|
||||||
"Rev": "dd3290b2f71a8b30bee8e4e75a337a825263d26f"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/lib/pq/oid",
|
"ImportPath": "github.com/lib/pq/oid",
|
||||||
"Comment": "go1.0-cutoff-86-gdd3290b",
|
"Comment": "go1.0-cutoff-86-gdd3290b",
|
||||||
@ -204,11 +189,6 @@
|
|||||||
"Comment": "v1.1.0-30-g5510da3",
|
"Comment": "v1.1.0-30-g5510da3",
|
||||||
"Rev": "5510da399572b4962c020184bb291120c0a412e2"
|
"Rev": "5510da399572b4962c020184bb291120c0a412e2"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/mattn/go-sqlite3/sqlite3_test",
|
|
||||||
"Comment": "v1.1.0-30-g5510da3",
|
|
||||||
"Rev": "5510da399572b4962c020184bb291120c0a412e2"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
"ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
||||||
"Rev": "d0c3fe89de86839aecf2e0579c40ba3bb336a453"
|
"Rev": "d0c3fe89de86839aecf2e0579c40ba3bb336a453"
|
||||||
@ -281,11 +261,6 @@
|
|||||||
"Comment": "v1.2.3",
|
"Comment": "v1.2.3",
|
||||||
"Rev": "48afeb21e2fcbcff0f30bd5ad6b97747b0fae38e"
|
"Rev": "48afeb21e2fcbcff0f30bd5ad6b97747b0fae38e"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/tylerb/graceful/tests",
|
|
||||||
"Comment": "v1.2.3",
|
|
||||||
"Rev": "48afeb21e2fcbcff0f30bd5ad6b97747b0fae38e"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/ziutek/mymysql/godrv",
|
"ImportPath": "github.com/ziutek/mymysql/godrv",
|
||||||
"Comment": "v1.5.4-13-g75ce5fb",
|
"Comment": "v1.5.4-13-g75ce5fb",
|
||||||
|
21
vendor/github.com/codegangsta/negroni/LICENSE
generated
vendored
21
vendor/github.com/codegangsta/negroni/LICENSE
generated
vendored
@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jeremy Saenz
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
181
vendor/github.com/codegangsta/negroni/README.md
generated
vendored
181
vendor/github.com/codegangsta/negroni/README.md
generated
vendored
@ -1,181 +0,0 @@
|
|||||||
# Negroni [![GoDoc](https://godoc.org/github.com/codegangsta/negroni?status.svg)](http://godoc.org/github.com/codegangsta/negroni) [![wercker status](https://app.wercker.com/status/13688a4a94b82d84a0b8d038c4965b61/s "wercker status")](https://app.wercker.com/project/bykey/13688a4a94b82d84a0b8d038c4965b61)
|
|
||||||
|
|
||||||
Negroni is an idiomatic approach to web middleware in Go. It is tiny, non-intrusive, and encourages use of `net/http` Handlers.
|
|
||||||
|
|
||||||
If you like the idea of [Martini](http://github.com/go-martini/martini), but you think it contains too much magic, then Negroni is a great fit.
|
|
||||||
|
|
||||||
|
|
||||||
Language Translations:
|
|
||||||
* [Português Brasileiro (pt_BR)](translations/README_pt_br.md)
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
After installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`.
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/codegangsta/negroni"
|
|
||||||
"net/http"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
|
|
||||||
fmt.Fprintf(w, "Welcome to the home page!")
|
|
||||||
})
|
|
||||||
|
|
||||||
n := negroni.Classic()
|
|
||||||
n.UseHandler(mux)
|
|
||||||
n.Run(":3000")
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Then install the Negroni package (**go 1.1** and greater is required):
|
|
||||||
~~~
|
|
||||||
go get github.com/codegangsta/negroni
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Then run your server:
|
|
||||||
~~~
|
|
||||||
go run server.go
|
|
||||||
~~~
|
|
||||||
|
|
||||||
You will now have a Go net/http webserver running on `localhost:3000`.
|
|
||||||
|
|
||||||
## Need Help?
|
|
||||||
If you have a question or feature request, [go ask the mailing list](https://groups.google.com/forum/#!forum/negroni-users). The GitHub issues for Negroni will be used exclusively for bug reports and pull requests.
|
|
||||||
|
|
||||||
## Is Negroni a Framework?
|
|
||||||
Negroni is **not** a framework. It is a library that is designed to work directly with net/http.
|
|
||||||
|
|
||||||
## Routing?
|
|
||||||
Negroni is BYOR (Bring your own Router). The Go community already has a number of great http routers available, Negroni tries to play well with all of them by fully supporting `net/http`. For instance, integrating with [Gorilla Mux](http://github.com/gorilla/mux) looks like so:
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
router := mux.NewRouter()
|
|
||||||
router.HandleFunc("/", HomeHandler)
|
|
||||||
|
|
||||||
n := negroni.New(Middleware1, Middleware2)
|
|
||||||
// Or use a middleware with the Use() function
|
|
||||||
n.Use(Middleware3)
|
|
||||||
// router goes last
|
|
||||||
n.UseHandler(router)
|
|
||||||
|
|
||||||
n.Run(":3000")
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## `negroni.Classic()`
|
|
||||||
`negroni.Classic()` provides some default middleware that is useful for most applications:
|
|
||||||
|
|
||||||
* `negroni.Recovery` - Panic Recovery Middleware.
|
|
||||||
* `negroni.Logging` - Request/Response Logging Middleware.
|
|
||||||
* `negroni.Static` - Static File serving under the "public" directory.
|
|
||||||
|
|
||||||
This makes it really easy to get started with some useful features from Negroni.
|
|
||||||
|
|
||||||
## Handlers
|
|
||||||
Negroni provides a bidirectional middleware flow. This is done through the `negroni.Handler` interface:
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
type Handler interface {
|
|
||||||
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
|
|
||||||
If a middleware hasn't already written to the ResponseWriter, it should call the next `http.HandlerFunc` in the chain to yield to the next middleware handler. This can be used for great good:
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
// do some stuff before
|
|
||||||
next(rw, r)
|
|
||||||
// do some stuff after
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
|
|
||||||
And you can map it to the handler chain with the `Use` function:
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
n := negroni.New()
|
|
||||||
n.Use(negroni.HandlerFunc(MyMiddleware))
|
|
||||||
~~~
|
|
||||||
|
|
||||||
You can also map plain old `http.Handler`s:
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
n := negroni.New()
|
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
// map your routes
|
|
||||||
|
|
||||||
n.UseHandler(mux)
|
|
||||||
|
|
||||||
n.Run(":3000")
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## `Run()`
|
|
||||||
Negroni has a convenience function called `Run`. `Run` takes an addr string identical to [http.ListenAndServe](http://golang.org/pkg/net/http#ListenAndServe).
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
n := negroni.Classic()
|
|
||||||
// ...
|
|
||||||
log.Fatal(http.ListenAndServe(":8080", n))
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Route Specific Middleware
|
|
||||||
If you have a route group of routes that need specific middleware to be executed, you can simply create a new Negroni instance and use it as your route handler.
|
|
||||||
|
|
||||||
~~~ go
|
|
||||||
router := mux.NewRouter()
|
|
||||||
adminRoutes := mux.NewRouter()
|
|
||||||
// add admin routes here
|
|
||||||
|
|
||||||
// Create a new negroni for the admin middleware
|
|
||||||
router.Handle("/admin", negroni.New(
|
|
||||||
Middleware1,
|
|
||||||
Middleware2,
|
|
||||||
negroni.Wrap(adminRoutes),
|
|
||||||
))
|
|
||||||
~~~
|
|
||||||
|
|
||||||
## Third Party Middleware
|
|
||||||
|
|
||||||
Here is a current list of Negroni compatible middlware. Feel free to put up a PR linking your middleware if you have built one:
|
|
||||||
|
|
||||||
|
|
||||||
| Middleware | Author | Description |
|
|
||||||
| -----------|--------|-------------|
|
|
||||||
| [RestGate](https://github.com/pjebs/restgate) | [Prasanga Siripala](https://github.com/pjebs) | Secure authentication for REST API endpoints |
|
|
||||||
| [Graceful](https://github.com/stretchr/graceful) | [Tyler Bunnell](https://github.com/tylerb) | Graceful HTTP Shutdown |
|
|
||||||
| [secure](https://github.com/unrolled/secure) | [Cory Jacobsen](https://github.com/unrolled) | Middleware that implements a few quick security wins |
|
|
||||||
| [JWT Middleware](https://github.com/auth0/go-jwt-middleware) | [Auth0](https://github.com/auth0) | Middleware checks for a JWT on the `Authorization` header on incoming requests and decodes it|
|
|
||||||
| [binding](https://github.com/mholt/binding) | [Matt Holt](https://github.com/mholt) | Data binding from HTTP requests into structs |
|
|
||||||
| [logrus](https://github.com/meatballhat/negroni-logrus) | [Dan Buch](https://github.com/meatballhat) | Logrus-based logger |
|
|
||||||
| [render](https://github.com/unrolled/render) | [Cory Jacobsen](https://github.com/unrolled) | Render JSON, XML and HTML templates |
|
|
||||||
| [gorelic](https://github.com/jingweno/negroni-gorelic) | [Jingwen Owen Ou](https://github.com/jingweno) | New Relic agent for Go runtime |
|
|
||||||
| [gzip](https://github.com/phyber/negroni-gzip) | [phyber](https://github.com/phyber) | GZIP response compression |
|
|
||||||
| [oauth2](https://github.com/goincremental/negroni-oauth2) | [David Bochenski](https://github.com/bochenski) | oAuth2 middleware |
|
|
||||||
| [sessions](https://github.com/goincremental/negroni-sessions) | [David Bochenski](https://github.com/bochenski) | Session Management |
|
|
||||||
| [permissions2](https://github.com/xyproto/permissions2) | [Alexander Rødseth](https://github.com/xyproto) | Cookies, users and permissions |
|
|
||||||
| [onthefly](https://github.com/xyproto/onthefly) | [Alexander Rødseth](https://github.com/xyproto) | Generate TinySVG, HTML and CSS on the fly |
|
|
||||||
| [cors](https://github.com/rs/cors) | [Olivier Poitrey](https://github.com/rs) | [Cross Origin Resource Sharing](http://www.w3.org/TR/cors/) (CORS) support |
|
|
||||||
| [xrequestid](https://github.com/pilu/xrequestid) | [Andrea Franz](https://github.com/pilu) | Middleware that assigns a random X-Request-Id header to each request |
|
|
||||||
| [VanGoH](https://github.com/auroratechnologies/vangoh) | [Taylor Wrobel](https://github.com/twrobel3) | Configurable [AWS-Style](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html) HMAC authentication middleware |
|
|
||||||
| [stats](https://github.com/thoas/stats) | [Florent Messa](https://github.com/thoas) | Store information about your web application (response time, etc.) |
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
[Alexander Rødseth](https://github.com/xyproto) created [mooseware](https://github.com/xyproto/mooseware), a skeleton for writing a Negroni middleware handler.
|
|
||||||
|
|
||||||
## Live code reload?
|
|
||||||
[gin](https://github.com/codegangsta/gin) and [fresh](https://github.com/pilu/fresh) both live reload negroni apps.
|
|
||||||
|
|
||||||
## Essential Reading for Beginners of Go & Negroni
|
|
||||||
|
|
||||||
* [Using a Context to pass information from middleware to end handler](http://elithrar.github.io/article/map-string-interface/)
|
|
||||||
* [Understanding middleware](http://mattstauffer.co/blog/laravel-5.0-middleware-replacing-filters)
|
|
||||||
|
|
||||||
## About
|
|
||||||
|
|
||||||
Negroni is obsessively designed by none other than the [Code Gangsta](http://codegangsta.io/)
|
|
25
vendor/github.com/codegangsta/negroni/doc.go
generated
vendored
25
vendor/github.com/codegangsta/negroni/doc.go
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
// Package negroni is an idiomatic approach to web middleware in Go. It is tiny, non-intrusive, and encourages use of net/http Handlers.
|
|
||||||
//
|
|
||||||
// If you like the idea of Martini, but you think it contains too much magic, then Negroni is a great fit.
|
|
||||||
//
|
|
||||||
// For a full guide visit http://github.com/codegangsta/negroni
|
|
||||||
//
|
|
||||||
// package main
|
|
||||||
//
|
|
||||||
// import (
|
|
||||||
// "github.com/codegangsta/negroni"
|
|
||||||
// "net/http"
|
|
||||||
// "fmt"
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// func main() {
|
|
||||||
// mux := http.NewServeMux()
|
|
||||||
// mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
|
|
||||||
// fmt.Fprintf(w, "Welcome to the home page!")
|
|
||||||
// })
|
|
||||||
//
|
|
||||||
// n := negroni.Classic()
|
|
||||||
// n.UseHandler(mux)
|
|
||||||
// n.Run(":3000")
|
|
||||||
// }
|
|
||||||
package negroni
|
|
29
vendor/github.com/codegangsta/negroni/logger.go
generated
vendored
29
vendor/github.com/codegangsta/negroni/logger.go
generated
vendored
@ -1,29 +0,0 @@
|
|||||||
package negroni
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Logger is a middleware handler that logs the request as it goes in and the response as it goes out.
|
|
||||||
type Logger struct {
|
|
||||||
// Logger inherits from log.Logger used to log messages with the Logger middleware
|
|
||||||
*log.Logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewLogger returns a new Logger instance
|
|
||||||
func NewLogger() *Logger {
|
|
||||||
return &Logger{log.New(os.Stdout, "[negroni] ", 0)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Logger) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
start := time.Now()
|
|
||||||
l.Printf("Started %s %s", r.Method, r.URL.Path)
|
|
||||||
|
|
||||||
next(rw, r)
|
|
||||||
|
|
||||||
res := rw.(ResponseWriter)
|
|
||||||
l.Printf("Completed %v %s in %v", res.Status(), http.StatusText(res.Status()), time.Since(start))
|
|
||||||
}
|
|
129
vendor/github.com/codegangsta/negroni/negroni.go
generated
vendored
129
vendor/github.com/codegangsta/negroni/negroni.go
generated
vendored
@ -1,129 +0,0 @@
|
|||||||
package negroni
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Handler handler is an interface that objects can implement to be registered to serve as middleware
|
|
||||||
// in the Negroni middleware stack.
|
|
||||||
// ServeHTTP should yield to the next middleware in the chain by invoking the next http.HandlerFunc
|
|
||||||
// passed in.
|
|
||||||
//
|
|
||||||
// If the Handler writes to the ResponseWriter, the next http.HandlerFunc should not be invoked.
|
|
||||||
type Handler interface {
|
|
||||||
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandlerFunc is an adapter to allow the use of ordinary functions as Negroni handlers.
|
|
||||||
// If f is a function with the appropriate signature, HandlerFunc(f) is a Handler object that calls f.
|
|
||||||
type HandlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
|
|
||||||
|
|
||||||
func (h HandlerFunc) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
h(rw, r, next)
|
|
||||||
}
|
|
||||||
|
|
||||||
type middleware struct {
|
|
||||||
handler Handler
|
|
||||||
next *middleware
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m middleware) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
|
|
||||||
m.handler.ServeHTTP(rw, r, m.next.ServeHTTP)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap converts a http.Handler into a negroni.Handler so it can be used as a Negroni
|
|
||||||
// middleware. The next http.HandlerFunc is automatically called after the Handler
|
|
||||||
// is executed.
|
|
||||||
func Wrap(handler http.Handler) Handler {
|
|
||||||
return HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
handler.ServeHTTP(rw, r)
|
|
||||||
next(rw, r)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Negroni is a stack of Middleware Handlers that can be invoked as an http.Handler.
|
|
||||||
// Negroni middleware is evaluated in the order that they are added to the stack using
|
|
||||||
// the Use and UseHandler methods.
|
|
||||||
type Negroni struct {
|
|
||||||
middleware middleware
|
|
||||||
handlers []Handler
|
|
||||||
}
|
|
||||||
|
|
||||||
// New returns a new Negroni instance with no middleware preconfigured.
|
|
||||||
func New(handlers ...Handler) *Negroni {
|
|
||||||
return &Negroni{
|
|
||||||
handlers: handlers,
|
|
||||||
middleware: build(handlers),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Classic returns a new Negroni instance with the default middleware already
|
|
||||||
// in the stack.
|
|
||||||
//
|
|
||||||
// Recovery - Panic Recovery Middleware
|
|
||||||
// Logger - Request/Response Logging
|
|
||||||
// Static - Static File Serving
|
|
||||||
func Classic() *Negroni {
|
|
||||||
return New(NewRecovery(), NewLogger(), NewStatic(http.Dir("public")))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
|
|
||||||
n.middleware.ServeHTTP(NewResponseWriter(rw), r)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use adds a Handler onto the middleware stack. Handlers are invoked in the order they are added to a Negroni.
|
|
||||||
func (n *Negroni) Use(handler Handler) {
|
|
||||||
n.handlers = append(n.handlers, handler)
|
|
||||||
n.middleware = build(n.handlers)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UseFunc adds a Negroni-style handler function onto the middleware stack.
|
|
||||||
func (n *Negroni) UseFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)) {
|
|
||||||
n.Use(HandlerFunc(handlerFunc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// UseHandler adds a http.Handler onto the middleware stack. Handlers are invoked in the order they are added to a Negroni.
|
|
||||||
func (n *Negroni) UseHandler(handler http.Handler) {
|
|
||||||
n.Use(Wrap(handler))
|
|
||||||
}
|
|
||||||
|
|
||||||
// UseHandler adds a http.HandlerFunc-style handler function onto the middleware stack.
|
|
||||||
func (n *Negroni) UseHandlerFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request)) {
|
|
||||||
n.UseHandler(http.HandlerFunc(handlerFunc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run is a convenience function that runs the negroni stack as an HTTP
|
|
||||||
// server. The addr string takes the same format as http.ListenAndServe.
|
|
||||||
func (n *Negroni) Run(addr string) {
|
|
||||||
l := log.New(os.Stdout, "[negroni] ", 0)
|
|
||||||
l.Printf("listening on %s", addr)
|
|
||||||
l.Fatal(http.ListenAndServe(addr, n))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a list of all the handlers in the current Negroni middleware chain.
|
|
||||||
func (n *Negroni) Handlers() []Handler {
|
|
||||||
return n.handlers
|
|
||||||
}
|
|
||||||
|
|
||||||
func build(handlers []Handler) middleware {
|
|
||||||
var next middleware
|
|
||||||
|
|
||||||
if len(handlers) == 0 {
|
|
||||||
return voidMiddleware()
|
|
||||||
} else if len(handlers) > 1 {
|
|
||||||
next = build(handlers[1:])
|
|
||||||
} else {
|
|
||||||
next = voidMiddleware()
|
|
||||||
}
|
|
||||||
|
|
||||||
return middleware{handlers[0], &next}
|
|
||||||
}
|
|
||||||
|
|
||||||
func voidMiddleware() middleware {
|
|
||||||
return middleware{
|
|
||||||
HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {}),
|
|
||||||
&middleware{},
|
|
||||||
}
|
|
||||||
}
|
|
46
vendor/github.com/codegangsta/negroni/recovery.go
generated
vendored
46
vendor/github.com/codegangsta/negroni/recovery.go
generated
vendored
@ -1,46 +0,0 @@
|
|||||||
package negroni
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Recovery is a Negroni middleware that recovers from any panics and writes a 500 if there was one.
|
|
||||||
type Recovery struct {
|
|
||||||
Logger *log.Logger
|
|
||||||
PrintStack bool
|
|
||||||
StackAll bool
|
|
||||||
StackSize int
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewRecovery returns a new instance of Recovery
|
|
||||||
func NewRecovery() *Recovery {
|
|
||||||
return &Recovery{
|
|
||||||
Logger: log.New(os.Stdout, "[negroni] ", 0),
|
|
||||||
PrintStack: true,
|
|
||||||
StackAll: false,
|
|
||||||
StackSize: 1024 * 8,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rec *Recovery) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
rw.WriteHeader(http.StatusInternalServerError)
|
|
||||||
stack := make([]byte, rec.StackSize)
|
|
||||||
stack = stack[:runtime.Stack(stack, rec.StackAll)]
|
|
||||||
|
|
||||||
f := "PANIC: %s\n%s"
|
|
||||||
rec.Logger.Printf(f, err, stack)
|
|
||||||
|
|
||||||
if rec.PrintStack {
|
|
||||||
fmt.Fprintf(rw, f, err, stack)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
next(rw, r)
|
|
||||||
}
|
|
96
vendor/github.com/codegangsta/negroni/response_writer.go
generated
vendored
96
vendor/github.com/codegangsta/negroni/response_writer.go
generated
vendored
@ -1,96 +0,0 @@
|
|||||||
package negroni
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ResponseWriter is a wrapper around http.ResponseWriter that provides extra information about
|
|
||||||
// the response. It is recommended that middleware handlers use this construct to wrap a responsewriter
|
|
||||||
// if the functionality calls for it.
|
|
||||||
type ResponseWriter interface {
|
|
||||||
http.ResponseWriter
|
|
||||||
http.Flusher
|
|
||||||
// Status returns the status code of the response or 0 if the response has not been written.
|
|
||||||
Status() int
|
|
||||||
// Written returns whether or not the ResponseWriter has been written.
|
|
||||||
Written() bool
|
|
||||||
// Size returns the size of the response body.
|
|
||||||
Size() int
|
|
||||||
// Before allows for a function to be called before the ResponseWriter has been written to. This is
|
|
||||||
// useful for setting headers or any other operations that must happen before a response has been written.
|
|
||||||
Before(func(ResponseWriter))
|
|
||||||
}
|
|
||||||
|
|
||||||
type beforeFunc func(ResponseWriter)
|
|
||||||
|
|
||||||
// NewResponseWriter creates a ResponseWriter that wraps an http.ResponseWriter
|
|
||||||
func NewResponseWriter(rw http.ResponseWriter) ResponseWriter {
|
|
||||||
return &responseWriter{rw, 0, 0, nil}
|
|
||||||
}
|
|
||||||
|
|
||||||
type responseWriter struct {
|
|
||||||
http.ResponseWriter
|
|
||||||
status int
|
|
||||||
size int
|
|
||||||
beforeFuncs []beforeFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) WriteHeader(s int) {
|
|
||||||
rw.status = s
|
|
||||||
rw.callBefore()
|
|
||||||
rw.ResponseWriter.WriteHeader(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Write(b []byte) (int, error) {
|
|
||||||
if !rw.Written() {
|
|
||||||
// The status will be StatusOK if WriteHeader has not been called yet
|
|
||||||
rw.WriteHeader(http.StatusOK)
|
|
||||||
}
|
|
||||||
size, err := rw.ResponseWriter.Write(b)
|
|
||||||
rw.size += size
|
|
||||||
return size, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Status() int {
|
|
||||||
return rw.status
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Size() int {
|
|
||||||
return rw.size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Written() bool {
|
|
||||||
return rw.status != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Before(before func(ResponseWriter)) {
|
|
||||||
rw.beforeFuncs = append(rw.beforeFuncs, before)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
|
||||||
hijacker, ok := rw.ResponseWriter.(http.Hijacker)
|
|
||||||
if !ok {
|
|
||||||
return nil, nil, fmt.Errorf("the ResponseWriter doesn't support the Hijacker interface")
|
|
||||||
}
|
|
||||||
return hijacker.Hijack()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) CloseNotify() <-chan bool {
|
|
||||||
return rw.ResponseWriter.(http.CloseNotifier).CloseNotify()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) callBefore() {
|
|
||||||
for i := len(rw.beforeFuncs) - 1; i >= 0; i-- {
|
|
||||||
rw.beforeFuncs[i](rw)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rw *responseWriter) Flush() {
|
|
||||||
flusher, ok := rw.ResponseWriter.(http.Flusher)
|
|
||||||
if ok {
|
|
||||||
flusher.Flush()
|
|
||||||
}
|
|
||||||
}
|
|
84
vendor/github.com/codegangsta/negroni/static.go
generated
vendored
84
vendor/github.com/codegangsta/negroni/static.go
generated
vendored
@ -1,84 +0,0 @@
|
|||||||
package negroni
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"path"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Static is a middleware handler that serves static files in the given directory/filesystem.
|
|
||||||
type Static struct {
|
|
||||||
// Dir is the directory to serve static files from
|
|
||||||
Dir http.FileSystem
|
|
||||||
// Prefix is the optional prefix used to serve the static directory content
|
|
||||||
Prefix string
|
|
||||||
// IndexFile defines which file to serve as index if it exists.
|
|
||||||
IndexFile string
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewStatic returns a new instance of Static
|
|
||||||
func NewStatic(directory http.FileSystem) *Static {
|
|
||||||
return &Static{
|
|
||||||
Dir: directory,
|
|
||||||
Prefix: "",
|
|
||||||
IndexFile: "index.html",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Static) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
|
||||||
if r.Method != "GET" && r.Method != "HEAD" {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
file := r.URL.Path
|
|
||||||
// if we have a prefix, filter requests by stripping the prefix
|
|
||||||
if s.Prefix != "" {
|
|
||||||
if !strings.HasPrefix(file, s.Prefix) {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
file = file[len(s.Prefix):]
|
|
||||||
if file != "" && file[0] != '/' {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
f, err := s.Dir.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
// discard the error?
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
fi, err := f.Stat()
|
|
||||||
if err != nil {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to serve index file
|
|
||||||
if fi.IsDir() {
|
|
||||||
// redirect if missing trailing slash
|
|
||||||
if !strings.HasSuffix(r.URL.Path, "/") {
|
|
||||||
http.Redirect(rw, r, r.URL.Path+"/", http.StatusFound)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
file = path.Join(file, s.IndexFile)
|
|
||||||
f, err = s.Dir.Open(file)
|
|
||||||
if err != nil {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
fi, err = f.Stat()
|
|
||||||
if err != nil || fi.IsDir() {
|
|
||||||
next(rw, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
http.ServeContent(rw, r, file, fi.ModTime(), f)
|
|
||||||
}
|
|
118
vendor/github.com/lib/pq/hstore/hstore.go
generated
vendored
118
vendor/github.com/lib/pq/hstore/hstore.go
generated
vendored
@ -1,118 +0,0 @@
|
|||||||
package hstore
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"database/sql/driver"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A wrapper for transferring Hstore values back and forth easily.
|
|
||||||
type Hstore struct {
|
|
||||||
Map map[string]sql.NullString
|
|
||||||
}
|
|
||||||
|
|
||||||
// escapes and quotes hstore keys/values
|
|
||||||
// s should be a sql.NullString or string
|
|
||||||
func hQuote(s interface{}) string {
|
|
||||||
var str string
|
|
||||||
switch v := s.(type) {
|
|
||||||
case sql.NullString:
|
|
||||||
if !v.Valid {
|
|
||||||
return "NULL"
|
|
||||||
}
|
|
||||||
str = v.String
|
|
||||||
case string:
|
|
||||||
str = v
|
|
||||||
default:
|
|
||||||
panic("not a string or sql.NullString")
|
|
||||||
}
|
|
||||||
|
|
||||||
str = strings.Replace(str, "\\", "\\\\", -1)
|
|
||||||
return `"` + strings.Replace(str, "\"", "\\\"", -1) + `"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan implements the Scanner interface.
|
|
||||||
//
|
|
||||||
// Note h.Map is reallocated before the scan to clear existing values. If the
|
|
||||||
// hstore column's database value is NULL, then h.Map is set to nil instead.
|
|
||||||
func (h *Hstore) Scan(value interface{}) error {
|
|
||||||
if value == nil {
|
|
||||||
h.Map = nil
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
h.Map = make(map[string]sql.NullString)
|
|
||||||
var b byte
|
|
||||||
pair := [][]byte{{}, {}}
|
|
||||||
pi := 0
|
|
||||||
inQuote := false
|
|
||||||
didQuote := false
|
|
||||||
sawSlash := false
|
|
||||||
bindex := 0
|
|
||||||
for bindex, b = range value.([]byte) {
|
|
||||||
if sawSlash {
|
|
||||||
pair[pi] = append(pair[pi], b)
|
|
||||||
sawSlash = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch b {
|
|
||||||
case '\\':
|
|
||||||
sawSlash = true
|
|
||||||
continue
|
|
||||||
case '"':
|
|
||||||
inQuote = !inQuote
|
|
||||||
if !didQuote {
|
|
||||||
didQuote = true
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
default:
|
|
||||||
if !inQuote {
|
|
||||||
switch b {
|
|
||||||
case ' ', '\t', '\n', '\r':
|
|
||||||
continue
|
|
||||||
case '=':
|
|
||||||
continue
|
|
||||||
case '>':
|
|
||||||
pi = 1
|
|
||||||
didQuote = false
|
|
||||||
continue
|
|
||||||
case ',':
|
|
||||||
s := string(pair[1])
|
|
||||||
if !didQuote && len(s) == 4 && strings.ToLower(s) == "null" {
|
|
||||||
h.Map[string(pair[0])] = sql.NullString{String: "", Valid: false}
|
|
||||||
} else {
|
|
||||||
h.Map[string(pair[0])] = sql.NullString{String: string(pair[1]), Valid: true}
|
|
||||||
}
|
|
||||||
pair[0] = []byte{}
|
|
||||||
pair[1] = []byte{}
|
|
||||||
pi = 0
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pair[pi] = append(pair[pi], b)
|
|
||||||
}
|
|
||||||
if bindex > 0 {
|
|
||||||
s := string(pair[1])
|
|
||||||
if !didQuote && len(s) == 4 && strings.ToLower(s) == "null" {
|
|
||||||
h.Map[string(pair[0])] = sql.NullString{String: "", Valid: false}
|
|
||||||
} else {
|
|
||||||
h.Map[string(pair[0])] = sql.NullString{String: string(pair[1]), Valid: true}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value implements the driver Valuer interface. Note if h.Map is nil, the
|
|
||||||
// database column value will be set to NULL.
|
|
||||||
func (h Hstore) Value() (driver.Value, error) {
|
|
||||||
if h.Map == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
parts := []string{}
|
|
||||||
for key, val := range h.Map {
|
|
||||||
thispart := hQuote(key) + "=>" + hQuote(val)
|
|
||||||
parts = append(parts, thispart)
|
|
||||||
}
|
|
||||||
return []byte(strings.Join(parts, ",")), nil
|
|
||||||
}
|
|
102
vendor/github.com/lib/pq/listen_example/doc.go
generated
vendored
102
vendor/github.com/lib/pq/listen_example/doc.go
generated
vendored
@ -1,102 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
Below you will find a self-contained Go program which uses the LISTEN / NOTIFY
|
|
||||||
mechanism to avoid polling the database while waiting for more work to arrive.
|
|
||||||
|
|
||||||
//
|
|
||||||
// You can see the program in action by defining a function similar to
|
|
||||||
// the following:
|
|
||||||
//
|
|
||||||
// CREATE OR REPLACE FUNCTION public.get_work()
|
|
||||||
// RETURNS bigint
|
|
||||||
// LANGUAGE sql
|
|
||||||
// AS $$
|
|
||||||
// SELECT CASE WHEN random() >= 0.2 THEN int8 '1' END
|
|
||||||
// $$
|
|
||||||
// ;
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/lib/pq"
|
|
||||||
)
|
|
||||||
|
|
||||||
func doWork(db *sql.DB, work int64) {
|
|
||||||
// work here
|
|
||||||
}
|
|
||||||
|
|
||||||
func getWork(db *sql.DB) {
|
|
||||||
for {
|
|
||||||
// get work from the database here
|
|
||||||
var work sql.NullInt64
|
|
||||||
err := db.QueryRow("SELECT get_work()").Scan(&work)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("call to get_work() failed: ", err)
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !work.Valid {
|
|
||||||
// no more work to do
|
|
||||||
fmt.Println("ran out of work")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("starting work on ", work.Int64)
|
|
||||||
go doWork(db, work.Int64)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func waitForNotification(l *pq.Listener) {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-l.Notify:
|
|
||||||
fmt.Println("received notification, new work available")
|
|
||||||
return
|
|
||||||
case <-time.After(90 * time.Second):
|
|
||||||
go func() {
|
|
||||||
l.Ping()
|
|
||||||
}()
|
|
||||||
// Check if there's more work available, just in case it takes
|
|
||||||
// a while for the Listener to notice connection loss and
|
|
||||||
// reconnect.
|
|
||||||
fmt.Println("received no work for 90 seconds, checking for new work")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var conninfo string = ""
|
|
||||||
|
|
||||||
db, err := sql.Open("postgres", conninfo)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
reportProblem := func(ev pq.ListenerEventType, err error) {
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
listener := pq.NewListener(conninfo, 10 * time.Second, time.Minute, reportProblem)
|
|
||||||
err = listener.Listen("getwork")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("entering main loop")
|
|
||||||
for {
|
|
||||||
// process all available work before waiting for notifications
|
|
||||||
getWork(db)
|
|
||||||
waitForNotification(listener)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
package listen_example
|
|
409
vendor/github.com/mattn/go-sqlite3/sqlite3_test/sqltest.go
generated
vendored
409
vendor/github.com/mattn/go-sqlite3/sqlite3_test/sqltest.go
generated
vendored
@ -1,409 +0,0 @@
|
|||||||
package sqlite3_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"sync"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Dialect int
|
|
||||||
|
|
||||||
const (
|
|
||||||
SQLITE Dialect = iota
|
|
||||||
POSTGRESQL
|
|
||||||
MYSQL
|
|
||||||
)
|
|
||||||
|
|
||||||
type DB struct {
|
|
||||||
*testing.T
|
|
||||||
*sql.DB
|
|
||||||
dialect Dialect
|
|
||||||
once sync.Once
|
|
||||||
}
|
|
||||||
|
|
||||||
var db *DB
|
|
||||||
|
|
||||||
// the following tables will be created and dropped during the test
|
|
||||||
var testTables = []string{"foo", "bar", "t", "bench"}
|
|
||||||
|
|
||||||
var tests = []testing.InternalTest{
|
|
||||||
{"TestBlobs", TestBlobs},
|
|
||||||
{"TestManyQueryRow", TestManyQueryRow},
|
|
||||||
{"TestTxQuery", TestTxQuery},
|
|
||||||
{"TestPreparedStmt", TestPreparedStmt},
|
|
||||||
}
|
|
||||||
|
|
||||||
var benchmarks = []testing.InternalBenchmark{
|
|
||||||
{"BenchmarkExec", BenchmarkExec},
|
|
||||||
{"BenchmarkQuery", BenchmarkQuery},
|
|
||||||
{"BenchmarkParams", BenchmarkParams},
|
|
||||||
{"BenchmarkStmt", BenchmarkStmt},
|
|
||||||
{"BenchmarkRows", BenchmarkRows},
|
|
||||||
{"BenchmarkStmtRows", BenchmarkStmtRows},
|
|
||||||
}
|
|
||||||
|
|
||||||
// RunTests runs the SQL test suite
|
|
||||||
func RunTests(t *testing.T, d *sql.DB, dialect Dialect) {
|
|
||||||
db = &DB{t, d, dialect, sync.Once{}}
|
|
||||||
testing.RunTests(func(string, string) (bool, error) { return true, nil }, tests)
|
|
||||||
|
|
||||||
if !testing.Short() {
|
|
||||||
for _, b := range benchmarks {
|
|
||||||
fmt.Printf("%-20s", b.Name)
|
|
||||||
r := testing.Benchmark(b.F)
|
|
||||||
fmt.Printf("%10d %10.0f req/s\n", r.N, float64(r.N)/r.T.Seconds())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
db.tearDown()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *DB) mustExec(sql string, args ...interface{}) sql.Result {
|
|
||||||
res, err := db.Exec(sql, args...)
|
|
||||||
if err != nil {
|
|
||||||
db.Fatalf("Error running %q: %v", sql, err)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *DB) tearDown() {
|
|
||||||
for _, tbl := range testTables {
|
|
||||||
switch db.dialect {
|
|
||||||
case SQLITE:
|
|
||||||
db.mustExec("drop table if exists " + tbl)
|
|
||||||
case MYSQL, POSTGRESQL:
|
|
||||||
db.mustExec("drop table if exists " + tbl)
|
|
||||||
default:
|
|
||||||
db.Fatal("unkown dialect")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// q replaces ? parameters if needed
|
|
||||||
func (db *DB) q(sql string) string {
|
|
||||||
switch db.dialect {
|
|
||||||
case POSTGRESQL: // repace with $1, $2, ..
|
|
||||||
qrx := regexp.MustCompile(`\?`)
|
|
||||||
n := 0
|
|
||||||
return qrx.ReplaceAllStringFunc(sql, func(string) string {
|
|
||||||
n++
|
|
||||||
return "$" + strconv.Itoa(n)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return sql
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *DB) blobType(size int) string {
|
|
||||||
switch db.dialect {
|
|
||||||
case SQLITE:
|
|
||||||
return fmt.Sprintf("blob[%d]", size)
|
|
||||||
case POSTGRESQL:
|
|
||||||
return "bytea"
|
|
||||||
case MYSQL:
|
|
||||||
return fmt.Sprintf("VARBINARY(%d)", size)
|
|
||||||
}
|
|
||||||
panic("unkown dialect")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *DB) serialPK() string {
|
|
||||||
switch db.dialect {
|
|
||||||
case SQLITE:
|
|
||||||
return "integer primary key autoincrement"
|
|
||||||
case POSTGRESQL:
|
|
||||||
return "serial primary key"
|
|
||||||
case MYSQL:
|
|
||||||
return "integer primary key auto_increment"
|
|
||||||
}
|
|
||||||
panic("unkown dialect")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *DB) now() string {
|
|
||||||
switch db.dialect {
|
|
||||||
case SQLITE:
|
|
||||||
return "datetime('now')"
|
|
||||||
case POSTGRESQL:
|
|
||||||
return "now()"
|
|
||||||
case MYSQL:
|
|
||||||
return "now()"
|
|
||||||
}
|
|
||||||
panic("unkown dialect")
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeBench() {
|
|
||||||
if _, err := db.Exec("create table bench (n varchar(32), i integer, d double, s varchar(32), t datetime)"); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
st, err := db.Prepare("insert into bench values (?, ?, ?, ?, ?)")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer st.Close()
|
|
||||||
for i := 0; i < 100; i++ {
|
|
||||||
if _, err = st.Exec(nil, i, float64(i), fmt.Sprintf("%d", i), time.Now()); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestResult(t *testing.T) {
|
|
||||||
db.tearDown()
|
|
||||||
db.mustExec("create temporary table test (id " + db.serialPK() + ", name varchar(10))")
|
|
||||||
|
|
||||||
for i := 1; i < 3; i++ {
|
|
||||||
r := db.mustExec(db.q("insert into test (name) values (?)"), fmt.Sprintf("row %d", i))
|
|
||||||
n, err := r.RowsAffected()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if n != 1 {
|
|
||||||
t.Errorf("got %v, want %v", n, 1)
|
|
||||||
}
|
|
||||||
n, err = r.LastInsertId()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if n != int64(i) {
|
|
||||||
t.Errorf("got %v, want %v", n, i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err := db.Exec("error!"); err == nil {
|
|
||||||
t.Fatalf("expected error")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBlobs(t *testing.T) {
|
|
||||||
db.tearDown()
|
|
||||||
var blob = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
|
|
||||||
db.mustExec("create table foo (id integer primary key, bar " + db.blobType(16) + ")")
|
|
||||||
db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 0, blob)
|
|
||||||
|
|
||||||
want := fmt.Sprintf("%x", blob)
|
|
||||||
|
|
||||||
b := make([]byte, 16)
|
|
||||||
err := db.QueryRow(db.q("select bar from foo where id = ?"), 0).Scan(&b)
|
|
||||||
got := fmt.Sprintf("%x", b)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("[]byte scan: %v", err)
|
|
||||||
} else if got != want {
|
|
||||||
t.Errorf("for []byte, got %q; want %q", got, want)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = db.QueryRow(db.q("select bar from foo where id = ?"), 0).Scan(&got)
|
|
||||||
want = string(blob)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("string scan: %v", err)
|
|
||||||
} else if got != want {
|
|
||||||
t.Errorf("for string, got %q; want %q", got, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestManyQueryRow(t *testing.T) {
|
|
||||||
if testing.Short() {
|
|
||||||
t.Log("skipping in short mode")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
db.tearDown()
|
|
||||||
db.mustExec("create table foo (id integer primary key, name varchar(50))")
|
|
||||||
db.mustExec(db.q("insert into foo (id, name) values(?,?)"), 1, "bob")
|
|
||||||
var name string
|
|
||||||
for i := 0; i < 10000; i++ {
|
|
||||||
err := db.QueryRow(db.q("select name from foo where id = ?"), 1).Scan(&name)
|
|
||||||
if err != nil || name != "bob" {
|
|
||||||
t.Fatalf("on query %d: err=%v, name=%q", i, err, name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTxQuery(t *testing.T) {
|
|
||||||
db.tearDown()
|
|
||||||
tx, err := db.Begin()
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer tx.Rollback()
|
|
||||||
|
|
||||||
_, err = tx.Exec("create table foo (id integer primary key, name varchar(50))")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = tx.Exec(db.q("insert into foo (id, name) values(?,?)"), 1, "bob")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
r, err := tx.Query(db.q("select name from foo where id = ?"), 1)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer r.Close()
|
|
||||||
|
|
||||||
if !r.Next() {
|
|
||||||
if r.Err() != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
t.Fatal("expected one rows")
|
|
||||||
}
|
|
||||||
|
|
||||||
var name string
|
|
||||||
err = r.Scan(&name)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPreparedStmt(t *testing.T) {
|
|
||||||
db.tearDown()
|
|
||||||
db.mustExec("CREATE TABLE t (count INT)")
|
|
||||||
sel, err := db.Prepare("SELECT count FROM t ORDER BY count DESC")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("prepare 1: %v", err)
|
|
||||||
}
|
|
||||||
ins, err := db.Prepare(db.q("INSERT INTO t (count) VALUES (?)"))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("prepare 2: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for n := 1; n <= 3; n++ {
|
|
||||||
if _, err := ins.Exec(n); err != nil {
|
|
||||||
t.Fatalf("insert(%d) = %v", n, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const nRuns = 10
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
for i := 0; i < nRuns; i++ {
|
|
||||||
wg.Add(1)
|
|
||||||
go func() {
|
|
||||||
defer wg.Done()
|
|
||||||
for j := 0; j < 10; j++ {
|
|
||||||
count := 0
|
|
||||||
if err := sel.QueryRow().Scan(&count); err != nil && err != sql.ErrNoRows {
|
|
||||||
t.Errorf("Query: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if _, err := ins.Exec(rand.Intn(100)); err != nil {
|
|
||||||
t.Errorf("Insert: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
wg.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Benchmarks need to use panic() since b.Error errors are lost when
|
|
||||||
// running via testing.Benchmark() I would like to run these via go
|
|
||||||
// test -bench but calling Benchmark() from a benchmark test
|
|
||||||
// currently hangs go.
|
|
||||||
|
|
||||||
func BenchmarkExec(b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
if _, err := db.Exec("select 1"); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkQuery(b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
var n sql.NullString
|
|
||||||
var i int
|
|
||||||
var f float64
|
|
||||||
var s string
|
|
||||||
// var t time.Time
|
|
||||||
if err := db.QueryRow("select null, 1, 1.1, 'foo'").Scan(&n, &i, &f, &s); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkParams(b *testing.B) {
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
var n sql.NullString
|
|
||||||
var i int
|
|
||||||
var f float64
|
|
||||||
var s string
|
|
||||||
// var t time.Time
|
|
||||||
if err := db.QueryRow("select ?, ?, ?, ?", nil, 1, 1.1, "foo").Scan(&n, &i, &f, &s); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStmt(b *testing.B) {
|
|
||||||
st, err := db.Prepare("select ?, ?, ?, ?")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer st.Close()
|
|
||||||
|
|
||||||
for n := 0; n < b.N; n++ {
|
|
||||||
var n sql.NullString
|
|
||||||
var i int
|
|
||||||
var f float64
|
|
||||||
var s string
|
|
||||||
// var t time.Time
|
|
||||||
if err := st.QueryRow(nil, 1, 1.1, "foo").Scan(&n, &i, &f, &s); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkRows(b *testing.B) {
|
|
||||||
db.once.Do(makeBench)
|
|
||||||
|
|
||||||
for n := 0; n < b.N; n++ {
|
|
||||||
var n sql.NullString
|
|
||||||
var i int
|
|
||||||
var f float64
|
|
||||||
var s string
|
|
||||||
var t time.Time
|
|
||||||
r, err := db.Query("select * from bench")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for r.Next() {
|
|
||||||
if err = r.Scan(&n, &i, &f, &s, &t); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err = r.Err(); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStmtRows(b *testing.B) {
|
|
||||||
db.once.Do(makeBench)
|
|
||||||
|
|
||||||
st, err := db.Prepare("select * from bench")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer st.Close()
|
|
||||||
|
|
||||||
for n := 0; n < b.N; n++ {
|
|
||||||
var n sql.NullString
|
|
||||||
var i int
|
|
||||||
var f float64
|
|
||||||
var s string
|
|
||||||
var t time.Time
|
|
||||||
r, err := st.Query()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for r.Next() {
|
|
||||||
if err = r.Scan(&n, &i, &f, &s, &t); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err = r.Err(); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
201
vendor/github.com/prometheus/client_model/ruby/LICENSE
generated
vendored
201
vendor/github.com/prometheus/client_model/ruby/LICENSE
generated
vendored
@ -1,201 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
40
vendor/github.com/tylerb/graceful/tests/main.go
generated
vendored
40
vendor/github.com/tylerb/graceful/tests/main.go
generated
vendored
@ -1,40 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/codegangsta/negroni"
|
|
||||||
"github.com/tylerb/graceful"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
|
|
||||||
wg.Add(3)
|
|
||||||
go func() {
|
|
||||||
n := negroni.New()
|
|
||||||
fmt.Println("Launching server on :3000")
|
|
||||||
graceful.Run(":3000", 0, n)
|
|
||||||
fmt.Println("Terminated server on :3000")
|
|
||||||
wg.Done()
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
n := negroni.New()
|
|
||||||
fmt.Println("Launching server on :3001")
|
|
||||||
graceful.Run(":3001", 0, n)
|
|
||||||
fmt.Println("Terminated server on :3001")
|
|
||||||
wg.Done()
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
n := negroni.New()
|
|
||||||
fmt.Println("Launching server on :3002")
|
|
||||||
graceful.Run(":3002", 0, n)
|
|
||||||
fmt.Println("Terminated server on :3002")
|
|
||||||
wg.Done()
|
|
||||||
}()
|
|
||||||
fmt.Println("Press ctrl+c. All servers should terminate.")
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
}
|
|
24
vendor/github.com/ziutek/mymysql/autorc/LICENSE
generated
vendored
24
vendor/github.com/ziutek/mymysql/autorc/LICENSE
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
Copyright (c) 2010, Michal Derkacz
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
24
vendor/github.com/ziutek/mymysql/thrsafe/LICENSE
generated
vendored
24
vendor/github.com/ziutek/mymysql/thrsafe/LICENSE
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
Copyright (c) 2010, Michal Derkacz
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Loading…
Reference in New Issue
Block a user