renderCreateTable method

  1. @override
List<String> renderCreateTable(
  1. TableBlueprint blueprint, {
  2. bool ifNotExists = false,
})
override

Implementation

@override
List<String> renderCreateTable(
  TableBlueprint blueprint, {
  bool ifNotExists = false,
}) {
  final buf = StringBuffer();
  final createClause = ifNotExists
      ? 'CREATE TABLE IF NOT EXISTS'
      : 'CREATE TABLE';

  buf.writeln('$createClause `${blueprint.tableName}` (');

  final parts = <String>[];

  for (final col in blueprint.columns) {
    parts.add('  ${_renderColumn(col)}');
  }

  if (blueprint.primaryKey != null) {
    final algo = blueprint.primaryAlgorithm.isNotEmpty
        ? ' USING ${blueprint.primaryAlgorithm}'
        : '';
    parts.add('  PRIMARY KEY (`${blueprint.primaryKey}`)$algo');
  }

  for (final uc in blueprint.uniqueConstraints) {
    final cols = uc.columns.map((c) => '`$c`').join(', ');
    parts.add('  CONSTRAINT `${uc.name}` UNIQUE ($cols)');
  }

  for (final idx in blueprint.indexes) {
    final cols = idx.columns.map((c) => '`$c`').join(', ');
    if (idx.type == ColumnIndex.indexKey) {
      parts.add('  INDEX `${idx.name}` ($cols)');
    } else {
      parts.add(
        '  ${idx.type.name.toUpperCase()} INDEX `${idx.name}` ($cols)',
      );
    }
  }

  for (final fk in blueprint.foreignKeys) {
    final constraint = fk.constrained
        ? 'CONSTRAINT `FK_${blueprint.tableName}_${fk.referencesTable}` '
        : '';
    parts.add(
      '  ${constraint}FOREIGN KEY (`${fk.columnName}`) '
      'REFERENCES `${fk.referencesTable}` (`${fk.referencesColumn}`) '
      'ON UPDATE ${fk.onUpdate} ON DELETE ${fk.onDelete}',
    );
  }

  buf.write(parts.join(',\n'));
  buf.write('\n)');

  return [buf.toString()];
}