Branch data Line data Source code
1 : : /******************************************************************************
2 : : ------------- Copyright (c) 2009-2023 H a r a l d A c h i t z ---------------
3 : : ---------- < h a r a l d dot a c h i t z at g m a i l dot c o m > ------------
4 : : ---- This Source Code Form is subject to the terms of the Mozilla Public -----
5 : : ---- License, v. 2.0. If a copy of the MPL was not distributed with this -----
6 : : ---------- file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------
7 : : ******************************************************************************/
8 : :
9 : : #ifndef SL3_CONNECTION_HPP_
10 : : #define SL3_CONNECTION_HPP_
11 : :
12 : : #include <sl3/database.hpp>
13 : :
14 : : struct sqlite3;
15 : :
16 : : namespace sl3
17 : : {
18 : : /// \cond HIDDEN_SYMBOLS
19 : : namespace internal
20 : : {
21 : : /**
22 : : * \internal
23 : : * \brief Holds the sqlite3 connection pointer.
24 : : *
25 : : * This is the link between Database and Command , and only used internal
26 : : *
27 : : */
28 : : class Connection
29 : : {
30 : : friend class sl3::Database;
31 : :
32 : : Connection (sqlite3* p);
33 : :
34 : : public:
35 : : ~Connection ();
36 : :
37 : : /// return db pointer
38 : : sqlite3* db ();
39 : :
40 : : /// return if connection is open
41 : : bool isValid ();
42 : :
43 : : /// throw ErrNoConnection if not valid
44 : : void ensureValid ();
45 : :
46 : : private:
47 : : Connection (Connection&&) = default;
48 : :
49 : : Connection (const Connection&) = delete;
50 : : Connection& operator= (const Connection&) = delete;
51 : : Connection& operator= (Connection&&) = delete;
52 : :
53 : : void close (); // called by the db
54 : :
55 : : sqlite3* sl3db;
56 : : };
57 : : }
58 : : ///\endcond
59 : :
60 : : namespace internal
61 : : {
62 : 112 : inline Connection::Connection (sqlite3* p)
63 : 112 : : sl3db (p)
64 : : {
65 : 112 : }
66 : :
67 : 112 : inline Connection::~Connection () { close (); }
68 : :
69 : : inline sqlite3*
70 : 344 : Connection::db ()
71 : : {
72 : 344 : return sl3db;
73 : : }
74 : :
75 : : inline bool
76 : 98 : Connection::isValid ()
77 : : {
78 : 98 : return sl3db != nullptr;
79 : : }
80 : :
81 : : inline void
82 : 228 : Connection::ensureValid ()
83 : : {
84 [ + + ]: 228 : if (sl3db == nullptr)
85 : : {
86 [ + - ]: 7 : throw ErrNoConnection ();
87 : : }
88 : 221 : }
89 : :
90 : : inline void
91 : 224 : Connection::close ()
92 : : {
93 [ + + ]: 224 : if (sl3db == nullptr)
94 : 123 : return;
95 : :
96 : : // total clean up to be sure nothing left.
97 : 101 : auto stm = sqlite3_next_stmt (sl3db, 0);
98 [ + + ]: 105 : while (stm != nullptr)
99 : : {
100 : 4 : sqlite3_finalize (stm);
101 : 4 : stm = sqlite3_next_stmt (sl3db, 0);
102 : : }
103 : :
104 : : // if busy, use v2 for garbed collecting,
105 [ - + ]: 101 : if (sqlite3_close (sl3db) != SQLITE_OK)
106 : : { // but that should 'never' happen :-)
107 : : sqlite3_close_v2 (sl3db); // LCOV_EXCL_LINE
108 : : }
109 : :
110 : 101 : sl3db = nullptr;
111 : : }
112 : :
113 : : } // ns internal
114 : : }
115 : :
116 : : #endif /* ...DATABASE_HPP_ */
|