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