GRASS GIS 8 Programmer's Manual  8.4.0dev(2024)-6c790bf5c0
open_nat.c
Go to the documentation of this file.
1 /*!
2  \file lib/vector/Vlib/open_nat.c
3 
4  \brief Vector library - open vector map (native format) - level 1
5 
6  Higher level functions for reading/writing/manipulating vectors.
7 
8  (C) 2001-2009 by the GRASS Development Team
9 
10  This program is free software under the GNU General Public License
11  (>=v2). Read the file COPYING that comes with GRASS for details.
12 
13  \author Original author CERL, probably Dave Gerdes or Mike Higgins.
14  \author Update to GRASS 5.7 Radim Blazek and David D. Gray.
15  */
16 
17 #include <inttypes.h>
18 #include <unistd.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 
22 #include <grass/vector.h>
23 #include <grass/glocale.h>
24 
25 #include "local_proto.h"
26 
27 static int check_coor(struct Map_info *Map);
28 
29 /*!
30  \brief Open existing vector map (level 1)
31 
32  Map->name and Map->mapset must be set before.
33 
34  \param Map pointer to Map_info structure
35  \param update non-zero for write mode, otherwise read-only
36 
37  \return 0 success
38  \return -1 error
39  */
40 int V1_open_old_nat(struct Map_info *Map, int update)
41 {
42  char path[GPATH_MAX];
43  struct Coor_info CInfo;
44 
45  G_debug(1, "V1_open_old_nat(): name = %s mapset = %s", Map->name,
46  Map->mapset);
47 
48  Vect__get_path(path, Map);
49  dig_file_init(&(Map->dig_fp));
50  if (update)
52  else
54 
55  if (Map->dig_fp.file == NULL) {
56  G_warning(_("Unable to open coor file for vector map <%s>"),
57  Vect_get_full_name(Map));
58  return -1;
59  }
60 
61  /* needed to determine file size, Map->head.size will be updated
62  by dig__read_head(Map) */
63  Vect_coor_info(Map, &CInfo);
64  Map->head.size = CInfo.size;
65 
66  if (!(dig__read_head(Map))) {
67  G_debug(1, "dig__read_head(): failed");
68  return -1;
69  }
70 
71  /* compare coor size stored in head with real size */
72  /* check should catch if LFS is required but not available */
73  check_coor(Map);
74 
75  /* set conversion matrices */
77 
78  /* load to memory */
79  if (!update)
81  &(Map->dig_fp)); /* has currently no effect, file never loaded */
82 
83  return 0;
84 }
85 
86 /*!
87  \brief Create new vector map (level 1)
88 
89  \param[out] Map pointer to Map_info structure
90  \param name vector map name to be created
91  \param with_z 2D or 3D (unused?)
92 
93  \return 0 success
94  \return -1 error
95  */
96 int V1_open_new_nat(struct Map_info *Map, const char *name, int with_z)
97 {
98  char path[GPATH_MAX];
99 
100  G_debug(1, "V1_open_new_nat(): name = %s with_z = %d is_tmp = %d", name,
101  with_z, Map->temporary);
102 
103  /* Set the 'coor' file version */
108 
109  Vect__get_path(path, Map);
110 
111  /* TODO: open better */
112  dig_file_init(&(Map->dig_fp));
114  if (Map->dig_fp.file == NULL)
115  return -1;
116  fclose(Map->dig_fp.file);
117 
118  dig_file_init(&(Map->dig_fp));
120  if (Map->dig_fp.file == NULL)
121  return -1;
122 
123  /* if overwrite OK, any existing files have already been deleted by
124  * Vect_open_new(): remove this check ? */
125  /* check to see if dig_plus file exists and if so, remove it */
127  if (access(path, F_OK) == 0)
128  unlink(path); /* remove topo file if exists */
129 
130  /* set conversion matrices */
132 
133  /* write coor header */
134  if (!(dig__write_head(Map)))
135  return -1;
136 
137  return 0;
138 }
139 
140 /* check file size */
141 int check_coor(struct Map_info *Map)
142 {
143  struct Coor_info CInfo;
144  off_t dif;
145 
146  /* NOTE: coor file is open */
147  Vect_coor_info(Map, &CInfo);
148  dif = CInfo.size - Map->head.size;
149  G_debug(1, "coor size in head = %lu, real coor file size= %lu",
150  (unsigned long)Map->head.size, (unsigned long)CInfo.size);
151 
152  if (dif > 0) {
153  G_warning(
154  _("Coor file of vector map <%s@%s> is larger than it should be "
155  "(%" PRId64 " bytes excess)"),
156  Map->name, Map->mapset, dif);
157  }
158  else if (dif < 0) {
159  G_warning(_("Coor file of vector <%s@%s> is shorter than it should be "
160  "(%" PRId64 " bytes missing)."),
161  Map->name, Map->mapset, -dif);
162  }
163  return 1;
164 }
#define NULL
Definition: ccmath.h:32
FILE * G_fopen_old(const char *, const char *, const char *)
Open a database file for reading.
Definition: gis/open.c:251
void G_warning(const char *,...) __attribute__((format(printf
FILE * G_fopen_modify(const char *, const char *)
Open a database file for update (r+ mode)
Definition: gis/open.c:306
int G_debug(int, const char *,...) __attribute__((format(printf
FILE * G_fopen_new(const char *, const char *)
Open a new database file.
Definition: gis/open.c:219
int Vect_coor_info(struct Map_info *, struct Coor_info *)
Update Coor_info structure.
const char * Vect_get_full_name(struct Map_info *)
Get fully qualified name of vector map.
#define GV_COOR_EARLIEST_MINOR
Definition: dig_defines.h:162
#define GV_COOR_VER_MAJOR
The latest versions of files known by current version of the library. Used for new files.
Definition: dig_defines.h:150
#define GV_COOR_ELEMENT
Native format, coordinates.
Definition: dig_defines.h:12
#define GV_COOR_VER_MINOR
Definition: dig_defines.h:151
#define GV_TOPO_ELEMENT
Native format, topology file.
Definition: dig_defines.h:20
#define GV_COOR_EARLIEST_MAJOR
The oldest versions of the library, which are capable to read the files created by the current versio...
Definition: dig_defines.h:161
int dig_file_load(struct gvfile *file)
Load opened struct gvfile to memory.
Definition: file.c:188
int dig__read_head(struct Map_info *)
Definition: head.c:87
int dig__byte_order_out(void)
Get byte order.
Definition: portable.c:1008
void dig_init_portable(struct Port_info *, int)
Set Port_info structure to byte order of file.
Definition: portable.c:900
int dig__write_head(struct Map_info *)
Definition: head.c:23
void dig_file_init(struct gvfile *file)
Initialize gvfile structure.
Definition: file.c:171
#define GPATH_MAX
Definition: gis.h:194
#define _(str)
Definition: glocale.h:10
const char * name
Definition: named_colr.c:6
int V1_open_old_nat(struct Map_info *Map, int update)
Open existing vector map (level 1)
Definition: open_nat.c:40
int V1_open_new_nat(struct Map_info *Map, const char *name, int with_z)
Create new vector map (level 1)
Definition: open_nat.c:96
Coor file info.
Definition: dig_structs.h:371
off_t size
Total size (in bytes)
Definition: dig_structs.h:375
Vector map info.
Definition: dig_structs.h:1243
char * mapset
Mapset name.
Definition: dig_structs.h:1320
int temporary
Temporary map flag.
Definition: dig_structs.h:1260
struct gvfile dig_fp
GV file pointer (native format only)
Definition: dig_structs.h:1395
struct dig_head head
Header info.
Definition: dig_structs.h:1388
char * name
Map name (for 4.0)
Definition: dig_structs.h:1316
int byte_order
File byte order.
Definition: dig_structs.h:185
int minor
Current version (minor)
Definition: dig_structs.h:275
int back_major
Earliest version that can use this data format (major)
Definition: dig_structs.h:277
int back_minor
Earliest version that can use this data format (minor)
Definition: dig_structs.h:279
int major
Current version (major)
Definition: dig_structs.h:273
struct Version_info coor_version
Version info for coor file.
Definition: dig_structs.h:331
off_t size
Coor file size.
Definition: dig_structs.h:344
struct Port_info port
Portability information.
Definition: dig_structs.h:353
FILE * file
File descriptor.
Definition: dig_structs.h:98
Definition: path.h:15
char * Vect__get_path(char *path, struct Map_info *Map)
Get map directory name (internal use only)
char * Vect__get_element_path(char *file_path, struct Map_info *Map, const char *element)
Get map element full path (internal use only)