loading database via driver

This commit is contained in:
Brad Rydzewski 2015-06-14 23:26:49 -07:00
parent ef6b621f7f
commit dc0e714992
3 changed files with 102 additions and 38 deletions

View file

@ -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)

View file

@ -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

View file

@ -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
} }