Exemplo n.º 1
0
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);
  }
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}