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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/******************************************************************************
* Project: PROJ
* Purpose: SQLite3 related utilities
* Author: Even Rouault, <even.rouault at spatialys.com>
*
******************************************************************************
* Copyright (c) 2019, Even Rouault, <even.rouault at spatialys.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#ifndef SQLITE3_HPP_INCLUDED
#define SQLITE3_HPP_INCLUDED
#include <memory>
#include <sqlite3.h>
#include "proj.h"
#include "proj/util.hpp"
NS_PROJ_START
//! @cond Doxygen_Suppress
class SQLite3VFS {
sqlite3_vfs *vfs_ = nullptr;
explicit SQLite3VFS(sqlite3_vfs *vfs);
SQLite3VFS(const SQLite3VFS &) = delete;
SQLite3VFS &operator=(const SQLite3VFS &) = delete;
public:
~SQLite3VFS();
static std::unique_ptr<SQLite3VFS> create(bool fakeSync, bool fakeLock,
bool skipStatJournalAndWAL);
const char *name() const;
sqlite3_vfs *raw() { return vfs_; }
};
// ---------------------------------------------------------------------------
class SQLiteStatement {
sqlite3_stmt *hStmt = nullptr;
int iBindIdx = 1;
int iResIdx = 0;
SQLiteStatement(const SQLiteStatement &) = delete;
SQLiteStatement &operator=(const SQLiteStatement &) = delete;
public:
explicit SQLiteStatement(sqlite3_stmt *hStmtIn);
~SQLiteStatement() { sqlite3_finalize(hStmt); }
int execute() { return sqlite3_step(hStmt); }
void bindNull() {
sqlite3_bind_null(hStmt, iBindIdx);
iBindIdx++;
}
void bindText(const char *txt) {
sqlite3_bind_text(hStmt, iBindIdx, txt, -1, nullptr);
iBindIdx++;
}
void bindInt64(sqlite3_int64 v) {
sqlite3_bind_int64(hStmt, iBindIdx, v);
iBindIdx++;
}
void bindBlob(const void *blob, size_t blob_size) {
sqlite3_bind_blob(hStmt, iBindIdx, blob, static_cast<int>(blob_size),
nullptr);
iBindIdx++;
}
const char *getText() {
auto ret = sqlite3_column_text(hStmt, iResIdx);
iResIdx++;
return reinterpret_cast<const char *>(ret);
}
sqlite3_int64 getInt64() {
auto ret = sqlite3_column_int64(hStmt, iResIdx);
iResIdx++;
return ret;
}
const void *getBlob(int &size) {
size = sqlite3_column_bytes(hStmt, iResIdx);
auto ret = sqlite3_column_blob(hStmt, iResIdx);
iResIdx++;
return ret;
}
void reset() {
sqlite3_reset(hStmt);
iBindIdx = 1;
iResIdx = 0;
}
void resetResIndex() { iResIdx = 0; }
};
//! @endcond Doxygen_Suppress
NS_PROJ_END
#endif // SQLITE3_HPP_INCLUDED
|