public void End() { IntPtr res; string err = string.Empty; #if CODECONTRACTS Contract.Assume(mConn != null); #endif IntPtr conn = mConn.PGConnection; if (mColBuf == IntPtr.Zero) { return; } int ret = PqsqlBinaryFormat.pqcb_put_end(mColBuf); // flush column buffer if (ret != 1) { err = err.Insert(0, "Could not send end-of-data indication: "); goto bailout; } res = PqsqlWrapper.PQgetResult(conn); if (res != IntPtr.Zero) { ExecStatusType s = PqsqlWrapper.PQresultStatus(res); PqsqlWrapper.PQclear(res); if (s == ExecStatusType.PGRES_COPY_IN) { // still in COPY_IN mode? bail out! byte[] b = PqsqlUTF8Statement.CreateUTF8Statement("COPY FROM cancelled by client"); unsafe { fixed(byte *bs = b) { ret = PqsqlWrapper.PQputCopyEnd(conn, bs); } } res = PqsqlWrapper.PQgetResult(conn); if (res != IntPtr.Zero) { s = PqsqlWrapper.PQresultStatus(res); PqsqlWrapper.PQclear(res); } err = err.Insert(0, "Cancelled COPY FROM while still in COPY_IN mode (" + s + "," + ret + "): "); goto bailout; } if (s != ExecStatusType.PGRES_COMMAND_OK) { err = err.Insert(0, "COPY FROM failed (" + s + "): "); goto bailout; } // consume all remaining results until we reach the NULL result while ((res = PqsqlWrapper.PQgetResult(conn)) != IntPtr.Zero) { // always free mResult PqsqlWrapper.PQclear(res); } return; } bailout: err += mConn.GetErrorMessage(); throw new PqsqlException(err); }
protected string Error() { IntPtr res; string err = string.Empty; IntPtr conn = mConn.PGConnection; res = PqsqlWrapper.PQgetResult(conn); if (res != IntPtr.Zero) { ExecStatusType s = PqsqlWrapper.PQresultStatus(res); PqsqlWrapper.PQclear(res); if (s == ExecStatusType.PGRES_COPY_IN || s == ExecStatusType.PGRES_COPY_OUT) { if (s == ExecStatusType.PGRES_COPY_IN) { // still in COPY_IN mode? bail out! byte[] b = PqsqlUTF8Statement.CreateUTF8Statement("COPY cancelled by client"); int end; unsafe { fixed(byte *bs = b) { end = PqsqlWrapper.PQputCopyEnd(conn, bs); } } if (end != 1) { err = err.Insert(0, "Cannot cancel COPY (" + s + "): "); goto bailout; } } res = PqsqlWrapper.PQgetResult(conn); if (res != IntPtr.Zero) { s = PqsqlWrapper.PQresultStatus(res); PqsqlWrapper.PQclear(res); } } if (s != ExecStatusType.PGRES_COMMAND_OK) { err = err.Insert(0, "COPY failed (" + s + "): "); goto bailout; } // consume all remaining results until we reach the NULL result while ((res = PqsqlWrapper.PQgetResult(conn)) != IntPtr.Zero) { // always free mResult PqsqlWrapper.PQclear(res); } return(err); } bailout: err += mConn.GetErrorMessage(); return(err); }