diff --git a/lib/Makefile b/lib/Makefile index 41b56f36..9fd2c3a5 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -2,7 +2,7 @@ include ../config.mk CPPFLAGS = $(XML2_CPPFLAGS) $(ZLIB_CPPFLAGS) $(LAZPERF_CPPFLAGS) -LDFLAGS = $(XML2_LDFLAGS) $(ZLIB_LDFLAGS) +LDFLAGS = $(XML2_LDFLAGS) $(ZLIB_LDFLAGS) -llz4 CFLAGS += -fPIC OBJS = \ diff --git a/lib/pc_api_internal.h b/lib/pc_api_internal.h index 9be1b8fc..47382e78 100644 --- a/lib/pc_api_internal.h +++ b/lib/pc_api_internal.h @@ -66,7 +66,8 @@ enum DIMCOMPRESSIONS PC_DIM_NONE = 0, PC_DIM_RLE = 1, PC_DIM_SIGBITS = 2, - PC_DIM_ZLIB = 3 + PC_DIM_ZLIB = 3, + PC_DIM_LZ4 = 4 }; /* PCDOUBLESTAT are members of PCDOUBLESTATS */ @@ -256,6 +257,8 @@ PCBYTES pc_bytes_sigbits_encode(const PCBYTES pcb); PCBYTES pc_bytes_sigbits_decode(const PCBYTES pcb); /** Compress bytes using zlib */ PCBYTES pc_bytes_zlib_encode(const PCBYTES pcb); +PCBYTES pc_bytes_lz4_encode(const PCBYTES pcb); +PCBYTES pc_bytes_lz4_decode(const PCBYTES pcb); /** De-compress bytes using zlib */ PCBYTES pc_bytes_zlib_decode(const PCBYTES pcb); diff --git a/lib/pc_bytes.c b/lib/pc_bytes.c index c4d94af3..349060e3 100644 --- a/lib/pc_bytes.c +++ b/lib/pc_bytes.c @@ -24,6 +24,8 @@ #include #include +#include + void pc_bytes_free(PCBYTES pcb) { if (!pcb.readonly) @@ -81,6 +83,11 @@ pc_bytes_encode(PCBYTES pcb, int compression) epcb = pc_bytes_zlib_encode(pcb); break; } + case PC_DIM_LZ4: + { + epcb = pc_bytes_lz4_encode(pcb); + break; + } case PC_DIM_NONE: { epcb = pc_bytes_clone(pcb); @@ -115,6 +122,11 @@ pc_bytes_decode(PCBYTES epcb) pcb = pc_bytes_zlib_decode(epcb); break; } + case PC_DIM_LZ4: + { + pcb = pc_bytes_lz4_decode(epcb); + break; + } case PC_DIM_NONE: { pcb = pc_bytes_clone(epcb); @@ -1212,6 +1224,61 @@ static voidpf pc_zlib_alloc(voidpf opaque, uInt nitems, uInt sz) static void pc_zlib_free(voidpf opaque, voidpf ptr) { pcfree(ptr); } +PCBYTES +pc_bytes_lz4_encode(const PCBYTES pcb) +{ + PCBYTES pcbout = pcb; + const int max_dst_size = LZ4_compressBound(pcb.size); + + char* compressed_data = (char*)malloc((size_t)max_dst_size); + const int compressed_data_size = LZ4_compress_default(pcb.bytes, compressed_data, pcb.size, max_dst_size); + + compressed_data = (char *)realloc(compressed_data, (size_t)compressed_data_size); + if (compressed_data == NULL) + printf("ERROR LZ4!!!!!\n"); + + // char* const regen_buffer = (char*)malloc(pcb.size); + // const int decompressed_size = LZ4_decompress_safe(compressed_data, regen_buffer, compressed_data_size, pcb.size); + + pcbout.size = compressed_data_size; + pcbout.bytes = pcalloc(pcbout.size); + pcbout.readonly = PC_FALSE; + pcbout.compression = PC_DIM_LZ4; + memcpy(pcbout.bytes, compressed_data, pcbout.size); + // pcfree(buf); + + // if (memcmp(pcb.bytes, regen_buffer, pcb.size) != 0) + // printf("Error IN LZ4 decompress\n"); + // else + // printf("DECOMPRESS SUCCESS\n"); + + // for(int i = 0; itotal_patches * 2 * dim->size + pds->total_points * avg_uniquebits_per_patch / 8; /* Default to ZLib */ - pds->stats[i].recommended_compression = PC_DIM_ZLIB; + pds->stats[i].recommended_compression = PC_DIM_LZ4; /* Only use rle and sigbits compression on integer values */ /* If we can do better than 4:1 we might beat zlib */ if (dim->interpretation != PC_DOUBLE) diff --git a/pgsql/pc_access.c b/pgsql/pc_access.c index 533261f0..1b6fa0b3 100644 --- a/pgsql/pc_access.c +++ b/pgsql/pc_access.c @@ -88,8 +88,9 @@ Datum pcpoint_get_value(PG_FUNCTION_ARGS) } pfree(dim_str); pc_point_free(pt); - PG_RETURN_DATUM( - DirectFunctionCall1(float8_numeric, Float8GetDatum(double_result))); + // PG_RETURN_DATUM( + // DirectFunctionCall1(float8_numeric, Float8GetDatum(double_result))); + PG_RETURN_FLOAT8(double_result); } /** @@ -857,6 +858,9 @@ Datum pcpatch_summary(PG_FUNCTION_ARGS) bytes = ((PCPATCH_DIMENSIONAL *)patch)->bytes[i]; switch (bytes.compression) { + case PC_DIM_LZ4: + appendStringInfoString(&strdata, ",\"compr\":\"lz4\""); + break; case PC_DIM_RLE: appendStringInfoString(&strdata, ",\"compr\":\"rle\""); break; diff --git a/pgsql/pointcloud.sql.in b/pgsql/pointcloud.sql.in index a15343c1..11e52e05 100644 --- a/pgsql/pointcloud.sql.in +++ b/pgsql/pointcloud.sql.in @@ -199,7 +199,8 @@ CREATE TYPE pcpoint ( ); CREATE OR REPLACE FUNCTION PC_Get(pt pcpoint, dimname text) - RETURNS numeric AS 'MODULE_PATHNAME', 'pcpoint_get_value' + RETURNS float8 AS 'MODULE_PATHNAME', 'pcpoint_get_value' + -- RETURNS numeric AS 'MODULE_PATHNAME', 'pcpoint_get_value' LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL; -- Availability: 1.1.0