Refactor RDBMS DDL
This commit is contained in:
@@ -53,22 +53,6 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
func CreateIndexTemplates(base *CreateIndex, ii ...*Index) []any {
|
||||
var (
|
||||
tt = make([]any, len(ii))
|
||||
)
|
||||
|
||||
for i := range ii {
|
||||
tt[i] = &CreateIndex{
|
||||
Index: ii[i],
|
||||
OmitIfNotExistsClause: base.OmitIfNotExistsClause,
|
||||
OmitFieldLength: base.OmitFieldLength,
|
||||
}
|
||||
}
|
||||
|
||||
return tt
|
||||
}
|
||||
|
||||
// Exec is a utility for executing series of commands
|
||||
//
|
||||
// Parameters can be string, Stringer interface or goqu's exp.SQLExpression
|
||||
@@ -82,15 +66,15 @@ func Exec(ctx context.Context, db sqlx.ExtContext, ss ...any) (err error) {
|
||||
)
|
||||
|
||||
switch c := s.(type) {
|
||||
case string:
|
||||
sql = c
|
||||
case fmt.Stringer:
|
||||
sql = c.String()
|
||||
case exp.SQLExpression:
|
||||
case interface{ ToSQL() (string, []any, error) }:
|
||||
sql, args, err = c.ToSQL()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
case fmt.Stringer:
|
||||
sql = c.String()
|
||||
case string:
|
||||
sql = c
|
||||
default:
|
||||
panic(fmt.Sprintf("unexecutable input (%T)", s))
|
||||
}
|
||||
@@ -238,29 +222,50 @@ func (t *CreateIndex) String() string {
|
||||
return sql
|
||||
}
|
||||
|
||||
func (c *AddColumn) String() string {
|
||||
sql := "ALTER TABLE" + " " + c.Table + " ADD COLUMN " + c.Column.Ident + " " + c.Column.Type.Name
|
||||
func (c *AddColumn) ToSQL() (sql string, aa []interface{}, err error) {
|
||||
sql = fmt.Sprintf(
|
||||
`ALTER TABLE %s ADD COLUMN %s %s`,
|
||||
c.Dialect.QuoteIdent(c.Table),
|
||||
c.Dialect.QuoteIdent(c.Column.Ident),
|
||||
c.Column.Type.Name,
|
||||
)
|
||||
|
||||
if !c.Column.Type.Null {
|
||||
sql += " NOT NULL"
|
||||
}
|
||||
|
||||
if len(c.Column.Default) > 0 {
|
||||
// @todo right now we can (and need to) trust that default
|
||||
// values are unharmful!
|
||||
sql += " DEFAULT " + c.Column.Default
|
||||
}
|
||||
|
||||
return sql
|
||||
return
|
||||
}
|
||||
|
||||
func (c *DropColumn) String() string {
|
||||
return "ALTER TABLE" + " " + c.Table + " DROP COLUMN " + c.Column
|
||||
func (c *DropColumn) ToSQL() (sql string, aa []interface{}, err error) {
|
||||
return fmt.Sprintf(
|
||||
`ALTER TABLE %s DROP COLUMN %s`,
|
||||
c.Dialect.QuoteIdent(c.Table),
|
||||
c.Dialect.QuoteIdent(c.Column),
|
||||
), nil, nil
|
||||
}
|
||||
|
||||
func (c *DropIndex) Express() exp.SQLExpression {
|
||||
return SQLExpression(exp.NewLiteralExpression("DROP INDEX ? ON ?", c.Ident, c.TableIdent))
|
||||
func (c *DropIndex) ToSQL() (sql string, aa []interface{}, err error) {
|
||||
return fmt.Sprintf(
|
||||
`DROP INDEX %s ON %s`,
|
||||
c.Dialect.QuoteIdent(c.Ident),
|
||||
c.Dialect.QuoteIdent(c.TableIdent),
|
||||
), nil, nil
|
||||
}
|
||||
|
||||
func (c *RenameColumn) String() string {
|
||||
return "ALTER TABLE" + " " + c.Table + " RENAME COLUMN " + c.Old + " TO " + c.New
|
||||
func (c *RenameColumn) ToSQL() (sql string, aa []interface{}, err error) {
|
||||
return fmt.Sprintf(
|
||||
`ALTER TABLE %s RENAME %s TO %s`,
|
||||
c.Dialect.QuoteIdent(c.Table),
|
||||
c.Dialect.QuoteIdent(c.Old),
|
||||
c.Dialect.QuoteIdent(c.New),
|
||||
), nil, nil
|
||||
}
|
||||
|
||||
// GetBool is a utility function to simplify getting a boolean value from a query result.
|
||||
|
||||
@@ -58,8 +58,8 @@ func (dd *dataDefiner) ConvertAttribute(attr *dal.Attribute) (*ddl.Column, error
|
||||
|
||||
func (dd *dataDefiner) TableCreate(ctx context.Context, t *ddl.Table) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{
|
||||
Table: t,
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
OmitIfNotExistsClause: true,
|
||||
})
|
||||
}
|
||||
@@ -70,23 +70,26 @@ func (dd *dataDefiner) TableLookup(ctx context.Context, t string) (*ddl.Table, e
|
||||
|
||||
func (dd *dataDefiner) ColumnAdd(ctx context.Context, t string, c *ddl.Column) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.AddColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: c,
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: c,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnDrop(ctx context.Context, t, col string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: dd.d.QuoteIdent(col),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: col,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnRename(ctx context.Context, t string, o string, n string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.RenameColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Old: dd.d.QuoteIdent(o),
|
||||
New: dd.d.QuoteIdent(n),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Old: o,
|
||||
New: n,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -100,16 +103,16 @@ func (dd *dataDefiner) IndexLookup(ctx context.Context, i, t string) (*ddl.Index
|
||||
|
||||
func (dd *dataDefiner) IndexCreate(ctx context.Context, t string, i *ddl.Index) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{
|
||||
Index: i,
|
||||
Dialect: dd.d,
|
||||
Index: i,
|
||||
OmitIfNotExistsClause: true,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) IndexDrop(ctx context.Context, t, i string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{
|
||||
Ident: dd.d.QuoteIdent(i),
|
||||
Dialect: dd.d,
|
||||
Ident: i,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -48,23 +48,26 @@ func (dd *dataDefiner) TableLookup(ctx context.Context, t string) (*ddl.Table, e
|
||||
|
||||
func (dd *dataDefiner) ColumnAdd(ctx context.Context, t string, c *ddl.Column) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.AddColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: c,
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: c,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnDrop(ctx context.Context, t, col string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: dd.d.QuoteIdent(col),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: col,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnRename(ctx context.Context, t string, o string, n string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.RenameColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Old: dd.d.QuoteIdent(o),
|
||||
New: dd.d.QuoteIdent(n),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Old: o,
|
||||
New: n,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -78,14 +81,14 @@ func (dd *dataDefiner) IndexLookup(ctx context.Context, i, t string) (*ddl.Index
|
||||
|
||||
func (dd *dataDefiner) IndexCreate(ctx context.Context, t string, i *ddl.Index) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{
|
||||
Index: i,
|
||||
Dialect: dd.d,
|
||||
Index: i,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) IndexDrop(ctx context.Context, t, i string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{
|
||||
Ident: dd.d.QuoteIdent(i),
|
||||
Dialect: dd.d,
|
||||
Ident: i,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -40,8 +40,8 @@ func (dd *dataDefiner) ConvertAttribute(attr *dal.Attribute) (*ddl.Column, error
|
||||
|
||||
func (dd *dataDefiner) TableCreate(ctx context.Context, t *ddl.Table) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{
|
||||
Table: t,
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -51,23 +51,26 @@ func (dd *dataDefiner) TableLookup(ctx context.Context, t string) (*ddl.Table, e
|
||||
|
||||
func (dd *dataDefiner) ColumnAdd(ctx context.Context, t string, c *ddl.Column) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.AddColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: c,
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: c,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnDrop(ctx context.Context, t, col string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Column: dd.d.QuoteIdent(col),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Column: col,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) ColumnRename(ctx context.Context, t string, o string, n string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.RenameColumn{
|
||||
Table: dd.d.QuoteIdent(t),
|
||||
Old: dd.d.QuoteIdent(o),
|
||||
New: dd.d.QuoteIdent(n),
|
||||
Dialect: dd.d,
|
||||
Table: t,
|
||||
Old: o,
|
||||
New: n,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -81,14 +84,14 @@ func (dd *dataDefiner) IndexLookup(ctx context.Context, i, t string) (*ddl.Index
|
||||
|
||||
func (dd *dataDefiner) IndexCreate(ctx context.Context, t string, i *ddl.Index) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{
|
||||
Index: i,
|
||||
Dialect: dd.d,
|
||||
Index: i,
|
||||
})
|
||||
}
|
||||
|
||||
func (dd *dataDefiner) IndexDrop(ctx context.Context, t, i string) error {
|
||||
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{
|
||||
Ident: dd.d.QuoteIdent(i),
|
||||
Dialect: dd.d,
|
||||
Ident: i,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@ import (
|
||||
)
|
||||
|
||||
func (s *Store) Upgrade(ctx context.Context) (err error) {
|
||||
for _, fix := range fixes {
|
||||
if err = fix(ctx, s); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
err = createTablesFromModels(
|
||||
ctx,
|
||||
@@ -29,12 +34,6 @@ func (s *Store) Upgrade(ctx context.Context) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, fix := range fixes {
|
||||
if err = fix(ctx, s); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -32,14 +32,14 @@ var (
|
||||
func fix_2022_09_00_extendComposeModuleForPrivacyAndDAL(ctx context.Context, s *Store) (err error) {
|
||||
return addColumn(ctx, s,
|
||||
"compose_module",
|
||||
&dal.Attribute{Ident: "config", Type: &dal.TypeJSON{DefaultValue: "'{}'"}},
|
||||
&dal.Attribute{Ident: "config", Type: &dal.TypeJSON{DefaultValue: "{}"}},
|
||||
)
|
||||
}
|
||||
|
||||
func fix_2022_09_00_extendComposeModuleFieldsForPrivacyAndDAL(ctx context.Context, s *Store) (err error) {
|
||||
return addColumn(ctx, s,
|
||||
"compose_module",
|
||||
&dal.Attribute{Ident: "config", Type: &dal.TypeJSON{DefaultValue: "'{}'"}},
|
||||
&dal.Attribute{Ident: "config", Type: &dal.TypeJSON{DefaultValue: "{}"}},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ func fix_2022_09_00_dropObsoleteComposeModuleFields(ctx context.Context, s *Stor
|
||||
func fix_2022_09_00_extendDalConnectionsForMeta(ctx context.Context, s *Store) (err error) {
|
||||
return addColumn(ctx, s,
|
||||
"dal_connections",
|
||||
&dal.Attribute{Ident: "meta", Type: &dal.TypeJSON{DefaultValue: "'{}'"}},
|
||||
&dal.Attribute{Ident: "meta", Type: &dal.TypeJSON{DefaultValue: "{}"}},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ func fix_2022_09_00_addMetaOnComposeRecords(ctx context.Context, s *Store) (err
|
||||
|
||||
err = addColumn(ctx, s,
|
||||
"compose_record",
|
||||
&dal.Attribute{Ident: "meta", Type: &dal.TypeJSON{DefaultValue: "'{}'"}},
|
||||
&dal.Attribute{Ident: "meta", Type: &dal.TypeJSON{DefaultValue: "{}"}},
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user