()
| 154 | } |
| 155 | |
| 156 | func (t *Table) parse() error { |
| 157 | // +--------------------------- field type |
| 158 | // | +---------------- field size / enum values: decimal(10,2) or enum('a','b') |
| 159 | // | | +---------- extra info (unsigned, etc) |
| 160 | // | | | |
| 161 | re := regexp.MustCompile(`^(.*?)(?:\((.*?)\)(.*))?$`) |
| 162 | |
| 163 | query := "SELECT * FROM `information_schema`.`COLUMNS` WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION" |
| 164 | |
| 165 | constraints := constraintsAsMap(t.Constraints) |
| 166 | |
| 167 | rows, err := t.conn.Query(query, t.Schema, t.Name) |
| 168 | if err != nil { |
| 169 | return err |
| 170 | } |
| 171 | defer rows.Close() |
| 172 | |
| 173 | cols, err := rows.Columns() |
| 174 | if err != nil { |
| 175 | return errors.Wrap(err, "Cannot get column names") |
| 176 | } |
| 177 | |
| 178 | for rows.Next() { |
| 179 | var f Field |
| 180 | var allowNull string |
| 181 | fields := makeScanRecipients(&f, &allowNull, cols) |
| 182 | err := rows.Scan(fields...) |
| 183 | if err != nil { |
| 184 | log.Errorf("Cannot get table fields: %s", err) |
| 185 | continue |
| 186 | } |
| 187 | |
| 188 | allowedValues := []string{} |
| 189 | if f.DataType == "enum" || f.DataType == "set" { |
| 190 | m := re.FindStringSubmatch(f.ColumnType) |
| 191 | if len(m) < 2 { |
| 192 | continue |
| 193 | } |
| 194 | vals := strings.Split(m[2], ",") |
| 195 | for _, val := range vals { |
| 196 | val = strings.TrimPrefix(val, "'") |
| 197 | val = strings.TrimSuffix(val, "'") |
| 198 | allowedValues = append(allowedValues, val) |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | f.SetEnumVals = allowedValues |
| 203 | f.IsNullable = allowNull == "YES" |
| 204 | f.Constraint = constraints[f.ColumnName] |
| 205 | |
| 206 | t.Fields = append(t.Fields, f) |
| 207 | } |
| 208 | |
| 209 | if rows.Err() != nil { |
| 210 | return rows.Err() |
| 211 | } |
| 212 | return nil |
| 213 | } |
no test coverage detected