Re: FreeTDS and PHP: empty strings and NVARCHAR
Mattia <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <CA+heTbrba7i1qXoqoh74n+6oWiTQAQZqTiJ2s5PfBwCoD4i-3g@mail.gmail.com> |
Attachments ;) -- Mattia _______________________________________________ FreeTDS mailing list [email protected] http://lists.ibiblio.org/mailman/listinfo/freetds
freetds092_with_nvarchar.patch
(application/octet-stream, 2.3 KB)
--- php_mssql-orig.c 2011-07-03 06:36:17.486000355 +0200
+++ php_mssql.c 2011-07-03 06:37:03.099000500 +0200
@@ -450,6 +450,7 @@
REGISTER_LONG_CONSTANT("SQLTEXT",SQLTEXT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLVARCHAR",SQLVARCHAR, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("SQLNVARCHAR",SQLNVARCHAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLCHAR",SQLCHAR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLINT1",SQLINT1, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SQLINT2",SQLINT2, CONST_CS | CONST_PERSISTENT);
@@ -937,6 +938,7 @@
}
case SQLCHAR:
case SQLVARCHAR:
+ case SQLNVARCHAR:
case SQLTEXT: {
int length;
char *data = charcol(offset);
@@ -1165,6 +1167,7 @@
case SQLCHAR:
case SQLVARCHAR:
+ case SQLNVARCHAR:
case SQLTEXT:
convert_to_string_ex(&bind->zval);
Z_STRLEN_P(bind->zval) = dbretlen(mssql_ptr->link,i);
@@ -1241,6 +1244,7 @@
break;
case SQLCHAR:
case SQLVARCHAR:
+ case SQLNVARCHAR:
case SQLTEXT:
default:
result->fields[i].numeric = 0;
@@ -1640,6 +1644,7 @@
break;
case SQLCHAR:
case SQLVARCHAR:
+ case SQLNVARCHAR:
return "char";
break;
case SQLTEXT:
@@ -2035,7 +2040,7 @@
mssql_ptr=statement->link;
/* modify datalen and maxlen according to dbrpcparam documentation */
- if ( (type==SQLVARCHAR) || (type==SQLCHAR) || (type==SQLTEXT) ) { /* variable-length type */
+ if ( (type==SQLVARCHAR) || (type==SQLNVARCHAR) || (type==SQLCHAR) || (type==SQLTEXT) ) { /* variable-length type */
if (is_null) {
maxlen=0;
datalen=0;
--- php_mssql-orig.h 2011-07-03 06:36:23.524000769 +0200
+++ php_mssql.h 2011-07-03 06:37:50.705000571 +0200
@@ -35,6 +35,7 @@
#define SQLTEXT SYBTEXT
#define SQLCHAR SYBCHAR
#define SQLVARCHAR SYBVARCHAR
+#define SQLNVARCHAR XSYBNVARCHAR
#define SQLINT1 SYBINT1
#define SQLINT2 SYBINT2
#define SQLINT4 SYBINT4
@@ -65,7 +66,6 @@
#define dbfreelogin dbloginfree
#endif
#define dbrpcexec dbrpcsend
-typedef unsigned char *LPBYTE;
typedef float DBFLT4;
#else
#define MSSQL_VERSION "7.0"
@@ -74,6 +74,7 @@
#define EHANDLEFUNC DBERRHANDLE_PROC
#define MHANDLEFUNC DBMSGHANDLE_PROC
#define DBSETOPT(a, b, c) dbsetopt(a, b, c)
+typedef unsigned char *LPBYTE;
#endif
#define coltype(j) dbcoltype(mssql_ptr->link,j)
nvarchar_export.patch
(application/octet-stream, 448 B)
--- freetds/include/sybdb.h 2011-06-05 11:21:49.000000000 +0200 +++ /usr/local/freetds/include/sybdb.h 2011-07-03 07:39:27.791000516 +0200 @@ -207,8 +207,10 @@ #define SYBMONEYN SYBMONEYN SYBDATETIMN = 111, /* 0x6F */ #define SYBDATETIMN SYBDATETIMN - SYBNVARCHAR = 103 /* 0x67 */ + SYBNVARCHAR = 103, /* 0x67 */ #define SYBNVARCHAR SYBNVARCHAR + XSYBNVARCHAR = 231 /* 0xE7 */ +#define XSYBNVARCHAR XSYBNVARCHAR }; #define SYBAOPCNT 0x4b
empty_string.patch
(application/octet-stream, 1.1 KB)
--- rpc-orig.c 2011-06-18 19:52:24.000000000 +0200
+++ rpc.c 2011-07-03 05:21:13.751000402 +0200
@@ -236,9 +236,11 @@
* If datalen = 0, value parameter is ignored.
* This is one way to specify a NULL input parameter.
*/
+/*
if (datalen == 0)
param->value = NULL;
else
+*/
param->value = value;
/*
@@ -327,9 +329,12 @@
size, curcol->column_data, params->row_size);
if (!row)
return NULL;
- if (size > 0 && value) {
+ if (value) {
tdsdump_log(TDS_DBG_FUNC, "copying %d bytes of data to parameter #%d\n", size, param_num);
- if (!is_blob_col(curcol)) {
+ if (size == 0) {
+ /* data field is empty */
+ }
+ else if (!is_blob_col(curcol)) {
if (is_numeric_type(curcol->column_type))
memset(curcol->column_data, 0, sizeof(TDS_NUMERIC));
memcpy(curcol->column_data, value, size);
@@ -390,7 +395,7 @@
temp_value = p->value;
temp_datalen = p->datalen;
- if (p->datalen == 0)
+ if (p->datalen == 0 && p->value == NULL)
param_is_null = 1;
tdsdump_log(TDS_DBG_INFO1, "parm_info_alloc(): parameter null-ness = %d\n", param_is_null);