generateInsertSQL method
Implementation
FutureOr<SQL> generateInsertSQL(Transaction transaction, String entityName,
String table, Map<String, Object?> fields) {
var retTableScheme = getTableScheme(table);
return retTableScheme.resolveMapped((tableScheme) {
if (tableScheme == null) {
var errorMsg = "Can't find `TableScheme` for table: $table";
_log.severe(errorMsg);
throw StateError(errorMsg);
}
var context = EncodingContext(entityName,
namedParameters: fields, transaction: transaction, tableName: table);
var fieldsValues = tableScheme.getFieldsValues(fields);
var fieldsNotNull = fieldsValues.entries
.map((e) => e.value != null ? e.key : null)
.whereNotNull()
.toList(growable: false);
var fieldsValuesInSQL = <String, Object?>{};
return fieldsNotNull
.map((f) => fieldValueToSQL(
context, tableScheme, f, fieldsValues[f]!, fieldsValuesInSQL))
.toList(growable: false)
.resolveAll()
.resolveMapped((values) {
assert(fieldsNotNull.length == values.length);
var idFieldName = tableScheme.idFieldName;
assert(idFieldName != null && idFieldName.isNotEmpty);
var q = dialect.elementQuote;
var sql = StringBuffer();
sql.write('INSERT INTO $q');
sql.write(table);
sql.write(q);
if (fieldsNotNull.isNotEmpty) {
sql.write('(');
sql.write(fieldsNotNull.map((f) => '$q$f$q').join(','));
sql.write(')');
}
if (dialect.acceptsOutputSyntax) {
sql.write(' OUTPUT INSERTED.');
sql.write(q);
sql.write(idFieldName);
sql.write(q);
}
if (values.isNotEmpty) {
sql.write(' VALUES (');
sql.write(values.join(' , '));
sql.write(')');
} else {
if (dialect.acceptsInsertDefaultValues) {
sql.write(' DEFAULT VALUES ');
} else {
sql.write(' VALUES () ');
}
}
if (dialect.acceptsReturningSyntax) {
sql.write(' RETURNING $q$table$q.$q$idFieldName$q');
}
return SQL(sql.toString(), null, fields, fieldsValuesInSQL,
entityName: table, idFieldName: idFieldName, mainTable: table);
});
});
}