[freetds] SYBINTN support for 64bit integers

Daniel Drown dan-freetds at drown.org
Mon Aug 25 21:42:57 EDT 2003


Attached is a patch against current cvs to add the functionality to get rid of
the message:
Unknown size 8 for SYBINTN

After applying this patch (and a one-liner for DBD::Sybase), I am able to use
64bit integers against a MS SQL 2000 db from perl.  My only concern with it
is:

#define CS_LONGLONG_TYPE 28   /* XXX: I made this number up */
(in include/cspublic.h)

Are these numbers defined anywhere else? are they used on the wire?

-- 
I think the internet should shut down at night
	- v.
-------------- next part --------------
Index: include/cspublic.h
===================================================================
RCS file: /cvsroot/freetds/freetds/include/cspublic.h,v
retrieving revision 1.41
diff -u -r1.41 cspublic.h
--- include/cspublic.h	18 Aug 2003 09:35:45 -0000	1.41
+++ include/cspublic.h	26 Aug 2003 00:50:53 -0000
@@ -706,6 +706,7 @@
 #define CS_VOID_TYPE	25
 #define CS_USHORT_TYPE	26
 #define CS_UNIQUE_TYPE	27
+#define CS_LONGLONG_TYPE 28   /* XXX: I made this number up */
 
 /* cs_dt_info type values */
 enum
Index: src/ctlib/cs.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/ctlib/cs.c,v
retrieving revision 1.41
diff -u -r1.41 cs.c
--- src/ctlib/cs.c	22 May 2003 18:41:54 -0000	1.41
+++ src/ctlib/cs.c	26 Aug 2003 00:50:54 -0000
@@ -426,6 +426,7 @@
 		case SYBINT1:
 		case SYBINT2:
 		case SYBINT4:
+                case SYBINT8:
 		case SYBFLT8:
 		case SYBREAL:
 		case SYBBIT:
@@ -543,6 +544,12 @@
 		memcpy(dest, &(cres.i), 4);
 		if (resultlen != (CS_INT *) NULL)
 			*resultlen = 4;
+		ret = CS_SUCCEED;
+		break;
+        case SYBINT8:
+                memcpy(dest,&(cres.bi),8);
+                if (resultlen != (CS_INT *)NULL )
+                	*resultlen = 8;
 		ret = CS_SUCCEED;
 		break;
 	case SYBFLT8:
Index: src/ctlib/ct.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/ctlib/ct.c,v
retrieving revision 1.102
diff -u -r1.102 ct.c
--- src/ctlib/ct.c	6 Aug 2003 03:46:33 -0000	1.102
+++ src/ctlib/ct.c	26 Aug 2003 00:50:55 -0000
@@ -1167,6 +1167,9 @@
 	case SYBVARCHAR:
 		return CS_CHAR_TYPE;
 		break;
+        case SYBINT8:
+                return CS_LONGLONG_TYPE;
+                break;
 	case SYBINT4:
 		return CS_INT_TYPE;
 		break;
@@ -1177,7 +1180,9 @@
 		return CS_TINYINT_TYPE;
 		break;
 	case SYBINTN:
-		if (size == 4) {
+                if (size == 8) {
+                	return CS_LONGLONG_TYPE;
+                } else if (size == 4) {
 			return CS_INT_TYPE;
 		} else if (size == 2) {
 			return CS_SMALLINT_TYPE;
@@ -1273,6 +1278,9 @@
 	case CS_CHAR_TYPE:
 		return SYBCHAR;
 		break;
+        case CS_LONGLONG_TYPE:
+                return SYBINT8;
+                break;
 	case CS_INT_TYPE:
 		return SYBINT4;
 		break;
Index: src/dblib/bcp.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/dblib/bcp.c,v
retrieving revision 1.72
diff -u -r1.72 bcp.c
--- src/dblib/bcp.c	11 Jun 2003 20:10:40 -0000	1.72
+++ src/dblib/bcp.c	26 Aug 2003 00:50:55 -0000
@@ -622,6 +622,9 @@
 				case SYBINT4:
 					buflen = destlen = 4;
 					break;
+                                case SYBINT8:
+                                        buflen = destlen = 8;
+                                        break;
 				case SYBREAL:
 					buflen = destlen = 4;
 					break;
@@ -670,6 +673,10 @@
 						buflen = 11 + 1;	/* -2147483648  */
 						destlen = -1;
 						break;
+                                        case SYBINT8:
+                                                buflen = 20 + 1; /* -9223372036854775808 */
+                                                destlen = -1;
+                                                break;
 					case SYBNUMERIC:
 						buflen = 40 + 1;	/* 10 to the 38 */
 						destlen = -1;
@@ -2092,6 +2099,8 @@
 				ci->datatype = SYBINT2;
 			else if (strcmp(tok, "SYBINT4") == 0)
 				ci->datatype = SYBINT4;
+			else if (strcmp(tok, "SYBINT8") == 0)
+				ci->datatype = SYBINT8;
 			else if (strcmp(tok, "SYBFLT8") == 0)
 				ci->datatype = SYBFLT8;
 			else if (strcmp(tok, "SYBREAL") == 0)
Index: src/dblib/dblib.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/dblib/dblib.c,v
retrieving revision 1.153
diff -u -r1.153 dblib.c
--- src/dblib/dblib.c	30 Jul 2003 06:18:59 -0000	1.153
+++ src/dblib/dblib.c	26 Aug 2003 00:50:56 -0000
@@ -1847,6 +1847,10 @@
 		memcpy(dest, &(dres.bi), 8);
 		ret = 8;
 		break;
+        case SYBINT8:
+                memcpy(dest,&(dres.bi), 8);
+                ret = 8;
+                break;
 	case SYBFLT8:
 		memcpy(dest, &(dres.f), 8);
 		ret = 8;
@@ -3432,7 +3436,9 @@
 		else if (colinfo->column_size == 4)
 			return SYBREAL;
 	case SYBINTN:
-		if (colinfo->column_size == 4)
+                if (colinfo->column_size == 8)
+                	return SYBINT8;
+                else if (colinfo->column_size == 4)
 			return SYBINT4;
 		else if (colinfo->column_size == 2)
 			return SYBINT2;


More information about the FreeTDS mailing list