1//! Errors, type aliases, and functions related to working with `Result`.
23use std::error::Erroras StdError;
4use std::ffi::NulError;
5use std::fmt::{self, Display};
67#[derive(#[automatically_derived]
#[allow(clippy::enum_variant_names)]
impl ::core::fmt::Debug for Error {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Error::InvalidCString(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InvalidCString", &__self_0),
Error::DatabaseError(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"DatabaseError", __self_0, &__self_1),
Error::NotFound =>
::core::fmt::Formatter::write_str(f, "NotFound"),
Error::QueryBuilderError(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"QueryBuilderError", &__self_0),
Error::DeserializationError(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"DeserializationError", &__self_0),
Error::SerializationError(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"SerializationError", &__self_0),
Error::RollbackErrorOnCommit {
rollback_error: __self_0, commit_error: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"RollbackErrorOnCommit", "rollback_error", __self_0,
"commit_error", &__self_1),
Error::RollbackTransaction =>
::core::fmt::Formatter::write_str(f, "RollbackTransaction"),
Error::AlreadyInTransaction =>
::core::fmt::Formatter::write_str(f, "AlreadyInTransaction"),
Error::NotInTransaction =>
::core::fmt::Formatter::write_str(f, "NotInTransaction"),
Error::BrokenTransactionManager =>
::core::fmt::Formatter::write_str(f,
"BrokenTransactionManager"),
Error::IntegerConversion(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"IntegerConversion", &__self_0),
}
}
}Debug)]
8#[allow(clippy::enum_variant_names)]
9/// Represents all the ways that a query can fail.
10///
11/// This type is not intended to be exhaustively matched, and new variants may
12/// be added in the future without a major version bump.
13#[non_exhaustive]
14pub enum Error {
15/// The query contained a nul byte.
16 ///
17 /// This should never occur in normal usage.
18InvalidCString(NulError),
1920/// The database returned an error.
21 ///
22 /// While Diesel prevents almost all sources of runtime errors at compile
23 /// time, it does not attempt to prevent 100% of them. Typically this error
24 /// will occur from insert or update statements due to a constraint
25 /// violation.
26DatabaseError(
27DatabaseErrorKind,
28Box<dyn DatabaseErrorInformation + Send + Sync>,
29 ),
3031/// No rows were returned by a query expected to return at least one row.
32 ///
33 /// This variant is only returned by [`get_result`] and [`first`]. [`load`]
34 /// does not treat 0 rows as an error. If you would like to allow either 0
35 /// or 1 rows, call [`optional`] on the result.
36 ///
37 /// [`get_result`]: crate::query_dsl::RunQueryDsl::get_result()
38 /// [`first`]: crate::query_dsl::RunQueryDsl::first()
39 /// [`load`]: crate::query_dsl::RunQueryDsl::load()
40 /// [`optional`]: OptionalExtension::optional
41NotFound,
4243/// The query could not be constructed
44 ///
45 /// An example of when this error could occur is if you are attempting to
46 /// construct an update statement with no changes (e.g. all fields on the
47 /// struct are `None`).
48QueryBuilderError(Box<dyn StdError + Send + Sync>),
4950/// An error occurred deserializing the data being sent to the database.
51 ///
52 /// Typically this error means that the stated type of the query is
53 /// incorrect. An example of when this error might occur in normal usage is
54 /// attempting to deserialize an infinite date into chrono.
55DeserializationError(Box<dyn StdError + Send + Sync>),
5657/// An error occurred serializing the data being sent to the database.
58 ///
59 /// An example of when this error would be returned is if you attempted to
60 /// serialize a `chrono::NaiveDate` earlier than the earliest date supported
61 /// by PostgreSQL.
62SerializationError(Box<dyn StdError + Send + Sync>),
6364/// An error occurred when attempting rollback of a transaction subsequently to a failed
65 /// commit attempt.
66 ///
67 /// When a commit attempt fails and Diesel believes that it can attempt a rollback to return
68 /// the connection back in a usable state (out of that transaction), it attempts it then
69 /// returns the original error.
70 ///
71 /// If that fails, you get this.
72RollbackErrorOnCommit {
73/// The error that was encountered when attempting the rollback
74rollback_error: Box<Error>,
75/// The error that was encountered during the failed commit attempt
76commit_error: Box<Error>,
77 },
7879/// Roll back the current transaction.
80 ///
81 /// You can return this variant inside of a transaction when you want to
82 /// roll it back, but have no actual error to return. Diesel will never
83 /// return this variant unless you gave it to us, and it can be safely
84 /// ignored in error handling.
85RollbackTransaction,
8687/// Attempted to perform an operation that cannot be done inside a transaction
88 /// when a transaction was already open.
89AlreadyInTransaction,
9091/// Attempted to perform an operation that can only be done inside a transaction
92 /// when no transaction was open
93NotInTransaction,
9495/// Transaction manager broken, likely due to a broken connection. No other operations are possible.
96BrokenTransactionManager,
9798/// Internal integer conversion failed
99IntegerConversion(core::num::TryFromIntError),
100}
101102#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DatabaseErrorKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DatabaseErrorKind::UniqueViolation => "UniqueViolation",
DatabaseErrorKind::ForeignKeyViolation =>
"ForeignKeyViolation",
DatabaseErrorKind::UnableToSendCommand =>
"UnableToSendCommand",
DatabaseErrorKind::SerializationFailure =>
"SerializationFailure",
DatabaseErrorKind::ReadOnlyTransaction =>
"ReadOnlyTransaction",
DatabaseErrorKind::RestrictViolation => "RestrictViolation",
DatabaseErrorKind::NotNullViolation => "NotNullViolation",
DatabaseErrorKind::CheckViolation => "CheckViolation",
DatabaseErrorKind::ExclusionViolation => "ExclusionViolation",
DatabaseErrorKind::ClosedConnection => "ClosedConnection",
DatabaseErrorKind::Unknown => "Unknown",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DatabaseErrorKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DatabaseErrorKind {
#[inline]
fn eq(&self, other: &DatabaseErrorKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DatabaseErrorKind { }
#[automatically_derived]
impl ::core::clone::Clone for DatabaseErrorKind {
#[inline]
fn clone(&self) -> DatabaseErrorKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DatabaseErrorKind { }Copy)]
103/// The kind of database error that occurred.
104///
105/// This is not meant to exhaustively cover all possible errors, but is used to
106/// identify errors which are commonly recovered from programmatically. This enum
107/// is not intended to be exhaustively matched, and new variants may be added in
108/// the future without a major version bump.
109#[non_exhaustive]
110pub enum DatabaseErrorKind {
111/// A unique constraint was violated.
112UniqueViolation = 0,
113114/// A foreign key constraint was violated.
115ForeignKeyViolation = 1,
116117/// The query could not be sent to the database due to a protocol violation.
118 ///
119 /// An example of a case where this would occur is if you attempted to send
120 /// a query with more than 65000 bind parameters using PostgreSQL.
121UnableToSendCommand = 2,
122123/// A serializable transaction failed to commit due to a read/write
124 /// dependency on a concurrent transaction.
125 ///
126 /// Corresponds to SQLSTATE code 40001
127 ///
128 /// This error is only detected for PostgreSQL, as we do not yet support
129 /// transaction isolation levels for other backends.
130SerializationFailure = 3,
131132/// The command could not be completed because the transaction was read
133 /// only.
134 ///
135 /// This error will also be returned for `SELECT` statements which attempted
136 /// to lock the rows.
137ReadOnlyTransaction = 4,
138139/// A restrict constraint was violated.
140RestrictViolation = 9,
141142/// A not null constraint was violated.
143NotNullViolation = 5,
144145/// A check constraint was violated.
146CheckViolation = 6,
147148/// An exclusion constraint was violated.
149ExclusionViolation = 10,
150151/// The connection to the server was unexpectedly closed.
152 ///
153 /// This error is only detected for PostgreSQL and is emitted on a best-effort basis
154 /// and may be missed.
155ClosedConnection = 7,
156157#[doc(hidden)]
158Unknown = 8, // Match against _ instead, more variants may be added in the future
159}
160161/// Information about an error that was returned by the database.
162pub trait DatabaseErrorInformation {
163/// The primary human-readable error message. Typically one line.
164fn message(&self) -> &str;
165166/// An optional secondary error message providing more details about the
167 /// problem, if it was provided by the database. Might span multiple lines.
168fn details(&self) -> Option<&str>;
169170/// An optional suggestion of what to do about the problem, if one was
171 /// provided by the database.
172fn hint(&self) -> Option<&str>;
173174/// The name of the table the error was associated with, if the error was
175 /// associated with a specific table and the backend supports retrieving
176 /// that information.
177 ///
178 /// Currently this method will return `None` for all backends other than
179 /// PostgreSQL.
180fn table_name(&self) -> Option<&str>;
181182/// The name of the column the error was associated with, if the error was
183 /// associated with a specific column and the backend supports retrieving
184 /// that information.
185 ///
186 /// Currently this method will return `None` for all backends other than
187 /// PostgreSQL.
188fn column_name(&self) -> Option<&str>;
189190/// The constraint that was violated if this error is a constraint violation
191 /// and the backend supports retrieving that information.
192 ///
193 /// Currently this method will return `None` for all backends other than
194 /// PostgreSQL.
195fn constraint_name(&self) -> Option<&str>;
196197/// An optional integer indicating an error cursor position as an index into
198 /// the original statement string.
199fn statement_position(&self) -> Option<i32>;
200}
201202impl fmt::Debugfor dyn DatabaseErrorInformation + Send + Sync {
203fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
204 fmt::Debug::fmt(&self.message(), f)
205 }
206}
207208impl DatabaseErrorInformationfor String {
209fn message(&self) -> &str {
210self211 }
212fn details(&self) -> Option<&str> {
213None214 }
215fn hint(&self) -> Option<&str> {
216None217 }
218fn table_name(&self) -> Option<&str> {
219None220 }
221fn column_name(&self) -> Option<&str> {
222None223 }
224fn constraint_name(&self) -> Option<&str> {
225None226 }
227fn statement_position(&self) -> Option<i32> {
228None229 }
230}
231232/// Errors which can occur during [`Connection::establish`]
233///
234/// [`Connection::establish`]: crate::connection::Connection::establish
235#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ConnectionError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ConnectionError::InvalidCString(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InvalidCString", &__self_0),
ConnectionError::BadConnection(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"BadConnection", &__self_0),
ConnectionError::InvalidConnectionUrl(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InvalidConnectionUrl", &__self_0),
ConnectionError::CouldntSetupConfiguration(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CouldntSetupConfiguration", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ConnectionError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ConnectionError {
#[inline]
fn eq(&self, other: &ConnectionError) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(ConnectionError::InvalidCString(__self_0),
ConnectionError::InvalidCString(__arg1_0)) =>
__self_0 == __arg1_0,
(ConnectionError::BadConnection(__self_0),
ConnectionError::BadConnection(__arg1_0)) =>
__self_0 == __arg1_0,
(ConnectionError::InvalidConnectionUrl(__self_0),
ConnectionError::InvalidConnectionUrl(__arg1_0)) =>
__self_0 == __arg1_0,
(ConnectionError::CouldntSetupConfiguration(__self_0),
ConnectionError::CouldntSetupConfiguration(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq)]
236#[non_exhaustive]
237pub enum ConnectionError {
238/// The connection URL contained a `NUL` byte.
239InvalidCString(NulError),
240/// The database returned an error.
241BadConnection(String),
242/// The connection URL could not be parsed.
243InvalidConnectionUrl(String),
244/// Diesel could not configure the database connection.
245 ///
246 /// Diesel may try to automatically set session specific configuration
247 /// values, such as UTF8 encoding, or enabling the `||` operator on MySQL.
248 /// This variant is returned if an error occurred executing the query to set
249 /// those options. Diesel will never affect global configuration.
250CouldntSetupConfiguration(Error),
251}
252253/// A specialized result type for queries.
254///
255/// This type is exported by `diesel::prelude`, and is generally used by any
256/// code which is interacting with Diesel. This type exists to avoid writing out
257/// `diesel::result::Error`, and is otherwise a direct mapping to `Result`.
258pub type QueryResult<T> = Result<T, Error>;
259260/// A specialized result type for establishing connections.
261///
262/// This type exists to avoid writing out `diesel::result::ConnectionError`, and
263/// is otherwise a direct mapping to `Result`.
264pub type ConnectionResult<T> = Result<T, ConnectionError>;
265266/// See the [method documentation](OptionalExtension::optional).
267pub trait OptionalExtension<T> {
268/// Converts a `QueryResult<T>` into a `QueryResult<Option<T>>`.
269 ///
270 /// By default, Diesel treats 0 rows being returned from a query that is expected to return 1
271 /// row as an error (e.g. the return value of [`get_result`] or [`first`]). This method will
272 /// handle that error, and give you back an `Option<T>` instead.
273 ///
274 /// [`get_result`]: crate::query_dsl::RunQueryDsl::get_result()
275 /// [`first`]: crate::query_dsl::RunQueryDsl::first()
276 ///
277 /// # Example
278 ///
279 /// ```rust
280 /// use diesel::{NotFound, OptionalExtension, QueryResult};
281 ///
282 /// let result: QueryResult<i32> = Ok(1);
283 /// assert_eq!(Ok(Some(1)), result.optional());
284 ///
285 /// let result: QueryResult<i32> = Err(NotFound);
286 /// assert_eq!(Ok(None), result.optional());
287 /// ```
288fn optional(self) -> Result<Option<T>, Error>;
289}
290291impl<T> OptionalExtension<T> for QueryResult<T> {
292fn optional(self) -> Result<Option<T>, Error> {
293match self {
294Ok(value) => Ok(Some(value)),
295Err(Error::NotFound) => Ok(None),
296Err(e) => Err(e),
297 }
298 }
299}
300301/// See the [method documentation](OptionalEmptyChangesetExtension::optional_empty_changeset).
302pub trait OptionalEmptyChangesetExtension<T> {
303/// By default, Diesel treats an empty update as a `QueryBuilderError`. This method will
304 /// convert that error into `None`.
305 ///
306 /// # Example
307 ///
308 /// ```rust
309 /// use diesel::{
310 /// result::EmptyChangeset, result::Error::QueryBuilderError, OptionalEmptyChangesetExtension,
311 /// QueryResult,
312 /// };
313 /// let result: QueryResult<i32> = Err(QueryBuilderError(Box::new(EmptyChangeset)));
314 /// assert_eq!(Ok(None), result.optional_empty_changeset());
315 /// ```
316fn optional_empty_changeset(self) -> Result<Option<T>, Error>;
317}
318319impl<T> OptionalEmptyChangesetExtension<T> for QueryResult<T> {
320fn optional_empty_changeset(self) -> Result<Option<T>, Error> {
321match self {
322Ok(value) => Ok(Some(value)),
323Err(Error::QueryBuilderError(e)) if e.is::<EmptyChangeset>() => Ok(None),
324Err(e) => Err(e),
325 }
326 }
327}
328329impl From<NulError> for ConnectionError {
330fn from(e: NulError) -> Self {
331 ConnectionError::InvalidCString(e)
332 }
333}
334335impl From<NulError> for Error {
336fn from(e: NulError) -> Self {
337 Error::InvalidCString(e)
338 }
339}
340341impl Displayfor Error {
342fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
343match *self {
344 Error::InvalidCString(ref nul_err) => f.write_fmt(format_args!("{0}", nul_err))write!(f, "{nul_err}"),
345 Error::DatabaseError(_, ref e) => f.write_fmt(format_args!("{0}", e.message()))write!(f, "{}", e.message()),
346 Error::NotFound => f.write_str("Record not found"),
347 Error::QueryBuilderError(ref e) => e.fmt(f),
348 Error::DeserializationError(ref e) => e.fmt(f),
349 Error::SerializationError(ref e) => e.fmt(f),
350 Error::RollbackErrorOnCommit {
351ref rollback_error,
352ref commit_error,
353 } => {
354f.write_fmt(format_args!("Transaction rollback failed: {0} (rollback attempted because of failure to commit: {1})",
rollback_error, commit_error))write!(
355 f,
356"Transaction rollback failed: {rollback_error} \
357 (rollback attempted because of failure to commit: {commit_error})",
358 )?;
359Ok(())
360 }
361 Error::RollbackTransaction => {
362f.write_fmt(format_args!("You have asked diesel to rollback the transaction"))write!(f, "You have asked diesel to rollback the transaction")363 }
364 Error::BrokenTransactionManager => f.write_fmt(format_args!("The transaction manager is broken"))write!(f, "The transaction manager is broken"),
365 Error::AlreadyInTransaction => f.write_fmt(format_args!("Cannot perform this operation while a transaction is open"))write!(
366f,
367"Cannot perform this operation while a transaction is open",
368 ),
369 Error::NotInTransaction => {
370f.write_fmt(format_args!("Cannot perform this operation outside of a transaction"))write!(f, "Cannot perform this operation outside of a transaction",)371 }
372 Error::IntegerConversion(ref e) => {
373f.write_fmt(format_args!("Internal integer conversion error: {0}", e))write!(f, "Internal integer conversion error: {e}")374 }
375 }
376 }
377}
378379impl StdErrorfor Error {
380fn cause(&self) -> Option<&dyn StdError> {
381match *self {
382 Error::InvalidCString(ref e) => Some(e),
383 Error::QueryBuilderError(ref e) => Some(&**e),
384 Error::DeserializationError(ref e) => Some(&**e),
385 Error::SerializationError(ref e) => Some(&**e),
386 Error::IntegerConversion(ref e) => Some(e),
387_ => None,
388 }
389 }
390}
391392impl Displayfor ConnectionError {
393fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
394match *self {
395 ConnectionError::InvalidCString(ref nul_err) => nul_err.fmt(f),
396 ConnectionError::BadConnection(ref s) => f.write_fmt(format_args!("{0}", s))write!(f, "{s}"),
397 ConnectionError::InvalidConnectionUrl(ref s) => f.write_fmt(format_args!("{0}", s))write!(f, "{s}"),
398 ConnectionError::CouldntSetupConfiguration(ref e) => e.fmt(f),
399 }
400 }
401}
402403impl StdErrorfor ConnectionError {
404fn cause(&self) -> Option<&dyn StdError> {
405match *self {
406 ConnectionError::InvalidCString(ref e) => Some(e),
407 ConnectionError::CouldntSetupConfiguration(ref e) => Some(e),
408_ => None,
409 }
410 }
411}
412413impl PartialEqfor Error {
414fn eq(&self, other: &Error) -> bool {
415match (self, other) {
416 (Error::InvalidCString(a), Error::InvalidCString(b)) => a == b,
417 (Error::DatabaseError(_, a), Error::DatabaseError(_, b)) => a.message() == b.message(),
418 (&Error::NotFound, &Error::NotFound) => true,
419 (&Error::RollbackTransaction, &Error::RollbackTransaction) => true,
420 (&Error::AlreadyInTransaction, &Error::AlreadyInTransaction) => true,
421_ => false,
422 }
423 }
424}
425426#[cfg(test)]
427#[allow(warnings)]
428fn error_impls_send() {
429let err: Error = unimplemented!();
430let x: &dyn Send = &err;
431}
432433/// An unexpected `NULL` was encountered during deserialization
434#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnexpectedNullError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "UnexpectedNullError")
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnexpectedNullError { }
#[automatically_derived]
impl ::core::clone::Clone for UnexpectedNullError {
#[inline]
fn clone(&self) -> UnexpectedNullError { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnexpectedNullError { }Copy)]
435pub struct UnexpectedNullError;
436437impl fmt::Displayfor UnexpectedNullError {
438fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
439f.write_fmt(format_args!("Unexpected null for non-null column"))write!(f, "Unexpected null for non-null column")440 }
441}
442443impl StdErrorfor UnexpectedNullError {}
444445/// Expected more fields then present in the current row while deserializing results
446#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnexpectedEndOfRow {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "UnexpectedEndOfRow")
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnexpectedEndOfRow { }
#[automatically_derived]
impl ::core::clone::Clone for UnexpectedEndOfRow {
#[inline]
fn clone(&self) -> UnexpectedEndOfRow { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnexpectedEndOfRow { }Copy)]
447pub struct UnexpectedEndOfRow;
448449impl fmt::Displayfor UnexpectedEndOfRow {
450fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
451f.write_fmt(format_args!("Unexpected end of row"))write!(f, "Unexpected end of row")452 }
453}
454455impl StdErrorfor UnexpectedEndOfRow {}
456457/// Expected when an update has no changes to save.
458///
459/// When using `optional_empty_changeset`, this error is turned into `None`.
460#[derive(#[automatically_derived]
impl ::core::fmt::Debug for EmptyChangeset {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "EmptyChangeset")
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EmptyChangeset { }
#[automatically_derived]
impl ::core::clone::Clone for EmptyChangeset {
#[inline]
fn clone(&self) -> EmptyChangeset { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for EmptyChangeset { }Copy)]
461pub struct EmptyChangeset;
462463impl fmt::Displayfor EmptyChangeset {
464fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
465f.write_fmt(format_args!("There are no changes to save. This query cannot be built"))write!(
466f,
467"There are no changes to save. This query cannot be built"
468)469 }
470}
471472impl StdErrorfor EmptyChangeset {}
473474/// Expected when you try to execute an empty query
475#[derive(#[automatically_derived]
impl ::core::fmt::Debug for EmptyQuery {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "EmptyQuery")
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EmptyQuery { }
#[automatically_derived]
impl ::core::clone::Clone for EmptyQuery {
#[inline]
fn clone(&self) -> EmptyQuery { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for EmptyQuery { }Copy)]
476pub struct EmptyQuery;
477478impl fmt::Displayfor EmptyQuery {
479fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
480f.write_fmt(format_args!("Detected an empty query. These are not supported by your database system"))write!(
481f,
482"Detected an empty query. These are not supported by your database system"
483)484 }
485}
486487impl StdErrorfor EmptyQuery {}
488489/// An error occurred while deserializing a field
490#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DeserializeFieldError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DeserializeFieldError", "field_name", &self.field_name, "error",
&&self.error)
}
}Debug)]
491#[non_exhaustive]
492pub struct DeserializeFieldError {
493/// The name of the field that failed to deserialize
494pub field_name: Option<String>,
495/// The error that occurred while deserializing the field
496pub error: Box<dyn StdError + Send + Sync>,
497}
498499impl DeserializeFieldError {
500#[cold]
501pub(crate) fn new<'a, F, DB>(field: F, error: Box<dyn std::error::Error + Send + Sync>) -> Self
502where
503DB: crate::backend::Backend,
504 F: crate::row::Field<'a, DB>,
505 {
506DeserializeFieldError {
507 field_name: field.field_name().map(|s| s.to_string()),
508error,
509 }
510 }
511}
512513impl StdErrorfor DeserializeFieldError {
514fn source(&self) -> Option<&(dyn StdError + 'static)> {
515Some(&*self.error)
516 }
517}
518519impl fmt::Displayfor DeserializeFieldError {
520fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
521if let Some(ref field_name) = self.field_name {
522f.write_fmt(format_args!("Error deserializing field \'{0}\': {1}", field_name,
self.error))write!(
523f,
524"Error deserializing field '{}': {}",
525 field_name, self.error
526 )527 } else {
528f.write_fmt(format_args!("Error deserializing field: {0}", self.error))write!(f, "Error deserializing field: {}", self.error)529 }
530 }
531}