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 statements = <String>[];
  final buf = StringBuffer();
  final createClause = ifNotExists
      ? 'CREATE TABLE IF NOT EXISTS'
      : 'CREATE TABLE';

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

  final parts = <String>[];
  bool hasAutoIncr = false;

  for (final col in blueprint.columns) {
    final isAutoIncrPrimary =
        col.autoIncrement && col.name == blueprint.primaryKey;
    if (isAutoIncrPrimary) hasAutoIncr = true;
    parts.add('  ${_renderColumn(col, isAutoIncrPrimary)}');
  }

  if (blueprint.primaryKey != null && !hasAutoIncr) {
    parts.add('  PRIMARY KEY ("${blueprint.primaryKey}")');
  }

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

  for (final fk in blueprint.foreignKeys) {
    parts.add(
      '  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)');

  statements.add(buf.toString());

  for (final idx in blueprint.indexes) {
    statements.addAll(renderAddIndex(blueprint.tableName, idx));
  }

  return statements;
}