📄 dbixs.h
字号:
#define DBIcf_MultiThread 0x000800 /* allow multiple threads to enter */#define DBIcf_HandleSetErr 0x001000 /* has coderef HandleSetErr attribute */#define DBIcf_ShowErrorStatement 0x002000 /* include Statement in error */#define DBIcf_BegunWork 0x004000 /* between begin_work & commit/rollback */#define DBIcf_HandleError 0x008000 /* has coderef in HandleError attribute */#define DBIcf_Profile 0x010000 /* profile activity on this handle */#define DBIcf_TaintIn 0x020000 /* check inputs for taintedness */#define DBIcf_TaintOut 0x040000 /* taint outgoing data */#define DBIcf_Executed 0x080000 /* do/execute called since commit/rollb */#define DBIcf_PrintWarn 0x100000 /* warn() on warning (err="0") */#define DBIcf_Callbacks 0x200000 /* has Callbacks attribute hash *//* NOTE: new flags may require clone() to be updated */#define DBIcf_INHERITMASK /* what NOT to pass on to children */ \ (U32)( DBIcf_COMSET | DBIcf_IMPSET | DBIcf_ACTIVE | DBIcf_IADESTROY \ | DBIcf_AutoCommit | DBIcf_BegunWork | DBIcf_Executed | DBIcf_Callbacks )/* general purpose bit setting and testing macros */#define DBIbf_is( bitset,flag) ((bitset) & (flag))#define DBIbf_has(bitset,flag) DBIbf_is(bitset, flag) /* alias for _is */#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))/* as above, but specifically for DBIc_FLAGS imp flags (except ACTIVE) */#define DBIc_is(imp, flag) DBIbf_is( DBIc_FLAGS(imp), flag)#define DBIc_has(imp,flag) DBIc_is(imp, flag) /* alias for DBIc_is */#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) /* adjust parent's active kid count */ \ 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) /* adjust parent's active kid count */ \ 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 /* get Handle Common Data Structure */#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/* --- Implementors Private Data Support --- */#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)) /* XXX *//* --- Event Support (VERY LIABLE TO CHANGE) --- */#define DBIh_EVENTx(h,t,a1,a2) /* deprecated XXX */ &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))/* --- Handy Macros --- */#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)) \ )/* --- DBI State Structure --- */struct dbistate_st {#define DBISTATE_VERSION 94 /* Must change whenever dbistate_t does */ /* this must be the first member in structure */ 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)); /* version and size are used to check for DBI/DBD version mis-match */ U16 version; /* version of this structure */ U16 size; U16 xs_version; /* version of the overall DBIXS / DBD interface */ U16 spare_pad; I32 debug; PerlIO *logfp; /* pointers to DBI functions which the DBD's will want to use */ char * (*neat_svpv) _((SV *sv, STRLEN maxlen)); imp_xxh_t * (*getcom) _((SV *h)); /* see DBIh_COM macro */ 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; /* only show dbgpvlen chars when debugging pv's */ PerlInterpreter * thr_owner; /* thread that owns this dbistate */ 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; /* DAA keep ptr to filehandle for refcounting */ /* WARNING: Only add new structure members here, and reduce pad2 to keep */ /* the memory footprint exactly the same */ void *pad2[4];};/* macros for backwards compatibility */#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/* --- perl object (ActiveState) / multiplicity hooks and hoops --- *//* note that USE_ITHREADS implies MULTIPLICITY */#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)# define DBISTATE_DECLARE typedef int dummy_dbistate /* keep semicolon from feeling lonely */# define DBISTATE_ASSIGN(st)# define DBISTATE_INIT# undef DBIS# define DBIS (*(INT2PTR(dbistate_t**, &SvIVX(DBISTATE_ADDRSV))))/* 'dbis' is temp for bad drivers using 'dbis' instead of 'DBIS' */# define dbis (*(INT2PTR(dbistate_t**, &SvIVX(DBISTATE_ADDRSV))))#else /* plain and simple non perl object / multiplicity case */# 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 { /* typically use in BOOT: of XS file */ \ DBISTATE_INIT_DBIS; \ if (DBIS == NULL) \ croak("Unable to get DBI state from %s at %p. DBI not loaded.", DBISTATE_PERLNAME, 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/* --- Assorted Utility Macros --- */#define DBD_ATTRIB_OK(attribs) /* is this a usable attrib value */ \ (attribs && SvROK(attribs) && SvTYPE(SvRV(attribs))==SVt_PVHV)/* If attribs value supplied then croak if it's not a hash ref. *//* Also map undef to Null. Should always be called to pre-process the *//* attribs value. One day we may add some extra magic in here. */#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 /* DBIXS_VERSION *//* end of DBIXS.h */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -