insert method

Future<Optional<T>> insert(
  1. QueryExecutor executor
)

Implementation

Future<Optional<T>> insert(QueryExecutor executor) {
  var insertion = values?.compileInsert(this, tableName);

  if (insertion == '') {
    throw StateError('No values have been specified for insertion.');
  } else {
    var sql = compile({});
    var returningSql = '';
    if (executor.dialect is PostgreSQLDialect) {
      var returning = fields.map(adornWithTableName).join(', ');
      sql = 'WITH $tableName as ($insertion RETURNING $returning) $sql';
    } else if (executor.dialect is MySQLDialect) {
      // Default to using 'id' as primary key in model
      if (fields.contains("id")) {
        returningSql = '$sql where $tableName.id=?';
      } else {
        var returningSelect = values?.compileInsertSelect(this, tableName);
        returningSql = '$sql where $returningSelect';
      }

      sql = '$insertion';
    } else {
      throw ArgumentError("Unsupported database dialect.");
    }

    //_log.warning("Insert Query = $sql");

    return executor
        .query(tableName, sql, substitutionValues,
            returningQuery: returningSql)
        .then((result) {
      // Return SQL execution results
      //if (result.isNotEmpty) {
      //  for (var element in result.first) {
      //    _log.fine("value: $element");
      //  }
      //}
      return result.isEmpty ? Optional.empty() : deserialize(result.first);
    });
  }
}