1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
6 #include "table/adaptive_table_factory.h"
8 #include "table/table_builder.h"
9 #include "table/format.h"
10 #include "port/port.h"
14 AdaptiveTableFactory::AdaptiveTableFactory(
15 std::shared_ptr
<TableFactory
> table_factory_to_write
,
16 std::shared_ptr
<TableFactory
> block_based_table_factory
,
17 std::shared_ptr
<TableFactory
> plain_table_factory
,
18 std::shared_ptr
<TableFactory
> cuckoo_table_factory
)
19 : table_factory_to_write_(table_factory_to_write
),
20 block_based_table_factory_(block_based_table_factory
),
21 plain_table_factory_(plain_table_factory
),
22 cuckoo_table_factory_(cuckoo_table_factory
) {
23 if (!plain_table_factory_
) {
24 plain_table_factory_
.reset(NewPlainTableFactory());
26 if (!block_based_table_factory_
) {
27 block_based_table_factory_
.reset(NewBlockBasedTableFactory());
29 if (!cuckoo_table_factory_
) {
30 cuckoo_table_factory_
.reset(NewCuckooTableFactory());
32 if (!table_factory_to_write_
) {
33 table_factory_to_write_
= block_based_table_factory_
;
37 extern const uint64_t kPlainTableMagicNumber
;
38 extern const uint64_t kLegacyPlainTableMagicNumber
;
39 extern const uint64_t kBlockBasedTableMagicNumber
;
40 extern const uint64_t kLegacyBlockBasedTableMagicNumber
;
41 extern const uint64_t kCuckooTableMagicNumber
;
43 Status
AdaptiveTableFactory::NewTableReader(
44 const TableReaderOptions
& table_reader_options
,
45 unique_ptr
<RandomAccessFileReader
>&& file
, uint64_t file_size
,
46 unique_ptr
<TableReader
>* table
,
47 bool prefetch_index_and_filter_in_cache
) const {
49 auto s
= ReadFooterFromFile(file
.get(), file_size
, &footer
);
53 if (footer
.table_magic_number() == kPlainTableMagicNumber
||
54 footer
.table_magic_number() == kLegacyPlainTableMagicNumber
) {
55 return plain_table_factory_
->NewTableReader(
56 table_reader_options
, std::move(file
), file_size
, table
);
57 } else if (footer
.table_magic_number() == kBlockBasedTableMagicNumber
||
58 footer
.table_magic_number() == kLegacyBlockBasedTableMagicNumber
) {
59 return block_based_table_factory_
->NewTableReader(
60 table_reader_options
, std::move(file
), file_size
, table
);
61 } else if (footer
.table_magic_number() == kCuckooTableMagicNumber
) {
62 return cuckoo_table_factory_
->NewTableReader(
63 table_reader_options
, std::move(file
), file_size
, table
);
65 return Status::NotSupported("Unidentified table format");
69 TableBuilder
* AdaptiveTableFactory::NewTableBuilder(
70 const TableBuilderOptions
& table_builder_options
, uint32_t column_family_id
,
71 WritableFileWriter
* file
) const {
72 return table_factory_to_write_
->NewTableBuilder(table_builder_options
,
73 column_family_id
, file
);
76 std::string
AdaptiveTableFactory::GetPrintableTableOptions() const {
79 const int kBufferSize
= 200;
80 char buffer
[kBufferSize
];
82 if (table_factory_to_write_
) {
83 snprintf(buffer
, kBufferSize
, " write factory (%s) options:\n%s\n",
84 (table_factory_to_write_
->Name() ? table_factory_to_write_
->Name()
86 table_factory_to_write_
->GetPrintableTableOptions().c_str());
89 if (plain_table_factory_
) {
90 snprintf(buffer
, kBufferSize
, " %s options:\n%s\n",
91 plain_table_factory_
->Name() ? plain_table_factory_
->Name() : "",
92 plain_table_factory_
->GetPrintableTableOptions().c_str());
95 if (block_based_table_factory_
) {
97 buffer
, kBufferSize
, " %s options:\n%s\n",
98 (block_based_table_factory_
->Name() ? block_based_table_factory_
->Name()
100 block_based_table_factory_
->GetPrintableTableOptions().c_str());
103 if (cuckoo_table_factory_
) {
104 snprintf(buffer
, kBufferSize
, " %s options:\n%s\n",
105 cuckoo_table_factory_
->Name() ? cuckoo_table_factory_
->Name() : "",
106 cuckoo_table_factory_
->GetPrintableTableOptions().c_str());
112 extern TableFactory
* NewAdaptiveTableFactory(
113 std::shared_ptr
<TableFactory
> table_factory_to_write
,
114 std::shared_ptr
<TableFactory
> block_based_table_factory
,
115 std::shared_ptr
<TableFactory
> plain_table_factory
,
116 std::shared_ptr
<TableFactory
> cuckoo_table_factory
) {
117 return new AdaptiveTableFactory(table_factory_to_write
,
118 block_based_table_factory
, plain_table_factory
, cuckoo_table_factory
);
121 } // namespace rocksdb
122 #endif // ROCKSDB_LITE