backported 0.5 database restructure to 0.4.1

This commit is contained in:
Brad Rydzewski 2016-03-25 12:54:16 -07:00
parent 1d17c276fd
commit 688b29b639
34 changed files with 484 additions and 660 deletions

View file

@ -31,7 +31,7 @@ gen_template:
go generate github.com/drone/drone/template go generate github.com/drone/drone/template
gen_migrations: gen_migrations:
go generate github.com/drone/drone/store/migration go generate github.com/drone/drone/store/datastore/ddl
build: build:
go build go build

View file

@ -38,7 +38,7 @@ func GetLogin(c *gin.Context) {
// get the user from the database // get the user from the database
u, err := store.GetUserLogin(c, tmpuser.Login) u, err := store.GetUserLogin(c, tmpuser.Login)
if err != nil { if err != nil {
count, err := store.CountUsers(c) count, err := store.GetUserCount(c)
if err != nil { if err != nil {
log.Errorf("cannot register %s. %s", tmpuser.Login, err) log.Errorf("cannot register %s. %s", tmpuser.Login, err)
c.Redirect(303, "/login?error=internal_error") c.Redirect(303, "/login?error=internal_error")

View file

@ -76,7 +76,7 @@ func Load(env envconfig.Env, s store.Store) Engine {
} }
} }
nodes, err := s.Nodes().GetList() nodes, err := s.GetNodeList()
if err != nil { if err != nil {
log.Fatalf("failed to get nodes from database. %s", err) log.Fatalf("failed to get nodes from database. %s", err)
} }

View file

@ -1,71 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type BuildStore interface {
// Get gets a build by unique ID.
Get(int64) (*model.Build, error)
// GetNumber gets a build by number.
GetNumber(*model.Repo, int) (*model.Build, error)
// GetRef gets a build by its ref.
GetRef(*model.Repo, string) (*model.Build, error)
// GetCommit gets a build by its commit sha.
GetCommit(*model.Repo, string, string) (*model.Build, error)
// GetLast gets the last build for the branch.
GetLast(*model.Repo, string) (*model.Build, error)
// GetLastBefore gets the last build before build number N.
GetLastBefore(*model.Repo, string, int64) (*model.Build, error)
// GetList gets a list of builds for the repository
GetList(*model.Repo) ([]*model.Build, error)
// Create creates a new build and jobs.
Create(*model.Build, ...*model.Job) error
// Update updates a build.
Update(*model.Build) error
}
func GetBuild(c context.Context, id int64) (*model.Build, error) {
return FromContext(c).Builds().Get(id)
}
func GetBuildNumber(c context.Context, repo *model.Repo, num int) (*model.Build, error) {
return FromContext(c).Builds().GetNumber(repo, num)
}
func GetBuildRef(c context.Context, repo *model.Repo, ref string) (*model.Build, error) {
return FromContext(c).Builds().GetRef(repo, ref)
}
func GetBuildCommit(c context.Context, repo *model.Repo, sha, branch string) (*model.Build, error) {
return FromContext(c).Builds().GetCommit(repo, sha, branch)
}
func GetBuildLast(c context.Context, repo *model.Repo, branch string) (*model.Build, error) {
return FromContext(c).Builds().GetLast(repo, branch)
}
func GetBuildLastBefore(c context.Context, repo *model.Repo, branch string, number int64) (*model.Build, error) {
return FromContext(c).Builds().GetLastBefore(repo, branch, number)
}
func GetBuildList(c context.Context, repo *model.Repo) ([]*model.Build, error) {
return FromContext(c).Builds().GetList(repo)
}
func CreateBuild(c context.Context, build *model.Build, jobs ...*model.Job) error {
return FromContext(c).Builds().Create(build, jobs...)
}
func UpdateBuild(c context.Context, build *model.Build) error {
return FromContext(c).Builds().Update(build)
}

View file

@ -1,60 +1,55 @@
package datastore package datastore
import ( import (
"database/sql"
"time" "time"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type buildstore struct { func (db *datastore) GetBuild(id int64) (*model.Build, error) {
*sql.DB
}
func (db *buildstore) Get(id int64) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.Load(db, buildTable, build, id) var err = meddler.Load(db, buildTable, build, id)
return build, err return build, err
} }
func (db *buildstore) GetNumber(repo *model.Repo, num int) (*model.Build, error) { func (db *datastore) GetBuildNumber(repo *model.Repo, num int) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.QueryRow(db, build, rebind(buildNumberQuery), repo.ID, num) var err = meddler.QueryRow(db, build, rebind(buildNumberQuery), repo.ID, num)
return build, err return build, err
} }
func (db *buildstore) GetRef(repo *model.Repo, ref string) (*model.Build, error) { func (db *datastore) GetBuildRef(repo *model.Repo, ref string) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.QueryRow(db, build, rebind(buildRefQuery), repo.ID, ref) var err = meddler.QueryRow(db, build, rebind(buildRefQuery), repo.ID, ref)
return build, err return build, err
} }
func (db *buildstore) GetCommit(repo *model.Repo, sha, branch string) (*model.Build, error) { func (db *datastore) GetBuildCommit(repo *model.Repo, sha, branch string) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.QueryRow(db, build, rebind(buildCommitQuery), repo.ID, sha, branch) var err = meddler.QueryRow(db, build, rebind(buildCommitQuery), repo.ID, sha, branch)
return build, err return build, err
} }
func (db *buildstore) GetLast(repo *model.Repo, branch string) (*model.Build, error) { func (db *datastore) GetBuildLast(repo *model.Repo, branch string) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.QueryRow(db, build, rebind(buildLastQuery), repo.ID, branch) var err = meddler.QueryRow(db, build, rebind(buildLastQuery), repo.ID, branch)
return build, err return build, err
} }
func (db *buildstore) GetLastBefore(repo *model.Repo, branch string, num int64) (*model.Build, error) { func (db *datastore) GetBuildLastBefore(repo *model.Repo, branch string, num int64) (*model.Build, error) {
var build = new(model.Build) var build = new(model.Build)
var err = meddler.QueryRow(db, build, rebind(buildLastBeforeQuery), repo.ID, branch, num) var err = meddler.QueryRow(db, build, rebind(buildLastBeforeQuery), repo.ID, branch, num)
return build, err return build, err
} }
func (db *buildstore) GetList(repo *model.Repo) ([]*model.Build, error) { func (db *datastore) GetBuildList(repo *model.Repo) ([]*model.Build, error) {
var builds = []*model.Build{} var builds = []*model.Build{}
var err = meddler.QueryAll(db, &builds, rebind(buildListQuery), repo.ID) var err = meddler.QueryAll(db, &builds, rebind(buildListQuery), repo.ID)
return builds, err return builds, err
} }
func (db *buildstore) Create(build *model.Build, jobs ...*model.Job) error { func (db *datastore) CreateBuild(build *model.Build, jobs ...*model.Job) error {
var number int var number int
db.QueryRow(rebind(buildNumberLast), build.RepoID).Scan(&number) db.QueryRow(rebind(buildNumberLast), build.RepoID).Scan(&number)
build.Number = number + 1 build.Number = number + 1
@ -76,7 +71,7 @@ func (db *buildstore) Create(build *model.Build, jobs ...*model.Job) error {
return nil return nil
} }
func (db *buildstore) Update(build *model.Build) error { func (db *datastore) UpdateBuild(build *model.Build) error {
return meddler.Update(db, buildTable, build) return meddler.Update(db, buildTable, build)
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_buildstore(t *testing.T) { func TestBuilds(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
@ -28,7 +28,7 @@ func Test_buildstore(t *testing.T) {
Status: model.StatusSuccess, Status: model.StatusSuccess,
Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac",
} }
err := s.Builds().Create(&build, []*model.Job{}...) err := s.CreateBuild(&build, []*model.Job{}...)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(build.ID != 0).IsTrue() g.Assert(build.ID != 0).IsTrue()
g.Assert(build.Number).Equal(1) g.Assert(build.Number).Equal(1)
@ -42,10 +42,10 @@ func Test_buildstore(t *testing.T) {
Status: model.StatusSuccess, Status: model.StatusSuccess,
Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac",
} }
s.Builds().Create(&build, []*model.Job{}...) s.CreateBuild(&build, []*model.Job{}...)
build.Status = model.StatusRunning build.Status = model.StatusRunning
err1 := s.Builds().Update(&build) err1 := s.UpdateBuild(&build)
getbuild, err2 := s.Builds().Get(build.ID) getbuild, err2 := s.GetBuild(build.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(build.ID).Equal(getbuild.ID) g.Assert(build.ID).Equal(getbuild.ID)
@ -59,8 +59,8 @@ func Test_buildstore(t *testing.T) {
RepoID: 1, RepoID: 1,
Status: model.StatusSuccess, Status: model.StatusSuccess,
} }
s.Builds().Create(&build, []*model.Job{}...) s.CreateBuild(&build, []*model.Job{}...)
getbuild, err := s.Builds().Get(build.ID) getbuild, err := s.GetBuild(build.ID)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(build.ID).Equal(getbuild.ID) g.Assert(build.ID).Equal(getbuild.ID)
g.Assert(build.RepoID).Equal(getbuild.RepoID) g.Assert(build.RepoID).Equal(getbuild.RepoID)
@ -76,9 +76,9 @@ func Test_buildstore(t *testing.T) {
RepoID: 1, RepoID: 1,
Status: model.StatusPending, Status: model.StatusPending,
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
getbuild, err3 := s.Builds().GetNumber(&model.Repo{ID: 1}, build2.Number) getbuild, err3 := s.GetBuildNumber(&model.Repo{ID: 1}, build2.Number)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -98,9 +98,9 @@ func Test_buildstore(t *testing.T) {
Status: model.StatusPending, Status: model.StatusPending,
Ref: "refs/pull/6", Ref: "refs/pull/6",
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
getbuild, err3 := s.Builds().GetRef(&model.Repo{ID: 1}, "refs/pull/6") getbuild, err3 := s.GetBuildRef(&model.Repo{ID: 1}, "refs/pull/6")
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -121,9 +121,9 @@ func Test_buildstore(t *testing.T) {
Status: model.StatusPending, Status: model.StatusPending,
Ref: "refs/pull/6", Ref: "refs/pull/6",
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
getbuild, err3 := s.Builds().GetRef(&model.Repo{ID: 1}, "refs/pull/6") getbuild, err3 := s.GetBuildRef(&model.Repo{ID: 1}, "refs/pull/6")
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -146,9 +146,9 @@ func Test_buildstore(t *testing.T) {
Branch: "dev", Branch: "dev",
Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa",
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
getbuild, err3 := s.Builds().GetCommit(&model.Repo{ID: 1}, build2.Commit, build2.Branch) getbuild, err3 := s.GetBuildCommit(&model.Repo{ID: 1}, build2.Commit, build2.Branch)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -174,9 +174,9 @@ func Test_buildstore(t *testing.T) {
Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa",
Event: model.EventPush, Event: model.EventPush,
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
getbuild, err3 := s.Builds().GetLast(&model.Repo{ID: 1}, build2.Branch) getbuild, err3 := s.GetBuildLast(&model.Repo{ID: 1}, build2.Branch)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -207,10 +207,10 @@ func Test_buildstore(t *testing.T) {
Branch: "master", Branch: "master",
Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa",
} }
err1 := s.Builds().Create(build1, []*model.Job{}...) err1 := s.CreateBuild(build1, []*model.Job{}...)
err2 := s.Builds().Create(build2, []*model.Job{}...) err2 := s.CreateBuild(build2, []*model.Job{}...)
err3 := s.Builds().Create(build3, []*model.Job{}...) err3 := s.CreateBuild(build3, []*model.Job{}...)
getbuild, err4 := s.Builds().GetLastBefore(&model.Repo{ID: 1}, build3.Branch, build3.ID) getbuild, err4 := s.GetBuildLastBefore(&model.Repo{ID: 1}, build3.Branch, build3.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -232,9 +232,9 @@ func Test_buildstore(t *testing.T) {
RepoID: 1, RepoID: 1,
Status: model.StatusSuccess, Status: model.StatusSuccess,
} }
s.Builds().Create(build1, []*model.Job{}...) s.CreateBuild(build1, []*model.Job{}...)
s.Builds().Create(build2, []*model.Job{}...) s.CreateBuild(build2, []*model.Job{}...)
builds, err := s.Builds().GetList(&model.Repo{ID: 1}) builds, err := s.GetBuildList(&model.Repo{ID: 1})
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(len(builds)).Equal(2) g.Assert(len(builds)).Equal(2)
g.Assert(builds[0].ID).Equal(build2.ID) g.Assert(builds[0].ID).Equal(build2.ID)

View file

@ -0,0 +1,3 @@
package ddl
//go:generate go-bindata -pkg ddl -o ddl_gen.go sqlite3/ mysql/ postgres/

View file

@ -1,39 +1,33 @@
package datastore package datastore
import ( import (
"database/sql"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type jobstore struct { func (db *datastore) GetJob(id int64) (*model.Job, error) {
*sql.DB
}
func (db *jobstore) Get(id int64) (*model.Job, error) {
var job = new(model.Job) var job = new(model.Job)
var err = meddler.Load(db, jobTable, job, id) var err = meddler.Load(db, jobTable, job, id)
return job, err return job, err
} }
func (db *jobstore) GetNumber(build *model.Build, num int) (*model.Job, error) { func (db *datastore) GetJobNumber(build *model.Build, num int) (*model.Job, error) {
var job = new(model.Job) var job = new(model.Job)
var err = meddler.QueryRow(db, job, rebind(jobNumberQuery), build.ID, num) var err = meddler.QueryRow(db, job, rebind(jobNumberQuery), build.ID, num)
return job, err return job, err
} }
func (db *jobstore) GetList(build *model.Build) ([]*model.Job, error) { func (db *datastore) GetJobList(build *model.Build) ([]*model.Job, error) {
var jobs = []*model.Job{} var jobs = []*model.Job{}
var err = meddler.QueryAll(db, &jobs, rebind(jobListQuery), build.ID) var err = meddler.QueryAll(db, &jobs, rebind(jobListQuery), build.ID)
return jobs, err return jobs, err
} }
func (db *jobstore) Create(job *model.Job) error { func (db *datastore) CreateJob(job *model.Job) error {
return meddler.Insert(db, jobTable, job) return meddler.Insert(db, jobTable, job)
} }
func (db *jobstore) Update(job *model.Job) error { func (db *datastore) UpdateJob(job *model.Job) error {
return meddler.Update(db, jobTable, job) return meddler.Update(db, jobTable, job)
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_jobstore(t *testing.T) { func TestJobs(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
@ -28,15 +28,15 @@ func Test_jobstore(t *testing.T) {
ExitCode: 0, ExitCode: 0,
Number: 1, Number: 1,
} }
err1 := s.Jobs().Create(job) err1 := s.CreateJob(job)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(job.ID != 0).IsTrue() g.Assert(job.ID != 0).IsTrue()
job.Status = "started" job.Status = "started"
err2 := s.Jobs().Update(job) err2 := s.UpdateJob(job)
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
getjob, err3 := s.Jobs().Get(job.ID) getjob, err3 := s.GetJob(job.ID)
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
g.Assert(getjob.Status).Equal(job.Status) g.Assert(getjob.Status).Equal(job.Status)
}) })
@ -49,11 +49,11 @@ func Test_jobstore(t *testing.T) {
Number: 1, Number: 1,
Environment: map[string]string{"foo": "bar"}, Environment: map[string]string{"foo": "bar"},
} }
err1 := s.Jobs().Create(job) err1 := s.CreateJob(job)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(job.ID != 0).IsTrue() g.Assert(job.ID != 0).IsTrue()
getjob, err2 := s.Jobs().Get(job.ID) getjob, err2 := s.GetJob(job.ID)
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(getjob.ID).Equal(job.ID) g.Assert(getjob.ID).Equal(job.ID)
g.Assert(getjob.Status).Equal(job.Status) g.Assert(getjob.Status).Equal(job.Status)
@ -69,11 +69,11 @@ func Test_jobstore(t *testing.T) {
ExitCode: 1, ExitCode: 1,
Number: 1, Number: 1,
} }
err1 := s.Jobs().Create(job) err1 := s.CreateJob(job)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(job.ID != 0).IsTrue() g.Assert(job.ID != 0).IsTrue()
getjob, err2 := s.Jobs().GetNumber(&model.Build{ID: 1}, 1) getjob, err2 := s.GetJobNumber(&model.Build{ID: 1}, 1)
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(getjob.ID).Equal(job.ID) g.Assert(getjob.ID).Equal(job.ID)
g.Assert(getjob.Status).Equal(job.Status) g.Assert(getjob.Status).Equal(job.Status)
@ -106,9 +106,9 @@ func Test_jobstore(t *testing.T) {
}, },
} }
err1 := s.Builds().Create(&build, jobs...) err1 := s.CreateBuild(&build, jobs...)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
getjobs, err2 := s.Jobs().GetList(&build) getjobs, err2 := s.GetJobList(&build)
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(len(getjobs)).Equal(3) g.Assert(len(getjobs)).Equal(3)
g.Assert(getjobs[0].Number).Equal(1) g.Assert(getjobs[0].Number).Equal(1)

View file

@ -1,31 +1,25 @@
package datastore package datastore
import ( import (
"database/sql"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type keystore struct { func (db *datastore) GetKey(repo *model.Repo) (*model.Key, error) {
*sql.DB
}
func (db *keystore) Get(repo *model.Repo) (*model.Key, error) {
var key = new(model.Key) var key = new(model.Key)
var err = meddler.QueryRow(db, key, rebind(keyQuery), repo.ID) var err = meddler.QueryRow(db, key, rebind(keyQuery), repo.ID)
return key, err return key, err
} }
func (db *keystore) Create(key *model.Key) error { func (db *datastore) CreateKey(key *model.Key) error {
return meddler.Save(db, keyTable, key) return meddler.Save(db, keyTable, key)
} }
func (db *keystore) Update(key *model.Key) error { func (db *datastore) UpdateKey(key *model.Key) error {
return meddler.Save(db, keyTable, key) return meddler.Save(db, keyTable, key)
} }
func (db *keystore) Delete(key *model.Key) error { func (db *datastore) DeleteKey(key *model.Key) error {
var _, err = db.Exec(rebind(keyDeleteStmt), key.ID) var _, err = db.Exec(rebind(keyDeleteStmt), key.ID)
return err return err
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_keystore(t *testing.T) { func TestKeys(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
@ -27,7 +27,7 @@ func Test_keystore(t *testing.T) {
Public: fakePublicKey, Public: fakePublicKey,
Private: fakePrivateKey, Private: fakePrivateKey,
} }
err := s.Keys().Create(&key) err := s.CreateKey(&key)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(key.ID != 0).IsTrue() g.Assert(key.ID != 0).IsTrue()
}) })
@ -38,15 +38,15 @@ func Test_keystore(t *testing.T) {
Public: fakePublicKey, Public: fakePublicKey,
Private: fakePrivateKey, Private: fakePrivateKey,
} }
err := s.Keys().Create(&key) err := s.CreateKey(&key)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(key.ID != 0).IsTrue() g.Assert(key.ID != 0).IsTrue()
key.Private = "" key.Private = ""
key.Public = "" key.Public = ""
err1 := s.Keys().Update(&key) err1 := s.UpdateKey(&key)
getkey, err2 := s.Keys().Get(&model.Repo{ID: 1}) getkey, err2 := s.GetKey(&model.Repo{ID: 1})
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(key.ID).Equal(getkey.ID) g.Assert(key.ID).Equal(getkey.ID)
@ -60,11 +60,11 @@ func Test_keystore(t *testing.T) {
Public: fakePublicKey, Public: fakePublicKey,
Private: fakePrivateKey, Private: fakePrivateKey,
} }
err := s.Keys().Create(&key) err := s.CreateKey(&key)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(key.ID != 0).IsTrue() g.Assert(key.ID != 0).IsTrue()
getkey, err := s.Keys().Get(&model.Repo{ID: 1}) getkey, err := s.GetKey(&model.Repo{ID: 1})
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(key.ID).Equal(getkey.ID) g.Assert(key.ID).Equal(getkey.ID)
g.Assert(key.Public).Equal(getkey.Public) g.Assert(key.Public).Equal(getkey.Public)
@ -77,12 +77,12 @@ func Test_keystore(t *testing.T) {
Public: fakePublicKey, Public: fakePublicKey,
Private: fakePrivateKey, Private: fakePrivateKey,
} }
err1 := s.Keys().Create(&key) err1 := s.CreateKey(&key)
err2 := s.Keys().Delete(&key) err2 := s.DeleteKey(&key)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
_, err := s.Keys().Get(&model.Repo{ID: 1}) _, err := s.GetKey(&model.Repo{ID: 1})
g.Assert(err == nil).IsFalse() g.Assert(err == nil).IsFalse()
}) })
}) })

