pike.git
/
lib
/
modules
/
Sql.pmod
/
sql_util.pmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Sql.pmod/sql_util.pmod:58:
protected NullArg null_arg = NullArg(); //! Handle @[sprintf]-based quoted arguments //! //! @param query //! The query as sent to one of the query functions. //! //! @param extraargs //! The arguments following the query. //!
+
//! @param bindings
+
//! Optional bindings mapping to which additional bindings will be
+
//! added. It's returned as the second element in the return value.
+
//! A new mapping is used if this isn't specified.
+
//!
//! @returns //! Returns an array with two elements: //! @array //! @elem string 0 //! The query altered to use bindings-syntax. //! @elem mapping(string|int:mixed) 1
-
//! A bindings mapping.
+
//! A bindings mapping.
Zero if no bindings were added.
//! @endarray array(string|mapping(string|int:mixed))
-
handle_extraargs(string query, array(mixed) extraargs) {
+
handle_extraargs(string query, array(mixed) extraargs
,
+
void|mapping(string|int:mixed
)
bindings)
{
array(mixed) args=allocate(sizeof(extraargs));
-
mapping
(
string|int:mixed
)
b
= ([]);
+
if
(
!bindings
)
bindings
= ([]);
-
int a;
+
int a
, new_bindings
;
foreach(extraargs; int j; mixed s) { if (stringp(s) || multisetp(s)) {
-
args[j]
=":arg"+(a++);
-
b
[args[j]] = s;
+
string bind_name;
+
do {
+
bind_name
=
":arg"+(a++);
+
} while (!zero_type (bindings
[
bind_name]));
+
args[j]
=bind_name;
+
bindings[bind_name
] = s;
+
new_bindings = 1;
continue; } if (intp(s) || floatp(s)) { args[j] = s || zero; continue; } if (objectp (s) && s->is_val_null) { args[j] = null_arg; continue; } error("Wrong type to query argument %d: %O\n", j + 1, s); }
-
if(!sizeof(b)) b=0;
+
-
return ({sprintf(query,@args),
b}
);
+
return ({sprintf(query,@args),
new_bindings && bindings}
);
} //! 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