pike.git / lib / modules / Sql.pmod / sql_util.pmod

version» Context lines:

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