[Mono-dev] Possible multiple errors/bugs in Odbc stack, regarding handling of strings with non-ascii characters

Mads Bondo Dydensborg mbd at dbc.dk
Wed Jul 4 11:22:37 EDT 2007


onsdag 04 juli 2007 16:45 skrev Mads Bondo Dydensborg:
> Hi there

I have no real clue why messages to this list sometimes appears with broken 
format.

Anyway: I found out that the attached patch solves my problems for now. I 
would very much like a comment on it though. I fear there may be similar 
issues with more of the remaining Odbc calls.

Regards,

Mads


> I believe I have spotted an issue with the mono Odbc stack, regarding the 
handling of strings with characters, that give rise to multibyte 
representations in utf8.
> What I have seen, when talking to an Odbc database, is that strings passed 
to the database, loose their tail, when they contain e.g. the danish letter 
æ, which has the multibyte representation 'c3 a6' in utf8. 
> An example: the following request is send to the odbc stack:
> "UPDATE PublishingJob SET Name = 'foo' WHERE JobId = 2.000000"
> This appears in the odbctrace identical to this string.
> However, when changing foo to foæ, the string appears as:
> "UPDATE PublishingJob SET Name = 'fo' WHERE JobId = 2.00000"
> "foæ" appears as "fo" - I believe this is due to a limitation in the log 
mechanism, as the value is correctly set in the database. Note, however, the 
change from "2.000000" to "2.00000". This is no problem in this query, but 
this query:
> "UPDATE PublishingJob SET Name = 'ææææææææ' WHERE JobId = 2.000000"
> is traced to this:
> "UPDATE PublishingJob SET Name = '' WHERE JobId = "
> and, the odbc driver/database wont accept that as valid sql...
> I believe the issue is with OdbcCommand.cs, the method ExecSQL, and quite 
possibly, other places:
> libodbc.cs:		[DllImport("odbc32.dll")]		internal static extern OdbcReturn 
SQLExecDirect (IntPtr StatementHandle, string StatementText, int TextLength);
> OdbcCommand.cs:
> 		private void ExecSQL(string sql)		{			OdbcReturn ret;
> ...								ret=libodbc.SQLExecDirect(hstmt, sql, sql.Length);
> 
> The issue here is, that the sql string is formatted by 
System.Runtime.Interop, eventually into a char*, possibly containing multiby 
representations of the chars of sql. However, the sql.Length call, returns 
the number of Chars of sql, which must be a lower bound on the length of the 
char* that sql eventually is transformed into.
> FYI: AFAICT, the sql is transformed in marshcal.c:
> mono_string_to_lpstr (MonoString *s)    mono_string_to_utf8 (s)     
g_utf16_to_utf8
> My question is then: Can anybody confirm this is an issue?Any suggestions 
for a fix?
> I need this to work quite badly, so any help appreciated.
> Regards,
> Mads
> -- Med venlig hilsen/Regards
> Systemudvikler/Systemsdeveloper cand.scient.dat, Ph.d., Mads Bondo 
DydensborgDansk BiblioteksCenter A/S, Tempovej 7-11, 2750 Ballerup, Tlf. +45 
44 86 77 34
> _______________________________________________Mono-devel-list mailing 
listMono-devel-list at lists.ximian.comhttp://lists.ximian.com/mailman/listinfo/mono-devel-list
> 

-- 
Med venlig hilsen/Regards

Systemudvikler/Systemsdeveloper cand.scient.dat, Ph.d., Mads Bondo Dydensborg
Dansk BiblioteksCenter A/S, Tempovej 7-11, 2750 Ballerup, Tlf. +45 44 86 77 34
-------------- next part --------------
A non-text attachment was scrubbed...
Name: multibyte-SQLExecDirect.patch
Type: text/x-diff
Size: 1060 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-devel-list/attachments/20070704/e9d9c5a8/attachment.bin 


More information about the Mono-devel-list mailing list