mrb_value grn_mrb_load(grn_ctx *ctx, const char *path) { grn_mrb_data *data = &(ctx->impl->mrb); mrb_state *mrb = data->state; char expanded_path[PATH_MAX]; FILE *file; mrb_value result; struct mrb_parser_state *parser; if (!mrb) { return mrb_nil_value(); } if (!grn_mrb_expand_script_path(ctx, path, expanded_path, PATH_MAX)) { return mrb_nil_value(); } file = grn_fopen(expanded_path, "r"); if (!file) { mrb_value exception; SERR("fopen: failed to open mruby script file: <%s>", expanded_path); exception = mrb_exc_new(mrb, E_LOAD_ERROR, ctx->errbuf, strlen(ctx->errbuf)); mrb->exc = mrb_obj_ptr(exception); return mrb_nil_value(); } { char current_base_directory[PATH_MAX]; char *last_directory; grn_strcpy(current_base_directory, PATH_MAX, data->base_directory); grn_strcpy(data->base_directory, PATH_MAX, expanded_path); last_directory = strrchr(data->base_directory, '/'); if (last_directory) { last_directory[0] = '\0'; } parser = mrb_parser_new(mrb); mrb_parser_set_filename(parser, expanded_path); parser->s = parser->send = NULL; parser->f = file; mrb_parser_parse(parser, NULL); fclose(file); { struct RProc *proc; proc = mrb_generate_code(mrb, parser); result = mrb_toplevel_run(mrb, proc); } mrb_parser_free(parser); grn_strcpy(data->base_directory, PATH_MAX, current_base_directory); } return result; }
static void default_logger_log(grn_ctx *ctx, grn_log_level level, const char *timestamp, const char *title, const char *message, const char *location, void *user_data) { const char slev[] = " EACewnid-"; if (default_logger_path) { CRITICAL_SECTION_ENTER(default_logger_lock); if (!default_logger_file) { default_logger_file = grn_fopen(default_logger_path, "a"); default_logger_size = 0; if (default_logger_file) { struct stat stat; if (fstat(fileno(default_logger_file), &stat) != -1) { default_logger_size = stat.st_size; } } } if (default_logger_file) { char label = *(slev + level); int written; if (location && *location) { if (title && *title) { written = fprintf(default_logger_file, "%s|%c|%s: %s %s\n", timestamp, label, location, title, message); } else { written = fprintf(default_logger_file, "%s|%c|%s: %s\n", timestamp, label, location, message); } } else { written = fprintf(default_logger_file, "%s|%c|%s %s\n", timestamp, label, title, message); } if (written > 0) { default_logger_size += written; if (LOGGER_NEED_ROTATE(default_logger_size, default_logger_rotate_threshold_size)) { fclose(default_logger_file); default_logger_file = NULL; rotate_log_file(ctx, default_logger_path); } else { fflush(default_logger_file); } } } CRITICAL_SECTION_LEAVE(default_logger_lock); } }
static void default_query_logger_log(grn_ctx *ctx, unsigned int flag, const char *timestamp, const char *info, const char *message, void *user_data) { if (default_query_logger_path) { CRITICAL_SECTION_ENTER(default_query_logger_lock); if (!default_query_logger_file) { default_query_logger_file = grn_fopen(default_query_logger_path, "a"); default_query_logger_size = 0; if (default_query_logger_file) { struct stat stat; if (fstat(fileno(default_query_logger_file), &stat) != -1) { default_query_logger_size = stat.st_size; } } } if (default_query_logger_file) { int written; written = fprintf(default_query_logger_file, "%s|%s%s\n", timestamp, info, message); if (written > 0) { default_query_logger_size += written; if (LOGGER_NEED_ROTATE(default_query_logger_size, default_query_logger_rotate_threshold_size)) { fclose(default_query_logger_file); default_query_logger_file = NULL; rotate_log_file(ctx, default_query_logger_path); } else { fflush(default_query_logger_file); } } } CRITICAL_SECTION_LEAVE(default_query_logger_lock); } }