2016-08-09 79 views
0

Ich erstelle PostgreSQL-Datenbank-Client, der als Ersatz für SQL Server-Client funktionieren sollte. Beide Clients sind in C++ geschrieben. Eine der unterstützten Operationen ist die Massenkopie von einer gegebenen Instanz der Klasse, die die Methode std::string ReadChunk() enthält.Postgres COPY VON Daten Formatierung vor dem Einfügen

Vorerst ich libpq Funktionen:

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

aber stellt sich heraus, dass ich auch in der Lage sein sollte, zu lange Varchars abzuschneiden und legen NULL zwischen zwei aufeinanderfolgenden \t, wenn sie auf NULL festlegbare Spalte repräsentieren. Gibt es eine Möglichkeit, diese Konvertierung auf der Datenbankseite durchzuführen, C-Trigger oder ähnliches zu schreiben? Oder sollte ich Argumentparsing auf der Clientseite implementieren, etwa SQL Server bcp_bind?

Antwort

0

Meine Implementierung schob grundlegende Datenverarbeitung auf Datenbank-Client. Es schien eine gute Lösung zu sein, da die Datenquelle datenbankunabhängig war und Lesedaten nur einmal durchlaufen wurden - ich brauchte nur die Kürzung und NULL Insertion.

So endgültige Lösung bestand aus Klasse RowReader mit Methoden bool HasNext() und NextRow(CRow&) für jede Datenbank nächste Zeile in die Tabellendarstellung und abstrakten RowSender mit Implementierungen zu lesen.