import 'package:meta/meta.dart'; import 'package:sally/sally.dart'; import 'package:sally/src/runtime/components/component.dart'; import 'package:sally/src/runtime/expressions/expression.dart'; import 'package:sally/src/runtime/expressions/text.dart'; import 'package:sally/src/runtime/expressions/variables.dart'; import 'package:sally/src/runtime/sql_types.dart'; abstract class GeneratedColumn> extends Column { final String $name; final bool $nullable; GeneratedColumn(this.$name, this.$nullable); /// Writes the definition of this column, as defined /// [here](https://www.sqlite.org/syntax/column-def.html), into the given /// buffer. void writeColumnDefinition(StringBuffer into) { into ..write('${$name} $typeName ') ..write($nullable ? 'NULL' : 'NOT NULL') ..write(' '); writeCustomConstraints(into); } @visibleForOverriding void writeCustomConstraints(StringBuffer into) {} @visibleForOverriding String get typeName; @override Expression equals(Expression compare) => Comparison.equal(this, compare); @override void writeInto(GenerationContext context) { context.buffer.write($name); } @override Expression equalsVal(T compare) => equals(Variable(compare)); } class GeneratedTextColumn extends GeneratedColumn implements TextColumn { GeneratedTextColumn(String name, bool nullable) : super(name, nullable); @override Expression like(String regex) => LikeOperator(this, Variable(regex)); @override final String typeName = 'VARCHAR'; } class GeneratedBoolColumn extends GeneratedColumn implements BoolColumn { GeneratedBoolColumn(String name, bool nullable) : super(name, nullable); @override final String typeName = 'BOOLEAN'; @override void writeCustomConstraints(StringBuffer into) { into.write('CHECK (${$name} in (0, 1))'); } @override void writeInto(GenerationContext context) { context.buffer.write('('); context.buffer.write($name); context.buffer.write(' = 1)'); } } class GeneratedIntColumn extends GeneratedColumn implements IntColumn { final bool hasAutoIncrement; @override final String typeName = 'INTEGER'; GeneratedIntColumn(String name, bool nullable, {this.hasAutoIncrement = false}) : super(name, nullable); @override Expression isBiggerThan(int i) => Comparison(this, ComparisonOperator.more, Variable(i)); @override Expression isSmallerThan(int i) => Comparison(this, ComparisonOperator.less, Variable(i)); }