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