Example #1
0
bool MySQLStmtVariables::bind_params(MYSQL_STMT *stmt) {
  m_value_arr.clear();
  for (int i = 0; i < m_arr.size(); i++) {
    MYSQL_BIND *b = &m_vars[i];
    auto const var = m_arr.lvalAt(i).unboxed();
    Variant v;
    if (isNullType(var.type())) {
      *b->is_null = 1;
    } else {
      switch (b->buffer_type) {
        case MYSQL_TYPE_LONGLONG:
          {
            m_value_arr.push_back(cellToInt(var.tv()));
            b->buffer = m_value_arr.back().getInt64Data();
          }
          break;
        case MYSQL_TYPE_DOUBLE:
          {
            m_value_arr.push_back(tvCastToDouble(var.tv()));
            b->buffer = m_value_arr.back().getDoubleData();
          }
          break;
        case MYSQL_TYPE_STRING:
          {
            m_value_arr.push_back(tvCastToString(var.tv()));
            StringData *sd = m_value_arr.back().getStringData();
            b->buffer = (void *)sd->data();
            // FIXME: setting buffer_length will cause the destructor to free
            // memory owned by the string
            *b->length = sd->size();
          }
          break;
        case MYSQL_TYPE_LONG_BLOB:
          // The value are set using send_long_data so we don't have to do
          // anything here
          break;
        default:
          assertx(false);
      }
    }
  }

  return !mysql_stmt_bind_param(stmt, m_vars);
}
Example #2
0
Type typeToInt(Type ty) {
  if (auto const v = tv(ty)) return ival(cellToInt(*v));
  if (ty.subtypeOf(TNull))   return ival(0);
  return TInt;
}