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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.