/*
* Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden
* Distributed under the terms shown in the file COPYRIGHT
* found in the root folder of this project or at
* http://eng.tada.se/osprojects/COPYRIGHT.html
*
* @author Thomas Hallgren
*/
#ifndef __pljava_pljava_h
#define __pljava_pljava_h
#include
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************
* Misc stuff to tie Java to PostgreSQL. TRY/CATCH macros, thread
* blocking, etc. resides here.
*
* @author Thomas Hallgren
*****************************************************************/
#ifdef __STRICT_ANSI__
extern int vsnprintf(char* buf, size_t count, const char* format, va_list arg);
#endif
#include
#include
#include
#include
#include
#include
#include
/* The errorOccured will be set when a call from Java into one of the
* backend functions results in a elog that causes a longjmp (Levels >= ERROR)
* that was trapped using the PLJAVA_TRY/PLJAVA_CATCH macros.
* When this happens, all further calls from Java must be blocked since the
* state of the current transaction is unknown. Further more, once the function
* that initially called Java finally returns, the intended longjmp (the one
* to the original value of Warn_restart) must be made.
*/
extern jlong mainThreadId;
extern bool pljavaEntryFence(JNIEnv* env);
extern JNIEnv* currentJNIEnv;
extern MemoryContext JavaMemoryContext;
#if (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER == 0)
#define STACK_BASE_VARS
#define STACK_BASE_PUSH(threadId)
#define STACK_BASE_POP()
#else
#if (PGSQL_MAJOR_VER > 8 || (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER >= 3))
extern PGDLLIMPORT char* stack_base_ptr;
#else
extern DLLIMPORT char* stack_base_ptr;
#endif
#define STACK_BASE_VARS \
long saveMainThreadId = 0; \
char* saveStackBasePtr = 0;
#define STACK_BASE_PUSH(threadId) \
if(threadId != mainThreadId) \
{ \
saveStackBasePtr = stack_base_ptr; \
saveMainThreadId = mainThreadId; \
stack_base_ptr = (char*)&saveMainThreadId; \
mainThreadId = threadId; \
elog(DEBUG1, "Changed stack_base_ptr from %p to %p", saveStackBasePtr, stack_base_ptr); \
}
#define STACK_BASE_POP() \
if(saveStackBasePtr != 0) \
{ \
stack_base_ptr = saveStackBasePtr; \
mainThreadId = saveMainThreadId; \
elog(DEBUG1, "Restored stack_base_ptr to %p", saveStackBasePtr); \
}
#endif
/* NOTE!
* When using the PG_TRY, PG_CATCH, PG_TRY_END family of macros,
* it is an ABSOLUTE NECESSITY to use the PG_TRY_RETURN or
* PG_TRY_RETURN_VOID in place of any return.
*/
#define PG_TRY_POP \
PG_exception_stack = save_exception_stack; \
error_context_stack = save_context_stack
#define PG_TRY_RETURN(retVal) { PG_TRY_POP; return retVal; }
#define PG_TRY_RETURN_VOID { PG_TRY_POP; return; }
/* Some error codes missing from errcodes.h
*
* Class 07 - Dynamic SQL Exception
*/
#define ERRCODE_INVALID_DESCRIPTOR_INDEX MAKE_SQLSTATE('0','7', '0','0','9')
/*
* Union used when coercing void* to jlong and vice versa
*/
typedef union
{
void* ptrVal;
jlong longVal; /* 64 bit quantity */
struct
{
/* Used when calculating pointer hash in systems where
* a pointer is 64 bit
*/
uint32 intVal_1;
uint32 intVal_2;
} x64;
} Ptr2Long;
struct Invocation_;
typedef struct Invocation_ Invocation;
struct Function_;
typedef struct Function_* Function;
#ifdef __cplusplus
}
#endif
#endif