loading database via driver
This commit is contained in:
parent
ef6b621f7f
commit
dc0e714992
3 changed files with 102 additions and 38 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin"
|
"github.com/drone/drone/Godeps/_workspace/src/github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
@ -17,7 +18,9 @@ import (
|
||||||
eventbus "github.com/drone/drone/pkg/bus/builtin"
|
eventbus "github.com/drone/drone/pkg/bus/builtin"
|
||||||
queue "github.com/drone/drone/pkg/queue/builtin"
|
queue "github.com/drone/drone/pkg/queue/builtin"
|
||||||
runner "github.com/drone/drone/pkg/runner/builtin"
|
runner "github.com/drone/drone/pkg/runner/builtin"
|
||||||
store "github.com/drone/drone/pkg/store/builtin"
|
"github.com/drone/drone/pkg/store"
|
||||||
|
|
||||||
|
_ "github.com/drone/drone/pkg/store/builtin"
|
||||||
|
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
)
|
)
|
||||||
|
@ -42,9 +45,10 @@ func main() {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
db := store.MustConnect(settings.Database.Driver, settings.Database.Datasource)
|
store, err := store.New(os.Getenv("DATABASE"))
|
||||||
store := store.New(db)
|
if err != nil {
|
||||||
defer db.Close()
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
remote := github.New(settings)
|
remote := github.New(settings)
|
||||||
session := session.New(settings)
|
session := session.New(settings)
|
||||||
|
|
|
@ -2,6 +2,7 @@ package builtin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/drone/drone/pkg/store"
|
"github.com/drone/drone/pkg/store"
|
||||||
|
@ -19,6 +20,28 @@ const (
|
||||||
driverMysql = "mysql"
|
driverMysql = "mysql"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
store.Register("sqlite3", NewDriver)
|
||||||
|
store.Register("postgres", NewDriver)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDriver(dsn string) (store.Store, error) {
|
||||||
|
uri, err := url.Parse(dsn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
driver := uri.Scheme
|
||||||
|
if uri.Scheme == "sqlite3" {
|
||||||
|
uri.Scheme = ""
|
||||||
|
}
|
||||||
|
datasource := uri.String()
|
||||||
|
conn, err := Connect(driver, datasource)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return New(conn), nil
|
||||||
|
}
|
||||||
|
|
||||||
// Connect is a helper function that establishes a new
|
// Connect is a helper function that establishes a new
|
||||||
// database connection and auto-generates the database
|
// database connection and auto-generates the database
|
||||||
// schema. If the database already exists, it will perform
|
// schema. If the database already exists, it will perform
|
||||||
|
|
|
@ -1,115 +1,152 @@
|
||||||
package store
|
package store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
common "github.com/drone/drone/pkg/types"
|
"github.com/drone/drone/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var drivers = make(map[string]DriverFunc)
|
||||||
|
|
||||||
|
// Register makes a datastore driver available by the provided name.
|
||||||
|
// If Register is called twice with the same name or if driver is nil,
|
||||||
|
// it panics.
|
||||||
|
func Register(name string, driver DriverFunc) {
|
||||||
|
if driver == nil {
|
||||||
|
panic("datastore: Register driver is nil")
|
||||||
|
}
|
||||||
|
if _, dup := drivers[name]; dup {
|
||||||
|
panic("datastore: Register called twice for driver " + name)
|
||||||
|
}
|
||||||
|
drivers[name] = driver
|
||||||
|
}
|
||||||
|
|
||||||
|
// DriverFunc returns a new connection to the datastore.
|
||||||
|
// The name is a string in a driver-specific format.
|
||||||
|
type DriverFunc func(name string) (Store, error)
|
||||||
|
|
||||||
|
// New creates a new database connection specified by its database driver
|
||||||
|
// name and a driver-specific data source name, usually consisting of at
|
||||||
|
// least a database name and connection information.
|
||||||
|
func New(dsn string) (Store, error) {
|
||||||
|
uri, err := url.Parse(dsn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
driver := uri.Scheme
|
||||||
|
fn, ok := drivers[driver]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("datastore: unknown driver %q", driver)
|
||||||
|
}
|
||||||
|
return fn(dsn)
|
||||||
|
}
|
||||||
|
|
||||||
type Store interface {
|
type Store interface {
|
||||||
|
|
||||||
// User returns a user by user ID.
|
// User returns a user by user ID.
|
||||||
User(id int64) (*common.User, error)
|
User(id int64) (*types.User, error)
|
||||||
|
|
||||||
// UserLogin returns a user by user login.
|
// UserLogin returns a user by user login.
|
||||||
UserLogin(string) (*common.User, error)
|
UserLogin(string) (*types.User, error)
|
||||||
|
|
||||||
// UserList returns a list of all registered users.
|
// UserList returns a list of all registered users.
|
||||||
UserList() ([]*common.User, error)
|
UserList() ([]*types.User, error)
|
||||||
|
|
||||||
// UserFeed retrieves a digest of recent builds
|
// UserFeed retrieves a digest of recent builds
|
||||||
// from the datastore accessible to the specified user.
|
// from the datastore accessible to the specified user.
|
||||||
UserFeed(*common.User, int, int) ([]*common.RepoCommit, error)
|
UserFeed(*types.User, int, int) ([]*types.RepoCommit, error)
|
||||||
|
|
||||||
// UserCount returns a count of all registered users.
|
// UserCount returns a count of all registered users.
|
||||||
UserCount() (int, error)
|
UserCount() (int, error)
|
||||||
|
|
||||||
// AddUser inserts a new user into the datastore.
|
// AddUser inserts a new user into the datastore.
|
||||||
// If the user login already exists an error is returned.
|
// If the user login already exists an error is returned.
|
||||||
AddUser(*common.User) error
|
AddUser(*types.User) error
|
||||||
|
|
||||||
// SetUser updates an existing user.
|
// SetUser updates an existing user.
|
||||||
SetUser(*common.User) error
|
SetUser(*types.User) error
|
||||||
|
|
||||||
// DelUser removes the user from the datastore.
|
// DelUser removes the user from the datastore.
|
||||||
DelUser(*common.User) error
|
DelUser(*types.User) error
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
// Token returns a token by ID.
|
// Token returns a token by ID.
|
||||||
Token(int64) (*common.Token, error)
|
Token(int64) (*types.Token, error)
|
||||||
|
|
||||||
// TokenLabel returns a token by label
|
// TokenLabel returns a token by label
|
||||||
TokenLabel(*common.User, string) (*common.Token, error)
|
TokenLabel(*types.User, string) (*types.Token, error)
|
||||||
|
|
||||||
// TokenList returns a list of all user tokens.
|
// TokenList returns a list of all user tokens.
|
||||||
TokenList(*common.User) ([]*common.Token, error)
|
TokenList(*types.User) ([]*types.Token, error)
|
||||||
|
|
||||||
// AddToken inserts a new token into the datastore.
|
// AddToken inserts a new token into the datastore.
|
||||||
// If the token label already exists for the user
|
// If the token label already exists for the user
|
||||||
// an error is returned.
|
// an error is returned.
|
||||||
AddToken(*common.Token) error
|
AddToken(*types.Token) error
|
||||||
|
|
||||||
// DelToken removes the DelToken from the datastore.
|
// DelToken removes the DelToken from the datastore.
|
||||||
DelToken(*common.Token) error
|
DelToken(*types.Token) error
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
// Starred returns true if the user starred
|
// Starred returns true if the user starred
|
||||||
// the given repository.
|
// the given repository.
|
||||||
Starred(*common.User, *common.Repo) (bool, error)
|
Starred(*types.User, *types.Repo) (bool, error)
|
||||||
|
|
||||||
// AddStar stars a repository.
|
// AddStar stars a repository.
|
||||||
AddStar(*common.User, *common.Repo) error
|
AddStar(*types.User, *types.Repo) error
|
||||||
|
|
||||||
// DelStar unstars a repository.
|
// DelStar unstars a repository.
|
||||||
DelStar(*common.User, *common.Repo) error
|
DelStar(*types.User, *types.Repo) error
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
// Repo retrieves a specific repo from the
|
// Repo retrieves a specific repo from the
|
||||||
// datastore for the given ID.
|
// datastore for the given ID.
|
||||||
Repo(id int64) (*common.Repo, error)
|
Repo(id int64) (*types.Repo, error)
|
||||||
|
|
||||||
// RepoName retrieves a repo from the datastore
|
// RepoName retrieves a repo from the datastore
|
||||||
// for the specified name.
|
// for the specified name.
|
||||||
RepoName(owner, name string) (*common.Repo, error)
|
RepoName(owner, name string) (*types.Repo, error)
|
||||||
|
|
||||||
// RepoList retrieves a list of all repos from
|
// RepoList retrieves a list of all repos from
|
||||||
// the datastore accessible by the given user ID.
|
// the datastore accessible by the given user ID.
|
||||||
RepoList(*common.User) ([]*common.Repo, error)
|
RepoList(*types.User) ([]*types.Repo, error)
|
||||||
|
|
||||||
// AddRepo inserts a repo in the datastore.
|
// AddRepo inserts a repo in the datastore.
|
||||||
AddRepo(*common.Repo) error
|
AddRepo(*types.Repo) error
|
||||||
|
|
||||||
// SetRepo updates a repo in the datastore.
|
// SetRepo updates a repo in the datastore.
|
||||||
SetRepo(*common.Repo) error
|
SetRepo(*types.Repo) error
|
||||||
|
|
||||||
// DelRepo removes the repo from the datastore.
|
// DelRepo removes the repo from the datastore.
|
||||||
DelRepo(*common.Repo) error
|
DelRepo(*types.Repo) error
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
// Commit gets a commit by ID
|
// Commit gets a commit by ID
|
||||||
Commit(int64) (*common.Commit, error)
|
Commit(int64) (*types.Commit, error)
|
||||||
|
|
||||||
// CommitSeq gets the specified commit sequence for the
|
// CommitSeq gets the specified commit sequence for the
|
||||||
// named repository and commit number
|
// named repository and commit number
|
||||||
CommitSeq(*common.Repo, int) (*common.Commit, error)
|
CommitSeq(*types.Repo, int) (*types.Commit, error)
|
||||||
|
|
||||||
// CommitLast gets the last executed commit for the
|
// CommitLast gets the last executed commit for the
|
||||||
// named repository and branch
|
// named repository and branch
|
||||||
CommitLast(*common.Repo, string) (*common.Commit, error)
|
CommitLast(*types.Repo, string) (*types.Commit, error)
|
||||||
|
|
||||||
// CommitList gets a list of recent commits for the
|
// CommitList gets a list of recent commits for the
|
||||||
// named repository.
|
// named repository.
|
||||||
CommitList(*common.Repo, int, int) ([]*common.Commit, error)
|
CommitList(*types.Repo, int, int) ([]*types.Commit, error)
|
||||||
|
|
||||||
// AddCommit inserts a new commit in the datastore.
|
// AddCommit inserts a new commit in the datastore.
|
||||||
AddCommit(*common.Commit) error
|
AddCommit(*types.Commit) error
|
||||||
|
|
||||||
// SetCommit updates an existing commit and commit tasks.
|
// SetCommit updates an existing commit and commit tasks.
|
||||||
SetCommit(*common.Commit) error
|
SetCommit(*types.Commit) error
|
||||||
|
|
||||||
// KillCommits updates all pending or started commits
|
// KillCommits updates all pending or started commits
|
||||||
// in the datastore settings the status to killed.
|
// in the datastore settings the status to killed.
|
||||||
|
@ -118,16 +155,16 @@ type Store interface {
|
||||||
//
|
//
|
||||||
|
|
||||||
// Build returns a build by ID.
|
// Build returns a build by ID.
|
||||||
Build(int64) (*common.Build, error)
|
Build(int64) (*types.Build, error)
|
||||||
|
|
||||||
// BuildSeq returns a build by sequence number.
|
// BuildSeq returns a build by sequence number.
|
||||||
BuildSeq(*common.Commit, int) (*common.Build, error)
|
BuildSeq(*types.Commit, int) (*types.Build, error)
|
||||||
|
|
||||||
// BuildList returns a list of all commit builds
|
// BuildList returns a list of all commit builds
|
||||||
BuildList(*common.Commit) ([]*common.Build, error)
|
BuildList(*types.Commit) ([]*types.Build, error)
|
||||||
|
|
||||||
// SetBuild updates an existing build.
|
// SetBuild updates an existing build.
|
||||||
SetBuild(*common.Build) error
|
SetBuild(*types.Build) error
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -152,8 +189,8 @@ type Store interface {
|
||||||
//
|
//
|
||||||
|
|
||||||
// Agent returns an agent by ID.
|
// Agent returns an agent by ID.
|
||||||
Agent(*common.Commit) (string, error)
|
Agent(*types.Commit) (string, error)
|
||||||
|
|
||||||
// SetAgent updates an agent in the datastore.
|
// SetAgent updates an agent in the datastore.
|
||||||
SetAgent(*common.Commit, string) error
|
SetAgent(*types.Commit, string) error
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue