1 /* -------------------------------------------------------------------------
4 * $PostgreSQL: pgsql/contrib/pg_dumplo/main.c,v 1.20 2004/10/25 02:15:00 tgl Exp $
7 * -------------------------------------------------------------------------
10 #include "postgres_fe.h"
16 #include "libpq/libpq-fs.h"
18 #include "pg_dumplo.h"
24 #include "getopt_long.h"
30 char *progname = NULL;
32 int main(int argc, char **argv);
33 static void usage(void);
34 static void parse_lolist(LODumpMaster * pgLO);
38 * The mother of all C functions
42 main(int argc, char **argv)
61 pgLO->lolist_start = 0;
73 static struct option l_opt[] = {
74 {"help", no_argument, 0, 'h'},
75 {"user", required_argument, 0, 'u'},
76 {"pwd", required_argument, 0, 'p'},
77 {"db", required_argument, 0, 'd'},
78 {"host", required_argument, 0, 'h'},
79 {"port", required_argument, 0, 'o'},
80 {"space", required_argument, 0, 's'},
81 {"import", no_argument, 0, 'i'},
82 {"export", no_argument, 0, 'e'},
83 {"remove", no_argument, 0, 'r'},
84 {"quiet", no_argument, 0, 'q'},
85 {"all", no_argument, 0, 'a'},
86 {"show", no_argument, 0, 'w'},
90 while ((arg = getopt_long(argc, argv, "?aeho:u:p:qd:l:t:irs:w", l_opt, &l_index)) != -1)
99 pgLO->user = strdup(optarg);
102 pgLO->host = strdup(optarg);
105 pgLO->port = strdup(optarg);
108 pwd = strdup(optarg);
111 pgLO->db = strdup(optarg);
114 pgLO->space = strdup(optarg);
117 pgLO->action = ACTION_IMPORT;
120 pgLO->action = ACTION_EXPORT_ATTR;
121 pgLO->lolist_start = optind - 1;
126 pgLO->action = ACTION_EXPORT_ALL;
129 pgLO->action = ACTION_SHOW;
138 fprintf(stderr, "%s: bad arg -%c\n", progname, arg);
153 if (!pgLO->space && !pgLO->action == ACTION_SHOW)
155 if (!(pgLO->space = getenv("PWD")))
157 fprintf(stderr, "%s: not set space for dump-tree (option '-s' or $PWD).\n", progname);
164 fprintf(stderr, "%s: What do you want - export or import?\n", progname);
171 pgLO->conn = PQsetdbLogin(pgLO->host, pgLO->port, NULL, NULL, pgLO->db,
174 if (PQstatus(pgLO->conn) == CONNECTION_BAD)
176 fprintf(stderr, "%s (connection): %s\n", progname, PQerrorMessage(pgLO->conn));
179 pgLO->host = PQhost(pgLO->conn) ? PQhost(pgLO->conn) : "localhost";
180 pgLO->db = PQdb(pgLO->conn);
181 pgLO->user = PQuser(pgLO->conn);
187 if (pgLO->action != ACTION_SHOW)
190 PQexec(pgLO->conn, "SET search_path = public");
192 PQexec(pgLO->conn, "BEGIN");
194 switch (pgLO->action)
198 case ACTION_EXPORT_ALL:
202 case ACTION_EXPORT_ATTR:
206 if (pgLO->action == ACTION_SHOW)
207 printf("\nDatabase '%s' contains %d large objects.\n\n", pgLO->db, pgLO->counter);
209 printf("\nExported %d large objects.\n\n", pgLO->counter);
216 printf("\nImported %d large objects.\n\n", pgLO->counter);
220 PQexec(pgLO->conn, "COMMIT");
221 PQfinish(pgLO->conn);
223 if (pgLO->action != ACTION_SHOW)
230 parse_lolist(LODumpMaster * pgLO)
235 buff[MAX_TABLE_NAME + MAX_ATTR_NAME + 1];
237 pgLO->lolist = (LOlist *) malloc(pgLO->argc * sizeof(LOlist));
241 fprintf(stderr, "%s: can't allocate memory\n", progname);
245 for (d = pgLO->argv + pgLO->lolist_start, ll = pgLO->lolist;
250 strncpy(buff, *d, MAX_TABLE_NAME + MAX_ATTR_NAME);
252 if ((loc = strchr(buff, '.')) == NULL)
254 fprintf(stderr, "%s: '%s' is bad 'table.attr'\n", progname, buff);
258 ll->lo_table = strdup(buff);
259 ll->lo_attr = strdup(++loc);
262 ll->lo_table = ll->lo_attr = (char *) NULL;
269 printf("\npg_dumplo %s - PostgreSQL large objects dump\n", PG_VERSION);
270 puts("pg_dumplo [option]\n\n"
271 "-h --help this help\n"
272 "-u --user=<username> username for connection to server\n"
273 "-p --password=<password> password for connection to server\n"
274 "-d --db=<database> database name\n"
275 "-t --host=<hostname> server hostname\n"
276 "-o --port=<port> database server port (default: 5432)\n"
277 "-s --space=<dir> directory with dump tree (for export/import)\n"
278 "-i --import import large obj dump tree to DB\n"
279 "-e --export export (dump) large obj to dump tree\n"
280 "-l <table.attr ...> dump attribute (columns) with LO to dump tree\n"
281 "-a --all dump all LO in DB (default)\n"
282 "-r --remove if is set '-i' try remove old LO\n"
283 "-q --quiet run quietly\n"
284 "-w --show not dump, but show all LO in DB\n"
286 "Example (dump): pg_dumplo -d my_db -s /my_dump/dir -l t1.a t1.b t2.a\n"
287 " pg_dumplo -a -d my_db -s /my_dump/dir\n"
288 "Example (import): pg_dumplo -i -d my_db -s /my_dump/dir\n"
289 "Example (show): pg_dumplo -w -d my_db\n\n"
290 "Note: * option '-l' must be last option!\n"
291 " * option '-i' without option '-r' make new large obj in DB\n"
292 " not rewrite old, the '-i' UPDATE oid numbers in table.attr only!\n"
293 " * if option -s is not set, pg_dumplo uses $PWD\n"