From 2c591cb821dcf4ad5ee2502af1b809cae7ef90be Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Wed, 24 Jan 2001 00:41:25 +0000 Subject: [PATCH] Add oid2name. Add streaming option later. --- contrib/oid2name/Makefile | 35 +++ contrib/oid2name/README.oid2name | 72 +++++ contrib/oid2name/oid2name | Bin 0 -> 18145 bytes contrib/oid2name/oid2name.c | 448 +++++++++++++++++++++++++++++++ contrib/oid2name/oid2name.o | Bin 0 -> 15812 bytes 5 files changed, 555 insertions(+) create mode 100644 contrib/oid2name/Makefile create mode 100644 contrib/oid2name/README.oid2name create mode 100755 contrib/oid2name/oid2name create mode 100644 contrib/oid2name/oid2name.c create mode 100644 contrib/oid2name/oid2name.o diff --git a/contrib/oid2name/Makefile b/contrib/oid2name/Makefile new file mode 100644 index 00000000000..616e0da381c --- /dev/null +++ b/contrib/oid2name/Makefile @@ -0,0 +1,35 @@ +# +# + +subdir = contrib/oid2name +top_builddir = /pgtop/ +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS += -I$(libpq_srcdir) + +OBJS = oid2name.o + +all: oid2name + +oid2name: $(OBJS) $(libpq_builddir)/libpq.a + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(libpq) $(LIBS) -o $@ -g + +install: all installdirs + $(INSTALL_PROGRAM) oid2name$(X) $(bindir) + $(INSTALL_DATA) README.oid2name $(docdir)/contrib + +installdirs: + $(mkinstalldirs) $(bindir) $(docdir)/contrib + +uninstall: + rm -f $(bindir)/oid2name$(X) $(docdir)/contrib/README.oid2name + +clean distclean maintainer-clean: + rm -f oid2name$(X) $(OBJS) + +depend dep: + $(CC) -MM -MG $(CFLAGS) *.c > depend + +ifeq (depend,$(wildcard depend)) +include depend +endif diff --git a/contrib/oid2name/README.oid2name b/contrib/oid2name/README.oid2name new file mode 100644 index 00000000000..39a3cc60ab2 --- /dev/null +++ b/contrib/oid2name/README.oid2name @@ -0,0 +1,72 @@ +With version 7.1 of PostgreSQL server, the old naming scheme for +databases and tables (in $PGDATA/base) has changed. The databases +are put in folders for their OID in pg_database and the tables in +that folder are named for their OIDs in pg_class. This app connects +to the database (you can specify host, port, user, pass etc to +connect to a host other than localhost) and extracts the OID and +table name information. It has 4 ways it can be run: + + pg_oid2name + + This will connect to the template1 database and display all databases + in the system. + + $ ./pg_oid2name + All databases: + --------------------------------- + 18720 = test1 + 1 = template1 + 18719 = template0 + 18721 = test + 18735 = postgres + 18736 = cssi + + pg_oid2name -d test [-x] + + This connects to the database test and shows all tables and their OIDs. + + $ ./pg_oid2name -d test + All tables from database "test": + --------------------------------- + 18766 = dns + 18737 = ips + 18722 = testdate + + pg_oid2name -d test -o 18737 or + pg_oid2name -d test -t testdate + + This will connect to the database test and display the table name for oid + 18737 and the oid for table name testdate respectivly. + + $ ./pg_oid2name -d test -o 18737 + Tablename of oid 18737 from database "test": + --------------------------------- + 18737 = ips + + + $ ./pg_oid2name -d test -t testdate + Oid of table testdate from database "test": + _______________________________ + 18722 = testdate + + +There should be a decent amount of error handling in the app, a lot of it + dealt with via the postgres function calls. + + $ ./pg_oid2name -d nothere -t testdate + Oid of table testdate from database "nothere": + _______________________________ + Connection to database 'nothere' failed. + FATAL 1: Database "nothere" does not exist in the system catalog. + + $ ./pg_oid2name -d test -t nothere + Oid of table nothere from database "test": + _______________________________ + No tables with that name found + + +Mail me with any problems or additions you would like to see. Clearing + house for the code will be at: http://www.crimelabs.net + +b. palmer, bpalmer@crimelabs.net + diff --git a/contrib/oid2name/oid2name b/contrib/oid2name/oid2name new file mode 100755 index 0000000000000000000000000000000000000000..eec4a6082fe6e8bcc81d00835a2d3c0595a47cc8 GIT binary patch literal 18145 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 literal 0 Hc-jL100001 diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c new file mode 100644 index 00000000000..ca5ca1d17d6 --- /dev/null +++ b/contrib/oid2name/oid2name.c @@ -0,0 +1,448 @@ +/* + oid2name; a postgresql 7.1 (+?) app to map OIDs on the filesystem + to table and database names. + + b. palmer, bpalmer@crimelabs.net 1-17-2001 + + + * Portions Copyright (c) 1996-2000, PostgreSQL, Inc + * Portions Copyright (c) 1994, Regents of the University of California + + */ + +#include +#include + +#include "libpq-fe.h" + +/* these are the opts structures for command line params */ +struct options { + int getdatabase; + int gettable; + int getoid; + + int systables; + + int remotehost; + int remoteport; + int remoteuser; + int remotepass; + + int _oid; + char _dbname[128]; + char _tbname[128]; + + char _hostname[128]; + char _port[6]; + char _username[128]; + char _password[128]; +}; + +/* function prototypes */ +void get_opts(int, char **, struct options *); +PGconn *sql_conn(char *, struct options *); +void sql_exec_error (int); +int sql_exec(PGconn *, char *, int); +void sql_exec_dumpdb(PGconn *); +void sql_exec_dumptable(PGconn *, int); +void sql_exec_searchtable(PGconn *, char *); +void sql_exec_searchoid(PGconn *, int); + +/* fuction to parse command line options and check for some usage errors. */ +void get_opts(int argc, char **argv, struct options *my_opts) +{ + char c; + + /* set the defaults */ + my_opts->getdatabase = 0; + my_opts->gettable = 0; + my_opts->getoid = 0; + + my_opts->systables = 0; + + my_opts->remotehost = 0; + my_opts->remoteport = 0; + my_opts->remoteuser = 0; + my_opts->remotepass = 0; + + /* get opts */ + while( (c = getopt(argc, argv, "H:p:U:P:d:t:o:xh?")) != EOF) + { + switch(c) + { + /* specify the database */ + case 'd': + my_opts->getdatabase = 1; + sscanf(optarg, "%s", my_opts->_dbname); + break; + + /* specify the table name */ + case 't': + /* make sure we set the database first */ + if(!my_opts->getdatabase) + { + fprintf(stderr, "Sorry, but you must specify a database to dump from.\n"); + exit(1); + } + /* make sure we don't try to do a -o also */ + if(my_opts->getoid) + { + fprintf(stderr, "Sorry, you can only specify either oid or table\n"); + exit(1); + } + + my_opts->gettable = 1; + sscanf(optarg, "%s", my_opts->_tbname); + + break; + + /* specify the oid int */ + case 'o': + /* make sure we set the database first */ + if(!my_opts->getdatabase) + { + fprintf(stderr, "Sorry, but you must specify a database to dump from.\n"); + exit(1); + } + /* make sure we don't try to do a -t also */ + if(my_opts->gettable) + { + fprintf(stderr, "Sorry, you can only specify either oid or table\n"); + exit(1); + } + + my_opts->getoid = 1; + sscanf(optarg, "%i", &my_opts->_oid); + + break; + + /* host to connect to */ + case 'H': + my_opts->remotehost = 1; + sscanf(optarg, "%s", my_opts->_hostname); + break; + + /* port to connect to on remote host */ + case 'p': + my_opts->remoteport = 1; + sscanf(optarg, "%s", my_opts->_port); + break; + + /* username */ + case 'U': + my_opts->remoteuser = 1; + sscanf(optarg, "%s", my_opts->_username); + break; + + /* password */ + case 'P': + my_opts->remotepass = 1; + sscanf(optarg, "%s", my_opts->_password); + break; + + /* display system tables */ + case 'x': + + my_opts->systables = 1; + break; + + /* help! (ugly in code for easier editing) */ + case '?': + case 'h': + fprintf(stderr, "\n\ +Usage: pg_oid2name [-d database [-x] ] [-t table | -o oid] \n\ + dafault action display all databases + -d database database to oid2name\n\ + -x display system tables\n\ + -t table | -o oid search for table name (-t) or\n\ + oid (-o) in -d database + -H host connect to remote host\n\ + -p port host port to connect to\n\ + -U username username to connect with\n\ + -P password password for username\n\n\ +"); + exit(1); + break; + } + } +} + +/* establish connection with database. */ +PGconn *sql_conn(char *dbName, struct options *my_opts) +{ + char *pghost, *pgport; + char *pgoptions, *pgtty; + char *pguser, *pgpass; + + PGconn *conn; + + pghost = NULL; + pgport = NULL; + + pgoptions = NULL; /* special options to start up the backend + * server */ + pgtty = NULL; /* debugging tty for the backend server */ + + pguser = NULL; + pgpass = NULL; + + /* override the NULLs with the user params if passed */ + if(my_opts->remotehost) + { + pghost = (char *) malloc (128); + sscanf(my_opts->_hostname, "%s", pghost); + } + + if(my_opts->remoteport) + { + pgport = (char *) malloc (6); + sscanf(my_opts->_port, "%s", pgport); + } + + if(my_opts->remoteuser) + { + pguser = (char *) malloc (128); + sscanf(my_opts->_username, "%s", pguser); + } + + if(my_opts->remotepass) + { + pgpass = (char *) malloc (128); + sscanf(my_opts->_password, "%s", pgpass); + } + + /* login */ + conn = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName, pguser, pgpass); + + /* deal with errors */ + if (PQstatus(conn) == CONNECTION_BAD) + { + fprintf(stderr, "Connection to database '%s' failed.\n", dbName); + fprintf(stderr, "%s", PQerrorMessage(conn)); + + + PQfinish(conn); + exit(1); + + } + + /* return the conn if good */ + return conn; +} + +/* If the sql_ command has an error, this function looks up the error number and prints it out. */ +void sql_exec_error (int error_number) +{ + fprintf(stderr, "Error number %i.\n", error_number); + switch(error_number) + { + case 3: + fprintf(stderr, "Error: PGRES_COPY_OUT\n"); + break; + + case 4: + fprintf(stderr, "Error: PGRES_COPY_IN\n"); + break; + + case 5: + fprintf(stderr, "Error: PGRES_BAD_RESPONCE\n"); + break; + + case 6: + fprintf(stderr, "Error: PGRES_NONFATAL_ERROR\n"); + break; + + case 7: + fprintf(stderr, "Error: PGRES_FATAL_ERROR\n"); + break; + } +} + +/* actual code to make call to the database and print the output data */ +int sql_exec(PGconn *conn, char *todo, int match) +{ + PGresult *res; + + int numbfields; + int error_number; + int i, len; + + /* make the call */ + res = PQexec(conn, todo); + + /* check and deal with errors */ + if (!res || PQresultStatus(res) > 2) + { + error_number = PQresultStatus(res); + fprintf(stderr, "There was an error in the SQL command:\n%s\n", todo); + sql_exec_error(error_number); + fprintf(stderr, "PQerrorMessage = %s\n", PQerrorMessage(conn)); + + PQclear(res); + PQfinish(conn); + exit(-1); + } + + /* get the number of fields */ + numbfields = PQntuples(res); + + /* if we only expect 1 and there mode than, return -2 */ + if(match == 1 && numbfields > 1) + return -2; + + /* return -1 if there aren't any returns */ + if(match == 1 && numbfields < 1) + return -1; + + /* for each row, dump the information */ + for(i = 0; i < numbfields; i++) + { + len = strlen(PQgetvalue(res, i, 0)); + + fprintf(stdout, "%-6s = %s\n", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1)); + } + + /* clean the PGconn once done */ + PQclear(res); + + return 0; +} + +/* dump all databases know by the system table */ +void sql_exec_dumpdb(PGconn *conn) +{ + char *todo; + + todo = (char *) malloc (1024); + + /* get the oid and database name from the system pg_database table */ + sprintf(todo, "select oid,datname from pg_database"); + + sql_exec(conn, todo, NULL); +} + +/* display all tables in whatever db we are connected to. don't display the + system tables by default */ +void sql_exec_dumptable(PGconn *conn, int systables) +{ + char *todo; + + todo = (char *) malloc (1024); + + /* don't exclude the systables if this is set */ + if(systables == 1) + sprintf(todo, "select oid,relname from pg_class order by relname"); + else + sprintf(todo, "select oid,relname from pg_class where relname not like 'pg_%%' order by relname"); + + sql_exec(conn, todo, NULL); +} + +/* display the oid for a given tablename for whatever db we are connected + to. do we want to allow %bar% in the search? Not now. */ +void sql_exec_searchtable(PGconn *conn, char *tablename) +{ + int returnvalue; + char *todo; + + todo = (char *) malloc (1024); + + /* get the oid and tablename where the name matches tablename */ + sprintf(todo, "select oid,relname from pg_class where relname = '%s'", tablename); + + returnvalue = sql_exec(conn, todo, 1); + + /* deal with the return errors */ + if(returnvalue == -1) + { + printf("No tables with that name found\n"); + } + + if(returnvalue == -2) + { + printf("VERY scary: more than one table with that name found!!\n"); + } +} + +/* same as above */ +void sql_exec_searchoid(PGconn *conn, int oid) +{ + int returnvalue; + char *todo; + + todo = (char *) malloc (1024); + + sprintf(todo, "select oid,relname from pg_class where oid = %i", oid); + + returnvalue = sql_exec(conn, todo, 1); + + if(returnvalue == -1) + { + printf("No tables with that oid found\n"); + } + + if(returnvalue == -2) + { + printf("VERY scary: more than one table with that oid found!!\n"); + } +} + +int main(int argc, char **argv) +{ + struct options *my_opts; + PGconn *pgconn; + + my_opts = (struct options *) malloc (sizeof(struct options)); + + /* parse the opts */ + get_opts(argc, argv, my_opts); + + /* display all the tables in the database */ + if(my_opts->getdatabase & my_opts->gettable) + { + printf("Oid of table %s from database \"%s\":\n", my_opts->_tbname, my_opts->_dbname); + printf("_______________________________\n"); + + pgconn = sql_conn(my_opts->_dbname, my_opts); + sql_exec_searchtable(pgconn, my_opts->_tbname); + PQfinish(pgconn); + + exit(1); + } + + /* search for the tablename of the given OID */ + if(my_opts->getdatabase & my_opts->getoid) + { + printf("Tablename of oid %i from database \"%s\":\n", my_opts->_oid, my_opts->_dbname); + printf("---------------------------------\n"); + + pgconn = sql_conn(my_opts->_dbname, my_opts); + sql_exec_searchoid(pgconn, my_opts->_oid); + PQfinish(pgconn); + + exit(1); + } + + /* search for the oid for the given tablename */ + if(my_opts->getdatabase) + { + printf("All tables from database \"%s\":\n", my_opts->_dbname); + printf("---------------------------------\n"); + + pgconn = sql_conn(my_opts->_dbname, my_opts); + sql_exec_dumptable(pgconn, my_opts->systables); + PQfinish(pgconn); + + exit(1); + } + + /* display all the databases for the server we are connected to.. */ + printf("All databases:\n"); + printf("---------------------------------\n"); + + pgconn = sql_conn("template1", my_opts); + sql_exec_dumpdb(pgconn); + PQfinish(pgconn); + + exit(0); +} diff --git a/contrib/oid2name/oid2name.o b/contrib/oid2name/oid2name.o new file mode 100644 index 0000000000000000000000000000000000000000..801882c2d2f36bbd98f2f63a49484d9f18587df0 GIT binary patch literal 15812 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 Mj3uy-oha@7A5bVpE&u=k literal 0 Hc-jL100001 -- 2.39.5