Owned filenames have the form: dbname/CURRENT dbname/LOCK dbname/LOG dbname/LOG.old dbname/MANIFEST-[0-9]+ dbname/[0-9]+.(log|sst|ldb)
| 76 | // dbname/MANIFEST-[0-9]+ |
| 77 | // dbname/[0-9]+.(log|sst|ldb) |
| 78 | bool ParseFileName(const std::string& filename, uint64_t* number, |
| 79 | FileType* type) { |
| 80 | Slice rest(filename); |
| 81 | if (rest == "CURRENT") { |
| 82 | *number = 0; |
| 83 | *type = kCurrentFile; |
| 84 | } else if (rest == "LOCK") { |
| 85 | *number = 0; |
| 86 | *type = kDBLockFile; |
| 87 | } else if (rest == "LOG" || rest == "LOG.old") { |
| 88 | *number = 0; |
| 89 | *type = kInfoLogFile; |
| 90 | } else if (rest.starts_with("MANIFEST-")) { |
| 91 | rest.remove_prefix(strlen("MANIFEST-")); |
| 92 | uint64_t num; |
| 93 | if (!ConsumeDecimalNumber(&rest, &num)) { |
| 94 | return false; |
| 95 | } |
| 96 | if (!rest.empty()) { |
| 97 | return false; |
| 98 | } |
| 99 | *type = kDescriptorFile; |
| 100 | *number = num; |
| 101 | } else { |
| 102 | // Avoid strtoull() to keep filename format independent of the |
| 103 | // current locale |
| 104 | uint64_t num; |
| 105 | if (!ConsumeDecimalNumber(&rest, &num)) { |
| 106 | return false; |
| 107 | } |
| 108 | Slice suffix = rest; |
| 109 | if (suffix == Slice(".log")) { |
| 110 | *type = kLogFile; |
| 111 | } else if (suffix == Slice(".sst") || suffix == Slice(".ldb")) { |
| 112 | *type = kTableFile; |
| 113 | } else if (suffix == Slice(".dbtmp")) { |
| 114 | *type = kTempFile; |
| 115 | } else { |
| 116 | return false; |
| 117 | } |
| 118 | *number = num; |
| 119 | } |
| 120 | return true; |
| 121 | } |
| 122 | |
| 123 | Status SetCurrentFile(Env* env, const std::string& dbname, |
| 124 | uint64_t descriptor_number) { |