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);
}