freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
[freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib
- From: martin.wilck AT ts.fujitsu.com
- To: FreeTDS AT lists.ibiblio.org
- Subject: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib
- Date: Fri, 26 Oct 2012 16:40:01 +0200
Hello,
I have a problem using python-sybase with a MS-SQL Server data base (TDS 7.1).
cursor.execute() aborts with the error message
"sp_cursoropen: The value of the parameter 'scrollopt' is invalid.".
The same problem has been reported a long time ago already:
https://sourceforge.net/mailarchive/forum.php?thread_name=5c06fa770907291200w5e7aeb3akaba12ab95d419785%40mail.gmail.com&forum_name=python-sybase-misc
As correctly stated there, the problem occurs with python-sybase v0.39 and
later only. This is due to the fact that python-sybase started to use
the ct_cursor() API in 0.39. But that's not a bug of python-sybase.
I analyzed the problem and I found that FreeTDS ctlib code sends a value
of 0 for cursor->type and cursor->concurrency to the server, which is
invalid. It appears that these two fields are never properly initialized
in ctlib. The ODBC code (odbc.c) has code that initializes these fields.
Below is a suggested patch that sets the default values as documented.
in http://jtds.sourceforge.net/apiCursors.html. Please review.
The patch was made against FreeTDS 0.91-3 (Fedora 17).
Best regards
Martin
diff -rup freetds-0.91.orig/include/tds.h freetds-0.91/include/tds.h
--- freetds-0.91.orig/include/tds.h 2011-08-18 03:54:41.000000000 +0200
+++ freetds-0.91/include/tds.h 2012-10-26 15:50:08.000000000 +0200
@@ -378,6 +378,25 @@ enum {
TDS_CUR_ISTAT_DEALLOC = 0x40
};
+/* http://jtds.sourceforge.net/apiCursors.html */
+/* Cursor scroll option, must be one of 0x01 - 0x10, OR'd with other bits */
+enum {
+ TDS_CUR_TYPE_KEYSET = 0x0001, /* default */
+ TDS_CUR_TYPE_DYNAMIC = 0x0002,
+ TDS_CUR_TYPE_FORWARD = 0x0004,
+ TDS_CUR_TYPE_STATIC = 0x0008,
+ TDS_CUR_TYPE_FASTFORWARDONLY = 0x0010,
+ TDS_CUR_TYPE_PARAMETERIZED = 0x1000,
+ TDS_CUR_TYPE_AUTO_FETCH = 0x2000
+};
+
+enum {
+ TDS_CUR_CONCUR_READ_ONLY = 1,
+ TDS_CUR_CONCUR_SCROLL_LOCKS = 2,
+ TDS_CUR_CONCUR_OPTIMISTIC = 4, /* default */
+ TDS_CUR_CONCUR_OPTIMISTIC_VALUES = 8
+};
+
/* environment type field */
#define TDS_ENV_DATABASE 1
#define TDS_ENV_LANG 2
Only in freetds-0.91/include: tds.h~
diff -rup freetds-0.91.orig/src/ctlib/ct.c freetds-0.91/src/ctlib/ct.c
--- freetds-0.91.orig/src/ctlib/ct.c 2010-10-05 10:36:36.000000000 +0200
+++ freetds-0.91/src/ctlib/ct.c 2012-10-26 15:55:38.000000000 +0200
@@ -3704,6 +3704,8 @@ ct_cursor(CS_COMMAND * cmd, CS_INT type,
cursor->status.fetch = _CS_CURS_TYPE_UNACTIONED;
cursor->status.close = _CS_CURS_TYPE_UNACTIONED;
cursor->status.dealloc = _CS_CURS_TYPE_UNACTIONED;
+ cursor->type = TDS_CUR_TYPE_KEYSET;
+ cursor->concurrency = TDS_CUR_CONCUR_OPTIMISTIC;
cmd->cursor = cursor;
ct_set_command_state(cmd, _CS_COMMAND_READY);
-
[freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
martin . wilck, 10/26/2012
- Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib, Frediano Ziglio, 10/26/2012
-
Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
Frediano Ziglio, 10/26/2012
-
Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
Martin Wilck, 10/31/2012
-
Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
Frediano Ziglio, 10/31/2012
- Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib, Martin Wilck, 10/31/2012
-
Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
Frediano Ziglio, 10/31/2012
-
Re: [freetds] [PATCH] fix defaults for cursor type and concurrency in ctlib,
Martin Wilck, 10/31/2012
Archive powered by MHonArc 2.6.24.