rrudb 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/LICENSE.txt +22 -0
- data/README.md +26 -0
- data/examples/example.rb +39 -0
- data/ext/rudb/NuDB/include/nudb/CMakeLists.txt +104 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/basic_seconds_clock.hpp +200 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/chrono_util.hpp +58 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/test/fail_file.hpp +343 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/test/temp_dir.hpp +73 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/test/test_store.hpp +451 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/test/xor_shift_engine.hpp +105 -0
- data/ext/rudb/NuDB/include/nudb/_experimental/util.hpp +288 -0
- data/ext/rudb/NuDB/include/nudb/basic_store.hpp +461 -0
- data/ext/rudb/NuDB/include/nudb/concepts.hpp +205 -0
- data/ext/rudb/NuDB/include/nudb/context.hpp +144 -0
- data/ext/rudb/NuDB/include/nudb/create.hpp +117 -0
- data/ext/rudb/NuDB/include/nudb/detail/arena.hpp +296 -0
- data/ext/rudb/NuDB/include/nudb/detail/bucket.hpp +473 -0
- data/ext/rudb/NuDB/include/nudb/detail/buffer.hpp +86 -0
- data/ext/rudb/NuDB/include/nudb/detail/bulkio.hpp +196 -0
- data/ext/rudb/NuDB/include/nudb/detail/cache.hpp +236 -0
- data/ext/rudb/NuDB/include/nudb/detail/endian.hpp +93 -0
- data/ext/rudb/NuDB/include/nudb/detail/field.hpp +265 -0
- data/ext/rudb/NuDB/include/nudb/detail/format.hpp +630 -0
- data/ext/rudb/NuDB/include/nudb/detail/gentex.hpp +259 -0
- data/ext/rudb/NuDB/include/nudb/detail/mutex.hpp +26 -0
- data/ext/rudb/NuDB/include/nudb/detail/pool.hpp +243 -0
- data/ext/rudb/NuDB/include/nudb/detail/store_base.hpp +45 -0
- data/ext/rudb/NuDB/include/nudb/detail/stream.hpp +149 -0
- data/ext/rudb/NuDB/include/nudb/detail/xxhash.hpp +328 -0
- data/ext/rudb/NuDB/include/nudb/error.hpp +257 -0
- data/ext/rudb/NuDB/include/nudb/file.hpp +55 -0
- data/ext/rudb/NuDB/include/nudb/impl/basic_store.ipp +785 -0
- data/ext/rudb/NuDB/include/nudb/impl/context.ipp +241 -0
- data/ext/rudb/NuDB/include/nudb/impl/create.ipp +163 -0
- data/ext/rudb/NuDB/include/nudb/impl/error.ipp +175 -0
- data/ext/rudb/NuDB/include/nudb/impl/posix_file.ipp +248 -0
- data/ext/rudb/NuDB/include/nudb/impl/recover.ipp +209 -0
- data/ext/rudb/NuDB/include/nudb/impl/rekey.ipp +248 -0
- data/ext/rudb/NuDB/include/nudb/impl/verify.ipp +634 -0
- data/ext/rudb/NuDB/include/nudb/impl/visit.ipp +96 -0
- data/ext/rudb/NuDB/include/nudb/impl/win32_file.ipp +264 -0
- data/ext/rudb/NuDB/include/nudb/native_file.hpp +76 -0
- data/ext/rudb/NuDB/include/nudb/nudb.hpp +27 -0
- data/ext/rudb/NuDB/include/nudb/posix_file.hpp +228 -0
- data/ext/rudb/NuDB/include/nudb/progress.hpp +32 -0
- data/ext/rudb/NuDB/include/nudb/recover.hpp +73 -0
- data/ext/rudb/NuDB/include/nudb/rekey.hpp +110 -0
- data/ext/rudb/NuDB/include/nudb/store.hpp +27 -0
- data/ext/rudb/NuDB/include/nudb/type_traits.hpp +63 -0
- data/ext/rudb/NuDB/include/nudb/verify.hpp +200 -0
- data/ext/rudb/NuDB/include/nudb/version.hpp +21 -0
- data/ext/rudb/NuDB/include/nudb/visit.hpp +63 -0
- data/ext/rudb/NuDB/include/nudb/win32_file.hpp +246 -0
- data/ext/rudb/NuDB/include/nudb/xxhasher.hpp +45 -0
- data/ext/rudb/extconf.rb +12 -0
- data/ext/rudb/rudb.cpp +234 -0
- data/lib/rudb/version.rb +3 -0
- data/lib/rudb.rb +1 -0
- metadata +104 -0
@@ -0,0 +1,328 @@
|
|
1
|
+
//
|
2
|
+
// Copyright (c) 2015-2016 Vinnie Falco (vinnie dot falco at gmail dot com)
|
3
|
+
//
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
//
|
8
|
+
// This is a derivative work based on xxHash 0.6.2, copyright below:
|
9
|
+
/*
|
10
|
+
xxHash - Extremely Fast Hash algorithm
|
11
|
+
Header File
|
12
|
+
Copyright (C) 2012-2016, Yann Collet.
|
13
|
+
|
14
|
+
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
15
|
+
|
16
|
+
Redistribution and use in source and binary forms, with or without
|
17
|
+
modification, are permitted provided that the following conditions are
|
18
|
+
met:
|
19
|
+
|
20
|
+
* Redistributions of source code must retain the above copyright
|
21
|
+
notice, this list of conditions and the following disclaimer.
|
22
|
+
* Redistributions in binary form must reproduce the above
|
23
|
+
copyright notice, this list of conditions and the following disclaimer
|
24
|
+
in the documentation and/or other materials provided with the
|
25
|
+
distribution.
|
26
|
+
|
27
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
28
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
29
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
30
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
31
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
32
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
33
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
34
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
35
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
36
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
37
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
38
|
+
|
39
|
+
You can contact the author at :
|
40
|
+
- xxHash source repository : https://github.com/Cyan4973/xxHash
|
41
|
+
*/
|
42
|
+
|
43
|
+
#ifndef NUDB_DETAIL_XXHASH_HPP
|
44
|
+
#define NUDB_DETAIL_XXHASH_HPP
|
45
|
+
|
46
|
+
#include <nudb/detail/endian.hpp>
|
47
|
+
#include <cstdint>
|
48
|
+
#include <cstdlib>
|
49
|
+
#include <cstring>
|
50
|
+
|
51
|
+
namespace nudb {
|
52
|
+
namespace detail {
|
53
|
+
|
54
|
+
#define NUDB_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
55
|
+
|
56
|
+
// minGW _rotl gives poor performance
|
57
|
+
#if defined(_MSC_VER)
|
58
|
+
# define NUDB_XXH_rotl64(x,r) _rotl64(x,r)
|
59
|
+
#else
|
60
|
+
# define NUDB_XXH_rotl64(x,r) ((x << r) | (x >> (64 - r)))
|
61
|
+
#endif
|
62
|
+
|
63
|
+
#if defined(_MSC_VER)
|
64
|
+
# define NUDB_XXH_swap32 _byteswap_ulong
|
65
|
+
#elif NUDB_GCC_VERSION >= 403
|
66
|
+
# define NUDB_XXH_swap32 __builtin_bswap32
|
67
|
+
#endif
|
68
|
+
|
69
|
+
#if defined(_MSC_VER)
|
70
|
+
# define NUDB_XXH_swap64 _byteswap_uint64
|
71
|
+
#elif NUDB_GCC_VERSION >= 403
|
72
|
+
# define NUDB_XXH_swap64 __builtin_bswap64
|
73
|
+
#endif
|
74
|
+
|
75
|
+
#ifndef NUDB_XXH_swap32
|
76
|
+
inline
|
77
|
+
std::uint32_t
|
78
|
+
NUDB_XXH_swap32(std::uint32_t x)
|
79
|
+
{
|
80
|
+
return ((x << 24) & 0xff000000 ) |
|
81
|
+
((x << 8) & 0x00ff0000 ) |
|
82
|
+
((x >> 8) & 0x0000ff00 ) |
|
83
|
+
((x >> 24) & 0x000000ff );
|
84
|
+
}
|
85
|
+
#endif
|
86
|
+
|
87
|
+
#ifndef NUDB_XXH_swap64
|
88
|
+
inline
|
89
|
+
std::uint64_t
|
90
|
+
NUDB_XXH_swap64(std::uint64_t x)
|
91
|
+
{
|
92
|
+
return ((x << 56) & 0xff00000000000000ULL) |
|
93
|
+
((x << 40) & 0x00ff000000000000ULL) |
|
94
|
+
((x << 24) & 0x0000ff0000000000ULL) |
|
95
|
+
((x << 8) & 0x000000ff00000000ULL) |
|
96
|
+
((x >> 8) & 0x00000000ff000000ULL) |
|
97
|
+
((x >> 24) & 0x0000000000ff0000ULL) |
|
98
|
+
((x >> 40) & 0x000000000000ff00ULL) |
|
99
|
+
((x >> 56) & 0x00000000000000ffULL);
|
100
|
+
}
|
101
|
+
#endif
|
102
|
+
|
103
|
+
static std::uint64_t constexpr prime64_1 = 11400714785074694791ULL;
|
104
|
+
static std::uint64_t constexpr prime64_2 = 14029467366897019727ULL;
|
105
|
+
static std::uint64_t constexpr prime64_3 = 1609587929392839161ULL;
|
106
|
+
static std::uint64_t constexpr prime64_4 = 9650029242287828579ULL;
|
107
|
+
static std::uint64_t constexpr prime64_5 = 2870177450012600261ULL;
|
108
|
+
|
109
|
+
// Portable and safe solution. Generally efficient.
|
110
|
+
// see : http://stackoverflow.com/a/32095106/646947
|
111
|
+
|
112
|
+
inline
|
113
|
+
std::uint32_t
|
114
|
+
XXH_read32(void const* p)
|
115
|
+
{
|
116
|
+
std::uint32_t v;
|
117
|
+
memcpy(&v, p, sizeof(v));
|
118
|
+
return v;
|
119
|
+
}
|
120
|
+
|
121
|
+
inline
|
122
|
+
std::uint64_t
|
123
|
+
XXH_read64(void const* p)
|
124
|
+
{
|
125
|
+
std::uint64_t v;
|
126
|
+
memcpy(&v, p, sizeof(v));
|
127
|
+
return v;
|
128
|
+
}
|
129
|
+
|
130
|
+
// little endian, aligned
|
131
|
+
inline
|
132
|
+
std::uint32_t
|
133
|
+
XXH_readLE32_align(void const* p, std::true_type, std::true_type)
|
134
|
+
{
|
135
|
+
return *reinterpret_cast<std::uint32_t const*>(p);
|
136
|
+
}
|
137
|
+
|
138
|
+
// little endian, unaligned
|
139
|
+
inline
|
140
|
+
std::uint32_t
|
141
|
+
XXH_readLE32_align(void const* p, std::true_type, std::false_type)
|
142
|
+
{
|
143
|
+
return XXH_read32(p);
|
144
|
+
}
|
145
|
+
|
146
|
+
// big endian, aligned
|
147
|
+
inline
|
148
|
+
std::uint32_t
|
149
|
+
XXH_readLE32_align(void const* p, std::false_type, std::true_type)
|
150
|
+
{
|
151
|
+
return NUDB_XXH_swap32(
|
152
|
+
*reinterpret_cast<std::uint32_t const*>(p));
|
153
|
+
}
|
154
|
+
|
155
|
+
// big endian, unaligned
|
156
|
+
inline
|
157
|
+
std::uint32_t
|
158
|
+
XXH_readLE32_align(void const* p, std::false_type, std::false_type)
|
159
|
+
{
|
160
|
+
return NUDB_XXH_swap32(XXH_read32(p));
|
161
|
+
}
|
162
|
+
|
163
|
+
// little endian, aligned
|
164
|
+
inline
|
165
|
+
std::uint64_t
|
166
|
+
XXH_readLE64_align(void const* p, std::true_type, std::true_type)
|
167
|
+
{
|
168
|
+
return *reinterpret_cast<std::uint64_t const*>(p);
|
169
|
+
}
|
170
|
+
|
171
|
+
// little endian, unaligned
|
172
|
+
inline
|
173
|
+
std::uint64_t
|
174
|
+
XXH_readLE64_align(void const* p, std::true_type, std::false_type)
|
175
|
+
{
|
176
|
+
return XXH_read64(p);
|
177
|
+
}
|
178
|
+
|
179
|
+
// big endian, aligned
|
180
|
+
inline
|
181
|
+
std::uint64_t
|
182
|
+
XXH_readLE64_align(void const* p, std::false_type, std::true_type)
|
183
|
+
{
|
184
|
+
return NUDB_XXH_swap64(
|
185
|
+
*reinterpret_cast<std::uint64_t const*>(p));
|
186
|
+
}
|
187
|
+
|
188
|
+
// big endian, unaligned
|
189
|
+
inline
|
190
|
+
std::uint64_t
|
191
|
+
XXH_readLE64_align(void const* p, std::false_type, std::false_type)
|
192
|
+
{
|
193
|
+
return NUDB_XXH_swap64(XXH_read64(p));
|
194
|
+
}
|
195
|
+
|
196
|
+
inline
|
197
|
+
std::uint64_t
|
198
|
+
XXH64_round(std::uint64_t acc, std::uint64_t input)
|
199
|
+
{
|
200
|
+
acc += input * prime64_2;
|
201
|
+
acc = NUDB_XXH_rotl64(acc, 31);
|
202
|
+
acc *= prime64_1;
|
203
|
+
return acc;
|
204
|
+
}
|
205
|
+
|
206
|
+
inline
|
207
|
+
std::uint64_t
|
208
|
+
XXH64_mergeRound(std::uint64_t acc, std::uint64_t val)
|
209
|
+
{
|
210
|
+
val = XXH64_round(0, val);
|
211
|
+
acc ^= val;
|
212
|
+
acc = acc * prime64_1 + prime64_4;
|
213
|
+
return acc;
|
214
|
+
}
|
215
|
+
|
216
|
+
template<bool LittleEndian, bool Aligned>
|
217
|
+
std::uint64_t
|
218
|
+
XXH64_endian_align(
|
219
|
+
void const* input, std::size_t len, std::uint64_t seed,
|
220
|
+
std::integral_constant<bool, LittleEndian> endian,
|
221
|
+
std::integral_constant<bool, Aligned> align)
|
222
|
+
{
|
223
|
+
const std::uint8_t* p = (const std::uint8_t*)input;
|
224
|
+
const std::uint8_t* const bEnd = p + len;
|
225
|
+
std::uint64_t h64;
|
226
|
+
auto const XXH_get32bits =
|
227
|
+
[](void const* p)
|
228
|
+
{
|
229
|
+
return XXH_readLE32_align(p,
|
230
|
+
decltype(endian){}, decltype(align){});
|
231
|
+
};
|
232
|
+
auto const XXH_get64bits =
|
233
|
+
[](void const* p)
|
234
|
+
{
|
235
|
+
return XXH_readLE64_align(p,
|
236
|
+
decltype(endian){}, decltype(align){});
|
237
|
+
};
|
238
|
+
if(len>=32)
|
239
|
+
{
|
240
|
+
const std::uint8_t* const limit = bEnd - 32;
|
241
|
+
std::uint64_t v1 = seed + prime64_1 + prime64_2;
|
242
|
+
std::uint64_t v2 = seed + prime64_2;
|
243
|
+
std::uint64_t v3 = seed + 0;
|
244
|
+
std::uint64_t v4 = seed - prime64_1;
|
245
|
+
|
246
|
+
do
|
247
|
+
{
|
248
|
+
v1 = XXH64_round(v1, XXH_get64bits(p)); p+=8;
|
249
|
+
v2 = XXH64_round(v2, XXH_get64bits(p)); p+=8;
|
250
|
+
v3 = XXH64_round(v3, XXH_get64bits(p)); p+=8;
|
251
|
+
v4 = XXH64_round(v4, XXH_get64bits(p)); p+=8;
|
252
|
+
}
|
253
|
+
while(p<=limit);
|
254
|
+
|
255
|
+
h64 = NUDB_XXH_rotl64(v1, 1) +
|
256
|
+
NUDB_XXH_rotl64(v2, 7) +
|
257
|
+
NUDB_XXH_rotl64(v3, 12) +
|
258
|
+
NUDB_XXH_rotl64(v4, 18);
|
259
|
+
h64 = XXH64_mergeRound(h64, v1);
|
260
|
+
h64 = XXH64_mergeRound(h64, v2);
|
261
|
+
h64 = XXH64_mergeRound(h64, v3);
|
262
|
+
h64 = XXH64_mergeRound(h64, v4);
|
263
|
+
}
|
264
|
+
else
|
265
|
+
{
|
266
|
+
h64 = seed + prime64_5;
|
267
|
+
}
|
268
|
+
h64 += len;
|
269
|
+
while(p + 8 <= bEnd)
|
270
|
+
{
|
271
|
+
std::uint64_t const k1 = XXH64_round(0, XXH_get64bits(p));
|
272
|
+
h64 ^= k1;
|
273
|
+
h64 = NUDB_XXH_rotl64(h64,27) * prime64_1 + prime64_4;
|
274
|
+
p+=8;
|
275
|
+
}
|
276
|
+
if(p+4<=bEnd)
|
277
|
+
{
|
278
|
+
h64 ^= (std::uint64_t)(XXH_get32bits(p)) * prime64_1;
|
279
|
+
h64 = NUDB_XXH_rotl64(h64, 23) * prime64_2 + prime64_3;
|
280
|
+
p+=4;
|
281
|
+
}
|
282
|
+
while(p<bEnd)
|
283
|
+
{
|
284
|
+
h64 ^= (*p) * prime64_5;
|
285
|
+
h64 = NUDB_XXH_rotl64(h64, 11) * prime64_1;
|
286
|
+
p++;
|
287
|
+
}
|
288
|
+
h64 ^= h64 >> 33;
|
289
|
+
h64 *= prime64_2;
|
290
|
+
h64 ^= h64 >> 29;
|
291
|
+
h64 *= prime64_3;
|
292
|
+
h64 ^= h64 >> 32;
|
293
|
+
return h64;
|
294
|
+
}
|
295
|
+
|
296
|
+
/* Calculate the 64-bit hash of a block of memory.
|
297
|
+
|
298
|
+
@param data A pointer to the buffer to compute the hash on.
|
299
|
+
The buffer may be unaligned.
|
300
|
+
|
301
|
+
@note This function runs faster on 64-bits systems, but slower
|
302
|
+
on 32-bits systems (see benchmark).
|
303
|
+
|
304
|
+
@param bytes The size of the buffer in bytes.
|
305
|
+
|
306
|
+
@param seed A value which may be used to permute the output.
|
307
|
+
Using a different seed with the same input will produce a
|
308
|
+
different value.
|
309
|
+
|
310
|
+
@return The 64-bit hash of the input data.
|
311
|
+
*/
|
312
|
+
template<class = void>
|
313
|
+
std::uint64_t
|
314
|
+
XXH64(void const* data, size_t bytes, std::uint64_t seed)
|
315
|
+
{
|
316
|
+
// Use faster algorithm if aligned
|
317
|
+
if((reinterpret_cast<std::uintptr_t>(data) & 7) == 0)
|
318
|
+
return XXH64_endian_align(data, bytes, seed,
|
319
|
+
is_little_endian{}, std::false_type{});
|
320
|
+
return XXH64_endian_align(data, bytes, seed,
|
321
|
+
is_little_endian{}, std::true_type{});
|
322
|
+
}
|
323
|
+
|
324
|
+
} // detail
|
325
|
+
} // nudb
|
326
|
+
|
327
|
+
#endif
|
328
|
+
|
@@ -0,0 +1,257 @@
|
|
1
|
+
//
|
2
|
+
// Copyright (c) 2015-2016 Vinnie Falco (vinnie dot falco at gmail dot com)
|
3
|
+
//
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
|
8
|
+
#ifndef NUDB_ERROR_HPP
|
9
|
+
#define NUDB_ERROR_HPP
|
10
|
+
|
11
|
+
#include <boost/system/system_error.hpp>
|
12
|
+
#include <boost/system/error_code.hpp>
|
13
|
+
|
14
|
+
namespace nudb {
|
15
|
+
|
16
|
+
/// The type of system-specific error code returned by the implementation
|
17
|
+
#if GENERATING_DOCS
|
18
|
+
class error_code{};
|
19
|
+
|
20
|
+
#else
|
21
|
+
using boost::system::error_code;
|
22
|
+
|
23
|
+
#endif
|
24
|
+
|
25
|
+
/// The type of cross-platform error code used by the implementation
|
26
|
+
#if GENERATING_DOCS
|
27
|
+
class error_condition{};
|
28
|
+
|
29
|
+
#else
|
30
|
+
using boost::system::error_condition;
|
31
|
+
|
32
|
+
#endif
|
33
|
+
|
34
|
+
/// The type of system-specific exception used when throwing
|
35
|
+
#if GENERATING_DOCS
|
36
|
+
class system_error{};
|
37
|
+
|
38
|
+
#else
|
39
|
+
using boost::system::system_error;
|
40
|
+
|
41
|
+
#endif
|
42
|
+
|
43
|
+
/// Returns the category used for system-specific error codes
|
44
|
+
#if GENERATING_DOCS
|
45
|
+
error_category const&
|
46
|
+
system_category();
|
47
|
+
|
48
|
+
#else
|
49
|
+
using boost::system::system_category;
|
50
|
+
|
51
|
+
#endif
|
52
|
+
|
53
|
+
/// Returns the category used for cross-platform error codes
|
54
|
+
#if GENERATING_DOCS
|
55
|
+
error_category const&
|
56
|
+
generic_category();
|
57
|
+
|
58
|
+
#else
|
59
|
+
using boost::system::generic_category;
|
60
|
+
|
61
|
+
#endif
|
62
|
+
|
63
|
+
/// The base class used for error categories
|
64
|
+
#if GENERATING_DOCS
|
65
|
+
class error_category{};
|
66
|
+
|
67
|
+
#else
|
68
|
+
using boost::system::error_category;
|
69
|
+
|
70
|
+
#endif
|
71
|
+
|
72
|
+
/// The set of constants used for cross-platform error codes
|
73
|
+
#if GENERATING_DOCS
|
74
|
+
enum errc{};
|
75
|
+
|
76
|
+
#else
|
77
|
+
namespace errc = boost::system::errc;
|
78
|
+
|
79
|
+
#endif
|
80
|
+
|
81
|
+
/// Database error codes.
|
82
|
+
enum class error
|
83
|
+
{
|
84
|
+
/** The specified key was not found.
|
85
|
+
|
86
|
+
Returned when @ref basic_store::fetch does not
|
87
|
+
find the specified key.
|
88
|
+
*/
|
89
|
+
key_not_found,
|
90
|
+
|
91
|
+
/** The specified key already exists.
|
92
|
+
|
93
|
+
Returned when @ref basic_store::insert finds
|
94
|
+
the specified key already in the database.
|
95
|
+
*/
|
96
|
+
key_exists,
|
97
|
+
|
98
|
+
/** A file read returned less data than expected.
|
99
|
+
|
100
|
+
This can be caused by premature application
|
101
|
+
termination during a commit cycle.
|
102
|
+
*/
|
103
|
+
short_read,
|
104
|
+
|
105
|
+
/** A log file is present.
|
106
|
+
|
107
|
+
Indicates that the database needs to have the
|
108
|
+
associated log file applied to perform a recovery.
|
109
|
+
This error is returned by functions such as @ref rekey.
|
110
|
+
*/
|
111
|
+
log_file_exists,
|
112
|
+
|
113
|
+
/** No key file exists.
|
114
|
+
|
115
|
+
This error is returned by the recover process when
|
116
|
+
there is no valid key file. It happens when a
|
117
|
+
@ref rekey operation prematurely terminates. A
|
118
|
+
database without a key file cannot be opened. To
|
119
|
+
fix this error, it is necessary for an invocation of
|
120
|
+
@ref rekey to complete successfully.
|
121
|
+
*/
|
122
|
+
no_key_file,
|
123
|
+
|
124
|
+
/// Too many buckets in key file
|
125
|
+
too_many_buckets,
|
126
|
+
|
127
|
+
/// Not a data file
|
128
|
+
not_data_file,
|
129
|
+
|
130
|
+
/// Not a key file
|
131
|
+
not_key_file,
|
132
|
+
|
133
|
+
/// Not a log file
|
134
|
+
not_log_file,
|
135
|
+
|
136
|
+
/// Different version
|
137
|
+
different_version,
|
138
|
+
|
139
|
+
/// Invalid key size
|
140
|
+
invalid_key_size,
|
141
|
+
|
142
|
+
/// Invalid block size
|
143
|
+
invalid_block_size,
|
144
|
+
|
145
|
+
/// Short key file
|
146
|
+
short_key_file,
|
147
|
+
|
148
|
+
/// Short bucket
|
149
|
+
short_bucket,
|
150
|
+
|
151
|
+
/// Short spill
|
152
|
+
short_spill,
|
153
|
+
|
154
|
+
/// Short record
|
155
|
+
short_data_record,
|
156
|
+
|
157
|
+
/// Short value
|
158
|
+
short_value,
|
159
|
+
|
160
|
+
/// Hash mismatch
|
161
|
+
hash_mismatch,
|
162
|
+
|
163
|
+
/// Invalid load factor
|
164
|
+
invalid_load_factor,
|
165
|
+
|
166
|
+
/// Invalid capacity
|
167
|
+
invalid_capacity,
|
168
|
+
|
169
|
+
/// Invalid bucket count
|
170
|
+
invalid_bucket_count,
|
171
|
+
|
172
|
+
/// Invalid bucket size
|
173
|
+
invalid_bucket_size,
|
174
|
+
|
175
|
+
/// The data file header was incomplete
|
176
|
+
incomplete_data_file_header,
|
177
|
+
|
178
|
+
/// The key file header was incomplete
|
179
|
+
incomplete_key_file_header,
|
180
|
+
|
181
|
+
/// Invalid log record
|
182
|
+
invalid_log_record,
|
183
|
+
|
184
|
+
/// Invalid spill in log record
|
185
|
+
invalid_log_spill,
|
186
|
+
|
187
|
+
/// Invalid offset in log record
|
188
|
+
invalid_log_offset,
|
189
|
+
|
190
|
+
/// Invalid index in log record
|
191
|
+
invalid_log_index,
|
192
|
+
|
193
|
+
/// Invalid size in spill
|
194
|
+
invalid_spill_size,
|
195
|
+
|
196
|
+
/// UID mismatch
|
197
|
+
uid_mismatch,
|
198
|
+
|
199
|
+
/// appnum mismatch
|
200
|
+
appnum_mismatch,
|
201
|
+
|
202
|
+
/// key size mismatch
|
203
|
+
key_size_mismatch,
|
204
|
+
|
205
|
+
/// salt mismatch
|
206
|
+
salt_mismatch,
|
207
|
+
|
208
|
+
/// pepper mismatch
|
209
|
+
pepper_mismatch,
|
210
|
+
|
211
|
+
/// block size mismatch
|
212
|
+
block_size_mismatch,
|
213
|
+
|
214
|
+
/// orphaned value
|
215
|
+
orphaned_value,
|
216
|
+
|
217
|
+
/// missing value
|
218
|
+
missing_value,
|
219
|
+
|
220
|
+
/// size mismatch
|
221
|
+
size_mismatch,
|
222
|
+
|
223
|
+
/// duplicate value
|
224
|
+
duplicate_value
|
225
|
+
};
|
226
|
+
|
227
|
+
/// Returns the error category used for database error codes.
|
228
|
+
error_category const&
|
229
|
+
nudb_category();
|
230
|
+
|
231
|
+
/** Returns a database error code.
|
232
|
+
|
233
|
+
This function is used by the implementation to convert
|
234
|
+
@ref error values into @ref error_code objects.
|
235
|
+
*/
|
236
|
+
inline
|
237
|
+
error_code
|
238
|
+
make_error_code(error ev)
|
239
|
+
{
|
240
|
+
return error_code{static_cast<int>(ev), nudb_category()};
|
241
|
+
}
|
242
|
+
|
243
|
+
} // nudb
|
244
|
+
|
245
|
+
namespace boost {
|
246
|
+
namespace system {
|
247
|
+
template<>
|
248
|
+
struct is_error_code_enum<nudb::error>
|
249
|
+
{
|
250
|
+
static bool const value = true;
|
251
|
+
};
|
252
|
+
} // system
|
253
|
+
} // boost
|
254
|
+
|
255
|
+
#include <nudb/impl/error.ipp>
|
256
|
+
|
257
|
+
#endif
|
@@ -0,0 +1,55 @@
|
|
1
|
+
//
|
2
|
+
// Copyright (c) 2015-2016 Vinnie Falco (vinnie dot falco at gmail dot com)
|
3
|
+
//
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
|
8
|
+
#ifndef NUDB_FILE_HPP
|
9
|
+
#define NUDB_FILE_HPP
|
10
|
+
|
11
|
+
#include <boost/core/ignore_unused.hpp>
|
12
|
+
#include <cstddef>
|
13
|
+
#include <string>
|
14
|
+
|
15
|
+
namespace nudb {
|
16
|
+
|
17
|
+
/// The type used to hold paths to files
|
18
|
+
using path_type = std::string;
|
19
|
+
|
20
|
+
/** Returns the best guess at the volume's block size.
|
21
|
+
|
22
|
+
@param path A path to a file on the device. The file does
|
23
|
+
not need to exist.
|
24
|
+
*/
|
25
|
+
inline
|
26
|
+
std::size_t
|
27
|
+
block_size(path_type const& path)
|
28
|
+
{
|
29
|
+
boost::ignore_unused(path);
|
30
|
+
// A reasonable default for many SSD devices
|
31
|
+
return 4096;
|
32
|
+
}
|
33
|
+
|
34
|
+
/** File create and open modes.
|
35
|
+
|
36
|
+
These are used by @ref native_file.
|
37
|
+
*/
|
38
|
+
enum class file_mode
|
39
|
+
{
|
40
|
+
/// Open the file for sequential reads
|
41
|
+
scan,
|
42
|
+
|
43
|
+
/// Open the file for random reads
|
44
|
+
read,
|
45
|
+
|
46
|
+
/// Open the file for random reads and appending writes
|
47
|
+
append,
|
48
|
+
|
49
|
+
/// Open the file for random reads and writes
|
50
|
+
write
|
51
|
+
};
|
52
|
+
|
53
|
+
} // nudb
|
54
|
+
|
55
|
+
#endif
|