diff options
Diffstat (limited to 'src/bin/pg_dump/pg_restore.c')
-rw-r--r-- | src/bin/pg_dump/pg_restore.c | 480 |
1 files changed, 0 insertions, 480 deletions
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c deleted file mode 100644 index 9d2af919aca..00000000000 --- a/src/bin/pg_dump/pg_restore.c +++ /dev/null @@ -1,480 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_restore.c - * pg_restore is an utility extracting postgres database definitions - * from a backup archive created by pg_dump using the archiver - * interface. - * - * pg_restore will read the backup archive and - * dump out a script that reproduces - * the schema of the database in terms of - * user-defined types - * user-defined functions - * tables - * indexes - * aggregates - * operators - * ACL - grant/revoke - * - * the output script is SQL that is understood by PostgreSQL - * - * Basic process in a restore operation is: - * - * Open the Archive and read the TOC. - * Set flags in TOC entries, and *maybe* reorder them. - * Generate script to stdout - * Exit - * - * Copyright (c) 2000, Philip Warner - * Rights are granted to use this software in any way so long - * as this notice is not removed. - * - * The author is not responsible for loss or damages that may - * result from it's use. - * - * - * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_restore.c,v 1.34 2002/05/10 22:36:27 tgl Exp $ - * - *------------------------------------------------------------------------- - */ - -#include "pg_backup.h" -#include "pg_backup_archiver.h" - -#include <ctype.h> - -#ifndef HAVE_STRDUP -#include "strdup.h" -#endif - -#ifdef HAVE_TERMIOS_H -#include <termios.h> -#endif - -#include <unistd.h> - -#ifdef HAVE_GETOPT_H -#include <getopt.h> -#endif - -#ifdef ENABLE_NLS -#include <locale.h> -#endif - -/* Forward decls */ -static void usage(const char *progname); -static char *_cleanupName(char *name); - -typedef struct option optType; - - -int -main(int argc, char **argv) -{ - RestoreOptions *opts; - int c; - Archive *AH; - char *fileSpec = NULL; - extern int optind; - extern char *optarg; - static int use_setsessauth = 0; - static int disable_triggers = 0; - -#ifdef HAVE_GETOPT_LONG - struct option cmdopts[] = { - {"clean", 0, NULL, 'c'}, - {"create", 0, NULL, 'C'}, - {"data-only", 0, NULL, 'a'}, - {"dbname", 1, NULL, 'd'}, - {"file", 1, NULL, 'f'}, - {"format", 1, NULL, 'F'}, - {"function", 1, NULL, 'P'}, - {"host", 1, NULL, 'h'}, - {"ignore-version", 0, NULL, 'i'}, - {"index", 1, NULL, 'I'}, - {"list", 0, NULL, 'l'}, - {"no-privileges", 0, NULL, 'x'}, - {"no-acl", 0, NULL, 'x'}, - {"no-owner", 0, NULL, 'O'}, - {"no-reconnect", 0, NULL, 'R'}, - {"port", 1, NULL, 'p'}, - {"oid-order", 0, NULL, 'o'}, - {"orig-order", 0, NULL, 'N'}, - {"password", 0, NULL, 'W'}, - {"rearrange", 0, NULL, 'r'}, - {"schema-only", 0, NULL, 's'}, - {"superuser", 1, NULL, 'S'}, - {"table", 1, NULL, 't'}, - {"trigger", 1, NULL, 'T'}, - {"use-list", 1, NULL, 'L'}, - {"username", 1, NULL, 'U'}, - {"verbose", 0, NULL, 'v'}, - - /* - * the following options don't have an equivalent short option - * letter, but are available as '-X long-name' - */ - {"use-set-session-authorization", no_argument, &use_setsessauth, 1}, - {"disable-triggers", no_argument, &disable_triggers, 1}, - - {NULL, 0, NULL, 0} - }; -#endif /* HAVE_GETOPT_LONG */ - - -#ifdef ENABLE_NLS - setlocale(LC_ALL, ""); - bindtextdomain("pg_dump", LOCALEDIR); - textdomain("pg_dump"); -#endif - - opts = NewRestoreOptions(); - - if (!strrchr(argv[0], '/')) - progname = argv[0]; - else - progname = strrchr(argv[0], '/') + 1; - - if (argc > 1) - { - if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) - { - usage(progname); - exit(0); - } - if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) - { - puts("pg_restore (PostgreSQL) " PG_VERSION); - exit(0); - } - } - -#ifdef HAVE_GETOPT_LONG - while ((c = getopt_long(argc, argv, "acCd:f:F:h:i:lL:NoOp:P:rRsS:t:T:uU:vWxX:", cmdopts, NULL)) != -1) -#else - while ((c = getopt(argc, argv, "acCd:f:F:h:i:lL:NoOp:P:rRsS:t:T:uU:vWxX:")) != -1) -#endif - { - switch (c) - { - case 'a': /* Dump data only */ - opts->dataOnly = 1; - break; - case 'c': /* clean (i.e., drop) schema prior to - * create */ - opts->dropSchema = 1; - break; - case 'C': - opts->create = 1; - break; - case 'd': - if (strlen(optarg) != 0) - { - opts->dbname = strdup(optarg); - opts->useDB = 1; - } - break; - case 'f': /* output file name */ - opts->filename = strdup(optarg); - break; - case 'F': - if (strlen(optarg) != 0) - opts->formatName = strdup(optarg); - break; - case 'h': - if (strlen(optarg) != 0) - opts->pghost = strdup(optarg); - break; - case 'i': - opts->ignoreVersion = 1; - break; - - case 'l': /* Dump the TOC summary */ - opts->tocSummary = 1; - break; - - case 'L': /* input TOC summary file name */ - opts->tocFile = strdup(optarg); - break; - - case 'N': - opts->origOrder = 1; - break; - case 'o': - opts->oidOrder = 1; - break; - case 'O': - opts->noOwner = 1; - break; - case 'p': - if (strlen(optarg) != 0) - opts->pgport = strdup(optarg); - break; - case 'r': - opts->rearrange = 1; - break; - case 'R': - opts->noReconnect = 1; - break; - case 'P': /* Function */ - opts->selTypes = 1; - opts->selFunction = 1; - opts->functionNames = optarg ? strdup(optarg) : NULL; - break; - case 'I': /* Index */ - opts->selTypes = 1; - opts->selIndex = 1; - opts->indexNames = _cleanupName(optarg); - break; - case 'T': /* Trigger */ - opts->selTypes = 1; - opts->selTrigger = 1; - opts->triggerNames = _cleanupName(optarg); - break; - case 's': /* dump schema only */ - opts->schemaOnly = 1; - break; - case 'S': /* Superuser username */ - if (strlen(optarg) != 0) - opts->superuser = strdup(optarg); - break; - case 't': /* Dump data for this table only */ - opts->selTypes = 1; - opts->selTable = 1; - opts->tableNames = _cleanupName(optarg); - break; - - case 'u': - opts->requirePassword = true; - opts->username = simple_prompt("User name: ", 100, true); - break; - - case 'U': - opts->username = optarg; - break; - - case 'v': /* verbose */ - opts->verbose = 1; - break; - - case 'W': - opts->requirePassword = true; - break; - - case 'x': /* skip ACL dump */ - opts->aclsSkip = 1; - break; - - case 'X': - if (strcmp(optarg, "use-set-session-authorization") == 0) - use_setsessauth = 1; - else if (strcmp(optarg, "disable-triggers") == 0) - disable_triggers = 1; - else - { - fprintf(stderr, - gettext("%s: invalid -X option -- %s\n"), - progname, optarg); - fprintf(stderr, gettext("Try '%s --help' for more information.\n"), progname); - exit(1); - } - break; - -#ifdef HAVE_GETOPT_LONG - /* This covers the long options equivalent to -X xxx. */ - case 0: - break; -#endif - - default: - fprintf(stderr, gettext("Try '%s --help' for more information.\n"), progname); - exit(1); - } - } - - if (optind < argc) - fileSpec = argv[optind]; - else - fileSpec = NULL; - - opts->use_setsessauth = use_setsessauth; - opts->disable_triggers = disable_triggers; - - if (opts->formatName) - { - - switch (opts->formatName[0]) - { - - case 'c': - case 'C': - opts->format = archCustom; - break; - - case 'f': - case 'F': - opts->format = archFiles; - break; - - case 't': - case 'T': - opts->format = archTar; - break; - - default: - write_msg("unrecognized archive format '%s'; please specify 't' or 'c'\n", - opts->formatName); - exit(1); - } - } - - AH = OpenArchive(fileSpec, opts->format); - - /* Let the archiver know how noisy to be */ - AH->verbose = opts->verbose; - - if (opts->tocFile) - SortTocFromFile(AH, opts); - - if (opts->oidOrder) - SortTocByOID(AH); - else if (opts->origOrder) - SortTocByID(AH); - - if (opts->rearrange) - { - MoveToStart(AH, "<Init>"); - MoveToEnd(AH, "TABLE DATA"); - MoveToEnd(AH, "BLOBS"); - MoveToEnd(AH, "INDEX"); - MoveToEnd(AH, "TRIGGER"); - MoveToEnd(AH, "RULE"); - MoveToEnd(AH, "SEQUENCE SET"); - } - - /* Database MUST be at start */ - MoveToStart(AH, "DATABASE"); - - if (opts->tocSummary) - PrintTOCSummary(AH, opts); - else - RestoreArchive(AH, opts); - - CloseArchive(AH); - - return 0; -} - -static void -usage(const char *progname) -{ - printf(gettext( - "%s restores a PostgreSQL database from an archive created by pg_dump.\n\n" - "Usage:\n %s [options] [file]\n\n" - "Options:\n"), - progname, progname); -#ifdef HAVE_GETOPT_LONG - puts(gettext( - " -a, --data-only restore only the data, no schema\n" - " -c, --clean clean (drop) schema prior to create\n" - " -C, --create issue commands to create the database\n" - " -d, --dbname=NAME output database name\n" - " -f, --file=FILENAME output file name\n" - " -F, --format={c|t} specify backup file format\n" - " -h, --host=HOSTNAME server host name\n" - " -i, --index=NAME restore named index\n" - " -l, --list print summarized TOC of the archive\n" - " -L, --use-list=FILENAME use specified table of contents for ordering\n" - " output from this file\n" - " -N, --orig-order restore in original dump order\n" - " -o, --oid-order restore in OID order\n" - " -O, --no-owner do not reconnect to database to match\n" - " object owner\n" - " -p, --port=PORT server port number\n" - " -P, --function=NAME restore named function\n" - " -r, --rearrange rearrange output to put indexes etc. at end\n" - " -R, --no-reconnect disallow ALL reconnections to the database\n" - " -s, --schema-only restore only the schema, no data\n" - " -S, --superuser=NAME specify the superuser user name to use for\n" - " disabling triggers\n" - " -t, --table=NAME restore named table\n" - " -T, --trigger=NAME restore named trigger\n" - " -U, --username=NAME connect as specified database user\n" - " -v, --verbose verbose mode\n" - " -W, --password force password prompt (should happen automatically)\n" - " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" - " -X use-set-session-authorization, --use-set-session-authorization\n" - " use SET SESSION AUTHORIZATION commands instead\n" - " of reconnecting, if possible\n" - " -X disable-triggers, --disable-triggers\n" - " disable triggers during data-only restore\n" - )); - -#else /* not HAVE_GETOPT_LONG */ - - puts(gettext( - " -a restore only the data, no schema\n" - " -c clean (drop) schema prior to create\n" - " -C issue commands to create the database\n" - " -d NAME output database name\n" - " -f FILENAME output file name\n" - " -F {c|t} specify backup file format\n" - " -h HOSTNAME server host name\n" - " -i NAME restore named index\n" - " -l print summarized TOC of the archive\n" - " -L FILENAME use specified table of contents for ordering\n" - " output from this file\n" - " -N restore in original dump order\n" - " -o restore in OID order\n" - " -O do not reconnect to database to match\n" - " object owner\n" - " -p PORT server port number\n" - " -P NAME restore named function\n" - " -r rearrange output to put indexes etc. at end\n" - " -R disallow ALL reconnections to the database\n" - " -s restore only the schema, no data\n" - " -S NAME specify the superuser user name to use for\n" - " disabling triggers\n" - " -t NAME restore named table\n" - " -T NAME restore named trigger\n" - " -U NAME connect as specified database user\n" - " -v verbose mode\n" - " -W force password prompt (should happen automatically)\n" - " -x skip restoration of access privileges (grant/revoke)\n" - " -X use-set-session-authorization\n" - " use SET SESSION AUTHORIZATION commands instead\n" - " of reconnecting, if possible\n" - " -X disable-triggers disable triggers during data-only restore\n" - )); -#endif - puts(gettext("If no input file name is supplied, then standard input is used.\n")); - puts(gettext("Report bugs to <pgsql-bugs@postgresql.org>.")); -} - - -static char * -_cleanupName(char *name) -{ - int i; - - if (!name || !name[0]) - return NULL; - - name = strdup(name); - - if (name[0] == '"') - { - strcpy(name, &name[1]); - if (name[0] && *(name + strlen(name) - 1) == '"') - *(name + strlen(name) - 1) = '\0'; - } - /* otherwise, convert table name to lowercase... */ - else - { - for (i = 0; name[i]; i++) - if (isupper((unsigned char) name[i])) - name[i] = tolower((unsigned char) name[i]); - } - return name; -} |