xref: /aosp_15_r20/external/leveldb/db/builder.cc (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker 
5*9507f98cSAndroid Build Coastguard Worker #include "db/builder.h"
6*9507f98cSAndroid Build Coastguard Worker 
7*9507f98cSAndroid Build Coastguard Worker #include "db/dbformat.h"
8*9507f98cSAndroid Build Coastguard Worker #include "db/filename.h"
9*9507f98cSAndroid Build Coastguard Worker #include "db/table_cache.h"
10*9507f98cSAndroid Build Coastguard Worker #include "db/version_edit.h"
11*9507f98cSAndroid Build Coastguard Worker #include "leveldb/db.h"
12*9507f98cSAndroid Build Coastguard Worker #include "leveldb/env.h"
13*9507f98cSAndroid Build Coastguard Worker #include "leveldb/iterator.h"
14*9507f98cSAndroid Build Coastguard Worker 
15*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
16*9507f98cSAndroid Build Coastguard Worker 
BuildTable(const std::string & dbname,Env * env,const Options & options,TableCache * table_cache,Iterator * iter,FileMetaData * meta)17*9507f98cSAndroid Build Coastguard Worker Status BuildTable(const std::string& dbname, Env* env, const Options& options,
18*9507f98cSAndroid Build Coastguard Worker                   TableCache* table_cache, Iterator* iter, FileMetaData* meta) {
19*9507f98cSAndroid Build Coastguard Worker   Status s;
20*9507f98cSAndroid Build Coastguard Worker   meta->file_size = 0;
21*9507f98cSAndroid Build Coastguard Worker   iter->SeekToFirst();
22*9507f98cSAndroid Build Coastguard Worker 
23*9507f98cSAndroid Build Coastguard Worker   std::string fname = TableFileName(dbname, meta->number);
24*9507f98cSAndroid Build Coastguard Worker   if (iter->Valid()) {
25*9507f98cSAndroid Build Coastguard Worker     WritableFile* file;
26*9507f98cSAndroid Build Coastguard Worker     s = env->NewWritableFile(fname, &file);
27*9507f98cSAndroid Build Coastguard Worker     if (!s.ok()) {
28*9507f98cSAndroid Build Coastguard Worker       return s;
29*9507f98cSAndroid Build Coastguard Worker     }
30*9507f98cSAndroid Build Coastguard Worker 
31*9507f98cSAndroid Build Coastguard Worker     TableBuilder* builder = new TableBuilder(options, file);
32*9507f98cSAndroid Build Coastguard Worker     meta->smallest.DecodeFrom(iter->key());
33*9507f98cSAndroid Build Coastguard Worker     Slice key;
34*9507f98cSAndroid Build Coastguard Worker     for (; iter->Valid(); iter->Next()) {
35*9507f98cSAndroid Build Coastguard Worker       key = iter->key();
36*9507f98cSAndroid Build Coastguard Worker       builder->Add(key, iter->value());
37*9507f98cSAndroid Build Coastguard Worker     }
38*9507f98cSAndroid Build Coastguard Worker     if (!key.empty()) {
39*9507f98cSAndroid Build Coastguard Worker       meta->largest.DecodeFrom(key);
40*9507f98cSAndroid Build Coastguard Worker     }
41*9507f98cSAndroid Build Coastguard Worker 
42*9507f98cSAndroid Build Coastguard Worker     // Finish and check for builder errors
43*9507f98cSAndroid Build Coastguard Worker     s = builder->Finish();
44*9507f98cSAndroid Build Coastguard Worker     if (s.ok()) {
45*9507f98cSAndroid Build Coastguard Worker       meta->file_size = builder->FileSize();
46*9507f98cSAndroid Build Coastguard Worker       assert(meta->file_size > 0);
47*9507f98cSAndroid Build Coastguard Worker     }
48*9507f98cSAndroid Build Coastguard Worker     delete builder;
49*9507f98cSAndroid Build Coastguard Worker 
50*9507f98cSAndroid Build Coastguard Worker     // Finish and check for file errors
51*9507f98cSAndroid Build Coastguard Worker     if (s.ok()) {
52*9507f98cSAndroid Build Coastguard Worker       s = file->Sync();
53*9507f98cSAndroid Build Coastguard Worker     }
54*9507f98cSAndroid Build Coastguard Worker     if (s.ok()) {
55*9507f98cSAndroid Build Coastguard Worker       s = file->Close();
56*9507f98cSAndroid Build Coastguard Worker     }
57*9507f98cSAndroid Build Coastguard Worker     delete file;
58*9507f98cSAndroid Build Coastguard Worker     file = nullptr;
59*9507f98cSAndroid Build Coastguard Worker 
60*9507f98cSAndroid Build Coastguard Worker     if (s.ok()) {
61*9507f98cSAndroid Build Coastguard Worker       // Verify that the table is usable
62*9507f98cSAndroid Build Coastguard Worker       Iterator* it = table_cache->NewIterator(ReadOptions(), meta->number,
63*9507f98cSAndroid Build Coastguard Worker                                               meta->file_size);
64*9507f98cSAndroid Build Coastguard Worker       s = it->status();
65*9507f98cSAndroid Build Coastguard Worker       delete it;
66*9507f98cSAndroid Build Coastguard Worker     }
67*9507f98cSAndroid Build Coastguard Worker   }
68*9507f98cSAndroid Build Coastguard Worker 
69*9507f98cSAndroid Build Coastguard Worker   // Check for input iterator errors
70*9507f98cSAndroid Build Coastguard Worker   if (!iter->status().ok()) {
71*9507f98cSAndroid Build Coastguard Worker     s = iter->status();
72*9507f98cSAndroid Build Coastguard Worker   }
73*9507f98cSAndroid Build Coastguard Worker 
74*9507f98cSAndroid Build Coastguard Worker   if (s.ok() && meta->file_size > 0) {
75*9507f98cSAndroid Build Coastguard Worker     // Keep it
76*9507f98cSAndroid Build Coastguard Worker   } else {
77*9507f98cSAndroid Build Coastguard Worker     env->RemoveFile(fname);
78*9507f98cSAndroid Build Coastguard Worker   }
79*9507f98cSAndroid Build Coastguard Worker   return s;
80*9507f98cSAndroid Build Coastguard Worker }
81*9507f98cSAndroid Build Coastguard Worker 
82*9507f98cSAndroid Build Coastguard Worker }  // namespace leveldb
83