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