static void cg_java_proc_result_set()

in sources/cg_java.c [330:464]


static void cg_java_proc_result_set(ast_node *ast, cg_java_context *java_context) {
  EXTRACT_MISC_ATTRS(ast, misc_attrs);
  EXTRACT_STRING(name, ast->left);

  // if getters are suppressed the entire class is moot
  // if result set is suppressed the entire class is moot
  // private implies result set suppressed so also moot
  bool_t suppressed =
    exists_attribute_str(misc_attrs, "suppress_getters") ||
    exists_attribute_str(misc_attrs, "suppress_result_set") ||
    exists_attribute_str(misc_attrs, "private");

  if (suppressed) {
    return;
  }

  Invariant(!use_encode);
  Invariant(!encode_context_column);
  Invariant(!encode_columns);
  encode_columns = symtab_new();
  init_encode_info(misc_attrs, &use_encode, &encode_context_column, encode_columns);

  bool_t custom_type_for_encoded_column = !!exists_attribute_str(misc_attrs, "custom_type_for_encoded_column");
  uint32_t frag_type = find_fragment_attr_type(misc_attrs, &base_fragment_name);
  bool_t is_query_proc = cg_java_frag_type_query_proc(frag_type);
  cg_java_validate_proc_count(java_context, frag_type);

  Contract(is_ast_create_proc_stmt(ast));
  Contract(is_struct(ast->sem->sem_type));
  EXTRACT_NOTNULL(proc_params_stmts, ast->right);
  EXTRACT(params, proc_params_stmts->left);
  sem_struct *sptr = ast->sem->sptr;

  uint32_t count = sptr->count;
  uint32_t col_count_for_base = 0;
  if (!options.java_fragment_interface_mode) {
    cg_java_fragment_columns(name, java_context, frag_type, &count, &col_count_for_base);
  }

  CHARBUF_OPEN(body);
  CHARBUF_OPEN(class_name);
  extract_base_path_without_extension(&class_name, options.file_names[0]);

  CHARBUF_OPEN(implements_interface);
  if (options.java_fragment_interface_mode && frag_type != FRAG_TYPE_NONE) {
    cg_java_write_implements_interface(&implements_interface, name, java_context, frag_type);
  }

  bool_t out_stmt_proc = has_out_stmt_result(ast);

  // Stored procedure name constant does not make sense for extension fragments since the application layer
  // that coordinates access to them will be dealing with assembly
  if (is_query_proc) {
    bprintf(&body, "public static final String STORED_PROCEDURE_NAME = \"%s\";\n\n", name);
  }

  if (!options.java_fragment_interface_mode) {
    cg_java_write_fragment_class_accessors(&body, name, frag_type, java_context, col_count_for_base);
  }

  if (!options.java_fragment_interface_mode || is_query_proc) {
    bprintf(&body,
            "public %s(CQLResultSet resultSet) {\n"
            "  super(resultSet);\n"
            "}\n\n",
            class_name.ptr);
  }

  bool_t is_string_column_encoded = false;
  // For each field emit the _get_field method
  for (int32_t i = 0; i < count; i++) {
    sem_t sem_type = sptr->semtypes[i];
    CSTR col = sptr->names[i];
    bool_t encode = should_encode_col(col, sem_type, use_encode, encode_columns);
    is_string_column_encoded += custom_type_for_encoded_column && encode && core_type_of(sem_type) == SEM_TYPE_TEXT;
    cg_java_proc_result_set_getter(
        out_stmt_proc,
        name,
        col,
        i,
        &body,
        sem_type,
        encode,
        custom_type_for_encoded_column,
        frag_type,
        col_count_for_base);
  }

  CG_CHARBUF_OPEN_SYM(get_count, "", "get_count");
  CHARBUF_OPEN(get_count_sig);
  cg_java_getter_sig(&get_count_sig, rt->cql_int32, get_count.ptr, "");
  if (!options.java_fragment_interface_mode || is_query_proc) {
    bprintf(&body, rt->cql_result_set_get_count, get_count_sig.ptr);
  } else {
    bprintf(&body, "%s;\n\n", get_count_sig.ptr);
  }

  bool_t generate_copy = misc_attrs && exists_attribute_str(misc_attrs, "generate_copy");
  if (generate_copy) {
    bprintf(&body, rt->cql_result_set_copy, class_name.ptr, class_name.ptr);
  }

  if (!options.java_fragment_interface_mode || is_query_proc) {
    bool_t include_identity_columns = misc_attrs != NULL ? find_identity_columns(misc_attrs, no_op, NULL) != 0 : 0;
    bprintf(&body, rt->cql_result_set_has_identity_columns, include_identity_columns ? "true" : "false");
  }

  CHARBUF_OPEN(cg_java_output);
  CSTR custom_class_import = is_string_column_encoded ? rt->cql_string_ref_encode_include : "";
  bprintf(&cg_java_output, "%s", rt->source_prefix);
  bprintf(&cg_java_output, rt->source_wrapper_begin, options.java_package_name, custom_class_import);
  cg_java_write_imports(&cg_java_output, frag_type);
  cg_java_write_class_or_interface(
    &cg_java_output,
    frag_type,
    &class_name,
    &implements_interface,
    &body);

  cql_write_file(options.file_names[0], cg_java_output.ptr);

  CHARBUF_CLOSE(cg_java_output);
  CHARBUF_CLOSE(get_count_sig);
  CHARBUF_CLOSE(get_count);
  CHARBUF_CLOSE(implements_interface);
  CHARBUF_CLOSE(class_name);
  CHARBUF_CLOSE(body);

  java_context->generated_proc_count++;

  use_encode = 0;
  symtab_delete(encode_columns);
  encode_columns = NULL;
  encode_context_column = NULL;
}