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

📄 pl_handler.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/********************************************************************** * pl_handler.c		- Handler for the PL/pgSQL *			  procedural language * * IDENTIFICATION *	  $Header: /usr/local/cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.2 1998/09/01 04:40:25 momjian Exp $ * *	  This software is copyrighted by Jan Wieck - Hamburg. * *	  The author hereby grants permission  to  use,  copy,	modify, *	  distribute,  and	license this software and its documentation *	  for any purpose, provided that existing copyright notices are *	  retained	in	all  copies  and  that	this notice is included *	  verbatim in any distributions. No written agreement, license, *	  or  royalty  fee	is required for any of the authorized uses. *	  Modifications to this software may be  copyrighted  by  their *	  author  and  need  not  follow  the licensing terms described *	  here, provided that the new terms are  clearly  indicated  on *	  the first page of each file where they apply. * *	  IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY *	  PARTY  FOR  DIRECT,	INDIRECT,	SPECIAL,   INCIDENTAL,	 OR *	  CONSEQUENTIAL   DAMAGES  ARISING	OUT  OF  THE  USE  OF  THIS *	  SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN *	  IF  THE  AUTHOR  HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH *	  DAMAGE. * *	  THE  AUTHOR  AND	DISTRIBUTORS  SPECIFICALLY	 DISCLAIM	ANY *	  WARRANTIES,  INCLUDING,  BUT	NOT  LIMITED  TO,  THE	IMPLIED *	  WARRANTIES  OF  MERCHANTABILITY,	FITNESS  FOR  A  PARTICULAR *	  PURPOSE,	AND NON-INFRINGEMENT.  THIS SOFTWARE IS PROVIDED ON *	  AN "AS IS" BASIS, AND THE AUTHOR	AND  DISTRIBUTORS  HAVE  NO *	  OBLIGATION   TO	PROVIDE   MAINTENANCE,	 SUPPORT,  UPDATES, *	  ENHANCEMENTS, OR MODIFICATIONS. * **********************************************************************/#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include "plpgsql.h"#include "pl.tab.h"#include "executor/spi.h"#include "commands/trigger.h"#include "utils/elog.h"#include "utils/builtins.h"#include "fmgr.h"#include "access/heapam.h"#include "utils/syscache.h"#include "catalog/pg_proc.h"#include "catalog/pg_type.h"static PLpgSQL_function *compiled_functions = NULL;Datum plpgsql_call_handler(FmgrInfo *proinfo,					 FmgrValues *proargs, bool *isNull);static Datum plpgsql_func_handler(FmgrInfo *proinfo,					 FmgrValues *proargs, bool *isNull);static HeapTuple plpgsql_trigger_handler(FmgrInfo *proinfo);/* ---------- * plpgsql_call_handler		- This is the only visible function *				  of the PL interpreter. The PostgreSQL *				  function manager and trigger manager *				  call this function for execution of *				  PL/pgSQL procedures. * ---------- */Datumplpgsql_call_handler(FmgrInfo *proinfo,					 FmgrValues *proargs,					 bool *isNull){	Datum		retval;	/* ----------	 * Connect to SPI manager	 * ----------	 */	if (SPI_connect() != SPI_OK_CONNECT)		elog(ERROR, "plpgsql: cannot connect to SPI manager");	/* ----------	 * Determine if called as function or trigger and	 * call appropriate subhandler	 * ----------	 */	if (CurrentTriggerData == NULL)		retval = plpgsql_func_handler(proinfo, proargs, isNull);	else		retval = (Datum) plpgsql_trigger_handler(proinfo);	/* ----------	 * Disconnect from SPI manager	 * ----------	 */	if (SPI_finish() != SPI_OK_FINISH)		elog(ERROR, "plpgsql: SPI_finish() failed");	return retval;}/* ---------- * plpgsql_func_handler()	- Handler for regular function calls * ---------- */static Datumplpgsql_func_handler(FmgrInfo *proinfo,					 FmgrValues *proargs,					 bool *isNull){	PLpgSQL_function *func;	/* ----------	 * Check if we already compiled this function	 * ----------	 */	for (func = compiled_functions; func != NULL; func = func->next)	{		if (proinfo->fn_oid == func->fn_oid)			break;	}	/* ----------	 * If not, do so and add it to the compiled ones	 * ----------	 */	if (func == NULL)	{		func = plpgsql_compile(proinfo->fn_oid, T_FUNCTION);		func->next = compiled_functions;		compiled_functions = func;	}	return plpgsql_exec_function(func, proargs, isNull);}/* ---------- * plpgsql_trigger_handler()	- Handler for trigger calls * ---------- */static HeapTupleplpgsql_trigger_handler(FmgrInfo *proinfo){	TriggerData *trigdata;	PLpgSQL_function *func;	/* ----------	 * Save the current trigger data local	 * ----------	 */	trigdata = CurrentTriggerData;	CurrentTriggerData = NULL;	/* ----------	 * Check if we already compiled this trigger procedure	 * ----------	 */	for (func = compiled_functions; func != NULL; func = func->next)	{		if (proinfo->fn_oid == func->fn_oid)			break;	}	/* ----------	 * If not, do so and add it to the compiled ones	 * ----------	 */	if (func == NULL)	{		func = plpgsql_compile(proinfo->fn_oid, T_TRIGGER);		func->next = compiled_functions;		compiled_functions = func;	}	return plpgsql_exec_trigger(func, trigdata);}

⌨️ 快捷键说明

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