On Fri, 2005-12-16 at 15:56 -0500, Tom Lane wrote:
> Simon Riggs <[EMAIL PROTECTED]> writes:
> > On Fri, 2005-12-16 at 13:59 -0500, Tom Lane wrote:
> >> Would -1 work, or just confuse people?
> 
> > That was my preference, I just thought it wouldn't be popular...
> > So I'll happily change that.
> 
> OK.  While you're at it, I didn't like the long name either ;-).
> We do not use the abbrevation txn anywhere, so I think it's bad to
> introduce it here.  I'd vote for spelling out --single-transaction,
> or maybe just --single.  I believe you can abbreviate long switch names
> to any unique prefix, so there's not really any more typing here.

Changes as discussed. "singletransaction.patch" attached.

options:
-1 or --single-transaction

Functions work as described.

Best Regards, Simon Riggs
Index: src/bin/pg_dump/pg_backup.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v
retrieving revision 1.37
diff -c -r1.37 pg_backup.h
*** src/bin/pg_dump/pg_backup.h	15 Oct 2005 02:49:38 -0000	1.37
--- src/bin/pg_dump/pg_backup.h	17 Dec 2005 16:51:25 -0000
***************
*** 115,120 ****
--- 115,122 ----
  
  	int			suppressDumpWarnings;	/* Suppress output of WARNING entries
  										 * to stderr */
+     bool        single_txn;
+ 
  } RestoreOptions;
  
  /*
Index: src/bin/pg_dump/pg_backup_archiver.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v
retrieving revision 1.118
diff -c -r1.118 pg_backup_archiver.c
*** src/bin/pg_dump/pg_backup_archiver.c	22 Nov 2005 18:17:28 -0000	1.118
--- src/bin/pg_dump/pg_backup_archiver.c	17 Dec 2005 16:51:27 -0000
***************
*** 217,222 ****
--- 217,225 ----
  
  	AH->stage = STAGE_PROCESSING;
  
+     if (ropt->single_txn)
+ 		ahprintf(AH, "BEGIN;\n\n");
+ 
  	/*
  	 * Drop the items at the start, in reverse order
  	 */
***************
*** 365,370 ****
--- 368,376 ----
  		}
  	}
  
+     if (ropt->single_txn)
+ 		ahprintf(AH, "COMMIT;\n\n");
+ 
  	if (AH->public.verbose)
  		dumpTimestamp(AH, "Completed on", time(NULL));
  
Index: src/bin/pg_dump/pg_restore.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v
retrieving revision 1.73
diff -c -r1.73 pg_restore.c
*** src/bin/pg_dump/pg_restore.c	15 Oct 2005 02:49:39 -0000	1.73
--- src/bin/pg_dump/pg_restore.c	17 Dec 2005 16:51:27 -0000
***************
*** 111,116 ****
--- 111,117 ----
  		{"use-list", 1, NULL, 'L'},
  		{"username", 1, NULL, 'U'},
  		{"verbose", 0, NULL, 'v'},
+ 		{"single-transaction", 0, NULL, '1'},
  
  		/*
  		 * the following options don't have an equivalent short option letter,
***************
*** 142,148 ****
  		}
  	}
  
! 	while ((c = getopt_long(argc, argv, "acCd:ef:F:h:iI:lL:n:Op:P:RsS:t:T:uU:vWxX:",
  							cmdopts, NULL)) != -1)
  	{
  		switch (c)
--- 143,149 ----
  		}
  	}
  
! 	while ((c = getopt_long(argc, argv, "acCd:ef:F:h:iI:lL:n:Op:P:RsS:t:T:uU:vWxX:1",
  							cmdopts, NULL)) != -1)
  	{
  		switch (c)
***************
*** 185,193 ****
--- 186,200 ----
  				opts->tocFile = strdup(optarg);
  				break;
  
+ 			case 'n':			/* Dump data for this schema only */
+ 				opts->selTypes = 1;
+ 				opts->schemaNames = strdup(optarg);
+ 				break;
+ 
  			case 'O':
  				opts->noOwner = 1;
  				break;
+ 
  			case 'p':
  				if (strlen(optarg) != 0)
  					opts->pgport = strdup(optarg);
***************
*** 223,233 ****
  				opts->tableNames = strdup(optarg);
  				break;
  
- 			case 'n':			/* Dump data for this schema only */
- 				opts->selTypes = 1;
- 				opts->schemaNames = strdup(optarg);
- 				break;
- 
  			case 'u':
  				opts->requirePassword = true;
  				opts->username = simple_prompt("User name: ", 100, true);
--- 230,235 ----
***************
*** 268,273 ****
--- 270,280 ----
  			case 0:
  				break;
  
+ 			case '1':			/* Restore data in a single transaction */
+ 				opts->single_txn = true;
+ 				opts->exit_on_error = true;
+ 				break;
+ 
  			default:
  				fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
  				exit(1);
***************
*** 394,399 ****
--- 401,407 ----
  	printf(_("  -X use-set-session-authorization, --use-set-session-authorization\n"
  			 "                           use SESSION AUTHORIZATION commands instead of\n"
  			 "                           OWNER TO commands\n"));
+ 	printf(_("  -1, --single-transaction restore as a single transaction\n"));
  
  	printf(_("\nConnection options:\n"));
  	printf(_("  -h, --host=HOSTNAME      database server host or socket directory\n"));
Index: src/bin/psql/command.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.155
diff -c -r1.155 command.c
*** src/bin/psql/command.c	8 Dec 2005 21:18:22 -0000	1.155
--- src/bin/psql/command.c	17 Dec 2005 16:51:29 -0000
***************
*** 523,529 ****
  		else
  		{
  			expand_tilde(&fname);
! 			success = (process_file(fname) == EXIT_SUCCESS);
  			free(fname);
  		}
  	}
--- 523,529 ----
  		else
  		{
  			expand_tilde(&fname);
! 			success = (process_file(fname, false) == EXIT_SUCCESS);
  			free(fname);
  		}
  	}
***************
*** 1317,1327 ****
   * MainLoop() error code.
   */
  int
! process_file(char *filename)
  {
  	FILE	   *fd;
  	int			result;
  	char	   *oldfilename;
  
  	if (!filename)
  		return EXIT_FAILURE;
--- 1317,1328 ----
   * MainLoop() error code.
   */
  int
! process_file(char *filename, bool single_txn)
  {
  	FILE	   *fd;
  	int			result;
  	char	   *oldfilename;
+ 	PGresult   *res; 
  
  	if (!filename)
  		return EXIT_FAILURE;
***************
*** 1337,1343 ****
--- 1338,1350 ----
  
  	oldfilename = pset.inputfile;
  	pset.inputfile = filename;
+ 
+     if (single_txn)
+         res = PSQLexec("BEGIN", false);
  	result = MainLoop(fd);
+     if (single_txn)
+         res = PSQLexec("COMMIT", false);
+ 
  	fclose(fd);
  	pset.inputfile = oldfilename;
  	return result;
Index: src/bin/psql/command.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/command.h,v
retrieving revision 1.22
diff -c -r1.22 command.h
*** src/bin/psql/command.h	1 Jan 2005 05:43:08 -0000	1.22
--- src/bin/psql/command.h	17 Dec 2005 16:51:29 -0000
***************
*** 28,34 ****
  extern backslashResult HandleSlashCmds(PsqlScanState scan_state,
  				PQExpBuffer query_buf);
  
! extern int	process_file(char *filename);
  
  extern bool do_pset(const char *param,
  		const char *value,
--- 28,34 ----
  extern backslashResult HandleSlashCmds(PsqlScanState scan_state,
  				PQExpBuffer query_buf);
  
! extern int	process_file(char *filename, bool single_txn);
  
  extern bool do_pset(const char *param,
  		const char *value,
Index: src/bin/psql/help.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/help.c,v
retrieving revision 1.106
diff -c -r1.106 help.c
*** src/bin/psql/help.c	15 Oct 2005 02:49:40 -0000	1.106
--- src/bin/psql/help.c	17 Dec 2005 16:51:29 -0000
***************
*** 92,97 ****
--- 92,98 ----
  	printf(_("  -d DBNAME       specify database name to connect to (default: \"%s\")\n"), env);
  	puts(_("  -c COMMAND      run only single command (SQL or internal) and exit"));
  	puts(_("  -f FILENAME     execute commands from file, then exit"));
+ 	puts(_("  -1 (numeral)    execute command file as a single transaction"));
  	puts(_("  -l              list available databases, then exit"));
  	puts(_("  -v NAME=VALUE   set psql variable NAME to VALUE"));
  	puts(_("  -X              do not read startup file (~/.psqlrc)"));
Index: src/bin/psql/startup.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/startup.c,v
retrieving revision 1.128
diff -c -r1.128 startup.c
*** src/bin/psql/startup.c	22 Nov 2005 18:17:29 -0000	1.128
--- src/bin/psql/startup.c	17 Dec 2005 16:51:30 -0000
***************
*** 76,81 ****
--- 76,82 ----
  	char	   *action_string;
  	bool		no_readline;
  	bool		no_psqlrc;
+     bool        single_txn;
  };
  
  static int	parse_version(const char *versionString);
***************
*** 268,274 ****
  		if (!options.no_psqlrc)
  			process_psqlrc(argv[0]);
  
! 		successResult = process_file(options.action_string);
  	}
  
  	/*
--- 269,275 ----
  		if (!options.no_psqlrc)
  			process_psqlrc(argv[0]);
  
! 		successResult = process_file(options.action_string, options.single_txn);
  	}
  
  	/*
***************
*** 425,430 ****
--- 426,432 ----
  		{"list", no_argument, NULL, 'l'},
  		{"log-file", required_argument, NULL, 'L'},
  		{"no-readline", no_argument, NULL, 'n'},
+ 		{"single-transaction", no_argument, NULL, '1'},
  		{"output", required_argument, NULL, 'o'},
  		{"port", required_argument, NULL, 'p'},
  		{"pset", required_argument, NULL, 'P'},
***************
*** 453,459 ****
  
  	memset(options, 0, sizeof *options);
  
! 	while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:HlL:no:p:P:qR:sStT:uU:v:VWxX?",
  							long_options, &optindex)) != -1)
  	{
  		switch (c)
--- 455,461 ----
  
  	memset(options, 0, sizeof *options);
  
! 	while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:HlL:no:p:P:qR:sStT:uU:v:VWxX?1",
  							long_options, &optindex)) != -1)
  	{
  		switch (c)
***************
*** 606,611 ****
--- 608,616 ----
  			case 'X':
  				options->no_psqlrc = true;
  				break;
+ 			case '1':
+ 				options->single_txn = true;
+ 				break;
  			case '?':
  				/* Actual help option given */
  				if (strcmp(argv[optind - 1], "-?") == 0 || strcmp(argv[optind - 1], "--help") == 0)
***************
*** 690,698 ****
  	sprintf(psqlrc, "%s-%s", filename, PG_VERSION);
  
  	if (access(psqlrc, R_OK) == 0)
! 		(void) process_file(psqlrc);
  	else if (access(filename, R_OK) == 0)
! 		(void) process_file(filename);
  	free(psqlrc);
  }
  
--- 695,703 ----
  	sprintf(psqlrc, "%s-%s", filename, PG_VERSION);
  
  	if (access(psqlrc, R_OK) == 0)
! 		(void) process_file(psqlrc, false);
  	else if (access(filename, R_OK) == 0)
! 		(void) process_file(filename, false);
  	free(psqlrc);
  }
  
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to