GRASS Programmer's Manual  6.4.2(2012)
close_ogr.c
Go to the documentation of this file.
00001 
00002 /*****************************************************************************
00003 *
00004 * MODULE:       Vector library 
00005 *               
00006 * AUTHOR(S):    Radim Blazek, Piero Cavalieri 
00007 *
00008 * PURPOSE:      Higher level functions for reading/writing/manipulating vectors.
00009 *
00010 * COPYRIGHT:    (C) 2001 by the GRASS Development Team
00011 *
00012 *               This program is free software under the GNU General Public
00013 *               License (>=v2). Read the file COPYING that comes with GRASS
00014 *               for details.
00015 *
00016 *****************************************************************************/
00017 #include <grass/Vect.h>
00018 #include <stdlib.h>
00019 
00020 #ifdef HAVE_OGR
00021 #include <ogr_api.h>
00022 
00023 /* 
00024  ** return 0 on success
00025  **         non-zero on error
00026  */
00027 int V1_close_ogr(struct Map_info *Map)
00028 {
00029     int i;
00030 
00031     if (!VECT_OPEN(Map))
00032         return -1;
00033 
00034     if (Map->mode == GV_MODE_WRITE || Map->mode == GV_MODE_RW)
00035         Vect__write_head(Map);
00036 
00037     if (Map->fInfo.ogr.feature_cache)
00038         OGR_F_Destroy(Map->fInfo.ogr.feature_cache);
00039 
00040     OGR_DS_Destroy(Map->fInfo.ogr.ds);
00041 
00042     for (i = 0; i < Map->fInfo.ogr.lines_alloc; i++) {
00043         Vect_destroy_line_struct(Map->fInfo.ogr.lines[i]);
00044     }
00045 
00046     free(Map->fInfo.ogr.lines);
00047     free(Map->fInfo.ogr.lines_types);
00048 
00049     free(Map->fInfo.ogr.dsn);
00050     free(Map->fInfo.ogr.layer_name);
00051 
00052     return 0;
00053 }
00054 
00055 /* 
00056  *  Write OGR specific files (fidx)
00057  * 
00058  *  return 0 on success
00059  *         non-zero on error
00060  */
00061 int V2_close_ogr(struct Map_info *Map)
00062 {
00063     char fname[1000], elem[1000];
00064     char buf[5];
00065     long length = 9;
00066     GVFILE fp;
00067     struct Port_info port;
00068 
00069     G_debug(3, "V2_close_ogr()");
00070 
00071     if (!VECT_OPEN(Map))
00072         return -1;
00073 
00074     if (strcmp(Map->mapset, G_mapset()) == 0 && Map->support_updated &&
00075         Map->plus.built == GV_BUILD_ALL) {
00076         sprintf(elem, "%s/%s", GRASS_VECT_DIRECTORY, Map->name);
00077         G__file_name(fname, elem, "fidx", Map->mapset);
00078         G_debug(4, "Open fidx: %s", fname);
00079         dig_file_init(&fp);
00080         fp.file = fopen(fname, "w");
00081         if (fp.file == NULL) {
00082             G_warning("Can't open fidx file for write: %s\n", fname);
00083             return 1;
00084         }
00085 
00086         dig_init_portable(&port, dig__byte_order_out());
00087         dig_set_cur_port(&port);
00088 
00089         /* Header */
00090         /* bytes 1 - 5 */
00091         buf[0] = 5;
00092         buf[1] = 0;
00093         buf[2] = 5;
00094         buf[3] = 0;
00095         buf[4] = (char)dig__byte_order_out();
00096         if (0 >= dig__fwrite_port_C(buf, 5, &fp))
00097             return (1);
00098 
00099         /* bytes 6 - 9 : header size */
00100         if (0 >= dig__fwrite_port_L(&length, 1, &fp))
00101             return (1);
00102 
00103         /* Body */
00104         /* number of records  */
00105         if (0 >= dig__fwrite_port_I(&(Map->fInfo.ogr.offset_num), 1, &fp))
00106             return (1);
00107 
00108         /* offsets */
00109         if (0 >= dig__fwrite_port_I(Map->fInfo.ogr.offset,
00110                                     Map->fInfo.ogr.offset_num, &fp))
00111             return (1);
00112 
00113         fclose(fp.file);
00114 
00115     }
00116 
00117     free(Map->fInfo.ogr.offset);
00118 
00119     return 0;
00120 }
00121 #endif
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines