showCreateTable method
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();
}