doUpdateSQL method

  1. @override
FutureOr doUpdateSQL(
  1. String entityName,
  2. String table,
  3. SQL sql,
  4. Object id,
  5. Transaction transaction,
  6. DBMySqlConnectionWrapper connection, {
  7. bool allowAutoInsert = false,
})
override

Implementation

@override
FutureOr doUpdateSQL(
  String entityName,
  String table,
  SQL sql,
  Object id,
  Transaction transaction,
  DBMySqlConnectionWrapper connection, {
  bool allowAutoInsert = false,
}) {
  if (sql.isDummy) return id;

  return connection
      .query(sql.sqlPositional, sql.parametersValuesByPosition)
      .resolveMapped((results) {
        var affectedRows = results.affectedRows ?? 0;
        if (affectedRows == 0) {
          var entry = sql.parametersByPlaceholder;
          if (!allowAutoInsert) {
            throw StateError(
              "Can't update not stored entity into table `$table`: $entry",
            );
          }

          var fields = sql.namedParameters!;

          return generateInsertSQL(
            transaction,
            entityName,
            table,
            fields,
          ).resolveMapped((insertSQL) {
            _log.info(
              'Update not affecting any row! Auto inserting: $insertSQL',
            );
            return doInsertSQL(
              entityName,
              table,
              insertSQL,
              transaction,
              connection,
            );
          });
        }

        return _resolveResultID(results, table, sql, id);
      });
}