The attached patch makes it possible to choose the
ODBC version. E.g.:

  my $dbh = DBI->connect( ..., { odbc_version => 3 } )

directs the driver to exhibit ODBC 3.x behavior.


Steffen
diff -bc DBD-ODBC-0.38-orig/ODBC.pm DBD-ODBC-0.38/ODBC.pm
*** DBD-ODBC-0.38-orig/ODBC.pm  Tue Feb 12 17:17:36 2002
--- DBD-ODBC-0.38/ODBC.pm       Fri Feb 22 22:49:33 2002
***************
*** 59,65 ****
  
      sub connect {
        my $drh = shift;
!       my($dbname, $user, $auth)= @_;
        $user = '' unless defined $user;
        $auth = '' unless defined $auth;
  
--- 59,65 ----
  
      sub connect {
        my $drh = shift;
!       my($dbname, $user, $auth, $attr)= @_;
        $user = '' unless defined $user;
        $auth = '' unless defined $auth;
  
***************
*** 73,79 ****
        # Call ODBC logon func in ODBC.xs file
        # and populate internal handle data.
  
!       DBD::ODBC::db::_login($this, $dbname, $user, $auth) or return undef;
  
        $this;
      }
--- 73,79 ----
        # Call ODBC logon func in ODBC.xs file
        # and populate internal handle data.
  
!       DBD::ODBC::db::_login($this, $dbname, $user, $auth, $attr) or return undef;
  
        $this;
      }
diff -bc DBD-ODBC-0.38-orig/dbdimp.c DBD-ODBC-0.38/dbdimp.c
*** DBD-ODBC-0.38-orig/dbdimp.c Tue Feb 12 19:11:56 2002
--- DBD-ODBC-0.38/dbdimp.c      Fri Feb 22 23:03:36 2002
***************
*** 166,176 ****
--- 166,184 ----
  ------------------------------------------------------------*/
  int
     dbd_db_login(dbh, imp_dbh, dbname, uid, pwd)
+    SV *dbh; imp_dbh_t *imp_dbh; char *dbname; char *uid; char *pwd;
+ {
+     return dbd_db_login6(dbh, imp_dbh, dbname, uid, pwd, Nullsv);
+ }
+ 
+ int
+    dbd_db_login6(dbh, imp_dbh, dbname, uid, pwd, attr)
     SV *dbh;
  imp_dbh_t *imp_dbh;
  char *dbname;
  char *uid;
  char *pwd;
+ SV   *attr;
  {
      D_imp_drh_from_dbh;
      int ret;
***************
*** 195,200 ****
--- 203,224 ----
        if (!SQL_ok(rc))
            return 0;
      }
+     {
+       SV **odbc_version_sv;
+       UV   odbc_version = 0;
+       DBD_ATTRIB_GET_IV(attr, "odbc_version",12, odbc_version_sv, odbc_version);
+       if (odbc_version) {
+           rc = SQLSetEnvAttr(imp_drh->henv, SQL_ATTR_ODBC_VERSION, 
+(SQLPOINTER)odbc_version, SQL_IS_INTEGER);
+           if (!SQL_ok(rc)) {
+               dbd_error(dbh, rc, "db_login/SQLSetEnvAttr");
+               if (imp_drh->connects == 0) {
+                   SQLFreeEnv(imp_drh->henv);
+                   imp_drh->henv = SQL_NULL_HENV;
+               }
+               return 0;
+           }
+       }
+     }
      imp_dbh->henv = imp_drh->henv;    /* needed for dbd_error */
  
      rc = SQLAllocConnect(imp_drh->henv, &imp_dbh->hdbc);
diff -bc DBD-ODBC-0.38-orig/dbdimp.h DBD-ODBC-0.38/dbdimp.h
*** DBD-ODBC-0.38-orig/dbdimp.h Thu Feb 07 15:50:32 2002
--- DBD-ODBC-0.38/dbdimp.h      Fri Feb 22 21:54:04 2002
***************
*** 131,136 ****
--- 131,137 ----
  
  #define dbd_init              odbc_init
  #define dbd_db_login          odbc_db_login
+ #define dbd_db_login6         odbc_db_login6
  #define dbd_db_do             odbc_db_do
  #define dbd_db_commit         odbc_db_commit
  #define dbd_db_rollback               odbc_db_rollback
Common subdirectories: DBD-ODBC-0.38-orig/iodbcsrc and DBD-ODBC-0.38/iodbcsrc
Common subdirectories: DBD-ODBC-0.38-orig/mytest and DBD-ODBC-0.38/mytest
Common subdirectories: DBD-ODBC-0.38-orig/t and DBD-ODBC-0.38/t

Reply via email to