2016-08-09 12 views
0

Я создаю клиент базы данных PostgreSQL, который должен работать как замена клиента SQL Server. Оба клиента написаны на C++. Одной из поддерживаемых операций является массовая копия из данного экземпляра класса, содержащего метод std::string ReadChunk().Postgres COPY FROM форматирование данных перед вставкой

Сейчас я использую libpq функции:

PQexec(connection, "COPY tablename FROM STDIN"); 
while(reader.HasNext()) { 
    PQputCopyData(connection, reader.ReadChunk().c_str()); 
} 
PQputCopyEnd(connection); 

Но получается, что я должен быть в состоянии укоротить слишком длинные VARCHARS и вставить NULL между двумя последовательными \t, если они представляют обнуляемого столбец. Есть ли способ выполнить это преобразование на стороне базы данных, написав триггеры C или что-то подобное? Или я должен реализовать парсинг аргументов на стороне клиента, что-то вроде SQL Server bcp_bind?

ответ

0

Мое внедрение подтолкнуло базовую обработку данных к клиенту базы данных. Это казалось хорошим решением, поскольку источник данных был независимым от базы данных, и он проходил чтение данных только один раз - мне нужно было только усечение и вставка NULL.

Так окончательное решение состояло из класса RowReader с методами bool HasNext() и NextRow(CRow&) чтение следующей строки в представлении таблицы и абстрактной RowSender с реализациями для каждой базы данных.