View file

@ -2,7 +2,6 @@ package datastore
import ( import (
"bytes" "bytes"
"database/sql"
"io" "io"
"io/ioutil" "io/ioutil"
@ -10,18 +9,14 @@ import (
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type logstore struct { func (db *datastore) ReadLog(job *model.Job) (io.ReadCloser, error) {
*sql.DB
}
func (db *logstore) Read(job *model.Job) (io.ReadCloser, error) {
var log = new(model.Log) var log = new(model.Log)
var err = meddler.QueryRow(db, log, rebind(logQuery), job.ID) var err = meddler.QueryRow(db, log, rebind(logQuery), job.ID)
var buf = bytes.NewBuffer(log.Data) var buf = bytes.NewBuffer(log.Data)
return ioutil.NopCloser(buf), err return ioutil.NopCloser(buf), err
} }
func (db *logstore) Write(job *model.Job, r io.Reader) error { func (db *datastore) WriteLog(job *model.Job, r io.Reader) error {
var log = new(model.Log) var log = new(model.Log)
var err = meddler.QueryRow(db, log, rebind(logQuery), job.ID) var err = meddler.QueryRow(db, log, rebind(logQuery), job.ID)
if err != nil { if err != nil {

View file

@ -9,7 +9,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_logstore(t *testing.T) { func TestLogs(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
@ -28,10 +28,10 @@ func Test_logstore(t *testing.T) {
ID: 1, ID: 1,
} }
buf := bytes.NewBufferString("echo hi") buf := bytes.NewBufferString("echo hi")
err := s.Logs().Write(&job, buf) err := s.WriteLog(&job, buf)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
rc, err := s.Logs().Read(&job) rc, err := s.ReadLog(&job)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
defer rc.Close() defer rc.Close()
out, _ := ioutil.ReadAll(rc) out, _ := ioutil.ReadAll(rc)
@ -44,12 +44,12 @@ func Test_logstore(t *testing.T) {
} }
buf1 := bytes.NewBufferString("echo hi") buf1 := bytes.NewBufferString("echo hi")
buf2 := bytes.NewBufferString("echo allo?") buf2 := bytes.NewBufferString("echo allo?")
err1 := s.Logs().Write(&job, buf1) err1 := s.WriteLog(&job, buf1)
err2 := s.Logs().Write(&job, buf2) err2 := s.WriteLog(&job, buf2)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
rc, err := s.Logs().Read(&job) rc, err := s.ReadLog(&job)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
defer rc.Close() defer rc.Close()
out, _ := ioutil.ReadAll(rc) out, _ := ioutil.ReadAll(rc)

View file

@ -1,43 +1,31 @@
package datastore package datastore
import ( import (
"database/sql"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type nodestore struct { func (db *datastore) GetNode(id int64) (*model.Node, error) {
*sql.DB
}
func (db *nodestore) Get(id int64) (*model.Node, error) {
var node = new(model.Node) var node = new(model.Node)
var err = meddler.Load(db, nodeTable, node, id) var err = meddler.Load(db, nodeTable, node, id)
return node, err return node, err
} }
func (db *nodestore) GetList() ([]*model.Node, error) { func (db *datastore) GetNodeList() ([]*model.Node, error) {
var nodes = []*model.Node{} var nodes = []*model.Node{}
var err = meddler.QueryAll(db, &nodes, rebind(nodeListQuery)) var err = meddler.QueryAll(db, &nodes, rebind(nodeListQuery))
return nodes, err return nodes, err
} }
func (db *nodestore) Count() (int, error) { func (db *datastore) CreateNode(node *model.Node) error {
var count int
var err = db.QueryRow(rebind(nodeCountQuery)).Scan(&count)
return count, err
}
func (db *nodestore) Create(node *model.Node) error {
return meddler.Insert(db, nodeTable, node) return meddler.Insert(db, nodeTable, node)
} }
func (db *nodestore) Update(node *model.Node) error { func (db *datastore) UpdateNode(node *model.Node) error {
return meddler.Update(db, nodeTable, node) return meddler.Update(db, nodeTable, node)
} }
func (db *nodestore) Delete(node *model.Node) error { func (db *datastore) DeleteNode(node *model.Node) error {
var _, err = db.Exec(rebind(nodeDeleteStmt), node.ID) var _, err = db.Exec(rebind(nodeDeleteStmt), node.ID)
return err return err
} }

View file

@ -7,11 +7,11 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_nodestore(t *testing.T) { func TestNodes(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
s := From(db)
s := From(db)
g := goblin.Goblin(t) g := goblin.Goblin(t)
g.Describe("Nodes", func() { g.Describe("Nodes", func() {
@ -26,7 +26,7 @@ func Test_nodestore(t *testing.T) {
Addr: "unix:///var/run/docker/docker.sock", Addr: "unix:///var/run/docker/docker.sock",
Arch: "linux_amd64", Arch: "linux_amd64",
} }
err := s.Nodes().Create(&node) err := s.CreateNode(&node)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(node.ID != 0).IsTrue() g.Assert(node.ID != 0).IsTrue()
}) })
@ -36,14 +36,14 @@ func Test_nodestore(t *testing.T) {
Addr: "unix:///var/run/docker/docker.sock", Addr: "unix:///var/run/docker/docker.sock",
Arch: "linux_amd64", Arch: "linux_amd64",
} }
err := s.Nodes().Create(&node) err := s.CreateNode(&node)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(node.ID != 0).IsTrue() g.Assert(node.ID != 0).IsTrue()
node.Addr = "unix:///var/run/docker.sock" node.Addr = "unix:///var/run/docker.sock"
err1 := s.Nodes().Update(&node) err1 := s.UpdateNode(&node)
getnode, err2 := s.Nodes().Get(node.ID) getnode, err2 := s.GetNode(node.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(node.ID).Equal(getnode.ID) g.Assert(node.ID).Equal(getnode.ID)
@ -56,11 +56,11 @@ func Test_nodestore(t *testing.T) {
Addr: "unix:///var/run/docker/docker.sock", Addr: "unix:///var/run/docker/docker.sock",
Arch: "linux_amd64", Arch: "linux_amd64",
} }
err := s.Nodes().Create(&node) err := s.CreateNode(&node)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(node.ID != 0).IsTrue() g.Assert(node.ID != 0).IsTrue()
getnode, err := s.Nodes().Get(node.ID) getnode, err := s.GetNode(node.ID)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(node.ID).Equal(getnode.ID) g.Assert(node.ID).Equal(getnode.ID)
g.Assert(node.Addr).Equal(getnode.Addr) g.Assert(node.Addr).Equal(getnode.Addr)
@ -76,42 +76,25 @@ func Test_nodestore(t *testing.T) {
Addr: "unix:///var/run/docker.sock", Addr: "unix:///var/run/docker.sock",
Arch: "linux_386", Arch: "linux_386",
} }
s.Nodes().Create(&node1) s.CreateNode(&node1)
s.Nodes().Create(&node2) s.CreateNode(&node2)
nodes, err := s.Nodes().GetList() nodes, err := s.GetNodeList()
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(len(nodes)).Equal(2) g.Assert(len(nodes)).Equal(2)
}) })
g.It("Should count nodes", func() {
node1 := model.Node{
Addr: "unix:///var/run/docker/docker.sock",
Arch: "linux_amd64",
}
node2 := model.Node{
Addr: "unix:///var/run/docker.sock",
Arch: "linux_386",
}
s.Nodes().Create(&node1)
s.Nodes().Create(&node2)
count, err := s.Nodes().Count()
g.Assert(err == nil).IsTrue()
g.Assert(count).Equal(2)
})
g.It("Should delete a node", func() { g.It("Should delete a node", func() {
node := model.Node{ node := model.Node{
Addr: "unix:///var/run/docker/docker.sock", Addr: "unix:///var/run/docker/docker.sock",
Arch: "linux_amd64", Arch: "linux_amd64",
} }
err1 := s.Nodes().Create(&node) err1 := s.CreateNode(&node)
err2 := s.Nodes().Delete(&node) err2 := s.DeleteNode(&node)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
_, err := s.Nodes().Get(node.ID) _, err := s.GetNode(node.ID)
g.Assert(err == nil).IsFalse() g.Assert(err == nil).IsFalse()
}) })
}) })

