OSDN Git Service

pgindent run.
[pg-rex/syncrep.git] / contrib / pg_dumplo / main.c
1 /* -------------------------------------------------------------------------
2  * pg_dumplo
3  *
4  * $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/main.c,v 1.11 2002/09/04 20:31:07 momjian Exp $
5  *
6  *                                      Karel Zak 1999-2000
7  * -------------------------------------------------------------------------
8  */
9
10 /* We import postgres_fe.h mostly to get the HAVE_GETOPT_LONG configure result. */
11 #ifndef OUT_OF_PG
12 #include "postgres_fe.h"
13 #endif
14
15 #include <stdio.h>
16 #include <unistd.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <errno.h>
20
21 #include <libpq-fe.h>
22 #include <libpq/libpq-fs.h>
23
24 #include "pg_dumplo.h"
25
26 #ifdef HAVE_GETOPT_LONG
27 #include <getopt.h>
28 #define no_argument 0
29 #define required_argument 1
30 #endif
31
32 extern int      errno;
33
34 char       *progname = NULL;
35
36 int                     main(int argc, char **argv);
37 static void usage(void);
38 static void parse_lolist(LODumpMaster * pgLO);
39
40
41 /*-----
42  *      The mother of all C functions
43  *-----
44  */
45 int
46 main(int argc, char **argv)
47 {
48         LODumpMaster _pgLO,
49                            *pgLO = &_pgLO;
50         char       *pwd = NULL;
51
52         pgLO->argv = argv;
53         pgLO->argc = argc;
54         pgLO->action = 0;
55         pgLO->lolist = NULL;
56         pgLO->user = NULL;
57         pgLO->db = NULL;
58         pgLO->host = NULL;
59         pgLO->port = NULL;
60         pgLO->space = NULL;
61         pgLO->index = NULL;
62         pgLO->remove = FALSE;
63         pgLO->quiet = FALSE;
64         pgLO->counter = 0;
65         pgLO->lolist_start = 0;
66
67         progname = argv[0];
68
69         /*
70          * Parse ARGV
71          */
72         if (argc > 1)
73         {
74                 int                     arg;
75                 extern int      optind;
76
77 #ifdef HAVE_GETOPT_LONG
78                 int                     l_index = 0;
79                 static struct option l_opt[] = {
80                         {"help", no_argument, 0, 'h'},
81                         {"user", required_argument, 0, 'u'},
82                         {"pwd", required_argument, 0, 'p'},
83                         {"db", required_argument, 0, 'd'},
84                         {"host", required_argument, 0, 'h'},
85                         {"port", required_argument, 0, 'o'},
86                         {"space", required_argument, 0, 's'},
87                         {"import", no_argument, 0, 'i'},
88                         {"export", no_argument, 0, 'e'},
89                         {"remove", no_argument, 0, 'r'},
90                         {"quiet", no_argument, 0, 'q'},
91                         {"all", no_argument, 0, 'a'},
92                         {"show", no_argument, 0, 'w'},
93                         {NULL, 0, 0, 0}
94                 };
95
96                 while ((arg = getopt_long(argc, argv, "?aeho:u:p:qd:l:t:irs:w", l_opt, &l_index)) != -1)
97                 {
98 #else
99                 while ((arg = getopt(argc, argv, "?aeho:u:p:qd:l:t:irs:w")) != -1)
100                 {
101 #endif
102                         switch (arg)
103                         {
104                                 case '?':
105                                 case 'h':
106                                         usage();
107                                         exit(RE_OK);
108                                 case 'u':
109                                         pgLO->user = strdup(optarg);
110                                         break;
111                                 case 't':
112                                         pgLO->host = strdup(optarg);
113                                         break;
114                                 case 'o':
115                                         pgLO->port = strdup(optarg);
116                                         break;
117                                 case 'p':
118                                         pwd = strdup(optarg);
119                                         break;
120                                 case 'd':
121                                         pgLO->db = strdup(optarg);
122                                         break;
123                                 case 's':
124                                         pgLO->space = strdup(optarg);
125                                         break;
126                                 case 'i':
127                                         pgLO->action = ACTION_IMPORT;
128                                         break;
129                                 case 'l':
130                                         pgLO->action = ACTION_EXPORT_ATTR;
131                                         pgLO->lolist_start = optind - 1;
132                                         parse_lolist(pgLO);
133                                         break;
134                                 case 'e':
135                                 case 'a':
136                                         pgLO->action = ACTION_EXPORT_ALL;
137                                         break;
138                                 case 'w':
139                                         pgLO->action = ACTION_SHOW;
140                                         break;
141                                 case 'r':
142                                         pgLO->remove = TRUE;
143                                         break;
144                                 case 'q':
145                                         pgLO->quiet = TRUE;
146                                         break;
147                                 default:
148                                         fprintf(stderr, "%s: bad arg -%c\n", progname, arg);
149                                         usage();
150                                         exit(RE_ERROR);
151                         }
152                 }
153         }
154         else
155         {
156                 usage();
157                 exit(RE_ERROR);
158         }
159
160         /*
161          * Check space
162          */
163         if (!pgLO->space && !pgLO->action == ACTION_SHOW)
164         {
165                 if (!(pgLO->space = getenv("PWD")))
166                 {
167                         fprintf(stderr, "%s: not set space for dump-tree (option '-s' or $PWD).\n", progname);
168                         exit(RE_ERROR);
169                 }
170         }
171
172         if (!pgLO->action)
173         {
174                 fprintf(stderr, "%s: What do you want - export or import?\n", progname);
175                 exit(RE_ERROR);
176         }
177
178         /*
179          * Make connection
180          */
181         pgLO->conn = PQsetdbLogin(pgLO->host, pgLO->port, NULL, NULL, pgLO->db,
182                                                           pgLO->user, pwd);
183
184         if (PQstatus(pgLO->conn) == CONNECTION_BAD)
185         {
186                 fprintf(stderr, "%s (connection): %s\n", progname, PQerrorMessage(pgLO->conn));
187                 exit(RE_ERROR);
188         }
189         pgLO->host = PQhost(pgLO->conn) ? PQhost(pgLO->conn) : "localhost";
190         pgLO->db = PQdb(pgLO->conn);
191         pgLO->user = PQuser(pgLO->conn);
192
193
194         /*
195          * Init index file
196          */
197         if (pgLO->action != ACTION_SHOW)
198                 index_file(pgLO);
199
200         PQexec(pgLO->conn, "BEGIN");
201
202         switch (pgLO->action)
203         {
204
205                 case ACTION_SHOW:
206                 case ACTION_EXPORT_ALL:
207                         load_lolist(pgLO);
208                         /* FALL THROUGH */
209
210                 case ACTION_EXPORT_ATTR:
211                         pglo_export(pgLO);
212                         if (!pgLO->quiet)
213                         {
214                                 if (pgLO->action == ACTION_SHOW)
215                                         printf("\nDatabase '%s' contains %d large objects.\n\n", pgLO->db, pgLO->counter);
216                                 else
217                                         printf("\nExported %d large objects.\n\n", pgLO->counter);
218                         }
219                         break;
220
221                 case ACTION_IMPORT:
222                         pglo_import(pgLO);
223                         if (!pgLO->quiet)
224                                 printf("\nImported %d large objects.\n\n", pgLO->counter);
225                         break;
226         }
227
228         PQexec(pgLO->conn, "COMMIT");
229         PQfinish(pgLO->conn);
230
231         if (pgLO->action != ACTION_SHOW)
232                 fclose(pgLO->index);
233
234         exit(RE_OK);
235 }
236
237 static void
238 parse_lolist(LODumpMaster * pgLO)
239 {
240         LOlist     *ll;
241         char      **d,
242                            *loc,
243                                 buff[MAX_TABLE_NAME + MAX_ATTR_NAME + 1];
244
245         pgLO->lolist = (LOlist *) malloc(pgLO->argc * sizeof(LOlist));
246
247         if (!pgLO->lolist)
248         {
249                 fprintf(stderr, "%s: can't allocate memory\n", progname);
250                 exit(RE_ERROR);
251         }
252
253         for (d = pgLO->argv + pgLO->lolist_start, ll = pgLO->lolist;
254                  *d != NULL;
255                  d++, ll++)
256         {
257
258                 strncpy(buff, *d, MAX_TABLE_NAME + MAX_ATTR_NAME);
259
260                 if ((loc = strchr(buff, '.')) == NULL)
261                 {
262                         fprintf(stderr, "%s: '%s' is bad 'table.attr'\n", progname, buff);
263                         exit(RE_ERROR);
264                 }
265                 *loc = '\0';
266                 ll->lo_table = strdup(buff);
267                 ll->lo_attr = strdup(++loc);
268         }
269         ll++;
270         ll->lo_table = ll->lo_attr = (char *) NULL;
271 }
272
273
274 static void
275 usage()
276 {
277         printf("\npg_dumplo %s - PostgreSQL large objects dump\n", VERSION);
278         puts("pg_dumplo [option]\n\n"
279
280 #ifdef HAVE_GETOPT_LONG
281
282                  "-h --help                    this help\n"
283            "-u --user=<username>         username for connection to server\n"
284            "-p --password=<password>     password for connection to server\n"
285                  "-d --db=<database>           database name\n"
286                  "-t --host=<hostname>         server hostname\n"
287         "-o --port=<port>             database server port (default: 5432)\n"
288                  "-s --space=<dir>             directory with dump tree (for export/import)\n"
289                  "-i --import                  import large obj dump tree to DB\n"
290         "-e --export                  export (dump) large obj to dump tree\n"
291                  "-l <table.attr ...>          dump attribute (columns) with LO to dump tree\n"
292                  "-a --all                     dump all LO in DB (default)\n"
293                  "-r --remove                  if is set '-i' try remove old LO\n"
294                  "-q --quiet                   run quietly\n"
295                  "-w --show                    not dump, but show all LO in DB\n"
296                 );                                              /* puts() */
297
298 #else
299                  "-h                           this help\n"
300            "-u <username>                username for connection to server\n"
301            "-p <password>                password for connection to server\n"
302                  "-d <database>                database name\n"
303                  "-t <hostname>                server hostname\n"
304         "-o <port>                    database server port (default: 5432)\n"
305                  "-s <dir>                     directory with dump tree (for export/import)\n"
306                  "-i                           import large obj dump tree to DB\n"
307         "-e                           export (dump) large obj to dump tree\n"
308                  "-l <table.attr ...>          dump attribute (columns) with LO to dump tree\n"
309                  "-a                           dump all LO in DB (default)\n"
310                  "-r                           if is set '-i' try remove old LO\n"
311                  "-q                           run quietly\n"
312                  "-w                           not dump, but show all LO in DB\n"
313                 );                                              /* puts() */
314 #endif
315
316         puts(
317                  "Example (dump):   pg_dumplo -d my_db -s /my_dump/dir -l t1.a t1.b t2.a\n"
318                  "                  pg_dumplo -a -d my_db -s /my_dump/dir\n"
319                  "Example (import): pg_dumplo -i -d my_db -s /my_dump/dir\n"
320                  "Example (show):   pg_dumplo -w -d my_db\n\n"
321                  "Note:  * option '-l' must be last option!\n"
322         "       * option '-i' without option '-r' make new large obj in DB\n"
323                  "         not rewrite old, the '-i' UPDATE oid numbers in table.attr only!\n"
324                  "       * if is not set option -s, the pg_dumplo use $PWD\n"
325                 );                                              /* puts() */
326 }