Как работать с DATETIME в MySQL Connector / C ++ 8.0? - PullRequest
0 голосов
/ 22 января 2020

Я использую mysql -connector- cpp -8.0.18 (https://github.com/mysql/mysql-connector-cpp)

Mysql хранилище результатов - переменная с типом mysqlx :: Value https://dev.mysql.com/doc/dev/connector-cpp/8.0/classmysqlx_1_1abi2_1_1r0_1_1_value.html

/*
CREATE TABLE `table_name` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `data_update` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*/


RowResult res = mysession.sql("SELECT id, data_update FROM table_name").execute();

Row row;
while ((row = res.fetchOne())) {
  cout << "Id: " << row[0] << endl; // Ok
  std::string data_update = row[1]; // How to get datetime here?
  // row[1].getType() == Type::Document(8)
}

Как мне работать с DATETIME?

1 Ответ

0 голосов
/ 03 февраля 2020

Я нашел ответ на mysql форуме

Решением является анализ необработанных данных. Используется protobuf base 128 варианта

Простой пример декодирования:

uint64_t DecodeOne(uint8_t * in , size_t * len) {
  uint64_t r = 0;

  do {
    uint64_t val = * in ;
    r = (r << 7) | (uint64_t)(val & 127); in ++;
    ( * len) --;
  } while (( * len > 0) && (uint64_t( * in ) & 128));

  return r;
}

void DecodeBuffer(uint8_t * buffer, size_t size) {
  std::vector < uint8_t > reverseBuffer;
  for (size_t i = 1; i <= size; i++) {
    reverseBuffer.push_back(buffer[size - i]);
  }

  size_t tmpSize = size;
  uint8_t * reverseData = reverseBuffer.data();

  while (tmpSize > 0) {
    std::cout << DecodeOne( & reverseData[size - tmpSize], & tmpSize) << " ";
  }
  std::cout << "\n";
}

mysqlx_get_bytes(row, idx, 0, data, size);
DecodeBuffer(data, size);

std::pair <
  const unsigned char * , size_t > res = value.getRawBytes();
DecodeBuffer(res.first, res.second);

Но есть ошибка в CPP API в mysql -connector- cpp -8.0.18.

CPP результат не содержит секунд. Так что можно использовать только c API.

...