Я создаю клиент базы данных PostgreSQL, который должен работать вместо клиента SQL Server. Оба клиента написаны на C ++. Одной из поддерживаемых операций является массовое копирование из данного экземпляра класса, содержащего std::string ReadChunk()
метод.
Сейчас я использую функции 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
?
Моя реализация перенесла базовую обработку данных на клиент базы данных. Это казалось хорошим решением, так как источник данных не зависел от базы данных и проходил чтение данных только один раз — мне нужно было только усечение и NULL
вставки.
Таким образом, окончательное решение состояло из класса RowReader
с методами bool HasNext()
а также NextRow(CRow&)
чтение следующей строки в табличном представлении и резюме RowSender
с реализациями для каждой базы данных.
Других решений пока нет …