/// Parse some data. The enum return value is good when a complete request has /// been parsed, bad if the data is invalid, indeterminate when more data is /// required. The InputIterator return value indicates how much of the input /// has been consumed. result_type parse(boost::asio::streambuf& buf) { int c = EOF; while ((c = buf.sbumpc()) != EOF) { result_type result = consume(c); if (result == good || result == bad) { std::string url = urldecode(url_); std::string::size_type qmak_pos = url.find("?"); if (qmak_pos == std::string::npos) { path_ = url; } else { path_ = url.substr(0, qmak_pos); std::string quert_str = url.substr(qmak_pos + 1, url.size()); query_ = query_parser(quert_str); } return result; } } return indeterminate; }
static void query_expand(mrn::QueryExpandInfo *info, UDF_ARGS *args) { grn_ctx *ctx = info->ctx; const char *query = args->args[3]; unsigned int query_length = args->lengths[3]; mrn::QueryParser query_parser(info->ctx, current_thd, NULL, NULL, 0, NULL); const char *raw_query; size_t raw_query_length; grn_operator default_operator; grn_expr_flags flags; query_parser.parse_pragma(query, query_length, &raw_query, &raw_query_length, &default_operator, &flags); GRN_TEXT_SET(info->ctx, &(info->expanded_query), query, raw_query - query); grn_expr_syntax_expand_query_by_table(ctx, raw_query, raw_query_length, flags, info->term_column, info->expanded_term_column, &(info->expanded_query)); }
result_type parse(InputIterator begin, InputIterator end) { while (begin != end) { result_type result = consume(*begin++); if (result == good || result == bad) { std::string url = urldecode(url_); std::string::size_type qmak_pos = url.find("?"); if (qmak_pos == std::string::npos) { path_ = url; } else { path_ = url.substr(0, qmak_pos); std::string quert_str = url.substr(qmak_pos + 1, url.size()); query_ = query_parser(quert_str); } return result; } } return indeterminate; }
static mrn_bool mrn_snippet_html_prepare(mrn_snippet_html_info *info, UDF_ARGS *args, char *message, grn_obj **snippet) { MRN_DBUG_ENTER_FUNCTION(); grn_ctx *ctx = info->ctx; int flags = GRN_SNIP_SKIP_LEADING_SPACES; unsigned int width = 200; unsigned int max_n_results = 3; const char *open_tag = "<span class=\"keyword\">"; const char *close_tag = "</span>"; grn_snip_mapping *mapping = GRN_SNIP_MAPPING_HTML_ESCAPE; grn_obj *expr = NULL; *snippet = NULL; mrn::encoding::set_raw(ctx, system_charset_info); if (!(system_charset_info->state & (MY_CS_BINSORT | MY_CS_CSSORT))) { flags |= GRN_SNIP_NORMALIZE; } *snippet = grn_snip_open(ctx, flags, width, max_n_results, open_tag, strlen(open_tag), close_tag, strlen(close_tag), mapping); if (ctx->rc != GRN_SUCCESS) { if (message) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): failed to open grn_snip: <%s>", ctx->errbuf); } goto error; } if (info->query_mode.used) { if (!info->query_mode.table) { grn_obj *short_text; short_text = grn_ctx_at(info->ctx, GRN_DB_SHORT_TEXT); info->query_mode.table = grn_table_create(info->ctx, NULL, 0, NULL, GRN_TABLE_HASH_KEY, short_text, NULL); } if (!info->query_mode.default_column) { info->query_mode.default_column = grn_obj_column(info->ctx, info->query_mode.table, GRN_COLUMN_NAME_KEY, GRN_COLUMN_NAME_KEY_LEN); } grn_obj *record = NULL; GRN_EXPR_CREATE_FOR_QUERY(info->ctx, info->query_mode.table, expr, record); if (!expr) { if (message) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): " "failed to create expression: <%s>", ctx->errbuf); } goto error; } mrn::QueryParser query_parser(info->ctx, current_thd, expr, info->query_mode.default_column, 0, NULL); grn_rc rc = query_parser.parse(args->args[1], args->lengths[1]); if (rc != GRN_SUCCESS) { if (message) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): " "failed to parse query: <%s>", ctx->errbuf); } goto error; } rc = grn_expr_snip_add_conditions(info->ctx, expr, *snippet, 0, NULL, NULL, NULL, NULL); if (rc != GRN_SUCCESS) { if (message) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): " "failed to add conditions: <%s>", ctx->errbuf); } goto error; } } else { unsigned int i; for (i = 1; i < args->arg_count; ++i) { if (!args->args[i]) { continue; } grn_rc rc = grn_snip_add_cond(ctx, *snippet, args->args[i], args->lengths[i], NULL, 0, NULL, 0); if (rc != GRN_SUCCESS) { if (message) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): " "failed to add a condition to grn_snip: <%s>", ctx->errbuf); } goto error; } } } DBUG_RETURN(false); error: if (expr) { grn_obj_close(ctx, expr); } if (*snippet) { grn_obj_close(ctx, *snippet); } DBUG_RETURN(true); }