Как вы анализируете столбец массива в Postgresql Используя libpq на Linux - PullRequest
1 голос
/ 10 января 2020

Для базовых c типов данных у меня нет проблем с синтаксическим анализом данных в таком формате:

  if (FALSE == PQgetisnull(res, rowNumber, columnIndex))
  {
     retVal.m_assignedSocket = atol(PQgetvalue(res, rowNumber, columnIndex));
  } else
  {
     retVal.m_assignedSocket = 0;
  }

Я хотел бы иметь поле массива в одной из моих таблиц, которое представляет собой массив bigints. Я полагаю, что могу вставить данные следующим образом:

  // array elements are separated by curly braces
  insertQuery += "{";

  for (size_t i = 0; i < settings.m_stepVector.size(); i++)
  {
     if (snprintf(buffer, sizeof(buffer), ", %llu", settings.m_stepVector[i]) > (int) sizeof(buffer))
     {
        LOG_SYSTEM_WARNING("Unexpected string truncation\n");
     }
     insertQuery += buffer;
  }

  insertQuery += "}";

Проблема заключается в разборе строки. Я не нашел ни одного примера или документации, указывающей формат возвращаемого столбца массива. Я предполагаю, что это строка с фигурными скобками на каждом конце. Какой формат между фигурными скобками? Не похоже, что это что-то новое, но я нигде не могу найти ответ. Может быть, я не знаю правильных ключевых слов для поиска. Я попытался postgresql, массив, PQgetvalue и синтаксический анализ.

1 Ответ

0 голосов
/ 14 января 2020

Заключительные эксперименты показывают, что это работает:

  retVal.m_rules.clear();
  pqxx::array_parser parser = result[columnIndex].as_array();
  arrayObject obj = parser.get_next();
  while (obj.first != pqxx::array_parser::done)
  {
     if (obj.first == pqxx::array_parser::string_value)
     {
        // arrays return a string value so atoll needed to convert to number
        retVal.m_rules.push_back(atoll(obj.second.c_str()));
     }
     obj = parser.get_next();
  }
  columnIndex++;

Результат определяется как pqxx :: result :: iterator & result.

...