/** @file
 *  @brief Hierarchy of classes which Xapian can throw as exceptions.
 */
/* Warning: This file is generated by ./generate-exceptions - do not modify directly! */
/* Copyright (C) 2003,2004,2006,2007,2008,2009,2011,2015,2019,2020 Olly Betts
 * Copyright (C) 2007 Richard Boulton
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see
 * <https://www.gnu.org/licenses/>.
 */

#ifndef XAPIAN_INCLUDED_ERROR_H
#define XAPIAN_INCLUDED_ERROR_H

#if !defined XAPIAN_IN_XAPIAN_H && !defined XAPIAN_LIB_BUILD
# error Never use <xapian/error.h> directly; include <xapian.h> instead.
#endif

#include <string>
#include <xapian/attributes.h>
#include <xapian/visibility.h>

namespace Xapian {

/** All exceptions thrown by Xapian are subclasses of Xapian::Error.
 *
 *  This class can not be instantiated directly - instead a subclass should
 *  be used.
 */
class XAPIAN_VISIBILITY_DEFAULT Error {
    /// Message giving details of the error, intended for human consumption.
    std::string msg;

    /** Optional context information.
     *
     *  This context is intended for machine use (for example to know which
     *  remote server an error came from), but it is typically a
     *  plain-text string, and so also fit for human consumption.
     */
    std::string context;

    /** The error string derived from my_errno.
     *
     *  This string is generated from my_errno lazily.
     */
    mutable std::string error_string;

    /// The type of this error (e.g. DocNotFoundError.)
    const char * type;

    /** Optional value of 'errno' associated with this error.
     *
     *  If no value is associated, this member variable will be 0.
     *
     *  On UNIX, if this value is < 0, it's an error code returned from
     *  getaddrinfo() (negated if such error codes are positive).
     *
     *  On Windows, if this value is < 0, it's a negated Windows error code
     *  (as given by GetLastError()), while if it is >= WSABASEERR then it is a
     *  WinSock error code (as given by WSAGetLastError()).  Prior to Xapian
     *  1.2.20 and 1.3.3, WSAGetLastError() codes were also negated.
     *
     *  NB We don't just call this member "errno" to avoid problems on
     *  platforms where errno is a preprocessor macro.
     */
    int my_errno;

    /// Don't allow assignment of the base class.
    void operator=(const Error &o);

  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    Error(std::string_view msg_, std::string_view context_,
          const char* type_, const char* error_string_);

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    Error(std::string_view msg_, std::string_view context_,
          const char* type_, int errno_)
        : msg(msg_), context(context_), error_string(), type(type_),
          my_errno(errno_) { }

  public:
    /** Default copy constructor.
     *
     *  We explicitly specify this to avoid warnings from GCC 9 (from
     *  -Wdeprecated-copy which is enabled by -Wextra).
     */
    Error(const Error&) = default;

    /// The type of this error (e.g. "DocNotFoundError".)
    const char* get_type() const noexcept {
        return type + 1;
    }

    /// Message giving details of the error, intended for human consumption.
    const std::string& get_msg() const noexcept {
        return msg;
    }

    /** Optional context information.
     *
     *  This context is intended for machine use (for example to know which
     *  remote server an error came from), but it is typically a
     *  plain-text string, and so also fit for human consumption.
     */
    const std::string& get_context() const noexcept {
        return context;
    }

    /** Returns any system error string associated with this exception.
     *
     *  The system error string may come from errno, h_errno (on UNIX), or
     *  GetLastError() (on MS Windows).  If there is no associated system
     *  error string, NULL is returned.
     */
    const char * get_error_string() const;

    /// Return a string describing this object.
    std::string get_description() const;
};

/** The base class for exceptions indicating errors in the program logic.
 *
 *  A subclass of LogicError will be thrown if Xapian detects a violation
 *  of a class invariant or a logical precondition or postcondition, etc.
 */
class XAPIAN_VISIBILITY_DEFAULT LogicError : public Error {
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    LogicError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : Error(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    LogicError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : Error(msg_, context_, type_, errno_) {}
};

/** The base class for exceptions indicating errors only detectable at runtime.
 *
 *  A subclass of RuntimeError will be thrown if Xapian detects an error
 *  which is exception derived from RuntimeError is thrown when an
 *  error is caused by problems with the data or environment rather
 *  than a programming mistake.
 */
class XAPIAN_VISIBILITY_DEFAULT RuntimeError : public Error {
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    RuntimeError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : Error(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    RuntimeError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : Error(msg_, context_, type_, errno_) {}
};

/** AssertionError is thrown if a logical assertion inside Xapian fails.
 *
 *  In a debug build of Xapian, a failed assertion in the core library code
 *  will cause AssertionError to be thrown.
 *
 *  This represents a bug in Xapian (either an invariant, precondition, etc
 *  has been violated, or the assertion is incorrect!)
 */
class XAPIAN_VISIBILITY_DEFAULT AssertionError : public LogicError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    AssertionError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : LogicError(msg_, context_, "\000AssertionError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit AssertionError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : LogicError(msg_, context_, "\000AssertionError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    AssertionError(std::string_view msg_, int errno_)
        : LogicError(msg_, std::string(), "\000AssertionError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    AssertionError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : LogicError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    AssertionError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : LogicError(msg_, context_, type_, errno_) {}
};

/** InvalidArgumentError indicates an invalid parameter value was passed to the API.
 */
class XAPIAN_VISIBILITY_DEFAULT InvalidArgumentError : public LogicError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    InvalidArgumentError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : LogicError(msg_, context_, "\001InvalidArgumentError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit InvalidArgumentError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : LogicError(msg_, context_, "\001InvalidArgumentError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    InvalidArgumentError(std::string_view msg_, int errno_)
        : LogicError(msg_, std::string(), "\001InvalidArgumentError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InvalidArgumentError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : LogicError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InvalidArgumentError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : LogicError(msg_, context_, type_, errno_) {}
};

/** InvalidOperationError indicates the API was used in an invalid way.
 */
class XAPIAN_VISIBILITY_DEFAULT InvalidOperationError : public LogicError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    InvalidOperationError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : LogicError(msg_, context_, "\002InvalidOperationError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit InvalidOperationError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : LogicError(msg_, context_, "\002InvalidOperationError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    InvalidOperationError(std::string_view msg_, int errno_)
        : LogicError(msg_, std::string(), "\002InvalidOperationError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InvalidOperationError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : LogicError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InvalidOperationError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : LogicError(msg_, context_, type_, errno_) {}
};

/** UnimplementedError indicates an attempt to use an unimplemented feature.
 */
class XAPIAN_VISIBILITY_DEFAULT UnimplementedError : public LogicError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    UnimplementedError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : LogicError(msg_, context_, "\003UnimplementedError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit UnimplementedError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : LogicError(msg_, context_, "\003UnimplementedError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    UnimplementedError(std::string_view msg_, int errno_)
        : LogicError(msg_, std::string(), "\003UnimplementedError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    UnimplementedError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : LogicError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    UnimplementedError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : LogicError(msg_, context_, type_, errno_) {}
};

/** DatabaseError indicates some sort of database related error.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\004DatabaseError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\004DatabaseError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\004DatabaseError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** DatabaseCorruptError indicates database corruption was detected.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseCorruptError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseCorruptError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\005DatabaseCorruptError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseCorruptError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\005DatabaseCorruptError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseCorruptError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\005DatabaseCorruptError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseCorruptError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseCorruptError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

/** DatabaseCreateError indicates a failure to create a database.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseCreateError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseCreateError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\006DatabaseCreateError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseCreateError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\006DatabaseCreateError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseCreateError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\006DatabaseCreateError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseCreateError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseCreateError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

/** DatabaseLockError indicates failure to lock a database.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseLockError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseLockError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\007DatabaseLockError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseLockError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\007DatabaseLockError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseLockError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\007DatabaseLockError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseLockError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseLockError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

/** DatabaseModifiedError indicates a database was modified.
 *
 *  To recover after catching this error, you need to call
 *  Xapian::Database::reopen() on the Database and repeat the operation
 *  which failed.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseModifiedError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseModifiedError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\010DatabaseModifiedError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseModifiedError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\010DatabaseModifiedError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseModifiedError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\010DatabaseModifiedError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseModifiedError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseModifiedError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

/** DatabaseOpeningError indicates failure to open a database.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseOpeningError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseOpeningError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\011DatabaseOpeningError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseOpeningError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\011DatabaseOpeningError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseOpeningError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\011DatabaseOpeningError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseOpeningError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseOpeningError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

/** DatabaseVersionError indicates that a database is in an unsupported format.
 *
 *  From time to time, new versions of Xapian will require the database format
 *  to be changed, to allow new information to be stored or new optimisations
 *  to be performed.  Backwards compatibility will sometimes be maintained, so
 *  that new versions of Xapian can open old databases, but in some cases
 *  Xapian will be unable to open a database because it is in too old (or new)
 *  a format.  This can be resolved either be upgrading or downgrading the
 *  version of Xapian in use, or by rebuilding the database from scratch with
 *  the current version of Xapian.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseVersionError : public DatabaseOpeningError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseVersionError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseOpeningError(msg_, context_, "\012DatabaseVersionError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseVersionError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseOpeningError(msg_, context_, "\012DatabaseVersionError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseVersionError(std::string_view msg_, int errno_)
        : DatabaseOpeningError(msg_, std::string(), "\012DatabaseVersionError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseVersionError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseOpeningError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseVersionError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseOpeningError(msg_, context_, type_, errno_) {}
};

/** Indicates an attempt to access a document not present in the database.
 */
class XAPIAN_VISIBILITY_DEFAULT DocNotFoundError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DocNotFoundError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\013DocNotFoundError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DocNotFoundError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\013DocNotFoundError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DocNotFoundError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\013DocNotFoundError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DocNotFoundError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DocNotFoundError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** Indicates an attempt to use a feature which is unavailable.
 *
 *  Typically a feature is unavailable because it wasn't compiled in, or
 *  because it requires other software or facilities which aren't available.
 */
class XAPIAN_VISIBILITY_DEFAULT FeatureUnavailableError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    FeatureUnavailableError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\014FeatureUnavailableError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit FeatureUnavailableError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\014FeatureUnavailableError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    FeatureUnavailableError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\014FeatureUnavailableError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    FeatureUnavailableError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    FeatureUnavailableError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** InternalError indicates a runtime problem of some sort.
 */
class XAPIAN_VISIBILITY_DEFAULT InternalError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    InternalError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\015InternalError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit InternalError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\015InternalError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    InternalError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\015InternalError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InternalError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    InternalError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** Indicates a problem communicating with a remote database.
 */
class XAPIAN_VISIBILITY_DEFAULT NetworkError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    NetworkError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\016NetworkError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit NetworkError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\016NetworkError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    NetworkError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\016NetworkError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    NetworkError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    NetworkError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** Indicates a timeout expired while communicating with a remote database.
 */
class XAPIAN_VISIBILITY_DEFAULT NetworkTimeoutError : public NetworkError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    NetworkTimeoutError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : NetworkError(msg_, context_, "\017NetworkTimeoutError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit NetworkTimeoutError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : NetworkError(msg_, context_, "\017NetworkTimeoutError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    NetworkTimeoutError(std::string_view msg_, int errno_)
        : NetworkError(msg_, std::string(), "\017NetworkTimeoutError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    NetworkTimeoutError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : NetworkError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    NetworkTimeoutError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : NetworkError(msg_, context_, type_, errno_) {}
};

/** Indicates a query string can't be parsed.
 */
class XAPIAN_VISIBILITY_DEFAULT QueryParserError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    QueryParserError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\020QueryParserError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit QueryParserError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\020QueryParserError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    QueryParserError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\020QueryParserError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    QueryParserError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    QueryParserError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** Indicates an error in the std::string serialisation of an object.
 */
class XAPIAN_VISIBILITY_DEFAULT SerialisationError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    SerialisationError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\021SerialisationError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit SerialisationError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\021SerialisationError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    SerialisationError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\021SerialisationError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    SerialisationError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    SerialisationError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** RangeError indicates an attempt to access outside the bounds of a container.
 */
class XAPIAN_VISIBILITY_DEFAULT RangeError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    RangeError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\022RangeError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit RangeError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\022RangeError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    RangeError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\022RangeError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    RangeError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    RangeError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** WildcardError indicates an error expanding a wildcarded query.
 */
class XAPIAN_VISIBILITY_DEFAULT WildcardError : public RuntimeError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    WildcardError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : RuntimeError(msg_, context_, "\023WildcardError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit WildcardError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : RuntimeError(msg_, context_, "\023WildcardError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    WildcardError(std::string_view msg_, int errno_)
        : RuntimeError(msg_, std::string(), "\023WildcardError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    WildcardError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : RuntimeError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    WildcardError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : RuntimeError(msg_, context_, type_, errno_) {}
};

/** Indicates an attempt to access a database not present.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseNotFoundError : public DatabaseOpeningError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseNotFoundError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseOpeningError(msg_, context_, "\024DatabaseNotFoundError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseNotFoundError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseOpeningError(msg_, context_, "\024DatabaseNotFoundError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseNotFoundError(std::string_view msg_, int errno_)
        : DatabaseOpeningError(msg_, std::string(), "\024DatabaseNotFoundError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseNotFoundError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseOpeningError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseNotFoundError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseOpeningError(msg_, context_, type_, errno_) {}
};

/** Indicates an attempt to access a closed database.
 */
class XAPIAN_VISIBILITY_DEFAULT DatabaseClosedError : public DatabaseError {
  public:
    /** @private @internal
     *  @brief Private constructor for use by remote backend.
     *
     *  @param error_string_   Optional string describing error.  May be NULL.
     */
    DatabaseClosedError(std::string_view msg_, std::string_view context_, const char* error_string_)
        : DatabaseError(msg_, context_, "\025DatabaseClosedError", error_string_) {}
    /** General purpose constructor.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param context_        Optional context information for this error.
     *  @param errno_          Optional errno value associated with this error.
     */
    explicit DatabaseClosedError(std::string_view msg_, std::string_view context_ = {}, int errno_ = 0)
        : DatabaseError(msg_, context_, "\025DatabaseClosedError", errno_) {}
    /** Construct from message and errno value.
     *
     *  @param msg_            Message giving details of the error, intended
     *                          for human consumption.
     *  @param errno_          Optional errno value associated with this error.
     */
    DatabaseClosedError(std::string_view msg_, int errno_)
        : DatabaseError(msg_, std::string(), "\025DatabaseClosedError", errno_) {}
  protected:
    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseClosedError(std::string_view msg_, std::string_view context_, const char* type_, const char* error_string_)
        : DatabaseError(msg_, context_, type_, error_string_) {}

    /** @private @internal
     *  @brief Constructor for use by constructors of derived classes.
     */
    DatabaseClosedError(std::string_view msg_, std::string_view context_, const char* type_, int errno_)
        : DatabaseError(msg_, context_, type_, errno_) {}
};

}

#endif /* XAPIAN_INCLUDED_ERROR_H */
