/ src / leveldb / util / status.cc
status.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 "leveldb/status.h"
 6  
 7  #include <stdio.h>
 8  
 9  #include "port/port.h"
10  
11  namespace leveldb {
12  
13  const char* Status::CopyState(const char* state) {
14    uint32_t size;
15    memcpy(&size, state, sizeof(size));
16    char* result = new char[size + 5];
17    memcpy(result, state, size + 5);
18    return result;
19  }
20  
21  Status::Status(Code code, const Slice& msg, const Slice& msg2) {
22    assert(code != kOk);
23    const uint32_t len1 = static_cast<uint32_t>(msg.size());
24    const uint32_t len2 = static_cast<uint32_t>(msg2.size());
25    const uint32_t size = len1 + (len2 ? (2 + len2) : 0);
26    char* result = new char[size + 5];
27    memcpy(result, &size, sizeof(size));
28    result[4] = static_cast<char>(code);
29    memcpy(result + 5, msg.data(), len1);
30    if (len2) {
31      result[5 + len1] = ':';
32      result[6 + len1] = ' ';
33      memcpy(result + 7 + len1, msg2.data(), len2);
34    }
35    state_ = result;
36  }
37  
38  std::string Status::ToString() const {
39    if (state_ == nullptr) {
40      return "OK";
41    } else {
42      char tmp[30];
43      const char* type;
44      switch (code()) {
45        case kOk:
46          type = "OK";
47          break;
48        case kNotFound:
49          type = "NotFound: ";
50          break;
51        case kCorruption:
52          type = "Corruption: ";
53          break;
54        case kNotSupported:
55          type = "Not implemented: ";
56          break;
57        case kInvalidArgument:
58          type = "Invalid argument: ";
59          break;
60        case kIOError:
61          type = "IO error: ";
62          break;
63        default:
64          snprintf(tmp, sizeof(tmp),
65                   "Unknown code(%d): ", static_cast<int>(code()));
66          type = tmp;
67          break;
68      }
69      std::string result(type);
70      uint32_t length;
71      memcpy(&length, state_, sizeof(length));
72      result.append(state_ + 5, length);
73      return result;
74    }
75  }
76  
77  }  // namespace leveldb