Yet another temp file, for the tree of pointers into the string pool

This commit is contained in:
Eric Fischer
2015-06-18 16:30:51 -07:00
parent dc3021656e
commit 498e723563
+30 -18
View File
@@ -403,22 +403,22 @@ struct stringpool {
}; };
long long pooltree = 0; long long pooltree = 0;
long long addpool(struct memfile *poolfile, char *s, char type) { long long addpool(struct memfile *poolfile, struct memfile *treefile, char *s, char type) {
long long *sp = &pooltree; long long *sp = &pooltree;
while (*sp != 0) { while (*sp != 0) {
int cmp = strcmp(s, poolfile->map + ((struct stringpool *) (poolfile->map + *sp))->off + 1); int cmp = strcmp(s, poolfile->map + ((struct stringpool *) (treefile->map + *sp))->off + 1);
if (cmp == 0) { if (cmp == 0) {
cmp = type - (poolfile->map + ((struct stringpool *) (poolfile->map + *sp))->off)[0]; cmp = type - (poolfile->map + ((struct stringpool *) (treefile->map + *sp))->off)[0];
} }
if (cmp < 0) { if (cmp < 0) {
sp = &(((struct stringpool *) (poolfile->map + *sp))->left); sp = &(((struct stringpool *) (treefile->map + *sp))->left);
} else if (cmp > 0) { } else if (cmp > 0) {
sp = &(((struct stringpool *) (poolfile->map + *sp))->right); sp = &(((struct stringpool *) (treefile->map + *sp))->right);
} else { } else {
return ((struct stringpool *) (poolfile->map + *sp))->off; return ((struct stringpool *) (treefile->map + *sp))->off;
} }
} }
@@ -427,7 +427,7 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
if (sp == &pooltree) { if (sp == &pooltree) {
ssp = -1; ssp = -1;
} else { } else {
ssp = ((char *) sp) - poolfile->map; ssp = ((char *) sp) - treefile->map;
} }
long long off = poolfile->off; long long off = poolfile->off;
@@ -445,13 +445,8 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
tsp.right = 0; tsp.right = 0;
tsp.off = off; tsp.off = off;
// alignment long long p = treefile->off;
while (poolfile->off % sizeof(long long) != 0) { if (memfile_write(treefile, &tsp, sizeof(struct stringpool)) < 0) {
memfile_write(poolfile, "", 1);
}
long long p = poolfile->off;
if (memfile_write(poolfile, &tsp, sizeof(struct stringpool)) < 0) {
perror("memfile write"); perror("memfile write");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -459,7 +454,7 @@ long long addpool(struct memfile *poolfile, char *s, char type) {
if (ssp == -1) { if (ssp == -1) {
pooltree = p; pooltree = p;
} else { } else {
*((long long *) (poolfile->map + ssp)) = p; *((long long *) (treefile->map + ssp)) = p;
} }
return off; return off;
} }
@@ -469,11 +464,13 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1]; char metaname[strlen(tmpdir) + strlen("/meta.XXXXXXXX") + 1];
char poolname[strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1]; char poolname[strlen(tmpdir) + strlen("/pool.XXXXXXXX") + 1];
char treename[strlen(tmpdir) + strlen("/tree.XXXXXXXX") + 1];
char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1]; char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1];
char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1]; char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1];
sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX"); sprintf(metaname, "%s%s", tmpdir, "/meta.XXXXXXXX");
sprintf(poolname, "%s%s", tmpdir, "/pool.XXXXXXXX"); sprintf(poolname, "%s%s", tmpdir, "/pool.XXXXXXXX");
sprintf(treename, "%s%s", tmpdir, "/tree.XXXXXXXX");
sprintf(geomname, "%s%s", tmpdir, "/geom.XXXXXXXX"); sprintf(geomname, "%s%s", tmpdir, "/geom.XXXXXXXX");
sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX"); sprintf(indexname, "%s%s", tmpdir, "/index.XXXXXXXX");
@@ -487,6 +484,11 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
perror(poolname); perror(poolname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int treefd = mkstemp(treename);
if (treefd < 0) {
perror(treename);
exit(EXIT_FAILURE);
}
int geomfd = mkstemp(geomname); int geomfd = mkstemp(geomname);
if (geomfd < 0) { if (geomfd < 0) {
perror(geomname); perror(geomname);
@@ -508,6 +510,11 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
perror(poolname); perror(poolname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
struct memfile *treefile = memfile_open(treefd);
if (treefile == NULL) {
perror(treename);
exit(EXIT_FAILURE);
}
FILE *geomfile = fopen(geomname, "wb"); FILE *geomfile = fopen(geomname, "wb");
if (geomfile == NULL) { if (geomfile == NULL) {
perror(geomname); perror(geomname);
@@ -524,11 +531,15 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
unlink(metaname); unlink(metaname);
unlink(poolname); unlink(poolname);
unlink(treename);
unlink(geomname); unlink(geomname);
unlink(indexname); unlink(indexname);
// To distinguish a null value // To distinguish a null value
memfile_write(poolfile, "", 1); {
struct stringpool p;
memfile_write(treefile, &p, sizeof(struct stringpool));
}
unsigned file_bbox[] = {UINT_MAX, UINT_MAX, 0, 0}; unsigned file_bbox[] = {UINT_MAX, UINT_MAX, 0, 0};
unsigned midx = 0, midy = 0; unsigned midx = 0, midy = 0;
@@ -690,8 +701,8 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
serialize_int(metafile, m, &metapos, fname); serialize_int(metafile, m, &metapos, fname);
for (i = 0; i < m; i++) { for (i = 0; i < m; i++) {
serialize_long_long(metafile, addpool(poolfile, metakey[i], VT_STRING), &metapos, fname); serialize_long_long(metafile, addpool(poolfile, treefile, metakey[i], VT_STRING), &metapos, fname);
serialize_long_long(metafile, addpool(poolfile, metaval[i], metatype[i]), &metapos, fname); serialize_long_long(metafile, addpool(poolfile, treefile, metaval[i], metatype[i]), &metapos, fname);
} }
long long geomstart = geompos; long long geomstart = geompos;
@@ -768,6 +779,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max
fclose(metafile); fclose(metafile);
fclose(geomfile); fclose(geomfile);
fclose(indexfile); fclose(indexfile);
memfile_close(treefile);
struct stat geomst; struct stat geomst;
struct stat metast; struct stat metast;