github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/src/builder.cc (about)

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