⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pg_backup_null.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
字号:
/*------------------------------------------------------------------------- * * pg_backup_null.c * *	Implementation of an archive that is never saved; it is used by *	pg_dump to output a plain text SQL script instead of saving *	a real archive. * *	See the headers to pg_restore for more details. * * Copyright (c) 2000, Philip Warner *		Rights are granted to use this software in any way so long *		as this notice is not removed. * *	The author is not responsible for loss or damages that may *	result from it's use. * * * IDENTIFICATION *		$PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_null.c,v 1.16 2005/10/15 02:49:38 momjian Exp $ * *------------------------------------------------------------------------- */#include "pg_backup.h"#include "pg_backup_archiver.h"#include <unistd.h>				/* for dup */#include "libpq/libpq-fs.h"static size_t _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);static size_t _WriteBlobData(ArchiveHandle *AH, const void *data, size_t dLen);static void _EndData(ArchiveHandle *AH, TocEntry *te);static int	_WriteByte(ArchiveHandle *AH, const int i);static size_t _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);static void _CloseArchive(ArchiveHandle *AH);static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt);static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);/* *	Initializer */voidInitArchiveFmt_Null(ArchiveHandle *AH){	/* Assuming static functions, this can be copied for each format. */	AH->WriteDataPtr = _WriteData;	AH->EndDataPtr = _EndData;	AH->WriteBytePtr = _WriteByte;	AH->WriteBufPtr = _WriteBuf;	AH->ClosePtr = _CloseArchive;	AH->PrintTocDataPtr = _PrintTocData;	AH->StartBlobsPtr = _StartBlobs;	AH->StartBlobPtr = _StartBlob;	AH->EndBlobPtr = _EndBlob;	AH->EndBlobsPtr = _EndBlobs;	/* Initialize LO buffering */	AH->lo_buf_size = LOBBUFSIZE;	AH->lo_buf = (void *) malloc(LOBBUFSIZE);	if (AH->lo_buf == NULL)		die_horribly(AH, NULL, "out of memory\n");	/*	 * Now prevent reading...	 */	if (AH->mode == archModeRead)		die_horribly(AH, NULL, "this format cannot be read\n");}/* * - Start a new TOC entry *//* * Called by dumper via archiver from within a data dump routine */static size_t_WriteData(ArchiveHandle *AH, const void *data, size_t dLen){	/* Just send it to output */	ahwrite(data, 1, dLen, AH);	return dLen;}/* * Called by dumper via archiver from within a data dump routine * We substitute this for _WriteData while emitting a BLOB */static size_t_WriteBlobData(ArchiveHandle *AH, const void *data, size_t dLen){	if (dLen > 0)	{		unsigned char *str;		size_t		len;		str = PQescapeBytea((const unsigned char *) data, dLen, &len);		if (!str)			die_horribly(AH, NULL, "out of memory\n");		ahprintf(AH, "SELECT lowrite(0, '%s');\n", str);		free(str);	}	return dLen;}static void_EndData(ArchiveHandle *AH, TocEntry *te){	ahprintf(AH, "\n\n");}/* * Called by the archiver when starting to save all BLOB DATA (not schema). * This routine should save whatever format-specific information is needed * to read the BLOBs back into memory. * * It is called just prior to the dumper's DataDumper routine. * * Optional, but strongly recommended. */static void_StartBlobs(ArchiveHandle *AH, TocEntry *te){	ahprintf(AH, "BEGIN;\n\n");}/* * Called by the archiver when the dumper calls StartBlob. * * Mandatory. * * Must save the passed OID for retrieval at restore-time. */static void_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid){	if (oid == 0)		die_horribly(AH, NULL, "invalid OID for large object\n");	ahprintf(AH, "SELECT lo_open(lo_create(%u), %d);\n", oid, INV_WRITE);	AH->WriteDataPtr = _WriteBlobData;}/* * Called by the archiver when the dumper calls EndBlob. * * Optional. */static void_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid){	AH->WriteDataPtr = _WriteData;	ahprintf(AH, "SELECT lo_close(0);\n\n");}/* * Called by the archiver when finishing saving all BLOB DATA. * * Optional. */static void_EndBlobs(ArchiveHandle *AH, TocEntry *te){	ahprintf(AH, "COMMIT;\n\n");}/*------ * Called as part of a RestoreArchive call; for the NULL archive, this * just sends the data for a given TOC entry to the output. *------ */static void_PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt){	if (te->dataDumper)	{		AH->currToc = te;		if (strcmp(te->desc, "BLOBS") == 0)			_StartBlobs(AH, te);		(*te->dataDumper) ((Archive *) AH, te->dataDumperArg);		if (strcmp(te->desc, "BLOBS") == 0)			_EndBlobs(AH, te);		AH->currToc = NULL;	}}static int_WriteByte(ArchiveHandle *AH, const int i){	/* Don't do anything */	return 0;}static size_t_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len){	/* Don't do anything */	return len;}static void_CloseArchive(ArchiveHandle *AH){	/* Nothing to do */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -