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)