Am Donnerstag, 11. April 2002 17:44 schrieb Tom Lane: > "Mario Weilguni" <[EMAIL PROTECTED]> writes: > > And I did not find out how I can detect the large object > > chunksize, either from getting it from the headers (include > > "storage/large_object.h" did not work) >
You did not answer if it's ok to post the patch, hope it's ok: ================================== diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_archiver.c postgresql-7.2.1/src/bin/pg_dump/pg_backup_archiver.c --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_archiver.c Mon Feb 11 01:18:20 2002 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_archiver.c Thu Apr 11 10:41:09 2002 @@ -819,6 +819,9 @@ AH->createdBlobXref = 1; } + /* Initialize the LO Buffer */ + AH->lo_buf_used = 0; + /* * Start long-running TXs if necessary */ @@ -848,6 +851,19 @@ void EndRestoreBlob(ArchiveHandle *AH, Oid oid) { + if(AH->lo_buf_used > 0) { + /* Write remaining bytes from the LO buffer */ + int res; + res = lo_write(AH->connection, AH->loFd, (void *) AH->lo_buf, AH->lo_buf_used); + + ahlog(AH, 5, "wrote remaining %d bytes of large object data (result = %d)\n", + (int)AH->lo_buf_used, res); + if (res != AH->lo_buf_used) + die_horribly(AH, modulename, "could not write to large object (result: +%d, expected: %d)\n", + res, AH->lo_buf_used); + AH->lo_buf_used = 0; + } + lo_close(AH->connection, AH->loFd); AH->writingBlob = 0; @@ -1228,14 +1244,27 @@ if (AH->writingBlob) { - res = lo_write(AH->connection, AH->loFd, (void *) ptr, size * nmemb); - ahlog(AH, 5, "wrote %d bytes of large object data (result = %d)\n", - (int) (size * nmemb), res); - if (res != size * nmemb) + if(AH->lo_buf_used + size * nmemb > AH->lo_buf_size) { + /* Split LO buffer */ + int remaining = AH->lo_buf_size - AH->lo_buf_used; + int slack = nmemb * size - remaining; + + memcpy(AH->lo_buf + AH->lo_buf_used, ptr, remaining); + res = lo_write(AH->connection, AH->loFd, AH->lo_buf, +AH->lo_buf_size); + ahlog(AH, 5, "wrote %d bytes of large object data (result = %d)\n", + AH->lo_buf_size, res); + if (res != AH->lo_buf_size) die_horribly(AH, modulename, "could not write to large object (result: %d, expected: %d)\n", - res, (int) (size * nmemb)); + res, AH->lo_buf_size); + memcpy(AH->lo_buf, ptr + remaining, slack); + AH->lo_buf_used = slack; + } else { + /* LO Buffer is still large enough, buffer it */ + memcpy(AH->lo_buf + AH->lo_buf_used, ptr, size * nmemb); + AH->lo_buf_used += size * nmemb; + } - return res; + return size * nmemb; } else if (AH->gzOut) { diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_archiver.h postgresql-7.2.1/src/bin/pg_dump/pg_backup_archiver.h --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_archiver.h Mon Nov 5 18:46:30 2001 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_archiver.h Thu Apr 11 10:41:14 2002 @@ -41,6 +41,7 @@ #include <errno.h> #include "pqexpbuffer.h" +#define LOBBUFSIZE 32768 #ifdef HAVE_LIBZ #include <zlib.h> @@ -240,6 +241,9 @@ RestoreOptions *ropt; /* Used to check restore options in * ahwrite etc */ + void *lo_buf; + int lo_buf_used; + int lo_buf_size; } ArchiveHandle; typedef struct _tocEntry diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_custom.c postgresql-7.2.1/src/bin/pg_dump/pg_backup_custom.c --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_custom.c Wed Nov 28 00:48:12 2001 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_custom.c Thu Apr 11 10:42:45 2002 @@ -153,6 +153,12 @@ if (ctx->zp == NULL) die_horribly(AH, modulename, "out of memory\n"); + /* Initialize LO buffering */ + AH->lo_buf_size = LOBBUFSIZE; + AH->lo_buf = (void *)malloc(LOBBUFSIZE); + if(AH->lo_buf == NULL) + die_horribly(AH, modulename, "out of memory\n"); + /* * zlibOutSize is the buffer size we tell zlib it can output to. We * actually allocate one extra byte because some routines want to diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_files.c postgresql-7.2.1/src/bin/pg_dump/pg_backup_files.c --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_files.c Thu Oct 25 07:49:52 2001 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_files.c Thu Apr 11 10:43:01 2002 @@ -113,6 +113,12 @@ AH->formatData = (void *) ctx; ctx->filePos = 0; + /* Initialize LO buffering */ + AH->lo_buf_size = LOBBUFSIZE; + AH->lo_buf = (void *)malloc(LOBBUFSIZE); + if(AH->lo_buf == NULL) + die_horribly(AH, modulename, "out of memory\n"); + /* * Now open the TOC file */ diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_null.c postgresql-7.2.1/src/bin/pg_dump/pg_backup_null.c --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_null.c Wed Jun 27 23:21:37 2001 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_null.c Thu Apr 11 10:44:53 2002 @@ -64,7 +64,6 @@ */ if (AH->mode == archModeRead) die_horribly(AH, NULL, "this format cannot be read\n"); - } /* diff -Nur postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_tar.c postgresql-7.2.1/src/bin/pg_dump/pg_backup_tar.c --- postgresql-7.2.1-orig/src/bin/pg_dump/pg_backup_tar.c Sun Oct 28 07:25:58 2001 +++ postgresql-7.2.1/src/bin/pg_dump/pg_backup_tar.c Thu Apr 11 10:44:08 2002 @@ -157,6 +157,12 @@ ctx = (lclContext *) malloc(sizeof(lclContext)); AH->formatData = (void *) ctx; ctx->filePos = 0; + + /* Initialize LO buffering */ + AH->lo_buf_size = LOBBUFSIZE; + AH->lo_buf = (void *)malloc(LOBBUFSIZE); + if(AH->lo_buf == NULL) + die_horribly(AH, modulename, "out of memory\n"); /* * Now open the TOC file ============================ > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster ---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://archives.postgresql.org