mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-11-26 20:01:02 +00:00
added blobstore and capability packages
This commit is contained in:
parent
9a3f33b9c3
commit
ed0024efa1
8 changed files with 234 additions and 0 deletions
9
server/blobstore/blobsql/blob.go
Normal file
9
server/blobstore/blobsql/blob.go
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package blobsql
|
||||||
|
|
||||||
|
type Blob struct {
|
||||||
|
ID int64 `meddler:"blob_id,pk" orm:"column(blob_id);pk;auto"`
|
||||||
|
Path string `meddler:"blob_path" orm:"column(blob_path);size(2000);unique"`
|
||||||
|
Data string `meddler:"blob_data,gobgzip" orm:"column(blob_data);type(text)"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Blob) TableName() string { return "blobs" }
|
55
server/blobstore/blobsql/blobstore.go
Normal file
55
server/blobstore/blobsql/blobstore.go
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
package blobsql
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
"github.com/russross/meddler"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Blobstore struct {
|
||||||
|
meddler.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
// Del removes an object from the blobstore.
|
||||||
|
func (b *Blobstore) Del(path string) error {
|
||||||
|
var _, err = b.Exec(deleteBlob, path)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves an object from the blobstore.
|
||||||
|
func (b *Blobstore) Get(path string) ([]byte, error) {
|
||||||
|
var blob = Blob{}
|
||||||
|
var err = meddler.QueryRow(b, &blob, queryBlob, path)
|
||||||
|
return []byte(blob.Data), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetReader retrieves an object from the blobstore.
|
||||||
|
// It is the caller's responsibility to call Close on
|
||||||
|
// the ReadCloser when finished reading.
|
||||||
|
func (b *Blobstore) GetReader(path string) (io.ReadCloser, error) {
|
||||||
|
var blob, err = b.Get(path)
|
||||||
|
var buf = bytes.NewBuffer(blob)
|
||||||
|
return ioutil.NopCloser(buf), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put inserts an object into the blobstore.
|
||||||
|
func (b *Blobstore) Put(path string, data []byte) error {
|
||||||
|
var blob = Blob{}
|
||||||
|
meddler.QueryRow(b, &blob, queryBlob, path)
|
||||||
|
blob.Path = path
|
||||||
|
blob.Data = string(data)
|
||||||
|
return meddler.Save(b, tableBlob, &blob)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutReader inserts an object into the blobstore by
|
||||||
|
// consuming data from r until EOF.
|
||||||
|
func (b *Blobstore) PutReader(path string, r io.Reader) error {
|
||||||
|
var data, _ = ioutil.ReadAll(r)
|
||||||
|
return b.Put(path, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(db meddler.DB) *Blobstore {
|
||||||
|
return &Blobstore{db}
|
||||||
|
}
|
18
server/blobstore/blobsql/const.go
Normal file
18
server/blobstore/blobsql/const.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package blobsql
|
||||||
|
|
||||||
|
const (
|
||||||
|
tableBlob = "blobs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
queryBlob = `
|
||||||
|
SELECT *
|
||||||
|
FROM blobs
|
||||||
|
WHERE blob_path = ?;
|
||||||
|
`
|
||||||
|
|
||||||
|
deleteBlob = `
|
||||||
|
DELETE FROM blobs
|
||||||
|
WHERE blob_path = ?;
|
||||||
|
`
|
||||||
|
)
|
11
server/blobstore/blobsql/context.go
Normal file
11
server/blobstore/blobsql/context.go
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
package blobsql
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.google.com/p/go.net/context"
|
||||||
|
"github.com/drone/drone/server/blobstore"
|
||||||
|
"github.com/russross/meddler"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewContext(parent context.Context, db meddler.DB) context.Context {
|
||||||
|
return blobstore.NewContext(parent, New(db))
|
||||||
|
}
|
55
server/blobstore/blobstore.go
Normal file
55
server/blobstore/blobstore.go
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
package blobstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"code.google.com/p/go.net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Blobstore interface {
|
||||||
|
// Del removes an object from the blobstore.
|
||||||
|
Del(path string) error
|
||||||
|
|
||||||
|
// Get retrieves an object from the blobstore.
|
||||||
|
Get(path string) ([]byte, error)
|
||||||
|
|
||||||
|
// GetReader retrieves an object from the blobstore.
|
||||||
|
// It is the caller's responsibility to call Close on
|
||||||
|
// the ReadCloser when finished reading.
|
||||||
|
GetReader(path string) (io.ReadCloser, error)
|
||||||
|
|
||||||
|
// Put inserts an object into the blobstore.
|
||||||
|
Put(path string, data []byte) error
|
||||||
|
|
||||||
|
// PutReader inserts an object into the blobstore by
|
||||||
|
// consuming data from r until EOF.
|
||||||
|
PutReader(path string, r io.Reader) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Del removes an object from the blobstore.
|
||||||
|
func Del(c context.Context, path string) error {
|
||||||
|
return FromContext(c).Del(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves an object from the blobstore.
|
||||||
|
func Get(c context.Context, path string) ([]byte, error) {
|
||||||
|
return FromContext(c).Get(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetReader retrieves an object from the blobstore.
|
||||||
|
// It is the caller's responsibility to call Close on
|
||||||
|
// the ReadCloser when finished reading.
|
||||||
|
func GetReader(c context.Context, path string) (io.ReadCloser, error) {
|
||||||
|
return FromContext(c).GetReader(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put inserts an object into the blobstore.
|
||||||
|
func Put(c context.Context, path string, data []byte) error {
|
||||||
|
return FromContext(c).Put(path, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutReader inserts an object into the blobstore by
|
||||||
|
// consuming data from r until EOF.
|
||||||
|
func PutReader(c context.Context, path string, r io.Reader) error {
|
||||||
|
return FromContext(c).PutReader(path, r)
|
||||||
|
}
|
31
server/blobstore/context.go
Normal file
31
server/blobstore/context.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package blobstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.google.com/p/go.net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const reqkey = "blobstore"
|
||||||
|
|
||||||
|
// NewContext returns a Context whose Value method returns the
|
||||||
|
// application's Blobstore data.
|
||||||
|
func NewContext(parent context.Context, store Blobstore) context.Context {
|
||||||
|
return &wrapper{parent, store}
|
||||||
|
}
|
||||||
|
|
||||||
|
type wrapper struct {
|
||||||
|
context.Context
|
||||||
|
store Blobstore
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the named key from the context.
|
||||||
|
func (c *wrapper) Value(key interface{}) interface{} {
|
||||||
|
if key == reqkey {
|
||||||
|
return c.store
|
||||||
|
}
|
||||||
|
return c.Context.Value(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromContext returns the Blobstore associated with this context.
|
||||||
|
func FromContext(c context.Context) Blobstore {
|
||||||
|
return c.Value(reqkey).(Blobstore)
|
||||||
|
}
|
23
server/capability/capability.go
Normal file
23
server/capability/capability.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package capability
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.google.com/p/go.net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Capability map[string]bool
|
||||||
|
|
||||||
|
// Get the capability value from the map.
|
||||||
|
func (c Capability) Get(key string) bool {
|
||||||
|
return c.Get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets the capability value in the map.
|
||||||
|
func (c Capability) Set(key string, value bool) {
|
||||||
|
c[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enabled returns true if the capability is
|
||||||
|
// enabled in the system.
|
||||||
|
func Enabled(c context.Context, key string) bool {
|
||||||
|
return FromContext(c).Get(key)
|
||||||
|
}
|
32
server/capability/context.go
Normal file
32
server/capability/context.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package capability
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.google.com/p/go.net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const reqkey = "capability"
|
||||||
|
|
||||||
|
// NewContext returns a Context whose Value method returns the
|
||||||
|
// application's Blobstore data.
|
||||||
|
func NewContext(parent context.Context, caps Capability) context.Context {
|
||||||
|
return &wrapper{parent, caps}
|
||||||
|
}
|
||||||
|
|
||||||
|
type wrapper struct {
|
||||||
|
context.Context
|
||||||
|
caps Capability
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the named key from the context.
|
||||||
|
func (c *wrapper) Value(key interface{}) interface{} {
|
||||||
|
if key == reqkey {
|
||||||
|
return c.caps
|
||||||
|
}
|
||||||
|
return c.Context.Value(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromContext returns the capability map for the
|
||||||
|
// current context.
|
||||||
|
func FromContext(c context.Context) Capability {
|
||||||
|
return c.Value(reqkey).(Capability)
|
||||||
|
}
|
Loading…
Reference in a new issue