View file

@ -1,30 +1,25 @@
package datastore package datastore
import ( import (
"database/sql"
"fmt" "fmt"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type repostore struct { func (db *datastore) GetRepo(id int64) (*model.Repo, error) {
*sql.DB
}
func (db *repostore) Get(id int64) (*model.Repo, error) {
var repo = new(model.Repo) var repo = new(model.Repo)
var err = meddler.Load(db, repoTable, repo, id) var err = meddler.Load(db, repoTable, repo, id)
return repo, err return repo, err
} }
func (db *repostore) GetName(name string) (*model.Repo, error) { func (db *datastore) GetRepoName(name string) (*model.Repo, error) {
var repo = new(model.Repo) var repo = new(model.Repo)
var err = meddler.QueryRow(db, repo, rebind(repoNameQuery), name) var err = meddler.QueryRow(db, repo, rebind(repoNameQuery), name)
return repo, err return repo, err
} }
func (db *repostore) GetListOf(listof []*model.RepoLite) ([]*model.Repo, error) { func (db *datastore) GetRepoListOf(listof []*model.RepoLite) ([]*model.Repo, error) {
var ( var (
repos []*model.Repo repos []*model.Repo
args []interface{} args []interface{}
@ -40,21 +35,21 @@ func (db *repostore) GetListOf(listof []*model.RepoLite) ([]*model.Repo, error)
return repos, err return repos, err
} }
func (db *repostore) Count() (int, error) { func (db *datastore) GetRepoCount() (int, error) {
var count int var count int
var err = db.QueryRow(rebind(repoCountQuery)).Scan(&count) var err = db.QueryRow(rebind(repoCountQuery)).Scan(&count)
return count, err return count, err
} }
func (db *repostore) Create(repo *model.Repo) error { func (db *datastore) CreateRepo(repo *model.Repo) error {
return meddler.Insert(db, repoTable, repo) return meddler.Insert(db, repoTable, repo)
} }
func (db *repostore) Update(repo *model.Repo) error { func (db *datastore) UpdateRepo(repo *model.Repo) error {
return meddler.Update(db, repoTable, repo) return meddler.Update(db, repoTable, repo)
} }
func (db *repostore) Delete(repo *model.Repo) error { func (db *datastore) DeleteRepo(repo *model.Repo) error {
var _, err = db.Exec(rebind(repoDeleteStmt), repo.ID) var _, err = db.Exec(rebind(repoDeleteStmt), repo.ID)
return err return err
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_repostore(t *testing.T) { func TestRepos(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
@ -30,9 +30,9 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
err1 := s.Repos().Create(&repo) err1 := s.CreateRepo(&repo)
err2 := s.Repos().Update(&repo) err2 := s.UpdateRepo(&repo)
getrepo, err3 := s.Repos().Get(repo.ID) getrepo, err3 := s.GetRepo(repo.ID)
if err3 != nil { if err3 != nil {
println("Get Repo Error") println("Get Repo Error")
println(err3.Error()) println(err3.Error())
@ -50,7 +50,7 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
err := s.Repos().Create(&repo) err := s.CreateRepo(&repo)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(repo.ID != 0).IsTrue() g.Assert(repo.ID != 0).IsTrue()
}) })
@ -62,8 +62,8 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
s.Repos().Create(&repo) s.CreateRepo(&repo)
getrepo, err := s.Repos().Get(repo.ID) getrepo, err := s.GetRepo(repo.ID)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(repo.ID).Equal(getrepo.ID) g.Assert(repo.ID).Equal(getrepo.ID)
g.Assert(repo.UserID).Equal(getrepo.UserID) g.Assert(repo.UserID).Equal(getrepo.UserID)
@ -78,8 +78,8 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
s.Repos().Create(&repo) s.CreateRepo(&repo)
getrepo, err := s.Repos().GetName(repo.FullName) getrepo, err := s.GetRepoName(repo.FullName)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(repo.ID).Equal(getrepo.ID) g.Assert(repo.ID).Equal(getrepo.ID)
g.Assert(repo.UserID).Equal(getrepo.UserID) g.Assert(repo.UserID).Equal(getrepo.UserID)
@ -106,11 +106,11 @@ func Test_repostore(t *testing.T) {
Name: "hello-world", Name: "hello-world",
FullName: "octocat/hello-world", FullName: "octocat/hello-world",
} }
s.Repos().Create(repo1) s.CreateRepo(repo1)
s.Repos().Create(repo2) s.CreateRepo(repo2)
s.Repos().Create(repo3) s.CreateRepo(repo3)
repos, err := s.Repos().GetListOf([]*model.RepoLite{ repos, err := s.GetRepoListOf([]*model.RepoLite{
{FullName: "bradrydzewski/drone"}, {FullName: "bradrydzewski/drone"},
{FullName: "drone/drone"}, {FullName: "drone/drone"},
}) })
@ -133,10 +133,10 @@ func Test_repostore(t *testing.T) {
Name: "drone", Name: "drone",
FullName: "drone/drone", FullName: "drone/drone",
} }
s.Repos().Create(repo1) s.CreateRepo(repo1)
s.Repos().Create(repo2) s.CreateRepo(repo2)
count, err := s.Repos().Count() count, err := s.GetRepoCount()
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(count).Equal(2) g.Assert(count).Equal(2)
}) })
@ -148,10 +148,10 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
s.Repos().Create(&repo) s.CreateRepo(&repo)
_, err1 := s.Repos().Get(repo.ID) _, err1 := s.GetRepo(repo.ID)
err2 := s.Repos().Delete(&repo) err2 := s.DeleteRepo(&repo)
_, err3 := s.Repos().Get(repo.ID) _, err3 := s.GetRepo(repo.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsFalse() g.Assert(err3 == nil).IsFalse()
@ -170,8 +170,8 @@ func Test_repostore(t *testing.T) {
Owner: "bradrydzewski", Owner: "bradrydzewski",
Name: "drone", Name: "drone",
} }
err1 := s.Repos().Create(&repo1) err1 := s.CreateRepo(&repo1)
err2 := s.Repos().Create(&repo2) err2 := s.CreateRepo(&repo2)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsFalse() g.Assert(err2 == nil).IsFalse()
}) })

View file

@ -7,16 +7,22 @@ import (
"github.com/drone/drone/shared/envconfig" "github.com/drone/drone/shared/envconfig"
"github.com/drone/drone/store" "github.com/drone/drone/store"
"github.com/drone/drone/store/migration" "github.com/drone/drone/store/datastore/ddl"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq" _ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"github.com/rubenv/sql-migrate" "github.com/rubenv/sql-migrate"
"github.com/russross/meddler" "github.com/russross/meddler"
log "github.com/Sirupsen/logrus" "github.com/Sirupsen/logrus"
) )
// datastore is an implementation of a model.Store built on top
// of the sql/database driver with a relational database backend.
type datastore struct {
*sql.DB
}
// Load opens a new database connection with the specified driver // Load opens a new database connection with the specified driver
// and connection string specified in the environment variables. // and connection string specified in the environment variables.
func Load(env envconfig.Env) store.Store { func Load(env envconfig.Env) store.Store {
@ -25,47 +31,32 @@ func Load(env envconfig.Env) store.Store {
config = env.String("DATABASE_CONFIG", "drone.sqlite") config = env.String("DATABASE_CONFIG", "drone.sqlite")
) )
log.Infof("using database driver %s", driver) logrus.Infof("using database driver %s", driver)
log.Infof("using database config %s", config) logrus.Infof("using database config %s", config)
return New(driver, config) return New(driver, config)
} }
// New creates a database connection for the given driver and datasource
// and returns a new Store.
func New(driver, config string) store.Store { func New(driver, config string) store.Store {
db := Open(driver, config) return From(
return store.New( open(driver, config),
driver,
&nodestore{db},
&userstore{db},
&repostore{db},
&keystore{db},
&buildstore{db},
&jobstore{db},
&logstore{db},
) )
} }
// From returns a Store using an existing database connection.
func From(db *sql.DB) store.Store { func From(db *sql.DB) store.Store {
var driver string return &datastore{db}
return store.New(
driver,
&nodestore{db},
&userstore{db},
&repostore{db},
&keystore{db},
&buildstore{db},
&jobstore{db},
&logstore{db},
)
} }
// Open opens a new database connection with the specified // open opens a new database connection with the specified
// driver and connection string and returns a store. // driver and connection string and returns a store.
func Open(driver, config string) *sql.DB { func open(driver, config string) *sql.DB {
db, err := sql.Open(driver, config) db, err := sql.Open(driver, config)
if err != nil { if err != nil {
log.Errorln(err) logrus.Errorln(err)
log.Fatalln("database connection failed") logrus.Fatalln("database connection failed")
} }
if driver == "mysql" { if driver == "mysql" {
// per issue https://github.com/go-sql-driver/mysql/issues/257 // per issue https://github.com/go-sql-driver/mysql/issues/257
@ -75,13 +66,13 @@ func Open(driver, config string) *sql.DB {
setupMeddler(driver) setupMeddler(driver)
if err := pingDatabase(db); err != nil { if err := pingDatabase(db); err != nil {
log.Errorln(err) logrus.Errorln(err)
log.Fatalln("database ping attempts failed") logrus.Fatalln("database ping attempts failed")
} }
if err := setupDatabase(driver, db); err != nil { if err := setupDatabase(driver, db); err != nil {
log.Errorln(err) logrus.Errorln(err)
log.Fatalln("migration failed") logrus.Fatalln("migration failed")
} }
cleanupDatabase(db) cleanupDatabase(db)
return db return db
@ -97,9 +88,9 @@ func openTest() *sql.DB {
) )
if os.Getenv("DATABASE_DRIVER") != "" { if os.Getenv("DATABASE_DRIVER") != "" {
driver = os.Getenv("DATABASE_DRIVER") driver = os.Getenv("DATABASE_DRIVER")
config = os.Getenv("DATABASE_CONFIG") config = os.Getenv("DATABASE_DATASOURCE")
} }
return Open(driver, config) return open(driver, config)
} }
// helper function to ping the database with backoff to ensure // helper function to ping the database with backoff to ensure
@ -111,7 +102,7 @@ func pingDatabase(db *sql.DB) (err error) {
if err == nil { if err == nil {
return return
} }
log.Infof("database ping failed. retry in 1s") logrus.Infof("database ping failed. retry in 1s")
time.Sleep(time.Second) time.Sleep(time.Second)
} }
return return
@ -121,8 +112,8 @@ func pingDatabase(db *sql.DB) (err error) {
// automated database migration steps. // automated database migration steps.
func setupDatabase(driver string, db *sql.DB) error { func setupDatabase(driver string, db *sql.DB) error {
var migrations = &migrate.AssetMigrationSource{ var migrations = &migrate.AssetMigrationSource{
Asset: migration.Asset, Asset: ddl.Asset,
AssetDir: migration.AssetDir, AssetDir: ddl.AssetDir,
Dir: driver, Dir: driver,
} }
_, err := migrate.Exec(db, driver, migrations, migrate.Up) _, err := migrate.Exec(db, driver, migrations, migrate.Up)

View file

@ -1,36 +1,31 @@
package datastore package datastore
import ( import (
"database/sql"
"fmt" "fmt"
"github.com/drone/drone/model" "github.com/drone/drone/model"
"github.com/russross/meddler" "github.com/russross/meddler"
) )
type userstore struct { func (db *datastore) GetUser(id int64) (*model.User, error) {
*sql.DB
}
func (db *userstore) Get(id int64) (*model.User, error) {
var usr = new(model.User) var usr = new(model.User)
var err = meddler.Load(db, userTable, usr, id) var err = meddler.Load(db, userTable, usr, id)
return usr, err return usr, err
} }
func (db *userstore) GetLogin(login string) (*model.User, error) { func (db *datastore) GetUserLogin(login string) (*model.User, error) {
var usr = new(model.User) var usr = new(model.User)
var err = meddler.QueryRow(db, usr, rebind(userLoginQuery), login) var err = meddler.QueryRow(db, usr, rebind(userLoginQuery), login)
return usr, err return usr, err
} }
func (db *userstore) GetList() ([]*model.User, error) { func (db *datastore) GetUserList() ([]*model.User, error) {
var users = []*model.User{} var users = []*model.User{}
var err = meddler.QueryAll(db, &users, rebind(userListQuery)) var err = meddler.QueryAll(db, &users, rebind(userListQuery))
return users, err return users, err
} }
func (db *userstore) GetFeed(listof []*model.RepoLite) ([]*model.Feed, error) { func (db *datastore) GetUserFeed(listof []*model.RepoLite) ([]*model.Feed, error) {
var ( var (
feed []*model.Feed feed []*model.Feed
args []interface{} args []interface{}
@ -46,21 +41,21 @@ func (db *userstore) GetFeed(listof []*model.RepoLite) ([]*model.Feed, error) {
return feed, err return feed, err
} }
func (db *userstore) Count() (int, error) { func (db *datastore) GetUserCount() (int, error) {
var count int var count int
var err = db.QueryRow(rebind(userCountQuery)).Scan(&count) var err = db.QueryRow(rebind(userCountQuery)).Scan(&count)
return count, err return count, err
} }
func (db *userstore) Create(user *model.User) error { func (db *datastore) CreateUser(user *model.User) error {
return meddler.Insert(db, userTable, user) return meddler.Insert(db, userTable, user)
} }
func (db *userstore) Update(user *model.User) error { func (db *datastore) UpdateUser(user *model.User) error {
return meddler.Update(db, userTable, user) return meddler.Update(db, userTable, user)
} }
func (db *userstore) Delete(user *model.User) error { func (db *datastore) DeleteUser(user *model.User) error {
var _, err = db.Exec(rebind(userDeleteStmt), user.ID) var _, err = db.Exec(rebind(userDeleteStmt), user.ID)
return err return err
} }

View file

@ -7,7 +7,7 @@ import (
"github.com/franela/goblin" "github.com/franela/goblin"
) )
func Test_userstore(t *testing.T) { func TestUsers(t *testing.T) {
db := openTest() db := openTest()
defer db.Close() defer db.Close()
s := From(db) s := From(db)
@ -30,9 +30,9 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
err1 := s.Users().Create(&user) err1 := s.CreateUser(&user)
err2 := s.Users().Update(&user) err2 := s.UpdateUser(&user)
getuser, err3 := s.Users().Get(user.ID) getuser, err3 := s.GetUser(user.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsTrue() g.Assert(err3 == nil).IsTrue()
@ -45,7 +45,7 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
err := s.Users().Create(&user) err := s.CreateUser(&user)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(user.ID != 0).IsTrue() g.Assert(user.ID != 0).IsTrue()
}) })
@ -61,8 +61,8 @@ func Test_userstore(t *testing.T) {
Admin: true, Admin: true,
} }
s.Users().Create(&user) s.CreateUser(&user)
getuser, err := s.Users().Get(user.ID) getuser, err := s.GetUser(user.ID)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(user.ID).Equal(getuser.ID) g.Assert(user.ID).Equal(getuser.ID)
g.Assert(user.Login).Equal(getuser.Login) g.Assert(user.Login).Equal(getuser.Login)
@ -80,8 +80,8 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
s.Users().Create(&user) s.CreateUser(&user)
getuser, err := s.Users().GetLogin(user.Login) getuser, err := s.GetUserLogin(user.Login)
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(user.ID).Equal(getuser.ID) g.Assert(user.ID).Equal(getuser.ID)
g.Assert(user.Login).Equal(getuser.Login) g.Assert(user.Login).Equal(getuser.Login)
@ -98,8 +98,8 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "ab20g0ddaf012c744e136da16aa21ad9", Token: "ab20g0ddaf012c744e136da16aa21ad9",
} }
err1 := s.Users().Create(&user1) err1 := s.CreateUser(&user1)
err2 := s.Users().Create(&user2) err2 := s.CreateUser(&user2)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsFalse() g.Assert(err2 == nil).IsFalse()
}) })
@ -115,9 +115,9 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
s.Users().Create(&user1) s.CreateUser(&user1)
s.Users().Create(&user2) s.CreateUser(&user2)
users, err := s.Users().GetList() users, err := s.GetUserList()
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(len(users)).Equal(2) g.Assert(len(users)).Equal(2)
g.Assert(users[0].Login).Equal(user1.Login) g.Assert(users[0].Login).Equal(user1.Login)
@ -136,15 +136,15 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
s.Users().Create(&user1) s.CreateUser(&user1)
s.Users().Create(&user2) s.CreateUser(&user2)
count, err := s.Users().Count() count, err := s.GetUserCount()
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(count).Equal(2) g.Assert(count).Equal(2)
}) })
g.It("Should Get a User Count Zero", func() { g.It("Should Get a User Count Zero", func() {
count, err := s.Users().Count() count, err := s.GetUserCount()
g.Assert(err == nil).IsTrue() g.Assert(err == nil).IsTrue()
g.Assert(count).Equal(0) g.Assert(count).Equal(0)
}) })
@ -155,10 +155,10 @@ func Test_userstore(t *testing.T) {
Email: "foo@bar.com", Email: "foo@bar.com",
Token: "e42080dddf012c718e476da161d21ad5", Token: "e42080dddf012c718e476da161d21ad5",
} }
s.Users().Create(&user) s.CreateUser(&user)
_, err1 := s.Users().Get(user.ID) _, err1 := s.GetUser(user.ID)
err2 := s.Users().Delete(&user) err2 := s.DeleteUser(&user)
_, err3 := s.Users().Get(user.ID) _, err3 := s.GetUser(user.ID)
g.Assert(err1 == nil).IsTrue() g.Assert(err1 == nil).IsTrue()
g.Assert(err2 == nil).IsTrue() g.Assert(err2 == nil).IsTrue()
g.Assert(err3 == nil).IsFalse() g.Assert(err3 == nil).IsFalse()
@ -183,9 +183,9 @@ func Test_userstore(t *testing.T) {
Name: "hello-world", Name: "hello-world",
FullName: "octocat/hello-world", FullName: "octocat/hello-world",
} }
s.Repos().Create(repo1) s.CreateRepo(repo1)
s.Repos().Create(repo2) s.CreateRepo(repo2)
s.Repos().Create(repo3) s.CreateRepo(repo3)
build1 := &model.Build{ build1 := &model.Build{
RepoID: repo1.ID, RepoID: repo1.ID,
@ -203,12 +203,12 @@ func Test_userstore(t *testing.T) {
RepoID: repo3.ID, RepoID: repo3.ID,
Status: model.StatusSuccess, Status: model.StatusSuccess,
} }
s.Builds().Create(build1) s.CreateBuild(build1)
s.Builds().Create(build2) s.CreateBuild(build2)
s.Builds().Create(build3) s.CreateBuild(build3)
s.Builds().Create(build4) s.CreateBuild(build4)
builds, err := s.Users().GetFeed([]*model.RepoLite{ builds, err := s.GetUserFeed([]*model.RepoLite{
{FullName: "bradrydzewski/drone"}, {FullName: "bradrydzewski/drone"},
{FullName: "drone/drone"}, {FullName: "drone/drone"},
}) })

View file

@ -1,43 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type JobStore interface {
// Get gets a job by unique ID.
Get(int64) (*model.Job, error)
// GetNumber gets a job by number.
GetNumber(*model.Build, int) (*model.Job, error)
// GetList gets a list of all users in the system.
GetList(*model.Build) ([]*model.Job, error)
// Create creates a job.
Create(*model.Job) error
// Update updates a job.
Update(*model.Job) error
}
func GetJob(c context.Context, id int64) (*model.Job, error) {
return FromContext(c).Jobs().Get(id)
}
func GetJobNumber(c context.Context, build *model.Build, num int) (*model.Job, error) {
return FromContext(c).Jobs().GetNumber(build, num)
}
func GetJobList(c context.Context, build *model.Build) ([]*model.Job, error) {
return FromContext(c).Jobs().GetList(build)
}
func CreateJob(c context.Context, job *model.Job) error {
return FromContext(c).Jobs().Create(job)
}
func UpdateJob(c context.Context, job *model.Job) error {
return FromContext(c).Jobs().Update(job)
}

View file

@ -1,36 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type KeyStore interface {
// Get gets a key by unique repository ID.
Get(*model.Repo) (*model.Key, error)
// Create creates a new key.
Create(*model.Key) error
// Update updates a user key.
Update(*model.Key) error
// Delete deletes a user key.
Delete(*model.Key) error
}
func GetKey(c context.Context, repo *model.Repo) (*model.Key, error) {
return FromContext(c).Keys().Get(repo)
}
func CreateKey(c context.Context, key *model.Key) error {
return FromContext(c).Keys().Create(key)
}
func UpdateKey(c context.Context, key *model.Key) error {
return FromContext(c).Keys().Update(key)
}
func DeleteKey(c context.Context, key *model.Key) error {
return FromContext(c).Keys().Delete(key)
}

View file

@ -1,24 +0,0 @@
package store
import (
"io"
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type LogStore interface {
// Read reads the Job logs from the datastore.
Read(*model.Job) (io.ReadCloser, error)
// Write writes the job logs to the datastore.
Write(*model.Job, io.Reader) error
}
func ReadLog(c context.Context, job *model.Job) (io.ReadCloser, error) {
return FromContext(c).Logs().Read(job)
}
func WriteLog(c context.Context, job *model.Job, r io.Reader) error {
return FromContext(c).Logs().Write(job, r)
}

View file

@ -1,3 +0,0 @@
package migration
//go:generate go-bindata -pkg migration -o migration_gen.go sqlite3/ mysql/ postgres/

View file

@ -1,50 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type NodeStore interface {
// Get gets a user by unique ID.
Get(int64) (*model.Node, error)
// GetList gets a list of all nodes in the system.
GetList() ([]*model.Node, error)
// Count gets a count of all nodes in the system.
Count() (int, error)
// Create creates a node.
Create(*model.Node) error
// Update updates a node.
Update(*model.Node) error
// Delete deletes a node.
Delete(*model.Node) error
}
func GetNode(c context.Context, id int64) (*model.Node, error) {
return FromContext(c).Nodes().Get(id)
}
func GetNodeList(c context.Context) ([]*model.Node, error) {
return FromContext(c).Nodes().GetList()
}
func CountNodes(c context.Context) (int, error) {
return FromContext(c).Nodes().Count()
}
func CreateNode(c context.Context, node *model.Node) error {
return FromContext(c).Nodes().Create(node)
}
func UpdateNode(c context.Context, node *model.Node) error {
return FromContext(c).Nodes().Update(node)
}
func DeleteNode(c context.Context, node *model.Node) error {
return FromContext(c).Nodes().Delete(node)
}

View file

@ -1,61 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type RepoStore interface {
// Get gets a repo by unique ID.
Get(int64) (*model.Repo, error)
// GetLogin gets a repo by its full name.
GetName(string) (*model.Repo, error)
// GetListOf gets the list of enumerated repos in the system.
GetListOf([]*model.RepoLite) ([]*model.Repo, error)
// Count gets a count of all repos in the system.
Count() (int, error)
// Create creates a new repository.
Create(*model.Repo) error
// Update updates a user repository.
Update(*model.Repo) error
// Delete deletes a user repository.
Delete(*model.Repo) error
}
func GetRepo(c context.Context, id int64) (*model.Repo, error) {
return FromContext(c).Repos().Get(id)
}
func GetRepoName(c context.Context, name string) (*model.Repo, error) {
return FromContext(c).Repos().GetName(name)
}
func GetRepoOwnerName(c context.Context, owner, name string) (*model.Repo, error) {
return FromContext(c).Repos().GetName(owner + "/" + name)
}
func GetRepoListOf(c context.Context, listof []*model.RepoLite) ([]*model.Repo, error) {
return FromContext(c).Repos().GetListOf(listof)
}
func CountRepos(c context.Context) (int, error) {
return FromContext(c).Repos().Count()
}
func CreateRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).Repos().Create(repo)
}
func UpdateRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).Repos().Update(repo)
}
func DeleteRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).Repos().Delete(repo)
}

View file

@ -1,53 +1,296 @@
package store package store
import (
"io"
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type Store interface { type Store interface {
Nodes() NodeStore // GetUser gets a user by unique ID.
Users() UserStore GetUser(int64) (*model.User, error)
Repos() RepoStore
Keys() KeyStore // GetUserLogin gets a user by unique Login name.
Builds() BuildStore GetUserLogin(string) (*model.User, error)
Jobs() JobStore
Logs() LogStore // GetUserList gets a list of all users in the system.
GetUserList() ([]*model.User, error)
// GetUserFeed gets a user activity feed.
GetUserFeed([]*model.RepoLite) ([]*model.Feed, error)
// GetUserCount gets a count of all users in the system.
GetUserCount() (int, error)
// CreateUser creates a new user account.
CreateUser(*model.User) error
// UpdateUser updates a user account.
UpdateUser(*model.User) error
// DeleteUser deletes a user account.
DeleteUser(*model.User) error
// GetRepo gets a repo by unique ID.
GetRepo(int64) (*model.Repo, error)
// GetRepoName gets a repo by its full name.
GetRepoName(string) (*model.Repo, error)
// GetRepoListOf gets the list of enumerated repos in the system.
GetRepoListOf([]*model.RepoLite) ([]*model.Repo, error)
// GetRepoCount gets a count of all repositories in the system.
GetRepoCount() (int, error)
// CreateRepo creates a new repository.
CreateRepo(*model.Repo) error
// UpdateRepo updates a user repository.
UpdateRepo(*model.Repo) error
// DeleteRepo deletes a user repository.
DeleteRepo(*model.Repo) error
// GetKey gets a key by unique repository ID.
GetKey(*model.Repo) (*model.Key, error)
// CreateKey creates a new key.
CreateKey(*model.Key) error
// UpdateKey updates a user key.
UpdateKey(*model.Key) error
// DeleteKey deletes a user key.
DeleteKey(*model.Key) error
// GetBuild gets a build by unique ID.
GetBuild(int64) (*model.Build, error)
// GetBuildNumber gets a build by number.
GetBuildNumber(*model.Repo, int) (*model.Build, error)
// GetBuildRef gets a build by its ref.
GetBuildRef(*model.Repo, string) (*model.Build, error)
// GetBuildCommit gets a build by its commit sha.
GetBuildCommit(*model.Repo, string, string) (*model.Build, error)
// GetBuildLast gets the last build for the branch.
GetBuildLast(*model.Repo, string) (*model.Build, error)
// GetBuildLastBefore gets the last build before build number N.
GetBuildLastBefore(*model.Repo, string, int64) (*model.Build, error)
// GetBuildList gets a list of builds for the repository
GetBuildList(*model.Repo) ([]*model.Build, error)
// CreateBuild creates a new build and jobs.
CreateBuild(*model.Build, ...*model.Job) error
// UpdateBuild updates a build.
UpdateBuild(*model.Build) error
// GetJob gets a job by unique ID.
GetJob(int64) (*model.Job, error)
// GetJobNumber gets a job by number.
GetJobNumber(*model.Build, int) (*model.Job, error)
// GetJobList gets a list of all users in the system.
GetJobList(*model.Build) ([]*model.Job, error)
// CreateJob creates a job.
CreateJob(*model.Job) error
// UpdateJob updates a job.
UpdateJob(*model.Job) error
// ReadLog reads the Job logs from the datastore.
ReadLog(*model.Job) (io.ReadCloser, error)
// WriteLog writes the job logs to the datastore.
WriteLog(*model.Job, io.Reader) error
// GetNode gets a build node from the datastore.
GetNode(id int64) (*model.Node, error)
// GetNodeList gets a build node list from the datastore.
GetNodeList() ([]*model.Node, error)
// CreateNode add a new build node to the datastore.
CreateNode(*model.Node) error
// UpdateNode updates a build node in the datastore.
UpdateNode(*model.Node) error
// DeleteNode removes a build node from the datastore.
DeleteNode(*model.Node) error
} }
type store struct { // GetUser gets a user by unique ID.
name string func GetUser(c context.Context, id int64) (*model.User, error) {
nodes NodeStore return FromContext(c).GetUser(id)
users UserStore
repos RepoStore
keys KeyStore
builds BuildStore
jobs JobStore
logs LogStore
} }
func (s *store) Nodes() NodeStore { return s.nodes } // GetUserLogin gets a user by unique Login name.
func (s *store) Users() UserStore { return s.users } func GetUserLogin(c context.Context, login string) (*model.User, error) {
func (s *store) Repos() RepoStore { return s.repos } return FromContext(c).GetUserLogin(login)
func (s *store) Keys() KeyStore { return s.keys } }
func (s *store) Builds() BuildStore { return s.builds }
func (s *store) Jobs() JobStore { return s.jobs } // GetUserList gets a list of all users in the system.
func (s *store) Logs() LogStore { return s.logs } func GetUserList(c context.Context) ([]*model.User, error) {
func (s *store) String() string { return s.name } return FromContext(c).GetUserList()
}
func New(
name string, // GetUserFeed gets a user activity feed.
nodes NodeStore, func GetUserFeed(c context.Context, listof []*model.RepoLite) ([]*model.Feed, error) {
users UserStore, return FromContext(c).GetUserFeed(listof)
repos RepoStore, }
keys KeyStore,
builds BuildStore, // GetUserCount gets a count of all users in the system.
jobs JobStore, func GetUserCount(c context.Context) (int, error) {
logs LogStore, return FromContext(c).GetUserCount()
) Store { }
return &store{
name, func CreateUser(c context.Context, user *model.User) error {
nodes, return FromContext(c).CreateUser(user)
users, }
repos,
keys, func UpdateUser(c context.Context, user *model.User) error {
builds, return FromContext(c).UpdateUser(user)
jobs, }
logs,
} func DeleteUser(c context.Context, user *model.User) error {
return FromContext(c).DeleteUser(user)
}
func GetRepo(c context.Context, id int64) (*model.Repo, error) {
return FromContext(c).GetRepo(id)
}
func GetRepoName(c context.Context, name string) (*model.Repo, error) {
return FromContext(c).GetRepoName(name)
}
func GetRepoOwnerName(c context.Context, owner, name string) (*model.Repo, error) {
return FromContext(c).GetRepoName(owner + "/" + name)
}
func GetRepoListOf(c context.Context, listof []*model.RepoLite) ([]*model.Repo, error) {
return FromContext(c).GetRepoListOf(listof)
}
func CreateRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).CreateRepo(repo)
}
func UpdateRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).UpdateRepo(repo)
}
func DeleteRepo(c context.Context, repo *model.Repo) error {
return FromContext(c).DeleteRepo(repo)
}
func GetKey(c context.Context, repo *model.Repo) (*model.Key, error) {
return FromContext(c).GetKey(repo)
}
func CreateKey(c context.Context, key *model.Key) error {
return FromContext(c).CreateKey(key)
}
func UpdateKey(c context.Context, key *model.Key) error {
return FromContext(c).UpdateKey(key)
}
func DeleteKey(c context.Context, key *model.Key) error {
return FromContext(c).DeleteKey(key)
}
func GetBuild(c context.Context, id int64) (*model.Build, error) {
return FromContext(c).GetBuild(id)
}
func GetBuildNumber(c context.Context, repo *model.Repo, num int) (*model.Build, error) {
return FromContext(c).GetBuildNumber(repo, num)
}
func GetBuildRef(c context.Context, repo *model.Repo, ref string) (*model.Build, error) {
return FromContext(c).GetBuildRef(repo, ref)
}
func GetBuildCommit(c context.Context, repo *model.Repo, sha, branch string) (*model.Build, error) {
return FromContext(c).GetBuildCommit(repo, sha, branch)
}
func GetBuildLast(c context.Context, repo *model.Repo, branch string) (*model.Build, error) {
return FromContext(c).GetBuildLast(repo, branch)
}
func GetBuildLastBefore(c context.Context, repo *model.Repo, branch string, number int64) (*model.Build, error) {
return FromContext(c).GetBuildLastBefore(repo, branch, number)
}
func GetBuildList(c context.Context, repo *model.Repo) ([]*model.Build, error) {
return FromContext(c).GetBuildList(repo)
}
func CreateBuild(c context.Context, build *model.Build, jobs ...*model.Job) error {
return FromContext(c).CreateBuild(build, jobs...)
}
func UpdateBuild(c context.Context, build *model.Build) error {
return FromContext(c).UpdateBuild(build)
}
func GetJob(c context.Context, id int64) (*model.Job, error) {
return FromContext(c).GetJob(id)
}
func GetJobNumber(c context.Context, build *model.Build, num int) (*model.Job, error) {
return FromContext(c).GetJobNumber(build, num)
}
func GetJobList(c context.Context, build *model.Build) ([]*model.Job, error) {
return FromContext(c).GetJobList(build)
}
func CreateJob(c context.Context, job *model.Job) error {
return FromContext(c).CreateJob(job)
}
func UpdateJob(c context.Context, job *model.Job) error {
return FromContext(c).UpdateJob(job)
}
func ReadLog(c context.Context, job *model.Job) (io.ReadCloser, error) {
return FromContext(c).ReadLog(job)
}
func WriteLog(c context.Context, job *model.Job, r io.Reader) error {
return FromContext(c).WriteLog(job, r)
}
func GetNode(c context.Context, id int64) (*model.Node, error) {
return FromContext(c).GetNode(id)
}
func GetNodeList(c context.Context) ([]*model.Node, error) {
return FromContext(c).GetNodeList()
}
func CreateNode(c context.Context, node *model.Node) error {
return FromContext(c).CreateNode(node)
}
func UpdateNode(c context.Context, node *model.Node) error {
return FromContext(c).UpdateNode(node)
}
func DeleteNode(c context.Context, node *model.Node) error {
return FromContext(c).DeleteNode(node)
} }

