You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/db/schema/migrations/base.go

71 lines
1.9 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
// Package migrations contains the base sql statements needed to bootstrap the
// migration process. These statements setup the tables necessary for tracking
// the state of migrations.
package migrations
import (
"embed"
"fmt"
"strings"
)
// postgres contains the sql for creating the base tables used to manage
// migrations.
//
//go:embed base/postgres
var postgres embed.FS
// Base contains the sql migrtaions needed to create the initial based tables used
// to manage other migrations.
// Unlike the other migrations these create statements represent the "current" state of the tables
// and are only used on a fresh install.
type base struct {
CreateSchemaVersion string
CreateLogMigration string
}
var baseByDialect map[string]base
func stripBeginCommit(c []byte) string {
contents := strings.TrimSpace(string(c))
if strings.ToLower(contents[:len("begin;")]) == "begin;" {
contents = contents[len("begin;"):]
}
if strings.ToLower(contents[len(contents)-len("commit;"):]) == "commit;" {
contents = contents[:len(contents)-len("commit;")]
}
contents = strings.TrimSpace(contents)
return contents
}
func newBase(root string, m embed.FS) base {
schemaVersion, err := m.ReadFile(fmt.Sprintf("%s/%s", root, "01_boundary_schema_version.up.sql"))
if err != nil {
panic("missing base migration file 01_boundary_schema_version.up.sql")
}
logMigration, err := m.ReadFile(fmt.Sprintf("%s/%s", root, "02_log_migration.up.sql"))
if err != nil {
panic("missing base migration file 02_log_migration.up.sql")
}
return base{
CreateSchemaVersion: stripBeginCommit(schemaVersion),
CreateLogMigration: stripBeginCommit(logMigration),
}
}
func init() {
baseByDialect = map[string]base{
"postgres": newBase("base/postgres", postgres),
}
}
// Base returns the base create statements for the given dialect.
func Base(dialect string) base {
return baseByDialect[dialect]
}