1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
/*!
\file lib/vector/Vlib/close_pg.c
\brief Vector library - Close map (PostGIS)
Higher level functions for reading/writing/manipulating vectors.
(C) 2011 by the GRASS Development Team
This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.
\author Martin Landa <landa.martin gmail.com>
*/
#include <stdlib.h>
#include <unistd.h>
#include <grass/vector.h>
#include <grass/dbmi.h>
#include <grass/glocale.h>
#include "local_proto.h"
#ifdef HAVE_POSTGRES
#include "pg_local_proto.h"
#define NOPG_UNUSED
#else
#define NOPG_UNUSED UNUSED
#endif
/*!
\brief Close vector map (PostGIS layer) on level 1
\param Map pointer to Map_info structure
\return 0 on success
\return non-zero on error
*/
int V1_close_pg(struct Map_info *Map NOPG_UNUSED)
{
#ifdef HAVE_POSTGRES
struct Format_info_pg *pg_info;
G_debug(3, "V2_close_pg() name = %s mapset = %s", Map->name, Map->mapset);
if (!VECT_OPEN(Map))
return -1;
pg_info = &(Map->fInfo.pg);
if (Map->mode == GV_MODE_WRITE || Map->mode == GV_MODE_RW) {
/* write header */
Vect__write_head(Map);
/* write frmt file for created PG-link */
Vect_save_frmt(Map);
}
/* clear result */
if (pg_info->res) {
PQclear(pg_info->res);
pg_info->res = NULL;
}
/* close open cursor */
if (pg_info->cursor_name) {
char stmt[DB_SQL_MAX];
sprintf(stmt, "CLOSE %s", pg_info->cursor_name);
if (Vect__execute_pg(pg_info->conn, stmt) == -1) {
G_warning(_("Unable to close cursor %s"), pg_info->cursor_name);
return -1;
}
Vect__execute_pg(pg_info->conn, "COMMIT");
G_free(pg_info->cursor_name);
pg_info->cursor_name = NULL;
}
PQfinish(pg_info->conn);
/* close DB connection (for atgtributes) */
if (pg_info->dbdriver) {
db_close_database_shutdown_driver(pg_info->dbdriver);
}
Vect__free_cache(&(pg_info->cache));
G_free(pg_info->db_name);
G_free(pg_info->schema_name);
G_free(pg_info->geom_column);
G_free(pg_info->fid_column);
if (pg_info->fi)
G_free(pg_info->fi);
if (pg_info->toposchema_name)
G_free(pg_info->toposchema_name);
if (pg_info->topogeom_column)
G_free(pg_info->topogeom_column);
return 0;
#else
G_fatal_error(_("GRASS is not compiled with PostgreSQL support"));
return -1;
#endif
}
/*!
\brief Close vector map (PostGIS layer) on topological level (write out fidx
file)
\param Map pointer to Map_info structure
\return 0 on success
\return non-zero on error
*/
int V2_close_pg(struct Map_info *Map NOPG_UNUSED)
{
#ifdef HAVE_POSTGRES
G_debug(3, "V2_close_pg() name = %s mapset = %s", Map->name, Map->mapset);
if (!VECT_OPEN(Map))
return -1;
if (Map->fInfo.pg.toposchema_name) {
/* no fidx file for PostGIS topology
remove topo file (which was required for saving sidx file)
*/
char buf[GPATH_MAX];
char file_path[GPATH_MAX];
/* delete old support files if available */
sprintf(buf, "%s/%s", GV_DIRECTORY, Map->name);
Vect__get_element_path(file_path, Map, GV_TOPO_ELEMENT);
if (access(file_path, F_OK) == 0) /* file exists? */
unlink(file_path);
return 0;
}
/* write fidx for maps in the current mapset */
if (Vect_save_fidx(Map, &(Map->fInfo.pg.offset)) != 1)
G_warning(_("Unable to save feature index file for vector map <%s>"),
Map->name);
Vect__free_offset(&(Map->fInfo.pg.offset));
return 0;
#else
G_fatal_error(_("GRASS is not compiled with PostgreSQL support"));
return -1;
#endif
}
|