1*b0d29bc4SBrooks Davis // Copyright 2011 The Kyua Authors. 2*b0d29bc4SBrooks Davis // All rights reserved. 3*b0d29bc4SBrooks Davis // 4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without 5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are 6*b0d29bc4SBrooks Davis // met: 7*b0d29bc4SBrooks Davis // 8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright 9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer. 10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright 11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the 12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution. 13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors 14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software 15*b0d29bc4SBrooks Davis // without specific prior written permission. 16*b0d29bc4SBrooks Davis // 17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*b0d29bc4SBrooks Davis 29*b0d29bc4SBrooks Davis /// \file utils/sqlite/database.hpp 30*b0d29bc4SBrooks Davis /// Wrapper classes and utilities for the SQLite database state. 31*b0d29bc4SBrooks Davis /// 32*b0d29bc4SBrooks Davis /// This module contains thin RAII wrappers around the SQLite 3 structures 33*b0d29bc4SBrooks Davis /// representing the database, and lightweight. 34*b0d29bc4SBrooks Davis 35*b0d29bc4SBrooks Davis #if !defined(UTILS_SQLITE_DATABASE_HPP) 36*b0d29bc4SBrooks Davis #define UTILS_SQLITE_DATABASE_HPP 37*b0d29bc4SBrooks Davis 38*b0d29bc4SBrooks Davis #include "utils/sqlite/database_fwd.hpp" 39*b0d29bc4SBrooks Davis 40*b0d29bc4SBrooks Davis extern "C" { 41*b0d29bc4SBrooks Davis #include <stdint.h> 42*b0d29bc4SBrooks Davis } 43*b0d29bc4SBrooks Davis 44*b0d29bc4SBrooks Davis #include <cstddef> 45*b0d29bc4SBrooks Davis #include <memory> 46*b0d29bc4SBrooks Davis 47*b0d29bc4SBrooks Davis #include "utils/fs/path_fwd.hpp" 48*b0d29bc4SBrooks Davis #include "utils/optional_fwd.hpp" 49*b0d29bc4SBrooks Davis #include "utils/sqlite/c_gate_fwd.hpp" 50*b0d29bc4SBrooks Davis #include "utils/sqlite/statement_fwd.hpp" 51*b0d29bc4SBrooks Davis #include "utils/sqlite/transaction_fwd.hpp" 52*b0d29bc4SBrooks Davis 53*b0d29bc4SBrooks Davis namespace utils { 54*b0d29bc4SBrooks Davis namespace sqlite { 55*b0d29bc4SBrooks Davis 56*b0d29bc4SBrooks Davis 57*b0d29bc4SBrooks Davis /// Constant for the database::open flags: open in read-only mode. 58*b0d29bc4SBrooks Davis static const int open_readonly = 1 << 0; 59*b0d29bc4SBrooks Davis /// Constant for the database::open flags: open in read-write mode. 60*b0d29bc4SBrooks Davis static const int open_readwrite = 1 << 1; 61*b0d29bc4SBrooks Davis /// Constant for the database::open flags: create on open. 62*b0d29bc4SBrooks Davis static const int open_create = 1 << 2; 63*b0d29bc4SBrooks Davis 64*b0d29bc4SBrooks Davis 65*b0d29bc4SBrooks Davis /// A RAII model for the SQLite 3 database. 66*b0d29bc4SBrooks Davis /// 67*b0d29bc4SBrooks Davis /// This class holds the database of the SQLite 3 interface during its existence 68*b0d29bc4SBrooks Davis /// and provides wrappers around several SQLite 3 library functions that operate 69*b0d29bc4SBrooks Davis /// on such database. 70*b0d29bc4SBrooks Davis /// 71*b0d29bc4SBrooks Davis /// These wrapper functions differ from the C versions in that they use the 72*b0d29bc4SBrooks Davis /// implicit database hold by the class, they use C++ types where appropriate 73*b0d29bc4SBrooks Davis /// and they use exceptions to report errors. 74*b0d29bc4SBrooks Davis /// 75*b0d29bc4SBrooks Davis /// The wrappers intend to be as lightweight as possible but, in some 76*b0d29bc4SBrooks Davis /// situations, they are pretty complex because of the workarounds needed to 77*b0d29bc4SBrooks Davis /// make the SQLite 3 more C++ friendly. We prefer a clean C++ interface over 78*b0d29bc4SBrooks Davis /// optimal efficiency, so this is OK. 79*b0d29bc4SBrooks Davis class database { 80*b0d29bc4SBrooks Davis struct impl; 81*b0d29bc4SBrooks Davis 82*b0d29bc4SBrooks Davis /// Pointer to the shared internal implementation. 83*b0d29bc4SBrooks Davis std::shared_ptr< impl > _pimpl; 84*b0d29bc4SBrooks Davis 85*b0d29bc4SBrooks Davis friend class database_c_gate; 86*b0d29bc4SBrooks Davis database(const utils::optional< utils::fs::path >&, void*, const bool); 87*b0d29bc4SBrooks Davis void* raw_database(void); 88*b0d29bc4SBrooks Davis 89*b0d29bc4SBrooks Davis public: 90*b0d29bc4SBrooks Davis ~database(void); 91*b0d29bc4SBrooks Davis 92*b0d29bc4SBrooks Davis static database in_memory(void); 93*b0d29bc4SBrooks Davis static database open(const fs::path&, int); 94*b0d29bc4SBrooks Davis static database temporary(void); 95*b0d29bc4SBrooks Davis void close(void); 96*b0d29bc4SBrooks Davis 97*b0d29bc4SBrooks Davis const utils::optional< utils::fs::path >& db_filename(void) const; 98*b0d29bc4SBrooks Davis 99*b0d29bc4SBrooks Davis void exec(const std::string&); 100*b0d29bc4SBrooks Davis 101*b0d29bc4SBrooks Davis transaction begin_transaction(void); 102*b0d29bc4SBrooks Davis statement create_statement(const std::string&); 103*b0d29bc4SBrooks Davis 104*b0d29bc4SBrooks Davis int64_t last_insert_rowid(void); 105*b0d29bc4SBrooks Davis }; 106*b0d29bc4SBrooks Davis 107*b0d29bc4SBrooks Davis 108*b0d29bc4SBrooks Davis } // namespace sqlite 109*b0d29bc4SBrooks Davis } // namespace utils 110*b0d29bc4SBrooks Davis 111*b0d29bc4SBrooks Davis #endif // !defined(UTILS_SQLITE_DATABASE_HPP) 112