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

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