ThinSQLite++
A thin, safe and convenient modern C++ wrapper for SQLite API.
Loading...
Searching...
No Matches
exception_iface.hpp
1/*
2 Copyright 2019 Eugene Gershnik
3
4 Use of this source code is governed by a BSD-style
5 license that can be found in the LICENSE file or at
6 https://github.com/gershnik/thinsqlitepp/blob/main/LICENSE
7*/
8
9#ifndef HEADER_SQLITEPP_EXCEPTION_IFACE_INCLUDED
10#define HEADER_SQLITEPP_EXCEPTION_IFACE_INCLUDED
11
12#include "config.hpp"
13
14#include <exception>
15#include <memory>
16#include <limits>
17
18namespace thinsqlitepp
19{
20 class database;
21 class exception;
22
37 class error
38 {
39 friend class exception;
40 private:
41 class free_message
42 {
43 public:
44 free_message() noexcept: _free(nullptr) {}
45 free_message(void (*free)(void *)) noexcept: _free(free) {}
46
47 void operator()(const char * message) const noexcept
48 { if (_free) _free(const_cast<char *>(message)); }
49
50 explicit operator bool() const noexcept
51 { return _free != nullptr; }
52 private:
53 void (*_free)(void *);
54 };
55
56 public:
59
60 public:
66 error(int error_code) noexcept;
67
77 error(int error_code, const database * db) noexcept;
78
80 error(int error_code, const std::unique_ptr<database> & db) noexcept:
81 error(error_code, db.get())
82 {}
84 error(int error_code, const database & db) noexcept:
85 error(error_code, &db)
86 {}
87
93 error(int error_code, message_ptr && error_message) noexcept:
94 _error_code(error_code),
95 _message(std::move(error_message))
96 {}
97
98 error(const error & src) noexcept:
99 _error_code(src._error_code),
100 _message(src._message.get_deleter() ? copy_message(src._message.get()) : message_ptr(src._message.get()))
101 {}
102 error(error && src) noexcept:
103 _error_code(src._error_code),
104 _message(std::move(src._message))
105 {}
106 ~error() noexcept = default;
107
108 error & operator=(error src) noexcept
109 {
110 swap(*this, src);
111 return *this;
112 }
113
114 friend void swap(error & lhs, error & rhs) noexcept
115 {
116 using std::swap;
117 swap(lhs._error_code, rhs._error_code);
118 swap(lhs._message, rhs._message);
119 }
120
122 int extended() const noexcept
123 { return _error_code; }
125 int primary() const noexcept
126 { return _error_code & 0x0FF; }
128 int system() const noexcept
129 { return _system_error_code; }
131 const char * message() const noexcept
132 { return _message.get(); }
133
141 { return std::move(_message); }
149 { return std::move(_message); }
150 private:
151 static message_ptr copy_message(const char * src) noexcept;
152 private:
153 int _error_code = 0;
154 int _system_error_code = 0;
155 message_ptr _message = nullptr;
156 };
157
166 {
167 public:
169 exception(class error && err) noexcept:
170 _error(std::move(err))
171 {}
173 exception(const class error & err) noexcept:
174 _error(err)
175 {}
178 exception(int error_code) noexcept:
179 _error(error_code)
180 {}
183 exception(int error_code, const database * db) noexcept:
184 _error(error_code, db)
185 {}
187 exception(int error_code, const std::unique_ptr<database> & db) noexcept:
188 _error(error_code, db)
189 {}
191 exception(int error_code, const database & db) noexcept:
192 _error(error_code, db)
193 {}
196 exception(int error_code, error::message_ptr && message) noexcept:
197 _error(error_code, std::move(message))
198 {}
199
201 int extended_error_code() const noexcept
202 { return _error.extended(); }
204 int primary_error_code() const noexcept
205 { return _error.primary(); }
207 int system_error_code() const noexcept
208 { return _error.system(); }
209
211 const class error & error() const & noexcept
212 { return _error; }
213
215 class error & error() & noexcept
216 { return _error; }
217
219 class error && error() && noexcept
220 { return std::move(_error); }
221
228 const char * what() const noexcept override;
229
230 private:
231 class error _error;
232 };
233
235
236 inline int int_size(size_t size)
237 {
239 throw exception(SQLITE_TOOBIG);
240 return int(size);
241 }
242
243 inline sqlite3_int64 int64_size(size_t size)
244 {
245 if (size > size_t(std::numeric_limits<sqlite3_int64>::max()))
246 throw exception(SQLITE_TOOBIG);
247 return sqlite3_int64(size);
248 }
249
251
253}
254
255#endif
Database Connection.
Definition database_iface.hpp:108
Carries information about SQLite error.
Definition exception_iface.hpp:38
int primary() const noexcept
Returns primary error code part.
Definition exception_iface.hpp:125
error(int error_code, const database &db) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition exception_iface.hpp:84
int extended() const noexcept
Returns full extended error code.
Definition exception_iface.hpp:122
message_ptr extract_message() &&noexcept
Move the message out of this object.
Definition exception_iface.hpp:148
const char * message() const noexcept
Returns error message or nullptr, if not available.
Definition exception_iface.hpp:131
std::unique_ptr< const char, free_message > message_ptr
An owning pointer to SQLite error message.
Definition exception_iface.hpp:58
error(int error_code, const std::unique_ptr< database > &db) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition exception_iface.hpp:80
error(int error_code) noexcept
Constructs an instance from database independent error code.
message_ptr extract_message() &noexcept
Move the message out of this object.
Definition exception_iface.hpp:140
int system() const noexcept
Returns system errno error code, if available.
Definition exception_iface.hpp:128
error(int error_code, const database *db) noexcept
Constructs an instance from the last error reported from a database.
error(int error_code, message_ptr &&error_message) noexcept
Constructs an instance with a given error code and message.
Definition exception_iface.hpp:93
Exception used to report any SQLite errors.
Definition exception_iface.hpp:166
int system_error_code() const noexcept
Returns system errno error code of the stored error, if available.
Definition exception_iface.hpp:207
exception(int error_code, error::message_ptr &&message) noexcept
Constructs an instance with a given error code and message.
Definition exception_iface.hpp:196
int extended_error_code() const noexcept
Returns full extended error code of the stored error.
Definition exception_iface.hpp:201
exception(class error &&err) noexcept
Constructs an instance by moving an error in.
Definition exception_iface.hpp:169
exception(int error_code, const database *db) noexcept
Constructs an instance from the last error reported from a database.
Definition exception_iface.hpp:183
exception(int error_code) noexcept
Constructs an instance from database independent error code.
Definition exception_iface.hpp:178
class error & error() &noexcept
Returns the stored error.
Definition exception_iface.hpp:215
exception(const class error &err) noexcept
Constructs an instance by copying an error.
Definition exception_iface.hpp:173
int primary_error_code() const noexcept
Returns primary error code part of the stored error.
Definition exception_iface.hpp:204
class error && error() &&noexcept
Returns the stored error.
Definition exception_iface.hpp:219
const char * what() const noexcept override
Returns error message.
const class error & error() const &noexcept
Returns the stored error.
Definition exception_iface.hpp:211
exception(int error_code, const database &db) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition exception_iface.hpp:191
exception(int error_code, const std::unique_ptr< database > &db) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition exception_iface.hpp:187
T get(T... args)
ThinSQLite++ namespace.
Definition backup_iface.hpp:17
T swap(T... args)