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,
tableFieldID: tableScheme.idFieldName,
);
var fieldsValues = tableScheme.getFieldsValues(fields);
var fieldsNotNull = fieldsValues.entries
.map((e) => e.value != null ? e.key : null)
.nonNulls
.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,
);
});
});
}