1 /**********************************************************************
2  *
3  * PostGIS - Spatial Types for PostgreSQL
4  * http://postgis.net
5  *
6  * PostGIS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * PostGIS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with PostGIS.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  **********************************************************************
20  *
21  * Copyright (C) 2016-2017 Björn Harrtell <bjorn@wololo.org>
22  *
23  **********************************************************************/
24 
25 #ifndef MVT_H_
26 #define MVT_H_ 1
27 
28 #include <stdlib.h>
29 #include "postgres.h"
30 #include "utils/builtins.h"
31 #include "utils/array.h"
32 #include "utils/typcache.h"
33 #include "utils/lsyscache.h"
34 #include "catalog/pg_type.h"
35 #include "catalog/namespace.h"
36 #include "executor/executor.h"
37 #include "access/htup_details.h"
38 #include "access/htup.h"
39 #include "../postgis_config.h"
40 #include "liblwgeom.h"
41 #include "liblwgeom_internal.h"
42 #include "lwgeom_pg.h"
43 #include "lwgeom_log.h"
44 
45 #ifdef HAVE_LIBPROTOBUF
46 
47 #include "vector_tile.pb-c.h"
48 
49 typedef struct mvt_column_cache
50 {
51     uint32_t *column_keys_index;
52     uint32_t *column_oid;
53     Datum *values;
54     bool *nulls;
55     TupleDesc tupdesc;
56 } mvt_column_cache;
57 
58 typedef struct mvt_agg_context
59 {
60 	char *name;
61 	uint32_t extent;
62 	char *geom_name;
63 	uint32_t geom_index;
64 	HeapTupleHeader row;
65 	VectorTile__Tile__Feature *feature;
66 	VectorTile__Tile__Layer *layer;
67 	VectorTile__Tile *tile;
68 	size_t features_capacity;
69 	struct mvt_kv_key *keys_hash;
70 	struct mvt_kv_string_value *string_values_hash;
71 	struct mvt_kv_float_value *float_values_hash;
72 	struct mvt_kv_double_value *double_values_hash;
73 	struct mvt_kv_uint_value *uint_values_hash;
74 	struct mvt_kv_sint_value *sint_values_hash;
75 	struct mvt_kv_bool_value *bool_values_hash;
76 	uint32_t values_hash_i;
77 	uint32_t keys_hash_i;
78 	uint32_t row_columns;
79 	mvt_column_cache column_cache;
80 } mvt_agg_context;
81 
82 /* Prototypes */
83 LWGEOM *mvt_geom(LWGEOM *geom, const GBOX *bounds, uint32_t extent, uint32_t buffer, bool clip_geom);
84 void mvt_agg_init_context(mvt_agg_context *ctx);
85 void mvt_agg_transfn(mvt_agg_context *ctx);
86 bytea *mvt_agg_finalfn(mvt_agg_context *ctx);
87 bytea *mvt_ctx_serialize(mvt_agg_context *ctx);
88 mvt_agg_context * mvt_ctx_deserialize(const bytea *ba);
89 mvt_agg_context * mvt_ctx_combine(mvt_agg_context *ctx1, mvt_agg_context *ctx2);
90 
91 
92 #endif  /* HAVE_LIBPROTOBUF */
93 
94 #endif
95