# HG changeset patch # User Olaf Wintermann # Date 1766313859 -3600 # Node ID 52487a30448e9818ada779f4d3c0d35bb02fd80f # Parent a4537989ed091b3f33dc6e8fb91cdb6a7b7e704d store build result in the database diff -r a4537989ed09 -r 52487a30448e src/db.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/db.go Sun Dec 21 11:44:19 2025 +0100 @@ -0,0 +1,135 @@ +package main + +import ( + "database/sql" + "log" + "path" + + _ "modernc.org/sqlite" +) + +func db_init() *sql.DB { + db, err := sql.Open("sqlite", "uwbuild.db") + if err != nil { + log.Fatal(err) + } + + err = db_prepare(db) + if err != nil { + log.Fatal(err) + } + + return db +} + +func db_prepare(db *sql.DB) error { + _, err := db.Exec("select id from Repository") + if err == nil { + return nil + } + + _, err = db.Exec(` + create table Repository ( + id integer primary key autoincrement, + path text not null unique, + name text not null + ); + create table CommitInfo ( + id integer primary key autoincrement, + repository_id integer not null references Repository(id), + node text, + node_short text, + author text, + description text, + date text + ); + create table BuildEnv ( + id integer primary key autoincrement, + name text not null unique, + host text, + os text + ); + create table BuildEnvResult ( + id integer primary key autoincrement, + buildenv_id integer not null references BuildEnv(id), + commit_id integer not null references CommitInfo(id) + ); + create table BuildResult ( + id integer primary key autoincrement, + buildenvresult_id integer not null references BuildEnvResult(id), + name text, + isplatform text, + notplatform text, + config text, + configure_cmd text, + compile_cmd text, + check_cmd text, + configure_result integer, + compile_result integer, + check_result integer + ); + + `) + return err +} + +func db_load_config(db *sql.DB, config *Config) { + for _, repo := range config.Repository { + _, err := db.Exec(` + insert into Repository(path, name) + values (?, ?) + on conflict(path) do nothing`, repo.Path, path.Base(repo.Path)) + if err != nil { + log.Fatal(err) + } + } + + for _, buildenv := range config.BuildEnv { + _, err := db.Exec(` + insert into BuildEnv(name, host, os) + values (?, ?, ?) + on conflict(name) do update set + host = ?2, os = ?3;`, buildenv.Name, buildenv.Host, buildenv.OS) + if err != nil { + log.Fatal(err) + } + } +} + +func db_store_results(db *sql.DB, repo *Repository, commit *Commit, result []BuildEnvResult) error { + r, err := db.Exec(` + insert into CommitInfo(repository_id, node, node_short, author, description, date) + values ((select id from repository where path = ?), ?, ?, ?, ?, ?) + `, repo.Path, commit.Node, commit.NodeShort, commit.Author, commit.Desc, commit.Date) + if err != nil { + log.Fatal(err) + } + repo_id, err := r.LastInsertId() + if err != nil { + log.Fatal(err) + } + + for _, res := range result { + r, err := db.Exec(` + insert into BuildEnvResult(buildenv_id, commit_id) + values ((select id from BuildEnv where name = ?), ?) + `, res.Env.Name, repo_id) + if err != nil { + return err + } + buildenvresult_id, err := r.LastInsertId() + + for _, build := range res.Results { + _, err = db.Exec(` + insert into BuildResult(buildenvresult_id, name, isplatform, notplatform, config, + configure_cmd, compile_cmd, check_cmd, configure_result, compile_result, check_result) + values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `, buildenvresult_id, build.Build.Name, build.Build.IsPlatform, build.Build.NotPlatform, "", + build.Build.Configure, build.Build.Compile, build.Build.Check, + build.Configure, build.Compile, build.Check) + } + + } + + return nil +} diff -r a4537989ed09 -r 52487a30448e src/main.go --- a/src/main.go Sat Dec 20 23:10:56 2025 +0100 +++ b/src/main.go Sun Dec 21 11:44:19 2025 +0100 @@ -88,17 +88,9 @@ log.Fatal(err) } - db, err := sql.Open("sqlite", "uwbuild.db") - if err != nil { - log.Fatal(err) - } + db := db_init() defer db.Close() - err = prepare_db(db) - if err != nil { - log.Fatal(err) - } - config := &Config{} if err := xml.Unmarshal(data, &config); err != nil { log.Fatal(err) @@ -108,6 +100,8 @@ config.BuildEnvMap[env.Name] = env } + db_load_config(db, config) + for ri := range config.Repository { for bi := range config.Repository[ri].Build { build := &config.Repository[ri].Build[bi] @@ -171,32 +165,13 @@ results := exec_buildenvs(config, &repo, tmp) - err = save_result(&repo, commit, results, tmp) + err = save_result(db, &repo, commit, results, tmp) if err != nil { log.Print("cannot save results for commit ", commit.NodeShort) } } } -func prepare_db(db *sql.DB) error { - _, err := db.Exec(` - create table Repository ( - id integer primary key autoincrement, - path text not null, - name text not null - ); - create table RepoCommit ( - id integer primary key autoincrement, - repository_id integer not null, - node text, - node_short text, - author text, - description text, - date text - );`) - return err -} - func create_repo_archive(repo *Repository, tpl *template.Template, tpl2 *template.Template, tmp_dir string) error { // create a build directory, that contains the repository source // and build scripts @@ -478,7 +453,7 @@ return commit } -func save_result(repo *Repository, commit *Commit, result []BuildEnvResult, tmp_dir string) error { +func save_result(db *sql.DB, repo *Repository, commit *Commit, result []BuildEnvResult, tmp_dir string) error { out_dir := "out/" src := path.Join(tmp_dir, "result") dst := path.Join(out_dir, commit.Node) @@ -488,5 +463,10 @@ return err } + // store results in database + if err := db_store_results(db, repo, commit, result); err != nil { + return err + } + return nil }