-
Notifications
You must be signed in to change notification settings - Fork 20
/
context.cpp
101 lines (80 loc) · 2.18 KB
/
context.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// (c) 2013, 2014 Stephan Hohe
#include "context.hpp"
#include <sqlite3.h>
#include <cstring>
namespace sqxx {
void context::result_error_misuse() {
result_error_code(SQLITE_MISUSE);
}
void context::result_error(const char *msg) {
sqlite3_result_error(handle, msg, -1);
}
void context::result_error_code(int code) {
sqlite3_result_error_code(handle, code);
}
void context::result_error_nomem() {
sqlite3_result_error_nomem(handle);
}
void context::result_null() {
result();
}
void context::result() {
sqlite3_result_null(handle);
}
template<>
void context::result<int>(int value) {
sqlite3_result_int(handle, value);
}
template<>
void context::result<int64_t>(int64_t value) {
sqlite3_result_int64(handle, value);
}
template<>
void context::result<double>(double value) {
sqlite3_result_double(handle, value);
}
template<>
void context::result(const char *value, bool copy) {
if (value) {
#if SQLITE_VERSION_NUMBER >= 3008007
sqlite3_result_text64(handle, value, std::strlen(value), (copy ? SQLITE_TRANSIENT : SQLITE_STATIC), SQLITE_UTF8);
#else
sqlite3_result_text(handle, value, -1, (copy ? SQLITE_TRANSIENT : SQLITE_STATIC));
#endif
}
else {
sqlite3_result_null(handle);
}
}
template<>
void context::result(const std::string &value, bool copy) {
#if SQLITE_VERSION_NUMBER >= 3008007
sqlite3_result_text64(handle, value.c_str(), value.length(), (copy ? SQLITE_TRANSIENT : SQLITE_STATIC), SQLITE_UTF8);
#else
sqlite3_result_text(handle, value.c_str(), value.length(), (copy ? SQLITE_TRANSIENT : SQLITE_STATIC));
#endif
}
template<>
void context::result(const blob &value, bool copy) {
if (value.data) {
#if SQLITE_VERSION_NUMBER >= 3008007
sqlite3_result_blob64(handle, value.data, value.length, (copy ? SQLITE_TRANSIENT : SQLITE_STATIC));
#else
sqlite3_result_blob(handle, value.data, value.length, (copy ? SQLITE_TRANSIENT : SQLITE_STATIC));
#endif
}
else {
#if SQLITE_VERSION_NUMBER >= 3008011
sqlite3_result_zeroblob64(handle, value.length);
#else
sqlite3_result_zeroblob(handle, value.length);
#endif
}
}
void* context::aggregate_context(int bytes) {
return sqlite3_aggregate_context(handle, bytes);
}
sqlite3_context* context::raw() {
return handle;
}
} // namespace sqxx