📄 spi.xs
字号:
/* this must be first: */#include "postgres.h"/* Defined by Perl */#undef _/* perl stuff *//* stop perl from hijacking stdio and other stuff */#ifdef WIN32#define WIN32IO_IS_STDIO#endif #include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include "ppport.h"#include "spi_internal.h"/* * Implementation of plperl's elog() function * * If the error level is less than ERROR, we'll just emit the message and * return. When it is ERROR, elog() will longjmp, which we catch and * turn into a Perl croak(). Note we are assuming that elog() can't have * any internal failures that are so bad as to require a transaction abort. * * This is out-of-line to suppress "might be clobbered by longjmp" warnings. */static voiddo_spi_elog(int level, char *message){ MemoryContext oldcontext = CurrentMemoryContext; PG_TRY(); { elog(level, "%s", message); } PG_CATCH(); { ErrorData *edata; /* Must reset elog.c's state */ MemoryContextSwitchTo(oldcontext); edata = CopyErrorData(); FlushErrorState(); /* Punt the error to Perl */ croak("%s", edata->message); } PG_END_TRY();}/* * Interface routine to catch ereports and punt them to Perl */static voiddo_plperl_return_next(SV *sv){ MemoryContext oldcontext = CurrentMemoryContext; PG_TRY(); { plperl_return_next(sv); } PG_CATCH(); { ErrorData *edata; /* Must reset elog.c's state */ MemoryContextSwitchTo(oldcontext); edata = CopyErrorData(); FlushErrorState(); /* Punt the error to Perl */ croak("%s", edata->message); } PG_END_TRY();}MODULE = SPI PREFIX = spi_PROTOTYPES: ENABLEVERSIONCHECK: DISABLEvoidspi_elog(level, message) int level char* message CODE: if (level > ERROR) /* no PANIC allowed thanks */ level = ERROR; if (level < DEBUG5) level = DEBUG5; do_spi_elog(level, message);intspi_DEBUG()intspi_LOG()intspi_INFO()intspi_NOTICE()intspi_WARNING()intspi_ERROR()SV*spi_spi_exec_query(query, ...) char* query; PREINIT: HV *ret_hash; int limit = 0; CODE: if (items > 2) croak("Usage: spi_exec_query(query, limit) or spi_exec_query(query)"); if (items == 2) limit = SvIV(ST(1)); ret_hash = plperl_spi_exec(query, limit); RETVAL = newRV_noinc((SV*) ret_hash); OUTPUT: RETVALvoidspi_return_next(rv) SV *rv; CODE: do_plperl_return_next(rv);SV *spi_spi_query(query) char *query; CODE: RETVAL = plperl_spi_query(query); OUTPUT: RETVALSV *spi_spi_fetchrow(cursor) char *cursor; CODE: RETVAL = plperl_spi_fetchrow(cursor); OUTPUT: RETVALBOOT: items = 0; /* avoid 'unused variable' warning */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -