resolveError method

  1. @override
Object resolveError(
  1. Object error,
  2. StackTrace stackTrace,
  3. Object? operation,
  4. Object? previousError,
)
override

Implementation

@override
Object resolveError(
  Object error,
  StackTrace stackTrace,
  Object? operation,
  Object? previousError,
) {
  if (error is DBSQLiteAdapterException) {
    return error;
  }

  SQL? failedSQL;
  if (error is _SQLiteStatementException) {
    failedSQL = error.sql;
    error = error.error;
  }

  if (error is SqliteException) {
    var extendedCode = error.extendedResultCode;

    // SQLITE_CONSTRAINT_UNIQUE / SQLITE_CONSTRAINT_PRIMARYKEY:
    if (extendedCode == 2067 || extendedCode == 1555) {
      var (tableName, fieldName) = _parseConstraintTableField(error.message);

      return EntityFieldInvalid(
        "unique",
        _invalidValue(failedSQL, fieldName, error),
        tableName: tableName,
        fieldName: fieldName,
        parentError: error,
        parentStackTrace: stackTrace,
        previousError: previousError,
        operation: operation,
      );
    }

    // SQLITE_CONSTRAINT_FOREIGNKEY:
    if (extendedCode == 787) {
      return DBSQLiteAdapterException(
        'delete.constraint',
        error.message,
        parentError: error,
        parentStackTrace: stackTrace,
        previousError: previousError,
        operation: operation,
      );
    }

    // SQLITE_CONSTRAINT_NOTNULL:
    if (extendedCode == 1299) {
      var (tableName, fieldName) = _parseConstraintTableField(error.message);

      return EntityFieldInvalid(
        "null",
        _invalidValue(failedSQL, fieldName, error),
        tableName: tableName,
        fieldName: fieldName,
        parentError: error,
        parentStackTrace: stackTrace,
        previousError: previousError,
        operation: operation,
      );
    }

    // SQLITE_CONSTRAINT_CHECK: a value outside an emulated `ENUM`.
    // Note SQLite's CHECK message quotes the expression
    // ("CHECK constraint failed: t IN ('a','b')"), not `table.column`, so
    // `_parseConstraintTableField` yields nulls here.
    if (extendedCode == 275) {
      var (tableName, fieldName) = _parseConstraintTableField(error.message);

      return EntityFieldInvalid(
        "check",
        error.message,
        tableName: tableName,
        fieldName: fieldName,
        parentError: error,
        parentStackTrace: stackTrace,
        previousError: previousError,
      );
    }
  }

  return DBSQLiteAdapterException(
    'error',
    '$error',
    parentError: error,
    parentStackTrace: stackTrace,
    previousError: previousError,
    operation: operation,
  );
}