--- copy.c.orig	2003-05-18 16:39:44.000000000 +1000
+++ copy.c	2003-05-18 23:19:42.000000000 +1000
@@ -17,6 +17,7 @@
 #else
 #include <io.h>					/* I think */
 #endif
+#include <time.h>           /* For time() */
 
 #include "libpq-fe.h"
 #include "pqexpbuffer.h"
@@ -445,6 +446,10 @@
 	bool		copydone = false;		/* haven't started yet */
 	char		copybuf[COPYBUFSIZ];
 	int			ret;
+	unsigned int	linecount = 0;
+	time_t		starttime, currtime;
+
+	time( &starttime );
 
 	while (!copydone)
 	{
@@ -459,6 +464,20 @@
 		else
 		{
 			fputs(copybuf, copystream);
+			linecount++;
+			if( pset.cur_cmd_interactive && (linecount % 1000) == 0 )
+			{
+				int duration;
+				
+				time( &currtime );
+				duration = currtime - starttime;
+				
+				/* We use stderr because it's unbuffered. The 
+				 * \r at the end so that error messages overwrite it */
+				fprintf( stderr, "COPY OUT %d:%02d:%02d  %d lines\r", 
+						 duration / 3600, (duration / 60) % 60, duration % 60,
+						 linecount );
+			}
 			switch (ret)
 			{
 				case EOF:
@@ -475,6 +494,19 @@
 	fflush(copystream);
 	ret = !PQendcopy(conn);
 	ResetCancelConn();
+	
+	/* Summary if everything went ok */
+	if( ret )
+	{
+		int duration;
+		
+		time( &currtime );
+		duration = currtime - starttime;
+		
+		fprintf( stderr, "\rCOPY OUT %d:%02d:%02d  %d lines completed.\n", 
+				 duration / 3600, (duration / 60) % 60, duration % 60,
+				 linecount );
+	}
 	return ret;
 }
 
@@ -504,12 +536,15 @@
 	int			bufleft;
 	int			c = 0;
 	int			ret;
-	unsigned int linecount = 0;
+	unsigned int	linecount = 0;
+	time_t		starttime, currtime;
 
 #ifdef USE_ASSERT_CHECKING
 	assert(copy_in_state);
 #endif
 
+	time( &starttime );
+
 	if (prompt)					/* disable prompt if not interactive */
 	{
 		if (!isatty(fileno(copystream)))
@@ -544,8 +579,6 @@
 			{
 				PQputline(conn, "\\.");
 				copydone = true;
-				if (pset.cur_cmd_interactive)
-					puts("\\.");
 				break;
 			}
 			PQputline(conn, copybuf);
@@ -561,9 +594,37 @@
 		}
 		PQputline(conn, "\n");
 		linecount++;
+		
+		if( pset.cur_cmd_interactive && (linecount % 1000) == 0 )
+		{
+			int duration;
+			
+			time( &currtime );
+			duration = currtime - starttime;
+			
+			/* We use stderr because it's unbuffered. The 
+			 * \r at the end so that error messages overwrite it */
+			fprintf( stderr, "COPY IN %d:%02d:%02d  %d lines\r", 
+					 duration / 3600, (duration / 60) % 60, duration % 60,
+					 linecount );
+		}
 	}
 	ret = !PQendcopy(conn);
 	copy_in_state = false;
 	pset.lineno += linecount;
+
+	/* Print final summary if everything went OK */
+	if( ret && pset.cur_cmd_interactive )
+	{
+		int duration;
+		
+		time( &currtime );
+		duration = currtime - starttime;
+		
+		/* Subtract one as last line is not counted */
+		fprintf( stderr, "\rCOPY IN %d:%02d:%02d  %d lines completed.\n\\.\n", 
+				 duration / 3600, (duration / 60) % 60, duration % 60,
+				 linecount-1 );
+	}
 	return ret;
 }
