From 8002609f0c8259910ed10c2a873f4babe0d331bc Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 23 Mar 2015 13:44:35 -0700 Subject: [PATCH] More scaffolding for multiple layers --- geojson.c | 21 +++++++++++++++------ mbtiles.c | 4 ++-- mbtiles.h | 2 +- tile.cc | 6 +++--- tile.h | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/geojson.c b/geojson.c index e17912a7..90e208b5 100644 --- a/geojson.c +++ b/geojson.c @@ -194,7 +194,7 @@ struct pool_val *deserialize_string(char **f, struct pool *p, int type) { return ret; } -int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned *file_bbox, struct pool *file_keys, unsigned *midx, unsigned *midy, const char *layername, int maxzoom, int minzoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, struct json_pull *jp, const char *tmpdir, double gamma) { +int traverse_zooms(int geomfd[4], off_t geom_size[4], char *metabase, unsigned *file_bbox, struct pool **file_keys, unsigned *midx, unsigned *midy, const char *layername, int maxzoom, int minzoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, struct json_pull *jp, const char *tmpdir, double gamma) { int i; for (i = 0; i <= maxzoom; i++) { long long most = 0; @@ -634,8 +634,15 @@ int read_json(FILE *f, const char *fname, const char *layername, int maxzoom, in exit(EXIT_FAILURE); } - struct pool file_keys; - pool_init(&file_keys, 0); + int nlayers = 1; // XXX layers + + struct pool file_keys1[nlayers]; + struct pool *file_keys[nlayers]; + int i; + for (i = 0; i < nlayers; i++) { + pool_init(&file_keys1[i], 0); + file_keys[i] = &file_keys1[i]; + } char trunc[strlen(fname) + 1]; if (layername == NULL) { @@ -843,7 +850,7 @@ int read_json(FILE *f, const char *fname, const char *layername, int maxzoom, in fprintf(stderr, "%lld features, %lld bytes of geometry, %lld bytes of metadata\n", seq, (long long) geomst.st_size, (long long) metast.st_size); - int written = traverse_zooms(fd, size, meta, file_bbox, &file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, jp, tmpdir, gamma); + int written = traverse_zooms(fd, size, meta, file_bbox, file_keys, &midx, &midy, layername, maxzoom, minzoom, outdb, droprate, buffer, fname, jp, tmpdir, gamma); if (maxzoom != written) { fprintf(stderr, "\n\n\n*** NOTE TILES ONLY COMPLETE THROUGH ZOOM %d ***\n\n\n", written); @@ -883,9 +890,11 @@ int read_json(FILE *f, const char *fname, const char *layername, int maxzoom, in midlon = maxlon; } - mbtiles_write_metadata(outdb, fname, layername, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, &file_keys); + mbtiles_write_metadata(outdb, fname, layername, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, midlat, midlon, file_keys); - pool_free_strings(&file_keys); + for (i = 0; i < nlayers; i++) { + pool_free_strings(&file_keys1[i]); + } return ret; } diff --git a/mbtiles.c b/mbtiles.c index 5cdd569b..0936942f 100644 --- a/mbtiles.c +++ b/mbtiles.c @@ -107,7 +107,7 @@ static void aprintf(char **buf, const char *format, ...) { free(tmp); } -void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool *fields) { +void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys) { char *sql, *err; sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('name', %Q);", fname); @@ -179,7 +179,7 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layer aprintf(&buf, "\", \"description\": \"\", \"minzoom\": %d, \"maxzoom\": %d, \"fields\": {", minzoom, maxzoom); struct pool_val *pv; - for (pv = fields->head; pv != NULL; pv = pv->next) { + for (pv = file_keys[0]->head; pv != NULL; pv = pv->next) { // XXX layers aprintf(&buf, "\""); quote(&buf, pv->s); diff --git a/mbtiles.h b/mbtiles.h index 6b479d54..e96ea642 100644 --- a/mbtiles.h +++ b/mbtiles.h @@ -2,6 +2,6 @@ sqlite3 *mbtiles_open(char *dbname, char **argv); void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data, int size); -void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool *fields); +void mbtiles_write_metadata(sqlite3 *outdb, const char *fname, const char *layername, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double midlat, double midlon, struct pool **file_keys); void mbtiles_close(sqlite3 *outdb, char **argv); diff --git a/tile.cc b/tile.cc index 94cc28cb..301b3b3d 100644 --- a/tile.cc +++ b/tile.cc @@ -342,7 +342,7 @@ void evaluate(std::vector &features, char *metabase, struct pool *file pool_free(&keys); } -long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool *file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, json_pull *jp, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma) { +long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool **file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, json_pull *jp, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma) { int line_detail; static bool evaluated = false; double oprogress = 0; @@ -582,7 +582,7 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u c.metasrc = meta; c.coalesced = false; - decode_meta(&meta, &keys[layer], &values[layer], file_keys, &c.meta, NULL); + decode_meta(&meta, &keys[layer], &values[layer], file_keys[layer], &c.meta, NULL); features[layer].push_back(c); } } @@ -658,7 +658,7 @@ long long write_tile(char **geoms, char *metabase, unsigned *file_bbox, int z, u if (line_detail == MIN_DETAIL || !evaluated) { evaluated = true; - evaluate(features[0], metabase, file_keys, layername, line_detail, compressed.size()); // XXX layer + evaluate(features[0], metabase, file_keys[0], layername, line_detail, compressed.size()); // XXX layer } } else { mbtiles_write_tile(outdb, z, tx, ty, compressed.data(), compressed.size()); diff --git a/tile.h b/tile.h index 031bb418..1f7c16f7 100644 --- a/tile.h +++ b/tile.h @@ -26,4 +26,4 @@ void deserialize_uint(char **f, unsigned *n); void deserialize_byte(char **f, signed char *n); struct pool_val *deserialize_string(char **f, struct pool *p, int type); -long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool *file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, struct json_pull *jp, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma); +long long write_tile(char **geom, char *metabase, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int basezoom, struct pool **file_keys, const char *layername, sqlite3 *outdb, double droprate, int buffer, const char *fname, struct json_pull *jp, FILE *geomfile[4], int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma);