DBD-MaxDB
view release on metacpan or search on metacpan
#if defined(dTHR)
dTHR;
#endif
D_imp_drh_from_dbh;
DBD_MAXDB_METHOD_ENTER(imp_dbh, dbd_maxdb_db_destroy);
if (DBIc_ACTIVE(imp_dbh)) {
dbd_maxdb_db_disconnect(dbh, imp_dbh);
}
SQLDBC_Environment_releaseConnection (imp_drh->m_maxDBEnv, imp_dbh->m_connection);
imp_dbh->m_connection = NULL;
DBIc_off(imp_dbh, DBIcf_IMPSET);
DBD_MAXDB_METHOD_EXIT(imp_dbh, dbd_maxdb_db_destroy);
}
/***************************************************************************
*
* Name: dbd_db_STORE_attrib
*
* Purpose: Function for storing dbh attributes; we currently support
* just nothing. :-)
*
* Input: dbh - database handle being modified
* imp_dbh - drivers private database handle data
* keysv - the attribute name
* valuesv - the attribute value
*
* Returns: TRUE for success, FALSE otherwise
*
**************************************************************************/
#define DBD_MAXDB_MAX_KEYWORD_LEN 30
typedef struct {
char rawString [DBD_MAXDB_MAX_KEYWORD_LEN];
SQLDBC_Int4 length;
}dbd_maxdb_cmdKeyword ;
typedef struct {
SQLDBC_Int4 entry;
dbd_maxdb_cmdKeyword keyword;
} dbd_maxdb_cmdKeywordTable;
static dbd_maxdb_cmdKeywordTable dbh_sqlmodeTab [ ]= {
{ SQLDBC_ANSI, {"A" ,sizeof("A")-1}},
{ SQLDBC_ANSI, {"ANSI" ,sizeof("ANSI")-1}},
{ SQLDBC_DB2, {"D" ,sizeof("D")-1}},
{ SQLDBC_DB2, {"DB2" ,sizeof("DB2")-1}},
{ SQLDBC_INTERNAL, {"I" ,sizeof("I")-1}},
{ SQLDBC_INTERNAL, {"INTERNAL" ,sizeof("INTERNAL")-1}},
{ SQLDBC_ORACLE, {"O" ,sizeof("O")-1}},
{ SQLDBC_ORACLE, {"ORACLE" ,sizeof("ORACLE")-1}}
};
#define DBD_MAXDB_SQLMODETABLESIZE (sizeof(dbh_sqlmodeTab) /sizeof(dbd_maxdb_cmdKeywordTable))
typedef enum {
dbd_maxdb_option_autocommit = 1,
dbd_maxdb_option_isolationlevel = 2,
dbd_maxdb_option_kernelversion = 3,
dbd_maxdb_option_unicodedb = 4,
dbd_maxdb_option_sdkversion = 5,
dbd_maxdb_option_sqlmode = 6,
dbd_maxdb_option_libraryversion = 7,
dbd_maxdb_option_readlongcomplete = 8,
dbd_maxdb_option_unknown = -1
}dbd_maxdb_option;
static dbd_maxdb_cmdKeywordTable dbh_optionTab [ ]= {
{ dbd_maxdb_option_autocommit, {"AUTOCOMMIT" ,sizeof("AUTOCOMMIT")-1}},
{ dbd_maxdb_option_isolationlevel, {"MAXDB_ISOLATIONLEVEL" ,sizeof("MAXDB_ISOLATIONLEVEL")-1}},
{ dbd_maxdb_option_kernelversion, {"MAXDB_KERNELVERSION" ,sizeof("MAXDB_KERNELVERSION")-1}},
{ dbd_maxdb_option_libraryversion, {"MAXDB_LIBRARYVERSION" ,sizeof("MAXDB_LIBRARYVERSION")-1}},
{ dbd_maxdb_option_readlongcomplete, {"MAXDB_READ_LONG_COMPLETE" ,sizeof("MAXDB_READ_LONG_COMPLETE")-1}},
{ dbd_maxdb_option_sdkversion, {"MAXDB_SDKVERSION" ,sizeof("MAXDB_SDKVERSION")-1}},
{ dbd_maxdb_option_sqlmode, {"MAXDB_SQLMODE" ,sizeof("MAXDB_SQLMODE")-1}},
{ dbd_maxdb_option_unicodedb, {"MAXDB_UNICODE" ,sizeof("MAXDB_UNICODE")-1}},
};
#define DBD_MAXDB_OPTIONTABLESIZE (sizeof(dbh_optionTab) /sizeof(dbd_maxdb_cmdKeywordTable))
static SQLDBC_Int4 analyzeKeyword(char* pIdentifier, SQLDBC_Int4 IdentLength, dbd_maxdb_cmdKeywordTable myCMDKeywTab[] ,SQLDBC_Int4 numElementsTab){
SQLDBC_Int4 m,pos,compareLength,begin = 1; /*lower bound of search scope*/
SQLDBC_Int4 end = numElementsTab; /*upper bound of search scope*/
char UpperIdentifier[DBD_MAXDB_MAX_KEYWORD_LEN]; /*pIdentifier in upper cases*/
if (! IdentLength || IdentLength > DBD_MAXDB_MAX_KEYWORD_LEN){
return dbd_maxdb_option_unknown;
}
/*upper pidentifier for case insensitive compare*/
memset (&UpperIdentifier[0],0,DBD_MAXDB_MAX_KEYWORD_LEN);
for (m=0; (m<IdentLength); m++) UpperIdentifier[m] = toupper(pIdentifier[m]);
/* searching for keyword */
do {
SQLDBC_Int4 erg; /*result off keyword compare*/
pos = (begin+end)/2;
compareLength = (IdentLength > myCMDKeywTab[pos-1].keyword.length)?IdentLength:myCMDKeywTab[pos-1].keyword.length;
erg = memcmp (&UpperIdentifier[0],
myCMDKeywTab[pos-1].keyword.rawString,
compareLength);
if (erg == 0){
if (IdentLength == myCMDKeywTab[pos-1].keyword.length){
return myCMDKeywTab[pos-1].entry;
} else {
if (IdentLength > myCMDKeywTab[pos-1].keyword.length){
erg = 1;
} else{
erg = -1;
}
}
}
if (erg < 0) {
end = pos-1;
} else {
begin = pos+1;
}
}while(begin <= end); /*identifier not recognized as a keyword*/
return dbd_maxdb_option_unknown;
}
static SQLDBC_SQLMode String2SQLModeType (char* val, SQLDBC_Int4 vallen){
return (SQLDBC_SQLMode) analyzeKeyword(val, vallen, dbh_sqlmodeTab, DBD_MAXDB_SQLMODETABLESIZE);
}
int dbd_maxdb_db_STORE_attrib(SV* dbh, imp_dbh_t* imp_dbh, SV* keysv, SV* valuesv) {
#if defined(dTHR)
dTHR;
#endif
STRLEN kl,vl;
char *key = SvPV(keysv,kl);
dbd_maxdb_option opt;
int erg;
case dbd_maxdb_option_isolationlevel:{
if(!SvIOK (valuesv)){
dbd_maxdb_internal_error(dbh, DBD_ERR_WRONG_PARAMETER_S, "isolation level must be a number value");
break;
}
if (! SQLDBC_Connection_setTransactionIsolation (imp_dbh->m_connection, SvIV(valuesv)) == SQLDBC_OK) {
dbd_maxdb_sqldbc_error(dbh, SQLDBC_Connection_getError(imp_dbh->m_connection));
break;
}
erg = SQLDBC_TRUE;
break;
}
}
}
DBD_MAXDB_METHOD_RETURN(imp_dbh, dbd_maxdb_db_STORE_attrib, erg);
}
/***************************************************************************
*
* Name: dbd_db_FETCH_attrib
*
* Purpose: Function for fetching dbh attributes
*
* Input: dbh - database handle being queried
* imp_dbh - drivers private database handle data
* keysv - the attribute name
*
* Returns: An SV*, if sucessfull; NULL otherwise
*
* Notes: Do not forget to call sv_2mortal in the former case!
*
**************************************************************************/
SV* dbd_maxdb_db_FETCH_attrib(SV* dbh, imp_dbh_t* imp_dbh, SV* keysv) {
#if defined(dTHR)
dTHR;
#endif
D_imp_drh_from_dbh;
STRLEN kl;
char *key = SvPV(keysv, kl);
SV* result = Nullsv;
dbd_maxdb_option opt;
DBD_MAXDB_METHOD_ENTER (imp_dbh, dbd_maxdb_db_FETCH_attrib);
if ((opt = (dbd_maxdb_option)analyzeKeyword(key, kl, dbh_optionTab, DBD_MAXDB_OPTIONTABLESIZE)) != dbd_maxdb_option_unknown){
switch(opt)
{
case dbd_maxdb_option_autocommit:{
result = (SQLDBC_Connection_getAutoCommit (imp_dbh->m_connection))?&PL_sv_yes:&PL_sv_no;
break;
}
case dbd_maxdb_option_isolationlevel:{
result = sv_2mortal(newSViv(SQLDBC_Connection_getTransactionIsolation (imp_dbh->m_connection)));
break;
}
case dbd_maxdb_option_kernelversion:{
result = sv_2mortal(newSViv(SQLDBC_Connection_getKernelVersion(imp_dbh->m_connection)));
break;
}
case dbd_maxdb_option_unicodedb:{
result = (SQLDBC_Connection_isUnicodeDatabase (imp_dbh->m_connection))?&PL_sv_yes:&PL_sv_no;
break;
}
case dbd_maxdb_option_readlongcomplete:{
result = (imp_dbh->m_readlongcompletly)?&PL_sv_yes:&PL_sv_no;
break;
}
case dbd_maxdb_option_libraryversion :{
char* msg = SQLDBC_Environment_getLibraryVersion (imp_drh->m_maxDBEnv);
result = sv_2mortal(newSVpv(msg, strlen(msg)));
break;
}
case dbd_maxdb_option_sqlmode:{
char* msg = SQLDBC_ConnectProperties_getProperty( imp_dbh->m_connprop, "SQLMODE", "INTERNAL");
result = sv_2mortal(newSVpv(msg, strlen(msg)));
break;
}
case dbd_maxdb_option_sdkversion:{
char* msg = getSDKVersion();
result = sv_2mortal(newSVpv(msg, strlen(msg)));
break;
}
}
}
DBD_MAXDB_METHOD_RETURN_SV (imp_dbh, dbd_maxdb_db_FETCH_attrib, result);
}
/***************************************************************************
*
* Name: dbd_maxdb_db_ping
*
* Purpose: handles ping requests
*
* Input: dbh - connect handle
*
* Returns: TRUE for success, FALSE otherwise; do_error will
* be called in the latter case
*
**************************************************************************/
int dbd_maxdb_db_ping(SV* dbh){
#if defined(dTHR)
dTHR;
#endif
D_imp_dbh(dbh);
DBD_MAXDB_METHOD_ENTER (imp_dbh, dbd_maxdb_db_ping);
DBD_MAXDB_METHOD_RETURN (imp_dbh, dbd_maxdb_db_ping, (SQLDBC_Connection_isConnected (imp_dbh->m_connection)?1:0));
}
/***************************************************************************
*
* Name: dbd_maxdb_db_isunicode
*
* Purpose: tests if database is unicode or not.
*
* Input: dbh - connect handle
*
* Returns: TRUE if the database is an unicode database, FALSE otherwise;
* do_error will be called in the latter case
*
**************************************************************************/
int dbd_maxdb_db_isunicode(SV* dbh){
#if defined(dTHR)
dTHR;
#endif
D_imp_dbh(dbh);
DBD_MAXDB_METHOD_ENTER (imp_dbh, dbd_maxdb_db_isunicode);
DBD_MAXDB_METHOD_RETURN (imp_dbh, dbd_maxdb_db_isunicode, (SQLDBC_Connection_isUnicodeDatabase (imp_dbh->m_connection)?1:0));
}
/***************************************************************************
*
* Name: dbd_maxdb_db_getSQLMode
*
* Purpose: retrieves the SQL Mode of the underlaying database.
*
* Input: dbh - connect handle
*
* Returns: the sqlmode
*
**************************************************************************/
SV* dbd_maxdb_db_getSQLMode(SV* dbh){
#if defined(dTHR)
dTHR;
#endif
D_imp_dbh(dbh);
char* msg;
SV* result;
DBD_MAXDB_METHOD_ENTER (imp_dbh, dbd_maxdb_db_getSQLMode);
msg = SQLDBC_ConnectProperties_getProperty( imp_dbh->m_connprop, "SQLMODE", "INTERNAL");
result = sv_2mortal(newSVpv(msg, strlen(msg)));
DBD_MAXDB_METHOD_RETURN_SV (imp_dbh, dbd_maxdb_db_getSQLMode, result);
}
/***************************************************************************
*
* Name: dbd_maxdb_db_getSQLMode
*
* Purpose: retrieves the SQL Mode of the underlaying database.
*
* Input: dbh - connect handle
*
* Returns: the sqlmode
*
**************************************************************************/
SV* dbd_maxdb_db_getVersion(SV* dbh){
#if defined(dTHR)
dTHR;
#endif
D_imp_dbh(dbh);
char* msg;
SV* result;
DBD_MAXDB_METHOD_ENTER (imp_dbh, dbd_maxdb_db_getVersion);
result = sv_2mortal(newSViv(SQLDBC_Connection_getKernelVersion(imp_dbh->m_connection)));
DBD_MAXDB_METHOD_RETURN_SV (imp_dbh, dbd_maxdb_db_getVersion, result);
}
/***************************************************************************
*
* Name: dbd_maxdb_db_executeUpdate
*
* Purpose: handles execute immediate command without parameters
*
* Input: dbh - connect handle
*
* Returns: resultcount
( run in 1.745 second using v1.01-cache-2.11-cpan-39bf76dae61 )