pqxx как ВЫБРАТЬ, если в векторе байта - PullRequest
0 голосов
/ 27 мая 2020

У меня есть серия хэшей SHA-1, которые я использую в качестве отпечатков пальцев, где каждый отпечаток представлен как std::vector<uint8_t>, а серии упорядочены в вектор векторов. Мне нужно проверить каждый отпечаток пальца, если он уже есть в моей базе данных, где он хранится как bytea.

Самый эффективный способ сделать это - использовать «SELECT IF IN LIST», чтобы

SELECT fingerprint from table WHERE fingerprint IN list;

Теперь в libpqxx нет ограничений на то, какие запросы вы можете запускать (насколько я знаю), так что это должно быть возможно. Однако я наткнулся на закуску с синтаксическим анализом векторов для оператора select. Мой процесс выглядит следующим образом:

#include <pqxx>
#include <cstdint>
#include <vector>
...
// m_conn is my Database connection 
m_conn.prepare("seen_fingerprints", SELECT fingerprint FROM table WHERE fingerprint in $1");
...
std::vector<std::vector<uint8_t>> fingerprints; // Assume filled with data
std::vector<pqxx::binarystring> b_fingerprints; 

for (const auto& fingerprint : fingerprints)
{
    pqxx::binarystring s(fingerprint.data(), fingerprint.size()); 
    b_fingerprints.push_back(s); 
}

pqxx::work worker{m_conn};
pqxx::result res{worker.exec_preapred("seen_fingerprints", b_fingerprints)};
worker.commit();

Теперь моя проблема в том, что когда я пытаюсь скомпилировать, я получаю эту ошибку:

In file included from ../src/alexandria-storage-node/database.cpp:1:
In file included from ../src/alexandria-storage-node/database.hpp:5:
In file included from /usr/local/include/pqxx/pqxx:4:
In file included from /usr/local/include/pqxx/connection:6:
In file included from /usr/local/include/pqxx/connection.hxx:27:
In file included from /usr/local/include/pqxx/prepared_statement.hxx:17:
In file included from /usr/local/include/pqxx/internal/statement_parameters.hxx:26:
In file included from /usr/local/include/pqxx/strconv:4:
/usr/local/include/pqxx/strconv.hxx:154:23: error: inline function 'pqxx::string_traits<pqxx::binarystring>::into_buf' is not defined [-Werror,-Wundefined-inline]
  static inline char *into_buf(char *begin, char *end, TYPE const &value);
                      ^
/usr/local/include/pqxx/internal/conversions.hxx:732:23: note: used here
    string_traits<T>::into_buf(buf.data(), buf.data() + buf.size(), value)};
                      ^

Это связано с тем, что pqxx::binarystring находится в vector, у меня есть другие запросы, которые работают с одной двоичной строкой. Как я могу решить эту проблему, потому что у меня есть только другие варианты:

  1. Создать полную строку запроса
  2. Преобразовать массив двоичных строк в std::string
  3. Или наконец go по одному
...