Exemplo n.º 1
0
aslmsg createAslQuery(const QueryContext& context) {
  aslmsg query = asl_new(ASL_TYPE_QUERY);

  // Set constraints in query
  for (const auto& it : context.constraints) {
    const std::string& key = it.first;
    ColumnType col_type = it.second.affinity;
    for (const auto& constraint : it.second.getAll()) {
      addQueryOp(query,
                 key,
                 constraint.expr,
                 static_cast<ConstraintOperator>(constraint.op),
                 col_type);
    }
  }
  return query;
}
Exemplo n.º 2
0
TEST_F(AslTests, test_add_query_op) {
  aslmsg query = asl_new(ASL_TYPE_QUERY);
  ASSERT_EQ((uint32_t)ASL_TYPE_QUERY, asl_get_type(query));
  ASSERT_EQ((size_t)0, asl_count(query));

  const char *key, *val;
  uint32_t op;

  addQueryOp(query, "sender", "bar", EQUALS, TEXT_TYPE);
  ASSERT_EQ((size_t)1, asl_count(query));

  ASSERT_EQ(0, asl_fetch_key_val_op(query, 0, &key, &val, &op));
  ASSERT_STREQ("Sender", key);
  ASSERT_STREQ("bar", val);
  ASSERT_EQ((uint32_t)ASL_QUERY_OP_EQUAL, op);

  addQueryOp(query, "level", "1", GREATER_THAN, INTEGER_TYPE);
  ASSERT_EQ((size_t)2, asl_count(query));
  ASSERT_EQ(0, asl_fetch_key_val_op(query, 1, &key, &val, &op));
  ASSERT_STREQ("Level", key);
  ASSERT_STREQ("1", val);
  ASSERT_EQ((uint32_t)(ASL_QUERY_OP_GREATER | ASL_QUERY_OP_NUMERIC), op);

  addQueryOp(query, "gid", "999", LESS_THAN, BIGINT_TYPE);
  ASSERT_EQ((size_t)3, asl_count(query));
  ASSERT_EQ(0, asl_fetch_key_val_op(query, 2, &key, &val, &op));
  ASSERT_STREQ("GID", key);
  ASSERT_STREQ("999", val);
  ASSERT_EQ((uint32_t)(ASL_QUERY_OP_LESS | ASL_QUERY_OP_NUMERIC), op);

  addQueryOp(query, "facility", "hoo", GREATER_THAN_OR_EQUALS, TEXT_TYPE);
  ASSERT_EQ((size_t)4, asl_count(query));
  ASSERT_EQ(0, asl_fetch_key_val_op(query, 3, &key, &val, &op));
  ASSERT_STREQ("Facility", key);
  ASSERT_STREQ("hoo", val);
  ASSERT_EQ((uint32_t)ASL_QUERY_OP_GREATER_EQUAL, op);

  addQueryOp(query, "pid", "30", LESS_THAN_OR_EQUALS, INTEGER_TYPE);
  ASSERT_EQ((size_t)5, asl_count(query));
  ASSERT_EQ(0, asl_fetch_key_val_op(query, 4, &key, &val, &op));
  ASSERT_STREQ("PID", key);
  ASSERT_STREQ("30", val);
  ASSERT_EQ((uint32_t)(ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC), op);

  addQueryOp(query, "ref_proc", "%tom%", LIKE, TEXT_TYPE);
  ASSERT_EQ((size_t)6, asl_count(query));
  ASSERT_EQ(0, asl_fetch_key_val_op(query, 5, &key, &val, &op));
  ASSERT_STREQ("RefProc", key);
  ASSERT_STREQ(".*tom.*", val);
  ASSERT_EQ((uint32_t)(ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_REGEX |
                       ASL_QUERY_OP_CASEFOLD),
            op);

  // Queries against the extra column should not be sent to ASL
  addQueryOp(query, "extra", "tom", EQUALS, TEXT_TYPE);
  ASSERT_EQ((size_t)6, asl_count(query));

  // Queries with unsupported operators should not be sent to ASL
  addQueryOp(query, "host", "tom", GLOB, TEXT_TYPE);
  ASSERT_EQ((size_t)6, asl_count(query));

  asl_release(query);
}