PostGIS  2.1.10dev-r@@SVN_REVISION@@
static void update_table_chooser_from_database ( )
static

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

References _, chooser_table_list_store, 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().

675 {
676  PGresult *result, *geocol_result;
677  GtkTreeIter iter, geocol_iter;
678  GtkListStore *dumper_geocol_combo_list;
679  char *connection_string, *sql_form, *query, *schema, *table, *geocol_query, *geocol_name=NULL;
680  int hasgeo, i, j;
681 
682  /* Open a connection to the database */
683  connection_string = ShpDumperGetConnectionStringFromConn(conn);
684  pg_connection = PQconnectdb(connection_string);
685 
686  /* Here we find a list of all tables/views that not in a pg_* schema (or information_schema) and
687  we return the schema name, table name and whether or not the table/view contains any geo
688  columns */
689  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') 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";
690 
691  result = PQexec(pg_connection, query);
692 
693  /* Free any existing entries in the model */
694  gtk_list_store_clear(chooser_table_list_store);
695 
696  /* Now insert one row for each query result */
697  for (i = 0; i < PQntuples(result); i++)
698  {
699  gtk_list_store_insert_before(chooser_table_list_store, &iter, NULL);
700 
701  /* Look up the geo columns; if there are none then we set the field to (None). If we have just one
702  column then we set the column name directly. If we have more than one then we create a combo
703  dropdown containing the column names */
704  schema = PQgetvalue(result, i, PQfnumber(result, "nspname"));
705  table = PQgetvalue(result, i, PQfnumber(result, "relname"));
706 
707  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'))";
708 
709  geocol_query = malloc(strlen(sql_form) + strlen(schema) + strlen(table) + 1);
710  sprintf(geocol_query, sql_form, schema, table);
711 
712  geocol_result = PQexec(pg_connection, geocol_query);
713 
714  /* Create a combo list loaded with the column names. Note that while we create the model and load
715  the data here, we don't actually display the geo column in this dialog. Instead we build the
716  list here so that we can pass to the export table list store when creating a new entry. This
717  is to ensure that the export table list model can directly represent a SHPDUMPERCONFIG. */
718  dumper_geocol_combo_list = gtk_list_store_new(TABLECHOOSER_GEOCOL_COMBO_COLUMNS, G_TYPE_STRING);
719 
720  if (PQntuples(geocol_result) > 0)
721  {
722  /* Load the columns into the list store */
723  for (j = 0; j < PQntuples(geocol_result); j++)
724  {
725  geocol_name = PQgetvalue(geocol_result, j, PQfnumber(geocol_result, "attname"));
726 
727  gtk_list_store_insert_before(dumper_geocol_combo_list, &geocol_iter, TABLECHOOSER_GEOCOL_COMBO_TEXT);
728  gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
729  TABLECHOOSER_GEOCOL_COMBO_TEXT, geocol_name,
730  -1);
731  }
732  }
733  else
734  {
735  /* Add a "default" entry */
736  geocol_name = NULL;
737 
738  gtk_list_store_insert_before(dumper_geocol_combo_list, &geocol_iter, TABLECHOOSER_GEOCOL_COMBO_TEXT);
739  gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
741  -1);
742  }
743 
744  /* Free the query result */
745  PQclear(geocol_result);
746 
747  /* Free the query string */
748  free(geocol_query);
749 
750  /* Set the list store data */
751  hasgeo = atoi(PQgetvalue(result, i, PQfnumber(result, "hasgeo")));
752  gtk_list_store_set(chooser_table_list_store, &iter,
755  TABLECHOOSER_GEO_LISTSTORE_COLUMN, dumper_geocol_combo_list,
756  TABLECHOOSER_GEO_COLUMN, geocol_name,
758  -1);
759  }
760 
761  /* Clear up the result set */
762  PQclear(result);
763 
764  /* Close the existing connection */
765  PQfinish(pg_connection);
766  pg_connection = NULL;
767 
768  return;
769 }
#define _(String)
Definition: shpcommon.h:23
static SHPCONNECTIONCONFIG * conn
char ** result
Definition: liblwgeom.h:218
char * ShpDumperGetConnectionStringFromConn(SHPCONNECTIONCONFIG *conn)
static PGconn * pg_connection
GtkListStore * chooser_table_list_store

Here is the call graph for this function:

Here is the caller graph for this function: