17 #include "../postgis_config.h"
30 #define GUI_RCSID "shp2pgsql-gui $Revision$"
31 #define SHAPEFIELDMAXWIDTH 60
41 #if !GTK_CHECK_VERSION(2, 14, 0)
42 #if !defined(gtk_dialog_get_content_area)
43 #define gtk_dialog_get_content_area(dialog) GTK_DIALOG(dialog)->vbox
209 #define GUIMSG_LINE_MAXLEN 256
239 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(
textview_log), &iter, 0.0,
TRUE, 0.0, 1.0);
242 while (gtk_events_pending())
243 gtk_main_iteration();
284 GtkWidget *dialog, *label;
287 dialog = gtk_dialog_new_with_buttons(
_(
"Error"), GTK_WINDOW(
window_main),
288 GTK_DIALOG_MODAL & GTK_DIALOG_NO_SEPARATOR & GTK_DIALOG_DESTROY_WITH_PARENT,
289 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
290 gtk_dialog_set_has_separator(GTK_DIALOG(dialog),
FALSE );
291 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
292 gtk_container_set_border_width(GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 15);
293 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
294 gtk_widget_show_all(dialog);
295 gtk_dialog_run(GTK_DIALOG(dialog));
296 gtk_widget_destroy(dialog);
306 PGresult *
res = NULL;
307 ExecStatusType status;
312 if ( !
sql )
return 0;
315 status = PQresultStatus(
res);
319 if ( ! ( status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK ) )
322 if ( status == PGRES_NONFATAL_ERROR )
329 snprintf(sql_trunc, 255,
"%s",
sql);
330 pgui_logf(
"Failed SQL begins: \"%s\"", sql_trunc);
344 PGresult *
res = NULL;
345 ExecStatusType status;
350 if ( !
sql )
return 0;
353 status = PQresultStatus(
res);
357 if ( status != PGRES_COPY_IN )
360 snprintf(sql_trunc, 255,
"%s",
sql);
361 pgui_logf(
"Failed SQL begins: \"%s\"", sql_trunc);
375 char line_trunc[256];
379 if ( ! line )
return 0;
385 snprintf(line_trunc, 255,
"%s", line);
386 pgui_logf(
"Failed row begins: \"%s\"", line_trunc);
408 if ( rollback ) errmsg =
"Roll back the copy.";
440 if (strlen(filename) > max_width)
441 max_width = strlen(filename);
465 char *connection_string = NULL;
466 char *connection_sanitized = NULL;
475 connection_sanitized = strdup(connection_string);
477 pgui_logf(
"Connecting: %s", connection_sanitized);
478 free(connection_sanitized);
484 free(connection_string);
492 free(connection_string);
506 gtk_widget_hide(GTK_WIDGET(widget));
566 if (entry_encoding && strlen(entry_encoding) > 0)
571 config->
encoding = strdup(entry_encoding);
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;
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";
693 for (i = 0; i < PQntuples(
result); i++)
701 schema = PQgetvalue(
result, i, PQfnumber(
result,
"nspname"));
702 table = PQgetvalue(
result, i, PQfnumber(
result,
"relname"));
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'))";
706 sz = strlen(sql_form) + strlen(schema) + strlen(table) + 1;
707 geocol_query =
malloc(sz);
708 snprintf(geocol_query, sz, sql_form, schema, table);
718 if (PQntuples(geocol_result) > 0)
721 for (j = 0; j < PQntuples(geocol_result); j++)
723 geocol_name = PQgetvalue(geocol_result, j, PQfnumber(geocol_result,
"attname"));
726 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
737 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
743 PQclear(geocol_result);
749 hasgeo = atoi(PQgetvalue(
result, i, PQfnumber(
result,
"hasgeo")));
810 if (keep_fieldname_case)
888 if (response == GTK_RESPONSE_OK)
904 char *table_start, *table_end;
918 loader_file_config->
shp_file = strdup(filename);
921 table_start = loader_file_config->
shp_file + strlen(loader_file_config->
shp_file);
922 while (*table_start !=
'/' && *table_start !=
'\\' && table_start > loader_file_config->
shp_file)
929 table_end = loader_file_config->
shp_file + strlen(loader_file_config->
shp_file);
930 while (*table_end !=
'.' && table_end > loader_file_config->
shp_file && table_end > table_start )
934 loader_file_config->
table =
malloc(table_end - table_start + 1);
935 memcpy(loader_file_config->
table, table_start, table_end - table_start);
936 loader_file_config->
table[table_end - table_start] =
'\0';
939 for (i = 0; i < table_end - table_start; i++)
941 if (isupper(loader_file_config->
table[i]) != 0)
942 loader_file_config->
table[i] = tolower(loader_file_config->
table[i]);
946 loader_file_config->
schema = strdup(
"public");
954 return loader_file_config;
1025 gchar *schema, *table, *geocol;
1042 dumper_table_config->
schema = strdup(schema);
1043 dumper_table_config->
table = strdup(table);
1046 dumper_table_config->
shp_file = strdup(table);
1048 if (hasgeo && geocol)
1053 return dumper_table_config;
1062 GtkListStore *geocol_liststore;
1074 if (chooser_liststore)
1077 gtk_tree_model_get(GTK_TREE_MODEL(chooser_liststore), chooser_iter,
1115 switch (dbf_fieldtype)
1119 if (!strcmp(pg_fieldtype,
"varchar"))
1125 if (!strcmp(pg_fieldtype,
"date"))
1131 if (!strcmp(pg_fieldtype,
"int2") || !strcmp(pg_fieldtype,
"int4") || !strcmp(pg_fieldtype,
"numeric"))
1137 if (!strcmp(pg_fieldtype,
"float8") || !strcmp(pg_fieldtype,
"numeric"))
1143 if (!strcmp(pg_fieldtype,
"boolean"))
1157 ExecStatusType status;
1160 char *pg_fieldname, *pg_fieldtype;
1164 status = PQresultStatus(
result);
1165 if (status == PGRES_TUPLES_OK)
1167 ntuples = PQntuples(
result);
1169 switch (config->
opt)
1193 pgui_seterr(
_(
"ERROR: Destination table %s.%s could not be found for appending"), config->
schema, config->
table);
1212 for (j = 0; j < ntuples; j++)
1214 pg_fieldname = PQgetvalue(
result, j, PQfnumber(
result,
"field"));
1215 pg_fieldtype = PQgetvalue(
result, j, PQfnumber(
result,
"type"));
1224 pgui_logf(
_(
"Warning: DBF Field '%s' is not compatible with PostgreSQL column '%s' in %s.%s"), state->
field_names[i], pg_fieldname, config->
schema, config->
table);
1233 pgui_logf(
_(
"Warning: DBF Field '%s' within file %s could not be matched to a column within table %s.%s"),
1247 pgui_seterr(
_(
"ERROR: unable to process validation response from remote server"));
1290 if (response == GTK_RESPONSE_OK)
1303 GSList *filename_list, *filename_item;
1313 filename_list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(
dialog_filechooser));
1315 filename_item = g_slist_nth(filename_list, 0);
1316 while (filename_item)
1319 filename = g_slist_nth_data(filename_item, 0);
1325 filename_item = g_slist_next(filename_item);
1329 g_slist_free(filename_list);
1339 GtkTreeSelection *chooser_selection;
1340 GtkTreeModel *model;
1341 GList *selected_rows_list, *selected_row;
1343 GtkTreePath *tree_path;
1348 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1367 chooser_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
chooser_tree));
1369 selected_rows_list = gtk_tree_selection_get_selected_rows(chooser_selection, &model);
1370 selected_row = g_list_first(selected_rows_list);
1371 while (selected_row)
1374 tree_path = (GtkTreePath *)g_list_nth_data(selected_row, 0);
1375 gtk_tree_model_get_iter(model, &iter, tree_path);
1382 selected_row = g_list_next(selected_row);
1386 g_list_foreach(selected_row, (GFunc)gtk_tree_path_free, NULL);
1387 g_list_free(selected_row);
1426 char *sql_form, *query, *connection_string, *progress_shapefile = NULL;
1431 char *header, *footer, *record;
1437 pgui_seterr(
_(
"ERROR: You haven't specified any files to import"));
1447 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1464 sql_form =
"SELECT a.attnum, a.attname AS field, t.typname AS type, a.attlen AS length, a.atttypmod AS precision FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n WHERE c.relname = '%s' AND n.nspname = '%s' AND a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid AND c.relnamespace = n.oid ORDER BY a.attnum";
1476 sz = strlen(sql_form) + strlen(loader_file_config->
schema) + strlen(loader_file_config->
table) + 1;
1478 snprintf(query, sz, sql_form, loader_file_config->
table, loader_file_config->
schema);
1513 pgui_logf(
"\n==============================");
1514 pgui_logf(
"Importing with configuration: %s, %s, %s, %s, mode=%c, dump=%d, simple=%d, geography=%d, index=%d, shape=%d, srid=%d", loader_file_config->
table, loader_file_config->
schema, loader_file_config->
geo_col, loader_file_config->
shp_file, loader_file_config->
opt, loader_file_config->
dump_format, loader_file_config->
simple_geometries, loader_file_config->
geography, loader_file_config->
createindex, loader_file_config->
readshape, loader_file_config->
sr_id);
1525 gtk_widget_set_sensitive(widget,
FALSE);
1528 while (gtk_events_pending())
1529 gtk_main_iteration();
1541 goto import_cleanup;
1545 for (i = strlen(loader_file_config->
shp_file); i >= 0
1546 && loader_file_config->
shp_file[i - 1] !=
'\\' && loader_file_config->
shp_file[i - 1] !=
'/'; i--);
1548 progress_shapefile =
malloc(strlen(loader_file_config->
shp_file));
1549 strcpy(progress_shapefile, &loader_file_config->
shp_file[i]);
1555 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
1572 goto import_cleanup;
1581 goto import_cleanup;
1587 int records_per_tick = (numrecords / 200) - 1;
1589 if ( records_per_tick < 1 )
1590 records_per_tick = 1;
1602 goto import_cleanup;
1610 goto import_cleanup;
1614 for (i = 0; i < numrecords &&
is_running; i++)
1629 pgui_logf(
_(
"Import failed on record number %d"), i);
1637 goto import_cleanup;
1651 pgui_logf(
_(
"Import failed on record number %d"), i);
1666 if ( i % records_per_tick == 0 )
1667 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), (
float)i / numrecords);
1670 while (gtk_events_pending())
1671 gtk_main_iteration();
1678 goto import_cleanup;
1681 if (PQresultStatus(
result) != PGRES_COMMAND_OK)
1685 goto import_cleanup;
1700 goto import_cleanup;
1706 gtk_label_set_text(GTK_LABEL(
label_progress),
_(
"Creating spatial index..."));
1709 while (gtk_events_pending())
1710 gtk_main_iteration();
1718 goto import_cleanup;
1739 if (progress_shapefile)
1740 free(progress_shapefile);
1750 gtk_widget_set_sensitive(widget,
TRUE);
1753 gtk_widget_hide(widget);
1754 gtk_widget_show(widget);
1760 while (gtk_events_pending())
1761 gtk_main_iteration();
1764 free(connection_string);
1777 char *output_shapefile, *orig_shapefile;
1781 int ret, success =
FALSE, i = 0;
1787 pgui_seterr(
_(
"ERROR: You haven't specified any tables to export"));
1797 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1827 pgui_logf(
"\n==============================");
1828 pgui_logf(
"Exporting with configuration: %s, %s, %s", dumper_table_config->
table, dumper_table_config->
schema, dumper_table_config->
shp_file);
1835 gtk_widget_set_sensitive(widget,
FALSE);
1838 while (gtk_events_pending())
1839 gtk_main_iteration();
1846 orig_shapefile = dumper_table_config->
shp_file;
1847 output_shapefile =
malloc(strlen(folder_path) + strlen(dumper_table_config->
shp_file) + 2);
1848 strcpy(output_shapefile, folder_path);
1849 strcat(output_shapefile, G_DIR_SEPARATOR_S);
1850 strcat(output_shapefile, dumper_table_config->
shp_file);
1852 dumper_table_config->
shp_file = output_shapefile;
1861 goto export_cleanup;
1866 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
1881 goto export_cleanup;
1891 while (gtk_events_pending())
1892 gtk_main_iteration();
1911 goto export_cleanup;
1919 while (gtk_events_pending())
1920 gtk_main_iteration();
1948 dumper_table_config->
shp_file = orig_shapefile;
1962 gtk_widget_set_sensitive(widget,
TRUE);
1965 gtk_widget_hide(widget);
1966 gtk_widget_show(widget);
1972 while (gtk_events_pending())
1973 gtk_main_iteration();
1986 char *filename = NULL;
1988 GError *error = NULL;
1996 filename = g_filename_from_uri(uri, &hostname, &error);
1999 if (filename == NULL)
2001 pgui_logf(
_(
"Unable to process filename: %s\n"), error->message);
2002 g_error_free(error);
2019 gchar *schema, *table, *geo_col, *srid;
2030 if (loader_file_config->
schema)
2033 loader_file_config->
schema = strdup(schema);
2036 if (loader_file_config->
table)
2039 loader_file_config->
table = strdup(table);
2042 if (loader_file_config->
geo_col)
2045 loader_file_config->
geo_col = strdup(geo_col);
2048 loader_file_config->
sr_id = atoi(srid);
2064 GtkSelectionData *selection_data,
2065 guint info, guint t, gpointer
data)
2069 if (selection_data->data == NULL)
2071 pgui_logf(
_(
"Unable to process drag data."));
2075 p = (
char*)selection_data->data;
2082 while (g_ascii_isspace(*p))
2086 while (*q && (*q !=
'\n') && (*q !=
'\r'))
2093 while (q > p && g_ascii_isspace(*q))
2102 p = strchr(p,
'\n');
2115 GtkTreeIter *new_iter,
2141 loader_file_config->
opt =
'a';
2149 loader_file_config->
opt =
'd';
2153 loader_file_config->
opt =
'p';
2157 loader_file_config->
opt =
'c';
2189 if (strlen(new_text) == 0)
2193 columnindex = *(gint *)column;
2207 pgui_logf(
"Invalid SRID requiring more than %d digits: %d",
MAXLEN, loader_file_config->
sr_id);
2257 gchar *schema, *table, *geo_col, *filename;
2268 if (dumper_table_config->
schema)
2271 dumper_table_config->
schema = strdup(schema);
2274 if (dumper_table_config->
table)
2277 dumper_table_config->
table = strdup(table);
2289 dumper_table_config->
shp_file = strdup(filename);
2297 GtkTreeIter *new_iter,
2303 GtkListStore *model;
2326 dumper_table_config->
geo_col_name = strdup(geocol_name);
2348 if (strlen(new_text) == 0)
2352 columnindex = *(gint *)column;
2450 text = gtk_entry_get_text(GTK_ENTRY(
entry_pg_db));
2483 for (i = 0; i < strlen(
conn->
port); i++)
2487 pgui_seterr(
_(
"The connection port must be numeric!"));
2499 char *ptr = strstr(connection_string,
"password");
2503 while ( *ptr !=
'\'' && *ptr !=
'\0' )
2537 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
2556 const char *authors[] =
2558 "Paul Ramsey <pramsey@cleverelephant.ca>",
2559 "Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>",
2560 "Mark Leslie <mark.s.leslie@gmail.com>",
2567 gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(
dialog_about),
_(
"PostGIS Shapefile Import/Export Manager"));
2569 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(
dialog_about),
"http://postgis.net/");
2570 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(
dialog_about), authors);
2576 GtkFileFilter *file_filter_shape;
2580 GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CLOSE, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
2583 file_filter_shape = gtk_file_filter_new();
2584 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.shp");
2585 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"Shape Files (*.shp)"));
2586 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(
dialog_filechooser), file_filter_shape);
2589 file_filter_shape = gtk_file_filter_new();
2590 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.dbf");
2591 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"DBF Files (*.dbf)"));
2592 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(
dialog_filechooser), file_filter_shape);
2603 GtkFileFilter *file_filter_shape;
2607 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CLOSE, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
2610 file_filter_shape = gtk_file_filter_new();
2611 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.shp");
2612 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"Shape Files (*.shp)"));
2616 file_filter_shape = gtk_file_filter_new();
2617 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.dbf");
2618 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"DBF Files (*.dbf)"));
2627 GtkWidget *vbox_progress, *table_progress;
2629 dialog_progress = gtk_dialog_new_with_buttons(
_(
"Working..."), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
2637 gtk_box_set_spacing(GTK_BOX(vbox_progress), 15);
2640 table_progress = gtk_table_new(2, 1,
TRUE);
2641 gtk_container_set_border_width (GTK_CONTAINER (table_progress), 12);
2642 gtk_table_set_row_spacings(GTK_TABLE(table_progress), 5);
2643 gtk_table_set_col_spacings(GTK_TABLE(table_progress), 10);
2647 gtk_table_attach_defaults(GTK_TABLE(table_progress),
label_progress, 0, 1, 0, 1);
2651 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(
progress), GTK_PROGRESS_LEFT_TO_RIGHT);
2652 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
2653 gtk_table_attach_defaults(GTK_TABLE(table_progress),
progress, 0, 1, 1, 2);
2656 gtk_box_pack_start(GTK_BOX(vbox_progress), table_progress,
FALSE,
FALSE, 0);
2670 GtkWidget *align = gtk_alignment_new(alignment, 0.5, 0.0, 1.0);
2671 GtkWidget *label = gtk_label_new(
str);
2672 gtk_table_attach_defaults(GTK_TABLE(table), align, 1, 3, row, row + 1);
2673 gtk_container_add(GTK_CONTAINER (align), label);
2679 GtkWidget *table_options;
2680 GtkWidget *align_options_center;
2681 static int text_width = 12;
2683 dialog_loader_options = gtk_dialog_new_with_buttons(
_(
"Import Options"), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2689 table_options = gtk_table_new(7, 3,
TRUE);
2690 gtk_container_set_border_width (GTK_CONTAINER (table_options), 12);
2691 gtk_table_set_row_spacings(GTK_TABLE(table_options), 5);
2692 gtk_table_set_col_spacings(GTK_TABLE(table_options), 10);
2701 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2702 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 1, 2 );
2707 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2708 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 2, 3 );
2713 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2714 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 3, 4 );
2719 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2720 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 4, 5 );
2725 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
2726 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 5, 6 );
2731 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2732 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 6, 7 );
2737 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2738 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 7, 8 );
2752 GtkWidget *table_options;
2753 GtkWidget *align_options_center;
2755 dialog_dumper_options = gtk_dialog_new_with_buttons(
_(
"Export Options"), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2761 table_options = gtk_table_new(3, 3,
TRUE);
2762 gtk_container_set_border_width (GTK_CONTAINER (table_options), 12);
2763 gtk_table_set_row_spacings(GTK_TABLE(table_options), 5);
2764 gtk_table_set_col_spacings(GTK_TABLE(table_options), 10);
2768 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2769 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 0, 1 );
2774 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2775 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 1, 2 );
2780 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2781 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 2, 3 );
2799 GtkWidget *vbox_tree, *table_progress;
2800 GtkWidget *sw, *label;
2801 GtkTreeSelection *chooser_selection;
2805 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2816 GTK_TYPE_TREE_MODEL,
2828 chooser_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
chooser_tree));
2829 gtk_tree_selection_set_mode(chooser_selection, GTK_SELECTION_MULTIPLE);
2832 sw = gtk_scrolled_window_new(NULL, NULL);
2833 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2834 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
2835 gtk_widget_set_size_request(sw, 320, 240);
2837 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
FALSE,
FALSE, 10);
2865 table_progress = gtk_table_new(1, 2,
FALSE);
2866 gtk_container_set_border_width (GTK_CONTAINER (table_progress), 0);
2867 gtk_table_set_row_spacings(GTK_TABLE(table_progress), 0);
2868 gtk_table_set_col_spacings(GTK_TABLE(table_progress), 0);
2872 label = gtk_label_new(
_(
"Only show tables with geo columns"));
2873 gtk_table_attach(GTK_TABLE(table_progress), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 5, 0);
2878 gtk_box_pack_start(GTK_BOX(vbox_tree), table_progress,
FALSE,
FALSE, 10);
2891 GtkWidget *vbox_tree;
2894 gint *column_indexes;
2896 gtk_container_set_border_width (GTK_CONTAINER (import_list_frame), 0);
2898 vbox_tree = gtk_vbox_new(
FALSE, 15);
2899 gtk_container_set_border_width(GTK_CONTAINER(vbox_tree), 5);
2900 gtk_container_add(GTK_CONTAINER(import_list_frame), vbox_tree);
2924 sw = gtk_scrolled_window_new(NULL, NULL);
2925 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2926 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
2927 gtk_widget_set_size_request(sw, -1, 150);
2929 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
TRUE,
TRUE, 0);
2930 gtk_container_add(GTK_CONTAINER (sw),
import_tree);
3061 GtkTargetEntry drop_types[] =
3063 {
"text/uri-list", 0, 0}
3066 gint n_drop_types =
sizeof(drop_types)/
sizeof(drop_types[0]);
3068 GTK_DEST_DEFAULT_ALL,
3069 drop_types, n_drop_types,
3071 g_signal_connect(G_OBJECT(
import_tree),
"drag_data_received",
3082 GtkWidget *vbox_tree;
3084 gint *column_indexes;
3086 gtk_container_set_border_width (GTK_CONTAINER (export_list_frame), 0);
3088 vbox_tree = gtk_vbox_new(
FALSE, 15);
3089 gtk_container_set_border_width(GTK_CONTAINER(vbox_tree), 5);
3090 gtk_container_add(GTK_CONTAINER(export_list_frame), vbox_tree);
3098 GTK_TYPE_TREE_MODEL,
3113 sw = gtk_scrolled_window_new(NULL, NULL);
3114 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
3115 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
3116 gtk_widget_set_size_request(sw, -1, 150);
3118 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
TRUE,
TRUE, 0);
3119 gtk_container_add(GTK_CONTAINER (sw),
export_tree);
3201 static int text_width = 12;
3210 GtkWidget *frame_pg, *table_pg;
3213 GtkWidget *button_okay;
3216 window_conn = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3217 gtk_container_set_border_width(GTK_CONTAINER(
window_conn), 10);
3218 gtk_window_set_title(GTK_WINDOW(
window_conn),
_(
"PostGIS connection"));
3219 gtk_window_set_position(GTK_WINDOW(
window_conn), GTK_WIN_POS_CENTER);
3223 vbox = gtk_vbox_new(
FALSE, 15);
3228 frame_pg = gtk_frame_new(
_(
"PostGIS Connection"));
3229 table_pg = gtk_table_new(5, 3,
TRUE);
3230 gtk_container_set_border_width (GTK_CONTAINER (table_pg), 8);
3231 gtk_table_set_col_spacings(GTK_TABLE(table_pg), 7);
3232 gtk_table_set_row_spacings(GTK_TABLE(table_pg), 3);
3235 label = gtk_label_new(
_(
"Username:"));
3237 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 0, 1 );
3238 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_user, 1, 3, 0, 1 );
3241 label = gtk_label_new(
_(
"Password:"));
3244 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 1, 2 );
3245 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_pass, 1, 3, 1, 2 );
3248 label = gtk_label_new(
_(
"Server Host:"));
3250 gtk_entry_set_width_chars(GTK_ENTRY(
entry_pg_host), text_width);
3251 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 2, 3 );
3252 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_host, 1, 2, 2, 3 );
3256 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_port, 2, 3, 2, 3 );
3259 label = gtk_label_new(
_(
"Database:"));
3261 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 3, 4 );
3262 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_db, 1, 3, 3, 4 );
3265 gtk_container_add(GTK_CONTAINER(frame_pg), table_pg);
3268 gtk_container_add(GTK_CONTAINER(
window_conn), vbox);
3271 gtk_container_add(GTK_CONTAINER(vbox), frame_pg);
3274 button_okay = gtk_button_new_with_label(
_(
"OK"));
3275 gtk_container_add(GTK_CONTAINER(vbox), button_okay);
3288 GtkWidget *vbox_main, *vbox_loader, *vbox_dumper;
3291 GtkWidget *frame_pg, *import_list_frame, *export_list_frame, *frame_log;
3292 GtkWidget *button_pg_conn;
3295 GtkWidget *notebook;
3298 GtkWidget *loader_hbox_buttons, *loader_button_options, *loader_button_import, *loader_button_cancel, *loader_button_about;
3299 GtkWidget *dumper_hbox_buttons, *dumper_button_options, *dumper_button_export, *dumper_button_cancel, *dumper_button_about;
3302 GtkWidget *scrolledwindow_log;
3305 window_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3306 gtk_container_set_border_width(GTK_CONTAINER(
window_main), 10);
3307 gtk_window_set_title(GTK_WINDOW(
window_main),
_(
"PostGIS Shapefile Import/Export Manager"));
3308 gtk_window_set_position(GTK_WINDOW(
window_main), GTK_WIN_POS_CENTER_ALWAYS);
3312 gtk_window_set_default_size(GTK_WINDOW(
window_main), 180, 500);
3321 frame_pg = gtk_frame_new(
_(
"PostGIS Connection"));
3324 button_pg_conn = gtk_button_new_with_label(
_(
"View connection details..."));
3326 gtk_container_set_border_width(GTK_CONTAINER(button_pg_conn), 10);
3327 gtk_container_add(GTK_CONTAINER(frame_pg), button_pg_conn);
3332 notebook = gtk_notebook_new();
3337 import_list_frame = gtk_frame_new(
_(
"Import List"));
3343 loader_hbox_buttons = gtk_hbox_new(
TRUE, 15);
3344 gtk_container_set_border_width (GTK_CONTAINER (loader_hbox_buttons), 0);
3347 loader_button_options = gtk_button_new_with_label(
_(
"Options..."));
3348 loader_button_import = gtk_button_new_with_label(
_(
"Import"));
3349 loader_button_cancel = gtk_button_new_with_label(
_(
"Cancel"));
3350 loader_button_about = gtk_button_new_with_label(
_(
"About"));
3353 g_signal_connect (G_OBJECT (loader_button_import),
"clicked", G_CALLBACK (
pgui_action_import), NULL);
3355 g_signal_connect (G_OBJECT (loader_button_cancel),
"clicked", G_CALLBACK (
pgui_action_cancel), NULL);
3359 gtk_box_pack_start(GTK_BOX(loader_hbox_buttons), loader_button_options,
TRUE,
TRUE, 0);
3360 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_cancel,
TRUE,
TRUE, 0);
3361 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_about,
TRUE,
TRUE, 0);
3362 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_import,
TRUE,
TRUE, 0);
3367 export_list_frame = gtk_frame_new(
_(
"Export List"));
3373 dumper_hbox_buttons = gtk_hbox_new(
TRUE, 15);
3374 gtk_container_set_border_width (GTK_CONTAINER (dumper_hbox_buttons), 0);
3377 dumper_button_options = gtk_button_new_with_label(
_(
"Options..."));
3378 dumper_button_export = gtk_button_new_with_label(
_(
"Export"));
3379 dumper_button_cancel = gtk_button_new_with_label(
_(
"Cancel"));
3380 dumper_button_about = gtk_button_new_with_label(
_(
"About"));
3383 g_signal_connect (G_OBJECT (dumper_button_export),
"clicked", G_CALLBACK (
pgui_action_export), NULL);
3385 g_signal_connect (G_OBJECT (dumper_button_cancel),
"clicked", G_CALLBACK (
pgui_action_cancel), NULL);
3389 gtk_box_pack_start(GTK_BOX(dumper_hbox_buttons), dumper_button_options,
TRUE,
TRUE, 0);
3390 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_cancel,
TRUE,
TRUE, 0);
3391 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_about,
TRUE,
TRUE, 0);
3392 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_export,
TRUE,
TRUE, 0);
3397 frame_log = gtk_frame_new(
_(
"Log Window"));
3398 gtk_container_set_border_width (GTK_CONTAINER (frame_log), 0);
3399 gtk_widget_set_size_request(frame_log, -1, 200);
3402 scrolledwindow_log = gtk_scrolled_window_new(NULL, NULL);
3403 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scrolledwindow_log), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
3405 gtk_container_set_border_width (GTK_CONTAINER (
textview_log), 5);
3408 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(
textview_log), GTK_WRAP_WORD);
3409 gtk_container_add (GTK_CONTAINER (scrolledwindow_log),
textview_log);
3410 gtk_container_add (GTK_CONTAINER (frame_log), scrolledwindow_log);
3415 vbox_main = gtk_vbox_new(
FALSE, 10);
3416 gtk_container_set_border_width (GTK_CONTAINER (vbox_main), 0);
3419 vbox_loader = gtk_vbox_new(
FALSE, 10);
3420 gtk_container_set_border_width(GTK_CONTAINER(vbox_loader), 10);
3422 gtk_box_pack_start(GTK_BOX(vbox_loader), import_list_frame,
FALSE,
TRUE, 0);
3423 gtk_box_pack_start(GTK_BOX(vbox_loader), loader_hbox_buttons,
FALSE,
FALSE, 0);
3424 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_loader, gtk_label_new(
_(
"Import")));
3427 vbox_dumper = gtk_vbox_new(
FALSE, 10);
3428 gtk_container_set_border_width(GTK_CONTAINER(vbox_dumper), 10);
3430 gtk_box_pack_start(GTK_BOX(vbox_dumper), export_list_frame,
FALSE,
TRUE, 0);
3431 gtk_box_pack_start(GTK_BOX(vbox_dumper), dumper_hbox_buttons,
FALSE,
FALSE, 0);
3432 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_dumper, gtk_label_new(
_(
"Export")));
3435 gtk_box_pack_start(GTK_BOX(vbox_main), frame_pg,
FALSE,
TRUE, 0);
3436 gtk_box_pack_start(GTK_BOX(vbox_main), notebook,
FALSE,
TRUE, 0);
3437 gtk_box_pack_start(GTK_BOX(vbox_main), frame_log,
TRUE,
TRUE, 0);
3440 gtk_container_add(GTK_CONTAINER(
window_main), vbox_main);
3451 printf(
"RCSID: %s RELEASE: %s\n",
S2P_RCSID, POSTGIS_VERSION);
3452 printf(
"USAGE: shp2pgsql-gui [options]\n");
3453 printf(
"OPTIONS:\n");
3454 printf(
" -U <username>\n");
3455 printf(
" -W <password>\n");
3456 printf(
" -h <host>\n");
3457 printf(
" -p <port>\n");
3458 printf(
" -d <database>\n");
3459 printf(
" -? Display this help screen\n");
3468 setlocale (LC_ALL,
"");
3469 bindtextdomain (PACKAGE, PGSQL_LOCALEDIR);
3470 textdomain (PACKAGE);
3491 while ((c =
pgis_getopt(argc, argv,
"U:p:W:d:h:")) != -1)
3519 gtk_init(&argc, &argv);
char result[OUT_DOUBLE_BUFFER_SIZE]
int pgis_getopt(int argc, char **argv, char *opts)
void set_dumper_config_defaults(SHPDUMPERCONFIG *config)
int ShpDumperGetRecordCount(SHPDUMPERSTATE *state)
void ShpDumperDestroy(SHPDUMPERSTATE *state)
char * shapetypename(int num)
SHPDUMPERSTATE * ShpDumperCreate(SHPDUMPERCONFIG *config)
int ShpDumperConnectDatabase(SHPDUMPERSTATE *state)
int ShpLoaderGenerateShapeRow(SHPDUMPERSTATE *state)
int ShpDumperCloseTable(SHPDUMPERSTATE *state)
int ShpDumperOpenTable(SHPDUMPERSTATE *state)
char * ShpDumperGetConnectionStringFromConn(SHPCONNECTIONCONFIG *conn)
const char SHPAPI_CALL1 * SHPTypeName(int nSHPType);const char SHPAPI_CALL1(*) SHPPartTypeName(int nPartType
int ShpLoaderGetRecordCount(SHPLOADERSTATE *state)
void ShpLoaderDestroy(SHPLOADERSTATE *state)
int ShpLoaderGetSQLCopyStatement(SHPLOADERSTATE *state, char **strheader)
int ShpLoaderOpenShape(SHPLOADERSTATE *state)
int ShpLoaderGenerateSQLRowStatement(SHPLOADERSTATE *state, int item, char **strrecord)
void set_loader_config_defaults(SHPLOADERCONFIG *config)
int ShpLoaderGetSQLFooter(SHPLOADERSTATE *state, char **strfooter)
SHPLOADERSTATE * ShpLoaderCreate(SHPLOADERCONFIG *config)
int ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
#define GEOGRAPHY_DEFAULT
#define SHPLOADERRECISNULL
#define SHPLOADERRECDELETED
static GtkWidget * label_progress
GtkCellRenderer * export_schema_renderer
@ LOADER_MODE_COMBO_COLUMNS
@ LOADER_MODE_COMBO_OPTION_CHAR
static GtkWidget * add_table_button
static GtkWidget * checkbutton_loader_options_dumpformat
static void pgui_action_connection_details(GtkWidget *widget, gpointer data)
int main(int argc, char *argv[])
GtkCellRenderer * chooser_schema_renderer
static GtkTextBuffer * textbuffer_log
GtkCellRenderer * import_table_renderer
static void update_filename_field_width(void)
static void update_options_ui_from_loader_config_globals(void)
GtkCellRenderer * import_remove_renderer
static SHPLOADERCONFIG * create_new_file_config(const char *filename)
static void pgui_set_dumper_configs_from_options_ui()
static void pgui_set_loader_configs_from_options_ui()
static void update_dumper_config_globals_from_options_ui(SHPDUMPERCONFIG *config)
static void pgui_create_filechooser_dialog(void)
static GtkWidget * add_file_button
GtkTreeViewColumn * export_remove_column
static GtkWidget * entry_pg_port
static GtkWidget * progress
static GtkWidget * checkbutton_loader_options_simplegeoms
static void static void static void static void pgui_seterr(const char *fmt,...) __attribute__((format(printf
GtkTreeViewColumn * import_table_column
static void pgui_action_handle_file_remove(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data)
static void pgui_log_va(const char *fmt, va_list ap) __attribute__((format(printf
static gint pgui_event_popup_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
static int pgui_copy_write(const char *line)
static GtkWidget * checkbutton_loader_options_forceint
static int validate_shape_column_against_pg_column(int dbf_fieldtype, char *pg_fieldtype)
static GtkWidget * dialog_tablechooser
static void update_options_ui_from_dumper_config_globals(void)
@ TABLECHOOSER_HASGEO_COLUMN
@ TABLECHOOSER_TABLE_COLUMN
@ TABLECHOOSER_SCHEMA_COLUMN
@ TABLECHOOSER_GEO_LISTSTORE_COLUMN
@ TABLECHOOSER_GEO_COLUMN
GtkCellRenderer * export_geom_column_renderer
static volatile int is_running
static void update_table_chooser_from_database()
static GtkWidget * entry_pg_host
static int validate_remote_loader_columns(SHPLOADERCONFIG *config, PGresult *result)
static SHPDUMPERCONFIG * create_new_table_config(GtkTreeIter *iter)
static GtkWidget * dialog_dumper_options
static void update_loader_config_globals_from_options_ui(SHPLOADERCONFIG *config)
GtkTreeViewColumn * chooser_schema_column
static void update_dumper_table_config_from_listview_iter(GtkTreeIter *iter, SHPDUMPERCONFIG *dumper_table_config)
static void pgui_action_import(GtkWidget *widget, gpointer data)
static void pgui_action_export(GtkWidget *widget, gpointer data)
static GtkWidget * dialog_filechooser
static int pgui_copy_end(const int rollback)
static void pgui_action_handle_table_remove(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data)
static GtkWidget * checkbutton_loader_options_autoindex
GtkListStore * chooser_table_list_store
static void static void static void pgui_logf(const char *fmt,...) __attribute__((format(printf
static void pgui_create_export_table_table(GtkWidget *export_list_frame)
static GtkWidget * entry_pg_user
static void pgui_create_loader_options_dialog()
GtkCellRenderer * import_schema_renderer
static GtkWidget * checkbutton_loader_options_dbfonly
static PGconn * pg_connection
static GtkWidget * textview_log
GtkTreeViewColumn * export_table_column
static void pgui_create_folderchooser_dialog(void)
GtkTreeViewColumn * export_schema_column
GtkTreeViewColumn * import_srid_column
static void pgui_raise_error_dialogue(void)
static GtkWidget * entry_pg_db
static void update_loader_file_config_from_listview_iter(GtkTreeIter *iter, SHPLOADERCONFIG *loader_file_config)
static void pgui_action_dumper_options_close(GtkWidget *widget, gint response, gpointer data)
static void pgui_action_handle_tree_combo(GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter, gpointer user_data)
static GtkWidget * checkbutton_dumper_options_keep_fieldname_case
static void pgui_action_about_open()
static void static void static void static void static void update_conn_ui_from_conn_config(void)
GtkListStore * chooser_filtered_table_list_store
static int pgui_copy_start(const char *sql)
static GtkWidget * dialog_progress
static void pgui_action_handle_dumper_edit(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer column)
static void pgui_action_handle_table_geocol_combo(GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter, gpointer user_data)
GtkCellRenderer * export_filename_renderer
#define gtk_dialog_get_content_area(dialog)
static void free_loader_config(SHPLOADERCONFIG *config)
static void static void pgui_seterr_va(const char *fmt, va_list ap) __attribute__((format(printf
static int pgui_validate_connection()
static GtkWidget * entry_pg_pass
static void pgui_action_progress_cancel(GtkDialog *dialog, gint response_id, gpointer user_data)
static void process_single_uri(char *uri)
static void pgui_create_progress_dialog()
#define SHAPEFIELDMAXWIDTH
GtkWidget * loader_mode_combo
static void pgui_action_handle_file_drop(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, gpointer data)
GtkTreeViewColumn * import_remove_column
static void pgui_create_options_dialog_add_label(GtkWidget *table, const char *str, gfloat alignment, int row)
static GtkWidget * checkbutton_chooser_geoonly
static void add_loader_file_config_to_list(SHPLOADERCONFIG *loader_file_config)
GtkTreeViewColumn * export_geom_column
static void add_dumper_table_config_to_list(SHPDUMPERCONFIG *dumper_table_config, GtkListStore *chooser_liststore, GtkTreeIter *chooser_iter)
static void pgui_action_loader_options_open(GtkWidget *widget, gpointer data)
static int valid_connection
static void pgui_sanitize_connection_string(char *connection_string)
static int connection_test(void)
GtkListStore * export_table_list_store
GtkCellRenderer * chooser_table_renderer
static void pgui_action_open_file_dialog(GtkWidget *widget, gpointer data)
GtkTreeViewColumn * import_schema_column
static GtkWidget * dialog_about
static gint pgui_action_progress_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
static void pgui_quit(GtkWidget *widget, gpointer data)
GtkListStore * import_file_list_store
static gboolean table_chooser_visibility_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
static void pgui_create_connection_window()
static GtkWidget * checkbutton_loader_options_preservecase
@ EXPORT_GEOMETRY_LISTSTORE_COLUMN
static void pgui_action_loader_options_close(GtkWidget *widget, gint response, gpointer data)
static GtkWidget * entry_options_encoding
#define GUIMSG_LINE_MAXLEN
@ TABLECHOOSER_GEOCOL_COMBO_TEXT
@ TABLECHOOSER_GEOCOL_COMBO_COLUMNS
static void free_dumper_config(SHPDUMPERCONFIG *config)
static GtkWidget * dialog_folderchooser
static void pgui_action_dumper_options_open(GtkWidget *widget, gpointer data)
static void pgui_action_handle_loader_edit(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer column)
GtkTreeViewColumn * import_filename_column
static GtkWidget * window_main
static GtkWidget * checkbutton_dumper_options_unescapedattrs
static int pgui_exec(const char *sql)
GtkTreeViewColumn * chooser_table_column
GtkListStore * loader_mode_combo_list
static void pgui_action_open_table_dialog(GtkWidget *widget, gpointer data)
static GtkWidget * dialog_loader_options
GtkCellRenderer * import_srid_renderer
GtkCellRenderer * import_mode_renderer
static void update_conn_config_from_conn_ui(void)
static SHPCONNECTIONCONFIG * conn
GtkWidget * export_geom_column_combo
static void pgui_action_chooser_toggle_show_geocolumn(GtkToggleButton *togglebutton, gpointer user_data)
GtkCellRenderer * import_filename_renderer
static void pgui_create_main_window(const SHPCONNECTIONCONFIG *conn)
GtkCellRenderer * export_remove_renderer
static void pgui_action_cancel(GtkWidget *widget, gpointer data)
static GtkWidget * window_conn
static void pgui_action_connection_okay(GtkWidget *widget, gpointer data)
GtkCellRenderer * export_table_renderer
static void pgui_create_import_file_table(GtkWidget *import_list_frame)
static SHPLOADERCONFIG * global_loader_config
static SHPDUMPERCONFIG * global_dumper_config
static GtkWidget * checkbutton_loader_options_geography
static char pgui_errmsg[GUIMSG_LINE_MAXLEN+1]
GtkCellRenderer * import_geom_column_renderer
GtkTreeViewColumn * export_filename_column
GtkTreeViewColumn * import_geom_column
static void pgui_create_dumper_options_dialog()
static void pgui_create_about_dialog(void)
GtkTreeViewColumn * import_mode_column
static GtkWidget * checkbutton_dumper_options_includegid
static void pgui_create_tablechooser_dialog()
#define POSTGIS_LIB_VERSION
SHPCONNECTIONCONFIG * conn
char message[SHPDUMPERMSGLEN]
char message[SHPLOADERMSGLEN]