diff options
author | Julien Dessaux | 2024-09-30 00:58:49 +0200 |
---|---|---|
committer | Julien Dessaux | 2024-09-30 01:00:59 +0200 |
commit | 4ff490806c826cf2da4c2291ed924f0a49383fce (patch) | |
tree | 6870f4883cd03a824095b969500f08fb59f04038 /pkg/database/migrations.go | |
parent | chore(tfstated): rename tfstate to tfstated (diff) | |
download | tfstated-4ff490806c826cf2da4c2291ed924f0a49383fce.tar.gz tfstated-4ff490806c826cf2da4c2291ed924f0a49383fce.tar.bz2 tfstated-4ff490806c826cf2da4c2291ed924f0a49383fce.zip |
feat(tfstated): implement GET and POST methods, states are encrypted in a sqlite3 database
Diffstat (limited to 'pkg/database/migrations.go')
-rw-r--r-- | pkg/database/migrations.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pkg/database/migrations.go b/pkg/database/migrations.go new file mode 100644 index 0000000..b460884 --- /dev/null +++ b/pkg/database/migrations.go @@ -0,0 +1,63 @@ +package database + +import ( + "embed" + "io/fs" + + _ "github.com/mattn/go-sqlite3" +) + +//go:embed sql/*.sql +var schemaFiles embed.FS + +func (db *DB) migrate() error { + statements := make([]string, 0) + err := fs.WalkDir(schemaFiles, ".", func(path string, d fs.DirEntry, err error) error { + if d.IsDir() || err != nil { + return err + } + var stmts []byte + if stmts, err = schemaFiles.ReadFile(path); err != nil { + return err + } else { + statements = append(statements, string(stmts)) + } + return nil + }) + if err != nil { + return err + } + + tx, err := db.Begin() + if err != nil { + return err + } + defer func() { + if err != nil { + _ = tx.Rollback() + } + }() + + var version int + if err = tx.QueryRowContext(db.ctx, `SELECT version FROM schema_version;`).Scan(&version); err != nil { + if err.Error() == "no such table: schema_version" { + version = 0 + } else { + return err + } + } + + for version < len(statements) { + if _, err = tx.ExecContext(db.ctx, statements[version]); err != nil { + return err + } + version++ + } + if _, err = tx.ExecContext(db.ctx, `DELETE FROM schema_version; INSERT INTO schema_version (version) VALUES (?);`, version); err != nil { + return err + } + if err = tx.Commit(); err != nil { + return err + } + return nil +} |