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.
7 #include "db/filename.h"
8 #include "db/dbformat.h"
9 #include "leveldb/env.h"
10 #include "util/logging.h"
14 static std::string MakeFileName(const std::string& name, uint64_t number,
17 snprintf(buf, sizeof(buf), "/%06llu.%s",
18 static_cast<unsigned long long>(number),
23 std::string LogFileName(const std::string& name, uint64_t number) {
25 return MakeFileName(name, number, "log");
28 std::string TableFileName(const std::string& name, uint64_t number) {
30 return MakeFileName(name, number, "sst");
33 std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
36 snprintf(buf, sizeof(buf), "/MANIFEST-%06llu",
37 static_cast<unsigned long long>(number));
41 std::string CurrentFileName(const std::string& dbname) {
42 return dbname + "/CURRENT";
45 std::string LockFileName(const std::string& dbname) {
46 return dbname + "/LOCK";
49 std::string TempFileName(const std::string& dbname, uint64_t number) {
51 return MakeFileName(dbname, number, "dbtmp");
54 std::string InfoLogFileName(const std::string& dbname) {
55 return dbname + "/LOG";
58 // Return the name of the old info log file for "dbname".
59 std::string OldInfoLogFileName(const std::string& dbname) {
60 return dbname + "/LOG.old";
64 // Owned filenames have the form:
69 // dbname/MANIFEST-[0-9]+
70 // dbname/[0-9]+.(log|sst)
71 bool ParseFileName(const std::string& fname,
75 if (rest == "CURRENT") {
78 } else if (rest == "LOCK") {
81 } else if (rest == "LOG" || rest == "LOG.old") {
84 } else if (rest.starts_with("MANIFEST-")) {
85 rest.remove_prefix(strlen("MANIFEST-"));
87 if (!ConsumeDecimalNumber(&rest, &num)) {
93 *type = kDescriptorFile;
96 // Avoid strtoull() to keep filename format independent of the
99 if (!ConsumeDecimalNumber(&rest, &num)) {
103 if (suffix == Slice(".log")) {
105 } else if (suffix == Slice(".sst")) {
107 } else if (suffix == Slice(".dbtmp")) {
117 Status SetCurrentFile(Env* env, const std::string& dbname,
118 uint64_t descriptor_number) {
119 // Remove leading "dbname/" and add newline to manifest file name
120 std::string manifest = DescriptorFileName(dbname, descriptor_number);
121 Slice contents = manifest;
122 assert(contents.starts_with(dbname + "/"));
123 contents.remove_prefix(dbname.size() + 1);
124 std::string tmp = TempFileName(dbname, descriptor_number);
125 Status s = WriteStringToFile(env, contents.ToString() + "\n", tmp);
127 s = env->RenameFile(tmp, CurrentFileName(dbname));
130 env->DeleteFile(tmp);
135 } // namespace leveldb