Skip to content

Commit bcd11f1

Browse files
committed
Refactor to allow for non-array keys and generalized hash fns.
1 parent dcdc618 commit bcd11f1

35 files changed

Lines changed: 853 additions & 481 deletions

Makefile.am

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,6 @@ include_bitcoin_HEADERS = \
131131

132132
include_bitcoin_databasedir = ${includedir}/bitcoin/database
133133
include_bitcoin_database_HEADERS = \
134-
include/bitcoin/database/association.hpp \
135-
include/bitcoin/database/associations.hpp \
136134
include/bitcoin/database/boost.hpp \
137135
include/bitcoin/database/define.hpp \
138136
include/bitcoin/database/error.hpp \
@@ -215,16 +213,23 @@ include_bitcoin_database_primitives_HEADERS = \
215213
include/bitcoin/database/primitives/hashhead.hpp \
216214
include/bitcoin/database/primitives/hashmap.hpp \
217215
include/bitcoin/database/primitives/iterator.hpp \
216+
include/bitcoin/database/primitives/keys.hpp \
218217
include/bitcoin/database/primitives/linkage.hpp \
219218
include/bitcoin/database/primitives/manager.hpp \
220219
include/bitcoin/database/primitives/nomap.hpp \
221220
include/bitcoin/database/primitives/primitives.hpp
222221

223222
include_bitcoin_database_tablesdir = ${includedir}/bitcoin/database/tables
224223
include_bitcoin_database_tables_HEADERS = \
224+
include/bitcoin/database/tables/association.hpp \
225+
include/bitcoin/database/tables/associations.hpp \
225226
include/bitcoin/database/tables/context.hpp \
226227
include/bitcoin/database/tables/event.hpp \
228+
include/bitcoin/database/tables/keys.hpp \
229+
include/bitcoin/database/tables/names.hpp \
230+
include/bitcoin/database/tables/point_set.hpp \
227231
include/bitcoin/database/tables/schema.hpp \
232+
include/bitcoin/database/tables/states.hpp \
228233
include/bitcoin/database/tables/table.hpp \
229234
include/bitcoin/database/tables/tables.hpp
230235

builds/msvc/vs2022/libbitcoin-database/libbitcoin-database.vcxproj

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,6 @@
9090
</ItemGroup>
9191
<ItemGroup>
9292
<ClInclude Include="..\..\..\..\include\bitcoin\database.hpp" />
93-
<ClInclude Include="..\..\..\..\include\bitcoin\database\association.hpp" />
94-
<ClInclude Include="..\..\..\..\include\bitcoin\database\associations.hpp" />
9593
<ClInclude Include="..\..\..\..\include\bitcoin\database\boost.hpp" />
9694
<ClInclude Include="..\..\..\..\include\bitcoin\database\define.hpp" />
9795
<ClInclude Include="..\..\..\..\include\bitcoin\database\error.hpp" />
@@ -118,6 +116,7 @@
118116
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\hashhead.hpp" />
119117
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\hashmap.hpp" />
120118
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\iterator.hpp" />
119+
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\keys.hpp" />
121120
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\linkage.hpp" />
122121
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\manager.hpp" />
123122
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\nomap.hpp" />
@@ -133,6 +132,8 @@
133132
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\archives\point.hpp" />
134133
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\archives\transaction.hpp" />
135134
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\archives\txs.hpp" />
135+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\association.hpp" />
136+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\associations.hpp" />
136137
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\caches\doubles.hpp" />
137138
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\caches\prevout.hpp" />
138139
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\caches\validated_bk.hpp" />
@@ -141,10 +142,14 @@
141142
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\event.hpp" />
142143
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\indexes\height.hpp" />
143144
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\indexes\strong_tx.hpp" />
145+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\keys.hpp" />
146+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\names.hpp" />
144147
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\optionals\address.hpp" />
145148
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\optionals\bootstrap.hpp" />
146149
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\optionals\neutrino.hpp" />
150+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\point_set.hpp" />
147151
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\schema.hpp" />
152+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\states.hpp" />
148153
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\table.hpp" />
149154
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\tables.hpp" />
150155
<ClInclude Include="..\..\..\..\include\bitcoin\database\version.hpp" />

