pike.git
/
lib
/
modules
/
Sql.pmod
/
mysql.pike
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Sql.pmod/mysql.pike:1:
/*
-
* $Id: mysql.pike,v 1.
24
2006/
08
/
22
11:24
:16
grubba
Exp $
+
* $Id: mysql.pike,v 1.
25
2006/
09
/
15
13:
11:24
mast
Exp $
* * Glue for the Mysql-module */ //! Implements the glue needed to access the Mysql-module from the generic //! SQL module. #pike __REAL_VERSION__ #if constant(Mysql.mysql) inherit Mysql.mysql; #define UNICODE_DECODE_MODE 1 // Unicode decode mode #define LATIN1_UNICODE_ENCODE_MODE 2 // Unicode encode mode with latin1 charset #define UTF8_UNICODE_ENCODE_MODE 4 // Unicode encode mode with utf8 charset
-
// Set to the above if the connection is in
utf8-mode.
Enable
latin1
-
// unicode encode mode by default; it should be compatible with
-
//
earlier pike versions.
+
#ifdef MYSQL_CHARSET_DEBUG
+
#define CH_DEBUG(X...) werror("Sql.mysql: " + X)
+
#else
+
#define CH_DEBUG(X...)
+
#endif
+
+
// Set to the above if the connection is
requested to be
in
one
of
the
+
// unicode
modes. latin1 unicode
encode mode
is enabled
by default; it
+
//
should be compatible with earlier pike versions.
static int utf8_mode; // The charset, either "latin1" or "utf8", currently assigned to // character_set_client when unicode encode mode is enabled. Zero when // the connection charset has been set to something else than "latin1" // or "unicode". static string send_charset; static void update_unicode_encode_mode_from_charset (string charset) { switch (charset) { // Lowercase assumed. case "latin1": utf8_mode |= LATIN1_UNICODE_ENCODE_MODE; utf8_mode &= ~UTF8_UNICODE_ENCODE_MODE; send_charset = "latin1";
-
+
CH_DEBUG ("Entering latin1 encode mode.\n");
break; case "unicode": utf8_mode |= UTF8_UNICODE_ENCODE_MODE; utf8_mode &= ~LATIN1_UNICODE_ENCODE_MODE; send_charset = "utf8";
-
+
CH_DEBUG ("Entering unicode encode mode.\n");
break; default: // Wrong charset - the mode can't be used. utf8_mode |= LATIN1_UNICODE_ENCODE_MODE|UTF8_UNICODE_ENCODE_MODE; send_charset = 0;
-
+
CH_DEBUG ("Not entering latin1/unicode encode mode "
+
"due to incompatible charset %O.\n", charset);
break; } } int(0..1) set_unicode_encode_mode (int enable) //! Enables or disables unicode encode mode. //! //! In this mode, if the server supports UTF-8 and the connection //! charset is @expr{latin1@} (the default) or @expr{unicode@} then //! @[big_query] handles wide unicode queries. Enabled by default.
pike.git/lib/modules/Sql.pmod/mysql.pike:105:
//! charset is @expr{unicode@}. //! //! @seealso //! @[set_unicode_decode_mode], @[set_charset] { if (enable) update_unicode_encode_mode_from_charset (lower_case (get_charset())); else { utf8_mode &= ~(LATIN1_UNICODE_ENCODE_MODE|UTF8_UNICODE_ENCODE_MODE); send_charset = 0;
+
CH_DEBUG("Disabling unicode encode mode.\n");
} return !!send_charset; } int get_unicode_encode_mode() //! Returns nonzero if unicode encode mode is enabled, zero otherwise. //! //! @seealso //! @[set_unicode_encode_mode] {
pike.git/lib/modules/Sql.pmod/mysql.pike:147:
//! //! @note //! This mode is not compatible with earlier pike versions. You need //! to run in compatibility mode <= 7.6 to have it disabled by //! default. //! //! @seealso //! @[set_unicode_encode_mode] { if (enable) {
+
CH_DEBUG("Enabling unicode decode mode.\n");
::big_query ("SET character_set_results = utf8"); utf8_mode |= UNICODE_DECODE_MODE; } else {
-
+
CH_DEBUG("Disabling unicode decode mode.\n");
::big_query ("SET character_set_results = " + get_charset()); utf8_mode &= ~UNICODE_DECODE_MODE; } } int get_unicode_decode_mode() //! Returns nonzero if unicode decode mode is enabled, zero otherwise. //! //! @seealso //! @[set_unicode_decode_mode]
pike.git/lib/modules/Sql.pmod/mysql.pike:233:
//! //! You can use the @expr{mysql-latin1@} encoding in the //! @[Locale.Charset] module to do conversions, or just use the //! special @expr{"unicode"@} charset instead. //! //! @seealso //! @[get_charset], @[set_unicode_encode_mode], @[set_unicode_decode_mode] { charset = lower_case (charset);
+
CH_DEBUG("Setting charset to %O.\n", charset);
+
::set_charset (charset == "unicode" ? "utf8" : charset); if (charset == "unicode" || utf8_mode & (LATIN1_UNICODE_ENCODE_MODE|UTF8_UNICODE_ENCODE_MODE)) update_unicode_encode_mode_from_charset (charset); if (charset == "unicode") utf8_mode |= UNICODE_DECODE_MODE; else if (utf8_mode & UNICODE_DECODE_MODE && charset != "utf8") // This setting has been overridden by ::set_charset, so we need
pike.git/lib/modules/Sql.pmod/mysql.pike:543:
mapping(string|int:mixed)|void bindings, void|string charset) { if (bindings) query = .sql_util.emulate_bindings(query,bindings,this); string restore_charset; if (charset) { restore_charset = send_charset || get_charset(); if (charset != restore_charset) {
+
CH_DEBUG ("Switching charset from %O to %O (due to charset arg).\n",
+
restore_charset, charset);
::big_query ("SET character_set_client=" + charset);
-
::big_query
("SET character_set_connection=" + charset);
+
/* Can't be changed automatically - has side effects. /mast */
+
/*
::big_query("SET character_set_connection=" + charset);
*/
} else restore_charset = 0; } else if (send_charset) { string new_send_charset; if (utf8_mode & LATIN1_UNICODE_ENCODE_MODE) { if (String.width (query) == 8) new_send_charset = "latin1"; else {
-
+
CH_DEBUG ("Converting (mysql-)latin1 query to utf8.\n");
query = utf8_encode_query (query, latin1_to_utf8); new_send_charset = "utf8"; } } else { /* utf8_mode & UTF8_UNICODE_ENCODE_MODE */ if (_can_send_as_latin1 (query)) new_send_charset = "latin1"; else {
-
+
CH_DEBUG ("Converting query to utf8.\n");
query = utf8_encode_query (query, string_to_utf8); new_send_charset = "utf8"; } } if (new_send_charset != send_charset) {
-
mixed
err
;
-
if (err = catch {
-
::big_query("SET character_set_client=" + new_send_charset);
-
::big_query("SET character_set_connection=" + new_send_charset);
+
CH_DEBUG
("Switching charset from %O to %O.\n",
+
send_charset, new_send_charset)
;
+
if (
mixed
err = catch {
+
::big_query
("SET character_set_client=" + new_send_charset);
+
/* Can't be changed automatically - has side effects. /mast */
+
/*
::big_query("SET character_set_connection=" +
+
new_send_charset);
*/
}) { if (new_send_charset == "utf8") predef::error ("The query is a wide string " "and the MySQL server doesn't support UTF-8: %s\n", describe_error (err));
-
throw
(
err
)
;
+
else
+
throw
err;
} send_charset = new_send_charset; } }
-
+
CH_DEBUG ("Sending query with charset %O: %O.\n",
+
charset || send_charset, query);
+
int|object res = ::big_query(query); if (restore_charset) { if (send_charset && (<"latin1", "utf8">)[charset]) send_charset = charset; else {
-
::big_query("SET character_set_client=" + restore_charset);
-
::big_query("SET character_set_connection=" + restore_charset);
+
CH_DEBUG ("Restoring charset %O.\n", restore_charset);
+
::big_query
("SET character_set_client=" + restore_charset);
+
/* Can't be changed automatically - has side effects. /mast */
+
/*
::big_query("SET character_set_connection=" + restore_charset);
*/
} } if (!objectp(res)) return res; if (utf8_mode & UNICODE_DECODE_MODE) {
-
+
CH_DEBUG ("Using UnicodeWrapper for result.\n");
return .sql_util.UnicodeWrapper(res); } return res; } int(0..1) is_keyword( string name ) //! Return 1 if the argument @[name] is a mysql keyword. { // FIXME: Document which version of MySQL this is up-to-date with. return (<