Add table creation
This commit is contained in:
parent
09c9549004
commit
4a5039cb19
19 changed files with 1132 additions and 141 deletions
127
lib/api/model/table_field_model.dart
Normal file
127
lib/api/model/table_field_model.dart
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
import 'package:uuid/uuid.dart';
|
||||
|
||||
typedef SerialTableField = TableField<int>;
|
||||
typedef UUIDTableField = TableField<UuidValue>;
|
||||
typedef StringTableField = TableField<String>;
|
||||
typedef BigIntTableField = TableField<BigInt>;
|
||||
typedef BoolTableField = TableField<bool>;
|
||||
typedef DateTableField = TableField<DateTime>;
|
||||
typedef DateTimeTableField = TableField<DateTime>;
|
||||
typedef FloatTableField = TableField<double>;
|
||||
typedef IntTableField = TableField<int>;
|
||||
|
||||
final possibleFieldTypes = {
|
||||
"serial": SerialTableField,
|
||||
"uuid": UUIDTableField,
|
||||
"str": StringTableField,
|
||||
"bigint": BigIntTableField,
|
||||
"bool": BoolTableField,
|
||||
"date": DateTableField,
|
||||
"datetime": DateTimeTableField,
|
||||
"float": FloatTableField,
|
||||
"int": IntTableField,
|
||||
};
|
||||
|
||||
class TableField<T> {
|
||||
final String fieldName;
|
||||
final String fieldType;
|
||||
final bool isUnique;
|
||||
final bool isPrimary;
|
||||
final Type type = T;
|
||||
|
||||
TableField({
|
||||
required this.fieldName,
|
||||
required this.fieldType,
|
||||
required this.isUnique,
|
||||
required this.isPrimary,
|
||||
});
|
||||
|
||||
bool canBePrimary() {
|
||||
return fieldType == "serial" || fieldType == "uuid";
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return "TableField<$T>(fieldName: $fieldName, fieldType: $fieldType, isUnique: $isUnique, isPrimary: $isPrimary)";
|
||||
}
|
||||
|
||||
String toColumnDefinition() {
|
||||
return "$fieldName:$fieldType${isPrimary ? ":primary" : ""}${isUnique ? ":unique" : ""}";
|
||||
}
|
||||
|
||||
static TableField parseTableField(String definition) {
|
||||
final parts = definition.split(":");
|
||||
final fieldName = parts[0];
|
||||
final fieldType = parts[1];
|
||||
final isUnique = parts.contains("unique");
|
||||
final isPrimary = parts.contains("primary");
|
||||
|
||||
switch (fieldType) {
|
||||
case "serial":
|
||||
return SerialTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "uuid":
|
||||
return UUIDTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "str":
|
||||
return StringTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "bigint":
|
||||
return BigIntTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "bool":
|
||||
return BoolTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "date":
|
||||
return DateTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "datetime":
|
||||
return DateTimeTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "float":
|
||||
return FloatTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
case "int":
|
||||
return IntTableField(
|
||||
fieldName: fieldName,
|
||||
fieldType: fieldType,
|
||||
isUnique: isUnique,
|
||||
isPrimary: isPrimary,
|
||||
);
|
||||
default:
|
||||
throw Exception("Unknown field type: $fieldType");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue