mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-09-19 18:47:54 +08:00
Merge pull request #8 from evanmiller/odbc-fix
Fix for variable-length fields using SQLGetData
This commit is contained in:
70
.travis.yml
70
.travis.yml
@@ -4,28 +4,78 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- compiler: clang
|
- compiler: clang
|
||||||
os: linux
|
os: linux
|
||||||
- compiler: gcc
|
|
||||||
os: linux
|
|
||||||
- compiler: clang
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode11.4
|
|
||||||
- compiler: gcc
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode11.4
|
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
- libiodbc2-dev
|
- libiodbc2-dev
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-iodbc=/usr
|
||||||
|
- compiler: clang
|
||||||
|
os: linux
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- unixodbc-dev
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-unixodbc=/usr
|
||||||
|
- compiler: gcc
|
||||||
|
os: linux
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- libiodbc2-dev
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-iodbc=/usr
|
||||||
|
- compiler: gcc
|
||||||
|
os: linux
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- unixodbc-dev
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-unixodbc=/usr
|
||||||
|
- compiler: clang
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode11.4
|
||||||
|
addons:
|
||||||
homebrew:
|
homebrew:
|
||||||
packages:
|
packages:
|
||||||
- libiodbc
|
- libiodbc
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-iodbc=/usr/local/opt
|
||||||
|
- compiler: clang
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode11.4
|
||||||
|
addons:
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- unixodbc
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-unixodbc=/usr/local/opt
|
||||||
|
- compiler: gcc
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode11.4
|
||||||
|
addons:
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- libiodbc
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-iodbc=/usr/local/opt
|
||||||
|
- compiler: gcc
|
||||||
|
os: osx
|
||||||
|
osx_image: xcode11.4
|
||||||
|
addons:
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- unixodbc
|
||||||
|
env:
|
||||||
|
- CONFIGURE_FLAGS=--with-unixodbc=/usr/local/opt
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- autoreconf -i -f -Wno-portability
|
- autoreconf -i -f -Wno-portability
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- ./configure --disable-man --disable-silent-rules --disable-glib --with-iodbc=/usr
|
- ./configure --disable-man --disable-silent-rules --disable-glib $CONFIGURE_FLAGS
|
||||||
- make
|
- make
|
||||||
- ./src/util/mdb-array test/data/ASampleDatabase.accdb "Asset Items"
|
- ./src/util/mdb-array test/data/ASampleDatabase.accdb "Asset Items"
|
||||||
- ./src/util/mdb-array test/data/nwind.mdb "Customers"
|
- ./src/util/mdb-array test/data/nwind.mdb "Customers"
|
||||||
|
@@ -120,6 +120,11 @@ if test "$with_unixodbc"; then
|
|||||||
ODBC_LIBS="-L$with_unixodbc/lib"
|
ODBC_LIBS="-L$with_unixodbc/lib"
|
||||||
CFLAGS="$CFLAGS -DUNIXODBC"
|
CFLAGS="$CFLAGS -DUNIXODBC"
|
||||||
|
|
||||||
|
dnl SIZEOF_LONG_INT and HAVE_LONG_LONG are required by some versions of unixODBC
|
||||||
|
dnl https://github.com/lurcher/unixODBC/issues/40
|
||||||
|
AC_CHECK_SIZEOF([long int])
|
||||||
|
AC_CHECK_TYPES([long long])
|
||||||
|
|
||||||
OLDLDFLAGS=$LDFLAGS
|
OLDLDFLAGS=$LDFLAGS
|
||||||
LDFLAGS="$LDFLAGS $ODBC_LIBS"
|
LDFLAGS="$LDFLAGS $ODBC_LIBS"
|
||||||
AC_CHECK_LIB(odbcinst, SQLGetPrivateProfileString,
|
AC_CHECK_LIB(odbcinst, SQLGetPrivateProfileString,
|
||||||
|
@@ -1634,28 +1634,29 @@ SQLRETURN SQL_API SQLGetData(
|
|||||||
str = NULL;
|
str = NULL;
|
||||||
return SQL_NO_DATA;
|
return SQL_NO_DATA;
|
||||||
}
|
}
|
||||||
if (pcbValue) {
|
if (cbValueMax < 0) {
|
||||||
*pcbValue = len;
|
strcpy(sqlState, "HY090"); // Invalid string or buffer length
|
||||||
|
free(str);
|
||||||
|
str = NULL;
|
||||||
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
if (!cbValueMax) {
|
if (pcbValue) {
|
||||||
|
*pcbValue = len + 1 - stmt->pos;
|
||||||
|
}
|
||||||
|
if (cbValueMax == 0) {
|
||||||
free(str);
|
free(str);
|
||||||
str = NULL;
|
str = NULL;
|
||||||
return SQL_SUCCESS_WITH_INFO;
|
return SQL_SUCCESS_WITH_INFO;
|
||||||
}
|
}
|
||||||
if (len - stmt->pos > cbValueMax) {
|
|
||||||
/* the buffer we were given is too small, so
|
memcpy(rgbValue, str + stmt->pos, MIN(len - stmt->pos, cbValueMax-1));
|
||||||
truncate it to the size of the buffer */
|
((char *)rgbValue)[MIN(len - stmt->pos, cbValueMax-1)] = '\0';
|
||||||
memcpy(rgbValue, str, cbValueMax);
|
stmt->pos += MIN(len - stmt->pos, cbValueMax-1);
|
||||||
stmt->pos += cbValueMax - 1;
|
if (cbValueMax - 1 < len - stmt->pos) {
|
||||||
if (col->col_type != MDB_OLE) { free(str); str = NULL; }
|
if (col->col_type != MDB_OLE) { free(str); str = NULL; }
|
||||||
strcpy(sqlState, "01004"); // trunctated
|
strcpy(sqlState, "01004"); // truncated
|
||||||
return SQL_SUCCESS_WITH_INFO;
|
return SQL_SUCCESS_WITH_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(rgbValue, str + stmt->pos, len - stmt->pos);
|
|
||||||
if (pcbValue)
|
|
||||||
*pcbValue = len - stmt->pos;
|
|
||||||
stmt->pos += len - stmt->pos;
|
|
||||||
free(str);
|
free(str);
|
||||||
str = NULL;
|
str = NULL;
|
||||||
break;
|
break;
|
||||||
|
@@ -174,7 +174,7 @@ int i;
|
|||||||
szSqlState, szErrorMsg);
|
szSqlState, szErrorMsg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
SQLBindCol(hstmt, 3, SQL_CHAR, szCol1, 60, &length);
|
SQLBindCol(hstmt, 3, SQL_CHAR, szCol1, sizeof(szCol1), &length);
|
||||||
//SQLBindCol(hstmt, 1, SQL_CHAR, szCol1, 60, NULL);
|
//SQLBindCol(hstmt, 1, SQL_CHAR, szCol1, 60, NULL);
|
||||||
|
|
||||||
/* Execute statement with first row. */
|
/* Execute statement with first row. */
|
||||||
|
Reference in New Issue
Block a user