Skip to content

Commit 967dd5d

Browse files
committed
ADD: Set code when upgrading ErrorMsg
1 parent 413dbfa commit 967dd5d

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.50.0 - TBD
4+
5+
### Enhancements
6+
- Added logic to set `code` when upgrading version 1 `ErrorMsg` to newer versions
7+
38
## 0.49.0 - 2026-02-24
49

510
### Enhancements

src/v1.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,27 @@ v2::ErrorMsg ErrorMsg::ToV2() const {
211211
ErrorCode::Unset,
212212
std::numeric_limits<std::uint8_t>::max()};
213213
std::copy(err.begin(), err.end(), ret.err.begin());
214+
const auto null_it = std::find(err.begin(), err.end(), '\0');
215+
if (null_it != err.end()) {
216+
constexpr auto kApiKeyDeactivated = "User or API key deactivated";
217+
constexpr auto kConnectionLimit = "User has reached their open connection limit";
218+
constexpr auto kSymbolResolution = "Failed to resolve symbol";
219+
constexpr auto kInternalError = "Internal error";
220+
constexpr auto kSlowClient = "Slow client detected for ";
221+
222+
if (std::strcmp(Err(), kApiKeyDeactivated) == 0) {
223+
ret.code = ErrorCode::ApiKeyDeactivated;
224+
} else if (std::strcmp(Err(), kConnectionLimit) == 0) {
225+
ret.code = ErrorCode::ConnectionLimitExceeded;
226+
} else if (std::strncmp(Err(), kSymbolResolution, std::strlen(kSymbolResolution)) ==
227+
0) {
228+
ret.code = ErrorCode::SymbolResolutionFailed;
229+
} else if (std::strcmp(Err(), kInternalError) == 0) {
230+
ret.code = ErrorCode::InternalError;
231+
} else if (std::strncmp(Err(), kSlowClient, std::strlen(kSlowClient)) == 0) {
232+
ret.code = ErrorCode::SkippedRecordsAfterSlowReading;
233+
}
234+
}
214235
return ret;
215236
}
216237

tests/src/v1_tests.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,32 @@ TEST(V1Tests, TestSystemMsgCodeUpgrade) {
3939
const auto res5 = target.ToV2();
4040
EXPECT_EQ(res5.code, SystemCode::ReplayCompleted);
4141
}
42+
43+
TEST(V1Tests, TestErrorMsgCodeUpgrade) {
44+
v1::ErrorMsg target{RecordHeader{
45+
sizeof(v1::ErrorMsg) / RecordHeader::kLengthMultiplier, RType::Error, 0, 0, {}}};
46+
std::strcpy(target.err.data(), "User or API key deactivated");
47+
const auto res1 = target.ToV2();
48+
EXPECT_EQ(res1.code, ErrorCode::ApiKeyDeactivated);
49+
50+
target.err = {};
51+
std::strcpy(target.err.data(), "User has reached their open connection limit");
52+
const auto res2 = target.ToV2();
53+
EXPECT_EQ(res2.code, ErrorCode::ConnectionLimitExceeded);
54+
55+
target.err = {};
56+
std::strcpy(target.err.data(), "Failed to resolve symbol: AAPL");
57+
const auto res3 = target.ToV2();
58+
EXPECT_EQ(res3.code, ErrorCode::SymbolResolutionFailed);
59+
60+
target.err = {};
61+
std::strcpy(target.err.data(), "Internal error");
62+
const auto res4 = target.ToV2();
63+
EXPECT_EQ(res4.code, ErrorCode::InternalError);
64+
65+
target.err = {};
66+
std::strcpy(target.err.data(), "Slow client detected for mbo. Skipped records");
67+
const auto res5 = target.ToV2();
68+
EXPECT_EQ(res5.code, ErrorCode::SkippedRecordsAfterSlowReading);
69+
}
4270
} // namespace databento::v1::tests

0 commit comments

Comments
 (0)