xref: /aosp_15_r20/external/leveldb/util/status.cc (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker 
5*9507f98cSAndroid Build Coastguard Worker #include "leveldb/status.h"
6*9507f98cSAndroid Build Coastguard Worker 
7*9507f98cSAndroid Build Coastguard Worker #include <cstdio>
8*9507f98cSAndroid Build Coastguard Worker 
9*9507f98cSAndroid Build Coastguard Worker #include "port/port.h"
10*9507f98cSAndroid Build Coastguard Worker 
11*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
12*9507f98cSAndroid Build Coastguard Worker 
CopyState(const char * state)13*9507f98cSAndroid Build Coastguard Worker const char* Status::CopyState(const char* state) {
14*9507f98cSAndroid Build Coastguard Worker   uint32_t size;
15*9507f98cSAndroid Build Coastguard Worker   std::memcpy(&size, state, sizeof(size));
16*9507f98cSAndroid Build Coastguard Worker   char* result = new char[size + 5];
17*9507f98cSAndroid Build Coastguard Worker   std::memcpy(result, state, size + 5);
18*9507f98cSAndroid Build Coastguard Worker   return result;
19*9507f98cSAndroid Build Coastguard Worker }
20*9507f98cSAndroid Build Coastguard Worker 
Status(Code code,const Slice & msg,const Slice & msg2)21*9507f98cSAndroid Build Coastguard Worker Status::Status(Code code, const Slice& msg, const Slice& msg2) {
22*9507f98cSAndroid Build Coastguard Worker   assert(code != kOk);
23*9507f98cSAndroid Build Coastguard Worker   const uint32_t len1 = static_cast<uint32_t>(msg.size());
24*9507f98cSAndroid Build Coastguard Worker   const uint32_t len2 = static_cast<uint32_t>(msg2.size());
25*9507f98cSAndroid Build Coastguard Worker   const uint32_t size = len1 + (len2 ? (2 + len2) : 0);
26*9507f98cSAndroid Build Coastguard Worker   char* result = new char[size + 5];
27*9507f98cSAndroid Build Coastguard Worker   std::memcpy(result, &size, sizeof(size));
28*9507f98cSAndroid Build Coastguard Worker   result[4] = static_cast<char>(code);
29*9507f98cSAndroid Build Coastguard Worker   std::memcpy(result + 5, msg.data(), len1);
30*9507f98cSAndroid Build Coastguard Worker   if (len2) {
31*9507f98cSAndroid Build Coastguard Worker     result[5 + len1] = ':';
32*9507f98cSAndroid Build Coastguard Worker     result[6 + len1] = ' ';
33*9507f98cSAndroid Build Coastguard Worker     std::memcpy(result + 7 + len1, msg2.data(), len2);
34*9507f98cSAndroid Build Coastguard Worker   }
35*9507f98cSAndroid Build Coastguard Worker   state_ = result;
36*9507f98cSAndroid Build Coastguard Worker }
37*9507f98cSAndroid Build Coastguard Worker 
ToString() const38*9507f98cSAndroid Build Coastguard Worker std::string Status::ToString() const {
39*9507f98cSAndroid Build Coastguard Worker   if (state_ == nullptr) {
40*9507f98cSAndroid Build Coastguard Worker     return "OK";
41*9507f98cSAndroid Build Coastguard Worker   } else {
42*9507f98cSAndroid Build Coastguard Worker     char tmp[30];
43*9507f98cSAndroid Build Coastguard Worker     const char* type;
44*9507f98cSAndroid Build Coastguard Worker     switch (code()) {
45*9507f98cSAndroid Build Coastguard Worker       case kOk:
46*9507f98cSAndroid Build Coastguard Worker         type = "OK";
47*9507f98cSAndroid Build Coastguard Worker         break;
48*9507f98cSAndroid Build Coastguard Worker       case kNotFound:
49*9507f98cSAndroid Build Coastguard Worker         type = "NotFound: ";
50*9507f98cSAndroid Build Coastguard Worker         break;
51*9507f98cSAndroid Build Coastguard Worker       case kCorruption:
52*9507f98cSAndroid Build Coastguard Worker         type = "Corruption: ";
53*9507f98cSAndroid Build Coastguard Worker         break;
54*9507f98cSAndroid Build Coastguard Worker       case kNotSupported:
55*9507f98cSAndroid Build Coastguard Worker         type = "Not implemented: ";
56*9507f98cSAndroid Build Coastguard Worker         break;
57*9507f98cSAndroid Build Coastguard Worker       case kInvalidArgument:
58*9507f98cSAndroid Build Coastguard Worker         type = "Invalid argument: ";
59*9507f98cSAndroid Build Coastguard Worker         break;
60*9507f98cSAndroid Build Coastguard Worker       case kIOError:
61*9507f98cSAndroid Build Coastguard Worker         type = "IO error: ";
62*9507f98cSAndroid Build Coastguard Worker         break;
63*9507f98cSAndroid Build Coastguard Worker       default:
64*9507f98cSAndroid Build Coastguard Worker         std::snprintf(tmp, sizeof(tmp),
65*9507f98cSAndroid Build Coastguard Worker                       "Unknown code(%d): ", static_cast<int>(code()));
66*9507f98cSAndroid Build Coastguard Worker         type = tmp;
67*9507f98cSAndroid Build Coastguard Worker         break;
68*9507f98cSAndroid Build Coastguard Worker     }
69*9507f98cSAndroid Build Coastguard Worker     std::string result(type);
70*9507f98cSAndroid Build Coastguard Worker     uint32_t length;
71*9507f98cSAndroid Build Coastguard Worker     std::memcpy(&length, state_, sizeof(length));
72*9507f98cSAndroid Build Coastguard Worker     result.append(state_ + 5, length);
73*9507f98cSAndroid Build Coastguard Worker     return result;
74*9507f98cSAndroid Build Coastguard Worker   }
75*9507f98cSAndroid Build Coastguard Worker }
76*9507f98cSAndroid Build Coastguard Worker 
77*9507f98cSAndroid Build Coastguard Worker }  // namespace leveldb
78