builds/msvc/vs2022/libbitcoin-database/libbitcoin-database.vcxproj.filters

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,6 @@
113113
<ClInclude Include="..\..\..\..\include\bitcoin\database.hpp">
114114
<Filter>include\bitcoin</Filter>
115115
</ClInclude>
116-
<ClInclude Include="..\..\..\..\include\bitcoin\database\association.hpp">
117-
<Filter>include\bitcoin\database</Filter>
118-
</ClInclude>
119-
<ClInclude Include="..\..\..\..\include\bitcoin\database\associations.hpp">
120-
<Filter>include\bitcoin\database</Filter>
121-
</ClInclude>
122116
<ClInclude Include="..\..\..\..\include\bitcoin\database\boost.hpp">
123117
<Filter>include\bitcoin\database</Filter>
124118
</ClInclude>
@@ -197,6 +191,9 @@
197191
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\iterator.hpp">
198192
<Filter>include\bitcoin\database\primitives</Filter>
199193
</ClInclude>
194+
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\keys.hpp">
195+
<Filter>include\bitcoin\database\primitives</Filter>
196+
</ClInclude>
200197
<ClInclude Include="..\..\..\..\include\bitcoin\database\primitives\linkage.hpp">
201198
<Filter>include\bitcoin\database\primitives</Filter>
202199
</ClInclude>
@@ -242,6 +239,12 @@
242239
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\archives\txs.hpp">
243240
<Filter>include\bitcoin\database\tables\archives</Filter>
244241
</ClInclude>
242+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\association.hpp">
243+
<Filter>include\bitcoin\database\tables</Filter>
244+
</ClInclude>
245+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\associations.hpp">
246+
<Filter>include\bitcoin\database\tables</Filter>
247+
</ClInclude>
245248
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\caches\doubles.hpp">
246249
<Filter>include\bitcoin\database\tables\caches</Filter>
247250
</ClInclude>
@@ -266,6 +269,12 @@
266269
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\indexes\strong_tx.hpp">
267270
<Filter>include\bitcoin\database\tables\indexes</Filter>
268271
</ClInclude>
272+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\keys.hpp">
273+
<Filter>include\bitcoin\database\tables</Filter>
274+
</ClInclude>
275+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\names.hpp">
276+
<Filter>include\bitcoin\database\tables</Filter>
277+
</ClInclude>
269278
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\optionals\address.hpp">
270279
<Filter>include\bitcoin\database\tables\optionals</Filter>
271280
</ClInclude>
@@ -275,9 +284,15 @@
275284
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\optionals\neutrino.hpp">
276285
<Filter>include\bitcoin\database\tables\optionals</Filter>
277286
</ClInclude>
287+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\point_set.hpp">
288+
<Filter>include\bitcoin\database\tables</Filter>
289+
</ClInclude>
278290
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\schema.hpp">
279291
<Filter>include\bitcoin\database\tables</Filter>
280292
</ClInclude>
293+
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\states.hpp">
294+
<Filter>include\bitcoin\database\tables</Filter>
295+
</ClInclude>
281296
<ClInclude Include="..\..\..\..\include\bitcoin\database\tables\table.hpp">
282297
<Filter>include\bitcoin\database\tables</Filter>
283298
</ClInclude>

include/bitcoin/database.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616

1717
#include <bitcoin/system.hpp>
18-
#include <bitcoin/database/association.hpp>
19-
#include <bitcoin/database/associations.hpp>
2018
#include <bitcoin/database/boost.hpp>
2119
#include <bitcoin/database/define.hpp>
2220
#include <bitcoin/database/error.hpp>
@@ -47,13 +45,20 @@
4745
#include <bitcoin/database/primitives/hashhead.hpp>
4846
#include <bitcoin/database/primitives/hashmap.hpp>
4947
#include <bitcoin/database/primitives/iterator.hpp>
48+
#include <bitcoin/database/primitives/keys.hpp>
5049
#include <bitcoin/database/primitives/linkage.hpp>
5150
#include <bitcoin/database/primitives/manager.hpp>
5251
#include <bitcoin/database/primitives/nomap.hpp>
5352
#include <bitcoin/database/primitives/primitives.hpp>
53+
#include <bitcoin/database/tables/association.hpp>
54+
#include <bitcoin/database/tables/associations.hpp>
5455
#include <bitcoin/database/tables/context.hpp>
5556
#include <bitcoin/database/tables/event.hpp>
57+
#include <bitcoin/database/tables/keys.hpp>
58+
#include <bitcoin/database/tables/names.hpp>
59+
#include <bitcoin/database/tables/point_set.hpp>
5660
#include <bitcoin/database/tables/schema.hpp>
61+
#include <bitcoin/database/tables/states.hpp>
5762
#include <bitcoin/database/tables/table.hpp>
5863
#include <bitcoin/database/tables/tables.hpp>
5964
#include <bitcoin/database/tables/archives/header.hpp>

