У меня есть серия хэшей 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, у меня есть другие запросы, которые работают с одной двоичной строкой. Как я могу решить эту проблему, потому что у меня есть только другие варианты:
- Создать полную строку запроса
- Преобразовать массив двоичных строк в
std::string
- Или наконец go по одному