PostgreSQL Source Code: contrib/oid2name/oid2name.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
11
12#include "catalog/pg_class_d.h"
19
20
21typedef struct
22{
27
28
30{
34
41
47};
48
49
51void get_opts(int argc, char **argv, struct options *my_opts);
60
61
62void
64{
65 static const struct option long_options[] = {
75 {"system-objects", no_argument, NULL, 'S'},
81 {NULL, 0, NULL, 0}
82 };
83
84 int c;
86 int optindex;
87
90
91
92 my_opts->quiet = false;
95 my_opts->nodb = false;
98 my_opts->dbname = NULL;
100 my_opts->port = NULL;
103
104 if (argc > 1)
105 {
106 if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
107 {
109 exit(0);
110 }
111 if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
112 {
113 puts("oid2name (PostgreSQL) " PG_VERSION);
114 exit(0);
115 }
116 }
117
118
119 while ((c = getopt_long(argc, argv, "d:f:h:H:io:p:qsSt:U:x", long_options, &optindex)) != -1)
120 {
121 switch (c)
122 {
123
124 case 'd':
126 break;
127
128
129 case 'f':
131 break;
132
133
134 case 'H':
135 case 'h':
137 break;
138
139
140 case 'i':
142 break;
143
144
145 case 'o':
147 break;
148
149
150 case 'p':
152 break;
153
154
155 case 'q':
156 my_opts->quiet = true;
157 break;
158
159
160 case 's':
162 break;
163
164
165 case 'S':
167 break;
168
169
170 case 't':
172 break;
173
174
175 case 'U':
177 break;
178
179
180 case 'x':
182 break;
183
184 default:
185
187 exit(1);
188 }
189 }
190
192 {
193 pg_log_error("too many command-line arguments (first is \"%s\")",
196 exit(1);
197 }
198}
199
200static void
202{
203 printf("%s helps examining the file structure used by PostgreSQL.\n\n"
204 "Usage:\n"
205 " %s [OPTION]...\n"
206 "\nOptions:\n"
207 " -f, --filenode=FILENODE show info for table with given file node\n"
208 " -i, --indexes show indexes and sequences too\n"
209 " -o, --oid=OID show info for table with given OID\n"
210 " -q, --quiet quiet (don't show headers)\n"
211 " -s, --tablespaces show all tablespaces\n"
212 " -S, --system-objects show system objects too\n"
213 " -t, --table=TABLE show info for named table\n"
214 " -V, --version output version information, then exit\n"
215 " -x, --extended extended (show additional columns)\n"
216 " -?, --help show this help, then exit\n"
217 "\nConnection options:\n"
218 " -d, --dbname=DBNAME database to connect to\n"
219 " -h, --host=HOSTNAME database server host or socket directory\n"
220 " -H (same as -h, deprecated)\n"
221 " -p, --port=PORT database server port number\n"
222 " -U, --username=USERNAME connect as specified database user\n"
223 "\nThe default action is to show all database OIDs.\n\n"
224 "Report bugs to <%s>.\n"
225 "%s home page: <%s>\n",
226 progname, progname, PACKAGE_BUGREPORT, PACKAGE_NAME, PACKAGE_URL);
227}
228
229
230
231
232
233
234void
236{
238 {
241 }
243 {
247 }
248
251}
252
253
254
255
256
257
258
259
260char *
262{
263 char *ret,
264 *ptr;
265 int i,
266 length = 0;
267
270
271
272
273
274
277
279 ptr = ret;
280
282 {
283 if (i != 0)
288 }
289
290 return ret;
291}
292
293
296{
299 bool new_pass;
301
302
303
304
305
306 do
307 {
308#define PARAMS_ARRAY_SIZE 7
309
312
323 keywords[5] = "fallback_application_name";
327
328 new_pass = false;
330
332 pg_fatal("could not connect to database %s",
334
338 {
341 new_pass = true;
342 }
343 } while (new_pass);
344
345
347 {
350 exit(1);
351 }
352
355 {
356 pg_log_error("could not clear \"search_path\": %s",
360 exit(1);
361 }
363
364
366}
367
368
369
370
371int
373{
375
376 int nfields;
377 int nrows;
378 int i,
379 j,
380 l;
381 int *length;
382 char *pad;
383
384
386
387
389 {
392
395 exit(1);
396 }
397
398
401
402
403 length = (int *) pg_malloc(sizeof(int) * nfields);
404 for (j = 0; j < nfields; j++)
405 length[j] = strlen(PQfname(res, j));
406
407 for (i = 0; i < nrows; i++)
408 {
409 for (j = 0; j < nfields; j++)
410 {
412 if (l > length[j])
414 }
415 }
416
417
418 if (!quiet)
419 {
420 for (j = 0, l = 0; j < nfields; j++)
421 {
423 l += length[j] + 2;
424 }
427 memset(pad, '-', l);
428 pad[l] = '\0';
431 }
432
433
434 for (i = 0; i < nrows; i++)
435 {
436 for (j = 0; j < nfields; j++)
439 }
440
441
443 free(length);
444
445 return 0;
446}
447
448
449
450
451void
453{
454 char todo[1024];
455
456
458 "SELECT d.oid AS \"Oid\", datname AS \"Database Name\", "
459 "spcname AS \"Tablespace\" FROM pg_catalog.pg_database d JOIN pg_catalog.pg_tablespace t ON "
460 "(dattablespace = t.oid) ORDER BY 2");
461
463}
464
465
466
467
468void
470{
471 char todo[1024];
472 char *addfields = ",c.oid AS \"Oid\", nspname AS \"Schema\", spcname as \"Tablespace\" ";
473
475 "SELECT pg_catalog.pg_relation_filenode(c.oid) as \"Filenode\", relname as \"Table Name\" %s "
476 "FROM pg_catalog.pg_class c "
477 " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace "
478 " LEFT JOIN pg_catalog.pg_database d ON d.datname = pg_catalog.current_database(),"
479 " pg_catalog.pg_tablespace t "
480 "WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ","
482 " %s"
483 " t.oid = CASE"
484 " WHEN reltablespace <> 0 THEN reltablespace"
485 " ELSE dattablespace"
486 " END "
487 "ORDER BY relname",
488 opts->extended ? addfields : "",
491 opts->systables ? "" : "n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_toast' AND");
492
494}
495
496
497
498
499
500void
502{
503 char *todo;
504 char *qualifiers,
505 *ptr;
506 char *comma_oids,
507 *comma_filenumbers,
508 *comma_tables;
509 bool written = false;
510 char *addfields = ",c.oid AS \"Oid\", nspname AS \"Schema\", spcname as \"Tablespace\" ";
511
512
516
517
518 qualifiers = (char *) pg_malloc(strlen(comma_oids) + strlen(comma_tables) +
519 strlen(comma_filenumbers) + 80);
520 ptr = qualifiers;
521
522 if (opts->oids->num > 0)
523 {
524 ptr += sprintf(ptr, "c.oid IN (%s)", comma_oids);
525 written = true;
526 }
527 if (opts->filenumbers->num > 0)
528 {
529 if (written)
530 ptr += sprintf(ptr, " OR ");
531 ptr += sprintf(ptr, "pg_catalog.pg_relation_filenode(c.oid) IN (%s)",
532 comma_filenumbers);
533 written = true;
534 }
535 if (opts->tables->num > 0)
536 {
537 if (written)
538 ptr += sprintf(ptr, " OR ");
539 sprintf(ptr, "c.relname ~~ ANY (ARRAY[%s])", comma_tables);
540 }
541 free(comma_oids);
542 free(comma_tables);
543 free(comma_filenumbers);
544
545
546 todo = psprintf("SELECT pg_catalog.pg_relation_filenode(c.oid) as \"Filenode\", relname as \"Table Name\" %s\n"
547 "FROM pg_catalog.pg_class c\n"
548 " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
549 " LEFT JOIN pg_catalog.pg_database d ON d.datname = pg_catalog.current_database(),\n"
550 " pg_catalog.pg_tablespace t\n"
551 "WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ","
556 " t.oid = CASE\n"
557 " WHEN reltablespace <> 0 THEN reltablespace\n"
558 " ELSE dattablespace\n"
559 " END AND\n"
560 " (%s)\n"
561 "ORDER BY relname\n",
562 opts->extended ? addfields : "",
563 qualifiers);
564
565 free(qualifiers);
566
568}
569
570void
572{
573 char todo[1024];
574
576 "SELECT oid AS \"Oid\", spcname as \"Tablespace Name\"\n"
577 "FROM pg_catalog.pg_tablespace");
578
580}
581
582int
583main(int argc, char **argv)
584{
587
589
593
597
598
599 get_opts(argc, argv, my_opts);
600
601 if (my_opts->dbname == NULL)
602 {
603 my_opts->dbname = "postgres";
604 my_opts->nodb = true;
605 }
607
608
610 {
611 if (!my_opts->quiet)
612 printf("All tablespaces:\n");
614
616 exit(0);
617 }
618
619
620 if (my_opts->oids->num > 0 ||
623 {
624 if (!my_opts->quiet)
625 printf("From database \"%s\":\n", my_opts->dbname);
627
629 exit(0);
630 }
631
632
633 if (my_opts->dbname && !my_opts->nodb)
634 {
635 if (!my_opts->quiet)
636 printf("From database \"%s\":\n", my_opts->dbname);
638
640 exit(0);
641 }
642
643
644 if (!my_opts->quiet)
645 printf("All databases:\n");
647
649 return 0;
650}
static Datum values[MAXATTR]
#define ALWAYS_SECURE_SEARCH_PATH_SQL
#define fprintf(file, fmt, msg)
int PQconnectionNeedsPassword(const PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
void PQfinish(PGconn *conn)
char * PQerrorMessage(const PGconn *conn)
PGconn * PQconnectdbParams(const char *const *keywords, const char *const *values, int expand_dbname)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
ExecStatusType PQresultStatus(const PGresult *res)
void PQclear(PGresult *res)
int PQntuples(const PGresult *res)
char * PQfname(const PGresult *res, int field_num)
size_t PQescapeString(char *to, const char *from, size_t length)
PGresult * PQexec(PGconn *conn, const char *query)
int PQnfields(const PGresult *res)
void * pg_malloc(size_t size)
char * pg_strdup(const char *in)
void * pg_realloc(void *ptr, size_t size)
int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex)
#define required_argument
static const JsonPathKeyword keywords[]
void pg_logging_init(const char *argv0)
#define pg_log_error(...)
#define pg_log_error_hint(...)
#define pg_log_error_detail(...)
PGconn * sql_conn(struct options *my_opts)
void sql_exec_searchtables(PGconn *conn, struct options *opts)
static void help(const char *progname)
int main(int argc, char **argv)
int sql_exec(PGconn *conn, const char *todo, bool quiet)
void add_one_elt(char *eltname, eary *eary)
void get_opts(int argc, char **argv, struct options *my_opts)
#define PARAMS_ARRAY_SIZE
void sql_exec_dumpalltbspc(PGconn *conn, struct options *opts)
char * get_comma_elts(eary *eary)
void sql_exec_dumpalldbs(PGconn *conn, struct options *opts)
void sql_exec_dumpalltables(PGconn *conn, struct options *opts)
static AmcheckOptions opts
PGDLLIMPORT char * optarg
const char * get_progname(const char *argv0)
char * psprintf(const char *fmt,...)
char * simple_prompt(const char *prompt, bool echo)