PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ 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,
727  TABLECHOOSER_GEOCOL_COMBO_TEXT, geocol_name,
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: