mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-01-11 17:18:09 +02:00
remove generated migration code from gitignore
This commit is contained in:
parent
48b20889da
commit
c0354572c3
22
.gitignore
vendored
22
.gitignore
vendored
@ -1,31 +1,9 @@
|
||||
drone/drone
|
||||
*.sqlite
|
||||
*_gen.go
|
||||
!store/datastore/sql/sqlite/sql_gen.go
|
||||
!store/datastore/sql/mysql/sql_gen.go
|
||||
!store/datastore/sql/postgres/sql_gen.go
|
||||
!server/template/template_gen.go
|
||||
#*.css
|
||||
*.txt
|
||||
*.zip
|
||||
*.gz
|
||||
*.out
|
||||
*.min.js
|
||||
*.deb
|
||||
.env
|
||||
temp/
|
||||
extras/
|
||||
release/
|
||||
|
||||
server/frontend/bower_components
|
||||
server/frontend/build
|
||||
server/swagger/files/*.json
|
||||
|
||||
# vendored repositories that we don't actually need
|
||||
# to vendor. so exclude them
|
||||
|
||||
vendor/google.golang.org/cloud
|
||||
vendor/github.com/bugagazavr
|
||||
|
||||
# IDE/Editor stuff
|
||||
.idea
|
||||
|
444
store/datastore/ddl/mysql/ddl_gen.go
Normal file
444
store/datastore/ddl/mysql/ddl_gen.go
Normal file
@ -0,0 +1,444 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
var migrations = []struct {
|
||||
name string
|
||||
stmt []string
|
||||
}{
|
||||
{
|
||||
name: "001_create_table_users.sql",
|
||||
stmt: []string{
|
||||
createTableUsers,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "002_create_table_repos.sql",
|
||||
stmt: []string{
|
||||
createTableRepos,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "003_create_table_builds.sql",
|
||||
stmt: []string{
|
||||
createTableBuilds,
|
||||
createIndexBuildsRepo,
|
||||
createIndexBuildsAuthor,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "004_create_table_procs.sql",
|
||||
stmt: []string{
|
||||
createTableProcs,
|
||||
createIndexProcsBuild,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "005_create_table_logs.sql",
|
||||
stmt: []string{
|
||||
createTableLogs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "006_create_table_files.sql",
|
||||
stmt: []string{
|
||||
createTableFiles,
|
||||
createIndexFilesBuilds,
|
||||
createIndexFilesProcs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "007_create_table_secets.sql",
|
||||
stmt: []string{
|
||||
createTableSecrets,
|
||||
createIndexSecretsRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "008_create_table_registry.sql",
|
||||
stmt: []string{
|
||||
createTableRegistry,
|
||||
createIndexRegistryRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "009_create_table_config.sql",
|
||||
stmt: []string{
|
||||
createTableConfig,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "010_create_table_tasks.sql",
|
||||
stmt: []string{
|
||||
createTableTasks,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "011_create_table_agents.sql",
|
||||
stmt: []string{
|
||||
createTableAgents,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "012_create_table_senders.sql",
|
||||
stmt: []string{
|
||||
createTableSenders,
|
||||
createIndexSenderRepos,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// Migrate performs the database migration. If the migration fails
|
||||
// and error is returned.
|
||||
func Migrate(db *sql.DB) error {
|
||||
if err := createTable(db); err != nil {
|
||||
return err
|
||||
}
|
||||
completed, err := selectCompleted(db)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return err
|
||||
}
|
||||
for _, migration := range migrations {
|
||||
_, ok := completed[migration.name]
|
||||
if ok {
|
||||
continue
|
||||
}
|
||||
for _, stmt := range migration.stmt {
|
||||
if _, err := db.Exec(stmt); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := insertMigration(db, migration.name); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func createTable(db *sql.DB) error {
|
||||
_, err := db.Exec(migrationTableCreate)
|
||||
return err
|
||||
}
|
||||
|
||||
func insertMigration(db *sql.DB, name string) error {
|
||||
_, err := db.Exec(migrationInsert, name)
|
||||
return err
|
||||
}
|
||||
|
||||
func selectCompleted(db *sql.DB) (map[string]struct{}, error) {
|
||||
migrations := map[string]struct{}{}
|
||||
rows, err := db.Query(migrationSelect)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var name string
|
||||
if err := rows.Scan(&name); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
migrations[name] = struct{}{}
|
||||
}
|
||||
return migrations, nil
|
||||
}
|
||||
|
||||
//
|
||||
// migration table ddl and sql
|
||||
//
|
||||
|
||||
var migrationTableCreate = `
|
||||
CREATE TABLE IF NOT EXISTS migrations (
|
||||
name VARCHAR(512)
|
||||
,UNIQUE(name)
|
||||
)
|
||||
`
|
||||
|
||||
var migrationInsert = `
|
||||
INSERT INTO migrations (name) VALUES (?)
|
||||
`
|
||||
|
||||
var migrationSelect = `
|
||||
SELECT name FROM migrations
|
||||
`
|
||||
|
||||
//
|
||||
// 001_create_table_users.sql
|
||||
//
|
||||
|
||||
var createTableUsers = `
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
user_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,user_login VARCHAR(250)
|
||||
,user_token VARCHAR(500)
|
||||
,user_secret VARCHAR(500)
|
||||
,user_expiry INTEGER
|
||||
,user_email VARCHAR(500)
|
||||
,user_avatar VARCHAR(500)
|
||||
,user_active BOOLEAN
|
||||
,user_admin BOOLEAN
|
||||
,user_hash VARCHAR(500)
|
||||
|
||||
,UNIQUE(user_login)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 002_create_table_repos.sql
|
||||
//
|
||||
|
||||
var createTableRepos = `
|
||||
CREATE TABLE IF NOT EXISTS repos (
|
||||
repo_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,repo_user_id INTEGER
|
||||
,repo_owner VARCHAR(250)
|
||||
,repo_name VARCHAR(250)
|
||||
,repo_full_name VARCHAR(250)
|
||||
,repo_avatar VARCHAR(500)
|
||||
,repo_link VARCHAR(1000)
|
||||
,repo_clone VARCHAR(1000)
|
||||
,repo_branch VARCHAR(500)
|
||||
,repo_timeout INTEGER
|
||||
,repo_private BOOLEAN
|
||||
,repo_trusted BOOLEAN
|
||||
,repo_allow_pr BOOLEAN
|
||||
,repo_allow_push BOOLEAN
|
||||
,repo_allow_deploys BOOLEAN
|
||||
,repo_allow_tags BOOLEAN
|
||||
,repo_hash VARCHAR(500)
|
||||
,repo_scm VARCHAR(50)
|
||||
,repo_config_path VARCHAR(500)
|
||||
,repo_gated BOOLEAN
|
||||
|
||||
,UNIQUE(repo_full_name)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 003_create_table_builds.sql
|
||||
//
|
||||
|
||||
var createTableBuilds = `
|
||||
CREATE TABLE IF NOT EXISTS builds (
|
||||
build_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,build_repo_id INTEGER
|
||||
,build_number INTEGER
|
||||
,build_event VARCHAR(500)
|
||||
,build_status VARCHAR(500)
|
||||
,build_enqueued INTEGER
|
||||
,build_created INTEGER
|
||||
,build_started INTEGER
|
||||
,build_finished INTEGER
|
||||
,build_commit VARCHAR(500)
|
||||
,build_branch VARCHAR(500)
|
||||
,build_ref VARCHAR(500)
|
||||
,build_refspec VARCHAR(1000)
|
||||
,build_remote VARCHAR(500)
|
||||
,build_title VARCHAR(1000)
|
||||
,build_message VARCHAR(2000)
|
||||
,build_timestamp INTEGER
|
||||
,build_author VARCHAR(500)
|
||||
,build_avatar VARCHAR(1000)
|
||||
,build_email VARCHAR(500)
|
||||
,build_link VARCHAR(1000)
|
||||
,build_deploy VARCHAR(500)
|
||||
,build_signed BOOLEAN
|
||||
,build_verified BOOLEAN
|
||||
,build_parent INTEGER
|
||||
,build_error VARCHAR(500)
|
||||
,build_reviewer VARCHAR(250)
|
||||
,build_reviewed INTEGER
|
||||
,build_sender VARCHAR(250)
|
||||
,build_config_id INTEGER
|
||||
|
||||
,UNIQUE(build_number, build_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexBuildsRepo = `
|
||||
CREATE INDEX ix_build_repo ON builds (build_repo_id);
|
||||
`
|
||||
|
||||
var createIndexBuildsAuthor = `
|
||||
CREATE INDEX ix_build_author ON builds (build_author);
|
||||
`
|
||||
|
||||
//
|
||||
// 004_create_table_procs.sql
|
||||
//
|
||||
|
||||
var createTableProcs = `
|
||||
CREATE TABLE IF NOT EXISTS procs (
|
||||
proc_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,proc_build_id INTEGER
|
||||
,proc_pid INTEGER
|
||||
,proc_ppid INTEGER
|
||||
,proc_pgid INTEGER
|
||||
,proc_name VARCHAR(250)
|
||||
,proc_state VARCHAR(250)
|
||||
,proc_error VARCHAR(500)
|
||||
,proc_exit_code INTEGER
|
||||
,proc_started INTEGER
|
||||
,proc_stopped INTEGER
|
||||
,proc_machine VARCHAR(250)
|
||||
,proc_platform VARCHAR(250)
|
||||
,proc_environ VARCHAR(2000)
|
||||
|
||||
,UNIQUE(proc_build_id, proc_pid)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexProcsBuild = `
|
||||
CREATE INDEX proc_build_ix ON procs (proc_build_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 005_create_table_logs.sql
|
||||
//
|
||||
|
||||
var createTableLogs = `
|
||||
CREATE TABLE IF NOT EXISTS logs (
|
||||
log_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,log_job_id INTEGER
|
||||
,log_data MEDIUMBLOB
|
||||
|
||||
,UNIQUE(log_job_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 006_create_table_files.sql
|
||||
//
|
||||
|
||||
var createTableFiles = `
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
file_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,file_build_id INTEGER
|
||||
,file_proc_id INTEGER
|
||||
,file_name VARCHAR(250)
|
||||
,file_mime VARCHAR(250)
|
||||
,file_size INTEGER
|
||||
,file_time INTEGER
|
||||
,file_data MEDIUMBLOB
|
||||
|
||||
,UNIQUE(file_proc_id,file_name)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexFilesBuilds = `
|
||||
CREATE INDEX file_build_ix ON files (file_build_id);
|
||||
`
|
||||
|
||||
var createIndexFilesProcs = `
|
||||
CREATE INDEX file_proc_ix ON files (file_proc_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 007_create_table_secets.sql
|
||||
//
|
||||
|
||||
var createTableSecrets = `
|
||||
CREATE TABLE IF NOT EXISTS secrets (
|
||||
secret_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,secret_repo_id INTEGER
|
||||
,secret_name VARCHAR(250)
|
||||
,secret_value MEDIUMBLOB
|
||||
,secret_images VARCHAR(2000)
|
||||
,secret_events VARCHAR(2000)
|
||||
,secret_skip_verify BOOLEAN
|
||||
,secret_conceal BOOLEAN
|
||||
|
||||
,UNIQUE(secret_name, secret_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSecretsRepo = `
|
||||
CREATE INDEX ix_secrets_repo ON secrets (secret_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 008_create_table_registry.sql
|
||||
//
|
||||
|
||||
var createTableRegistry = `
|
||||
CREATE TABLE IF NOT EXISTS registry (
|
||||
registry_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,registry_repo_id INTEGER
|
||||
,registry_addr VARCHAR(250)
|
||||
,registry_email VARCHAR(500)
|
||||
,registry_username VARCHAR(2000)
|
||||
,registry_password VARCHAR(2000)
|
||||
,registry_token VARCHAR(2000)
|
||||
|
||||
,UNIQUE(registry_addr, registry_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexRegistryRepo = `
|
||||
CREATE INDEX ix_registry_repo ON registry (registry_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 009_create_table_config.sql
|
||||
//
|
||||
|
||||
var createTableConfig = `
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
config_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,config_repo_id INTEGER
|
||||
,config_hash VARCHAR(250)
|
||||
,config_data MEDIUMBLOB
|
||||
|
||||
,UNIQUE(config_hash, config_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 010_create_table_tasks.sql
|
||||
//
|
||||
|
||||
var createTableTasks = `
|
||||
CREATE TABLE IF NOT EXISTS tasks (
|
||||
task_id VARCHAR(250) PRIMARY KEY
|
||||
,task_data MEDIUMBLOB
|
||||
,task_labels MEDIUMBLOB
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 011_create_table_agents.sql
|
||||
//
|
||||
|
||||
var createTableAgents = `
|
||||
CREATE TABLE IF NOT EXISTS agents (
|
||||
agent_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,agent_addr VARCHAR(250)
|
||||
,agent_platform VARCHAR(500)
|
||||
,agent_capacity INTEGER
|
||||
,agent_created INTEGER
|
||||
,agent_updated INTEGER
|
||||
|
||||
,UNIQUE(agent_addr)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 012_create_table_senders.sql
|
||||
//
|
||||
|
||||
var createTableSenders = `
|
||||
CREATE TABLE IF NOT EXISTS senders (
|
||||
sender_id INTEGER PRIMARY KEY AUTO_INCREMENT
|
||||
,sender_repo_id INTEGER
|
||||
,sender_login VARCHAR(250)
|
||||
,sender_allow BOOLEAN
|
||||
,sender_block BOOLEAN
|
||||
|
||||
,UNIQUE(sender_repo_id,sender_login)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSenderRepos = `
|
||||
CREATE INDEX sender_repo_ix ON senders (sender_repo_id);
|
||||
`
|
444
store/datastore/ddl/postgres/ddl_gen.go
Normal file
444
store/datastore/ddl/postgres/ddl_gen.go
Normal file
@ -0,0 +1,444 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
var migrations = []struct {
|
||||
name string
|
||||
stmt []string
|
||||
}{
|
||||
{
|
||||
name: "001_create_table_users.sql",
|
||||
stmt: []string{
|
||||
createTableUsers,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "002_create_table_repos.sql",
|
||||
stmt: []string{
|
||||
createTableRepos,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "003_create_table_builds.sql",
|
||||
stmt: []string{
|
||||
createTableBuilds,
|
||||
createIndexBuildsRepo,
|
||||
createIndexBuildsAuthor,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "004_create_table_procs.sql",
|
||||
stmt: []string{
|
||||
createTableProcs,
|
||||
createIndexProcsBuild,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "005_create_table_logs.sql",
|
||||
stmt: []string{
|
||||
createTableLogs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "006_create_table_files.sql",
|
||||
stmt: []string{
|
||||
createTableFiles,
|
||||
createIndexFilesBuilds,
|
||||
createIndexFilesProcs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "007_create_table_secets.sql",
|
||||
stmt: []string{
|
||||
createTableSecrets,
|
||||
createIndexSecretsRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "008_create_table_registry.sql",
|
||||
stmt: []string{
|
||||
createTableRegistry,
|
||||
createIndexRegistryRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "009_create_table_config.sql",
|
||||
stmt: []string{
|
||||
createTableConfig,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "010_create_table_tasks.sql",
|
||||
stmt: []string{
|
||||
createTableTasks,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "011_create_table_agents.sql",
|
||||
stmt: []string{
|
||||
createTableAgents,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "012_create_table_senders.sql",
|
||||
stmt: []string{
|
||||
createTableSenders,
|
||||
createIndexSenderRepos,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// Migrate performs the database migration. If the migration fails
|
||||
// and error is returned.
|
||||
func Migrate(db *sql.DB) error {
|
||||
if err := createTable(db); err != nil {
|
||||
return err
|
||||
}
|
||||
completed, err := selectCompleted(db)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return err
|
||||
}
|
||||
for _, migration := range migrations {
|
||||
_, ok := completed[migration.name]
|
||||
if ok {
|
||||
continue
|
||||
}
|
||||
for _, stmt := range migration.stmt {
|
||||
if _, err := db.Exec(stmt); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := insertMigration(db, migration.name); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func createTable(db *sql.DB) error {
|
||||
_, err := db.Exec(migrationTableCreate)
|
||||
return err
|
||||
}
|
||||
|
||||
func insertMigration(db *sql.DB, name string) error {
|
||||
_, err := db.Exec(migrationInsert, name)
|
||||
return err
|
||||
}
|
||||
|
||||
func selectCompleted(db *sql.DB) (map[string]struct{}, error) {
|
||||
migrations := map[string]struct{}{}
|
||||
rows, err := db.Query(migrationSelect)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var name string
|
||||
if err := rows.Scan(&name); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
migrations[name] = struct{}{}
|
||||
}
|
||||
return migrations, nil
|
||||
}
|
||||
|
||||
//
|
||||
// migration table ddl and sql
|
||||
//
|
||||
|
||||
var migrationTableCreate = `
|
||||
CREATE TABLE IF NOT EXISTS migrations (
|
||||
name VARCHAR(512)
|
||||
,UNIQUE(name)
|
||||
)
|
||||
`
|
||||
|
||||
var migrationInsert = `
|
||||
INSERT INTO migrations (name) VALUES ($1)
|
||||
`
|
||||
|
||||
var migrationSelect = `
|
||||
SELECT name FROM migrations
|
||||
`
|
||||
|
||||
//
|
||||
// 001_create_table_users.sql
|
||||
//
|
||||
|
||||
var createTableUsers = `
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
user_id SERIAL PRIMARY KEY
|
||||
,user_login VARCHAR(250)
|
||||
,user_token VARCHAR(500)
|
||||
,user_secret VARCHAR(500)
|
||||
,user_expiry INTEGER
|
||||
,user_email VARCHAR(500)
|
||||
,user_avatar VARCHAR(500)
|
||||
,user_active BOOLEAN
|
||||
,user_admin BOOLEAN
|
||||
,user_hash VARCHAR(500)
|
||||
|
||||
,UNIQUE(user_login)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 002_create_table_repos.sql
|
||||
//
|
||||
|
||||
var createTableRepos = `
|
||||
CREATE TABLE IF NOT EXISTS repos (
|
||||
repo_id SERIAL PRIMARY KEY
|
||||
,repo_user_id INTEGER
|
||||
,repo_owner VARCHAR(250)
|
||||
,repo_name VARCHAR(250)
|
||||
,repo_full_name VARCHAR(250)
|
||||
,repo_avatar VARCHAR(500)
|
||||
,repo_link VARCHAR(1000)
|
||||
,repo_clone VARCHAR(1000)
|
||||
,repo_branch VARCHAR(500)
|
||||
,repo_timeout INTEGER
|
||||
,repo_private BOOLEAN
|
||||
,repo_trusted BOOLEAN
|
||||
,repo_allow_pr BOOLEAN
|
||||
,repo_allow_push BOOLEAN
|
||||
,repo_allow_deploys BOOLEAN
|
||||
,repo_allow_tags BOOLEAN
|
||||
,repo_hash VARCHAR(500)
|
||||
,repo_scm VARCHAR(50)
|
||||
,repo_config_path VARCHAR(500)
|
||||
,repo_gated BOOLEAN
|
||||
|
||||
,UNIQUE(repo_full_name)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 003_create_table_builds.sql
|
||||
//
|
||||
|
||||
var createTableBuilds = `
|
||||
CREATE TABLE IF NOT EXISTS builds (
|
||||
build_id SERIAL PRIMARY KEY
|
||||
,build_repo_id INTEGER
|
||||
,build_number INTEGER
|
||||
,build_event VARCHAR(500)
|
||||
,build_status VARCHAR(500)
|
||||
,build_enqueued INTEGER
|
||||
,build_created INTEGER
|
||||
,build_started INTEGER
|
||||
,build_finished INTEGER
|
||||
,build_commit VARCHAR(500)
|
||||
,build_branch VARCHAR(500)
|
||||
,build_ref VARCHAR(500)
|
||||
,build_refspec VARCHAR(1000)
|
||||
,build_remote VARCHAR(500)
|
||||
,build_title VARCHAR(1000)
|
||||
,build_message VARCHAR(2000)
|
||||
,build_timestamp INTEGER
|
||||
,build_author VARCHAR(500)
|
||||
,build_avatar VARCHAR(1000)
|
||||
,build_email VARCHAR(500)
|
||||
,build_link VARCHAR(1000)
|
||||
,build_deploy VARCHAR(500)
|
||||
,build_signed BOOLEAN
|
||||
,build_verified BOOLEAN
|
||||
,build_parent INTEGER
|
||||
,build_error VARCHAR(500)
|
||||
,build_reviewer VARCHAR(250)
|
||||
,build_reviewed INTEGER
|
||||
,build_sender VARCHAR(250)
|
||||
,build_config_id INTEGER
|
||||
|
||||
,UNIQUE(build_number, build_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexBuildsRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_build_repo ON builds (build_repo_id);
|
||||
`
|
||||
|
||||
var createIndexBuildsAuthor = `
|
||||
CREATE INDEX IF NOT EXISTS ix_build_author ON builds (build_author);
|
||||
`
|
||||
|
||||
//
|
||||
// 004_create_table_procs.sql
|
||||
//
|
||||
|
||||
var createTableProcs = `
|
||||
CREATE TABLE IF NOT EXISTS procs (
|
||||
proc_id SERIAL PRIMARY KEY
|
||||
,proc_build_id INTEGER
|
||||
,proc_pid INTEGER
|
||||
,proc_ppid INTEGER
|
||||
,proc_pgid INTEGER
|
||||
,proc_name VARCHAR(250)
|
||||
,proc_state VARCHAR(250)
|
||||
,proc_error VARCHAR(500)
|
||||
,proc_exit_code INTEGER
|
||||
,proc_started INTEGER
|
||||
,proc_stopped INTEGER
|
||||
,proc_machine VARCHAR(250)
|
||||
,proc_platform VARCHAR(250)
|
||||
,proc_environ VARCHAR(2000)
|
||||
|
||||
,UNIQUE(proc_build_id, proc_pid)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexProcsBuild = `
|
||||
CREATE INDEX IF NOT EXISTS proc_build_ix ON procs (proc_build_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 005_create_table_logs.sql
|
||||
//
|
||||
|
||||
var createTableLogs = `
|
||||
CREATE TABLE IF NOT EXISTS logs (
|
||||
log_id SERIAL PRIMARY KEY
|
||||
,log_job_id INTEGER
|
||||
,log_data BYTEA
|
||||
|
||||
,UNIQUE(log_job_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 006_create_table_files.sql
|
||||
//
|
||||
|
||||
var createTableFiles = `
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
file_id SERIAL PRIMARY KEY
|
||||
,file_build_id INTEGER
|
||||
,file_proc_id INTEGER
|
||||
,file_name VARCHAR(250)
|
||||
,file_mime VARCHAR(250)
|
||||
,file_size INTEGER
|
||||
,file_time INTEGER
|
||||
,file_data BYTEA
|
||||
|
||||
,UNIQUE(file_proc_id,file_name)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexFilesBuilds = `
|
||||
CREATE INDEX IF NOT EXISTS file_build_ix ON files (file_build_id);
|
||||
`
|
||||
|
||||
var createIndexFilesProcs = `
|
||||
CREATE INDEX IF NOT EXISTS file_proc_ix ON files (file_proc_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 007_create_table_secets.sql
|
||||
//
|
||||
|
||||
var createTableSecrets = `
|
||||
CREATE TABLE IF NOT EXISTS secrets (
|
||||
secret_id SERIAL PRIMARY KEY
|
||||
,secret_repo_id INTEGER
|
||||
,secret_name VARCHAR(250)
|
||||
,secret_value BYTEA
|
||||
,secret_images VARCHAR(2000)
|
||||
,secret_events VARCHAR(2000)
|
||||
,secret_skip_verify BOOLEAN
|
||||
,secret_conceal BOOLEAN
|
||||
|
||||
,UNIQUE(secret_name, secret_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSecretsRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_secrets_repo ON secrets (secret_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 008_create_table_registry.sql
|
||||
//
|
||||
|
||||
var createTableRegistry = `
|
||||
CREATE TABLE IF NOT EXISTS registry (
|
||||
registry_id SERIAL PRIMARY KEY
|
||||
,registry_repo_id INTEGER
|
||||
,registry_addr VARCHAR(250)
|
||||
,registry_email VARCHAR(500)
|
||||
,registry_username VARCHAR(2000)
|
||||
,registry_password VARCHAR(2000)
|
||||
,registry_token VARCHAR(2000)
|
||||
|
||||
,UNIQUE(registry_addr, registry_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexRegistryRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_registry_repo ON registry (registry_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 009_create_table_config.sql
|
||||
//
|
||||
|
||||
var createTableConfig = `
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
config_id SERIAL PRIMARY KEY
|
||||
,config_repo_id INTEGER
|
||||
,config_hash VARCHAR(250)
|
||||
,config_data BYTEA
|
||||
|
||||
,UNIQUE(config_hash, config_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 010_create_table_tasks.sql
|
||||
//
|
||||
|
||||
var createTableTasks = `
|
||||
CREATE TABLE IF NOT EXISTS tasks (
|
||||
task_id VARCHAR(250) PRIMARY KEY
|
||||
,task_data BYTEA
|
||||
,task_labels BYTEA
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 011_create_table_agents.sql
|
||||
//
|
||||
|
||||
var createTableAgents = `
|
||||
CREATE TABLE IF NOT EXISTS agents (
|
||||
agent_id SERIAL PRIMARY KEY
|
||||
,agent_addr VARCHAR(250)
|
||||
,agent_platform VARCHAR(500)
|
||||
,agent_capacity INTEGER
|
||||
,agent_created INTEGER
|
||||
,agent_updated INTEGER
|
||||
|
||||
,UNIQUE(agent_addr)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 012_create_table_senders.sql
|
||||
//
|
||||
|
||||
var createTableSenders = `
|
||||
CREATE TABLE IF NOT EXISTS senders (
|
||||
sender_id SERIAL PRIMARY KEY
|
||||
,sender_repo_id INTEGER
|
||||
,sender_login VARCHAR(250)
|
||||
,sender_allow BOOLEAN
|
||||
,sender_block BOOLEAN
|
||||
|
||||
,UNIQUE(sender_repo_id,sender_login)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSenderRepos = `
|
||||
CREATE INDEX IF NOT EXISTS sender_repo_ix ON senders (sender_repo_id);
|
||||
`
|
442
store/datastore/ddl/sqlite/ddl_gen.go
Normal file
442
store/datastore/ddl/sqlite/ddl_gen.go
Normal file
@ -0,0 +1,442 @@
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
var migrations = []struct {
|
||||
name string
|
||||
stmt []string
|
||||
}{
|
||||
{
|
||||
name: "001_create_table_users.sql",
|
||||
stmt: []string{
|
||||
createTableUsers,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "002_create_table_repos.sql",
|
||||
stmt: []string{
|
||||
createTableRepos,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "003_create_table_builds.sql",
|
||||
stmt: []string{
|
||||
createTableBuilds,
|
||||
createIndexBuildsRepo,
|
||||
createIndexBuildsAuthor,
|
||||
createIndexBuildsStatus,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "004_create_table_procs.sql",
|
||||
stmt: []string{
|
||||
createTableProcs,
|
||||
createIndexProcsBuild,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "005_create_table_logs.sql",
|
||||
stmt: []string{
|
||||
createTableLogs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "006_create_table_files.sql",
|
||||
stmt: []string{
|
||||
createTableFiles,
|
||||
createIndexFilesBuilds,
|
||||
createIndexFilesProcs,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "007_create_table_secets.sql",
|
||||
stmt: []string{
|
||||
createTableSecrets,
|
||||
createIndexSecretsRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "008_create_table_registry.sql",
|
||||
stmt: []string{
|
||||
createTableRegistry,
|
||||
createIndexRegistryRepo,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "009_create_table_config.sql",
|
||||
stmt: []string{
|
||||
createTableConfig,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "010_create_table_tasks.sql",
|
||||
stmt: []string{
|
||||
createTableTasks,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "011_create_table_agents.sql",
|
||||
stmt: []string{
|
||||
createTableAgents,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "012_create_table_senders.sql",
|
||||
stmt: []string{
|
||||
createTableSenders,
|
||||
createIndexSenderRepos,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// Migrate performs the database migration. If the migration fails
|
||||
// and error is returned.
|
||||
func Migrate(db *sql.DB) error {
|
||||
if err := createTable(db); err != nil {
|
||||
return err
|
||||
}
|
||||
completed, err := selectCompleted(db)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return err
|
||||
}
|
||||
for _, migration := range migrations {
|
||||
_, ok := completed[migration.name]
|
||||
if ok {
|
||||
continue
|
||||
}
|
||||
for _, stmt := range migration.stmt {
|
||||
if _, err := db.Exec(stmt); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := insertMigration(db, migration.name); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func createTable(db *sql.DB) error {
|
||||
_, err := db.Exec(migrationTableCreate)
|
||||
return err
|
||||
}
|
||||
|
||||
func insertMigration(db *sql.DB, name string) error {
|
||||
_, err := db.Exec(migrationInsert, name)
|
||||
return err
|
||||
}
|
||||
|
||||
func selectCompleted(db *sql.DB) (map[string]struct{}, error) {
|
||||
migrations := map[string]struct{}{}
|
||||
rows, err := db.Query(migrationSelect)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var name string
|
||||
if err := rows.Scan(&name); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
migrations[name] = struct{}{}
|
||||
}
|
||||
return migrations, nil
|
||||
}
|
||||
|
||||
//
|
||||
// migration table ddl and sql
|
||||
//
|
||||
|
||||
var migrationTableCreate = `
|
||||
CREATE TABLE IF NOT EXISTS migrations (
|
||||
name VARCHAR(512)
|
||||
,UNIQUE(name)
|
||||
)
|
||||
`
|
||||
|
||||
var migrationInsert = `
|
||||
INSERT INTO migrations (name) VALUES (?)
|
||||
`
|
||||
|
||||
var migrationSelect = `
|
||||
SELECT name FROM migrations
|
||||
`
|
||||
|
||||
//
|
||||
// 001_create_table_users.sql
|
||||
//
|
||||
|
||||
var createTableUsers = `
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
user_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,user_login TEXT
|
||||
,user_token TEXT
|
||||
,user_secret TEXT
|
||||
,user_expiry INTEGER
|
||||
,user_email TEXT
|
||||
,user_avatar TEXT
|
||||
,user_active BOOLEAN
|
||||
,user_admin BOOLEAN
|
||||
,user_hash TEXT
|
||||
,UNIQUE(user_login)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 002_create_table_repos.sql
|
||||
//
|
||||
|
||||
var createTableRepos = `
|
||||
CREATE TABLE IF NOT EXISTS repos (
|
||||
repo_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,repo_user_id INTEGER
|
||||
,repo_owner TEXT
|
||||
,repo_name TEXT
|
||||
,repo_full_name TEXT
|
||||
,repo_avatar TEXT
|
||||
,repo_link TEXT
|
||||
,repo_clone TEXT
|
||||
,repo_branch TEXT
|
||||
,repo_timeout INTEGER
|
||||
,repo_private BOOLEAN
|
||||
,repo_trusted BOOLEAN
|
||||
,repo_allow_pr BOOLEAN
|
||||
,repo_allow_push BOOLEAN
|
||||
,repo_allow_deploys BOOLEAN
|
||||
,repo_allow_tags BOOLEAN
|
||||
,repo_hash TEXT
|
||||
,repo_scm TEXT
|
||||
,repo_config_path TEXT
|
||||
,repo_gated BOOLEAN
|
||||
,UNIQUE(repo_full_name)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 003_create_table_builds.sql
|
||||
//
|
||||
|
||||
var createTableBuilds = `
|
||||
CREATE TABLE IF NOT EXISTS builds (
|
||||
build_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,build_repo_id INTEGER
|
||||
,build_number INTEGER
|
||||
,build_event TEXT
|
||||
,build_status TEXT
|
||||
,build_enqueued INTEGER
|
||||
,build_created INTEGER
|
||||
,build_started INTEGER
|
||||
,build_finished INTEGER
|
||||
,build_commit TEXT
|
||||
,build_branch TEXT
|
||||
,build_ref TEXT
|
||||
,build_refspec TEXT
|
||||
,build_remote TEXT
|
||||
,build_title TEXT
|
||||
,build_message TEXT
|
||||
,build_timestamp INTEGER
|
||||
,build_author TEXT
|
||||
,build_avatar TEXT
|
||||
,build_email TEXT
|
||||
,build_link TEXT
|
||||
,build_deploy TEXT
|
||||
,build_signed BOOLEAN
|
||||
,build_verified BOOLEAN
|
||||
,build_parent INTEGER
|
||||
,build_error TEXT
|
||||
,build_reviewer TEXT
|
||||
,build_reviewed INTEGER
|
||||
,build_sender TEXT
|
||||
,build_config_id INTEGER
|
||||
,UNIQUE(build_number, build_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexBuildsRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_build_repo ON builds (build_repo_id);
|
||||
`
|
||||
|
||||
var createIndexBuildsAuthor = `
|
||||
CREATE INDEX IF NOT EXISTS ix_build_author ON builds (build_author);
|
||||
`
|
||||
|
||||
var createIndexBuildsStatus = `
|
||||
CREATE INDEX IF NOT EXISTS ix_build_status_running ON builds (build_status)
|
||||
WHERE build_status IN ('pending', 'running');
|
||||
`
|
||||
|
||||
//
|
||||
// 004_create_table_procs.sql
|
||||
//
|
||||
|
||||
var createTableProcs = `
|
||||
CREATE TABLE IF NOT EXISTS procs (
|
||||
proc_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,proc_build_id INTEGER
|
||||
,proc_pid INTEGER
|
||||
,proc_ppid INTEGER
|
||||
,proc_pgid INTEGER
|
||||
,proc_name TEXT
|
||||
,proc_state TEXT
|
||||
,proc_error TEXT
|
||||
,proc_exit_code INTEGER
|
||||
,proc_started INTEGER
|
||||
,proc_stopped INTEGER
|
||||
,proc_machine TEXT
|
||||
,proc_platform TEXT
|
||||
,proc_environ TEXT
|
||||
,UNIQUE(proc_build_id, proc_pid)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexProcsBuild = `
|
||||
CREATE INDEX IF NOT EXISTS proc_build_ix ON procs (proc_build_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 005_create_table_logs.sql
|
||||
//
|
||||
|
||||
var createTableLogs = `
|
||||
CREATE TABLE IF NOT EXISTS logs (
|
||||
log_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,log_job_id INTEGER
|
||||
,log_data BLOB
|
||||
,UNIQUE(log_job_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 006_create_table_files.sql
|
||||
//
|
||||
|
||||
var createTableFiles = `
|
||||
CREATE TABLE IF NOT EXISTS files (
|
||||
file_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,file_build_id INTEGER
|
||||
,file_proc_id INTEGER
|
||||
,file_name TEXT
|
||||
,file_mime TEXT
|
||||
,file_size INTEGER
|
||||
,file_time INTEGER
|
||||
,file_data BLOB
|
||||
,UNIQUE(file_proc_id,file_name)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexFilesBuilds = `
|
||||
CREATE INDEX IF NOT EXISTS file_build_ix ON files (file_build_id);
|
||||
`
|
||||
|
||||
var createIndexFilesProcs = `
|
||||
CREATE INDEX IF NOT EXISTS file_proc_ix ON files (file_proc_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 007_create_table_secets.sql
|
||||
//
|
||||
|
||||
var createTableSecrets = `
|
||||
CREATE TABLE IF NOT EXISTS secrets (
|
||||
secret_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,secret_repo_id INTEGER
|
||||
,secret_name TEXT
|
||||
,secret_value TEXT
|
||||
,secret_images TEXT
|
||||
,secret_events TEXT
|
||||
,secret_skip_verify BOOLEAN
|
||||
,secret_conceal BOOLEAN
|
||||
,UNIQUE(secret_name, secret_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSecretsRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_secrets_repo ON secrets (secret_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 008_create_table_registry.sql
|
||||
//
|
||||
|
||||
var createTableRegistry = `
|
||||
CREATE TABLE IF NOT EXISTS registry (
|
||||
registry_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,registry_repo_id INTEGER
|
||||
,registry_addr TEXT
|
||||
,registry_username TEXT
|
||||
,registry_password TEXT
|
||||
,registry_email TEXT
|
||||
,registry_token TEXT
|
||||
|
||||
,UNIQUE(registry_addr, registry_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexRegistryRepo = `
|
||||
CREATE INDEX IF NOT EXISTS ix_registry_repo ON registry (registry_repo_id);
|
||||
`
|
||||
|
||||
//
|
||||
// 009_create_table_config.sql
|
||||
//
|
||||
|
||||
var createTableConfig = `
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
config_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,config_repo_id INTEGER
|
||||
,config_hash TEXT
|
||||
,config_data BLOB
|
||||
,UNIQUE(config_hash, config_repo_id)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 010_create_table_tasks.sql
|
||||
//
|
||||
|
||||
var createTableTasks = `
|
||||
CREATE TABLE IF NOT EXISTS tasks (
|
||||
task_id TEXT PRIMARY KEY
|
||||
,task_data BLOB
|
||||
,task_labels BLOB
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 011_create_table_agents.sql
|
||||
//
|
||||
|
||||
var createTableAgents = `
|
||||
CREATE TABLE IF NOT EXISTS agents (
|
||||
agent_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,agent_addr TEXT
|
||||
,agent_platform TEXT
|
||||
,agent_capacity INTEGER
|
||||
,agent_created INTEGER
|
||||
,agent_updated INTEGER
|
||||
|
||||
,UNIQUE(agent_addr)
|
||||
);
|
||||
`
|
||||
|
||||
//
|
||||
// 012_create_table_senders.sql
|
||||
//
|
||||
|
||||
var createTableSenders = `
|
||||
CREATE TABLE IF NOT EXISTS senders (
|
||||
sender_id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
,sender_repo_id INTEGER
|
||||
,sender_login TEXT
|
||||
,sender_allow BOOLEAN
|
||||
,sender_block BOOLEAN
|
||||
|
||||
,UNIQUE(sender_repo_id,sender_login)
|
||||
);
|
||||
`
|
||||
|
||||
var createIndexSenderRepos = `
|
||||
CREATE INDEX IF NOT EXISTS sender_repo_ix ON senders (sender_repo_id);
|
||||
`
|
Loading…
Reference in New Issue
Block a user