that would do the wrong thing with BLOB OIDs exceeding 2G.
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.47 2002/05/28 22:26:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.48 2002/05/29 01:38:56 tgl Exp $
*
*
ahprintf(AH, "-- Disable triggers\n");
/*
- * Just update the AFFECTED table, if known.
+ * Just update the AFFECTED table, if known. Otherwise update all
+ * non-system tables.
*/
if (te && te->name && strlen(te->name) > 0)
- ahprintf(AH, "UPDATE pg_class SET reltriggers = 0 "
- "WHERE oid = '%s'::regclass;\n\n",
+ ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 "
+ "WHERE oid = '%s'::pg_catalog.regclass;\n\n",
fmtId(te->name, false));
else
- ahprintf(AH, "UPDATE pg_class SET reltriggers = 0 FROM pg_namespace "
+ ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 FROM pg_catalog.pg_namespace "
"WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
/*
ahprintf(AH, "-- Enable triggers\n");
/*
- * Just update the AFFECTED table, if known.
+ * Just update the AFFECTED table, if known. Otherwise update all
+ * non-system tables.
*/
if (te && te->name && strlen(te->name) > 0)
- ahprintf(AH, "UPDATE pg_class SET reltriggers = "
- "(SELECT count(*) FROM pg_trigger where pg_class.oid = tgrelid) "
- "WHERE oid = '%s'::regclass;\n\n",
+ ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = "
+ "(SELECT count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) "
+ "WHERE oid = '%s'::pg_catalog.regclass;\n\n",
fmtId(te->name, false));
else
- ahprintf(AH, "UPDATE pg_class SET reltriggers = "
- "(SELECT count(*) FROM pg_trigger where pg_class.oid = tgrelid) "
- "FROM pg_namespace "
+ ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = "
+ "(SELECT count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) "
+ "FROM pg_catalog.pg_namespace "
"WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n");
/*
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);
+ 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;
- }
+ 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;
for (b = 0; b < AH->intSize; b++)
{
(*AH->WriteBytePtr) (AH, i & 0xFF);
- i = i / 256;
+ i >>= 8;
}
return AH->intSize + 1;
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.18 2002/04/24 02:21:04 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.19 2002/05/29 01:38:56 tgl Exp $
*
*
static void
_LoadBlobs(ArchiveHandle *AH)
{
- int oid;
+ Oid oid;
StartRestoreBlobs(AH);
static void
_skipBlobs(ArchiveHandle *AH)
{
- int oid;
+ Oid oid;
oid = ReadInt(AH);
while (oid != 0)
* Implements the basic DB functions used by the archiver.
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.32 2002/05/10 22:36:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.33 2002/05/29 01:38:56 tgl Exp $
*
*-------------------------------------------------------------------------
*/
appendPQExpBuffer(tblQry,
"SELECT a.attname FROM "
"pg_catalog.pg_attribute a, pg_catalog.pg_type t "
- "WHERE a.attnum > 0 AND a.attrelid = '%s'::regclass "
+ "WHERE a.attnum > 0 AND a.attrelid = '%s'::pg_catalog.regclass "
"AND a.atttypid = t.oid AND t.typname in ('oid', 'lo')",
tblName->data);
ahlog(AH, 1, "creating table for large object cross-references\n");
- appendPQExpBuffer(qry, "Create Temporary Table %s(oldOid oid, newOid oid);", BLOB_XREF_TABLE);
+ appendPQExpBuffer(qry, "Create Temporary Table %s(oldOid pg_catalog.oid, newOid pg_catalog.oid);", BLOB_XREF_TABLE);
ExecuteSqlCommand(AH, qry, "could not create large object cross-reference table", true);
}
void
-InsertBlobXref(ArchiveHandle *AH, int old, int new)
+InsertBlobXref(ArchiveHandle *AH, Oid old, Oid new)
{
PQExpBuffer qry = createPQExpBuffer();
- appendPQExpBuffer(qry, "Insert Into %s(oldOid, newOid) Values (%d, %d);", BLOB_XREF_TABLE, old, new);
+ appendPQExpBuffer(qry,
+ "Insert Into %s(oldOid, newOid) Values ('%u', '%u');",
+ BLOB_XREF_TABLE, old, new);
ExecuteSqlCommand(AH, qry, "could not create large object cross-reference entry", true);
* Definitions for pg_backup_db.c
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.h,v 1.6 2002/05/10 22:36:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.h,v 1.7 2002/05/29 01:38:56 tgl Exp $
*/
#define BLOB_XREF_TABLE "pg_dump_blob_xref" /* MUST be lower case */
extern int ExecuteSqlCommandBuf(ArchiveHandle *AH, void *qry, int bufLen);
extern void CreateBlobXrefTable(ArchiveHandle *AH);
-extern void InsertBlobXref(ArchiveHandle *AH, int old, int new);
+extern void InsertBlobXref(ArchiveHandle *AH, Oid old, Oid new);
extern void StartTransaction(ArchiveHandle *AH);
extern void StartTransactionXref(ArchiveHandle *AH);
extern void CommitTransaction(ArchiveHandle *AH);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.15 2002/04/24 02:21:04 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.16 2002/05/29 01:38:56 tgl Exp $
*
*
static char *modulename = gettext_noop("file archiver");
static void _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt);
-static void _getBlobTocEntry(ArchiveHandle *AH, int *oid, char *fname);
+static void _getBlobTocEntry(ArchiveHandle *AH, Oid *oid, char *fname);
/*
* Initializer
}
static void
-_getBlobTocEntry(ArchiveHandle *AH, int *oid, char fname[K_STD_BUF_SIZE])
+_getBlobTocEntry(ArchiveHandle *AH, Oid *oid, char fname[K_STD_BUF_SIZE])
{
lclContext *ctx = (lclContext *) AH->formatData;
char blobTe[K_STD_BUF_SIZE];
if (fgets(&blobTe[0], K_STD_BUF_SIZE - 1, ctx->blobToc) != NULL)
{
- *oid = atoi(blobTe);
+ *oid = atooid(blobTe);
fpos = strcspn(blobTe, " ");
static void
_LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
{
- int oid;
+ Oid oid;
lclContext *ctx = (lclContext *) AH->formatData;
char fname[K_STD_BUF_SIZE];
sfx = "";
sprintf(fmode, "wb%d", AH->compression);
- sprintf(fname, "blob_%d.dat%s", oid, sfx);
+ sprintf(fname, "blob_%u.dat%s", oid, sfx);
- fprintf(ctx->blobToc, "%d %s\n", oid, fname);
+ fprintf(ctx->blobToc, "%u %s\n", oid, fname);
#ifdef HAVE_LIBZ
tctx->FH = gzopen(fname, fmode);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.22 2002/05/10 22:36:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.23 2002/05/29 01:38:56 tgl Exp $
*
*
_PrintFileData(AH, tctx->filename, ropt);
}
-/* static void _getBlobTocEntry(ArchiveHandle* AH, int *oid, char fname[K_STD_BUF_SIZE])
- * {
- * lclContext* ctx = (lclContext*)AH->formatData;
- * char blobTe[K_STD_BUF_SIZE];
- * int fpos;
- * int eos;
- *
- * if (tarGets(&blobTe[0], K_STD_BUF_SIZE - 1, ctx->blobToc) != NULL)
- * {
- * *oid = atoi(blobTe);
- *
- * fpos = strcspn(blobTe, " ");
- *
- * strncpy(fname, &blobTe[fpos+1], K_STD_BUF_SIZE - 1);
- *
- * eos = strlen(fname)-1;
- *
- * if (fname[eos] == '\n')
- * fname[eos] = '\0';
- *
- * } else {
- *
- * *oid = 0;
- * fname[0] = '\0';
- * }
- *}
- */
-
static void
_LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt)
{
{
ctx->FH = th;
- oid = (Oid) strtoul(&th->targetFile[5], NULL, 10);
-
- if (strncmp(th->targetFile, "blob_", 5) == 0 && oid != 0)
+ if (strncmp(th->targetFile, "blob_", 5) == 0)
{
- ahlog(AH, 1, "restoring large object OID %u\n", oid);
+ oid = atooid(&th->targetFile[5]);
+ if (oid != 0)
+ {
+ ahlog(AH, 1, "restoring large object OID %u\n", oid);
- StartRestoreBlob(AH, oid);
+ StartRestoreBlob(AH, oid);
- while ((cnt = tarRead(buf, 4095, th)) > 0)
- {
- buf[cnt] = '\0';
- ahwrite(buf, 1, cnt, AH);
+ while ((cnt = tarRead(buf, 4095, th)) > 0)
+ {
+ buf[cnt] = '\0';
+ ahwrite(buf, 1, cnt, AH);
+ }
+ EndRestoreBlob(AH, oid);
}
- EndRestoreBlob(AH, oid);
}
tarClose(AH, th);
else
sfx = "";
- sprintf(fname, "blob_%d.dat%s", oid, sfx);
+ sprintf(fname, "blob_%u.dat%s", oid, sfx);
- tarPrintf(AH, ctx->blobToc, "%d %s\n", oid, fname);
+ tarPrintf(AH, ctx->blobToc, "%u %s\n", oid, fname);
tctx->TH = tarOpen(AH, fname, 'w');