/src/leveldb/db/builder.cc
Line | Count | Source |
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. |
4 | | |
5 | | #include "db/builder.h" |
6 | | |
7 | | #include "db/dbformat.h" |
8 | | #include "db/filename.h" |
9 | | #include "db/table_cache.h" |
10 | | #include "db/version_edit.h" |
11 | | #include "leveldb/db.h" |
12 | | #include "leveldb/env.h" |
13 | | #include "leveldb/iterator.h" |
14 | | |
15 | | namespace leveldb { |
16 | | |
17 | | Status BuildTable(const std::string& dbname, Env* env, const Options& options, |
18 | 56 | TableCache* table_cache, Iterator* iter, FileMetaData* meta) { |
19 | 56 | Status s; |
20 | 56 | meta->file_size = 0; |
21 | 56 | iter->SeekToFirst(); |
22 | | |
23 | 56 | std::string fname = TableFileName(dbname, meta->number); |
24 | 56 | if (iter->Valid()) { |
25 | 44 | WritableFile* file; |
26 | 44 | s = env->NewWritableFile(fname, &file); |
27 | 44 | if (!s.ok()) { |
28 | 0 | return s; |
29 | 0 | } |
30 | | |
31 | 44 | TableBuilder* builder = new TableBuilder(options, file); |
32 | 44 | meta->smallest.DecodeFrom(iter->key()); |
33 | 44 | Slice key; |
34 | 414 | for (; iter->Valid(); iter->Next()) { |
35 | 370 | key = iter->key(); |
36 | 370 | builder->Add(key, iter->value()); |
37 | 370 | } |
38 | 44 | if (!key.empty()) { |
39 | 44 | meta->largest.DecodeFrom(key); |
40 | 44 | } |
41 | | |
42 | | // Finish and check for builder errors |
43 | 44 | s = builder->Finish(); |
44 | 44 | if (s.ok()) { |
45 | 44 | meta->file_size = builder->FileSize(); |
46 | 44 | assert(meta->file_size > 0); |
47 | 44 | } |
48 | 44 | delete builder; |
49 | | |
50 | | // Finish and check for file errors |
51 | 44 | if (s.ok()) { |
52 | 44 | s = file->Sync(); |
53 | 44 | } |
54 | 44 | if (s.ok()) { |
55 | 44 | s = file->Close(); |
56 | 44 | } |
57 | 44 | delete file; |
58 | 44 | file = nullptr; |
59 | | |
60 | 44 | if (s.ok()) { |
61 | | // Verify that the table is usable |
62 | 44 | Iterator* it = table_cache->NewIterator(ReadOptions(), meta->number, |
63 | 44 | meta->file_size); |
64 | 44 | s = it->status(); |
65 | 44 | delete it; |
66 | 44 | } |
67 | 44 | } |
68 | | |
69 | | // Check for input iterator errors |
70 | 56 | if (!iter->status().ok()) { |
71 | 0 | s = iter->status(); |
72 | 0 | } |
73 | | |
74 | 56 | if (s.ok() && meta->file_size > 0) { |
75 | | // Keep it |
76 | 44 | } else { |
77 | 12 | env->RemoveFile(fname); |
78 | 12 | } |
79 | 56 | return s; |
80 | 56 | } |
81 | | |
82 | | } // namespace leveldb |