/* ----------
* lztext.c -
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.1 1999/11/17 21:21:50 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.2 1999/11/17 22:18:45 wieck Exp $
*
* Text type with internal LZ compressed representation. Uses the
* standard PostgreSQL compression method.
+ *
+ * This code requires that the LZ compressor found in pg_lzcompress
+ * codes a usable VARSIZE word at the beginning of the output buffer.
* ----------
*/
return NULL;
/* ----------
- * Determine input size and eventually tuple size
+ * Determine input size and maximum output Datum size
* ----------
*/
rawsize = strlen(str);
pglz_compress(str, rawsize, tmp, NULL);
/* ----------
- * If we miss less than x% bytes at the end of the temp value,
- * so be it. Therefore we save a memcpy().
+ * If we miss less than 25% bytes at the end of the temp value,
+ * so be it. Therefore we save a palloc()/memcpy()/pfree()
+ * sequence.
* ----------
*/
if (tmp_size - tmp->varsize < 256 ||
* without multibyte support, it's the remembered rawsize
* ----------
*/
- return lz->rawsize;
+ return PGLZ_RAW_SIZE(lz);
}
* Return the varsize minus the VARSIZE field itself.
* ----------
*/
- return lz->varsize - sizeof(int32);
+ return VARSIZE(lz) - VARHDRSZ;
}
pglz_compress(str, rawsize, tmp, NULL);
/* ----------
- * If we miss less than x% bytes at the end of the temp value,
- * so be it. Therefore we save a memcpy().
+ * If we miss less than 25% bytes at the end of the temp value,
+ * so be it. Therefore we save a palloc()/memcpy()/pfree()
+ * sequence.
* ----------
*/
if (tmp_size - tmp->varsize < 256 ||
* Allocate and initialize the text result
* ----------
*/
- result = (text *) palloc(lz->rawsize + VARHDRSZ + 1);
+ result = (text *) palloc(PGLZ_RAW_SIZE(lz) + VARHDRSZ + 1);
VARSIZE(result) = lz->rawsize + VARHDRSZ;
/* ----------
* Decompress directly into the text data area.
* ----------
*/
- pglz_decompress(lz, VARDATA(result));
VARDATA(result)[lz->rawsize] = 0;
+ pglz_decompress(lz, VARDATA(result));
return result;
}
/* ----------
* pg_lzcompress.c -
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.1 1999/11/17 21:21:50 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.2 1999/11/17 22:18:45 wieck Exp $
*
* This is an implementation of LZ compression for PostgreSQL.
* It uses a simple history table and generates 2-3 byte tags
/* ----------
* pglz_compress -
+ *
+ * Compresses source into dest using strategy.
* ----------
*/
int
/* ----------
* pglz_decompress -
+ *
+ * Decompresses source into dest.
* ----------
*/
int
/* ----------
* pg_lzcompress.h -
*
- * $Header: /cvsroot/pgsql/src/include/utils/pg_lzcompress.h,v 1.1 1999/11/17 21:21:51 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/include/utils/pg_lzcompress.h,v 1.2 1999/11/17 22:18:46 wieck Exp $
*
* Definitions for the builtin LZ compressor
* ----------
*/
#define PGLZ_MAX_OUTPUT(_dlen) ((_dlen) + (((_dlen) | 0x07) >> 3) \
+ sizeof(PGLZ_Header))
+
+/* ----------
+ * PGLZ_RAW_SIZE -
+ *
+ * Macro to determine the uncompressed data size contained
+ * in the entry.
+ * ----------
+ */
#define PGLZ_RAW_SIZE(_lzdata) (_lzdata->rawsize)
+
+/* ----------
+ * PGLZ_IS_COMPRESSED -
+ *
+ * Macro to determine if the data itself is stored as raw
+ * uncompressed data.
+ * ----------
+ */
#define PGLZ_IS_COMPRESSED(_lzdata) (_lzdata->varsize != \
- _lzdata->rawsize + sizeof(PGLZ_Header))
+ _lzdata->rawsize + \
+ sizeof(PGLZ_Header))
+
+/* ----------
+ * PGLZ_RAW_DATA -
+ *
+ * Macro to get access to the plain compressed or uncompressed
+ * data. Useful if PGLZ_IS_COMPRESSED returns false.
+ * ----------
+ */
+#define PGLZ_RAW_DATA(_lzdata) (((char *)(_lzdata)) + \
+ sizeof(PGLZ_Header))
/* ----------
* PGLZ_Strategy -