include/bitcoin/database/define.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ static_assert(sizeof(void*) == sizeof(uint64_t), "Not a 64 bit system!");
4848
namespace libbitcoin {
4949
namespace database {
5050

51+
using hash_digest = system::hash_digest;
52+
using hashes = system::hashes;
5153
using code = system::code;
5254

5355
} // namespace database

include/bitcoin/database/impl/primitives/hashhead.ipp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ inline Link CLASS::index(const Key& key) const NOEXCEPT
110110
BC_ASSERT_MSG(mask_ < max_size_t, "insufficient domain");
111111
BC_ASSERT_MSG(is_nonzero(buckets_), "hash table requires buckets");
112112

113-
// unique_hash assumes sufficient uniqueness in low order key bytes.
114-
const auto index = possible_narrow_cast<integer>(unique_hash(key));
113+
const auto index = possible_narrow_cast<integer>(keys::hash<Key>(key));
115114
return bit_and<integer>(mask_, index);
116115
}
117116

include/bitcoin/database/impl/primitives/hashmap.ipp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,8 @@ Link CLASS::first(const memory_ptr& ptr, const Link& link,
424424
return {};
425425

426426
// element key matches (found)
427-
if (is_zero(std::memcmp(key.data(), std::next(offset, Link::size),
428-
key_size)))
427+
if (keys::compare(unsafe_array_cast<uint8_t, key_size>(
428+
std::next(offset, Link::size)), key))
429429
return next;
430430

431431
// set next element link (loop)
@@ -492,7 +492,7 @@ bool CLASS::write(const memory_ptr& ptr, const Link& link, const Key& key,
492492
iostream stream{ offset, size - position };
493493
finalizer sink{ stream };
494494
sink.skip_bytes(Link::size);
495-
sink.write_bytes(key);
495+
keys::write(sink, key);
496496

497497
// Commit element to body and search (terminal is a valid bucket index).
498498
if constexpr (!is_slab) { BC_DEBUG_ONLY(sink.set_limit(Size * element.count());) }

include/bitcoin/database/impl/primitives/iterator.ipp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ Link CLASS::to_match(Link link) const NOEXCEPT
9696
return Link::terminal;
9797

9898
// element key matches (found)
99-
const auto key_ptr = std::next(offset, Link::size);
100-
if (is_zero(std::memcmp(key_.data(), key_ptr, array_count<Key>)))
99+
if (keys::compare(system::unsafe_array_cast<uint8_t, key_size>(
100+
std::next(offset, Link::size)), key_))
101101
return link;
102102

103103
// set next element link (loop)
@@ -128,8 +128,8 @@ Link CLASS::to_next(Link link) const NOEXCEPT
128128
return Link::terminal;
129129

130130
// next element key matches (found)
131-
const auto key_ptr = std::next(offset, Link::size);
132-
if (is_zero(std::memcmp(key_.data(), key_ptr, array_count<Key>)))
131+
if (keys::compare(system::unsafe_array_cast<uint8_t, key_size>(
132+
std::next(offset, Link::size)), key_))
133133
return link;
134134
}
135135

include/bitcoin/database/impl/query/archive_read.ipp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <utility>
2525
#include <bitcoin/system.hpp>
2626
#include <bitcoin/database/define.hpp>
27+
#include <bitcoin/database/tables/tables.hpp>
2728

2829
namespace libbitcoin {
2930
namespace database {

include/bitcoin/database/impl/query/archive_write.ipp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,27 @@ code CLASS::set_code(const tx_link& tx_fk, const transaction& tx) NOEXCEPT
150150
// This must be set after tx.set and before tx.commit, since searchable and
151151
// produces an association to tx.link, and is also an integral part of tx.
152152
const auto ptr = store_.point.get_memory();
153+
154+
// Collect duplicates to store in duplicate table.
155+
std::vector<chain::cref_point> twins{};
153156
for (const auto& in: *ins)
154157
{
155-
if (!store_.point.put(ptr, ins_fk++,
156-
table::point::compose(in->point()), table::point::record{}))
158+
///////////////////////////////////////////////////////////////////
159+
// TODO: add filter to hashmap and use method here to detect and
160+
// TODO: return prior existence (dup) here (insert succeeds).
161+
///////////////////////////////////////////////////////////////////
162+
bool twin{};
163+
if (!store_.point.put(/*twin,*/ ptr, ins_fk++, in->point(),
164+
table::point::record{}))
157165
return error::tx_point_put;
166+
167+
if (twin)
168+
twins.emplace_back(in->point().hash(), in->point().index());
158169
}
170+
171+
///////////////////////////////////////////////////////////////////////
172+
// TODO: if (!twins.empty()) ... store to duplicate table here.
173+
///////////////////////////////////////////////////////////////////////
159174
}
160175

161176
// Commit address index records (hashmap).

0 commit comments

Comments
 (0)