store build result in the database

Sun, 21 Dec 2025 11:44:19 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 21 Dec 2025 11:44:19 +0100
changeset 11
52487a30448e
parent 10
a4537989ed09
child 12
f505f54eb194

store build result in the database

src/db.go file | annotate | diff | comparison | revisions
src/main.go file | annotate | diff | comparison | revisions
--- /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
+}
--- 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
 }

mercurial