PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ update_table_chooser_from_database()

static void update_table_chooser_from_database ( )
static

Definition at line 670 of file shp2pgsql-gui.c.

671{
672 PGresult *result, *geocol_result;
673 GtkTreeIter iter, geocol_iter;
674 GtkListStore *dumper_geocol_combo_list;
675 char *connection_string, *sql_form, *query, *schema, *table, *geocol_query, *geocol_name=NULL;
676 int hasgeo, i, j;
677
678 /* Open a connection to the database */
679 connection_string = ShpDumperGetConnectionStringFromConn(conn);
680 pg_connection = PQconnectdb(connection_string);
681
682 /* Here we find a list of all tables/views that not in a pg_* schema (or information_schema) and
683 we return the schema name, table name and whether or not the table/view contains any geo
684 columns */
685 query = "SELECT tableoids.oid, n.nspname, tableoids.relname, COALESCE((SELECT 1 from pg_attribute WHERE attrelid = tableoids.oid AND atttypid IN (SELECT oid FROM pg_type WHERE typname in ('geometry', 'geography')) LIMIT 1), 0) hasgeo FROM (SELECT c.oid, c.relname, c.relnamespace FROM pg_class c WHERE c.relkind IN ('r', 'v', 'm', 'f','p') AND c.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname NOT ILIKE 'pg_%' AND nspname <> 'information_schema')) tableoids, pg_namespace n WHERE tableoids.relnamespace = n.oid ORDER BY n.nspname, tableoids.relname";
686
687 result = PQexec(pg_connection, query);
688
689 /* Free any existing entries in the model */
690 gtk_list_store_clear(chooser_table_list_store);
691
692 /* Now insert one row for each query result */
693 for (i = 0; i < PQntuples(result); i++)
694 {
695 size_t sz;
696 gtk_list_store_insert_before(chooser_table_list_store, &iter, NULL);
697
698 /* Look up the geo columns; if there are none then we set the field to (None). If we have just one
699 column then we set the column name directly. If we have more than one then we create a combo
700 dropdown containing the column names */
701 schema = PQgetvalue(result, i, PQfnumber(result, "nspname"));
702 table = PQgetvalue(result, i, PQfnumber(result, "relname"));
703
704 sql_form = "SELECT n.nspname, c.relname, a.attname FROM pg_class c, pg_namespace n, pg_attribute a WHERE c.relnamespace = n.oid AND n.nspname = '%s' AND c.relname = '%s' AND a.attrelid = c.oid AND a.atttypid IN (SELECT oid FROM pg_type WHERE typname in ('geometry', 'geography'))";
705
706 sz = strlen(sql_form) + strlen(schema) + strlen(table) + 1;
707 geocol_query = malloc(sz);
708 snprintf(geocol_query, sz, sql_form, schema, table);
709
710 geocol_result = PQexec(pg_connection, geocol_query);
711
712 /* Create a combo list loaded with the column names. Note that while we create the model and load
713 the data here, we don't actually display the geo column in this dialog. Instead we build the
714 list here so that we can pass to the export table list store when creating a new entry. This
715 is to ensure that the export table list model can directly represent a SHPDUMPERCONFIG. */
716 dumper_geocol_combo_list = gtk_list_store_new(TABLECHOOSER_GEOCOL_COMBO_COLUMNS, G_TYPE_STRING);
717
718 if (PQntuples(geocol_result) > 0)
719 {
720 /* Load the columns into the list store */
721 for (j = 0; j < PQntuples(geocol_result); j++)
722 {
723 geocol_name = PQgetvalue(geocol_result, j, PQfnumber(geocol_result, "attname"));
724
725 gtk_list_store_insert_before(dumper_geocol_combo_list, &geocol_iter, (GtkTreeIter *)TABLECHOOSER_GEOCOL_COMBO_TEXT);
726 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
728 -1);
729 }
730 }
731 else
732 {
733 /* Add a "default" entry */
734 geocol_name = NULL;
735
736 gtk_list_store_insert_before(dumper_geocol_combo_list, &geocol_iter, (GtkTreeIter *)TABLECHOOSER_GEOCOL_COMBO_TEXT);
737 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
739 -1);
740 }
741
742 /* Free the query result */
743 PQclear(geocol_result);
744
745 /* Free the query string */
746 free(geocol_query);
747
748 /* Set the list store data */
749 hasgeo = atoi(PQgetvalue(result, i, PQfnumber(result, "hasgeo")));
750 gtk_list_store_set(chooser_table_list_store, &iter,
753 TABLECHOOSER_GEO_LISTSTORE_COLUMN, dumper_geocol_combo_list,
754 TABLECHOOSER_GEO_COLUMN, geocol_name,
756 -1);
757 }
758
759 /* Clear up the result set */
760 PQclear(result);
761
762 /* Close the existing connection */
763 PQfinish(pg_connection);
764 pg_connection = NULL;
765
766 return;
767}
char result[OUT_DOUBLE_BUFFER_SIZE]
Definition cu_print.c:267
void * malloc(YYSIZE_T)
void free(void *)
char * ShpDumperGetConnectionStringFromConn(SHPCONNECTIONCONFIG *conn)
@ TABLECHOOSER_HASGEO_COLUMN
@ TABLECHOOSER_TABLE_COLUMN
@ TABLECHOOSER_SCHEMA_COLUMN
@ TABLECHOOSER_GEO_LISTSTORE_COLUMN
@ TABLECHOOSER_GEO_COLUMN
GtkListStore * chooser_table_list_store
static PGconn * pg_connection
@ TABLECHOOSER_GEOCOL_COMBO_TEXT
@ TABLECHOOSER_GEOCOL_COMBO_COLUMNS
static SHPCONNECTIONCONFIG * conn
#define _(String)
Definition shpcommon.h:24

References _, chooser_table_list_store, conn, free(), malloc(), pg_connection, result, ShpDumperGetConnectionStringFromConn(), TABLECHOOSER_GEO_COLUMN, TABLECHOOSER_GEO_LISTSTORE_COLUMN, TABLECHOOSER_GEOCOL_COMBO_COLUMNS, TABLECHOOSER_GEOCOL_COMBO_TEXT, TABLECHOOSER_HASGEO_COLUMN, TABLECHOOSER_SCHEMA_COLUMN, and TABLECHOOSER_TABLE_COLUMN.

Referenced by pgui_action_open_table_dialog().

Here is the call graph for this function:
Here is the caller graph for this function: