showCreateTable method

String showCreateTable(
  1. Object entity
)

Returns the CREATE TABLE statement generated for entity based on the getters (pKeyAuto, notNulls, uniques, checks, defaults, fKeys) and the types declared in toMap().

Implementation

String showCreateTable(Object entity) {
  final dynamic e = entity;

  MapEntry<String, bool>? pKeyAuto;
  List<String>? notNulls;
  List<String>? uniques;
  Map<String, String>? checks;
  Map<String, String>? defaults;
  Map<String, List<String>>? fKeys;

  try {
    pKeyAuto = e.pKeyAuto as MapEntry<String, bool>?;
  } catch (_) {}
  try {
    notNulls = (e.notNulls as List?)?.cast<String>();
  } catch (_) {}
  try {
    uniques = (e.uniques as List?)?.cast<String>();
  } catch (_) {}
  try {
    checks = (e.checks as Map?)?.cast<String, String>();
  } catch (_) {}
  try {
    defaults = (e.defaults as Map?)?.cast<String, String>();
  } catch (_) {}
  try {
    fKeys = (e.fKeys as Map?)?.cast<String, List<String>>();
  } catch (_) {}

  final StringBuffer buffer = StringBuffer();
  buffer.write('CREATE TABLE ${entity.runtimeType.toString()} (\n');
  final Map<String, dynamic> objectMap = e.toMap() as Map<String, dynamic>;
  final String lastFieldName = objectMap.keys.last;
  final bool hasForeignKey = fKeys != null && fKeys.isNotEmpty;

  objectMap.forEach((String columnName, dynamic columnValue) {
    // columnValue.runtimeType is one of String, int, double, bool, DateTime,
    // Uint8List. When the value is null, the entity's toMap() puts a
    // ColumnType enum instead, so we extract the name from the enum.
    // If nothing suitable is found, fall back to TEXT.
    String columnType;
    if (columnValue == null) {
      columnType = 'String';
    } else if (columnValue is ColumnType) {
      columnType = columnValue.toString().split('.').last;
    } else {
      columnType = columnValue.runtimeType.toString();
    }

    if (columnType == 'bool') {
      checks ??= <String, String>{};
      checks![columnName] = '$columnName IN (0, 1)';
    }

    buffer.write(_writeTableColumn(
      columnName,
      _sqlTypeFor(columnType),
      pKeyAuto,
      notNulls,
      uniques,
      checks,
      defaults,
      lastFieldName,
      hasForeignKey,
    ));
  });

  if (hasForeignKey) {
    final String lastFKeyField = fKeys.keys.last;
    fKeys.forEach((String field, List<String> target) {
      buffer.write(
        'FOREIGN KEY($field) REFERENCES ${target.first}(${target[1]})'
        '${field != lastFKeyField ? ',\n' : '\n)'}',
      );
    });
  }
  return buffer.toString();
}