]> granicus.if.org Git - postgresql/commitdiff
Some minor corrections to the LZ compression. In fact I wanted to
authorJan Wieck <JanWieck@Yahoo.com>
Wed, 17 Nov 1999 22:18:46 +0000 (22:18 +0000)
committerJan Wieck <JanWieck@Yahoo.com>
Wed, 17 Nov 1999 22:18:46 +0000 (22:18 +0000)
HAVE the required OID's first.

Jan

src/backend/utils/adt/lztext.c
src/backend/utils/adt/pg_lzcompress.c
src/include/utils/pg_lzcompress.h

index 49c37def91ded5622c4bc9cb273718cdf9dd15a4..a07ddebcf19876754a906b337f80e75b6fa423ff 100644 (file)
@@ -1,10 +1,13 @@
 /* ----------
  * 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.
  * ----------
  */
 
@@ -42,7 +45,7 @@ lztextin(char *str)
                return NULL;
 
        /* ----------
-        * Determine input size and eventually tuple size
+        * Determine input size and maximum output Datum size
         * ----------
         */
        rawsize = strlen(str);
@@ -56,8 +59,9 @@ lztextin(char *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 || 
@@ -141,7 +145,7 @@ lztextlen(lztext *lz)
         * without multibyte support, it's the remembered rawsize
         * ----------
         */
-       return lz->rawsize;
+       return PGLZ_RAW_SIZE(lz);
 }
 
 
@@ -166,7 +170,7 @@ lztextoctetlen(lztext *lz)
         * Return the varsize minus the VARSIZE field itself.
         * ----------
         */
-       return lz->varsize - sizeof(int32);
+       return VARSIZE(lz) - VARHDRSZ;
 }
 
 
@@ -208,8 +212,9 @@ text_lztext(text *txt)
        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 || 
@@ -250,15 +255,15 @@ lztext_text(lztext *lz)
         * 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;
 }
index 88721d30a2dca02ae8b68842728728d8c4a174cd..b3eb5e2a013d2f0d0a5efa3ac5081d2103ff181d 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * 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
@@ -385,6 +385,8 @@ pglz_find_match (PGLZ_HistEntry **hstart, char *input, char *end,
 
 /* ----------
  * pglz_compress -
+ *
+ *             Compresses source into dest using strategy.
  * ----------
  */
 int
@@ -580,6 +582,8 @@ pglz_compress (char *source, int slen, PGLZ_Header *dest, PGLZ_Strategy *strateg
 
 /* ----------
  * pglz_decompress -
+ *
+ *             Decompresses source into dest.
  * ----------
  */
 int
index dba52fa5888c438679a19b5c60768b7dfc661c31..481fd24fab810b707c14803ce9d0e162694b302c 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * 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
  * ----------
@@ -37,9 +37,36 @@ typedef struct PGLZ_Header {
  */
 #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 -