mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-11-26 02:09:49 +08:00
Merge pull request #87 from danchr/tweaks+ole
OLE support for the ODBC driver
This commit is contained in:
@@ -54,7 +54,7 @@ if test "$gdu_cv_have_gdu" = "yes"; then
|
|||||||
ifelse([$2],,[:],[$2])
|
ifelse([$2],,[:],[$2])
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
ifelse([$3],,[AC_MSG_ERROR([gnome-doc-utils >= $gdu_cv_version_required not found])],[$3])
|
ifelse([$3],,[:],[$3])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
GNOME_DOC_DEFINES
|
GNOME_DOC_DEFINES
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ typedef struct {
|
|||||||
TypeInfo type_info[] = {
|
TypeInfo type_info[] = {
|
||||||
{(SQLCHAR*)"text", SQL_VARCHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_VARCHAR, NULL, NULL, NULL},
|
{(SQLCHAR*)"text", SQL_VARCHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_VARCHAR, NULL, NULL, NULL},
|
||||||
{(SQLCHAR*)"memo", SQL_VARCHAR, 4096, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 4096, SQL_VARCHAR, NULL, NULL, NULL},
|
{(SQLCHAR*)"memo", SQL_VARCHAR, 4096, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 4096, SQL_VARCHAR, NULL, NULL, NULL},
|
||||||
|
{(SQLCHAR*)"ole", SQL_VARCHAR, MDB_BIND_SIZE, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, MDB_BIND_SIZE, SQL_VARCHAR, NULL, NULL, NULL},
|
||||||
{(SQLCHAR*)"text", SQL_CHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_CHAR, NULL, NULL, NULL},
|
{(SQLCHAR*)"text", SQL_CHAR, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_CHAR, NULL, NULL, NULL},
|
||||||
{(SQLCHAR*)"numeric", SQL_NUMERIC, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_NUMERIC, NULL, NULL, NULL},
|
{(SQLCHAR*)"numeric", SQL_NUMERIC, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_NUMERIC, NULL, NULL, NULL},
|
||||||
{(SQLCHAR*)"numeric", SQL_DECIMAL, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_DECIMAL, NULL, NULL, NULL},
|
{(SQLCHAR*)"numeric", SQL_DECIMAL, 255, NULL, NULL, NULL, SQL_TRUE, SQL_TRUE, SQL_TRUE, NULL, SQL_FALSE, SQL_FALSE, NULL, 0, 255, SQL_DECIMAL, NULL, NULL, NULL},
|
||||||
@@ -1737,7 +1738,7 @@ static SQLRETURN SQL_API _SQLGetData(
|
|||||||
break;
|
break;
|
||||||
case SQL_C_LONG:
|
case SQL_C_LONG:
|
||||||
case SQL_C_SLONG:
|
case SQL_C_SLONG:
|
||||||
if (intValue<LONG_MIN || intValue>LONG_MAX) {
|
if (intValue<INT_MIN || intValue>INT_MAX) {
|
||||||
strcpy(sqlState, "22003"); // Numeric value out of range
|
strcpy(sqlState, "22003"); // Numeric value out of range
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
@@ -1797,35 +1798,48 @@ static SQLRETURN SQL_API _SQLGetData(
|
|||||||
default: /* FIXME here we assume fCType == SQL_C_CHAR */
|
default: /* FIXME here we assume fCType == SQL_C_CHAR */
|
||||||
to_c_char:
|
to_c_char:
|
||||||
{
|
{
|
||||||
char *str = mdb_col_to_string(mdb, mdb->pg_buf,
|
static size_t len = 0;
|
||||||
col->cur_value_start, col->col_type, col->cur_value_len);
|
static char *str = NULL;
|
||||||
int len = strlen(str);
|
|
||||||
|
if (col->col_type == MDB_OLE) {
|
||||||
|
if (stmt->pos == 0) {
|
||||||
|
str = mdb_ole_read_full(mdb, col, &len);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
str = mdb_col_to_string(mdb, mdb->pg_buf,
|
||||||
|
col->cur_value_start, col->col_type, col->cur_value_len);
|
||||||
|
len = strlen(str);
|
||||||
|
}
|
||||||
|
|
||||||
if (stmt->pos >= len) {
|
if (stmt->pos >= len) {
|
||||||
free(str);
|
free(str);
|
||||||
|
str = NULL;
|
||||||
return SQL_NO_DATA;
|
return SQL_NO_DATA;
|
||||||
}
|
}
|
||||||
|
if (pcbValue) {
|
||||||
|
*pcbValue = len;
|
||||||
|
}
|
||||||
if (!cbValueMax) {
|
if (!cbValueMax) {
|
||||||
if (pcbValue)
|
|
||||||
*pcbValue = len;
|
|
||||||
free(str);
|
free(str);
|
||||||
|
str = NULL;
|
||||||
return SQL_SUCCESS_WITH_INFO;
|
return SQL_SUCCESS_WITH_INFO;
|
||||||
}
|
}
|
||||||
if (len - stmt->pos > cbValueMax) {
|
if (len - stmt->pos > cbValueMax) {
|
||||||
/* the buffer we were given is too small, so
|
/* the buffer we were given is too small, so
|
||||||
truncate it to the size of the buffer */
|
truncate it to the size of the buffer */
|
||||||
strncpy(rgbValue, str, cbValueMax);
|
memcpy(rgbValue, str, cbValueMax);
|
||||||
if (pcbValue)
|
stmt->pos += cbValueMax - 1;
|
||||||
*pcbValue = cbValueMax;
|
if (col->col_type != MDB_OLE) { free(str); str = NULL; }
|
||||||
stmt->pos += cbValueMax;
|
|
||||||
free(str);
|
|
||||||
strcpy(sqlState, "01004"); // trunctated
|
strcpy(sqlState, "01004"); // trunctated
|
||||||
return SQL_SUCCESS_WITH_INFO;
|
return SQL_SUCCESS_WITH_INFO;
|
||||||
}
|
}
|
||||||
strncpy(rgbValue, str + stmt->pos, len - stmt->pos);
|
|
||||||
|
memcpy(rgbValue, str + stmt->pos, len - stmt->pos);
|
||||||
if (pcbValue)
|
if (pcbValue)
|
||||||
*pcbValue = len - stmt->pos;
|
*pcbValue = len - stmt->pos;
|
||||||
stmt->pos += len - stmt->pos;
|
stmt->pos += len - stmt->pos;
|
||||||
free(str);
|
free(str);
|
||||||
|
str = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2480,6 +2494,8 @@ static SQLSMALLINT _odbc_get_client_type(MdbColumn *col)
|
|||||||
return SQL_TYPE_TIMESTAMP;
|
return SQL_TYPE_TIMESTAMP;
|
||||||
#endif // returns text otherwise
|
#endif // returns text otherwise
|
||||||
case MDB_TEXT:
|
case MDB_TEXT:
|
||||||
|
case MDB_MEMO:
|
||||||
|
case MDB_OLE:
|
||||||
return SQL_VARCHAR;
|
return SQL_VARCHAR;
|
||||||
default:
|
default:
|
||||||
// fprintf(stderr,"Unknown type %d\n",srv_type);
|
// fprintf(stderr,"Unknown type %d\n",srv_type);
|
||||||
|
|||||||
Reference in New Issue
Block a user