pike.git/lib/modules/Sql.pmod/sql_util.pmod:1:
/*
- * $Id: sql_util.pmod,v 1.12 2006/11/17 18:43:11 mast Exp $
+ * $Id: sql_util.pmod,v 1.13 2006/11/27 16:28:39 mast Exp $
*
* Some SQL utility functions.
* They are kept here to avoid circular references.
*
* Henrik Grubbström 1999-07-01
*/
#pike __REAL_VERSION__
//! Some SQL utility functions
pike.git/lib/modules/Sql.pmod/sql_util.pmod:134:
foreach(row; int i; string|int val) {
if (stringp(val)) {
row[i] = utf8_to_string(val);
}
}
return row;
}
}
#if constant (Mysql.mysql.HAVE_MYSQL_FIELD_CHARSETNR)
+
class MySQLUnicodeWrapper
//! Result wrapper for MySQL that performs UTF-8 decoding of all
//! nonbinary fields. Useful if the result charset of the connection
//! has been set to UTF-8.
//!
//! @note
//! There's normally no need to use this class directly. It's used
//! automatically when @[Mysql.set_unicode_decode_mode] is activated.
{
inherit UnicodeWrapper;
pike.git/lib/modules/Sql.pmod/sql_util.pmod:158: Inside #if constant (Mysql.mysql.HAVE_MYSQL_FIELD_CHARSETNR)
if (!arrayp(row)) return row;
array(int|mapping(string:mixed)) field_info = fetch_fields();
foreach(row; int i; string|int val) {
if (stringp(val) && field_info[i]->charsetnr != 63) {
row[i] = utf8_to_string(val);
}
}
return row;
}
}
+
+ #else
+
+ class MySQLBrokenUnicodeWrapper
+ // This one is used to get bug compatibility when compiled with an old
+ // MySQL client lib that doesn't have the charsetnr property in the
+ // field info. It looks at the binary flag instead, which is set for
+ // binary fields but might also be set for text fields (e.g. with a
+ // definition like "VARCHAR(255) BINARY").
+ //
+ // I.e. the effect of using this one is that text fields with the
+ // binary flag won't be correctly decoded in unicode decode mode. This
+ // has to be enabled by defining the environment variable
+ // PIKE_BROKEN_MYSQL_UNICODE_MODE. With it the unicode decode mode
+ // will exist even when the client lib is too old to implement it
+ // correctly.
+ {
+ inherit UnicodeWrapper;
+
+ int|array(string) fetch_row()
+ {
+ int|array(string) row = master_result->fetch_row();
+ if (!arrayp(row)) return row;
+ array(int|mapping(string:mixed)) field_info = fetch_fields();
+ foreach(row; int i; string|int val) {
+ if (stringp(val) && field_info[i]->flags &&
+ !field_info[i]->flags->binary) {
+ row[i] = utf8_to_string(val);
+ }
+ }
+ return row;
+ }
+ }
+
#endif