Skip to Content.
Sympa Menu

freetds - [freetds] SYBINTN support for 64bit integers

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Daniel Drown <dan-freetds AT drown.org>
  • To: freetds AT lists.ibiblio.org
  • Subject: [freetds] SYBINTN support for 64bit integers
  • Date: Mon, 25 Aug 2003 20:42:57 -0400

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.
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;


  • [freetds] SYBINTN support for 64bit integers, Daniel Drown, 08/25/2003

Archive powered by MHonArc 2.6.24.

Top of Page