123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Copyright 2014 MongoDB Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- #pragma once
- #include <memory>
- #include <mongocxx/config/prelude.hpp>
- namespace mongocxx {
- MONGOCXX_INLINE_NAMESPACE_BEGIN
- class logger;
- ///
- /// Class representing an instance of the MongoDB driver.
- ///
- /// The constructor and destructor initialize and shut down the driver, respectively. Therefore, an
- /// instance must be created before using the driver and must remain alive until all other mongocxx
- /// objects are destroyed. After the instance destructor runs, the driver may not be used.
- ///
- /// Exactly one instance must be created in a given program. Not constructing an instance or
- /// constructing more than one instance in a program are errors, even if the multiple instances have
- /// non-overlapping lifetimes.
- ///
- /// The following is a correct example of using an instance in a program, as the instance is kept
- /// alive for as long as the driver is in use:
- ///
- /// \code
- ///
- /// #include <mongocxx/client.hpp>
- /// #include <mongocxx/instance.hpp>
- /// #include <mongocxx/uri.hpp>
- ///
- /// int main() {
- /// mongocxx::instance inst{};
- /// mongocxx::client conn{mongocxx::uri{}};
- /// ...
- /// }
- ///
- /// \endcode
- ///
- /// An example of using instance incorrectly might look as follows:
- ///
- /// \code
- ///
- /// #include <mongocxx/client.hpp>
- /// #include <mongocxx/instance.hpp>
- /// #include <mongocxx/uri.hpp>
- ///
- /// client get_client() {
- /// mongocxx::instance inst{};
- /// mongocxx::client conn{mongocxx::uri{}};
- ///
- /// return client;
- /// } // ERROR! The instance is no longer alive after this function returns.
- ///
- /// int main() {
- /// mongocxx::client conn = get_client();
- /// ...
- /// }
- ///
- /// \endcode
- ///
- /// For examples of more advanced usage of instance, see
- /// `examples/mongocxx/instance_management.cpp`.
- ///
- class MONGOCXX_API instance {
- public:
- ///
- /// Creates an instance of the driver.
- ///
- instance();
- ///
- /// Creates an instance of the driver with a user provided log handler.
- /// @param logger The logger that the driver will direct log messages to.
- ///
- /// @throws mongocxx::logic_error if an instance already exists.
- ///
- instance(std::unique_ptr<logger> logger);
- ///
- /// Move constructs an instance of the driver.
- ///
- instance(instance&&) noexcept;
- ///
- /// Move assigns an instance of the driver.
- ///
- instance& operator=(instance&&) noexcept;
- ///
- /// Destroys an instance of the driver.
- ///
- ~instance();
- ///
- /// Returns the current unique instance of the driver. If an instance was explicitly created,
- /// that will be returned. If no instance has yet been created, a default instance will be
- /// constructed and returned. If a default instance is constructed, its destruction will be
- /// sequenced according to the rules for the destruction of static local variables at program
- /// exit (see http://en.cppreference.com/w/cpp/utility/program/exit).
- ///
- /// Note that, if you need to configure the instance in any way (e.g. with a logger), you cannot
- /// use this method to cause the instance to be constructed. You must explicitly create an
- /// properly configured instance object. You can, however, use this method to obtain that
- /// configured instance object.
- ///
- /// @note This method is intended primarily for test authors, where managing the lifetime of the
- /// instance w.r.t. the test framework can be problematic.
- ///
- static instance& current();
- private:
- class MONGOCXX_PRIVATE impl;
- std::unique_ptr<impl> _impl;
- };
- MONGOCXX_INLINE_NAMESPACE_END
- } // namespace mongocxx
- #include <mongocxx/config/postlude.hpp>
|