xref: /aosp_15_r20/external/leveldb/util/status.cc (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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 <cstdio>
8 
9 #include "port/port.h"
10 
11 namespace leveldb {
12 
CopyState(const char * state)13 const char* Status::CopyState(const char* state) {
14   uint32_t size;
15   std::memcpy(&size, state, sizeof(size));
16   char* result = new char[size + 5];
17   std::memcpy(result, state, size + 5);
18   return result;
19 }
20 
Status(Code code,const Slice & msg,const Slice & msg2)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   std::memcpy(result, &size, sizeof(size));
28   result[4] = static_cast<char>(code);
29   std::memcpy(result + 5, msg.data(), len1);
30   if (len2) {
31     result[5 + len1] = ':';
32     result[6 + len1] = ' ';
33     std::memcpy(result + 7 + len1, msg2.data(), len2);
34   }
35   state_ = result;
36 }
37 
ToString() const38 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         std::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     std::memcpy(&length, state_, sizeof(length));
72     result.append(state_ + 5, length);
73     return result;
74   }
75 }
76 
77 }  // namespace leveldb
78