Skip to content

Commit 3e6aaa3

Browse files
authored
fix cpp client processing null value (#15700)
1 parent 24209d5 commit 3e6aaa3

8 files changed

Lines changed: 244 additions & 154 deletions

File tree

iotdb-client/client-cpp/src/main/Common.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <thrift/transport/TBufferTransports.h>
3131
#include <boost/date_time/gregorian/gregorian.hpp>
3232
#include <cstdint>
33+
#include <boost/optional/optional.hpp>
3334

3435
#include "client_types.h"
3536
#include "common_types.h"
@@ -178,13 +179,13 @@ enum TSStatusCode {
178179
class Field {
179180
public:
180181
TSDataType::TSDataType dataType = TSDataType::UNKNOWN;
181-
bool boolV{};
182-
int intV{};
183-
boost::gregorian::date dateV;
184-
int64_t longV{};
185-
float floatV{};
186-
double doubleV{};
187-
std::string stringV;
182+
boost::optional<bool> boolV;
183+
boost::optional<int> intV;
184+
boost::optional<boost::gregorian::date> dateV;
185+
boost::optional<int64_t> longV;
186+
boost::optional<float> floatV;
187+
boost::optional<double> doubleV;
188+
boost::optional<std::string> stringV;
188189

189190
explicit Field(TSDataType::TSDataType a) {
190191
dataType = a;

iotdb-client/client-cpp/src/main/IoTDBRpcDataSet.cpp

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
#include <stdexcept>
2323

2424
#include "IoTDBRpcDataSet.h"
25+
26+
#include <boost/optional/optional.hpp>
27+
2528
#include "Column.h"
2629

2730
const int32_t IoTDBRpcDataSet::startIndex = 2;
@@ -257,83 +260,83 @@ bool IoTDBRpcDataSet::isNull(int32_t index, int32_t rowNum) {
257260
return index >= 0 && curTsBlock_->getColumn(index)->isNull(rowNum);
258261
}
259262

260-
bool IoTDBRpcDataSet::getBooleanByIndex(int32_t columnIndex) {
263+
boost::optional<bool> IoTDBRpcDataSet::getBooleanByIndex(int32_t columnIndex) {
261264
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
262265
return getBooleanByTsBlockColumnIndex(index);
263266
}
264267

265-
bool IoTDBRpcDataSet::getBoolean(const std::string& columnName) {
268+
boost::optional<bool> IoTDBRpcDataSet::getBoolean(const std::string& columnName) {
266269
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
267270
return getBooleanByTsBlockColumnIndex(index);
268271
}
269272

270-
bool IoTDBRpcDataSet::getBooleanByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
273+
boost::optional<bool> IoTDBRpcDataSet::getBooleanByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
271274
checkRecord();
272275
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
273276
lastReadWasNull_ = false;
274277
return curTsBlock_->getColumn(tsBlockColumnIndex)->getBoolean(tsBlockIndex_);
275278
}
276279
else {
277280
lastReadWasNull_ = true;
278-
return false;
281+
return boost::none;
279282
}
280283
}
281284

282-
double IoTDBRpcDataSet::getDoubleByIndex(int32_t columnIndex) {
285+
boost::optional<double> IoTDBRpcDataSet::getDoubleByIndex(int32_t columnIndex) {
283286
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
284287
return getDoubleByTsBlockColumnIndex(index);
285288
}
286289

287-
double IoTDBRpcDataSet::getDouble(const std::string& columnName) {
290+
boost::optional<double> IoTDBRpcDataSet::getDouble(const std::string& columnName) {
288291
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
289292
return getDoubleByTsBlockColumnIndex(index);
290293
}
291294

292-
double IoTDBRpcDataSet::getDoubleByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
295+
boost::optional<double> IoTDBRpcDataSet::getDoubleByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
293296
checkRecord();
294297
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
295298
lastReadWasNull_ = false;
296299
return curTsBlock_->getColumn(tsBlockColumnIndex)->getDouble(tsBlockIndex_);
297300
}
298301
else {
299302
lastReadWasNull_ = true;
300-
return 0.0;
303+
return boost::none;
301304
}
302305
}
303306

304-
float IoTDBRpcDataSet::getFloatByIndex(int32_t columnIndex) {
307+
boost::optional<float> IoTDBRpcDataSet::getFloatByIndex(int32_t columnIndex) {
305308
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
306309
return getFloatByTsBlockColumnIndex(index);
307310
}
308311

309-
float IoTDBRpcDataSet::getFloat(const std::string& columnName) {
312+
boost::optional<float> IoTDBRpcDataSet::getFloat(const std::string& columnName) {
310313
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
311314
return getFloatByTsBlockColumnIndex(index);
312315
}
313316

314-
float IoTDBRpcDataSet::getFloatByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
317+
boost::optional<float> IoTDBRpcDataSet::getFloatByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
315318
checkRecord();
316319
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
317320
lastReadWasNull_ = false;
318321
return curTsBlock_->getColumn(tsBlockColumnIndex)->getFloat(tsBlockIndex_);
319322
}
320323
else {
321324
lastReadWasNull_ = true;
322-
return 0.0f;
325+
return boost::none;
323326
}
324327
}
325328

326-
int32_t IoTDBRpcDataSet::getIntByIndex(int32_t columnIndex) {
329+
boost::optional<int32_t> IoTDBRpcDataSet::getIntByIndex(int32_t columnIndex) {
327330
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
328331
return getIntByTsBlockColumnIndex(index);
329332
}
330333

331-
int32_t IoTDBRpcDataSet::getInt(const std::string& columnName) {
334+
boost::optional<int32_t> IoTDBRpcDataSet::getInt(const std::string& columnName) {
332335
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
333336
return getIntByTsBlockColumnIndex(index);
334337
}
335338

336-
int32_t IoTDBRpcDataSet::getIntByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
339+
boost::optional<int32_t> IoTDBRpcDataSet::getIntByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
337340
checkRecord();
338341
if (!isNull(tsBlockColumnIndex, tsBlockIndex_)) {
339342
lastReadWasNull_ = false;
@@ -345,21 +348,21 @@ int32_t IoTDBRpcDataSet::getIntByTsBlockColumnIndex(int32_t tsBlockColumnIndex)
345348
}
346349
else {
347350
lastReadWasNull_ = true;
348-
return 0;
351+
return boost::none;
349352
}
350353
}
351354

352-
int64_t IoTDBRpcDataSet::getLongByIndex(int32_t columnIndex) {
355+
boost::optional<int64_t> IoTDBRpcDataSet::getLongByIndex(int32_t columnIndex) {
353356
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
354357
return getLongByTsBlockColumnIndex(index);
355358
}
356359

357-
int64_t IoTDBRpcDataSet::getLong(const std::string& columnName) {
360+
boost::optional<int64_t> IoTDBRpcDataSet::getLong(const std::string& columnName) {
358361
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
359362
return getLongByTsBlockColumnIndex(index);
360363
}
361364

362-
int64_t IoTDBRpcDataSet::getLongByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
365+
boost::optional<int64_t> IoTDBRpcDataSet::getLongByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
363366
checkRecord();
364367
if (tsBlockColumnIndex < 0) {
365368
lastReadWasNull_ = false;
@@ -375,7 +378,7 @@ int64_t IoTDBRpcDataSet::getLongByTsBlockColumnIndex(int32_t tsBlockColumnIndex)
375378
}
376379
else {
377380
lastReadWasNull_ = true;
378-
return 0;
381+
return boost::none;
379382
}
380383
}
381384

@@ -401,25 +404,25 @@ std::shared_ptr<Binary> IoTDBRpcDataSet::getBinaryByTsBlockColumnIndex(int32_t t
401404
}
402405
}
403406

404-
std::string IoTDBRpcDataSet::getStringByIndex(int32_t columnIndex) {
407+
boost::optional<std::string> IoTDBRpcDataSet::getStringByIndex(int32_t columnIndex) {
405408
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
406409
return getStringByTsBlockColumnIndex(index);
407410
}
408411

409-
std::string IoTDBRpcDataSet::getString(const std::string& columnName) {
412+
boost::optional<std::string> IoTDBRpcDataSet::getString(const std::string& columnName) {
410413
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
411414
return getStringByTsBlockColumnIndex(index);
412415
}
413416

414-
std::string IoTDBRpcDataSet::getStringByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
417+
boost::optional<std::string> IoTDBRpcDataSet::getStringByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
415418
checkRecord();
416-
if (tsBlockColumnIndex == -1) {
419+
if (tsBlockColumnIndex < 0) {
417420
int64_t timestamp = curTsBlock_->getTimeByIndex(tsBlockIndex_);
418421
return std::to_string(timestamp);
419422
}
420423
if (isNull(tsBlockColumnIndex, tsBlockIndex_)) {
421424
lastReadWasNull_ = true;
422-
return "";
425+
return boost::none;
423426
}
424427
lastReadWasNull_ = false;
425428
return getStringByTsBlockColumnIndexAndDataType(tsBlockColumnIndex,
@@ -470,22 +473,25 @@ int64_t IoTDBRpcDataSet::getTimestamp(const std::string& columnName) {
470473
}
471474

472475
int64_t IoTDBRpcDataSet::getTimestampByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
473-
return getLongByTsBlockColumnIndex(tsBlockColumnIndex);
476+
return getLongByTsBlockColumnIndex(tsBlockColumnIndex).value();
474477
}
475478

476-
boost::gregorian::date IoTDBRpcDataSet::getDateByIndex(int32_t columnIndex) {
479+
boost::optional<boost::gregorian::date> IoTDBRpcDataSet::getDateByIndex(int32_t columnIndex) {
477480
int32_t index = getTsBlockColumnIndexForColumnIndex(columnIndex);
478481
return getDateByTsBlockColumnIndex(index);
479482
}
480483

481-
boost::gregorian::date IoTDBRpcDataSet::getDate(const std::string& columnName) {
484+
boost::optional<boost::gregorian::date> IoTDBRpcDataSet::getDate(const std::string& columnName) {
482485
int32_t index = getTsBlockColumnIndexForColumnName(columnName);
483486
return getDateByTsBlockColumnIndex(index);
484487
}
485488

486-
boost::gregorian::date IoTDBRpcDataSet::getDateByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
487-
int32_t value = getIntByTsBlockColumnIndex(tsBlockColumnIndex);
488-
return parseIntToDate(value);
489+
boost::optional<boost::gregorian::date> IoTDBRpcDataSet::getDateByTsBlockColumnIndex(int32_t tsBlockColumnIndex) {
490+
auto value = getIntByTsBlockColumnIndex(tsBlockColumnIndex);
491+
if (!value.is_initialized()) {
492+
return boost::none;
493+
}
494+
return parseIntToDate(value.value());
489495
}
490496

491497
TSDataType::TSDataType IoTDBRpcDataSet::getDataTypeByIndex(int32_t columnIndex) {

iotdb-client/client-cpp/src/main/IoTDBRpcDataSet.h

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,24 @@ class IoTDBRpcDataSet {
6969
bool isNull(int32_t index, int32_t rowNum);
7070
bool isNullByIndex(int32_t columnIndex);
7171
bool isNullByColumnName(const std::string& columnName);
72-
bool getBooleanByIndex(int32_t columnIndex);
73-
bool getBoolean(const std::string& columnName);
74-
double getDoubleByIndex(int32_t columnIndex);
75-
double getDouble(const std::string& columnName);
76-
float getFloatByIndex(int32_t columnIndex);
77-
float getFloat(const std::string& columnName);
78-
int32_t getIntByIndex(int32_t columnIndex);
79-
int32_t getInt(const std::string& columnName);
80-
int64_t getLongByIndex(int32_t columnIndex);
81-
int64_t getLong(const std::string& columnName);
72+
boost::optional<bool> getBooleanByIndex(int32_t columnIndex);
73+
boost::optional<bool> getBoolean(const std::string& columnName);
74+
boost::optional<double> getDoubleByIndex(int32_t columnIndex);
75+
boost::optional<double> getDouble(const std::string& columnName);
76+
boost::optional<float> getFloatByIndex(int32_t columnIndex);
77+
boost::optional<float> getFloat(const std::string& columnName);
78+
boost::optional<int32_t> getIntByIndex(int32_t columnIndex);
79+
boost::optional<int32_t> getInt(const std::string& columnName);
80+
boost::optional<int64_t> getLongByIndex(int32_t columnIndex);
81+
boost::optional<int64_t> getLong(const std::string& columnName);
8282
std::shared_ptr<Binary> getBinaryByIndex(int32_t columnIndex);
8383
std::shared_ptr<Binary> getBinary(const std::string& columnName);
84-
std::string getStringByIndex(int32_t columnIndex);
85-
std::string getString(const std::string& columnName);
84+
boost::optional<std::string> getStringByIndex(int32_t columnIndex);
85+
boost::optional<std::string> getString(const std::string& columnName);
8686
int64_t getTimestampByIndex(int32_t columnIndex);
8787
int64_t getTimestamp(const std::string& columnName);
88-
boost::gregorian::date getDateByIndex(int32_t columnIndex);
89-
boost::gregorian::date getDate(const std::string& columnName);
88+
boost::optional<boost::gregorian::date> getDateByIndex(int32_t columnIndex);
89+
boost::optional<boost::gregorian::date> getDate(const std::string& columnName);
9090

9191
TSDataType::TSDataType getDataTypeByIndex(int32_t columnIndex);
9292
TSDataType::TSDataType getDataType(const std::string& columnName);
@@ -113,15 +113,15 @@ class IoTDBRpcDataSet {
113113
int32_t getTsBlockColumnIndexForColumnIndex(int32_t columnIndex);
114114
void checkRecord();
115115
TSDataType::TSDataType getDataTypeByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
116-
bool getBooleanByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
116+
boost::optional<bool> getBooleanByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
117117
std::string getStringByTsBlockColumnIndexAndDataType(int32_t index, TSDataType::TSDataType tsDataType);
118-
double getDoubleByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
119-
float getFloatByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
120-
int32_t getIntByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
121-
int64_t getLongByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
118+
boost::optional<double> getDoubleByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
119+
boost::optional<float> getFloatByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
120+
boost::optional<int32_t> getIntByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
121+
boost::optional<int64_t> getLongByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
122122
std::shared_ptr<Binary> getBinaryByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
123-
std::string getStringByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
124-
boost::gregorian::date getDateByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
123+
boost::optional<std::string> getStringByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
124+
boost::optional<boost::gregorian::date> getDateByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
125125
int64_t getTimestampByTsBlockColumnIndex(int32_t tsBlockColumnIndex);
126126

127127
std::string sql_;

iotdb-client/client-cpp/src/main/NodesSupplier.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,18 @@ std::vector<TEndPoint> NodesSupplier::fetchLatestEndpoints() {
176176
std::vector<TEndPoint> ret;
177177
while (sessionDataSet->hasNext()) {
178178
auto record = sessionDataSet->next();
179-
std::string ip = record->fields.at(columnAddrIdx).stringV;
180-
int32_t port = record->fields.at(columnPortIdx).intV;
181-
std::string status = record->fields.at(columnStatusIdx).stringV;
182-
179+
std::string ip;
180+
int32_t port;
181+
std::string status;
182+
if (record->fields.at(columnAddrIdx).stringV.is_initialized()) {
183+
ip = record->fields.at(columnAddrIdx).stringV.value();
184+
}
185+
if (record->fields.at(columnPortIdx).intV.is_initialized()) {
186+
port = record->fields.at(columnPortIdx).intV.value();
187+
}
188+
if (record->fields.at(columnStatusIdx).stringV.is_initialized()) {
189+
status = record->fields.at(columnStatusIdx).stringV.value();
190+
}
183191
if (ip == "0.0.0.0" || status == REMOVING_STATUS) {
184192
log_warn("Skipping invalid node: " + ip + ":" + to_string(port));
185193
continue;

0 commit comments

Comments
 (0)