- int returnvalue;
- char todo[1024];
-
- /* get the oid and tablename where the name matches tablename */
- snprintf(todo, 1024, "select relfilenode,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");
+ char *todo;
+ char *qualifiers,
+ *ptr;
+ char *comma_oids,
+ *comma_filenodes,
+ *comma_tables;
+ bool written = false;
+ char *addfields = ",c.oid AS \"Oid\", nspname AS \"Schema\", spcname as \"Tablespace\" ";
+
+ /* get tables qualifiers, whether names, filenodes, or OIDs */
+ comma_oids = get_comma_elts(opts->oids);
+ comma_tables = get_comma_elts(opts->tables);
+ comma_filenodes = get_comma_elts(opts->filenodes);
+
+ /* 80 extra chars for SQL expression */
+ qualifiers = (char *) pg_malloc(strlen(comma_oids) + strlen(comma_tables) +
+ strlen(comma_filenodes) + 80);
+ ptr = qualifiers;
+
+ if (opts->oids->num > 0)
+ {
+ ptr += sprintf(ptr, "c.oid IN (%s)", comma_oids);
+ written = true;
+ }
+ if (opts->filenodes->num > 0)
+ {
+ if (written)
+ ptr += sprintf(ptr, " OR ");
+ ptr += sprintf(ptr, "pg_catalog.pg_relation_filenode(c.oid) IN (%s)", comma_filenodes);
+ written = true;
+ }
+ if (opts->tables->num > 0)
+ {
+ if (written)
+ ptr += sprintf(ptr, " OR ");
+ sprintf(ptr, "c.relname ~~ ANY (ARRAY[%s])", comma_tables);
+ }
+ free(comma_oids);
+ free(comma_tables);
+ free(comma_filenodes);
+
+ /* now build the query */
+ todo = (char *) pg_malloc(650 + strlen(qualifiers));
+ snprintf(todo, 650 + strlen(qualifiers),
+ "SELECT pg_catalog.pg_relation_filenode(c.oid) as \"Filenode\", relname as \"Table Name\" %s\n"
+ "FROM pg_catalog.pg_class c \n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace \n"
+ " LEFT JOIN pg_catalog.pg_database d ON d.datname = pg_catalog.current_database(),\n"
+ " pg_catalog.pg_tablespace t \n"
+ "WHERE relkind IN ('r', 'i', 'S', 't') AND \n"
+ " t.oid = CASE\n"
+ " WHEN reltablespace <> 0 THEN reltablespace\n"
+ " ELSE dattablespace\n"
+ " END AND \n"
+ " (%s) \n"
+ "ORDER BY relname\n",
+ opts->extended ? addfields : "",
+ qualifiers);
+
+ free(qualifiers);
+
+ sql_exec(conn, todo, opts->quiet);