From 624b16cb5ec306aea1251bf9a85ae26d15ccb21a Mon Sep 17 00:00:00 2001 From: Vladimir Barsukov Date: Tue, 28 Nov 2023 10:55:07 +0200 Subject: [PATCH] migrations --- zmigrations/zmigration.go | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 zmigrations/zmigration.go diff --git a/zmigrations/zmigration.go b/zmigrations/zmigration.go new file mode 100644 index 0000000..643542d --- /dev/null +++ b/zmigrations/zmigration.go @@ -0,0 +1,56 @@ +package zmigrations + +import ( + "embed" + "fmt" + "git.barsukov.pro/barsukov/zgo/zdb" + "io/fs" + "log" +) + +func Migrations(db *zdb.Pool, files embed.FS, loc string, reCreateSchema ...string) error { + var err error + var f []fs.DirEntry + + if len(reCreateSchema) > 0 && len(reCreateSchema[0]) > 0 { + _ = db.WExec(fmt.Sprintf("DROP SCHEMA IF EXISTS %s CASCADE;", reCreateSchema[0])) + _ = db.WExec(fmt.Sprintf("CREATE SCHEMA IF NOT EXISTS %s;", reCreateSchema[0])) + } + + if err = db.WExec("CREATE TABLE IF NOT EXISTS z_migrations(name text PRIMARY KEY, created_at timestamptz DEFAULT NOW());"); err != nil { + return err + } + + if f, err = files.ReadDir(loc); err != nil { + return err + } + + for _, m := range f { + + var s string + + if err = db.Get(&s, "SELECT name FROM z_migrations WHERE name = $1", m.Name()); err != nil { + if zdb.IsEmpty(err) { + var b []byte + + if b, err = files.ReadFile(loc + m.Name()); err != nil { + return err + } + + if err = db.WExec(string(b)); err != nil { + return fmt.Errorf("MIGRATION: %s - %v", m.Name(), err) + } + + if err = db.WExec("INSERT INTO z_migrations(name) VALUES ($1)", m.Name()); err != nil { + return err + } + + log.Printf("MIGRATION: %s", m.Name()) + } else { + return err + } + } + } + + return nil +} -- GitLab