DBD-MaxDB

 view release on metacpan or  search on metacpan

dbdimp.c  view on Meta::CPAN

#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;

dbdimp.c  view on Meta::CPAN

          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 )