View file

@ -1,64 +0,0 @@
package store
import (
"github.com/drone/drone/model"
"golang.org/x/net/context"
)
type UserStore interface {
// Get gets a user by unique ID.
Get(int64) (*model.User, error)
// GetLogin gets a user by unique Login name.
GetLogin(string) (*model.User, error)
// GetList gets a list of all users in the system.
GetList() ([]*model.User, error)
// GetFeed gets a user activity feed.
GetFeed([]*model.RepoLite) ([]*model.Feed, error)
// Count gets a count of all users in the system.
Count() (int, error)
// Create creates a new user account.
Create(*model.User) error
// Update updates a user account.
Update(*model.User) error
// Delete deletes a user account.
Delete(*model.User) error
}
func GetUser(c context.Context, id int64) (*model.User, error) {
return FromContext(c).Users().Get(id)
}
func GetUserLogin(c context.Context, login string) (*model.User, error) {
return FromContext(c).Users().GetLogin(login)
}
func GetUserList(c context.Context) ([]*model.User, error) {
return FromContext(c).Users().GetList()
}
func GetUserFeed(c context.Context, listof []*model.RepoLite) ([]*model.Feed, error) {
return FromContext(c).Users().GetFeed(listof)
}
func CountUsers(c context.Context) (int, error) {
return FromContext(c).Users().Count()
}
func CreateUser(c context.Context, user *model.User) error {
return FromContext(c).Users().Create(user)
}
func UpdateUser(c context.Context, user *model.User) error {
return FromContext(c).Users().Update(user)
}
func DeleteUser(c context.Context, user *model.User) error {
return FromContext(c).Users().Delete(user)
}