generateInsertSQL method

FutureOr<SQL> generateInsertSQL(
  1. Transaction transaction,
  2. String entityName,
  3. String table,
  4. Map<String, Object?> fields,
)

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,
          );
        });
  });
}