void test_setoperation(gconstpointer data) { grn_operator operator; grn_obj *entries; grn_obj *result1; grn_obj *result2; const char *dump; operator = gcut_data_get_int(data, "operator"); assert_send_command("table_create Entries TABLE_HASH_KEY ShortText"); send_command( "load " "--table Entries " "--values '[{\"_key\": \"a\"}, {\"_key\": \"b\"}, {\"_key\": \"c\"}]'"); entries = grn_ctx_get(context, "Entries", -1); { const char *condition = "_id < 3"; grn_obj *expr; grn_obj *variable; GRN_EXPR_CREATE_FOR_QUERY(context, entries, expr, variable); grn_expr_parse(context, expr, condition, strlen(condition), NULL, GRN_OP_AND, GRN_OP_MATCH, GRN_EXPR_SYNTAX_SCRIPT); result1 = grn_table_select(context, entries, expr, NULL, GRN_OP_OR); grn_obj_unlink(context, expr); } { const char *condition = "_id > 1"; grn_obj *expr; grn_obj *variable; GRN_EXPR_CREATE_FOR_QUERY(context, entries, expr, variable); grn_expr_parse(context, expr, condition, strlen(condition), NULL, GRN_OP_AND, GRN_OP_MATCH, GRN_EXPR_SYNTAX_SCRIPT); result2 = grn_table_select(context, entries, expr, NULL, GRN_OP_OR); grn_obj_unlink(context, expr); } grn_table_setoperation(context, result1, result2, result1, operator); { grn_bool first_record = GRN_TRUE; grn_obj buffer; grn_obj *score_accessor; grn_obj score; GRN_TEXT_INIT(&buffer, 0); GRN_TEXT_PUTS(context, &buffer, "["); score_accessor = grn_obj_column(context, result1, GRN_COLUMN_NAME_SCORE, GRN_COLUMN_NAME_SCORE_LEN); GRN_FLOAT_INIT(&score, 0); GRN_TABLE_EACH_BEGIN(context, result1, cursor, id) { void *result_key; grn_id entry_id; char entry_key[GRN_TABLE_MAX_KEY_SIZE]; int entry_key_size; if (first_record) { first_record = GRN_FALSE; } else { GRN_TEXT_PUTS(context, &buffer, ", "); } GRN_TEXT_PUTS(context, &buffer, "["); grn_table_cursor_get_key(context, cursor, &result_key); entry_id = *((grn_id *)result_key); entry_key_size = grn_table_get_key(context, entries, entry_id, entry_key, GRN_TABLE_MAX_KEY_SIZE); GRN_TEXT_PUT(context, &buffer, entry_key, entry_key_size); GRN_TEXT_PUTS(context, &buffer, ", "); GRN_BULK_REWIND(&score); grn_obj_get_value(context, score_accessor, id, &score); grn_text_printf(context, &buffer, "%.1f", GRN_FLOAT_VALUE(&score)); GRN_TEXT_PUTS(context, &buffer, "]"); } GRN_TABLE_EACH_END(context, cursor); GRN_OBJ_FIN(context, &score); grn_obj_unlink(context, score_accessor); GRN_TEXT_PUTS(context, &buffer, "]"); dump = cut_take_strndup(GRN_TEXT_VALUE(&buffer), GRN_TEXT_LEN(&buffer)); GRN_OBJ_FIN(context, &buffer); }
static void windows_event_logger_log(grn_ctx *ctx, grn_log_level level, const char *timestamp, const char *title, const char *message, const char *location, void *user_data) { grn_windows_event_logger_data *data = user_data; WORD type; WORD category = 0; DWORD event_id = 0; PSID user_sid = NULL; WORD n_strings = 1; DWORD event_data_size = 0; const WCHAR *strings[1]; LPVOID event_data = NULL; const char level_marks[] = " EACewnid-"; grn_obj formatted_buffer; UINT code_page; DWORD convert_flags = 0; int n_converted_chars; switch (level) { case GRN_LOG_NONE : return; break; case GRN_LOG_EMERG : case GRN_LOG_ALERT : case GRN_LOG_CRIT : case GRN_LOG_ERROR : type = EVENTLOG_ERROR_TYPE; break; case GRN_LOG_WARNING : type = EVENTLOG_WARNING_TYPE; break; case GRN_LOG_NOTICE : case GRN_LOG_INFO : case GRN_LOG_DEBUG : case GRN_LOG_DUMP : type = EVENTLOG_INFORMATION_TYPE; break; default : type = EVENTLOG_ERROR_TYPE; break; } if (data->event_source == INVALID_HANDLE_VALUE) { data->event_source = RegisterEventSourceA(NULL, data->event_source_name); if (data->event_source == INVALID_HANDLE_VALUE) { return; } } GRN_TEXT_INIT(&formatted_buffer, 0); if (location && location[0]) { grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s %s", timestamp, level_marks[level], title, message, location); } else { grn_text_printf(ctx, &formatted_buffer, "%s|%c|%s %s", timestamp, level_marks[level], title, message); } code_page = grn_windows_encoding_to_code_page(ctx->encoding); n_converted_chars = MultiByteToWideChar(code_page, convert_flags, GRN_TEXT_VALUE(&formatted_buffer), GRN_TEXT_LEN(&formatted_buffer), NULL, 0); #define CONVERTED_BUFFER_SIZE 512 if (n_converted_chars < CONVERTED_BUFFER_SIZE) { WCHAR converted_buffer[CONVERTED_BUFFER_SIZE]; n_converted_chars = MultiByteToWideChar(code_page, convert_flags, GRN_TEXT_VALUE(&formatted_buffer), GRN_TEXT_LEN(&formatted_buffer), converted_buffer, CONVERTED_BUFFER_SIZE); converted_buffer[n_converted_chars] = L'\0'; strings[0] = converted_buffer; ReportEventW(data->event_source, type, category, event_id, user_sid, n_strings, event_data_size, strings, event_data); #undef CONVERTED_BUFFER_SIZE } else { WCHAR *converted; converted = GRN_MALLOCN(WCHAR, n_converted_chars); n_converted_chars = MultiByteToWideChar(code_page, convert_flags, GRN_TEXT_VALUE(&formatted_buffer), GRN_TEXT_LEN(&formatted_buffer), converted, n_converted_chars); converted[n_converted_chars] = L'\0'; strings[0] = converted; ReportEventW(data->event_source, type, category, event_id, user_sid, n_strings, event_data_size, strings, event_data); GRN_FREE(converted); } GRN_OBJ_FIN(ctx, &formatted_buffer); }
static void command_schema_output_command(grn_ctx *ctx, const char *command_name, grn_obj *arguments) { grn_ctx_output_map_open(ctx, "command", 3); grn_ctx_output_cstr(ctx, "name"); grn_ctx_output_cstr(ctx, command_name); grn_ctx_output_cstr(ctx, "arguments"); { int i, n; n = grn_vector_size(ctx, arguments); grn_ctx_output_map_open(ctx, "arguments", n / 2); for (i = 0; i < n; i += 2) { const char *name; unsigned int name_size; const char *value; unsigned int value_size; name_size = grn_vector_get_element(ctx, arguments, i, &name, NULL, NULL); value_size = grn_vector_get_element(ctx, arguments, i + 1, &value, NULL, NULL); grn_ctx_output_str(ctx, name, name_size); grn_ctx_output_str(ctx, value, value_size); } grn_ctx_output_map_close(ctx); } grn_ctx_output_cstr(ctx, "command_line"); { int i, n; grn_obj command_line; GRN_TEXT_INIT(&command_line, 0); GRN_TEXT_PUTS(ctx, &command_line, command_name); n = grn_vector_size(ctx, arguments); for (i = 0; i < n; i += 2) { const char *name; unsigned int name_size; const char *value; unsigned int value_size; name_size = grn_vector_get_element(ctx, arguments, i, &name, NULL, NULL); value_size = grn_vector_get_element(ctx, arguments, i + 1, &value, NULL, NULL); grn_text_printf(ctx, &command_line, " --%.*s %.*s", name_size, name, value_size, value); } grn_ctx_output_str(ctx, GRN_TEXT_VALUE(&command_line), GRN_TEXT_LEN(&command_line)); GRN_OBJ_FIN(ctx, &command_line); } grn_ctx_output_map_close(ctx); }