1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
http://issues.apache.org/jira/browse/LOGCXX-299
http://bugs.gentoo.org/show_bug.cgi?id=254920
diff -ur apache-log4cxx-0.10.0.orig/src/main/cpp/odbcappender.cpp apache-log4cxx-0.10.0/src/main/cpp/odbcappender.cpp
--- apache-log4cxx-0.10.0.orig/src/main/cpp/odbcappender.cpp 2008-04-01 01:34:09.000000000 +0300
+++ apache-log4cxx-0.10.0/src/main/cpp/odbcappender.cpp 2010-02-24 14:39:37.000000000 +0200
@@ -167,7 +167,8 @@
throw SQLException( SQL_HANDLE_DBC, con, "Failed to allocate sql handle.", p);
}
- SQLWCHAR* wsql = Transcoder::wencode(sql, p);
+ SQLWCHAR* wsql;
+ encode(&wsql, sql, p);
ret = SQLExecDirectW(stmt, wsql, SQL_NTS);
if (ret < 0)
@@ -237,9 +238,10 @@
}
- SQLWCHAR* wURL = Transcoder::wencode(databaseURL, p);
+ SQLWCHAR* wURL;
+ encode(&wURL, databaseURL, p);
- wchar_t szOutConnectionString[1024];
+ SQLWCHAR szOutConnectionString[1024];
SQLSMALLINT nOutConnctionLength = 0;
ret = SQLDriverConnectW( connection, NULL,
@@ -331,3 +333,31 @@
}
}
}
+
+void ODBCAppender::encode(wchar_t** dest, const LogString& src, Pool& p) {
+ *dest = Transcoder::wencode(src, p);
+}
+
+void ODBCAppender::encode(unsigned short** dest,
+ const LogString& src, Pool& p) {
+ // worst case double number of characters from UTF-8 or wchar_t
+ *dest = (unsigned short*)
+ p.palloc((src.size() + 1) * 2 * sizeof(unsigned short));
+ unsigned short* current = *dest;
+ for(LogString::const_iterator i = src.begin();
+ i != src.end();) {
+ unsigned int sv = Transcoder::decode(src, i);
+ if (sv < 0x10000) {
+ *current++ = (unsigned short) sv;
+ } else {
+ unsigned char u = (unsigned char) (sv >> 16);
+ unsigned char w = (unsigned char) (u - 1);
+ unsigned short hs = (0xD800 + ((w & 0xF) << 6) + ((sv & 0xFFFF) >> 10));
+ unsigned short ls = (0xDC00 + (sv && 0x3FF));
+ *current++ = (unsigned short) hs;
+ *current++ = (unsigned short) ls;
+ }
+ }
+ *current = 0;
+}
+
diff -ur apache-log4cxx-0.10.0.orig/src/main/include/log4cxx/db/odbcappender.h apache-log4cxx-0.10.0/src/main/include/log4cxx/db/odbcappender.h
--- apache-log4cxx-0.10.0.orig/src/main/include/log4cxx/db/odbcappender.h 2008-04-01 01:34:09.000000000 +0300
+++ apache-log4cxx-0.10.0/src/main/include/log4cxx/db/odbcappender.h 2010-02-24 14:39:39.000000000 +0200
@@ -279,6 +279,10 @@
private:
ODBCAppender(const ODBCAppender&);
ODBCAppender& operator=(const ODBCAppender&);
+ static void encode(wchar_t** dest, const LogString& src,
+ log4cxx::helpers::Pool& p);
+ static void encode(unsigned short** dest, const LogString& src,
+ log4cxx::helpers::Pool& p);
}; // class ODBCAppender
LOG4CXX_PTR_DEF(ODBCAppender);
|