mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-11-26 20:01:02 +00:00
sync working with postgres and mysql
This commit is contained in:
parent
35e0ee2e5f
commit
587b07c69b
38 changed files with 1955 additions and 322 deletions
|
@ -32,7 +32,7 @@ func TestBuilds(t *testing.T) {
|
||||||
// table data from the database.
|
// table data from the database.
|
||||||
g.BeforeEach(func() {
|
g.BeforeEach(func() {
|
||||||
s.Exec("DELETE FROM builds")
|
s.Exec("DELETE FROM builds")
|
||||||
s.Exec("DELETE FROM jobs")
|
s.Exec("DELETE FROM procs")
|
||||||
})
|
})
|
||||||
|
|
||||||
g.It("Should Post a Build", func() {
|
g.It("Should Post a Build", func() {
|
||||||
|
|
|
@ -108,6 +108,34 @@ var migrations = []struct {
|
||||||
name: "update-table-set-repo-seq-default",
|
name: "update-table-set-repo-seq-default",
|
||||||
stmt: updateTableSetRepoSeqDefault,
|
stmt: updateTableSetRepoSeqDefault,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "alter-table-add-repo-active",
|
||||||
|
stmt: alterTableAddRepoActive,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "update-table-set-repo-active",
|
||||||
|
stmt: updateTableSetRepoActive,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "alter-table-add-user-synced",
|
||||||
|
stmt: alterTableAddUserSynced,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "update-table-set-user-synced",
|
||||||
|
stmt: updateTableSetUserSynced,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-table-perms",
|
||||||
|
stmt: createTablePerms,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-index-perms-repo",
|
||||||
|
stmt: createIndexPermsRepo,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-index-perms-user",
|
||||||
|
stmt: createIndexPermsUser,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate performs the database migration. If the migration fails
|
// Migrate performs the database migration. If the migration fails
|
||||||
|
@ -499,3 +527,51 @@ var updateTableSetRepoSeqDefault = `
|
||||||
UPDATE repos SET repo_counter = 0
|
UPDATE repos SET repo_counter = 0
|
||||||
WHERE repo_counter IS NULL
|
WHERE repo_counter IS NULL
|
||||||
`
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 015_add_column_repo_active.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var alterTableAddRepoActive = `
|
||||||
|
ALTER TABLE repos ADD COLUMN repo_active BOOLEAN
|
||||||
|
`
|
||||||
|
|
||||||
|
var updateTableSetRepoActive = `
|
||||||
|
UPDATE repos SET repo_active = true
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 016_add_column_user_synced.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var alterTableAddUserSynced = `
|
||||||
|
ALTER TABLE users ADD COLUMN user_synced INTEGER;
|
||||||
|
`
|
||||||
|
|
||||||
|
var updateTableSetUserSynced = `
|
||||||
|
UPDATE users SET user_synced = 0
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 017_create_table_perms.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var createTablePerms = `
|
||||||
|
CREATE TABLE IF NOT EXISTS perms (
|
||||||
|
perm_user_id INTEGER NOT NULL
|
||||||
|
,perm_repo_id INTEGER NOT NULL
|
||||||
|
,perm_pull BOOLEAN
|
||||||
|
,perm_push BOOLEAN
|
||||||
|
,perm_admin BOOLEAN
|
||||||
|
,perm_synced INTEGER
|
||||||
|
,UNIQUE(perm_user_id, perm_repo_id)
|
||||||
|
);
|
||||||
|
`
|
||||||
|
|
||||||
|
var createIndexPermsRepo = `
|
||||||
|
CREATE INDEX ix_perms_repo ON perms (perm_repo_id);
|
||||||
|
`
|
||||||
|
|
||||||
|
var createIndexPermsUser = `
|
||||||
|
CREATE INDEX ix_perms_user ON perms (perm_user_id);
|
||||||
|
`
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- name: alter-table-add-repo-active
|
||||||
|
|
||||||
|
ALTER TABLE repos ADD COLUMN repo_active BOOLEAN
|
||||||
|
|
||||||
|
-- name: update-table-set-repo-active
|
||||||
|
|
||||||
|
UPDATE repos SET repo_active = true
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- name: alter-table-add-user-synced
|
||||||
|
|
||||||
|
ALTER TABLE users ADD COLUMN user_synced INTEGER;
|
||||||
|
|
||||||
|
-- name: update-table-set-user-synced
|
||||||
|
|
||||||
|
UPDATE users SET user_synced = 0
|
19
store/datastore/ddl/mysql/files/017_create_table_perms.sql
Normal file
19
store/datastore/ddl/mysql/files/017_create_table_perms.sql
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
-- name: create-table-perms
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS perms (
|
||||||
|
perm_user_id INTEGER NOT NULL
|
||||||
|
,perm_repo_id INTEGER NOT NULL
|
||||||
|
,perm_pull BOOLEAN
|
||||||
|
,perm_push BOOLEAN
|
||||||
|
,perm_admin BOOLEAN
|
||||||
|
,perm_synced INTEGER
|
||||||
|
,UNIQUE(perm_user_id, perm_repo_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- name: create-index-perms-repo
|
||||||
|
|
||||||
|
CREATE INDEX ix_perms_repo ON perms (perm_repo_id);
|
||||||
|
|
||||||
|
-- name: create-index-perms-user
|
||||||
|
|
||||||
|
CREATE INDEX ix_perms_user ON perms (perm_user_id);
|
|
@ -108,6 +108,34 @@ var migrations = []struct {
|
||||||
name: "update-table-set-repo-seq-default",
|
name: "update-table-set-repo-seq-default",
|
||||||
stmt: updateTableSetRepoSeqDefault,
|
stmt: updateTableSetRepoSeqDefault,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "alter-table-add-repo-active",
|
||||||
|
stmt: alterTableAddRepoActive,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "update-table-set-repo-active",
|
||||||
|
stmt: updateTableSetRepoActive,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "alter-table-add-user-synced",
|
||||||
|
stmt: alterTableAddUserSynced,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "update-table-set-user-synced",
|
||||||
|
stmt: updateTableSetUserSynced,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-table-perms",
|
||||||
|
stmt: createTablePerms,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-index-perms-repo",
|
||||||
|
stmt: createIndexPermsRepo,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "create-index-perms-user",
|
||||||
|
stmt: createIndexPermsUser,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Migrate performs the database migration. If the migration fails
|
// Migrate performs the database migration. If the migration fails
|
||||||
|
@ -499,3 +527,51 @@ var updateTableSetRepoSeqDefault = `
|
||||||
UPDATE repos SET repo_counter = 0
|
UPDATE repos SET repo_counter = 0
|
||||||
WHERE repo_counter IS NULL
|
WHERE repo_counter IS NULL
|
||||||
`
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 015_add_column_repo_active.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var alterTableAddRepoActive = `
|
||||||
|
ALTER TABLE repos ADD COLUMN repo_active BOOLEAN
|
||||||
|
`
|
||||||
|
|
||||||
|
var updateTableSetRepoActive = `
|
||||||
|
UPDATE repos SET repo_active = true
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 016_add_column_user_synced.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var alterTableAddUserSynced = `
|
||||||
|
ALTER TABLE users ADD COLUMN user_synced INTEGER;
|
||||||
|
`
|
||||||
|
|
||||||
|
var updateTableSetUserSynced = `
|
||||||
|
UPDATE users SET user_synced = 0
|
||||||
|
`
|
||||||
|
|
||||||
|
//
|
||||||
|
// 017_create_table_perms.sql
|
||||||
|
//
|
||||||
|
|
||||||
|
var createTablePerms = `
|
||||||
|
CREATE TABLE IF NOT EXISTS perms (
|
||||||
|
perm_user_id INTEGER NOT NULL
|
||||||
|
,perm_repo_id INTEGER NOT NULL
|
||||||
|
,perm_pull BOOLEAN
|
||||||
|
,perm_push BOOLEAN
|
||||||
|
,perm_admin BOOLEAN
|
||||||
|
,perm_synced INTEGER
|
||||||
|
,UNIQUE(perm_user_id, perm_repo_id)
|
||||||
|
);
|
||||||
|
`
|
||||||
|
|
||||||
|
var createIndexPermsRepo = `
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_perms_repo ON perms (perm_repo_id);
|
||||||
|
`
|
||||||
|
|
||||||
|
var createIndexPermsUser = `
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_perms_user ON perms (perm_user_id);
|
||||||
|
`
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- name: alter-table-add-repo-active
|
||||||
|
|
||||||
|
ALTER TABLE repos ADD COLUMN repo_active BOOLEAN
|
||||||
|
|
||||||
|
-- name: update-table-set-repo-active
|
||||||
|
|
||||||
|
UPDATE repos SET repo_active = true
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- name: alter-table-add-user-synced
|
||||||
|
|
||||||
|
ALTER TABLE users ADD COLUMN user_synced INTEGER;
|
||||||
|
|
||||||
|
-- name: update-table-set-user-synced
|
||||||
|
|
||||||
|
UPDATE users SET user_synced = 0
|
|
@ -0,0 +1,19 @@
|
||||||
|
-- name: create-table-perms
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS perms (
|
||||||
|
perm_user_id INTEGER NOT NULL
|
||||||
|
,perm_repo_id INTEGER NOT NULL
|
||||||
|
,perm_pull BOOLEAN
|
||||||
|
,perm_push BOOLEAN
|
||||||
|
,perm_admin BOOLEAN
|
||||||
|
,perm_synced INTEGER
|
||||||
|
,UNIQUE(perm_user_id, perm_repo_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- name: create-index-perms-repo
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_perms_repo ON perms (perm_repo_id);
|
||||||
|
|
||||||
|
-- name: create-index-perms-user
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS ix_perms_user ON perms (perm_user_id);
|
|
@ -136,3 +136,52 @@ func TestPermUpsert(t *testing.T) {
|
||||||
t.Errorf("Wanted admin %v, got %v", want, got)
|
t.Errorf("Wanted admin %v, got %v", want, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPermDelete(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
user := &model.User{ID: 1}
|
||||||
|
repo := &model.Repo{
|
||||||
|
UserID: 1,
|
||||||
|
FullName: "bradrydzewski/drone",
|
||||||
|
Owner: "bradrydzewski",
|
||||||
|
Name: "drone",
|
||||||
|
}
|
||||||
|
s.CreateRepo(repo)
|
||||||
|
|
||||||
|
err := s.PermUpsert(
|
||||||
|
&model.Perm{
|
||||||
|
UserID: user.ID,
|
||||||
|
RepoID: repo.ID,
|
||||||
|
Repo: repo.FullName,
|
||||||
|
Pull: true,
|
||||||
|
Push: false,
|
||||||
|
Admin: false,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: insert perm: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
perm, err := s.PermFind(user, repo)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: select perm: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = s.PermDelete(perm)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: delete perm: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = s.PermFind(user, repo)
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Expect error: sql.ErrNoRows")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package datastore
|
package datastore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
"github.com/drone/drone/model"
|
||||||
"github.com/drone/drone/store/datastore/sql"
|
"github.com/drone/drone/store/datastore/sql"
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
|
@ -20,25 +18,6 @@ func (db *datastore) GetRepoName(name string) (*model.Repo, error) {
|
||||||
return repo, err
|
return repo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *datastore) GetRepoListOf(listof []*model.RepoLite) ([]*model.Repo, error) {
|
|
||||||
var (
|
|
||||||
repos []*model.Repo
|
|
||||||
args []interface{}
|
|
||||||
stmt string
|
|
||||||
err error
|
|
||||||
)
|
|
||||||
switch meddler.Default {
|
|
||||||
case meddler.PostgreSQL:
|
|
||||||
stmt, args = toListPostgres(listof)
|
|
||||||
default:
|
|
||||||
stmt, args = toList(listof)
|
|
||||||
}
|
|
||||||
if len(args) > 0 {
|
|
||||||
err = meddler.QueryAll(db, &repos, fmt.Sprintf(repoListOfQuery, stmt), args...)
|
|
||||||
}
|
|
||||||
return repos, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *datastore) GetRepoCount() (count int, err error) {
|
func (db *datastore) GetRepoCount() (count int, err error) {
|
||||||
err = db.QueryRow(
|
err = db.QueryRow(
|
||||||
sql.Lookup(db.driver, "count-repos"),
|
sql.Lookup(db.driver, "count-repos"),
|
||||||
|
@ -55,7 +34,8 @@ func (db *datastore) UpdateRepo(repo *model.Repo) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *datastore) DeleteRepo(repo *model.Repo) error {
|
func (db *datastore) DeleteRepo(repo *model.Repo) error {
|
||||||
var _, err = db.Exec(rebind(repoDeleteStmt), repo.ID)
|
stmt := sql.Lookup(db.driver, "repo-delete")
|
||||||
|
_, err := db.Exec(stmt, repo.ID)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,10 +83,6 @@ func (db *datastore) RepoBatch(repos []*model.Repo) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// last, _ := res.LastInsertId()
|
|
||||||
// if last != 0 {
|
|
||||||
// repo.ID = last
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -120,17 +96,6 @@ WHERE repo_full_name = ?
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
`
|
`
|
||||||
|
|
||||||
const repoListOfQuery = `
|
|
||||||
SELECT *
|
|
||||||
FROM repos
|
|
||||||
WHERE repo_full_name IN (%s)
|
|
||||||
ORDER BY repo_name
|
|
||||||
`
|
|
||||||
|
|
||||||
const repoCountQuery = `
|
|
||||||
SELECT COUNT(*) FROM repos
|
|
||||||
`
|
|
||||||
|
|
||||||
const repoDeleteStmt = `
|
const repoDeleteStmt = `
|
||||||
DELETE FROM repos
|
DELETE FROM repos
|
||||||
WHERE repo_id = ?
|
WHERE repo_id = ?
|
||||||
|
|
|
@ -84,76 +84,6 @@ func TestRepos(t *testing.T) {
|
||||||
g.Assert(repo.Name).Equal(getrepo.Name)
|
g.Assert(repo.Name).Equal(getrepo.Name)
|
||||||
})
|
})
|
||||||
|
|
||||||
g.It("Should Get a Repo List", func() {
|
|
||||||
repo1 := &model.Repo{
|
|
||||||
UserID: 1,
|
|
||||||
Owner: "bradrydzewski",
|
|
||||||
Name: "drone",
|
|
||||||
FullName: "bradrydzewski/drone",
|
|
||||||
}
|
|
||||||
repo2 := &model.Repo{
|
|
||||||
UserID: 2,
|
|
||||||
Owner: "drone",
|
|
||||||
Name: "drone",
|
|
||||||
FullName: "drone/drone",
|
|
||||||
}
|
|
||||||
repo3 := &model.Repo{
|
|
||||||
UserID: 2,
|
|
||||||
Owner: "octocat",
|
|
||||||
Name: "hello-world",
|
|
||||||
FullName: "octocat/hello-world",
|
|
||||||
}
|
|
||||||
s.CreateRepo(repo1)
|
|
||||||
s.CreateRepo(repo2)
|
|
||||||
s.CreateRepo(repo3)
|
|
||||||
|
|
||||||
repos, err := s.GetRepoListOf([]*model.RepoLite{
|
|
||||||
{FullName: "bradrydzewski/drone"},
|
|
||||||
{FullName: "drone/drone"},
|
|
||||||
})
|
|
||||||
g.Assert(err == nil).IsTrue()
|
|
||||||
g.Assert(len(repos)).Equal(2)
|
|
||||||
g.Assert(repos[0].ID).Equal(repo1.ID)
|
|
||||||
g.Assert(repos[1].ID).Equal(repo2.ID)
|
|
||||||
})
|
|
||||||
|
|
||||||
g.It("Should Get a Repo List", func() {
|
|
||||||
repo1 := &model.Repo{
|
|
||||||
UserID: 1,
|
|
||||||
Owner: "bradrydzewski",
|
|
||||||
Name: "drone",
|
|
||||||
FullName: "bradrydzewski/drone",
|
|
||||||
}
|
|
||||||
repo2 := &model.Repo{
|
|
||||||
UserID: 2,
|
|
||||||
Owner: "drone",
|
|
||||||
Name: "drone",
|
|
||||||
FullName: "drone/drone",
|
|
||||||
}
|
|
||||||
s.CreateRepo(repo1)
|
|
||||||
s.CreateRepo(repo2)
|
|
||||||
|
|
||||||
count, err := s.GetRepoCount()
|
|
||||||
g.Assert(err == nil).IsTrue()
|
|
||||||
g.Assert(count).Equal(2)
|
|
||||||
})
|
|
||||||
|
|
||||||
g.It("Should Delete a Repo", func() {
|
|
||||||
repo := model.Repo{
|
|
||||||
UserID: 1,
|
|
||||||
FullName: "bradrydzewski/drone",
|
|
||||||
Owner: "bradrydzewski",
|
|
||||||
Name: "drone",
|
|
||||||
}
|
|
||||||
s.CreateRepo(&repo)
|
|
||||||
_, err1 := s.GetRepo(repo.ID)
|
|
||||||
err2 := s.DeleteRepo(&repo)
|
|
||||||
_, err3 := s.GetRepo(repo.ID)
|
|
||||||
g.Assert(err1 == nil).IsTrue()
|
|
||||||
g.Assert(err2 == nil).IsTrue()
|
|
||||||
g.Assert(err3 == nil).IsFalse()
|
|
||||||
})
|
|
||||||
|
|
||||||
g.It("Should Enforce Unique Repo Name", func() {
|
g.It("Should Enforce Unique Repo Name", func() {
|
||||||
repo1 := model.Repo{
|
repo1 := model.Repo{
|
||||||
UserID: 1,
|
UserID: 1,
|
||||||
|
@ -175,10 +105,187 @@ func TestRepos(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRepoList(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
user := &model.User{
|
||||||
|
Login: "joe",
|
||||||
|
Email: "foo@bar.com",
|
||||||
|
Token: "e42080dddf012c718e476da161d21ad5",
|
||||||
|
}
|
||||||
|
s.CreateUser(user)
|
||||||
|
|
||||||
|
repo1 := &model.Repo{
|
||||||
|
Owner: "bradrydzewski",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "bradrydzewski/drone",
|
||||||
|
}
|
||||||
|
repo2 := &model.Repo{
|
||||||
|
Owner: "drone",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "drone/drone",
|
||||||
|
}
|
||||||
|
repo3 := &model.Repo{
|
||||||
|
Owner: "octocat",
|
||||||
|
Name: "hello-world",
|
||||||
|
FullName: "octocat/hello-world",
|
||||||
|
}
|
||||||
|
s.CreateRepo(repo1)
|
||||||
|
s.CreateRepo(repo2)
|
||||||
|
s.CreateRepo(repo3)
|
||||||
|
|
||||||
|
s.PermBatch([]*model.Perm{
|
||||||
|
{UserID: user.ID, Repo: repo1.FullName},
|
||||||
|
{UserID: user.ID, Repo: repo2.FullName},
|
||||||
|
})
|
||||||
|
|
||||||
|
repos, err := s.RepoList(user)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got, want := len(repos), 2; got != want {
|
||||||
|
t.Errorf("Want %d repositories, got %d", want, got)
|
||||||
|
}
|
||||||
|
if got, want := repos[0].ID, repo1.ID; got != want {
|
||||||
|
t.Errorf("Want repository id %d, got %d", want, got)
|
||||||
|
}
|
||||||
|
if got, want := repos[1].ID, repo2.ID; got != want {
|
||||||
|
t.Errorf("Want repository id %d, got %d", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRepoListLatest(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
user := &model.User{
|
||||||
|
Login: "joe",
|
||||||
|
Email: "foo@bar.com",
|
||||||
|
Token: "e42080dddf012c718e476da161d21ad5",
|
||||||
|
}
|
||||||
|
s.CreateUser(user)
|
||||||
|
|
||||||
|
repo1 := &model.Repo{
|
||||||
|
Owner: "bradrydzewski",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "bradrydzewski/drone",
|
||||||
|
IsActive: true,
|
||||||
|
}
|
||||||
|
repo2 := &model.Repo{
|
||||||
|
Owner: "drone",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "drone/drone",
|
||||||
|
IsActive: true,
|
||||||
|
}
|
||||||
|
repo3 := &model.Repo{
|
||||||
|
Owner: "octocat",
|
||||||
|
Name: "hello-world",
|
||||||
|
FullName: "octocat/hello-world",
|
||||||
|
IsActive: true,
|
||||||
|
}
|
||||||
|
s.CreateRepo(repo1)
|
||||||
|
s.CreateRepo(repo2)
|
||||||
|
s.CreateRepo(repo3)
|
||||||
|
|
||||||
|
s.PermBatch([]*model.Perm{
|
||||||
|
{UserID: user.ID, Repo: repo1.FullName},
|
||||||
|
{UserID: user.ID, Repo: repo2.FullName},
|
||||||
|
})
|
||||||
|
|
||||||
|
build1 := &model.Build{
|
||||||
|
RepoID: repo1.ID,
|
||||||
|
Status: model.StatusFailure,
|
||||||
|
}
|
||||||
|
build2 := &model.Build{
|
||||||
|
RepoID: repo1.ID,
|
||||||
|
Status: model.StatusRunning,
|
||||||
|
}
|
||||||
|
build3 := &model.Build{
|
||||||
|
RepoID: repo2.ID,
|
||||||
|
Status: model.StatusKilled,
|
||||||
|
}
|
||||||
|
build4 := &model.Build{
|
||||||
|
RepoID: repo3.ID,
|
||||||
|
Status: model.StatusError,
|
||||||
|
}
|
||||||
|
s.CreateBuild(build1)
|
||||||
|
s.CreateBuild(build2)
|
||||||
|
s.CreateBuild(build3)
|
||||||
|
s.CreateBuild(build4)
|
||||||
|
|
||||||
|
builds, err := s.RepoListLatest(user)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: repository list with latest build: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got, want := len(builds), 2; got != want {
|
||||||
|
t.Errorf("Want %d repositories, got %d", want, got)
|
||||||
|
}
|
||||||
|
if got, want := builds[0].Status, model.StatusRunning; want != got {
|
||||||
|
t.Errorf("Want repository status %s, got %s", want, got)
|
||||||
|
}
|
||||||
|
if got, want := builds[0].FullName, repo1.FullName; want != got {
|
||||||
|
t.Errorf("Want repository name %s, got %s", want, got)
|
||||||
|
}
|
||||||
|
if got, want := builds[1].Status, model.StatusKilled; want != got {
|
||||||
|
t.Errorf("Want repository status %s, got %s", want, got)
|
||||||
|
}
|
||||||
|
if got, want := builds[1].FullName, repo2.FullName; want != got {
|
||||||
|
t.Errorf("Want repository name %s, got %s", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRepoCount(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
repo1 := &model.Repo{
|
||||||
|
Owner: "bradrydzewski",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "bradrydzewski/drone",
|
||||||
|
}
|
||||||
|
repo2 := &model.Repo{
|
||||||
|
Owner: "drone",
|
||||||
|
Name: "drone",
|
||||||
|
FullName: "drone/drone",
|
||||||
|
}
|
||||||
|
s.CreateRepo(repo1)
|
||||||
|
s.CreateRepo(repo2)
|
||||||
|
|
||||||
|
s.Exec("ANALYZE")
|
||||||
|
count, _ := s.GetRepoCount()
|
||||||
|
if got, want := count, 2; got != want {
|
||||||
|
t.Errorf("Want %d repositories, got %d", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRepoBatch(t *testing.T) {
|
func TestRepoBatch(t *testing.T) {
|
||||||
s := newTest()
|
s := newTest()
|
||||||
defer func() {
|
defer func() {
|
||||||
s.Exec("delete from repos")
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
s.Close()
|
s.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -221,8 +328,39 @@ func TestRepoBatch(t *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.Exec("ANALYZE")
|
||||||
count, _ := s.GetRepoCount()
|
count, _ := s.GetRepoCount()
|
||||||
if got, want := count, 3; got != want {
|
if got, want := count, 3; got != want {
|
||||||
t.Errorf("Want %d repositories, got %d", want, got)
|
t.Errorf("Want %d repositories, got %d", want, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRepoCrud(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from repos")
|
||||||
|
s.Exec("delete from users")
|
||||||
|
s.Exec("delete from perms")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
repo := model.Repo{
|
||||||
|
UserID: 1,
|
||||||
|
FullName: "bradrydzewski/drone",
|
||||||
|
Owner: "bradrydzewski",
|
||||||
|
Name: "drone",
|
||||||
|
}
|
||||||
|
s.CreateRepo(&repo)
|
||||||
|
_, err1 := s.GetRepo(repo.ID)
|
||||||
|
err2 := s.DeleteRepo(&repo)
|
||||||
|
_, err3 := s.GetRepo(repo.ID)
|
||||||
|
if err1 != nil {
|
||||||
|
t.Errorf("Unexpected error: select repository: %s", err1)
|
||||||
|
}
|
||||||
|
if err2 != nil {
|
||||||
|
t.Errorf("Unexpected error: delete repository: %s", err2)
|
||||||
|
}
|
||||||
|
if err3 == nil {
|
||||||
|
t.Errorf("Expected error: sql.ErrNoRows")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ func TestSecretList(t *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if got, want := len(list), 2; got != want {
|
if got, want := len(list), 2; got != want {
|
||||||
t.Errorf("Want %d registries, got %d", want, got)
|
t.Errorf("Want %d secrets, got %d", want, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +112,34 @@ func TestSecretUpdate(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSecretDelete(t *testing.T) {
|
||||||
|
s := newTest()
|
||||||
|
defer func() {
|
||||||
|
s.Exec("delete from secrets")
|
||||||
|
s.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
secret := &model.Secret{
|
||||||
|
RepoID: 1,
|
||||||
|
Name: "foo",
|
||||||
|
Value: "baz",
|
||||||
|
}
|
||||||
|
if err := s.SecretCreate(secret); err != nil {
|
||||||
|
t.Errorf("Unexpected error: insert secret: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.SecretDelete(secret); err != nil {
|
||||||
|
t.Errorf("Unexpected error: delete secret: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err := s.SecretFind(&model.Repo{ID: 1}, "foo")
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("Expect error: sql.ErrNoRows")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSecretIndexes(t *testing.T) {
|
func TestSecretIndexes(t *testing.T) {
|
||||||
s := newTest()
|
s := newTest()
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package sql
|
package sql
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/drone/drone/store/datastore/sql/mysql"
|
||||||
"github.com/drone/drone/store/datastore/sql/postgres"
|
"github.com/drone/drone/store/datastore/sql/postgres"
|
||||||
"github.com/drone/drone/store/datastore/sql/sqlite"
|
"github.com/drone/drone/store/datastore/sql/sqlite"
|
||||||
)
|
)
|
||||||
|
@ -18,6 +19,8 @@ func Lookup(driver string, name string) string {
|
||||||
switch driver {
|
switch driver {
|
||||||
case DriverPostgres:
|
case DriverPostgres:
|
||||||
return postgres.Lookup(name)
|
return postgres.Lookup(name)
|
||||||
|
case DriverMysql:
|
||||||
|
return mysql.Lookup(name)
|
||||||
default:
|
default:
|
||||||
return sqlite.Lookup(name)
|
return sqlite.Lookup(name)
|
||||||
}
|
}
|
||||||
|
|
28
store/datastore/sql/mysql/files/config.sql
Normal file
28
store/datastore/sql/mysql/files/config.sql
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
-- name: config-find-id
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
config_id
|
||||||
|
,config_repo_id
|
||||||
|
,config_hash
|
||||||
|
,config_data
|
||||||
|
FROM config
|
||||||
|
WHERE config_id = ?
|
||||||
|
|
||||||
|
-- name: config-find-repo-hash
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
config_id
|
||||||
|
,config_repo_id
|
||||||
|
,config_hash
|
||||||
|
,config_data
|
||||||
|
FROM config
|
||||||
|
WHERE config_repo_id = ?
|
||||||
|
AND config_hash = ?
|
||||||
|
|
||||||
|
-- name: config-find-approved
|
||||||
|
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE build_repo_id = ?
|
||||||
|
AND build_config_id = ?
|
||||||
|
AND build_status NOT IN ('blocked', 'pending')
|
||||||
|
LIMIT 1
|
14
store/datastore/sql/mysql/files/counts.sql
Normal file
14
store/datastore/sql/mysql/files/counts.sql
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
-- name: count-users
|
||||||
|
|
||||||
|
SELECT count(1)
|
||||||
|
FROM users
|
||||||
|
|
||||||
|
-- name: count-repos
|
||||||
|
|
||||||
|
SELECT count(1)
|
||||||
|
FROM repos
|
||||||
|
|
||||||
|
-- name: count-builds
|
||||||
|
|
||||||
|
SELECT count(1)
|
||||||
|
FROM builds
|
61
store/datastore/sql/mysql/files/feed.sql
Normal file
61
store/datastore/sql/mysql/files/feed.sql
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
-- name: feed-latest-build
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos LEFT OUTER JOIN builds ON build_id = (
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE builds.build_repo_id = repos.repo_id
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
AND repos.repo_active = true
|
||||||
|
ORDER BY repo_full_name ASC;
|
||||||
|
|
||||||
|
-- name: feed
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
INNER JOIN builds ON builds.build_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 50
|
45
store/datastore/sql/mysql/files/files.sql
Normal file
45
store/datastore/sql/mysql/files/files.sql
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
-- name: files-find-build
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
FROM files
|
||||||
|
WHERE file_build_id = ?
|
||||||
|
|
||||||
|
-- name: files-find-proc-name
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
FROM files
|
||||||
|
WHERE file_proc_id = ?
|
||||||
|
AND file_name = ?
|
||||||
|
|
||||||
|
-- name: files-find-proc-name-data
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
,file_data
|
||||||
|
FROM files
|
||||||
|
WHERE file_proc_id = ?
|
||||||
|
AND file_name = ?
|
||||||
|
|
||||||
|
-- name: files-delete-build
|
||||||
|
|
||||||
|
DELETE FROM files WHERE file_build_id = ?
|
58
store/datastore/sql/mysql/files/perms.sql
Normal file
58
store/datastore/sql/mysql/files/perms.sql
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
-- name: perms-find-user
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_date
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
|
||||||
|
-- name: perms-find-user-repo
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_repo_id = ?
|
||||||
|
|
||||||
|
-- name: perms-insert-replace
|
||||||
|
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES (?,?,?,?,?,?)
|
||||||
|
|
||||||
|
-- name: perms-insert-replace-lookup
|
||||||
|
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES (?,(SELECT repo_id FROM repos WHERE repo_full_name = ?),?,?,?,?)
|
||||||
|
|
||||||
|
-- name: perms-delete-user-repo
|
||||||
|
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_repo_id = ?
|
||||||
|
|
||||||
|
-- name: perms-delete-user-date
|
||||||
|
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_synced < ?
|
87
store/datastore/sql/mysql/files/procs.sql
Normal file
87
store/datastore/sql/mysql/files/procs.sql
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
-- name: procs-find-id
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_id = ?
|
||||||
|
|
||||||
|
-- name: procs-find-build
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
ORDER BY proc_id ASC
|
||||||
|
|
||||||
|
-- name: procs-find-build-pid
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
AND proc_pid = ?
|
||||||
|
|
||||||
|
-- name: procs-find-build-ppid
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
AND proc_ppid = ?
|
||||||
|
AND proc_name = ?
|
||||||
|
|
||||||
|
-- name: procs-delete-build
|
||||||
|
|
||||||
|
DELETE FROM procs WHERE proc_build_id = ?
|
34
store/datastore/sql/mysql/files/registry.sql
Normal file
34
store/datastore/sql/mysql/files/registry.sql
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
-- name: registry-find-repo
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
registry_id
|
||||||
|
,registry_repo_id
|
||||||
|
,registry_addr
|
||||||
|
,registry_username
|
||||||
|
,registry_password
|
||||||
|
,registry_email
|
||||||
|
,registry_token
|
||||||
|
FROM registry
|
||||||
|
WHERE registry_repo_id = ?
|
||||||
|
|
||||||
|
-- name: registry-find-repo-addr
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
registry_id
|
||||||
|
,registry_repo_id
|
||||||
|
,registry_addr
|
||||||
|
,registry_username
|
||||||
|
,registry_password
|
||||||
|
,registry_email
|
||||||
|
,registry_token
|
||||||
|
FROM registry
|
||||||
|
WHERE registry_repo_id = ?
|
||||||
|
AND registry_addr = ?
|
||||||
|
|
||||||
|
-- name: registry-delete-repo
|
||||||
|
|
||||||
|
DELETE FROM registry WHERE registry_repo_id = ?
|
||||||
|
|
||||||
|
-- name: registry-delete
|
||||||
|
|
||||||
|
DELETE FROM registry WHERE registry_id = ?
|
67
store/datastore/sql/mysql/files/repos.sql
Normal file
67
store/datastore/sql/mysql/files/repos.sql
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
-- name: repo-update-counter
|
||||||
|
|
||||||
|
UPDATE repos SET repo_counter = ?
|
||||||
|
WHERE repo_counter = ?
|
||||||
|
AND repo_id = ?
|
||||||
|
|
||||||
|
-- name: repo-find-user
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_id
|
||||||
|
,repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
ORDER BY repo_full_name ASC
|
||||||
|
|
||||||
|
-- name: repo-insert-ignore
|
||||||
|
|
||||||
|
INSERT IGNORE INTO repos (
|
||||||
|
repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||||
|
|
||||||
|
-- name: repo-delete
|
||||||
|
|
||||||
|
DELETE FROM repos WHERE repo_id = ?
|
32
store/datastore/sql/mysql/files/secret.sql
Normal file
32
store/datastore/sql/mysql/files/secret.sql
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
-- name: secret-find-repo
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
secret_id
|
||||||
|
,secret_repo_id
|
||||||
|
,secret_name
|
||||||
|
,secret_value
|
||||||
|
,secret_images
|
||||||
|
,secret_events
|
||||||
|
,secret_conceal
|
||||||
|
,secret_skip_verify
|
||||||
|
FROM secrets
|
||||||
|
WHERE secret_repo_id = ?
|
||||||
|
|
||||||
|
-- name: secret-find-repo-name
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
secret_id
|
||||||
|
,secret_repo_id
|
||||||
|
,secret_name
|
||||||
|
,secret_value
|
||||||
|
,secret_images
|
||||||
|
,secret_events
|
||||||
|
,secret_conceal
|
||||||
|
,secret_skip_verify
|
||||||
|
FROM secrets
|
||||||
|
WHERE secret_repo_id = ?
|
||||||
|
AND secret_name = ?
|
||||||
|
|
||||||
|
-- name: secret-delete
|
||||||
|
|
||||||
|
DELETE FROM secrets WHERE secret_id = ?
|
30
store/datastore/sql/mysql/files/sender.sql
Normal file
30
store/datastore/sql/mysql/files/sender.sql
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
-- name: sender-find-repo
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
sender_id
|
||||||
|
,sender_repo_id
|
||||||
|
,sender_login
|
||||||
|
,sender_allow
|
||||||
|
,sender_block
|
||||||
|
FROM senders
|
||||||
|
WHERE sender_repo_id = ?
|
||||||
|
|
||||||
|
-- name: sender-find-repo-login
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
sender_id
|
||||||
|
,sender_repo_id
|
||||||
|
,sender_login
|
||||||
|
,sender_allow
|
||||||
|
,sender_block
|
||||||
|
FROM senders
|
||||||
|
WHERE sender_repo_id = ?
|
||||||
|
AND sender_login = ?
|
||||||
|
|
||||||
|
-- name: sender-delete-repo
|
||||||
|
|
||||||
|
DELETE FROM senders WHERE sender_repo_id = ?
|
||||||
|
|
||||||
|
-- name: sender-delete
|
||||||
|
|
||||||
|
DELETE FROM senders WHERE sender_id = ?
|
11
store/datastore/sql/mysql/files/task.sql
Normal file
11
store/datastore/sql/mysql/files/task.sql
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
-- name: task-list
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
task_id
|
||||||
|
,task_data
|
||||||
|
,task_labels
|
||||||
|
FROM tasks
|
||||||
|
|
||||||
|
-- name: task-delete
|
||||||
|
|
||||||
|
DELETE FROM tasks WHERE task_id = ?
|
3
store/datastore/sql/mysql/sql.go
Normal file
3
store/datastore/sql/mysql/sql.go
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package mysql
|
||||||
|
|
||||||
|
//go:generate togo sql --package=mysql
|
527
store/datastore/sql/mysql/sql_gen.go
Normal file
527
store/datastore/sql/mysql/sql_gen.go
Normal file
|
@ -0,0 +1,527 @@
|
||||||
|
package mysql
|
||||||
|
|
||||||
|
// Lookup returns the named statement.
|
||||||
|
func Lookup(name string) string {
|
||||||
|
return index[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = map[string]string{
|
||||||
|
"config-find-id": configFindId,
|
||||||
|
"config-find-repo-hash": configFindRepoHash,
|
||||||
|
"config-find-approved": configFindApproved,
|
||||||
|
"count-users": countUsers,
|
||||||
|
"count-repos": countRepos,
|
||||||
|
"count-builds": countBuilds,
|
||||||
|
"feed-latest-build": feedLatestBuild,
|
||||||
|
"feed": feed,
|
||||||
|
"files-find-build": filesFindBuild,
|
||||||
|
"files-find-proc-name": filesFindProcName,
|
||||||
|
"files-find-proc-name-data": filesFindProcNameData,
|
||||||
|
"files-delete-build": filesDeleteBuild,
|
||||||
|
"perms-find-user": permsFindUser,
|
||||||
|
"perms-find-user-repo": permsFindUserRepo,
|
||||||
|
"perms-insert-replace": permsInsertReplace,
|
||||||
|
"perms-insert-replace-lookup": permsInsertReplaceLookup,
|
||||||
|
"perms-delete-user-repo": permsDeleteUserRepo,
|
||||||
|
"perms-delete-user-date": permsDeleteUserDate,
|
||||||
|
"procs-find-id": procsFindId,
|
||||||
|
"procs-find-build": procsFindBuild,
|
||||||
|
"procs-find-build-pid": procsFindBuildPid,
|
||||||
|
"procs-find-build-ppid": procsFindBuildPpid,
|
||||||
|
"procs-delete-build": procsDeleteBuild,
|
||||||
|
"registry-find-repo": registryFindRepo,
|
||||||
|
"registry-find-repo-addr": registryFindRepoAddr,
|
||||||
|
"registry-delete-repo": registryDeleteRepo,
|
||||||
|
"registry-delete": registryDelete,
|
||||||
|
"repo-update-counter": repoUpdateCounter,
|
||||||
|
"repo-find-user": repoFindUser,
|
||||||
|
"repo-insert-ignore": repoInsertIgnore,
|
||||||
|
"repo-delete": repoDelete,
|
||||||
|
"secret-find-repo": secretFindRepo,
|
||||||
|
"secret-find-repo-name": secretFindRepoName,
|
||||||
|
"secret-delete": secretDelete,
|
||||||
|
"sender-find-repo": senderFindRepo,
|
||||||
|
"sender-find-repo-login": senderFindRepoLogin,
|
||||||
|
"sender-delete-repo": senderDeleteRepo,
|
||||||
|
"sender-delete": senderDelete,
|
||||||
|
"task-list": taskList,
|
||||||
|
"task-delete": taskDelete,
|
||||||
|
}
|
||||||
|
|
||||||
|
var configFindId = `
|
||||||
|
SELECT
|
||||||
|
config_id
|
||||||
|
,config_repo_id
|
||||||
|
,config_hash
|
||||||
|
,config_data
|
||||||
|
FROM config
|
||||||
|
WHERE config_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var configFindRepoHash = `
|
||||||
|
SELECT
|
||||||
|
config_id
|
||||||
|
,config_repo_id
|
||||||
|
,config_hash
|
||||||
|
,config_data
|
||||||
|
FROM config
|
||||||
|
WHERE config_repo_id = ?
|
||||||
|
AND config_hash = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var configFindApproved = `
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE build_repo_id = ?
|
||||||
|
AND build_config_id = ?
|
||||||
|
AND build_status NOT IN ('blocked', 'pending')
|
||||||
|
LIMIT 1
|
||||||
|
`
|
||||||
|
|
||||||
|
var countUsers = `
|
||||||
|
SELECT count(1)
|
||||||
|
FROM users
|
||||||
|
`
|
||||||
|
|
||||||
|
var countRepos = `
|
||||||
|
SELECT count(1)
|
||||||
|
FROM repos
|
||||||
|
`
|
||||||
|
|
||||||
|
var countBuilds = `
|
||||||
|
SELECT count(1)
|
||||||
|
FROM builds
|
||||||
|
`
|
||||||
|
|
||||||
|
var feedLatestBuild = `
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos LEFT OUTER JOIN builds ON build_id = (
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE builds.build_repo_id = repos.repo_id
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
AND repos.repo_active = true
|
||||||
|
ORDER BY repo_full_name ASC;
|
||||||
|
`
|
||||||
|
|
||||||
|
var feed = `
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
INNER JOIN builds ON builds.build_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 50
|
||||||
|
`
|
||||||
|
|
||||||
|
var filesFindBuild = `
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
FROM files
|
||||||
|
WHERE file_build_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var filesFindProcName = `
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
FROM files
|
||||||
|
WHERE file_proc_id = ?
|
||||||
|
AND file_name = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var filesFindProcNameData = `
|
||||||
|
SELECT
|
||||||
|
file_id
|
||||||
|
,file_build_id
|
||||||
|
,file_proc_id
|
||||||
|
,file_name
|
||||||
|
,file_mime
|
||||||
|
,file_size
|
||||||
|
,file_time
|
||||||
|
,file_data
|
||||||
|
FROM files
|
||||||
|
WHERE file_proc_id = ?
|
||||||
|
AND file_name = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var filesDeleteBuild = `
|
||||||
|
DELETE FROM files WHERE file_build_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsFindUser = `
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_date
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsFindUserRepo = `
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsInsertReplace = `
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES (?,?,?,?,?,?)
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsInsertReplaceLookup = `
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES (?,(SELECT repo_id FROM repos WHERE repo_full_name = ?),?,?,?,?)
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsDeleteUserRepo = `
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsDeleteUserDate = `
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = ?
|
||||||
|
AND perm_synced < ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var procsFindId = `
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var procsFindBuild = `
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
ORDER BY proc_id ASC
|
||||||
|
`
|
||||||
|
|
||||||
|
var procsFindBuildPid = `
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
AND proc_pid = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var procsFindBuildPpid = `
|
||||||
|
SELECT
|
||||||
|
proc_id
|
||||||
|
,proc_build_id
|
||||||
|
,proc_pid
|
||||||
|
,proc_ppid
|
||||||
|
,proc_pgid
|
||||||
|
,proc_name
|
||||||
|
,proc_state
|
||||||
|
,proc_error
|
||||||
|
,proc_exit_code
|
||||||
|
,proc_started
|
||||||
|
,proc_stopped
|
||||||
|
,proc_machine
|
||||||
|
,proc_platform
|
||||||
|
,proc_environ
|
||||||
|
FROM procs
|
||||||
|
WHERE proc_build_id = ?
|
||||||
|
AND proc_ppid = ?
|
||||||
|
AND proc_name = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var procsDeleteBuild = `
|
||||||
|
DELETE FROM procs WHERE proc_build_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var registryFindRepo = `
|
||||||
|
SELECT
|
||||||
|
registry_id
|
||||||
|
,registry_repo_id
|
||||||
|
,registry_addr
|
||||||
|
,registry_username
|
||||||
|
,registry_password
|
||||||
|
,registry_email
|
||||||
|
,registry_token
|
||||||
|
FROM registry
|
||||||
|
WHERE registry_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var registryFindRepoAddr = `
|
||||||
|
SELECT
|
||||||
|
registry_id
|
||||||
|
,registry_repo_id
|
||||||
|
,registry_addr
|
||||||
|
,registry_username
|
||||||
|
,registry_password
|
||||||
|
,registry_email
|
||||||
|
,registry_token
|
||||||
|
FROM registry
|
||||||
|
WHERE registry_repo_id = ?
|
||||||
|
AND registry_addr = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var registryDeleteRepo = `
|
||||||
|
DELETE FROM registry WHERE registry_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var registryDelete = `
|
||||||
|
DELETE FROM registry WHERE registry_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoUpdateCounter = `
|
||||||
|
UPDATE repos SET repo_counter = ?
|
||||||
|
WHERE repo_counter = ?
|
||||||
|
AND repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoFindUser = `
|
||||||
|
SELECT
|
||||||
|
repo_id
|
||||||
|
,repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = ?
|
||||||
|
ORDER BY repo_full_name ASC
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoInsertIgnore = `
|
||||||
|
INSERT IGNORE INTO repos (
|
||||||
|
repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoDelete = `
|
||||||
|
DELETE FROM repos WHERE repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var secretFindRepo = `
|
||||||
|
SELECT
|
||||||
|
secret_id
|
||||||
|
,secret_repo_id
|
||||||
|
,secret_name
|
||||||
|
,secret_value
|
||||||
|
,secret_images
|
||||||
|
,secret_events
|
||||||
|
,secret_conceal
|
||||||
|
,secret_skip_verify
|
||||||
|
FROM secrets
|
||||||
|
WHERE secret_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var secretFindRepoName = `
|
||||||
|
SELECT
|
||||||
|
secret_id
|
||||||
|
,secret_repo_id
|
||||||
|
,secret_name
|
||||||
|
,secret_value
|
||||||
|
,secret_images
|
||||||
|
,secret_events
|
||||||
|
,secret_conceal
|
||||||
|
,secret_skip_verify
|
||||||
|
FROM secrets
|
||||||
|
WHERE secret_repo_id = ?
|
||||||
|
AND secret_name = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var secretDelete = `
|
||||||
|
DELETE FROM secrets WHERE secret_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var senderFindRepo = `
|
||||||
|
SELECT
|
||||||
|
sender_id
|
||||||
|
,sender_repo_id
|
||||||
|
,sender_login
|
||||||
|
,sender_allow
|
||||||
|
,sender_block
|
||||||
|
FROM senders
|
||||||
|
WHERE sender_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var senderFindRepoLogin = `
|
||||||
|
SELECT
|
||||||
|
sender_id
|
||||||
|
,sender_repo_id
|
||||||
|
,sender_login
|
||||||
|
,sender_allow
|
||||||
|
,sender_block
|
||||||
|
FROM senders
|
||||||
|
WHERE sender_repo_id = ?
|
||||||
|
AND sender_login = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var senderDeleteRepo = `
|
||||||
|
DELETE FROM senders WHERE sender_repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var senderDelete = `
|
||||||
|
DELETE FROM senders WHERE sender_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
|
var taskList = `
|
||||||
|
SELECT
|
||||||
|
task_id
|
||||||
|
,task_data
|
||||||
|
,task_labels
|
||||||
|
FROM tasks
|
||||||
|
`
|
||||||
|
|
||||||
|
var taskDelete = `
|
||||||
|
DELETE FROM tasks WHERE task_id = ?
|
||||||
|
`
|
61
store/datastore/sql/postgres/files/feed.sql
Normal file
61
store/datastore/sql/postgres/files/feed.sql
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
-- name: feed-latest-build
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos LEFT OUTER JOIN builds ON build_id = (
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE builds.build_repo_id = repos.repo_id
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
AND repos.repo_active = true
|
||||||
|
ORDER BY repo_full_name ASC;
|
||||||
|
|
||||||
|
-- name: feed
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
INNER JOIN builds ON builds.build_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 50
|
63
store/datastore/sql/postgres/files/perms.sql
Normal file
63
store/datastore/sql/postgres/files/perms.sql
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
-- name: perms-find-user
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_date
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
|
||||||
|
-- name: perms-find-user-repo
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_repo_id = $2
|
||||||
|
|
||||||
|
-- name: perms-insert-replace
|
||||||
|
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES ($1,$2,$3,$4,$5,$6)
|
||||||
|
|
||||||
|
-- name: perms-insert-replace-lookup
|
||||||
|
|
||||||
|
INSERT INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES ($1,(SELECT repo_id FROM repos WHERE repo_full_name = $2),$3,$4,$5,$6)
|
||||||
|
ON CONFLICT (perm_user_id, perm_repo_id) DO UPDATE SET
|
||||||
|
perm_pull = EXCLUDED.perm_pull
|
||||||
|
,perm_push = EXCLUDED.perm_push
|
||||||
|
,perm_admin = EXCLUDED.perm_admin
|
||||||
|
,perm_synced = EXCLUDED.perm_synced
|
||||||
|
|
||||||
|
-- name: perms-delete-user-repo
|
||||||
|
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_repo_id = $2
|
||||||
|
|
||||||
|
-- name: perms-delete-user-date
|
||||||
|
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_synced < $2
|
|
@ -3,3 +3,67 @@
|
||||||
UPDATE repos SET repo_counter = $1
|
UPDATE repos SET repo_counter = $1
|
||||||
WHERE repo_counter = $2
|
WHERE repo_counter = $2
|
||||||
AND repo_id = $3
|
AND repo_id = $3
|
||||||
|
|
||||||
|
-- name: repo-find-user
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
repo_id
|
||||||
|
,repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
ORDER BY repo_full_name ASC
|
||||||
|
|
||||||
|
-- name: repo-insert-ignore
|
||||||
|
|
||||||
|
INSERT INTO repos (
|
||||||
|
repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22)
|
||||||
|
ON CONFLICT (repo_full_name) DO NOTHING
|
||||||
|
|
||||||
|
-- name: repo-delete
|
||||||
|
|
||||||
|
DELETE FROM repos
|
||||||
|
WHERE repo_id = $1
|
||||||
|
|
|
@ -6,35 +6,46 @@ func Lookup(name string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
var index = map[string]string{
|
var index = map[string]string{
|
||||||
"config-find-id": configFindId,
|
"config-find-id": configFindId,
|
||||||
"config-find-repo-hash": configFindRepoHash,
|
"config-find-repo-hash": configFindRepoHash,
|
||||||
"config-find-approved": configFindApproved,
|
"config-find-approved": configFindApproved,
|
||||||
"count-users": countUsers,
|
"count-users": countUsers,
|
||||||
"count-repos": countRepos,
|
"count-repos": countRepos,
|
||||||
"count-builds": countBuilds,
|
"count-builds": countBuilds,
|
||||||
"files-find-build": filesFindBuild,
|
"feed-latest-build": feedLatestBuild,
|
||||||
"files-find-proc-name": filesFindProcName,
|
"feed": feed,
|
||||||
"files-find-proc-name-data": filesFindProcNameData,
|
"files-find-build": filesFindBuild,
|
||||||
"files-delete-build": filesDeleteBuild,
|
"files-find-proc-name": filesFindProcName,
|
||||||
"procs-find-id": procsFindId,
|
"files-find-proc-name-data": filesFindProcNameData,
|
||||||
"procs-find-build": procsFindBuild,
|
"files-delete-build": filesDeleteBuild,
|
||||||
"procs-find-build-pid": procsFindBuildPid,
|
"perms-find-user": permsFindUser,
|
||||||
"procs-find-build-ppid": procsFindBuildPpid,
|
"perms-find-user-repo": permsFindUserRepo,
|
||||||
"procs-delete-build": procsDeleteBuild,
|
"perms-insert-replace": permsInsertReplace,
|
||||||
"registry-find-repo": registryFindRepo,
|
"perms-insert-replace-lookup": permsInsertReplaceLookup,
|
||||||
"registry-find-repo-addr": registryFindRepoAddr,
|
"perms-delete-user-repo": permsDeleteUserRepo,
|
||||||
"registry-delete-repo": registryDeleteRepo,
|
"perms-delete-user-date": permsDeleteUserDate,
|
||||||
"registry-delete": registryDelete,
|
"procs-find-id": procsFindId,
|
||||||
"repo-update-counter": repoUpdateCounter,
|
"procs-find-build": procsFindBuild,
|
||||||
"secret-find-repo": secretFindRepo,
|
"procs-find-build-pid": procsFindBuildPid,
|
||||||
"secret-find-repo-name": secretFindRepoName,
|
"procs-find-build-ppid": procsFindBuildPpid,
|
||||||
"secret-delete": secretDelete,
|
"procs-delete-build": procsDeleteBuild,
|
||||||
"sender-find-repo": senderFindRepo,
|
"registry-find-repo": registryFindRepo,
|
||||||
"sender-find-repo-login": senderFindRepoLogin,
|
"registry-find-repo-addr": registryFindRepoAddr,
|
||||||
"sender-delete-repo": senderDeleteRepo,
|
"registry-delete-repo": registryDeleteRepo,
|
||||||
"sender-delete": senderDelete,
|
"registry-delete": registryDelete,
|
||||||
"task-list": taskList,
|
"repo-update-counter": repoUpdateCounter,
|
||||||
"task-delete": taskDelete,
|
"repo-find-user": repoFindUser,
|
||||||
|
"repo-insert-ignore": repoInsertIgnore,
|
||||||
|
"repo-delete": repoDelete,
|
||||||
|
"secret-find-repo": secretFindRepo,
|
||||||
|
"secret-find-repo-name": secretFindRepoName,
|
||||||
|
"secret-delete": secretDelete,
|
||||||
|
"sender-find-repo": senderFindRepo,
|
||||||
|
"sender-find-repo-login": senderFindRepoLogin,
|
||||||
|
"sender-delete-repo": senderDeleteRepo,
|
||||||
|
"sender-delete": senderDelete,
|
||||||
|
"task-list": taskList,
|
||||||
|
"task-delete": taskDelete,
|
||||||
}
|
}
|
||||||
|
|
||||||
var configFindId = `
|
var configFindId = `
|
||||||
|
@ -81,6 +92,68 @@ SELECT reltuples
|
||||||
FROM pg_class WHERE relname = 'builds';
|
FROM pg_class WHERE relname = 'builds';
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var feedLatestBuild = `
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos LEFT OUTER JOIN builds ON build_id = (
|
||||||
|
SELECT build_id FROM builds
|
||||||
|
WHERE builds.build_repo_id = repos.repo_id
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
AND repos.repo_active = true
|
||||||
|
ORDER BY repo_full_name ASC;
|
||||||
|
`
|
||||||
|
|
||||||
|
var feed = `
|
||||||
|
SELECT
|
||||||
|
repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,build_number
|
||||||
|
,build_event
|
||||||
|
,build_status
|
||||||
|
,build_created
|
||||||
|
,build_started
|
||||||
|
,build_finished
|
||||||
|
,build_commit
|
||||||
|
,build_branch
|
||||||
|
,build_ref
|
||||||
|
,build_refspec
|
||||||
|
,build_remote
|
||||||
|
,build_title
|
||||||
|
,build_message
|
||||||
|
,build_author
|
||||||
|
,build_email
|
||||||
|
,build_avatar
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
INNER JOIN builds ON builds.build_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
ORDER BY build_id DESC
|
||||||
|
LIMIT 50
|
||||||
|
`
|
||||||
|
|
||||||
var filesFindBuild = `
|
var filesFindBuild = `
|
||||||
SELECT
|
SELECT
|
||||||
file_id
|
file_id
|
||||||
|
@ -127,6 +200,70 @@ var filesDeleteBuild = `
|
||||||
DELETE FROM files WHERE file_build_id = $1
|
DELETE FROM files WHERE file_build_id = $1
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var permsFindUser = `
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_date
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsFindUserRepo = `
|
||||||
|
SELECT
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_repo_id = $2
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsInsertReplace = `
|
||||||
|
REPLACE INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES ($1,$2,$3,$4,$5,$6)
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsInsertReplaceLookup = `
|
||||||
|
INSERT INTO perms (
|
||||||
|
perm_user_id
|
||||||
|
,perm_repo_id
|
||||||
|
,perm_pull
|
||||||
|
,perm_push
|
||||||
|
,perm_admin
|
||||||
|
,perm_synced
|
||||||
|
) VALUES ($1,(SELECT repo_id FROM repos WHERE repo_full_name = $2),$3,$4,$5,$6)
|
||||||
|
ON CONFLICT (perm_user_id, perm_repo_id) DO UPDATE SET
|
||||||
|
perm_pull = EXCLUDED.perm_pull
|
||||||
|
,perm_push = EXCLUDED.perm_push
|
||||||
|
,perm_admin = EXCLUDED.perm_admin
|
||||||
|
,perm_synced = EXCLUDED.perm_synced
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsDeleteUserRepo = `
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_repo_id = $2
|
||||||
|
`
|
||||||
|
|
||||||
|
var permsDeleteUserDate = `
|
||||||
|
DELETE FROM perms
|
||||||
|
WHERE perm_user_id = $1
|
||||||
|
AND perm_synced < $2
|
||||||
|
`
|
||||||
|
|
||||||
var procsFindId = `
|
var procsFindId = `
|
||||||
SELECT
|
SELECT
|
||||||
proc_id
|
proc_id
|
||||||
|
@ -256,6 +393,70 @@ WHERE repo_counter = $2
|
||||||
AND repo_id = $3
|
AND repo_id = $3
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var repoFindUser = `
|
||||||
|
SELECT
|
||||||
|
repo_id
|
||||||
|
,repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
FROM repos
|
||||||
|
INNER JOIN perms ON perms.perm_repo_id = repos.repo_id
|
||||||
|
WHERE perms.perm_user_id = $1
|
||||||
|
ORDER BY repo_full_name ASC
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoInsertIgnore = `
|
||||||
|
INSERT INTO repos (
|
||||||
|
repo_user_id
|
||||||
|
,repo_owner
|
||||||
|
,repo_name
|
||||||
|
,repo_full_name
|
||||||
|
,repo_avatar
|
||||||
|
,repo_link
|
||||||
|
,repo_clone
|
||||||
|
,repo_branch
|
||||||
|
,repo_timeout
|
||||||
|
,repo_private
|
||||||
|
,repo_trusted
|
||||||
|
,repo_active
|
||||||
|
,repo_allow_pr
|
||||||
|
,repo_allow_push
|
||||||
|
,repo_allow_deploys
|
||||||
|
,repo_allow_tags
|
||||||
|
,repo_hash
|
||||||
|
,repo_scm
|
||||||
|
,repo_config_path
|
||||||
|
,repo_gated
|
||||||
|
,repo_visibility
|
||||||
|
,repo_counter
|
||||||
|
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22)
|
||||||
|
ON CONFLICT (repo_full_name) DO NOTHING
|
||||||
|
`
|
||||||
|
|
||||||
|
var repoDelete = `
|
||||||
|
DELETE FROM repos
|
||||||
|
WHERE repo_id = $1
|
||||||
|
`
|
||||||
|
|
||||||
var secretFindRepo = `
|
var secretFindRepo = `
|
||||||
SELECT
|
SELECT
|
||||||
secret_id
|
secret_id
|
||||||
|
|
|
@ -25,7 +25,7 @@ WHERE perm_user_id = ?
|
||||||
|
|
||||||
-- name: perms-insert-replace
|
-- name: perms-insert-replace
|
||||||
|
|
||||||
INSERT OR REPLACE INTO perms (
|
REPLACE INTO perms (
|
||||||
perm_user_id
|
perm_user_id
|
||||||
,perm_repo_id
|
,perm_repo_id
|
||||||
,perm_pull
|
,perm_pull
|
||||||
|
@ -36,7 +36,7 @@ INSERT OR REPLACE INTO perms (
|
||||||
|
|
||||||
-- name: perms-insert-replace-lookup
|
-- name: perms-insert-replace-lookup
|
||||||
|
|
||||||
INSERT OR REPLACE INTO perms (
|
REPLACE INTO perms (
|
||||||
perm_user_id
|
perm_user_id
|
||||||
,perm_repo_id
|
,perm_repo_id
|
||||||
,perm_pull
|
,perm_pull
|
||||||
|
|
|
@ -61,3 +61,7 @@ INSERT OR IGNORE INTO repos (
|
||||||
,repo_visibility
|
,repo_visibility
|
||||||
,repo_counter
|
,repo_counter
|
||||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||||
|
|
||||||
|
-- name: repo-delete
|
||||||
|
|
||||||
|
DELETE FROM repos WHERE repo_id = ?
|
||||||
|
|
|
@ -36,6 +36,7 @@ var index = map[string]string{
|
||||||
"repo-update-counter": repoUpdateCounter,
|
"repo-update-counter": repoUpdateCounter,
|
||||||
"repo-find-user": repoFindUser,
|
"repo-find-user": repoFindUser,
|
||||||
"repo-insert-ignore": repoInsertIgnore,
|
"repo-insert-ignore": repoInsertIgnore,
|
||||||
|
"repo-delete": repoDelete,
|
||||||
"secret-find-repo": secretFindRepo,
|
"secret-find-repo": secretFindRepo,
|
||||||
"secret-find-repo-name": secretFindRepoName,
|
"secret-find-repo-name": secretFindRepoName,
|
||||||
"secret-delete": secretDelete,
|
"secret-delete": secretDelete,
|
||||||
|
@ -225,7 +226,7 @@ WHERE perm_user_id = ?
|
||||||
`
|
`
|
||||||
|
|
||||||
var permsInsertReplace = `
|
var permsInsertReplace = `
|
||||||
INSERT OR REPLACE INTO perms (
|
REPLACE INTO perms (
|
||||||
perm_user_id
|
perm_user_id
|
||||||
,perm_repo_id
|
,perm_repo_id
|
||||||
,perm_pull
|
,perm_pull
|
||||||
|
@ -236,7 +237,7 @@ INSERT OR REPLACE INTO perms (
|
||||||
`
|
`
|
||||||
|
|
||||||
var permsInsertReplaceLookup = `
|
var permsInsertReplaceLookup = `
|
||||||
INSERT OR REPLACE INTO perms (
|
REPLACE INTO perms (
|
||||||
perm_user_id
|
perm_user_id
|
||||||
,perm_repo_id
|
,perm_repo_id
|
||||||
,perm_pull
|
,perm_pull
|
||||||
|
@ -445,6 +446,10 @@ INSERT OR IGNORE INTO repos (
|
||||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var repoDelete = `
|
||||||
|
DELETE FROM repos WHERE repo_id = ?
|
||||||
|
`
|
||||||
|
|
||||||
var secretFindRepo = `
|
var secretFindRepo = `
|
||||||
SELECT
|
SELECT
|
||||||
secret_id
|
secret_id
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package datastore
|
package datastore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
"github.com/drone/drone/model"
|
||||||
"github.com/drone/drone/store/datastore/sql"
|
"github.com/drone/drone/store/datastore/sql"
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
|
@ -26,46 +24,6 @@ func (db *datastore) GetUserList() ([]*model.User, error) {
|
||||||
return users, err
|
return users, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *datastore) GetUserFeed(listof []*model.RepoLite) ([]*model.Feed, error) {
|
|
||||||
var (
|
|
||||||
args []interface{}
|
|
||||||
stmt string
|
|
||||||
err error
|
|
||||||
|
|
||||||
feed = []*model.Feed{}
|
|
||||||
)
|
|
||||||
switch meddler.Default {
|
|
||||||
case meddler.PostgreSQL:
|
|
||||||
stmt, args = toListPostgres(listof)
|
|
||||||
default:
|
|
||||||
stmt, args = toList(listof)
|
|
||||||
}
|
|
||||||
if len(args) > 0 {
|
|
||||||
err = meddler.QueryAll(db, &feed, fmt.Sprintf(userFeedQuery, stmt), args...)
|
|
||||||
}
|
|
||||||
return feed, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *datastore) GetUserFeedLatest(listof []*model.RepoLite) ([]*model.Feed, error) {
|
|
||||||
var (
|
|
||||||
args []interface{}
|
|
||||||
stmt string
|
|
||||||
err error
|
|
||||||
|
|
||||||
feed = []*model.Feed{}
|
|
||||||
)
|
|
||||||
switch meddler.Default {
|
|
||||||
case meddler.PostgreSQL:
|
|
||||||
stmt, args = toListPostgres(listof)
|
|
||||||
default:
|
|
||||||
stmt, args = toList(listof)
|
|
||||||
}
|
|
||||||
if len(args) > 0 {
|
|
||||||
err = meddler.QueryAll(db, &feed, fmt.Sprintf(userFeedLatest, stmt), args...)
|
|
||||||
}
|
|
||||||
return feed, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (db *datastore) GetUserCount() (count int, err error) {
|
func (db *datastore) GetUserCount() (count int, err error) {
|
||||||
err = db.QueryRow(
|
err = db.QueryRow(
|
||||||
sql.Lookup(db.driver, "count-users"),
|
sql.Lookup(db.driver, "count-users"),
|
||||||
|
@ -108,75 +66,7 @@ FROM users
|
||||||
ORDER BY user_login ASC
|
ORDER BY user_login ASC
|
||||||
`
|
`
|
||||||
|
|
||||||
const userCountQuery = `
|
|
||||||
SELECT count(1)
|
|
||||||
FROM users
|
|
||||||
`
|
|
||||||
|
|
||||||
const userDeleteStmt = `
|
const userDeleteStmt = `
|
||||||
DELETE FROM users
|
DELETE FROM users
|
||||||
WHERE user_id=?
|
WHERE user_id=?
|
||||||
`
|
`
|
||||||
|
|
||||||
const userFeedQuery = `
|
|
||||||
SELECT
|
|
||||||
repo_owner
|
|
||||||
,repo_name
|
|
||||||
,repo_full_name
|
|
||||||
,build_number
|
|
||||||
,build_event
|
|
||||||
,build_status
|
|
||||||
,build_created
|
|
||||||
,build_started
|
|
||||||
,build_finished
|
|
||||||
,build_commit
|
|
||||||
,build_branch
|
|
||||||
,build_ref
|
|
||||||
,build_refspec
|
|
||||||
,build_remote
|
|
||||||
,build_title
|
|
||||||
,build_message
|
|
||||||
,build_author
|
|
||||||
,build_email
|
|
||||||
,build_avatar
|
|
||||||
FROM
|
|
||||||
builds b
|
|
||||||
,repos r
|
|
||||||
WHERE b.build_repo_id = r.repo_id
|
|
||||||
AND r.repo_full_name IN (%s)
|
|
||||||
ORDER BY b.build_id DESC
|
|
||||||
LIMIT 50
|
|
||||||
`
|
|
||||||
|
|
||||||
// thanks to this article for helping me find a sane sql query
|
|
||||||
// https://www.periscopedata.com/blog/4-ways-to-join-only-the-first-row-in-sql.html
|
|
||||||
|
|
||||||
const userFeedLatest = `
|
|
||||||
SELECT
|
|
||||||
repo_owner
|
|
||||||
,repo_name
|
|
||||||
,repo_full_name
|
|
||||||
,build_number
|
|
||||||
,build_event
|
|
||||||
,build_status
|
|
||||||
,build_created
|
|
||||||
,build_started
|
|
||||||
,build_finished
|
|
||||||
,build_commit
|
|
||||||
,build_branch
|
|
||||||
,build_ref
|
|
||||||
,build_refspec
|
|
||||||
,build_remote
|
|
||||||
,build_title
|
|
||||||
,build_message
|
|
||||||
,build_author
|
|
||||||
,build_email
|
|
||||||
,build_avatar
|
|
||||||
FROM repos LEFT OUTER JOIN builds ON build_id = (
|
|
||||||
SELECT build_id FROM builds
|
|
||||||
WHERE builds.build_repo_id = repos.repo_id
|
|
||||||
ORDER BY build_id DESC
|
|
||||||
LIMIT 1
|
|
||||||
)
|
|
||||||
WHERE repo_full_name IN (%s)
|
|
||||||
`
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ func TestUsers(t *testing.T) {
|
||||||
s.Exec("DELETE FROM users")
|
s.Exec("DELETE FROM users")
|
||||||
s.Exec("DELETE FROM repos")
|
s.Exec("DELETE FROM repos")
|
||||||
s.Exec("DELETE FROM builds")
|
s.Exec("DELETE FROM builds")
|
||||||
s.Exec("DELETE FROM jobs")
|
s.Exec("DELETE FROM procs")
|
||||||
})
|
})
|
||||||
|
|
||||||
g.It("Should Update a User", func() {
|
g.It("Should Update a User", func() {
|
||||||
|
@ -166,28 +166,40 @@ func TestUsers(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
g.It("Should get the Build feed for a User", func() {
|
g.It("Should get the Build feed for a User", func() {
|
||||||
|
user := &model.User{
|
||||||
|
Login: "joe",
|
||||||
|
Email: "foo@bar.com",
|
||||||
|
Token: "e42080dddf012c718e476da161d21ad5",
|
||||||
|
}
|
||||||
|
s.CreateUser(user)
|
||||||
|
|
||||||
repo1 := &model.Repo{
|
repo1 := &model.Repo{
|
||||||
UserID: 1,
|
|
||||||
Owner: "bradrydzewski",
|
Owner: "bradrydzewski",
|
||||||
Name: "drone",
|
Name: "drone",
|
||||||
FullName: "bradrydzewski/drone",
|
FullName: "bradrydzewski/drone",
|
||||||
|
IsActive: true,
|
||||||
}
|
}
|
||||||
repo2 := &model.Repo{
|
repo2 := &model.Repo{
|
||||||
UserID: 2,
|
|
||||||
Owner: "drone",
|
Owner: "drone",
|
||||||
Name: "drone",
|
Name: "drone",
|
||||||
FullName: "drone/drone",
|
FullName: "drone/drone",
|
||||||
|
IsActive: true,
|
||||||
}
|
}
|
||||||
repo3 := &model.Repo{
|
repo3 := &model.Repo{
|
||||||
UserID: 2,
|
|
||||||
Owner: "octocat",
|
Owner: "octocat",
|
||||||
Name: "hello-world",
|
Name: "hello-world",
|
||||||
FullName: "octocat/hello-world",
|
FullName: "octocat/hello-world",
|
||||||
|
IsActive: true,
|
||||||
}
|
}
|
||||||
s.CreateRepo(repo1)
|
s.CreateRepo(repo1)
|
||||||
s.CreateRepo(repo2)
|
s.CreateRepo(repo2)
|
||||||
s.CreateRepo(repo3)
|
s.CreateRepo(repo3)
|
||||||
|
|
||||||
|
s.PermBatch([]*model.Perm{
|
||||||
|
{UserID: user.ID, Repo: repo1.FullName},
|
||||||
|
{UserID: user.ID, Repo: repo2.FullName},
|
||||||
|
})
|
||||||
|
|
||||||
build1 := &model.Build{
|
build1 := &model.Build{
|
||||||
RepoID: repo1.ID,
|
RepoID: repo1.ID,
|
||||||
Status: model.StatusFailure,
|
Status: model.StatusFailure,
|
||||||
|
@ -209,10 +221,7 @@ func TestUsers(t *testing.T) {
|
||||||
s.CreateBuild(build3)
|
s.CreateBuild(build3)
|
||||||
s.CreateBuild(build4)
|
s.CreateBuild(build4)
|
||||||
|
|
||||||
builds, err := s.GetUserFeed([]*model.RepoLite{
|
builds, err := s.UserFeed(user)
|
||||||
{FullName: "bradrydzewski/drone"},
|
|
||||||
{FullName: "drone/drone"},
|
|
||||||
})
|
|
||||||
g.Assert(err == nil).IsTrue()
|
g.Assert(err == nil).IsTrue()
|
||||||
g.Assert(len(builds)).Equal(3)
|
g.Assert(len(builds)).Equal(3)
|
||||||
g.Assert(builds[0].FullName).Equal(repo2.FullName)
|
g.Assert(builds[0].FullName).Equal(repo2.FullName)
|
||||||
|
|
|
@ -2,9 +2,7 @@ package datastore
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/drone/drone/model"
|
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,41 +33,3 @@ func rebind(query string) string {
|
||||||
}
|
}
|
||||||
return string(rqb)
|
return string(rqb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper function that converts a simple repsitory list
|
|
||||||
// to a sql IN statment.
|
|
||||||
func toList(listof []*model.RepoLite) (string, []interface{}) {
|
|
||||||
var size = len(listof)
|
|
||||||
switch {
|
|
||||||
case meddler.Default == meddler.SQLite && size > 999:
|
|
||||||
size = 999
|
|
||||||
listof = listof[:999]
|
|
||||||
case size > 15000:
|
|
||||||
size = 15000
|
|
||||||
listof = listof[:15000]
|
|
||||||
}
|
|
||||||
var qs = make([]string, size, size)
|
|
||||||
var in = make([]interface{}, size, size)
|
|
||||||
for i, repo := range listof {
|
|
||||||
qs[i] = "?"
|
|
||||||
in[i] = repo.FullName
|
|
||||||
}
|
|
||||||
return strings.Join(qs, ","), in
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper function that converts a simple repository list
|
|
||||||
// to a sql IN statement compatible with postgres.
|
|
||||||
func toListPostgres(listof []*model.RepoLite) (string, []interface{}) {
|
|
||||||
var size = len(listof)
|
|
||||||
if size > 15000 {
|
|
||||||
size = 15000
|
|
||||||
listof = listof[:15000]
|
|
||||||
}
|
|
||||||
var qs = make([]string, size, size)
|
|
||||||
var in = make([]interface{}, size, size)
|
|
||||||
for i, repo := range listof {
|
|
||||||
qs[i] = "$" + strconv.Itoa(i+1)
|
|
||||||
in[i] = repo.FullName
|
|
||||||
}
|
|
||||||
return strings.Join(qs, ","), in
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,13 +18,6 @@ type Store interface {
|
||||||
// GetUserList gets a list of all users in the system.
|
// GetUserList gets a list of all users in the system.
|
||||||
GetUserList() ([]*model.User, error)
|
GetUserList() ([]*model.User, error)
|
||||||
|
|
||||||
// GetUserFeed gets a user activity feed.
|
|
||||||
GetUserFeed([]*model.RepoLite) ([]*model.Feed, error)
|
|
||||||
|
|
||||||
// GetUserFeedLatest gets a user activity feed for all repositories including
|
|
||||||
// only the latest build for each repository.
|
|
||||||
GetUserFeedLatest(listof []*model.RepoLite) ([]*model.Feed, error)
|
|
||||||
|
|
||||||
// GetUserCount gets a count of all users in the system.
|
// GetUserCount gets a count of all users in the system.
|
||||||
GetUserCount() (int, error)
|
GetUserCount() (int, error)
|
||||||
|
|
||||||
|
@ -43,9 +36,6 @@ type Store interface {
|
||||||
// GetRepoName gets a repo by its full name.
|
// GetRepoName gets a repo by its full name.
|
||||||
GetRepoName(string) (*model.Repo, error)
|
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 gets a count of all repositories in the system.
|
||||||
GetRepoCount() (int, error)
|
GetRepoCount() (int, error)
|
||||||
|
|
||||||
|
@ -162,14 +152,6 @@ func GetUserList(c context.Context) ([]*model.User, error) {
|
||||||
return FromContext(c).GetUserList()
|
return FromContext(c).GetUserList()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserFeed gets a user activity feed.
|
|
||||||
func GetUserFeed(c context.Context, listof []*model.RepoLite, latest bool) ([]*model.Feed, error) {
|
|
||||||
if latest {
|
|
||||||
return FromContext(c).GetUserFeedLatest(listof)
|
|
||||||
}
|
|
||||||
return FromContext(c).GetUserFeed(listof)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUserCount gets a count of all users in the system.
|
// GetUserCount gets a count of all users in the system.
|
||||||
func GetUserCount(c context.Context) (int, error) {
|
func GetUserCount(c context.Context) (int, error) {
|
||||||
return FromContext(c).GetUserCount()
|
return FromContext(c).GetUserCount()
|
||||||
|
@ -199,10 +181,6 @@ func GetRepoOwnerName(c context.Context, owner, name string) (*model.Repo, error
|
||||||
return FromContext(c).GetRepoName(owner + "/" + name)
|
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 {
|
func CreateRepo(c context.Context, repo *model.Repo) error {
|
||||||
return FromContext(c).CreateRepo(repo)
|
return FromContext(c).CreateRepo(repo)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue