Re: Status of support for Time type
Eduard Heimann <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Organization | PE-Fittinge |
| Message-ID | <[email protected]> |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 05/04/13 18:51, James K. Lowden wrote: > On Sat, 04 May 2013 18:04:03 +0200 Eduard Heimann <[email protected]> > wrote: > >> Please help me to integrate my fix into the mainline of freetds. I have >> no experience with this kind of distributed development. > > Thank you for reporting the problem and developing a fix. :-) > > The most developer-friendly way to supply a patch is with "git diff". If > you're not using git, "diff -u oldfile newfile > file.diff" works, too. > > As a last resort, simply attached your modified file to a message you post > here. > > It helps if the file is an *attachment* because email systems often wrap > long lines in the code, something that can be undone only by hand. > > Provided we agree with with your assessment and solution, we'll update the > master git branch. Usually someone gets around to it within a week or so. > > > --jkl _______________________________________________ FreeTDS mailing list > [email protected] > http://lists.ibiblio.org/mailman/listinfo/freetds > > Description of this fix for freetds: BCP-copying wide rows (>255 bytes, from file into server-table) results in an error in bcp_sendrow() and a bogus state in Sybase SQL Server. Tested against Server 10.2/32bit and Server 12.4/64bit. This patch is a result of reverse-engineering Sybase's bcp-library on datastream level. - -- Eduard Heimann, Hörmannsdorf 9, D-94104 Tittling Tel: 08504 955249 Fax: 08504 955248 Mail mailto:[email protected] Web: http://www.pe-fittinge.de Eine Haustüre ohne Schloß ist wie eMail ohne http://www.GNUPG.org GPG key ID: 0xB542BD21 http://keyserver.ubuntu.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iEYEARECAAYFAlGGE2UACgkQUzMNXFvaJEbHPACeI+qOPGQxWNRnCY4/wyN4lOx4 KvIAn06JlDuVwLo+qVK3dpXXMO/s1mLq =p3R8 -----END PGP SIGNATURE----- _______________________________________________ FreeTDS mailing list [email protected] http://lists.ibiblio.org/mailman/listinfo/freetds
freetds.diff
(text/x-patch, 4.2 KB)
diff -ur freetds-0.91.dev.20120624-bcpfix/include/tds.h freetds-0.91.dev.20120624/include/tds.h
--- freetds-0.91.dev.20120624-bcpfix/include/tds.h 2013-01-08 20:46:30.000000000 +0100
+++ freetds-0.91.dev.20120624/include/tds.h 2011-08-12 18:29:36.000000000 +0200
@@ -716,13 +716,13 @@
x==SYBVOID || \
x==SYBUNIQUE)
#define is_nullable_type(x) ( \
- x==SYBBITN || \
+ x==SYBBITN || \
x==SYBINTN || \
x==SYBFLTN || \
x==SYBMONEYN || \
x==SYBDATETIMN || \
x==SYBVARCHAR || \
- /*EVEVEV x==SYBBINARY ||*/ \
+ x==SYBBINARY || \
x==SYBVARBINARY || \
x==SYBTEXT || \
x==SYBNTEXT || \
diff -ur freetds-0.91.dev.20120624-bcpfix/src/tds/bulk.c freetds-0.91.dev.20120624/src/tds/bulk.c
--- freetds-0.91.dev.20120624-bcpfix/src/tds/bulk.c 2013-05-05 08:42:37.000000000 +0200
+++ freetds-0.91.dev.20120624/src/tds/bulk.c 2011-06-02 21:19:30.000000000 +0200
@@ -584,23 +584,19 @@
if ((get_col_data(bcpinfo, bindcol, offset)) != TDS_SUCCEED) {
return TDS_FAIL;
}
- /* maybe the same code in bcp_moretext ? */
- tdsdump_log(TDS_DBG_INFO1, "is_blob_type col=%u datalen=%u data=%x\n",
- i, bindcol->bcp_column_data->datalen, bindcol->bcp_column_data->data);
- if (bindcol->bcp_column_data->datalen && bindcol->bcp_column_data->data) {
- /* unknown but zero */
- tds_put_smallint(tds, 0);
- tds_put_byte(tds, bindcol->column_type);
- tds_put_byte(tds, 0xff - blob_cols);
- /*
- * offset of txptr we stashed during variable
- * column processing
- */
- tds_put_smallint(tds, bindcol->column_textpos);
- tds_put_int(tds, bindcol->bcp_column_data->datalen);
- tds_put_n(tds, bindcol->bcp_column_data->data, bindcol->bcp_column_data->datalen);
- } /*else server table gets into very strange&broken state */
+ /* unknown but zero */
+ tds_put_smallint(tds, 0);
+ tds_put_byte(tds, bindcol->column_type);
+ tds_put_byte(tds, 0xff - blob_cols);
+ /*
+ * offset of txptr we stashed during variable
+ * column processing
+ */
+ tds_put_smallint(tds, bindcol->column_textpos);
+ tds_put_int(tds, bindcol->bcp_column_data->datalen);
+ tds_put_n(tds, bindcol->bcp_column_data->data, bindcol->bcp_column_data->datalen);
blob_cols++;
+
}
}
}
@@ -680,9 +676,9 @@
static int
tds_bcp_add_variable_columns(TDSBCPINFO *bcpinfo, tds_bcp_get_col_data get_col_data, tds_bcp_null_error null_error, int offset, TDS_UCHAR* rowbuffer, int start, int *pncols)
{
- TDS_USMALLINT offsets[256];
- unsigned int i, row_pos;
- unsigned int ncols = 0;
+ TDS_SMALLINT offsets[256];
+ int i, row_pos;
+ int ncols = 0;
assert(bcpinfo);
assert(rowbuffer);
@@ -709,7 +705,7 @@
tdsdump_log(TDS_DBG_FUNC, "%4s %8s %8s %8s\n", "col", "ncols", "row_pos", "cpbytes");
for (i = 0; i < bcpinfo->bindinfo->num_cols; i++) {
- unsigned int cpbytes = 0;
+ int cpbytes = 0;
TDSCOLUMN *bcpcol = bcpinfo->bindinfo->columns[i];
/*
@@ -776,27 +772,16 @@
ncols--; /* trailing NULL columns are not sent and are not included in the offset table */
if (ncols) {
-/*EVEVEVE*/
TDS_UCHAR *padj = rowbuffer + row_pos;
- TDS_UCHAR *poff = padj;
- unsigned int pfx_top = offsets[ncols] / 256;
-
- *poff++ = ncols + 1;
- /* this is some kind of run-length-prefix encoding */
- while (pfx_top) {
- unsigned int n_pfx = 0;
- unsigned int n;
- for (n = 0; n <= ncols ; ++n)
- if ((offsets[n] / 256) < pfx_top)
- ++n_pfx;
- *poff++ = n_pfx + 1;
- --pfx_top;
- }
-
- tdsdump_log(TDS_DBG_FUNC, "ncols=%u padj=%x poff=%x [%u]\n", ncols, padj, poff, offsets[ncols]);
+ TDS_UCHAR *poff = offsets[ncols] > 0xFF? padj + ncols + 1 : padj;
- for (i=0; i <= ncols; i++)
+ *padj++ = 1 + ncols;
+ *poff++ = 1 + ncols;
+
+ for (i=0; i <= ncols; i++) {
+ padj[i] = offsets[ncols-i] >> 8;
poff[i] = offsets[ncols-i] & 0xFF;
+ }
row_pos = (int)(poff + ncols + 1 - rowbuffer);
}