platform/packages/orm/angel_migration/lib/src/column.dart

86 lines
2.3 KiB
Dart
Raw Normal View History

2019-02-14 17:15:34 +00:00
import 'package:angel_orm/angel_orm.dart';
class MigrationColumn extends Column {
final List<MigrationColumnReference> _references = [];
2021-05-02 07:36:33 +00:00
late bool _nullable;
IndexType? _index;
2019-02-14 17:15:34 +00:00
dynamic _defaultValue;
@override
bool get isNullable => _nullable;
@override
2021-05-02 07:36:33 +00:00
IndexType get indexType => _index!;
2019-02-14 17:15:34 +00:00
get defaultValue => _defaultValue;
List<MigrationColumnReference> get externalReferences =>
new List<MigrationColumnReference>.unmodifiable(_references);
2021-05-02 07:36:33 +00:00
MigrationColumn(ColumnType? type,
{bool isNullable: true, int? length, IndexType? indexType, defaultValue})
2019-02-14 17:15:34 +00:00
: super(type: type, length: length) {
_nullable = isNullable;
_index = indexType;
_defaultValue = defaultValue;
}
factory MigrationColumn.from(Column column) => column is MigrationColumn
? column
: new MigrationColumn(column.type,
isNullable: column.isNullable,
length: column.length,
indexType: column.indexType);
MigrationColumn notNull() => this.._nullable = false;
MigrationColumn defaultsTo(value) => this.._defaultValue = value;
MigrationColumn unique() => this.._index = IndexType.unique;
MigrationColumn primaryKey() => this.._index = IndexType.primaryKey;
MigrationColumnReference references(String foreignTable, String foreignKey) {
var ref = new MigrationColumnReference._(foreignTable, foreignKey);
_references.add(ref);
return ref;
}
}
class MigrationColumnReference {
final String foreignTable, foreignKey;
2021-05-02 07:36:33 +00:00
String? _behavior;
2019-02-14 17:15:34 +00:00
MigrationColumnReference._(this.foreignTable, this.foreignKey);
2021-05-02 07:36:33 +00:00
String? get behavior => _behavior;
2019-02-14 17:15:34 +00:00
StateError _locked() =>
new StateError('Cannot override existing "$_behavior" behavior.');
void onDeleteCascade() {
if (_behavior != null) throw _locked();
_behavior = 'ON DELETE CASCADE';
}
void onUpdateCascade() {
if (_behavior != null) throw _locked();
_behavior = 'ON UPDATE CASCADE';
}
void onNoAction() {
if (_behavior != null) throw _locked();
_behavior = 'ON UPDATE NO ACTION';
}
void onUpdateSetDefault() {
if (_behavior != null) throw _locked();
_behavior = 'ON UPDATE SET DEFAULT';
}
void onUpdateSetNull() {
if (_behavior != null) throw _locked();
_behavior = 'ON UPDATE SET NULL';
}
}