diff options
author | Jan Wieck <JanWieck@Yahoo.com> | 2000-07-03 23:10:14 +0000 |
---|---|---|
committer | Jan Wieck <JanWieck@Yahoo.com> | 2000-07-03 23:10:14 +0000 |
commit | 57d8080a40f51e1ff9eedea602e96e2612161d77 (patch) | |
tree | 6dbed1f7333436cb08af6e7c0d9c55ac5e064750 /src/backend/utils/adt/lztext.c | |
parent | ef5bea51e17d36ab06e7e67847a8b1e489d6d189 (diff) | |
download | postgresql-57d8080a40f51e1ff9eedea602e96e2612161d77.tar.gz postgresql-57d8080a40f51e1ff9eedea602e96e2612161d77.zip |
TOAST
WARNING: This is actually broken - we have self-deadlocks
due to concurrent changes in buffer management.
Vadim and me are working on it.
Jan
Diffstat (limited to 'src/backend/utils/adt/lztext.c')
-rw-r--r-- | src/backend/utils/adt/lztext.c | 188 |
1 files changed, 60 insertions, 128 deletions
diff --git a/src/backend/utils/adt/lztext.c b/src/backend/utils/adt/lztext.c index 4442d00351f..412445e727f 100644 --- a/src/backend/utils/adt/lztext.c +++ b/src/backend/utils/adt/lztext.c @@ -1,7 +1,7 @@ /* ---------- * lztext.c - * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.7 2000/05/30 00:49:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.8 2000/07/03 23:09:52 wieck Exp $ * * Text type with internal LZ compressed representation. Uses the * standard PostgreSQL compression method. @@ -34,8 +34,6 @@ lztextin(char *str) { lztext *result; int32 rawsize; - lztext *tmp; - int tmp_size; /* ---------- * Handle NULL @@ -44,35 +42,11 @@ lztextin(char *str) if (str == NULL) return NULL; - /* ---------- - * Determine input size and maximum output Datum size - * ---------- - */ rawsize = strlen(str); - tmp_size = PGLZ_MAX_OUTPUT(rawsize); - - /* ---------- - * Allocate a temporary result and compress into it - * ---------- - */ - tmp = (lztext *) palloc(tmp_size); - pglz_compress(str, rawsize, tmp, NULL); + result = (lztext *)palloc(VARHDRSZ + rawsize); - /* ---------- - * 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 || - tmp_size - tmp->varsize < tmp_size / 4) - result = tmp; - else - { - result = (lztext *) palloc(tmp->varsize); - memcpy(result, tmp, tmp->varsize); - pfree(tmp); - } + VARATT_SIZEP(result) = VARHDRSZ + rawsize; + memcpy(VARATT_DATA(result), str, rawsize); return result; } @@ -88,6 +62,8 @@ char * lztextout(lztext *lz) { char *result; + void *tmp; + int32 rawsize; /* ---------- * Handle NULL @@ -101,25 +77,15 @@ lztextout(lztext *lz) return result; } - /* ---------- - * Allocate the result string - the required size is remembered - * in the lztext header so we don't need a temporary buffer or - * have to diddle with realloc's. - * ---------- - */ - result = (char *) palloc(PGLZ_RAW_SIZE(lz) + 1); + VARATT_GETPLAIN(lz, tmp); - /* ---------- - * Decompress and add terminating ZERO - * ---------- - */ - pglz_decompress(lz, result); - result[lz->rawsize] = '\0'; + rawsize = VARATT_SIZE(tmp) - VARHDRSZ; + result = (char *)palloc(rawsize + 1); + memcpy(result, VARATT_DATA(tmp), rawsize); + result[rawsize] = '\0'; + + VARATT_FREE(lz, tmp); - /* ---------- - * Return the result - * ---------- - */ return result; } @@ -167,7 +133,13 @@ lztextlen(lztext *lz) * without multibyte support, it's the remembered rawsize * ---------- */ - return PGLZ_RAW_SIZE(lz); + if (!VARATT_IS_EXTENDED(lz)) + return VARATT_SIZE(lz) - VARHDRSZ; + + if (VARATT_IS_EXTERNAL(lz)) + return lz->va_content.va_external.va_rawsize; + + return lz->va_content.va_compressed.va_rawsize; #endif } @@ -189,11 +161,10 @@ lztextoctetlen(lztext *lz) if (lz == NULL) return 0; - /* ---------- - * Return the varsize minus the VARSIZE field itself. - * ---------- - */ - return VARSIZE(lz) - VARHDRSZ; + if (!VARATT_IS_EXTERNAL(lz)) + return VARATT_SIZE(lz) - VARHDRSZ; + + return lz->va_content.va_external.va_extsize; } @@ -208,9 +179,6 @@ text_lztext(text *txt) { lztext *result; int32 rawsize; - lztext *tmp; - int tmp_size; - char *str; /* ---------- * Handle NULL @@ -220,35 +188,13 @@ text_lztext(text *txt) return NULL; /* ---------- - * Determine input size and eventually tuple size + * Copy the entire attribute * ---------- */ rawsize = VARSIZE(txt) - VARHDRSZ; - str = VARDATA(txt); - tmp_size = PGLZ_MAX_OUTPUT(rawsize); - - /* ---------- - * Allocate a temporary result and compress into it - * ---------- - */ - tmp = (lztext *) palloc(tmp_size); - pglz_compress(str, rawsize, tmp, NULL); - - /* ---------- - * 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 || - tmp_size - tmp->varsize < tmp_size / 4) - result = tmp; - else - { - result = (lztext *) palloc(tmp->varsize); - memcpy(result, tmp, tmp->varsize); - pfree(tmp); - } + result = (lztext *)palloc(rawsize + VARHDRSZ); + VARATT_SIZEP(result) = rawsize + VARHDRSZ; + memcpy(VARATT_DATA(result), VARATT_DATA(txt), rawsize); return result; } @@ -264,6 +210,8 @@ text * lztext_text(lztext *lz) { text *result; + lztext *tmp; + int32 rawsize; /* ---------- * Handle NULL @@ -272,19 +220,14 @@ lztext_text(lztext *lz) if (lz == NULL) return NULL; - /* ---------- - * Allocate and initialize the text result - * ---------- - */ - result = (text *) palloc(PGLZ_RAW_SIZE(lz) + VARHDRSZ + 1); - VARSIZE(result) = lz->rawsize + VARHDRSZ; + VARATT_GETPLAIN(lz, tmp); + + rawsize = VARATT_SIZE(tmp) - VARHDRSZ; + result = (text *)palloc(rawsize + VARHDRSZ); + VARATT_SIZEP(result) = rawsize + VARHDRSZ; + memcpy(VARATT_DATA(result), VARATT_DATA(tmp), rawsize); - /* ---------- - * Decompress directly into the text data area. - * ---------- - */ - VARDATA(result)[lz->rawsize] = 0; - pglz_decompress(lz, VARDATA(result)); + VARATT_FREE(lz, tmp); return result; } @@ -322,43 +265,32 @@ lztext_cmp(lztext *lz1, lztext *lz2) #else /* !USE_LOCALE */ - PGLZ_DecompState ds1; - PGLZ_DecompState ds2; - int c1; - int c2; - int32 result = (int32) 0; + int result; + char *p1 = NULL; + char *p2 = NULL; + int size1; + int size2; if (lz1 == NULL || lz2 == NULL) - return (int32) 0; - - pglz_decomp_init(&ds1, lz1); - pglz_decomp_init(&ds2, lz2); - - for (;;) - { - c1 = pglz_decomp_getchar(&ds1); - c2 = pglz_decomp_getchar(&ds2); - - if (c1 == EOF) - { - if (c2 != EOF) - result = (int32) -1; - break; - } - else - { - if (c2 == EOF) - result = (int32) 1; - } - if (c1 != c2) - { - result = (int32) (c1 - c2); - break; - } - } + return 0; - pglz_decomp_end(&ds1); - pglz_decomp_end(&ds2); + VARATT_GETPLAIN(lz1, p1); + VARATT_GETPLAIN(lz2, p2); + + size1 = VARATT_SIZE(p1) - VARHDRSZ; + size2 = VARATT_SIZE(p2) - VARHDRSZ; + result = memcmp(VARATT_DATA(p1), VARATT_DATA(p2), + (size1 < size2) ? size1 : size2); + if (result == 0) + { + if (size1 > size2) + result = 1; + else if (size1 < size2) + result = -1; + } + + VARATT_FREE(lz2, p2); + VARATT_FREE(lz1, p1); return result; |