static void tokenize(grn_ctx *ctx, grn_obj *lexicon, grn_obj *string, grn_tokenize_mode mode, unsigned int flags, grn_obj *tokens) { grn_token_cursor *token_cursor; token_cursor = grn_token_cursor_open(ctx, lexicon, GRN_TEXT_VALUE(string), GRN_TEXT_LEN(string), mode, flags); if (!token_cursor) { return; } while (token_cursor->status == GRN_TOKEN_CURSOR_DOING) { grn_id token_id = grn_token_cursor_next(ctx, token_cursor); tokenize_token *current_token; if (token_id == GRN_ID_NIL) { continue; } grn_bulk_space(ctx, tokens, sizeof(tokenize_token)); current_token = ((tokenize_token *)(GRN_BULK_CURR(tokens))) - 1; current_token->id = token_id; current_token->position = token_cursor->pos; current_token->force_prefix = token_cursor->force_prefix; } grn_token_cursor_close(ctx, token_cursor); }
static grn_obj * snippet_exec(grn_ctx *ctx, grn_obj *snip, grn_obj *text, grn_user_data *user_data, const char *prefix, int prefix_length, const char *suffix, int suffix_length) { grn_rc rc; unsigned int i, n_results, max_tagged_length; grn_obj snippet_buffer; grn_obj *snippets; if (GRN_TEXT_LEN(text) == 0) { return NULL; } rc = grn_snip_exec(ctx, snip, GRN_TEXT_VALUE(text), GRN_TEXT_LEN(text), &n_results, &max_tagged_length); if (rc != GRN_SUCCESS) { return NULL; } if (n_results == 0) { return grn_plugin_proc_alloc(ctx, user_data, GRN_DB_VOID, 0); } snippets = grn_plugin_proc_alloc(ctx, user_data, GRN_DB_SHORT_TEXT, GRN_OBJ_VECTOR); if (!snippets) { return NULL; } GRN_TEXT_INIT(&snippet_buffer, 0); grn_bulk_space(ctx, &snippet_buffer, prefix_length + max_tagged_length + suffix_length); for (i = 0; i < n_results; i++) { unsigned int snippet_length; GRN_BULK_REWIND(&snippet_buffer); if (prefix_length) { GRN_TEXT_PUT(ctx, &snippet_buffer, prefix, prefix_length); } rc = grn_snip_get_result(ctx, snip, i, GRN_TEXT_VALUE(&snippet_buffer) + prefix_length, &snippet_length); if (rc == GRN_SUCCESS) { grn_strncat(GRN_TEXT_VALUE(&snippet_buffer), GRN_BULK_WSIZE(&snippet_buffer), suffix, suffix_length); grn_vector_add_element(ctx, snippets, GRN_TEXT_VALUE(&snippet_buffer), prefix_length + snippet_length + suffix_length, 0, GRN_DB_SHORT_TEXT); } } GRN_OBJ_FIN(ctx, &snippet_buffer); return snippets; }
grn_obj * grn_inspect_name(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) { int name_size; name_size = grn_obj_name(ctx, obj, NULL, 0); if (name_size) { grn_bulk_space(ctx, buf, name_size); grn_obj_name(ctx, obj, GRN_BULK_CURR(buf) - name_size, name_size); } else { GRN_TEXT_PUTS(ctx, buf, "(nil)"); } return buf; }
static grn_obj * values_add(grn_ctx *ctx, grn_loader *loader) { grn_obj *res; uint32_t curr_size = loader->values_size * sizeof(grn_obj); if (curr_size < GRN_TEXT_LEN(&loader->values)) { res = (grn_obj *)(GRN_TEXT_VALUE(&loader->values) + curr_size); res->header.domain = GRN_DB_TEXT; GRN_BULK_REWIND(res); } else { if (grn_bulk_space(ctx, &loader->values, sizeof(grn_obj))) { return NULL; } res = (grn_obj *)(GRN_TEXT_VALUE(&loader->values) + curr_size); GRN_TEXT_INIT(res, 0); } loader->values_size++; loader->last = res; return res; }
int column_put(void) { int i, s = 0; grn_obj buf; grn_obj *key_type = grn_ctx_at(&ctx, GRN_DB_SHORT_TEXT); grn_obj *table = grn_table_create(&ctx, "<t1>", 4, NULL, GRN_OBJ_TABLE_HASH_KEY|GRN_OBJ_PERSISTENT, key_type, NULL); grn_obj *value_type = grn_ctx_at(&ctx, GRN_DB_TEXT); grn_obj *column = grn_column_create(&ctx, table, "c1", 2, NULL, GRN_OBJ_PERSISTENT, value_type); if (!table || !column) { return -1; } GRN_TEXT_INIT(&buf, 0); for (i = 0; i < nloops; i++) { int key = GENKEY(i); GRN_BULK_REWIND(&buf); grn_text_itoh(&ctx, &buf, key, key_size); { grn_id rid = grn_table_add(&ctx, table, GRN_BULK_HEAD(&buf), key_size, NULL); if (!rid) { fprintf(stderr, "table_lookup failed"); } else { unsigned int v = key % value_size; GRN_BULK_REWIND(&buf); if (v) { grn_bulk_space(&ctx, &buf, v -1); GRN_TEXT_PUTC(&ctx, &buf, GRN_BULK_HEAD(&buf)[0]); s += v; } if (grn_obj_set_value(&ctx, column, rid, &buf, GRN_OBJ_SET)) { fprintf(stderr, "grn_obj_set_value failed"); } } } } grn_obj_close(&ctx, &buf); printf("total size: %d\n", s); return 0; }
grn_obj * grn_inspect_name(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) { int name_size; name_size = grn_obj_name(ctx, obj, NULL, 0); if (name_size > 0) { grn_bulk_space(ctx, buf, name_size); grn_obj_name(ctx, obj, GRN_BULK_CURR(buf) - name_size, name_size); } else { grn_id id; id = grn_obj_id(ctx, obj); if (id == GRN_ID_NIL) { GRN_TEXT_PUTS(ctx, buf, "(nil)"); } else { GRN_TEXT_PUTS(ctx, buf, "(anonymous:"); grn_text_lltoa(ctx, buf, id); GRN_TEXT_PUTS(ctx, buf, ")"); } } return buf; }
MRN_API char *mroonga_snippet_html(UDF_INIT *init, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { MRN_DBUG_ENTER_FUNCTION(); mrn_snippet_html_info *info = reinterpret_cast<mrn_snippet_html_info *>(init->ptr); grn_ctx *ctx = info->ctx; grn_obj *snippet = info->snippet; grn_obj *result_buffer = &(info->result); if (!args->args[0]) { *is_null = 1; DBUG_RETURN(NULL); } if (!snippet) { if (mrn_snippet_html_prepare(info, args, NULL, &snippet)) { goto error; } } { char *target = args->args[0]; unsigned int target_length = args->lengths[0]; unsigned int n_results, max_tagged_length; { grn_rc rc = grn_snip_exec(ctx, snippet, target, target_length, &n_results, &max_tagged_length); if (rc != GRN_SUCCESS) { my_printf_error(ER_MRN_ERROR_FROM_GROONGA_NUM, ER_MRN_ERROR_FROM_GROONGA_STR, MYF(0), ctx->errbuf); goto error; } } *is_null = 0; GRN_BULK_REWIND(result_buffer); { const char *start_tag = "<div class=\"snippet\">"; const char *end_tag = "</div>"; size_t start_tag_length = strlen(start_tag); size_t end_tag_length = strlen(end_tag); for (unsigned int i = 0; i < n_results; ++i) { GRN_TEXT_PUT(ctx, result_buffer, start_tag, start_tag_length); grn_bulk_reserve(ctx, result_buffer, max_tagged_length); unsigned int result_length; grn_rc rc = grn_snip_get_result(ctx, snippet, i, GRN_BULK_CURR(result_buffer), &result_length); if (rc) { my_printf_error(ER_MRN_ERROR_FROM_GROONGA_NUM, ER_MRN_ERROR_FROM_GROONGA_STR, MYF(0), ctx->errbuf); goto error; } grn_bulk_space(ctx, result_buffer, result_length); GRN_TEXT_PUT(ctx, result_buffer, end_tag, end_tag_length); } } if (!info->snippet) { grn_rc rc = grn_obj_close(ctx, snippet); if (rc != GRN_SUCCESS) { my_printf_error(ER_MRN_ERROR_FROM_GROONGA_NUM, ER_MRN_ERROR_FROM_GROONGA_STR, MYF(0), ctx->errbuf); goto error; } } } *length = GRN_TEXT_LEN(result_buffer); DBUG_RETURN(GRN_TEXT_VALUE(result_buffer)); error: if (!info->snippet && snippet) { grn_obj_close(ctx, snippet); } *is_null = 1; *error = 1; DBUG_RETURN(NULL); }