status.cc raw

   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
  78