GRASS GIS 8 Programmer's Manual  8.5.0dev(2025)-582d100897
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  const char *map_name = Vect_get_full_name(Map);
57  G_warning(_("Unable to open coor file for vector map <%s>"), map_name);
58  G_free((void *)map_name);
59  return -1;
60  }
61 
62  /* needed to determine file size, Map->head.size will be updated
63  by dig__read_head(Map) */
64  Vect_coor_info(Map, &CInfo);
65  Map->head.size = CInfo.size;
66 
67  if (!(dig__read_head(Map))) {
68  G_debug(1, "dig__read_head(): failed");
69  return -1;
70  }
71 
72  /* compare coor size stored in head with real size */
73  /* check should catch if LFS is required but not available */
74  check_coor(Map);
75 
76  /* set conversion matrices */
78 
79  /* load to memory */
80  if (!update)
82  &(Map->dig_fp)); /* has currently no effect, file never loaded */
83 
84  return 0;
85 }
86 
87 /*!
88  \brief Create new vector map (level 1)
89 
90  \param[out] Map pointer to Map_info structure
91  \param name vector map name to be created
92  \param with_z 2D or 3D (unused?)
93 
94  \return 0 success
95  \return -1 error
96  */
97 int V1_open_new_nat(struct Map_info *Map, const char *name, int with_z)
98 {
99  char path[GPATH_MAX];
100 
101  G_debug(1, "V1_open_new_nat(): name = %s with_z = %d is_tmp = %d", name,
102  with_z, Map->temporary);
103 
104  /* Set the 'coor' file version */
109 
110  Vect__get_path(path, Map);
111 
112  /* TODO: open better */
113  dig_file_init(&(Map->dig_fp));
115  if (Map->dig_fp.file == NULL)
116  return -1;
117  fclose(Map->dig_fp.file);
118 
119  dig_file_init(&(Map->dig_fp));
121  if (Map->dig_fp.file == NULL)
122  return -1;
123 
124  /* if overwrite OK, any existing files have already been deleted by
125  * Vect_open_new(): remove this check ? */
126  /* check to see if dig_plus file exists and if so, remove it */
128  if (access(path, F_OK) == 0)
129  unlink(path); /* remove topo file if exists */
130 
131  /* set conversion matrices */
133 
134  /* write coor header */
135  if (!(dig__write_head(Map)))
136  return -1;
137 
138  return 0;
139 }
140 
141 /* check file size */
142 int check_coor(struct Map_info *Map)
143 {
144  struct Coor_info CInfo;
145  off_t dif;
146 
147  /* NOTE: coor file is open */
148  Vect_coor_info(Map, &CInfo);
149  dif = CInfo.size - Map->head.size;
150  G_debug(1, "coor size in head = %lu, real coor file size= %lu",
151  (unsigned long)Map->head.size, (unsigned long)CInfo.size);
152 
153  if (dif > 0) {
154  G_warning(
155  _("Coor file of vector map <%s@%s> is larger than it should be "
156  "(%" PRId64 " bytes excess)"),
157  Map->name, Map->mapset, dif);
158  }
159  else if (dif < 0) {
160  G_warning(_("Coor file of vector <%s@%s> is shorter than it should be "
161  "(%" PRId64 " bytes missing)."),
162  Map->name, Map->mapset, -dif);
163  }
164  return 1;
165 }
#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_free(void *)
Free allocated memory.
Definition: gis/alloc.c:150
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:97
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
#define unlink
Definition: unistd.h:11
#define access
Definition: unistd.h:7
#define F_OK
Definition: unistd.h:22
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)