static void cg_proc_result_set_setter()

in sources/cg_c.c [7285:7389]


static void cg_proc_result_set_setter(function_info *_Nonnull info, bool_t use_inline, bool_t is_set_null)
{
  charbuf *h = info->headers;
  charbuf *d = info->defs;
  charbuf *out = NULL;

  CG_CHARBUF_OPEN_SYM_WITH_PREFIX(
    col_getter_sym,
    rt->symbol_prefix,
    info->name,
    "_set_",
    info->col,
    info->sym_suffix);

  CHARBUF_OPEN(var_decl);

  if (!is_set_null) {
    cg_var_decl(&var_decl, info->ret_type, "new_value", CG_VAR_DECL_PROTO);
  }

  CHARBUF_OPEN(func_decl);
  if (use_inline) {
    bprintf(&func_decl, "static inline void %s", col_getter_sym.ptr);
  } else {
    bprintf(&func_decl, "%svoid %s", rt->symbol_visibility, col_getter_sym.ptr);
  }
  bprintf(&func_decl, "(%s _Nonnull result_set", info->result_set_ref_type);

  // a procedure that uses OUT gives exactly one row, so no index in the API
  if (!info->uses_out) {
    bprintf(&func_decl, ", %s row", rt->cql_int32);
  }

  if (use_inline) {
    out = h;
  } else {
    if (is_set_null) {
      bprintf(h, "%s);\n", func_decl.ptr);
    } else {
      bprintf(h, "%s, %s);\n", func_decl.ptr, var_decl.ptr);
    }
    out = d;
  }

  if (is_set_null) {
    bprintf(out, "\n%s) {\n", func_decl.ptr);
  } else {
    bprintf(out, "\n%s, %s) {\n", func_decl.ptr, var_decl.ptr);
  }

  CSTR row = info->uses_out ? "0" : "row";
  bool_t is_ref = info->name_type == SEM_TYPE_TEXT || info->name_type == SEM_TYPE_OBJECT || info->name_type == SEM_TYPE_BLOB;
  if (is_ref && is_not_nullable(info->ret_type)) {
    bprintf(out, "  cql_contract_argument_notnull((void *)new_value, 2);\n");
  }

  bool_t generate_nullable_wrapper = !options.generate_type_getters;

  switch (info->name_type) {
    case SEM_TYPE_BOOL:
      if (generate_nullable_wrapper) {
        bprintf(out, "  cql_nullable_bool new_value_;\n");
        bprintf(out, "  %s;\n", is_set_null ? "cql_set_null(new_value_)" : "cql_set_notnull(new_value_, new_value)");
      }
      bprintf(out, "  %s", rt->cql_result_set_set_bool);
      break;
    case SEM_TYPE_REAL:
      if (generate_nullable_wrapper) {
        bprintf(out, "  cql_nullable_double new_value_;\n");
        bprintf(out, "  %s;\n", is_set_null ? "cql_set_null(new_value_)" : "cql_set_notnull(new_value_, new_value)");
      }
      bprintf(out, "  %s", rt->cql_result_set_set_double);
      break;
    case SEM_TYPE_INTEGER:
      if (generate_nullable_wrapper) {
        bprintf(out, "  cql_nullable_int32 new_value_;\n");
        bprintf(out, "  %s;\n", is_set_null ? "cql_set_null(new_value_)" : "cql_set_notnull(new_value_, new_value)");
      }
      bprintf(out, "  %s", rt->cql_result_set_set_int32);
      break;
    case SEM_TYPE_LONG_INTEGER:
      if (generate_nullable_wrapper) {
        bprintf(out, "  cql_nullable_int64 new_value_;\n");
        bprintf(out, "  %s;\n", is_set_null ? "cql_set_null(new_value_)" : "cql_set_notnull(new_value_, new_value)");
      }
      bprintf(out, "  %s", rt->cql_result_set_set_int64);
      break;
    case SEM_TYPE_TEXT:
      bprintf(out, "  %s", rt->cql_result_set_set_string);
      break;
    case SEM_TYPE_BLOB:
      bprintf(out, "  %s", rt->cql_result_set_set_blob);
      break;
    case SEM_TYPE_OBJECT:
      bprintf(out, "  %s", rt->cql_result_set_set_object);
      break;
  }

  bprintf(out, "((cql_result_set_ref)result_set, %s, %d, new_value%s);\n", row, info->col_index, !is_ref && generate_nullable_wrapper ? "_" : "");
  bprintf(out, "}\n");

  CHARBUF_CLOSE(func_decl);
  CHARBUF_CLOSE(var_decl);
  CHARBUF_CLOSE(col_getter_sym);
}