DBZ-1144 Do not translate geometry point to point
parent
2a60a18ab1
commit
283e4008af
|
@ -60,12 +60,6 @@
|
||||||
#error Expecting timestamps to be represented as integers, not as floating-point.
|
#error Expecting timestamps to be represented as integers, not as floating-point.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_POSTGIS
|
|
||||||
/* POSTGIS version define so it doesn't redef macros */
|
|
||||||
#define POSTGIS_PGSQL_VERSION 94
|
|
||||||
#include "liblwgeom.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PG_MODULE_MAGIC;
|
PG_MODULE_MAGIC;
|
||||||
|
|
||||||
/* define a time macro to convert TimestampTz into something more sane,
|
/* define a time macro to convert TimestampTz into something more sane,
|
||||||
|
@ -80,10 +74,6 @@ typedef struct {
|
||||||
bool debug_mode;
|
bool debug_mode;
|
||||||
} DecoderData;
|
} DecoderData;
|
||||||
|
|
||||||
/* GLOBALs for PostGIS dynamic OIDs */
|
|
||||||
Oid geometry_oid = InvalidOid;
|
|
||||||
Oid geography_oid = InvalidOid;
|
|
||||||
|
|
||||||
/* these must be available to pg_dlsym() */
|
/* these must be available to pg_dlsym() */
|
||||||
extern void _PG_init(void);
|
extern void _PG_init(void);
|
||||||
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
|
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
|
||||||
|
@ -177,22 +167,6 @@ static void pg_decode_shutdown(LogicalDecodingContext *ctx) {
|
||||||
/* BEGIN callback */
|
/* BEGIN callback */
|
||||||
static void pg_decode_begin_txn(LogicalDecodingContext *ctx,
|
static void pg_decode_begin_txn(LogicalDecodingContext *ctx,
|
||||||
ReorderBufferTXN *txn) {
|
ReorderBufferTXN *txn) {
|
||||||
#ifdef USE_POSTGIS
|
|
||||||
// set PostGIS geometry type id (these are dynamic)
|
|
||||||
// TODO: Figure out how to make sure we get the typid's from postgis extension namespace
|
|
||||||
if (geometry_oid == InvalidOid) {
|
|
||||||
geometry_oid = TypenameGetTypid("geometry");
|
|
||||||
if (geometry_oid != InvalidOid) {
|
|
||||||
elog(DEBUG1, "PostGIS geometry type detected: %u", geometry_oid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (geography_oid == InvalidOid) {
|
|
||||||
geography_oid = TypenameGetTypid("geography");
|
|
||||||
if (geography_oid != InvalidOid) {
|
|
||||||
elog(DEBUG1, "PostGIS geometry type detected: %u", geography_oid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* COMMIT callback */
|
/* COMMIT callback */
|
||||||
|
@ -280,42 +254,6 @@ static void print_row_msg(StringInfo out, Decoderbufs__RowMessage *rmsg) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool geography_point_as_decoderbufs_point(Datum datum,
|
|
||||||
Decoderbufs__Point *p) {
|
|
||||||
#ifdef USE_POSTGIS
|
|
||||||
GSERIALIZED *geom;
|
|
||||||
LWGEOM *lwgeom;
|
|
||||||
LWPOINT *point = NULL;
|
|
||||||
POINT2D p2d;
|
|
||||||
|
|
||||||
geom = (GSERIALIZED *)PG_DETOAST_DATUM(datum);
|
|
||||||
if (gserialized_get_type(geom) != POINTTYPE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
lwgeom = lwgeom_from_gserialized(geom);
|
|
||||||
point = lwgeom_as_lwpoint(lwgeom);
|
|
||||||
if (lwgeom_is_empty(lwgeom)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
getPoint2d_p(point->point, 0, &p2d);
|
|
||||||
|
|
||||||
if (p != NULL) {
|
|
||||||
Decoderbufs__Point dp = DECODERBUFS__POINT__INIT;
|
|
||||||
dp.x = p2d.x;
|
|
||||||
dp.y = p2d.y;
|
|
||||||
memcpy(p, &dp, sizeof(dp));
|
|
||||||
elog(DEBUG1, "Translating geography to point: (x,y) = (%f,%f)", p->x, p->y);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
elog(DEBUG1, "PostGIS support is off, recompile decoderbufs with USE_POSTGIS option!");
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set a datum value based on its OID specified by typid */
|
/* set a datum value based on its OID specified by typid */
|
||||||
static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid,
|
static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid,
|
||||||
Oid typoutput, Datum datum) {
|
Oid typoutput, Datum datum) {
|
||||||
|
@ -435,13 +373,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid,
|
||||||
datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_POINT;
|
datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_POINT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// PostGIS uses dynamic OIDs so we need to check the type again here
|
{
|
||||||
if (typid == geometry_oid || typid == geography_oid) {
|
|
||||||
elog(DEBUG1, "Converting geography point to datum_point");
|
|
||||||
datum_msg->datum_point = palloc(sizeof(Decoderbufs__Point));
|
|
||||||
geography_point_as_decoderbufs_point(datum, datum_msg->datum_point);
|
|
||||||
datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_POINT;
|
|
||||||
} else {
|
|
||||||
int len;
|
int len;
|
||||||
elog(DEBUG1, "Encountered unknown typid: %d, using bytes", typid);
|
elog(DEBUG1, "Encountered unknown typid: %d, using bytes", typid);
|
||||||
output = OidOutputFunctionCall(typoutput, datum);
|
output = OidOutputFunctionCall(typoutput, datum);
|
||||||
|
|
Loading…
Reference in New Issue