github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/sql_enum_meta.go (about)

     1  package sqlx
     2  
     3  import (
     4  	"github.com/artisanhe/tools/sqlx/builder"
     5  )
     6  
     7  type EnumTypeDescriber interface {
     8  	EnumType() string
     9  	Enums() map[int][]string
    10  }
    11  
    12  type SqlMetaEnum struct {
    13  	TName string `db:"F_table_name" sql:"varchar(64) NOT NULL"`
    14  	CName string `db:"F_column_name" sql:"varchar(64) NOT NULL"`
    15  	Value int    `db:"F_value" sql:"int NOT NULL"`
    16  	Type  string `db:"F_type" sql:"varchar(255) NOT NULL"`
    17  	Key   string `db:"F_key"  sql:"varchar(255) NOT NULL"`
    18  	Label string `db:"F_label" sql:"varchar(255) NOT NULL"`
    19  }
    20  
    21  func (*SqlMetaEnum) TableName() string {
    22  	return "t_sql_meta_enum"
    23  }
    24  
    25  func (*SqlMetaEnum) UniqueIndexes() Indexes {
    26  	return Indexes{"I_enum": FieldNames{"TName", "CName", "Value"}}
    27  }
    28  
    29  func (database *Database) SyncEnum(db *DB) error {
    30  	task := NewTasks(db)
    31  
    32  	metaEnumTable := database.T(&SqlMetaEnum{})
    33  
    34  	task = task.With(func(db *DB) error {
    35  		return db.Do(metaEnumTable.Create(true)).Err()
    36  	})
    37  
    38  	task = task.With(func(db *DB) error {
    39  		return db.Do(metaEnumTable.Delete().Where(metaEnumTable.F("TName").In(database.TableNames()))).Err()
    40  	})
    41  
    42  	stmt := metaEnumTable.Insert()
    43  	hasEnum := false
    44  
    45  	for _, table := range database.Tables {
    46  		table.Columns.Range(func(col *builder.Column, idx int) {
    47  			if col.IsEnum() {
    48  				for val := range col.Enums {
    49  					hasEnum = true
    50  
    51  					sqlMetaEnum := &SqlMetaEnum{
    52  						TName: table.Name,
    53  						CName: col.Name,
    54  						Type:  col.EnumType,
    55  						Value: val,
    56  					}
    57  
    58  					enum := col.Enums[val]
    59  
    60  					if len(enum) > 0 {
    61  						sqlMetaEnum.Key = enum[0]
    62  					}
    63  
    64  					if len(enum) > 1 {
    65  						sqlMetaEnum.Label = enum[1]
    66  					}
    67  
    68  					fieldValues := FieldValuesFromStructByNonZero(sqlMetaEnum, "Value")
    69  					cols, vals := metaEnumTable.ColumnsAndValuesByFieldValues(fieldValues)
    70  					stmt = stmt.Columns(cols).Values(vals...)
    71  				}
    72  			}
    73  		})
    74  	}
    75  
    76  	if hasEnum {
    77  		task = task.With(func(db *DB) error {
    78  			return db.Do(stmt).Err()
    79  		})
    80  	}
    81  
    82  	return task.Do()
    83  }