Select Git revision
buffer-init.c
Forked from
Nettle / nettle
Source project has a limited visibility.
-
Niels Möller authored
config.h. Rev: src/nettle/ChangeLog:1.195 Rev: src/nettle/aes-decrypt-table.c:1.4 Rev: src/nettle/aes-decrypt.c:1.5 Rev: src/nettle/aes-encrypt-table.c:1.4 Rev: src/nettle/aes-encrypt.c:1.5 Rev: src/nettle/aes-meta.c:1.3 Rev: src/nettle/aes-set-decrypt-key.c:1.2 Rev: src/nettle/aes-set-encrypt-key.c:1.2 Rev: src/nettle/aes.c:1.12 Rev: src/nettle/aesdata.c:1.2 Rev: src/nettle/arcfour-meta.c:1.2 Rev: src/nettle/arcfour.c:1.3 Rev: src/nettle/base16-decode.c:1.2 Rev: src/nettle/base16-encode.c:1.2 Rev: src/nettle/base16-meta.c:1.3 Rev: src/nettle/base64-decode.c:1.5 Rev: src/nettle/base64-encode.c:1.3 Rev: src/nettle/base64-meta.c:1.4 Rev: src/nettle/bignum-random.c:1.3 Rev: src/nettle/bignum.c:1.7 Rev: src/nettle/blowfish.c:1.4 Rev: src/nettle/buffer-init.c:1.3 Rev: src/nettle/buffer.c:1.8 Rev: src/nettle/cast128-meta.c:1.3 Rev: src/nettle/cast128.c:1.4 Rev: src/nettle/cbc.c:1.6 Rev: src/nettle/des-compat.c:1.10 Rev: src/nettle/des.c:1.7 Rev: src/nettle/des3.c:1.2 Rev: src/nettle/dsa-keygen.c:1.6 Rev: src/nettle/dsa-sign.c:1.7 Rev: src/nettle/dsa-verify.c:1.4 Rev: src/nettle/dsa.c:1.5 Rev: src/nettle/examples/io.c:1.4 Rev: src/nettle/examples/nettle-benchmark.c:1.8 Rev: src/nettle/examples/nettle-openssl.c:1.2 Rev: src/nettle/examples/rsa-keygen.c:1.10 Rev: src/nettle/examples/rsa-sign.c:1.5 Rev: src/nettle/examples/rsa-verify.c:1.4 Rev: src/nettle/hmac-md5.c:1.5 Rev: src/nettle/hmac-sha1.c:1.2 Rev: src/nettle/hmac-sha256.c:1.2 Rev: src/nettle/hmac.c:1.4 Rev: src/nettle/knuth-lfib.c:1.2 Rev: src/nettle/md5-compat.c:1.3 Rev: src/nettle/md5-meta.c:1.2 Rev: src/nettle/md5.c:1.6 Rev: src/nettle/memxor.c:1.2 Rev: src/nettle/nettle-internal.c:1.3 Rev: src/nettle/pgp-encode.c:1.4 Rev: src/nettle/pkcs1-rsa-md5.c:1.2 Rev: src/nettle/pkcs1-rsa-sha1.c:1.2 Rev: src/nettle/pkcs1.c:1.2 Rev: src/nettle/realloc.c:1.3 Rev: src/nettle/rsa-compat.c:1.8 Rev: src/nettle/rsa-decrypt.c:1.4 Rev: src/nettle/rsa-encrypt.c:1.5 Rev: src/nettle/rsa-keygen.c:1.5 Rev: src/nettle/rsa-md5-sign.c:1.2 Rev: src/nettle/rsa-md5-verify.c:1.2 Rev: src/nettle/rsa-sha1-sign.c:1.2 Rev: src/nettle/rsa-sha1-verify.c:1.2 Rev: src/nettle/rsa-sign.c:1.3 Rev: src/nettle/rsa-verify.c:1.2 Rev: src/nettle/rsa.c:1.12 Rev: src/nettle/rsa2openpgp.c:1.2 Rev: src/nettle/rsa2sexp.c:1.7 Rev: src/nettle/serpent-meta.c:1.2 Rev: src/nettle/serpent.c:1.4 Rev: src/nettle/sexp-format.c:1.9 Rev: src/nettle/sexp-transport-format.c:1.2 Rev: src/nettle/sexp-transport.c:1.4 Rev: src/nettle/sexp.c:1.14 Rev: src/nettle/sexp2bignum.c:1.5 Rev: src/nettle/sexp2dsa.c:1.4 Rev: src/nettle/sexp2rsa.c:1.11 Rev: src/nettle/sha1-meta.c:1.2 Rev: src/nettle/sha1.c:1.8 Rev: src/nettle/sha256-meta.c:1.2 Rev: src/nettle/sha256.c:1.3 Rev: src/nettle/tools/input.c:1.2 Rev: src/nettle/tools/misc.c:1.2 Rev: src/nettle/tools/output.c:1.3 Rev: src/nettle/tools/parse.c:1.2 Rev: src/nettle/tools/sexp-conv.c:1.14 Rev: src/nettle/twofish-meta.c:1.2 Rev: src/nettle/twofish.c:1.6 Rev: src/nettle/yarrow256.c:1.17 Rev: src/nettle/yarrow_key_event.c:1.4
Niels Möller authoredconfig.h. Rev: src/nettle/ChangeLog:1.195 Rev: src/nettle/aes-decrypt-table.c:1.4 Rev: src/nettle/aes-decrypt.c:1.5 Rev: src/nettle/aes-encrypt-table.c:1.4 Rev: src/nettle/aes-encrypt.c:1.5 Rev: src/nettle/aes-meta.c:1.3 Rev: src/nettle/aes-set-decrypt-key.c:1.2 Rev: src/nettle/aes-set-encrypt-key.c:1.2 Rev: src/nettle/aes.c:1.12 Rev: src/nettle/aesdata.c:1.2 Rev: src/nettle/arcfour-meta.c:1.2 Rev: src/nettle/arcfour.c:1.3 Rev: src/nettle/base16-decode.c:1.2 Rev: src/nettle/base16-encode.c:1.2 Rev: src/nettle/base16-meta.c:1.3 Rev: src/nettle/base64-decode.c:1.5 Rev: src/nettle/base64-encode.c:1.3 Rev: src/nettle/base64-meta.c:1.4 Rev: src/nettle/bignum-random.c:1.3 Rev: src/nettle/bignum.c:1.7 Rev: src/nettle/blowfish.c:1.4 Rev: src/nettle/buffer-init.c:1.3 Rev: src/nettle/buffer.c:1.8 Rev: src/nettle/cast128-meta.c:1.3 Rev: src/nettle/cast128.c:1.4 Rev: src/nettle/cbc.c:1.6 Rev: src/nettle/des-compat.c:1.10 Rev: src/nettle/des.c:1.7 Rev: src/nettle/des3.c:1.2 Rev: src/nettle/dsa-keygen.c:1.6 Rev: src/nettle/dsa-sign.c:1.7 Rev: src/nettle/dsa-verify.c:1.4 Rev: src/nettle/dsa.c:1.5 Rev: src/nettle/examples/io.c:1.4 Rev: src/nettle/examples/nettle-benchmark.c:1.8 Rev: src/nettle/examples/nettle-openssl.c:1.2 Rev: src/nettle/examples/rsa-keygen.c:1.10 Rev: src/nettle/examples/rsa-sign.c:1.5 Rev: src/nettle/examples/rsa-verify.c:1.4 Rev: src/nettle/hmac-md5.c:1.5 Rev: src/nettle/hmac-sha1.c:1.2 Rev: src/nettle/hmac-sha256.c:1.2 Rev: src/nettle/hmac.c:1.4 Rev: src/nettle/knuth-lfib.c:1.2 Rev: src/nettle/md5-compat.c:1.3 Rev: src/nettle/md5-meta.c:1.2 Rev: src/nettle/md5.c:1.6 Rev: src/nettle/memxor.c:1.2 Rev: src/nettle/nettle-internal.c:1.3 Rev: src/nettle/pgp-encode.c:1.4 Rev: src/nettle/pkcs1-rsa-md5.c:1.2 Rev: src/nettle/pkcs1-rsa-sha1.c:1.2 Rev: src/nettle/pkcs1.c:1.2 Rev: src/nettle/realloc.c:1.3 Rev: src/nettle/rsa-compat.c:1.8 Rev: src/nettle/rsa-decrypt.c:1.4 Rev: src/nettle/rsa-encrypt.c:1.5 Rev: src/nettle/rsa-keygen.c:1.5 Rev: src/nettle/rsa-md5-sign.c:1.2 Rev: src/nettle/rsa-md5-verify.c:1.2 Rev: src/nettle/rsa-sha1-sign.c:1.2 Rev: src/nettle/rsa-sha1-verify.c:1.2 Rev: src/nettle/rsa-sign.c:1.3 Rev: src/nettle/rsa-verify.c:1.2 Rev: src/nettle/rsa.c:1.12 Rev: src/nettle/rsa2openpgp.c:1.2 Rev: src/nettle/rsa2sexp.c:1.7 Rev: src/nettle/serpent-meta.c:1.2 Rev: src/nettle/serpent.c:1.4 Rev: src/nettle/sexp-format.c:1.9 Rev: src/nettle/sexp-transport-format.c:1.2 Rev: src/nettle/sexp-transport.c:1.4 Rev: src/nettle/sexp.c:1.14 Rev: src/nettle/sexp2bignum.c:1.5 Rev: src/nettle/sexp2dsa.c:1.4 Rev: src/nettle/sexp2rsa.c:1.11 Rev: src/nettle/sha1-meta.c:1.2 Rev: src/nettle/sha1.c:1.8 Rev: src/nettle/sha256-meta.c:1.2 Rev: src/nettle/sha256.c:1.3 Rev: src/nettle/tools/input.c:1.2 Rev: src/nettle/tools/misc.c:1.2 Rev: src/nettle/tools/output.c:1.3 Rev: src/nettle/tools/parse.c:1.2 Rev: src/nettle/tools/sexp-conv.c:1.14 Rev: src/nettle/twofish-meta.c:1.2 Rev: src/nettle/twofish.c:1.6 Rev: src/nettle/yarrow256.c:1.17 Rev: src/nettle/yarrow_key_event.c:1.4
sql_util.pmod 5.83 KiB
/*
* $Id: sql_util.pmod,v 1.23 2008/06/30 12:09:15 srb 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
//! Quote a string so that it can safely be put in a query.
//!
//! @param s
//! String to quote.
string quote(string s)
{
return replace(s, "\'", "\'\'");
}
//! Throw an error in case an unimplemented function is called.
void fallback()
{
error( "Function not supported in this database." );
}
//! Build a raw SQL query, given the cooked query and the variable bindings
//! It's meant to be used as an emulation engine for those drivers not
//! providing such a behaviour directly (i.e. Oracle).
//! The raw query can contain some variables (identified by prefixing
//! a colon to a name or a number (i.e. ":var" or ":2"). They will be
//! replaced by the corresponding value in the mapping.
//!
//! @param query
//! The query.
//!
//! @param bindings
//! Optional mapping containing the variable bindings. Make sure that
//! no confusion is possible in the query. If necessary, change the
//! variables' names.
string emulate_bindings(string query, mapping(string|int:mixed)|void bindings,
void|object driver)
{
array(string)k, v;
if (!bindings)
return query;
function my_quote=(driver&&driver->quote?driver->quote:quote);
v=map(values(bindings),
lambda(mixed m) {
if(zero_type(m))
return "NULL";
if(multisetp(m)) m = indices(m)[0];
return "'"+(intp(m)?(string)m:my_quote((string)m))+"'";
});
// Throws if mapping key is empty string.
k=map(indices(bindings),lambda(string s){
return ( (stringp(s)&&s[0]==':') ?
s : ":"+s);
});
return replace(query,k,v);
}
//! Result object wrapper performing utf8 decoding of all fields.
class UnicodeWrapper (
// The wrapped result object.
protected object master_result
)
{
//! Returns the number of rows in the result.
int num_rows()
{
return master_result->num_rows();
}
//! Returns the number of fields in the result.
int num_fields()
{
return master_result->num_fields();
}
//! Returns @expr{1@} if there are no more rows in the result.
int(0..1) eof()
{
return master_result->eof();
}
//! Cached @[fetch_fields()] result.
protected array(int|mapping(string:mixed)) field_info;
//! Returns Information about the fields in the result.
//!
//! The following fields are converted from UTF8 if present:
//! @mapping
//! @member string "name"
//! The name of the field. Always present.
//! @member string "table"
//! The table the field is from. Not present from all databases.
//! @member string "default"
//! The default value for the column. Not available from all databases.
//! @endmapping
array(int|mapping(string:mixed)) fetch_fields()
{
if (!field_info) {
field_info = master_result->fetch_fields();
foreach(field_info, int|mapping(string:mixed) field) {
if (mappingp(field)) {
field->name = utf8_to_string(field->name);
if (field->table) {
field->table = utf8_to_string(field->table);
}
if (field->default) {
field->default = utf8_to_string(field->default);
}
}
}
}
return field_info;
}
//! Skip ahead the specified number of rows.
void seek(int rows)
{
master_result->seek(rows);
}
//! Fetch the next row from the result.
//!
//! All strings in the result are decoded from UTF8.
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)) {
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;
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]->charsetnr != 63) {
row[i] = utf8_to_string(val);
}
}
return row;
}
}
#else
class MySQLBrokenUnicodeWrapper
// This one is used to get a buggy unicode support 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 either by passing "broken-unicode" as
// charset to Sql.mysql.create or Sql.mysql.set_charset, by calling
// Sql.mysql.set_unicode_decode_mode(-1), or by defining the
// environment variable PIKE_BROKEN_MYSQL_UNICODE_MODE. That will
// cause this buggy variant to be used if and only if the MySQL client
// lib doesn't support the charsetnr property.
{
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