#![cfg_attr(feature = "lang-rustc-scalar-valid-range", allow(internal_features))]
use core::{
ffi::{CStr, c_int},
fmt,
num::NonZero,
};
use std::borrow::Cow;
use sqlite::{
SQLITE_ABORT, SQLITE_ABORT_ROLLBACK, SQLITE_AUTH, SQLITE_AUTH_USER, SQLITE_BUSY,
SQLITE_BUSY_RECOVERY, SQLITE_BUSY_SNAPSHOT, SQLITE_BUSY_TIMEOUT, SQLITE_CANTOPEN,
SQLITE_CANTOPEN_CONVPATH, SQLITE_CANTOPEN_DIRTYWAL, SQLITE_CANTOPEN_FULLPATH,
SQLITE_CANTOPEN_ISDIR, SQLITE_CANTOPEN_NOTEMPDIR, SQLITE_CANTOPEN_SYMLINK, SQLITE_CONSTRAINT,
SQLITE_CONSTRAINT_CHECK, SQLITE_CONSTRAINT_COMMITHOOK, SQLITE_CONSTRAINT_DATATYPE,
SQLITE_CONSTRAINT_FOREIGNKEY, SQLITE_CONSTRAINT_FUNCTION, SQLITE_CONSTRAINT_NOTNULL,
SQLITE_CONSTRAINT_PINNED, SQLITE_CONSTRAINT_PRIMARYKEY, SQLITE_CONSTRAINT_ROWID,
SQLITE_CONSTRAINT_TRIGGER, SQLITE_CONSTRAINT_UNIQUE, SQLITE_CONSTRAINT_VTAB, SQLITE_CORRUPT,
SQLITE_CORRUPT_INDEX, SQLITE_CORRUPT_SEQUENCE, SQLITE_CORRUPT_VTAB, SQLITE_EMPTY, SQLITE_ERROR,
SQLITE_ERROR_MISSING_COLLSEQ, SQLITE_ERROR_RETRY, SQLITE_ERROR_SNAPSHOT, SQLITE_FORMAT,
SQLITE_FULL, SQLITE_INTERNAL, SQLITE_INTERRUPT, SQLITE_IOERR, SQLITE_IOERR_ACCESS,
SQLITE_IOERR_AUTH, SQLITE_IOERR_BEGIN_ATOMIC, SQLITE_IOERR_BLOCKED,
SQLITE_IOERR_CHECKRESERVEDLOCK, SQLITE_IOERR_CLOSE, SQLITE_IOERR_COMMIT_ATOMIC,
SQLITE_IOERR_CONVPATH, SQLITE_IOERR_CORRUPTFS, SQLITE_IOERR_DATA, SQLITE_IOERR_DELETE,
SQLITE_IOERR_DELETE_NOENT, SQLITE_IOERR_DIR_CLOSE, SQLITE_IOERR_DIR_FSYNC, SQLITE_IOERR_FSTAT,
SQLITE_IOERR_FSYNC, SQLITE_IOERR_GETTEMPPATH, SQLITE_IOERR_LOCK, SQLITE_IOERR_MMAP,
SQLITE_IOERR_NOMEM, SQLITE_IOERR_RDLOCK, SQLITE_IOERR_READ, SQLITE_IOERR_ROLLBACK_ATOMIC,
SQLITE_IOERR_SEEK, SQLITE_IOERR_SHMLOCK, SQLITE_IOERR_SHMMAP, SQLITE_IOERR_SHMOPEN,
SQLITE_IOERR_SHMSIZE, SQLITE_IOERR_SHORT_READ, SQLITE_IOERR_TRUNCATE, SQLITE_IOERR_UNLOCK,
SQLITE_IOERR_VNODE, SQLITE_IOERR_WRITE, SQLITE_LOCKED, SQLITE_LOCKED_SHAREDCACHE,
SQLITE_LOCKED_VTAB, SQLITE_MISMATCH, SQLITE_MISUSE, SQLITE_NOLFS, SQLITE_NOMEM, SQLITE_NOTADB,
SQLITE_NOTFOUND, SQLITE_PERM, SQLITE_PROTOCOL, SQLITE_RANGE, SQLITE_READONLY,
SQLITE_READONLY_CANTINIT, SQLITE_READONLY_CANTLOCK, SQLITE_READONLY_DBMOVED,
SQLITE_READONLY_DIRECTORY, SQLITE_READONLY_RECOVERY, SQLITE_READONLY_ROLLBACK, SQLITE_SCHEMA,
SQLITE_TOOBIG, sqlite3, sqlite3_errcode, sqlite3_errmsg, sqlite3_error_offset, sqlite3_errstr,
};
use crate::ffi;
pub type Result<T, C = ErrorMessage> = core::result::Result<T, Error<C>>;
const SQUIRE_ERROR: i32 = 0x00c0;
const SQUIRE_ERROR_FETCH: i32 = 0x00c1;
const SQUIRE_ERROR_FETCH_RANGE: i32 = 0x01c1;
const SQUIRE_ERROR_PARAMETER: i32 = 0x00c2;
const SQUIRE_ERROR_PARAMETER_BIND: i32 = 0x01c2;
const SQUIRE_ERROR_PARAMETER_RESOLVE: i32 = 0x02c2;
#[derive(PartialEq, Eq, Copy, Clone)]
pub struct Error<Context: ErrorContext = ErrorMessage> {
code: NonZero<i32>,
context: Context,
}
impl Error<()> {
pub const fn new(code: i32) -> Option<Self> {
match NonZero::new(code) {
Some(code) => Some(Self { code, context: () }),
None => None,
}
}
pub(crate) const unsafe fn new_unchecked(code: i32) -> Self {
Self {
code: unsafe { NonZero::new_unchecked(code) },
context: (),
}
}
pub(crate) const fn unknown() -> Self {
unsafe { Self::new_unchecked(SQLITE_ERROR) }
}
pub(crate) const fn misuse() -> Self {
unsafe { Self::new_unchecked(SQLITE_MISUSE) }
}
pub(crate) const fn range() -> Self {
unsafe { Self::new_unchecked(SQLITE_RANGE) }
}
pub(crate) const fn too_big() -> Self {
unsafe { Self::new_unchecked(SQLITE_TOOBIG) }
}
pub(crate) const fn attach<C: ErrorContext>(self, context: C) -> Error<C> {
Error {
code: self.code,
context,
}
}
pub(crate) fn attach_static(self) -> Error {
self.attach(ErrorMessage::for_code(self.raw()))
}
}
impl Error {
pub fn bind(message: impl Into<ErrorMessage>) -> Self {
unsafe { Error::new_unchecked(SQUIRE_ERROR_PARAMETER_BIND) }.attach(message.into())
}
pub fn resolve(message: impl Into<ErrorMessage>) -> Self {
unsafe { Error::new_unchecked(SQUIRE_ERROR_PARAMETER_RESOLVE) }.attach(message.into())
}
pub fn fetch(code: FetchError, message: impl Into<ErrorMessage>) -> Self {
unsafe { Error::new_unchecked(code as i32) }.attach(message.into())
}
}
impl<Context: ErrorContext> Error<Context> {
pub(crate) fn from_connection(connection: impl ffi::Connected, code: i32) -> Option<Self>
where
Context: ConnectedErrorContext,
{
match NonZero::new(code) {
Some(code) => {
let ptr = connection.as_connection_ptr();
let context = unsafe { Context::capture(ptr, code.get()) };
Some(Self { code, context })
}
None => None,
}
}
pub const fn name(&self) -> Option<&'static str> {
Self::name_for_code(self.raw())
}
pub fn message(&self) -> &str {
self.context.message(self.raw())
}
pub const fn category(&self) -> ErrorCategory {
let primary_code = self.raw() & 0xFF;
#[allow(deprecated)]
match primary_code {
SQLITE_ABORT => ErrorCategory::Aborted,
SQLITE_AUTH => ErrorCategory::Authorization,
SQLITE_BUSY => ErrorCategory::Busy,
SQLITE_CANTOPEN => ErrorCategory::CantOpen,
SQLITE_CONSTRAINT => ErrorCategory::Constraint,
SQLITE_CORRUPT => ErrorCategory::Corrupt,
SQLITE_EMPTY => ErrorCategory::Empty,
SQLITE_ERROR => ErrorCategory::Unknown,
SQLITE_FORMAT => ErrorCategory::Format,
SQLITE_FULL => ErrorCategory::Full,
SQLITE_INTERNAL => ErrorCategory::Internal,
SQLITE_INTERRUPT => ErrorCategory::Interrupt,
SQLITE_IOERR => ErrorCategory::Io,
SQLITE_LOCKED => ErrorCategory::Locked,
SQLITE_MISMATCH => ErrorCategory::Mismatch,
SQLITE_MISUSE => ErrorCategory::Misuse,
SQLITE_NOLFS => ErrorCategory::LargeFile,
SQLITE_NOMEM => ErrorCategory::OutOfMemory,
SQLITE_NOTADB => ErrorCategory::InvalidDatabase,
SQLITE_NOTFOUND => ErrorCategory::NotFound,
SQLITE_PERM => ErrorCategory::Permission,
SQLITE_PROTOCOL => ErrorCategory::Protocol,
SQLITE_RANGE => ErrorCategory::Range,
SQLITE_READONLY => ErrorCategory::ReadOnly,
SQLITE_SCHEMA => ErrorCategory::Schema,
SQLITE_TOOBIG => ErrorCategory::TooBig,
SQUIRE_ERROR_FETCH => ErrorCategory::Fetch,
SQUIRE_ERROR_PARAMETER => ErrorCategory::Parameter,
_ => ErrorCategory::Unknown,
}
}
pub const fn code(&self) -> Option<ErrorCode> {
#[allow(deprecated)]
match self.raw() {
SQLITE_ABORT_ROLLBACK => Some(ErrorCode::Aborted(AbortError::Rollback)),
SQLITE_AUTH_USER => Some(ErrorCode::Authorization(AuthorizationError::User)),
SQLITE_BUSY_RECOVERY => Some(ErrorCode::Busy(BusyError::Recovery)),
SQLITE_BUSY_SNAPSHOT => Some(ErrorCode::Busy(BusyError::Snapshot)),
SQLITE_BUSY_TIMEOUT => Some(ErrorCode::Busy(BusyError::Timeout)),
SQLITE_CANTOPEN_FULLPATH => Some(ErrorCode::CantOpen(CantOpenError::FullPath)),
SQLITE_CANTOPEN_ISDIR => Some(ErrorCode::CantOpen(CantOpenError::IsDir)),
SQLITE_CANTOPEN_NOTEMPDIR => Some(ErrorCode::CantOpen(CantOpenError::NoTempDir)),
SQLITE_CANTOPEN_CONVPATH => Some(ErrorCode::CantOpen(CantOpenError::ConvPath)),
SQLITE_CANTOPEN_DIRTYWAL => Some(ErrorCode::CantOpen(CantOpenError::DirtyWal)),
SQLITE_CANTOPEN_SYMLINK => Some(ErrorCode::CantOpen(CantOpenError::Symlink)),
SQLITE_CONSTRAINT_CHECK => Some(ErrorCode::Constraint(ConstraintError::Check)),
SQLITE_CONSTRAINT_COMMITHOOK => {
Some(ErrorCode::Constraint(ConstraintError::CommitHook))
}
SQLITE_CONSTRAINT_DATATYPE => Some(ErrorCode::Constraint(ConstraintError::DataType)),
SQLITE_CONSTRAINT_FOREIGNKEY => {
Some(ErrorCode::Constraint(ConstraintError::ForeignKey))
}
SQLITE_CONSTRAINT_FUNCTION => Some(ErrorCode::Constraint(ConstraintError::Function)),
SQLITE_CONSTRAINT_NOTNULL => Some(ErrorCode::Constraint(ConstraintError::NotNull)),
SQLITE_CONSTRAINT_PINNED => Some(ErrorCode::Constraint(ConstraintError::Pinned)),
SQLITE_CONSTRAINT_PRIMARYKEY => {
Some(ErrorCode::Constraint(ConstraintError::PrimaryKey))
}
SQLITE_CONSTRAINT_ROWID => Some(ErrorCode::Constraint(ConstraintError::RowId)),
SQLITE_CONSTRAINT_TRIGGER => Some(ErrorCode::Constraint(ConstraintError::Trigger)),
SQLITE_CONSTRAINT_UNIQUE => Some(ErrorCode::Constraint(ConstraintError::Unique)),
SQLITE_CONSTRAINT_VTAB => Some(ErrorCode::Constraint(ConstraintError::VTab)),
SQLITE_CORRUPT_INDEX => Some(ErrorCode::Corrupt(CorruptError::Index)),
SQLITE_CORRUPT_SEQUENCE => Some(ErrorCode::Corrupt(CorruptError::Sequence)),
SQLITE_CORRUPT_VTAB => Some(ErrorCode::Corrupt(CorruptError::VTab)),
SQLITE_ERROR_MISSING_COLLSEQ => Some(ErrorCode::Error(GeneralError::MissingCollSeq)),
SQLITE_ERROR_RETRY => Some(ErrorCode::Error(GeneralError::Retry)),
SQLITE_ERROR_SNAPSHOT => Some(ErrorCode::Error(GeneralError::Snapshot)),
SQLITE_IOERR_READ => Some(ErrorCode::Io(IoError::Read)),
SQLITE_IOERR_WRITE => Some(ErrorCode::Io(IoError::Write)),
SQLITE_IOERR_FSYNC => Some(ErrorCode::Io(IoError::FSync)),
SQLITE_IOERR_FSTAT => Some(ErrorCode::Io(IoError::FStat)),
SQLITE_IOERR_TRUNCATE => Some(ErrorCode::Io(IoError::Truncate)),
SQLITE_IOERR_UNLOCK => Some(ErrorCode::Io(IoError::Unlock)),
SQLITE_IOERR_RDLOCK => Some(ErrorCode::Io(IoError::ReadLock)),
SQLITE_IOERR_DELETE => Some(ErrorCode::Io(IoError::Delete)),
SQLITE_IOERR_BLOCKED => Some(ErrorCode::Io(IoError::Blocked)),
SQLITE_IOERR_NOMEM => Some(ErrorCode::Io(IoError::NoMem)),
SQLITE_IOERR_ACCESS => Some(ErrorCode::Io(IoError::Access)),
SQLITE_IOERR_CHECKRESERVEDLOCK => Some(ErrorCode::Io(IoError::CheckReservedLock)),
SQLITE_IOERR_LOCK => Some(ErrorCode::Io(IoError::Lock)),
SQLITE_IOERR_CLOSE => Some(ErrorCode::Io(IoError::Close)),
SQLITE_IOERR_DIR_CLOSE => Some(ErrorCode::Io(IoError::DirClose)),
SQLITE_IOERR_SHMOPEN => Some(ErrorCode::Io(IoError::ShmOpen)),
SQLITE_IOERR_SHMSIZE => Some(ErrorCode::Io(IoError::ShmSize)),
SQLITE_IOERR_SHMLOCK => Some(ErrorCode::Io(IoError::ShmLock)),
SQLITE_IOERR_SHMMAP => Some(ErrorCode::Io(IoError::ShmMap)),
SQLITE_IOERR_SEEK => Some(ErrorCode::Io(IoError::Seek)),
SQLITE_IOERR_DELETE_NOENT => Some(ErrorCode::Io(IoError::DeleteNoEnt)),
SQLITE_IOERR_MMAP => Some(ErrorCode::Io(IoError::MMap)),
SQLITE_IOERR_GETTEMPPATH => Some(ErrorCode::Io(IoError::GetTempPath)),
SQLITE_IOERR_CONVPATH => Some(ErrorCode::Io(IoError::ConvPath)),
SQLITE_IOERR_VNODE => Some(ErrorCode::Io(IoError::VNode)),
SQLITE_IOERR_AUTH => Some(ErrorCode::Io(IoError::Auth)),
SQLITE_IOERR_BEGIN_ATOMIC => Some(ErrorCode::Io(IoError::BeginAtomic)),
SQLITE_IOERR_COMMIT_ATOMIC => Some(ErrorCode::Io(IoError::CommitAtomic)),
SQLITE_IOERR_ROLLBACK_ATOMIC => Some(ErrorCode::Io(IoError::RollbackAtomic)),
SQLITE_IOERR_DATA => Some(ErrorCode::Io(IoError::Data)),
SQLITE_IOERR_CORRUPTFS => Some(ErrorCode::Io(IoError::CorruptFS)),
SQLITE_IOERR_SHORT_READ => Some(ErrorCode::Io(IoError::ShortRead)),
SQLITE_IOERR_DIR_FSYNC => Some(ErrorCode::Io(IoError::DirFSync)),
SQLITE_LOCKED_SHAREDCACHE => Some(ErrorCode::Locked(LockedError::SharedCache)),
SQLITE_LOCKED_VTAB => Some(ErrorCode::Locked(LockedError::VTab)),
SQLITE_READONLY_RECOVERY => Some(ErrorCode::ReadOnly(ReadOnlyError::Recovery)),
SQLITE_READONLY_CANTLOCK => Some(ErrorCode::ReadOnly(ReadOnlyError::CantLock)),
SQLITE_READONLY_ROLLBACK => Some(ErrorCode::ReadOnly(ReadOnlyError::Rollback)),
SQLITE_READONLY_DBMOVED => Some(ErrorCode::ReadOnly(ReadOnlyError::DbMoved)),
SQLITE_READONLY_CANTINIT => Some(ErrorCode::ReadOnly(ReadOnlyError::CantInit)),
SQLITE_READONLY_DIRECTORY => Some(ErrorCode::ReadOnly(ReadOnlyError::Directory)),
SQUIRE_ERROR_FETCH_RANGE => Some(ErrorCode::Fetch(FetchError::Range)),
SQUIRE_ERROR_PARAMETER_BIND => Some(ErrorCode::Parameter(ParameterError::Bind)),
SQUIRE_ERROR_PARAMETER_RESOLVE => Some(ErrorCode::Parameter(ParameterError::Resolve)),
_ => None,
}
}
pub const fn raw(&self) -> i32 {
self.code.get()
}
pub fn into_raw(self) -> i32 {
self.code.get()
}
pub(crate) const fn name_for_code(code: i32) -> Option<&'static str> {
#[allow(deprecated)]
match code {
SQLITE_ABORT => Some("SQLITE_ABORT"),
SQLITE_AUTH => Some("SQLITE_AUTH"),
SQLITE_BUSY => Some("SQLITE_BUSY"),
SQLITE_CANTOPEN => Some("SQLITE_CANTOPEN"),
SQLITE_CONSTRAINT => Some("SQLITE_CONSTRAINT"),
SQLITE_CORRUPT => Some("SQLITE_CORRUPT"),
SQLITE_EMPTY => Some("SQLITE_EMPTY"),
SQLITE_ERROR => Some("SQLITE_ERROR"),
SQLITE_FORMAT => Some("SQLITE_FORMAT"),
SQLITE_FULL => Some("SQLITE_FULL"),
SQLITE_INTERNAL => Some("SQLITE_INTERNAL"),
SQLITE_INTERRUPT => Some("SQLITE_INTERRUPT"),
SQLITE_IOERR => Some("SQLITE_IOERR"),
SQLITE_LOCKED => Some("SQLITE_LOCKED"),
SQLITE_MISMATCH => Some("SQLITE_MISMATCH"),
SQLITE_MISUSE => Some("SQLITE_MISUSE"),
SQLITE_NOLFS => Some("SQLITE_NOLFS"),
SQLITE_NOMEM => Some("SQLITE_NOMEM"),
SQLITE_NOTADB => Some("SQLITE_NOTADB"),
SQLITE_NOTFOUND => Some("SQLITE_NOTFOUND"),
SQLITE_PERM => Some("SQLITE_PERM"),
SQLITE_PROTOCOL => Some("SQLITE_PROTOCOL"),
SQLITE_RANGE => Some("SQLITE_RANGE"),
SQLITE_READONLY => Some("SQLITE_READONLY"),
SQLITE_SCHEMA => Some("SQLITE_SCHEMA"),
SQLITE_TOOBIG => Some("SQLITE_TOOBIG"),
SQLITE_ABORT_ROLLBACK => Some("SQLITE_ABORT_ROLLBACK"),
SQLITE_AUTH_USER => Some("SQLITE_AUTH_USER"),
SQLITE_BUSY_RECOVERY => Some("SQLITE_BUSY_RECOVERY"),
SQLITE_BUSY_SNAPSHOT => Some("SQLITE_BUSY_SNAPSHOT"),
SQLITE_BUSY_TIMEOUT => Some("SQLITE_BUSY_TIMEOUT"),
SQLITE_CANTOPEN_CONVPATH => Some("SQLITE_CANTOPEN_CONVPATH"),
SQLITE_CANTOPEN_DIRTYWAL => Some("SQLITE_CANTOPEN_DIRTYWAL"),
SQLITE_CANTOPEN_FULLPATH => Some("SQLITE_CANTOPEN_FULLPATH"),
SQLITE_CANTOPEN_ISDIR => Some("SQLITE_CANTOPEN_ISDIR"),
SQLITE_CANTOPEN_NOTEMPDIR => Some("SQLITE_CANTOPEN_NOTEMPDIR"),
SQLITE_CANTOPEN_SYMLINK => Some("SQLITE_CANTOPEN_SYMLINK"),
SQLITE_CONSTRAINT_CHECK => Some("SQLITE_CONSTRAINT_CHECK"),
SQLITE_CONSTRAINT_COMMITHOOK => Some("SQLITE_CONSTRAINT_COMMITHOOK"),
SQLITE_CONSTRAINT_DATATYPE => Some("SQLITE_CONSTRAINT_DATATYPE"),
SQLITE_CONSTRAINT_FOREIGNKEY => Some("SQLITE_CONSTRAINT_FOREIGNKEY"),
SQLITE_CONSTRAINT_FUNCTION => Some("SQLITE_CONSTRAINT_FUNCTION"),
SQLITE_CONSTRAINT_NOTNULL => Some("SQLITE_CONSTRAINT_NOTNULL"),
SQLITE_CONSTRAINT_PINNED => Some("SQLITE_CONSTRAINT_PINNED"),
SQLITE_CONSTRAINT_PRIMARYKEY => Some("SQLITE_CONSTRAINT_PRIMARYKEY"),
SQLITE_CONSTRAINT_ROWID => Some("SQLITE_CONSTRAINT_ROWID"),
SQLITE_CONSTRAINT_TRIGGER => Some("SQLITE_CONSTRAINT_TRIGGER"),
SQLITE_CONSTRAINT_UNIQUE => Some("SQLITE_CONSTRAINT_UNIQUE"),
SQLITE_CONSTRAINT_VTAB => Some("SQLITE_CONSTRAINT_VTAB"),
SQLITE_CORRUPT_INDEX => Some("SQLITE_CORRUPT_INDEX"),
SQLITE_CORRUPT_SEQUENCE => Some("SQLITE_CORRUPT_SEQUENCE"),
SQLITE_CORRUPT_VTAB => Some("SQLITE_CORRUPT_VTAB"),
SQLITE_ERROR_MISSING_COLLSEQ => Some("SQLITE_ERROR_MISSING_COLLSEQ"),
SQLITE_ERROR_RETRY => Some("SQLITE_ERROR_RETRY"),
SQLITE_ERROR_SNAPSHOT => Some("SQLITE_ERROR_SNAPSHOT"),
SQLITE_IOERR_ACCESS => Some("SQLITE_IOERR_ACCESS"),
SQLITE_IOERR_AUTH => Some("SQLITE_IOERR_AUTH"),
SQLITE_IOERR_BEGIN_ATOMIC => Some("SQLITE_IOERR_BEGIN_ATOMIC"),
SQLITE_IOERR_BLOCKED => Some("SQLITE_IOERR_BLOCKED"),
SQLITE_IOERR_CHECKRESERVEDLOCK => Some("SQLITE_IOERR_CHECKRESERVEDLOCK"),
SQLITE_IOERR_CLOSE => Some("SQLITE_IOERR_CLOSE"),
SQLITE_IOERR_COMMIT_ATOMIC => Some("SQLITE_IOERR_COMMIT_ATOMIC"),
SQLITE_IOERR_CONVPATH => Some("SQLITE_IOERR_CONVPATH"),
SQLITE_IOERR_CORRUPTFS => Some("SQLITE_IOERR_CORRUPTFS"),
SQLITE_IOERR_DATA => Some("SQLITE_IOERR_DATA"),
SQLITE_IOERR_DELETE => Some("SQLITE_IOERR_DELETE"),
SQLITE_IOERR_DELETE_NOENT => Some("SQLITE_IOERR_DELETE_NOENT"),
SQLITE_IOERR_DIR_CLOSE => Some("SQLITE_IOERR_DIR_CLOSE"),
SQLITE_IOERR_DIR_FSYNC => Some("SQLITE_IOERR_DIR_FSYNC"),
SQLITE_IOERR_FSTAT => Some("SQLITE_IOERR_FSTAT"),
SQLITE_IOERR_FSYNC => Some("SQLITE_IOERR_FSYNC"),
SQLITE_IOERR_GETTEMPPATH => Some("SQLITE_IOERR_GETTEMPPATH"),
SQLITE_IOERR_LOCK => Some("SQLITE_IOERR_LOCK"),
SQLITE_IOERR_MMAP => Some("SQLITE_IOERR_MMAP"),
SQLITE_IOERR_NOMEM => Some("SQLITE_IOERR_NOMEM"),
SQLITE_IOERR_RDLOCK => Some("SQLITE_IOERR_RDLOCK"),
SQLITE_IOERR_READ => Some("SQLITE_IOERR_READ"),
SQLITE_IOERR_ROLLBACK_ATOMIC => Some("SQLITE_IOERR_ROLLBACK_ATOMIC"),
SQLITE_IOERR_SEEK => Some("SQLITE_IOERR_SEEK"),
SQLITE_IOERR_SHMLOCK => Some("SQLITE_IOERR_SHMLOCK"),
SQLITE_IOERR_SHMMAP => Some("SQLITE_IOERR_SHMMAP"),
SQLITE_IOERR_SHMOPEN => Some("SQLITE_IOERR_SHMOPEN"),
SQLITE_IOERR_SHMSIZE => Some("SQLITE_IOERR_SHMSIZE"),
SQLITE_IOERR_SHORT_READ => Some("SQLITE_IOERR_SHORT_READ"),
SQLITE_IOERR_TRUNCATE => Some("SQLITE_IOERR_TRUNCATE"),
SQLITE_IOERR_UNLOCK => Some("SQLITE_IOERR_UNLOCK"),
SQLITE_IOERR_VNODE => Some("SQLITE_IOERR_VNODE"),
SQLITE_IOERR_WRITE => Some("SQLITE_IOERR_WRITE"),
SQLITE_LOCKED_SHAREDCACHE => Some("SQLITE_LOCKED_SHAREDCACHE"),
SQLITE_LOCKED_VTAB => Some("SQLITE_LOCKED_VTAB"),
SQLITE_READONLY_CANTINIT => Some("SQLITE_READONLY_CANTINIT"),
SQLITE_READONLY_CANTLOCK => Some("SQLITE_READONLY_CANTLOCK"),
SQLITE_READONLY_DBMOVED => Some("SQLITE_READONLY_DBMOVED"),
SQLITE_READONLY_DIRECTORY => Some("SQLITE_READONLY_DIRECTORY"),
SQLITE_READONLY_RECOVERY => Some("SQLITE_READONLY_RECOVERY"),
SQLITE_READONLY_ROLLBACK => Some("SQLITE_READONLY_ROLLBACK"),
SQUIRE_ERROR => Some("SQUIRE_ERROR"),
SQUIRE_ERROR_FETCH => Some("SQUIRE_ERROR_FETCH"),
SQUIRE_ERROR_FETCH_RANGE => Some("SQUIRE_ERROR_FETCH_RANGE"),
SQUIRE_ERROR_PARAMETER => Some("SQUIRE_ERROR_PARAMETER"),
SQUIRE_ERROR_PARAMETER_BIND => Some("SQUIRE_ERROR_PARAMETER_BIND"),
SQUIRE_ERROR_PARAMETER_RESOLVE => Some("SQUIRE_ERROR_PARAMETER_RESOLVE"),
_ => None,
}
}
}
impl<Context: ErrorContext> fmt::Debug for Error<Context> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let raw = self.raw();
let name = Self::name_for_code(raw);
let mut format = f.debug_tuple("Error");
match name {
Some(name) => format.field(&name),
None => format.field(&raw),
};
format.field(&self.message()).finish()
}
}
impl<Context: ErrorContext> fmt::Display for Error<Context> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let message = self.message();
write!(f, "{message}")
}
}
impl Default for Error<()> {
#[inline]
fn default() -> Self {
Self::unknown()
}
}
impl Default for Error {
#[inline]
fn default() -> Self {
Self::from(Error::unknown())
}
}
impl Default for Error<(ErrorMessage, Option<ErrorLocation>)> {
#[inline]
fn default() -> Self {
Self::from(Error::unknown())
}
}
impl<Context: ErrorContext> core::error::Error for Error<Context> {}
impl From<c_int> for Error<()> {
fn from(value: c_int) -> Self {
Error::new(value).unwrap_or_default()
}
}
impl From<c_int> for Error {
fn from(value: c_int) -> Self {
Error::<()>::from(value).attach_static()
}
}
impl From<Error<()>> for Error {
fn from(error: Error<()>) -> Self {
error.attach_static()
}
}
impl From<Error<()>> for Error<(ErrorMessage, Option<ErrorLocation>)> {
fn from(error: Error<()>) -> Self {
error.attach((ErrorMessage::for_code(error.raw()), None))
}
}
impl From<Error> for Error<(ErrorMessage, Option<ErrorLocation>)> {
fn from(error: Error) -> Self {
Self {
code: error.code,
context: (error.context, None),
}
}
}
pub trait ErrorContext {
fn message(&self, code: i32) -> &str;
}
pub trait ConnectedErrorContext: ErrorContext {
unsafe fn capture(connection: *mut sqlite3, code: i32) -> Self;
}
impl ErrorContext for () {
fn message(&self, code: i32) -> &str {
ErrorMessage::resolve_code(code)
}
}
impl ConnectedErrorContext for () {
#[inline(always)]
unsafe fn capture(_connection: *mut sqlite3, _code: i32) -> Self {
()
}
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)]
pub struct ErrorMessage(Cow<'static, str>);
impl ErrorMessage {
pub fn new(message: impl AsRef<str>) -> Self {
Self::formatted(message.as_ref().to_owned())
}
#[inline]
pub const fn constant(message: &'static str) -> Self {
Self(Cow::Borrowed(message))
}
#[inline]
pub const fn formatted(message: String) -> Self {
Self(Cow::Owned(message))
}
pub fn for_code(code: i32) -> Self {
Self::constant(Self::resolve_code(code))
}
pub(crate) fn resolve_code(code: i32) -> &'static str {
let ptr = unsafe { sqlite3_errstr(code) };
let bytes = unsafe { CStr::from_ptr(ptr) }.to_bytes();
unsafe { str::from_utf8_unchecked(bytes) }
}
pub const fn as_str(&self) -> &str {
match self.0 {
Cow::Borrowed(message) => message,
Cow::Owned(ref message) => message.as_str(),
}
}
pub fn into_string(self) -> String {
self.0.into_owned()
}
}
impl ErrorContext for ErrorMessage {
fn message(&self, _code: i32) -> &str {
self.as_str()
}
}
impl ConnectedErrorContext for ErrorMessage {
unsafe fn capture(connection: *mut sqlite3, code: i32) -> Self {
if !connection.is_null() {
let current = unsafe { sqlite3_errcode(connection) };
if current == code {
let ptr = unsafe { sqlite3_errmsg(connection) };
let static_ptr = unsafe { sqlite3_errstr(code) };
if !ptr.is_null() && ptr != static_ptr {
let text = unsafe { str::from_utf8_unchecked(CStr::from_ptr(ptr).to_bytes()) };
return Self::new(text);
}
}
}
Self::for_code(code)
}
}
impl<T> From<T> for ErrorMessage
where
Cow<'static, str>: From<T>,
{
fn from(value: T) -> Self {
Self(value.into())
}
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
#[cfg_attr(
feature = "lang-rustc-scalar-valid-range",
rustc_layout_scalar_valid_range_end(0x7FFFFFFF)
)]
pub struct ErrorLocation(u32);
impl ErrorContext for (ErrorMessage, Option<ErrorLocation>) {
fn message(&self, code: i32) -> &str {
self.0.message(code)
}
}
impl ConnectedErrorContext for (ErrorMessage, Option<ErrorLocation>) {
unsafe fn capture(connection: *mut sqlite3, code: i32) -> Self {
let message = unsafe { <ErrorMessage as ConnectedErrorContext>::capture(connection, code) };
let location = unsafe { ErrorLocation::capture(connection) };
(message, location)
}
}
impl ErrorLocation {
const fn new(location: i32) -> Option<Self> {
if location >= 0 {
Some(Self(location as u32))
} else {
None
}
}
unsafe fn capture(connection: *mut sqlite3) -> Option<Self> {
Self::new(unsafe { sqlite3_error_offset(connection) })
}
pub const fn offset(&self) -> usize {
self.0 as usize
}
pub fn prefix<'a>(&self, sql: &'a str) -> &'a str {
&sql[..self.offset()]
}
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[non_exhaustive]
#[repr(i32)]
pub enum ErrorCategory {
#[doc(alias = "SQLITE_ERROR")]
Unknown = SQLITE_ERROR,
#[doc(alias = "SQLITE_INTERNAL")]
Internal = SQLITE_INTERNAL,
#[doc(alias = "SQLITE_PERM")]
Permission = SQLITE_PERM,
#[doc(alias = "SQLITE_ABORT")]
Aborted = SQLITE_ABORT,
#[doc(alias = "SQLITE_BUSY")]
Busy = SQLITE_BUSY,
#[doc(alias = "SQLITE_LOCKED")]
Locked = SQLITE_LOCKED,
#[doc(alias = "SQLITE_NOMEM")]
OutOfMemory = SQLITE_NOMEM,
#[doc(alias = "SQLITE_READONLY")]
ReadOnly = SQLITE_READONLY,
#[doc(alias = "SQLITE_INTERRUPT")]
Interrupt = SQLITE_INTERRUPT,
#[doc(alias = "SQLITE_IOERR")]
Io = SQLITE_IOERR,
#[doc(alias = "SQLITE_CORRUPT")]
Corrupt = SQLITE_CORRUPT,
#[doc(alias = "SQLITE_NOTFOUND")]
NotFound = SQLITE_NOTFOUND,
#[doc(alias = "SQLITE_FULL")]
Full = SQLITE_FULL,
#[doc(alias = "SQLITE_CANTOPEN")]
CantOpen = SQLITE_CANTOPEN,
#[doc(alias = "SQLITE_PROTOCOL")]
Protocol = SQLITE_PROTOCOL,
#[doc(alias = "SQLITE_EMPTY")]
#[deprecated]
Empty = SQLITE_EMPTY,
#[doc(alias = "SQLITE_SCHEMA")]
Schema = SQLITE_SCHEMA,
#[doc(alias = "SQLITE_TOOBIG")]
TooBig = SQLITE_TOOBIG,
#[doc(alias = "SQLITE_CONSTRAINT")]
Constraint = SQLITE_CONSTRAINT,
#[doc(alias = "SQLITE_MISMATCH")]
Mismatch = SQLITE_MISMATCH,
#[doc(alias = "SQLITE_MISUSE")]
Misuse = SQLITE_MISUSE,
#[doc(alias = "SQLITE_NOLFS")]
LargeFile = SQLITE_NOLFS,
#[doc(alias = "SQLITE_AUTH")]
Authorization = SQLITE_AUTH,
#[doc(alias = "SQLITE_FORMAT")]
#[deprecated]
Format = SQLITE_FORMAT,
#[doc(alias = "SQLITE_RANGE")]
Range = SQLITE_RANGE,
#[doc(alias = "SQLITE_NOTADB")]
InvalidDatabase = SQLITE_NOTADB,
Fetch = SQUIRE_ERROR_FETCH,
Parameter = SQUIRE_ERROR_PARAMETER,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[non_exhaustive]
pub enum ErrorCode {
Aborted(AbortError),
Authorization(AuthorizationError),
Busy(BusyError),
CantOpen(CantOpenError),
Constraint(ConstraintError),
Corrupt(CorruptError),
Error(GeneralError),
Io(IoError),
Locked(LockedError),
ReadOnly(ReadOnlyError),
Fetch(FetchError),
Parameter(ParameterError),
}
impl ErrorCode {
pub const fn code(self) -> i32 {
match self {
ErrorCode::Aborted(err) => err as i32,
ErrorCode::Authorization(err) => err as i32,
ErrorCode::Busy(err) => err as i32,
ErrorCode::CantOpen(err) => err as i32,
ErrorCode::Constraint(err) => err as i32,
ErrorCode::Corrupt(err) => err as i32,
ErrorCode::Error(err) => err as i32,
ErrorCode::Io(err) => err as i32,
ErrorCode::Locked(err) => err as i32,
ErrorCode::ReadOnly(err) => err as i32,
ErrorCode::Fetch(err) => err as i32,
ErrorCode::Parameter(err) => err as i32,
}
}
pub const fn primary_category(self) -> ErrorCategory {
match self {
ErrorCode::Aborted(_) => ErrorCategory::Aborted,
ErrorCode::Authorization(_) => ErrorCategory::Authorization,
ErrorCode::Busy(_) => ErrorCategory::Busy,
ErrorCode::CantOpen(_) => ErrorCategory::CantOpen,
ErrorCode::Constraint(_) => ErrorCategory::Constraint,
ErrorCode::Corrupt(_) => ErrorCategory::Corrupt,
ErrorCode::Error(_) => ErrorCategory::Unknown,
ErrorCode::Io(_) => ErrorCategory::Io,
ErrorCode::Locked(_) => ErrorCategory::Locked,
ErrorCode::ReadOnly(_) => ErrorCategory::ReadOnly,
ErrorCode::Fetch(_) => ErrorCategory::Fetch,
ErrorCode::Parameter(_) => ErrorCategory::Parameter,
}
}
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum AbortError {
#[doc(alias = "SQLITE_ABORT_ROLLBACK")]
Rollback = SQLITE_ABORT_ROLLBACK,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum AuthorizationError {
#[doc(alias = "SQLITE_AUTH_USER")]
User = SQLITE_AUTH_USER,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum BusyError {
#[doc(alias = "SQLITE_BUSY_RECOVERY")]
Recovery = SQLITE_BUSY_RECOVERY,
#[doc(alias = "SQLITE_BUSY_SNAPSHOT")]
Snapshot = SQLITE_BUSY_SNAPSHOT,
#[doc(alias = "SQLITE_BUSY_TIMEOUT")]
Timeout = SQLITE_BUSY_TIMEOUT,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum CantOpenError {
#[doc(alias = "SQLITE_CANTOPEN_FULLPATH")]
FullPath = SQLITE_CANTOPEN_FULLPATH,
#[doc(alias = "SQLITE_CANTOPEN_ISDIR")]
IsDir = SQLITE_CANTOPEN_ISDIR,
#[doc(alias = "SQLITE_CANTOPEN_NOTEMPDIR")]
#[deprecated]
NoTempDir = SQLITE_CANTOPEN_NOTEMPDIR,
#[doc(alias = "SQLITE_CANTOPEN_CONVPATH")]
ConvPath = SQLITE_CANTOPEN_CONVPATH,
#[doc(alias = "SQLITE_CANTOPEN_DIRTYWAL")]
#[deprecated]
DirtyWal = SQLITE_CANTOPEN_DIRTYWAL,
#[doc(alias = "SQLITE_CANTOPEN_SYMLINK")]
Symlink = SQLITE_CANTOPEN_SYMLINK,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum ConstraintError {
#[doc(alias = "SQLITE_CONSTRAINT_CHECK")]
Check = SQLITE_CONSTRAINT_CHECK,
#[doc(alias = "SQLITE_CONSTRAINT_COMMITHOOK")]
CommitHook = SQLITE_CONSTRAINT_COMMITHOOK,
#[doc(alias = "SQLITE_CONSTRAINT_DATATYPE")]
DataType = SQLITE_CONSTRAINT_DATATYPE,
#[doc(alias = "SQLITE_CONSTRAINT_FOREIGNKEY")]
ForeignKey = SQLITE_CONSTRAINT_FOREIGNKEY,
#[doc(alias = "SQLITE_CONSTRAINT_FUNCTION")]
Function = SQLITE_CONSTRAINT_FUNCTION,
#[doc(alias = "SQLITE_CONSTRAINT_NOTNULL")]
NotNull = SQLITE_CONSTRAINT_NOTNULL,
#[doc(alias = "SQLITE_CONSTRAINT_PINNED")]
Pinned = SQLITE_CONSTRAINT_PINNED,
#[doc(alias = "SQLITE_CONSTRAINT_PRIMARYKEY")]
PrimaryKey = SQLITE_CONSTRAINT_PRIMARYKEY,
#[doc(alias = "SQLITE_CONSTRAINT_ROWID")]
RowId = SQLITE_CONSTRAINT_ROWID,
#[doc(alias = "SQLITE_CONSTRAINT_TRIGGER")]
Trigger = SQLITE_CONSTRAINT_TRIGGER,
#[doc(alias = "SQLITE_CONSTRAINT_UNIQUE")]
Unique = SQLITE_CONSTRAINT_UNIQUE,
#[doc(alias = "SQLITE_CONSTRAINT_VTAB")]
VTab = SQLITE_CONSTRAINT_VTAB,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum CorruptError {
#[doc(alias = "SQLITE_CORRUPT_INDEX")]
Index = SQLITE_CORRUPT_INDEX,
#[doc(alias = "SQLITE_CORRUPT_SEQUENCE")]
Sequence = SQLITE_CORRUPT_SEQUENCE,
#[doc(alias = "SQLITE_CORRUPT_VTAB")]
VTab = SQLITE_CORRUPT_VTAB,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum GeneralError {
#[doc(alias = "SQLITE_ERROR_MISSING_COLLSEQ")]
MissingCollSeq = SQLITE_ERROR_MISSING_COLLSEQ,
#[doc(alias = "SQLITE_ERROR_RETRY")]
Retry = SQLITE_ERROR_RETRY,
#[doc(alias = "SQLITE_ERROR_SNAPSHOT")]
Snapshot = SQLITE_ERROR_SNAPSHOT,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum IoError {
#[doc(alias = "SQLITE_IOERR_READ")]
Read = SQLITE_IOERR_READ,
#[doc(alias = "SQLITE_IOERR_WRITE")]
Write = SQLITE_IOERR_WRITE,
#[doc(alias = "SQLITE_IOERR_FSYNC")]
FSync = SQLITE_IOERR_FSYNC,
#[doc(alias = "SQLITE_IOERR_FSTAT")]
FStat = SQLITE_IOERR_FSTAT,
#[doc(alias = "SQLITE_IOERR_TRUNCATE")]
Truncate = SQLITE_IOERR_TRUNCATE,
#[doc(alias = "SQLITE_IOERR_UNLOCK")]
Unlock = SQLITE_IOERR_UNLOCK,
#[doc(alias = "SQLITE_IOERR_RDLOCK")]
ReadLock = SQLITE_IOERR_RDLOCK,
#[doc(alias = "SQLITE_IOERR_DELETE")]
Delete = SQLITE_IOERR_DELETE,
#[doc(alias = "SQLITE_IOERR_BLOCKED")]
#[deprecated]
Blocked = SQLITE_IOERR_BLOCKED,
#[doc(alias = "SQLITE_IOERR_NOMEM")]
NoMem = SQLITE_IOERR_NOMEM,
#[doc(alias = "SQLITE_IOERR_ACCESS")]
Access = SQLITE_IOERR_ACCESS,
#[doc(alias = "SQLITE_IOERR_CHECKRESERVEDLOCK")]
CheckReservedLock = SQLITE_IOERR_CHECKRESERVEDLOCK,
#[doc(alias = "SQLITE_IOERR_LOCK")]
Lock = SQLITE_IOERR_LOCK,
#[doc(alias = "SQLITE_IOERR_CLOSE")]
Close = SQLITE_IOERR_CLOSE,
#[doc(alias = "SQLITE_IOERR_DIR_CLOSE")]
#[deprecated]
DirClose = SQLITE_IOERR_DIR_CLOSE,
#[doc(alias = "SQLITE_IOERR_SHMOPEN")]
ShmOpen = SQLITE_IOERR_SHMOPEN,
#[doc(alias = "SQLITE_IOERR_SHMSIZE")]
ShmSize = SQLITE_IOERR_SHMSIZE,
#[doc(alias = "SQLITE_IOERR_SHMLOCK")]
#[deprecated]
ShmLock = SQLITE_IOERR_SHMLOCK,
#[doc(alias = "SQLITE_IOERR_SHMMAP")]
ShmMap = SQLITE_IOERR_SHMMAP,
#[doc(alias = "SQLITE_IOERR_SEEK")]
Seek = SQLITE_IOERR_SEEK,
#[doc(alias = "SQLITE_IOERR_DELETE_NOENT")]
DeleteNoEnt = SQLITE_IOERR_DELETE_NOENT,
#[doc(alias = "SQLITE_IOERR_MMAP")]
MMap = SQLITE_IOERR_MMAP,
#[doc(alias = "SQLITE_IOERR_GETTEMPPATH")]
GetTempPath = SQLITE_IOERR_GETTEMPPATH,
#[doc(alias = "SQLITE_IOERR_CONVPATH")]
ConvPath = SQLITE_IOERR_CONVPATH,
#[doc(alias = "SQLITE_IOERR_VNODE")]
VNode = SQLITE_IOERR_VNODE,
#[doc(alias = "SQLITE_IOERR_AUTH")]
Auth = SQLITE_IOERR_AUTH,
#[doc(alias = "SQLITE_IOERR_BEGIN_ATOMIC")]
BeginAtomic = SQLITE_IOERR_BEGIN_ATOMIC,
#[doc(alias = "SQLITE_IOERR_COMMIT_ATOMIC")]
CommitAtomic = SQLITE_IOERR_COMMIT_ATOMIC,
#[doc(alias = "SQLITE_IOERR_ROLLBACK_ATOMIC")]
RollbackAtomic = SQLITE_IOERR_ROLLBACK_ATOMIC,
#[doc(alias = "SQLITE_IOERR_DATA")]
Data = SQLITE_IOERR_DATA,
#[doc(alias = "SQLITE_IOERR_CORRUPTFS")]
CorruptFS = SQLITE_IOERR_CORRUPTFS,
#[doc(alias = "SQLITE_IOERR_SHORT_READ")]
ShortRead = SQLITE_IOERR_SHORT_READ,
#[doc(alias = "SQLITE_IOERR_DIR_FSYNC")]
DirFSync = SQLITE_IOERR_DIR_FSYNC,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum LockedError {
#[doc(alias = "SQLITE_LOCKED_SHAREDCACHE")]
SharedCache = SQLITE_LOCKED_SHAREDCACHE,
#[doc(alias = "SQLITE_LOCKED_VTAB")]
VTab = SQLITE_LOCKED_VTAB,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum ReadOnlyError {
#[doc(alias = "SQLITE_READONLY_RECOVERY")]
Recovery = SQLITE_READONLY_RECOVERY,
#[doc(alias = "SQLITE_READONLY_CANTLOCK")]
CantLock = SQLITE_READONLY_CANTLOCK,
#[doc(alias = "SQLITE_READONLY_ROLLBACK")]
Rollback = SQLITE_READONLY_ROLLBACK,
#[doc(alias = "SQLITE_READONLY_DBMOVED")]
DbMoved = SQLITE_READONLY_DBMOVED,
#[doc(alias = "SQLITE_READONLY_CANTINIT")]
CantInit = SQLITE_READONLY_CANTINIT,
#[doc(alias = "SQLITE_READONLY_DIRECTORY")]
Directory = SQLITE_READONLY_DIRECTORY,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum FetchError {
Range = SQUIRE_ERROR_FETCH_RANGE,
}
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[repr(i32)]
pub enum ParameterError {
Bind = SQUIRE_ERROR_PARAMETER_BIND,
Resolve = SQUIRE_ERROR_PARAMETER_RESOLVE,
}