Browse Source

vectorlib: fix size estimation of spatial indices

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@73618 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 6 years ago
parent
commit
31746cbdf1
3 changed files with 22 additions and 11 deletions
  1. 2 1
      lib/vector/diglib/spindex_rw.c
  2. 5 5
      lib/vector/rtree/index.c
  3. 15 5
      lib/vector/rtree/io.c

+ 2 - 1
lib/vector/diglib/spindex_rw.c

@@ -65,7 +65,8 @@ int dig_Wr_spidx_head(struct gvfile * fp, struct Plus_head *ptr)
 
     /* use ptr->off_t_size = 4 if possible */
     if (sizeof(off_t) > 4) {
-	size = ptr->Node_spidx->n_nodes * ptr->Node_spidx->nodesize;
+	size = 145;	/* max header size, see below */
+	size += ptr->Node_spidx->n_nodes * ptr->Node_spidx->nodesize;
 	size += ptr->Line_spidx->n_nodes * ptr->Line_spidx->nodesize;
 	size += ptr->Area_spidx->n_nodes * ptr->Area_spidx->nodesize;
 	size += ptr->Isle_spidx->n_nodes * ptr->Isle_spidx->nodesize;

+ 5 - 5
lib/vector/rtree/index.c

@@ -84,13 +84,13 @@ struct RTree *RTreeCreateTree(int fd, off_t rootpos, int ndims)
     new_rtree->free_nodes.pos = NULL;
 
     new_rtree->rectsize = new_rtree->nsides_alloc * sizeof(RectReal);
+    new_rtree->branchsize = sizeof(struct RTree_Branch) -
+                            sizeof(struct RTree_Rect) +
+			    new_rtree->rectsize;
     new_rtree->nodesize = sizeof(struct RTree_Node) -
-                          MAXCARD * sizeof(RectReal *) +
-			  MAXCARD * new_rtree->rectsize;
+                          sizeof(struct RTree_Branch *) +
+			  MAXCARD * new_rtree->branchsize;
 
-    new_rtree->branchsize = sizeof(struct RTree_Branch) -
-                            sizeof(RectReal *) + new_rtree->rectsize;
-    
     /* create empty root node */
     n = RTreeAllocNode(new_rtree, 0);
     new_rtree->rootlevel = n->level = 0;       /* leaf */

+ 15 - 5
lib/vector/rtree/io.c

@@ -18,10 +18,12 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <assert.h>
-#include <grass/config.h>
+#include <errno.h>
+#include <grass/gis.h>
 #include "index.h"
 
 /* #define USAGE_SWAP */
@@ -153,8 +155,12 @@ size_t RTreeWriteBranch(struct RTree_Branch *b, struct RTree *t)
 {
     size_t size = 0;
 
-    size += write(t->fd, b->rect.boundary, t->rectsize);
-    size += write(t->fd, &(b->child), sizeof(union RTree_Child));
+    if (write(t->fd, b->rect.boundary, t->rectsize) != t->rectsize)
+	G_fatal_error("RTreeWriteBranch(): Unable to write (%s)", strerror(errno));
+    size += t->rectsize;
+    if (write(t->fd, &(b->child), sizeof(union RTree_Child)) != sizeof(union RTree_Child))
+	G_fatal_error("RTreeWriteBranch(): Unable to write (%s)", strerror(errno));
+    size += sizeof(union RTree_Child);
 
     return size;
 }
@@ -166,8 +172,12 @@ size_t RTreeWriteNode(struct RTree_Node *n, struct RTree *t)
     size_t size = 0;
 
     /* file position must be set first with RTreeGetFNodePos() */
-    size += write(t->fd, &(n->count), sizeof(int));
-    size += write(t->fd, &(n->level), sizeof(int));
+    if (write(t->fd, &(n->count), sizeof(int)) != sizeof(int))
+	G_fatal_error("RTreeWriteNode(): Unable to write (%s)", strerror(errno));
+    size += sizeof(int);
+    if (write(t->fd, &(n->level), sizeof(int)) != sizeof(int))
+	G_fatal_error("RTreeWriteNode(): Unable to write (%s)", strerror(errno));
+    size += sizeof(int);
 
     for (i = 0; i < MAXCARD; i++) {
 	size += RTreeWriteBranch(&(n->branch[i]), t);