func()

in pkg/datasource/sql/datasource/mysql/trigger.go [95:164]


func (m *mysqlTrigger) getColumnMetas(ctx context.Context, dbName string, table string, conn *sql.Conn) ([]types.ColumnMeta, error) {
	table = executor.DelEscape(table, types.DBTypeMySQL)
	var columnMetas []types.ColumnMeta

	columnMetaSql := "SELECT `TABLE_NAME`, `TABLE_SCHEMA`, `COLUMN_NAME`, `DATA_TYPE`, `COLUMN_TYPE`, `COLUMN_KEY`, `IS_NULLABLE`, `COLUMN_DEFAULT`, `EXTRA` FROM INFORMATION_SCHEMA.COLUMNS WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?"
	stmt, err := conn.PrepareContext(ctx, columnMetaSql)
	if err != nil {
		return nil, err
	}
	defer stmt.Close()

	rows, err := stmt.Query(dbName, table)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	for rows.Next() {
		var (
			tableName     string
			tableSchema   string
			columnName    string
			dataType      string
			columnType    string
			columnKey     string
			isNullable    string
			columnDefault []byte
			extra         string
		)

		columnMeta := types.ColumnMeta{}
		if err = rows.Scan(
			&tableName,
			&tableSchema,
			&columnName,
			&dataType,
			&columnType,
			&columnKey,
			&isNullable,
			&columnDefault,
			&extra); err != nil {
			return nil, err
		}

		columnMeta.Schema = tableSchema
		columnMeta.Table = tableName
		columnMeta.ColumnName = strings.Trim(columnName, "` ")
		columnMeta.DatabaseType = types.GetSqlDataType(dataType)
		columnMeta.DatabaseTypeString = dataType
		columnMeta.ColumnType = columnType
		columnMeta.ColumnKey = columnKey
		if strings.ToLower(isNullable) == "yes" {
			columnMeta.IsNullable = 1
		} else {
			columnMeta.IsNullable = 0
		}
		columnMeta.ColumnDef = columnDefault
		columnMeta.Extra = extra
		columnMeta.Autoincrement = strings.Contains(strings.ToLower(extra), "auto_increment")
		columnMetas = append(columnMetas, columnMeta)
	}
	if err := rows.Err(); err != nil {
		return nil, err
	}
	if len(columnMetas) == 0 {
		return nil, fmt.Errorf("can't find column")
	}

	return columnMetas, nil
}