--- /dev/null
+diff -NurdB libgda-1.2.4/configure.in libgda-1.2.4-patched/configure.in
+--- libgda-1.2.4/configure.in 2007-01-09 07:51:03.000000000 -0500
++++ libgda-1.2.4-patched/configure.in 2007-01-16 23:38:28.000000000 -0500
+@@ -440,45 +440,23 @@
+ AC_MSG_WARN(tds backend not used)
+ else
+ AC_MSG_CHECKING(for freetds version)
+- freetdsvercheck="`grep \"^#define \(VERSION_NO \|TDS_VERSION_NO \)\" $freetds_incdir/tdsver.h|sed 's|^.*"\(.*\)"|\1|'`"
++ freetdsvercheck="`grep \"^#define \(VERSION_NO \|TDS_VERSION_NO \)\" $freetds_incdir/tdsver.h|sed 's|^.*".*v\(.*\)"|\1|'`"
+ if test "x$freetdsvercheck" = "x"
+ then
+ AC_MSG_WARN(freetds version check failed - backend not used)
+ freetdsdir=""
+ freetds_incdir=""
+ else
+- case "$freetdsvercheck" in
+- *v0.5*) AC_MSG_RESULT($freetdsvercheck - using v0.5x api)
+- AC_DEFINE(HAVE_FREETDS_VER0_5X, 1, [Have freetds v0.5x API])
+- FREETDS_CFLAGS="-I${freetds_incdir}"
+- FREETDS_LIBS="-L${freetdsdir}/lib -ltds"
+- AC_DEFINE(HAVE_FREETDS, 1, [Have freetds])
+- ;;
+- *v0.60) AC_MSG_RESULT($freetdsvercheck - using v0.60 api)
+- AC_DEFINE(HAVE_FREETDS_VER0_60, 1, [Have freetds v0.60 API])
+- FREETDS_CFLAGS="-I${freetds_incdir}"
+- FREETDS_LIBS="-L${freetdsdir}/lib -ltds"
+- AC_DEFINE(HAVE_FREETDS, 1, [Have freetds])
+- ;;
+- *v0.6[[3-9]]*) AC_MSG_RESULT($freetdsvercheck - using v0.63 api)
+- AC_DEFINE(HAVE_FREETDS_VER0_63, 1, [Have freetds v0.63 API])
+- AC_DEFINE(HAVE_FREETDS_VER0_6X, 1, [Have freetds v0.6x API])
+- FREETDS_CFLAGS="-I${freetds_incdir}"
+- FREETDS_LIBS="-L${freetdsdir}/lib -ltds"
+- AC_DEFINE(HAVE_FREETDS, 1, [Have freetds])
+- ;;
+- *v0.6*) AC_MSG_RESULT($freetdsvercheck - using v0.6x api)
+- AC_DEFINE(HAVE_FREETDS_VER0_6X, 1, [Have freetds v0.6x API])
+- FREETDS_CFLAGS="-I${freetds_incdir}"
+- FREETDS_LIBS="-L${freetdsdir}/lib -ltds"
+- AC_DEFINE(HAVE_FREETDS, 1, [Have freetds])
+- ;;
+- *) AC_MSG_WARN($freetdsvercheck not supported - backend not used)
+- freetdsdir=""
+- freetds_incdir=""
+- ;;
+- esac
+-
++ AC_MSG_RESULT($freetdsvercheck)
++ FREETDS_CFLAGS="-I${freetds_incdir}"
++ FREETDS_LIBS="-L${freetdsdir}/lib -ltds"
++ AC_DEFINE(HAVE_FREETDS, 1, [Have freetds])
++
++ freetds_version_major="`echo $freetdsvercheck|sed 's:^\([[^.]]*\).*:\1:'`"
++ freetds_version_minor="`echo $freetdsvercheck|sed 's:^[[^.]]*\.\([[^.]]*\).*:\1:'`"
++
++ AC_DEFINE_UNQUOTED(FREETDS_VERSION_MAJOR, [$freetds_version_major])
++ AC_DEFINE_UNQUOTED(FREETDS_VERSION_MINOR, [$freetds_version_minor])
+ fi
+ fi
+ fi
+diff -NurdB libgda-1.2.4/providers/freetds/gda-freetds-provider.c libgda-1.2.4-patched/providers/freetds/gda-freetds-provider.c
+--- libgda-1.2.4/providers/freetds/gda-freetds-provider.c 2007-01-09 07:50:54.000000000 -0500
++++ libgda-1.2.4-patched/providers/freetds/gda-freetds-provider.c 2007-01-16 23:52:17.000000000 -0500
+@@ -103,7 +103,7 @@
+ const gint col,
+ const gint row);
+
+-#ifdef HAVE_FREETDS_VER0_5X
++#if FREETDS_VERSION < 6000
+ static gboolean tds_cbs_initialized = FALSE;
+ extern int (*g_tds_msg_handler)();
+ extern int (*g_tds_err_handler)();
+@@ -116,7 +116,7 @@
+ static int gda_freetds_provider_tds_handle_message (void *aStruct,
+ void *bStruct,
+ const gboolean is_err_msg);
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
+ static int gda_freetds_provider_tds_handle_info_msg (TDSCONTEXT *,
+ TDSSOCKET *,
+ TDSMSGINFO *);
+@@ -252,8 +252,12 @@
+ tds_set_packet(tds_cnc->login, 512);
+
+ /* Version 0.60 api uses context additionaly */
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
++#if FREETDS_VERSION >= 6400
++ tds_cnc->ctx = tds_alloc_context(NULL);
++#else
+ tds_cnc->ctx = tds_alloc_context();
++#endif
+ if (! tds_cnc->ctx) {
+ gda_log_error (_("Allocating tds context failed."));
+ gda_freetds_free_connection_data (tds_cnc);
+@@ -267,9 +271,9 @@
+ #endif
+
+ /* establish connection; change in 0.6x api */
+-#if defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION == 6000
+ tds_cnc->tds = tds_connect(tds_cnc->login, tds_cnc->ctx, NULL);
+-#elif defined(HAVE_FREETDS_VER0_6X)
++#elif FREETDS_VERSION > 6000
+ tds_cnc->tds = tds_alloc_socket(tds_cnc->ctx, 512);
+ if (! tds_cnc->tds) {
+ gda_log_error (_("Allocating tds socket failed."));
+@@ -297,9 +301,9 @@
+ }
+
+ /* try to receive connection info for sanity check */
+-#if defined(HAVE_FREETDS_VER0_6X)
++#if FREETDS_VERSION > 6000
+ /* do nothing */
+-#elif defined(HAVE_FREETDS_VER0_60)
++#elif FREETDS_VERSION == 6000
+ tds_cnc->config = tds_get_config(tds_cnc->tds, tds_cnc->login, tds_cnc->ctx->locale);
+ #else
+ tds_cnc->config = tds_get_config(tds_cnc->tds, tds_cnc->login);
+@@ -357,9 +361,9 @@
+ tds_cnc->database = NULL;
+ }
+ if (tds_cnc->config) {
+-#ifdef HAVE_FREETDS_VER0_63
++#if FREETDS_VERSION >= 6300
+ tds_free_connection (tds_cnc->config);
+-#elif defined(HAVE_FREETDS_VER0_6X)
++#elif FREETDS_VERSION > 6000
+ tds_free_connect (tds_cnc->config);
+ #else
+ tds_free_config(tds_cnc->config);
+@@ -372,7 +376,7 @@
+ tds_free_socket (tds_cnc->tds);
+ tds_cnc->tds = NULL;
+ }
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
+ if (tds_cnc->ctx) {
+ /* Clear callback handler */
+ tds_cnc->ctx->msg_handler = NULL;
+@@ -784,7 +788,7 @@
+ {
+ GdaFreeTDSConnectionData *tds_cnc;
+ GdaError *error;
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ int result_type = 0;
+ #endif
+
+@@ -804,9 +808,11 @@
+ }
+
+ /* there should not be any result tokens */
+-#if defined(HAVE_FREETDS_VER0_63)
++#if FREETDS_VERSION >= 6400
++ while ((tds_cnc->rc = tds_process_tokens (tds_cnc->tds, &tds_cnc->result_type, NULL, TDS_RETURN_ROWFMT | TDS_RETURN_COMPUTEFMT | TDS_RETURN_DONE | TDS_STOPAT_ROW | TDS_STOPAT_COMPUTE | TDS_RETURN_PROC))
++#elif FREETDS_VERSION >= 6200
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds, &tds_cnc->result_type, NULL))
+-#elif defined(HAVE_FREETDS_VER0_6X)
++#elif FREETDS_VERSION > 6000
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds, &tds_cnc->result_type))
+ #else
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds))
+@@ -1006,7 +1012,7 @@
+ provider_class->supports = gda_freetds_provider_supports;
+ provider_class->get_schema = gda_freetds_provider_get_schema;
+
+-#ifdef HAVE_FREETDS_VER0_5X
++#if FREETDS_VERSION < 6000
+ if (tds_cbs_initialized == FALSE) {
+ tds_cbs_initialized = TRUE;
+
+@@ -1029,7 +1035,7 @@
+
+ g_return_if_fail (GDA_IS_FREETDS_PROVIDER (provider));
+
+-#ifdef HAVE_FREETDS_VER0_5X
++#if FREETDS_VERSION < 6000
+ tds_cbs_initialized = FALSE;
+ g_tds_msg_handler = NULL;
+ g_tds_err_handler = NULL;
+@@ -1062,9 +1068,15 @@
+ TDS_SUCCEED);
+
+ msg = g_strdup_printf(_("Msg %d, Level %d, State %d, Server %s, Line %d\n%s\n"),
++#if FREETDS_VERSION >= 6400
++ msg_info->msgno,
++ msg_info->severity,
++ msg_info->state,
++#else
+ msg_info->msg_number,
+ msg_info->msg_level,
+ msg_info->msg_state,
++#endif
+ (msg_info->server ? msg_info->server : ""),
+ msg_info->line_number,
+ msg_info->message ? msg_info->message : "");
+@@ -1074,7 +1086,11 @@
+ if (cnc != NULL) {
+ error = gda_error_new ();
+ gda_error_set_description (error, msg);
++#if FREETDS_VERSION >= 6400
++ gda_error_set_number (error, msg_info->msgno);
++#else
+ gda_error_set_number (error, msg_info->msg_number);
++#endif
+ gda_error_set_source (error, "gda-freetds");
+ if (msg_info->sql_state != NULL) {
+ gda_error_set_sqlstate (error,
+@@ -1099,14 +1115,14 @@
+ return TDS_SUCCEED;
+ }
+
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
+ /* FIXME: rewrite tds_handle_message as well/use new parameters here */
+ static int
+ gda_freetds_provider_tds_handle_info_msg (TDSCONTEXT *ctx, TDSSOCKET *tds,
+ TDSMSGINFO *msg)
+ {
+ return gda_freetds_provider_tds_handle_message ((void *) tds,
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ (void *) msg,
+ #else
+ (void *) tds->msg_info,
+@@ -1121,14 +1137,14 @@
+ }
+ #endif
+
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
+ /* FIXME: rewrite tds_handle_message as well/use new parameters here */
+ static int
+ gda_freetds_provider_tds_handle_err_msg (TDSCONTEXT *ctx, TDSSOCKET *tds,
+ TDSMSGINFO *msg)
+ {
+ return gda_freetds_provider_tds_handle_message ((void *) tds,
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ (void *) msg,
+ #else
+ (void *) tds->msg_info,
+diff -NurdB libgda-1.2.4/providers/freetds/gda-freetds-provider.h libgda-1.2.4-patched/providers/freetds/gda-freetds-provider.h
+--- libgda-1.2.4/providers/freetds/gda-freetds-provider.h 2007-01-09 07:50:54.000000000 -0500
++++ libgda-1.2.4-patched/providers/freetds/gda-freetds-provider.h 2007-01-16 23:38:28.000000000 -0500
+@@ -30,14 +30,16 @@
+
+ G_BEGIN_DECLS
+
++#define FREETDS_VERSION (10000*FREETDS_VERSION_MAJOR+100*FREETDS_VERSION_MINOR)
++
+ /* Compatibility macros */
+-#ifdef HAVE_FREETDS_VER0_63
++#if FREETDS_VERSION >= 6300
+
+ #define TDSCONNECTINFO TDSCONNECTION
+ #define TDSCOLINFO TDSCOLUMN
+ #define TDSMSGINFO TDSMESSAGE
+
+-#endif /* HAVE_FREETDS_VER0_63 */
++#endif /* FREETDS_VERSION >= 6300 */
+
+ #define GDA_TYPE_FREETDS_PROVIDER (gda_freetds_provider_get_type())
+ #define GDA_FREETDS_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GDA_TYPE_FREETDS_PROVIDER, GdaFreeTDSProvider))
+@@ -68,11 +70,11 @@
+ gchar *database; /* database we are connected to */
+
+ TDSLOGIN *login; /* tds login struct */
+-#if defined(HAVE_FREETDS_VER0_6X) || defined(HAVE_FREETDS_VER0_60)
++#if FREETDS_VERSION >= 6000
+ TDSCONTEXT *ctx; /* tds context */
+ #endif
+ TDSSOCKET *tds; /* connection handle */
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ TDSCONNECTINFO *config; /* tds connect struct */
+ #else
+ TDSCONFIGINFO *config; /* tds config struct */
+diff -NurdB libgda-1.2.4/providers/freetds/gda-freetds-recordset.c libgda-1.2.4-patched/providers/freetds/gda-freetds-recordset.c
+--- libgda-1.2.4/providers/freetds/gda-freetds-recordset.c 2007-01-09 07:50:54.000000000 -0500
++++ libgda-1.2.4-patched/providers/freetds/gda-freetds-recordset.c 2007-01-17 00:53:55.000000000 -0500
+@@ -279,7 +279,7 @@
+
+ /* set pointers to NULL */
+ copy->column_nullbind = NULL;
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ copy->column_varaddr = NULL;
+ #else
+ copy->varaddr = NULL;
+@@ -339,7 +339,17 @@
+ recset->priv->tds_cnc = tds_cnc;
+ recset->priv->res = tds_cnc->tds->res_info;
+
+-#ifdef HAVE_FREETDS_VER0_63
++#if FREETDS_VERSION >= 6400
++ while ((tds_cnc->rc = tds_process_tokens (tds_cnc->tds,
++ &tds_cnc->result_type, NULL, TDS_RETURN_ROWFMT |
++ TDS_RETURN_COMPUTEFMT | TDS_RETURN_DONE | TDS_STOPAT_ROW |
++ TDS_STOPAT_COMPUTE | TDS_RETURN_PROC))
++ == TDS_SUCCEED) {
++ if (tds_cnc->result_type == TDS_ROW_RESULT) {
++ gint row_type, compute_id;
++
++ while ((tds_cnc->rc = tds_process_row_tokens(tds_cnc->tds, &row_type, &compute_id))
++#elif FREETDS_VERSION >= 6200
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds,
+ &tds_cnc->result_type, NULL))
+ == TDS_SUCCEED) {
+@@ -347,7 +357,7 @@
+ gint row_type, compute_id;
+
+ while ((tds_cnc->rc = tds_process_row_tokens(tds_cnc->tds, &row_type, &compute_id))
+-#elif defined(HAVE_FREETDS_VER0_6X)
++#elif FREETDS_VERSION > 6000
+ while ((tds_cnc->rc = tds_process_result_tokens (tds_cnc->tds,
+ &tds_cnc->result_type))
+ == TDS_SUCCEED) {
+@@ -386,7 +396,11 @@
+ g_object_unref (recset);
+ recset = NULL;
+ return NULL;
++#if FREETDS_VERSION >= 6400
++ } else if (tds_cnc->rc != TDS_NO_MORE_RESULTS) {
++#else
+ } else if (tds_cnc->rc != TDS_NO_MORE_ROWS) {
++#endif
+ error = gda_freetds_make_error(tds_cnc->tds,
+ _("Unexpected freetds return code in tds_process_row_tokens().\n"));
+ gda_connection_add_error (cnc, error);
+diff -NurdB libgda-1.2.4/providers/freetds/gda-freetds-types.c libgda-1.2.4-patched/providers/freetds/gda-freetds-types.c
+--- libgda-1.2.4/providers/freetds/gda-freetds-types.c 2007-01-09 07:50:54.000000000 -0500
++++ libgda-1.2.4-patched/providers/freetds/gda-freetds-types.c 2007-01-16 23:38:28.000000000 -0500
+@@ -191,7 +191,7 @@
+ const TDS_INT max_size = 255;
+ TDS_INT col_size = 0;
+ gchar *txt = NULL;
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ CONV_RESULT tds_conv;
+ #endif
+ GdaNumeric numeric;
+@@ -202,7 +202,7 @@
+ /* perhaps remove ifdef later on
+ * tds_cnc is just needed for context structure of 0.6x api for now
+ */
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ g_return_if_fail (tds_cnc != NULL);
+ g_return_if_fail (tds_cnc->ctx != NULL);
+
+@@ -309,7 +309,7 @@
+ txt = g_new0 (gchar, col_size);
+
+ /* tds_convert api changed to 0.6x */
+-#ifdef HAVE_FREETDS_VER0_6X
++#if FREETDS_VERSION > 6000
+ if (tds_convert (tds_cnc->ctx,
+ col->column_type, val,
+ col->column_size, SYBCHAR,
+@@ -319,7 +319,7 @@
+ gda_value_set_string (field,
+ (tds_conv.c ? tds_conv.c : (tds_conv.ib ? tds_conv.ib : "")));
+ }
+-#elif HAVE_FREETDS_VER0_60
++#elif FREETDS_VERSION == 6000
+ tds_convert (tds_cnc->ctx,
+ col->column_type, val,
+ col->column_size, SYBCHAR,