#ifndef DBIXS_VERSION
#ifndef DBIS
#define DBIS dbis
#endif
#define PERL_POLLUTE
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#ifdef debug
#undef debug
#endif
#ifdef std
#undef std
#endif
#include "dbixs_rev.h"
#include "dbipport.h"
#include "dbi_sql.h"
#define DBIXS_VERSION 93
#ifdef NEED_DBIXS_VERSION
#if NEED_DBIXS_VERSION > DBIXS_VERSION
error You_need_to_upgrade_your_DBI_module_before_building_this_driver
#endif
#else
#define NEED_DBIXS_VERSION DBIXS_VERSION
#endif
#define DBI_LOCK
#define DBI_UNLOCK
#ifndef DBI_NO_THREADS
#ifdef USE_ITHREADS
#define DBI_USE_THREADS
#endif
#endif
typedef struct dbistate_st dbistate_t;
typedef struct imp_drh_st imp_drh_t;
typedef struct imp_dbh_st imp_dbh_t;
typedef struct imp_sth_st imp_sth_t;
typedef struct imp_fdh_st imp_fdh_t;
typedef struct imp_xxh_st imp_xxh_t;
#define DBI_imp_data_ imp_xxh_t
#define DBIt_DR 1
#define DBIt_DB 2
#define DBIt_ST 3
#define DBIt_FD 4
typedef struct dbih_com_std_st {
U32 flags;
int call_depth;
U16 type;
HV *my_h;
SV *parent_h;
imp_xxh_t *parent_com;
PerlInterpreter * thr_user;
HV *imp_stash;
SV *imp_data;
I32 kids;
I32 active_kids;
U32 pad;
dbistate_t *dbistate;
} dbih_com_std_t;
typedef struct dbih_com_attr_st {
SV *TraceLevel;
SV *State;
SV *Err;
SV *Errstr;
UV ErrCount;
U32 LongReadLen;
SV *FetchHashKeyName;
} dbih_com_attr_t;
struct dbih_com_st {
dbih_com_std_t std;
dbih_com_attr_t attr;
};
struct imp_xxh_st { struct dbih_com_st com; };
typedef struct {
dbih_com_std_t std;
dbih_com_attr_t attr;
HV *_old_cached_kids;
} dbih_drc_t;
typedef struct {
dbih_com_std_t std;
dbih_com_attr_t attr;
HV *_old_cached_kids;
} dbih_dbc_t;
typedef struct {
dbih_com_std_t std;
dbih_com_attr_t attr;
int num_params;
int num_fields;
AV *fields_svav;
IV row_count;
AV *fields_fdav;
I32 spare1;
void *spare2;
} dbih_stc_t;
typedef struct {
dbih_com_std_t std;
char *col_name;
I16 col_name_len;
I16 col_sql_type;
I16 col_precision;
I16 col_scale;
I16 col_nullable;
I32 col_length;
I32 col_disp_size;
I32 spare1;
void *spare2;
} dbih_fdc_t;
#define _imp2com(p,f) ((p)->com.f)
#define DBIc_FLAGS(imp) _imp2com(imp, std.flags)
#define DBIc_TYPE(imp) _imp2com(imp, std.type)
#define DBIc_CALL_DEPTH(imp) _imp2com(imp, std.call_depth)
#define DBIc_MY_H(imp) _imp2com(imp, std.my_h)
#define DBIc_PARENT_H(imp) _imp2com(imp, std.parent_h)
#define DBIc_PARENT_COM(imp) _imp2com(imp, std.parent_com)
#define DBIc_THR_COND(imp) _imp2com(imp, std.thr_cond)
#define DBIc_THR_USER(imp) _imp2com(imp, std.thr_user)
#define DBIc_THR_USER_NONE (0xFFFF)
#define DBIc_IMP_STASH(imp) _imp2com(imp, std.imp_stash)
#define DBIc_IMP_DATA(imp) _imp2com(imp, std.imp_data)
#define DBIc_DBISTATE(imp) _imp2com(imp, std.dbistate)
#define DBIc_LOGPIO(imp) DBIc_DBISTATE(imp)->logfp
#define DBIc_KIDS(imp) _imp2com(imp, std.kids)
#define DBIc_ACTIVE_KIDS(imp) _imp2com(imp, std.active_kids)
#define DBIc_LAST_METHOD(imp) _imp2com(imp, std.last_method)
#define DBIc_TRACE_LEVEL_MASK 0x0000000F
#define DBIc_TRACE_FLAGS_MASK 0xFFFFFF00
#define DBIc_TRACE_SETTINGS(imp) (DBIc_DBISTATE(imp)->debug)
#define DBIc_TRACE_LEVEL(imp) (DBIc_TRACE_SETTINGS(imp) & DBIc_TRACE_LEVEL_MASK)
#define DBIc_TRACE_FLAGS(imp) (DBIc_TRACE_SETTINGS(imp) & DBIc_TRACE_FLAGS_MASK)
#define DBIc_TRACE_MATCHES(this, crnt) \
( ((crnt & DBIc_TRACE_LEVEL_MASK) >= (this & DBIc_TRACE_LEVEL_MASK)) \
|| ((crnt & DBIc_TRACE_FLAGS_MASK) & (this & DBIc_TRACE_FLAGS_MASK)) )
#define DBIc_TRACE(imp, flags, flaglevel, level) \
( (flags && (DBIc_TRACE_FLAGS(imp) & flags) && (DBIc_TRACE_LEVEL(imp) >= flaglevel)) \
|| (level && DBIc_TRACE_LEVEL(imp) >= level) )
#define DBIc_DEBUG(imp) (_imp2com(imp, attr.TraceLevel))
#define DBIc_DEBUGIV(imp) SvIV(DBIc_DEBUG(imp))
#define DBIc_STATE(imp) SvRV(_imp2com(imp, attr.State))
#define DBIc_ERR(imp) SvRV(_imp2com(imp, attr.Err))
#define DBIc_ERRSTR(imp) SvRV(_imp2com(imp, attr.Errstr))
#define DBIc_ErrCount(imp) _imp2com(imp, attr.ErrCount)
#define DBIc_LongReadLen(imp) _imp2com(imp, attr.LongReadLen)
#define DBIc_LongReadLen_init 80
#define DBIc_FetchHashKeyName(imp) (_imp2com(imp, attr.FetchHashKeyName))
#define DBIc_CACHED_KIDS(imp) Nullhv
#define DBIc_NUM_FIELDS(imp) _imp2com(imp, num_fields)
#define DBIc_NUM_PARAMS(imp) _imp2com(imp, num_params)
#define DBIc_NUM_PARAMS_AT_EXECUTE -9
#define DBIc_ROW_COUNT(imp) _imp2com(imp, row_count)
#define DBIc_FIELDS_AV(imp) _imp2com(imp, fields_svav)
#define DBIc_FDESC_AV(imp) _imp2com(imp, fields_fdav)
#define DBIc_FDESC(imp, i) ((imp_fdh_t*)(void*)SvPVX(AvARRAY(DBIc_FDESC_AV(imp))[i]))
#define DBIcf_COMSET 0x000001
#define DBIcf_IMPSET 0x000002
#define DBIcf_ACTIVE 0x000004
#define DBIcf_IADESTROY 0x000008
#define DBIcf_WARN 0x000010
#define DBIcf_COMPAT 0x000020
#define DBIcf_ChopBlanks 0x000040
#define DBIcf_RaiseError 0x000080
#define DBIcf_PrintError 0x000100
#define DBIcf_AutoCommit 0x000200
#define DBIcf_LongTruncOk 0x000400
#define DBIcf_MultiThread 0x000800
#define DBIcf_HandleSetErr 0x001000
#define DBIcf_ShowErrorStatement 0x002000
#define DBIcf_BegunWork 0x004000
#define DBIcf_HandleError 0x008000
#define DBIcf_Profile 0x010000
#define DBIcf_TaintIn 0x020000
#define DBIcf_TaintOut 0x040000
#define DBIcf_Executed 0x080000
#define DBIcf_PrintWarn 0x100000
#define DBIcf_Callbacks 0x200000
#define DBIcf_INHERITMASK \
(U32)( DBIcf_COMSET | DBIcf_IMPSET | DBIcf_ACTIVE | DBIcf_IADESTROY \
| DBIcf_AutoCommit | DBIcf_BegunWork | DBIcf_Executed | DBIcf_Callbacks )
#define DBIbf_is( bitset,flag) ((bitset) & (flag))
#define DBIbf_has(bitset,flag) DBIbf_is(bitset, flag)
#define DBIbf_on( bitset,flag) ((bitset) |= (flag))
#define DBIbf_off(bitset,flag) ((bitset) &= ~(flag))
#define DBIbf_set(bitset,flag,on) ((on) ? DBIbf_on(bitset, flag) : DBIbf_off(bitset,flag))
#define DBIc_is(imp, flag) DBIbf_is( DBIc_FLAGS(imp), flag)
#define DBIc_has(imp,flag) DBIc_is(imp, flag)
#define DBIc_on(imp, flag) DBIbf_on( DBIc_FLAGS(imp), flag)
#define DBIc_off(imp,flag) DBIbf_off(DBIc_FLAGS(imp), flag)
#define DBIc_set(imp,flag,on) DBIbf_set(DBIc_FLAGS(imp), flag, on)
#define DBIc_COMSET(imp) DBIc_is(imp, DBIcf_COMSET)
#define DBIc_COMSET_on(imp) DBIc_on(imp, DBIcf_COMSET)
#define DBIc_COMSET_off(imp) DBIc_off(imp,DBIcf_COMSET)
#define DBIc_IMPSET(imp) DBIc_is(imp, DBIcf_IMPSET)
#define DBIc_IMPSET_on(imp) DBIc_on(imp, DBIcf_IMPSET)
#define DBIc_IMPSET_off(imp) DBIc_off(imp,DBIcf_IMPSET)
#define DBIc_ACTIVE(imp) (DBIc_FLAGS(imp) & DBIcf_ACTIVE)
#define DBIc_ACTIVE_on(imp) \
do { \
imp_xxh_t *ph_com = DBIc_PARENT_COM(imp); \
if (!DBIc_ACTIVE(imp) && ph_com && !dirty \
&& ++DBIc_ACTIVE_KIDS(ph_com) > DBIc_KIDS(ph_com)) \
croak("panic: DBI active kids (%ld) > kids (%ld)", \
DBIc_ACTIVE_KIDS(ph_com), DBIc_KIDS(ph_com)); \
DBIc_FLAGS(imp) |= DBIcf_ACTIVE; \
} while(0)
#define DBIc_ACTIVE_off(imp) \
do { \
imp_xxh_t *ph_com = DBIc_PARENT_COM(imp); \
if (DBIc_ACTIVE(imp) && ph_com && !dirty \
&& (--DBIc_ACTIVE_KIDS(ph_com) > DBIc_KIDS(ph_com) \
|| DBIc_ACTIVE_KIDS(ph_com) < 0) ) \
croak("panic: DBI active kids (%ld) < 0 or > kids (%ld)", \
DBIc_ACTIVE_KIDS(ph_com), DBIc_KIDS(ph_com)); \
DBIc_FLAGS(imp) &= ~DBIcf_ACTIVE; \
} while(0)
#define DBIc_IADESTROY(imp) (DBIc_FLAGS(imp) & DBIcf_IADESTROY)
#define DBIc_IADESTROY_on(imp) (DBIc_FLAGS(imp) |= DBIcf_IADESTROY)
#define DBIc_IADESTROY_off(imp) (DBIc_FLAGS(imp) &= ~DBIcf_IADESTROY)
#define DBIc_WARN(imp) (DBIc_FLAGS(imp) & DBIcf_WARN)
#define DBIc_WARN_on(imp) (DBIc_FLAGS(imp) |= DBIcf_WARN)
#define DBIc_WARN_off(imp) (DBIc_FLAGS(imp) &= ~DBIcf_WARN)
#define DBIc_COMPAT(imp) (DBIc_FLAGS(imp) & DBIcf_COMPAT)
#define DBIc_COMPAT_on(imp) (DBIc_FLAGS(imp) |= DBIcf_COMPAT)
#define DBIc_COMPAT_off(imp) (DBIc_FLAGS(imp) &= ~DBIcf_COMPAT)
#ifdef IN_DBI_XS
#define DBIh_COM(h) (dbih_getcom2(aTHX_ h, 0))
#else
#define DBIh_COM(h) (DBIS->getcom(h))
#define neatsvpv(sv,len) (DBIS->neat_svpv(sv,len))
#endif
#define D_impdata(name,type,h) type *name = (type*)(DBIh_COM(h))
#define D_imp_drh(h) D_impdata(imp_drh, imp_drh_t, h)
#define D_imp_dbh(h) D_impdata(imp_dbh, imp_dbh_t, h)
#define D_imp_sth(h) D_impdata(imp_sth, imp_sth_t, h)
#define D_imp_xxh(h) D_impdata(imp_xxh, imp_xxh_t, h)
#define D_imp_from_child(name,type,child) \
type *name = (type*)(DBIc_PARENT_COM(child))
#define D_imp_drh_from_dbh D_imp_from_child(imp_drh, imp_drh_t, imp_dbh)
#define D_imp_dbh_from_sth D_imp_from_child(imp_dbh, imp_dbh_t, imp_sth)
#define DBI_IMP_SIZE(n,s) sv_setiv(perl_get_sv((n), GV_ADDMULTI), (s))
#define DBIh_EVENTx(h,t,a1,a2) &PL_sv_no
#define DBIh_EVENT0(h,t) DBIh_EVENTx((h), (t), &PL_sv_undef, &PL_sv_undef)
#define DBIh_EVENT1(h,t, a1) DBIh_EVENTx((h), (t), (a1), &PL_sv_undef)
#define DBIh_EVENT2(h,t, a1,a2) DBIh_EVENTx((h), (t), (a1), (a2))
#define ERROR_event "ERROR"
#define WARN_event "WARN"
#define MSG_event "MESSAGE"
#define DBEVENT_event "DBEVENT"
#define UNKNOWN_event "UNKNOWN"
#define DBIh_SET_ERR_SV(h,i, err, errstr, state, method) \
(DBIc_DBISTATE(i)->set_err_sv(h,i, err, errstr, state, method))
#define DBIh_SET_ERR_CHAR(h,i, err_c, err_i, errstr, state, method) \
(DBIc_DBISTATE(i)->set_err_char(h,i, err_c, err_i, errstr, state, method))
#define DBIh_CLEAR_ERROR(imp_xxh) (void)( \
(void)SvOK_off(DBIc_ERR(imp_xxh)), \
(void)SvOK_off(DBIc_ERRSTR(imp_xxh)), \
(void)SvOK_off(DBIc_STATE(imp_xxh)) \
)
struct dbistate_st {
#define DBISTATE_VERSION 94
void (*check_version) _((const char *name,
int dbis_cv, int dbis_cs, int need_dbixs_cv,
int drc_s, int dbc_s, int stc_s, int fdc_s));
U16 version;
U16 size;
U16 xs_version;
U16 spare_pad;
I32 debug;
PerlIO *logfp;
char * (*neat_svpv) _((SV *sv, STRLEN maxlen));
imp_xxh_t * (*getcom) _((SV *h));
void (*clearcom) _((imp_xxh_t *imp_xxh));
SV * (*event) _((SV *h, const char *name, SV*, SV*));
int (*set_attr_k) _((SV *h, SV *keysv, int dbikey, SV *valuesv));
SV * (*get_attr_k) _((SV *h, SV *keysv, int dbikey));
AV * (*get_fbav) _((imp_sth_t *imp_sth));
SV * (*make_fdsv) _((SV *sth, const char *imp_class, STRLEN imp_size, const char *col_name));
int (*bind_as_num) _((int sql_type, int p, int s, int *t, void *v));
I32 (*hash) _((const char *string, long i));
SV * (*preparse) _((SV *sth, char *statement, IV ps_return, IV ps_accept, void *foo));
SV *neatsvpvlen;
PerlInterpreter * thr_owner;
int (*logmsg) _((imp_xxh_t *imp_xxh, const char *fmt, ...));
int (*set_err_sv) _((SV *h, imp_xxh_t *imp_xxh, SV *err, SV *errstr, SV *state, SV *method));
int (*set_err_char) _((SV *h, imp_xxh_t *imp_xxh, const char *err, IV err_i, const char *errstr, const char *state, const char *method));
int (*bind_col) _((SV *sth, SV *col, SV *ref, SV *attribs));
IO *logfp_ref;
void *pad2[4];
};
#define set_attr(h, k, v) set_attr_k(h, k, 0, v)
#define get_attr(h, k) get_attr_k(h, k, 0)
#define DBISTATE_PERLNAME "DBI::_dbistate"
#define DBISTATE_ADDRSV (perl_get_sv(DBISTATE_PERLNAME, 0x05))
#define DBILOGFP (DBIS->logfp)
#ifdef IN_DBI_XS
#define DBILOGMSG (dbih_logmsg)
#else
#define DBILOGMSG (DBIS->logmsg)
#endif
#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)
# define DBISTATE_DECLARE typedef int dummy_dbistate
# define DBISTATE_ASSIGN(st)
# define DBISTATE_INIT
# undef DBIS
# define DBIS (*(INT2PTR(dbistate_t**, &SvIVX(DBISTATE_ADDRSV))))
# define dbis (*(INT2PTR(dbistate_t**, &SvIVX(DBISTATE_ADDRSV))))
#else
# define DBISTATE_DECLARE static dbistate_t *DBIS
# define DBISTATE_ASSIGN(st) (DBIS = (st))
# define DBISTATE_INIT_DBIS DBISTATE_ASSIGN(INT2PTR(dbistate_t*, SvIV(DBISTATE_ADDRSV)))
# define DBISTATE_INIT { \
DBISTATE_INIT_DBIS; \
if (DBIS == NULL) \
croak("Unable to get DBI state from %s at %p. DBI not loaded.", DBISTATE_PERLNAME, (void*)DBISTATE_ADDRSV); \
DBIS->check_version(__FILE__, DBISTATE_VERSION, sizeof(*DBIS), NEED_DBIXS_VERSION, \
sizeof(dbih_drc_t), sizeof(dbih_dbc_t), sizeof(dbih_stc_t), sizeof(dbih_fdc_t) \
); \
}
#endif
#define DBD_ATTRIB_OK(attribs) \
(attribs && SvROK(attribs) && SvTYPE(SvRV(attribs))==SVt_PVHV)
#define DBD_ATTRIBS_CHECK(func, h, attribs) \
if ((attribs) && SvOK(attribs)) { \
if (!SvROK(attribs) || SvTYPE(SvRV(attribs))!=SVt_PVHV) \
croak("%s->%s(...): attribute parameter '%s' is not a hash ref", \
SvPV_nolen(h), func, SvPV_nolen(attribs)); \
} else (attribs) = Nullsv
#define DBD_ATTRIB_GET_SVP(attribs, key,klen) \
(DBD_ATTRIB_OK(attribs) \
? hv_fetch((HV*)SvRV(attribs), key,klen, 0) \
: (SV **)Nullsv)
#define DBD_ATTRIB_GET_IV(attribs, key,klen, svp, var) \
if ((svp=DBD_ATTRIB_GET_SVP(attribs, key,klen)) != NULL) \
var = SvIV(*svp)
#define DBD_ATTRIB_GET_BOOL(attribs, key,klen, svp, var) \
if ((svp=DBD_ATTRIB_GET_SVP(attribs, key,klen)) != NULL) \
var = SvTRUE(*svp)
#define DBD_ATTRIB_TRUE(attribs, key,klen, svp) \
( ((svp=DBD_ATTRIB_GET_SVP(attribs, key,klen)) != NULL) \
? SvTRUE(*svp) : 0 )
#define DBD_ATTRIB_GET_PV(attribs, key,klen, svp, dflt) \
(((svp=DBD_ATTRIB_GET_SVP(attribs, key,klen)) != NULL) \
? SvPV_nolen(*svp) : (dflt))
#define DBD_ATTRIB_DELETE(attribs, key, klen) \
hv_delete((HV*)attribs, key, klen, G_DISCARD)
#endif