Initialize Tizen 2.3
[external/leveldb.git] / db / filename.cc
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 <ctype.h>
6 #include <stdio.h>
7 #include "db/filename.h"
8 #include "db/dbformat.h"
9 #include "leveldb/env.h"
10 #include "util/logging.h"
11
12 namespace leveldb {
13
14 static std::string MakeFileName(const std::string& name, uint64_t number,
15                                 const char* suffix) {
16   char buf[100];
17   snprintf(buf, sizeof(buf), "/%06llu.%s",
18            static_cast<unsigned long long>(number),
19            suffix);
20   return name + buf;
21 }
22
23 std::string LogFileName(const std::string& name, uint64_t number) {
24   assert(number > 0);
25   return MakeFileName(name, number, "log");
26 }
27
28 std::string TableFileName(const std::string& name, uint64_t number) {
29   assert(number > 0);
30   return MakeFileName(name, number, "sst");
31 }
32
33 std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
34   assert(number > 0);
35   char buf[100];
36   snprintf(buf, sizeof(buf), "/MANIFEST-%06llu",
37            static_cast<unsigned long long>(number));
38   return dbname + buf;
39 }
40
41 std::string CurrentFileName(const std::string& dbname) {
42   return dbname + "/CURRENT";
43 }
44
45 std::string LockFileName(const std::string& dbname) {
46   return dbname + "/LOCK";
47 }
48
49 std::string TempFileName(const std::string& dbname, uint64_t number) {
50   assert(number > 0);
51   return MakeFileName(dbname, number, "dbtmp");
52 }
53
54 std::string InfoLogFileName(const std::string& dbname) {
55   return dbname + "/LOG";
56 }
57
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";
61 }
62
63
64 // Owned filenames have the form:
65 //    dbname/CURRENT
66 //    dbname/LOCK
67 //    dbname/LOG
68 //    dbname/LOG.old
69 //    dbname/MANIFEST-[0-9]+
70 //    dbname/[0-9]+.(log|sst)
71 bool ParseFileName(const std::string& fname,
72                    uint64_t* number,
73                    FileType* type) {
74   Slice rest(fname);
75   if (rest == "CURRENT") {
76     *number = 0;
77     *type = kCurrentFile;
78   } else if (rest == "LOCK") {
79     *number = 0;
80     *type = kDBLockFile;
81   } else if (rest == "LOG" || rest == "LOG.old") {
82     *number = 0;
83     *type = kInfoLogFile;
84   } else if (rest.starts_with("MANIFEST-")) {
85     rest.remove_prefix(strlen("MANIFEST-"));
86     uint64_t num;
87     if (!ConsumeDecimalNumber(&rest, &num)) {
88       return false;
89     }
90     if (!rest.empty()) {
91       return false;
92     }
93     *type = kDescriptorFile;
94     *number = num;
95   } else {
96     // Avoid strtoull() to keep filename format independent of the
97     // current locale
98     uint64_t num;
99     if (!ConsumeDecimalNumber(&rest, &num)) {
100       return false;
101     }
102     Slice suffix = rest;
103     if (suffix == Slice(".log")) {
104       *type = kLogFile;
105     } else if (suffix == Slice(".sst")) {
106       *type = kTableFile;
107     } else if (suffix == Slice(".dbtmp")) {
108       *type = kTempFile;
109     } else {
110       return false;
111     }
112     *number = num;
113   }
114   return true;
115 }
116
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);
126   if (s.ok()) {
127     s = env->RenameFile(tmp, CurrentFileName(dbname));
128   }
129   if (!s.ok()) {
130     env->DeleteFile(tmp);
131   }
132   return s;
133 }
134
135 }  // namespace leveldb