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; }
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); }