Field create_dynamic_field( MemoryPool pool, const char* name, size_t name_length, Field::type_e type, void* cbdata_get, void* cbdata_set ) { ib_field_t* f = NULL; ib_status_t rc = ib_field_create_dynamic( &f, pool.ib(), name, name_length, static_cast<ib_ftype_t>(type), Hooks::field_dynamic_get, cbdata_get, Hooks::field_dynamic_set, cbdata_set ); throw_if_error(rc); return Field(f); }
ib_status_t ib_field_copy( ib_field_t **pf, ib_mpool_t *mp, const char *name, size_t nlen, const ib_field_t *src ) { ib_status_t rc; if (ib_field_is_dynamic(src)) { rc = ib_field_create_dynamic( pf, mp, name, nlen, src->type, src->val->fn_get, src->val->cbdata_get, src->val->fn_set, src->val->cbdata_set ); } else { switch (src->type) { case IB_FTYPE_NUM: { ib_num_t v; rc = ib_field_value(src, ib_ftype_num_out(&v)); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, ib_ftype_num_in(&v) ); break; } case IB_FTYPE_FLOAT: { ib_float_t v; rc = ib_field_value(src, ib_ftype_float_out(&v)); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, ib_ftype_float_in(&v) ); break; } default: { void *v; rc = ib_field_value(src, &v); if (rc != IB_OK) { goto failed; } rc = ib_field_create( pf, mp, name, nlen, src->type, v ); } } } if (rc != IB_OK) { goto failed; } ib_field_util_log_debug("FIELD_COPY", (*pf)); return rc; failed: *pf = NULL; return rc; }
///@test Test util field library - ib_field_dyn_register_get() TEST_F(TestIBUtilField, test_dyn_field) { ib_field_t *dynf; ib_field_t *cdynf; ib_status_t rc; const char *fval; /* Create a field with no initial value. */ rc = ib_field_create_dynamic( &dynf, MM(), IB_S2SL("test_dynf"), IB_FTYPE_NULSTR, dyn_get, (void *)"dynf_get", dyn_set, (void *)"dynf_set" ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(dynf); ASSERT_EQ(9UL, dynf->nlen); ASSERT_EQ(0, memcmp("test_dynf", dynf->name, 9)); /* Get the value from the dynamic field. */ rc = ib_field_value_ex(dynf, ib_ftype_nulstr_out(&fval), (void *)"fetch1", 6 ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(fval); ASSERT_EQ( std::string("testval_dynf_get_fetch1_call01"), fval ); /* Get the value from the dynamic field again. */ rc = ib_field_value_ex(dynf, ib_ftype_nulstr_out(&fval), (void *)"fetch2", 6 ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(fval); ASSERT_EQ( std::string("testval_dynf_get_fetch2_call02"), fval ); /* Set */ rc = ib_field_setv_ex(dynf, (void *)"val1", (void *)"set1", 4); ASSERT_EQ(IB_OK, rc); ASSERT_EQ(std::string("testval_dynf_set_set1_val1_call03"), g_dyn_call_val); /* Reset call counter. */ g_dyn_call_count = 0; /* Create another field with no initial value. */ rc = ib_field_create_dynamic( &cdynf, MM(), IB_S2SL("test_cdynf"), IB_FTYPE_NULSTR, dyn_get_cached, (void *)("cdynf_get"), dyn_set, NULL ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(cdynf); ASSERT_EQ(10UL, cdynf->nlen); ASSERT_EQ(0, memcmp("test_cdynf", cdynf->name, 10)); /* Get the value from the dynamic field. */ rc = ib_field_value_ex(cdynf, ib_ftype_nulstr_out(&fval), (void *)"fetch1", 6 ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(fval); ASSERT_EQ( std::string("testval_cdynf_get_fetch1_call01"), fval ); /* Get the value from the dynamic field again. */ rc = ib_field_value_ex(cdynf, ib_ftype_nulstr_out(&fval), NULL, 0 ); ASSERT_EQ(IB_OK, rc); ASSERT_TRUE(fval); ASSERT_EQ( std::string("testval_cdynf_get_fetch1_call01"), fval ); }
/// @test Test ironbee library - data provider TEST(TestIronBee, test_data_dynf) { ib_engine_t *ib; ib_data_config_t *dataconfig; ib_data_t *data; ib_field_t *dynf; ib_field_t *f; ib_field_t *f2; ib_status_t rc; ib_num_t n; ib_list_t* l; ibtest_engine_create(&ib); ASSERT_EQ(IB_OK, ib_data_config_create(ib_engine_pool_main_get(ib), & dataconfig)); ASSERT_EQ(IB_OK, ib_data_create(dataconfig, ib_engine_pool_main_get(ib), &data)); ASSERT_TRUE(data); /* Create a field with no initial value. */ ASSERT_EQ( IB_OK, ib_field_create_dynamic( &dynf, ib_engine_pool_main_get(ib), IB_FIELD_NAME("test_dynf"), IB_FTYPE_LIST, dyn_get, (void *)ib_engine_pool_main_get(ib), NULL, NULL ) ); ASSERT_TRUE(dynf); ASSERT_EQ(9UL, dynf->nlen); ASSERT_MEMEQ("test_dynf", dynf->name, 9); /* Add the field to the data store. */ ASSERT_EQ(IB_OK, ib_data_add(data, dynf)); /* Fetch the field from the data store */ ASSERT_EQ(IB_OK, ib_data_get(data, "test_dynf", &f)); ASSERT_TRUE(f); ASSERT_EQ(dynf, f); /* Fetch a dynamic field from the data store */ ASSERT_EQ(IB_OK, ib_data_get(data, "test_dynf:dyn_subkey", &f)); ASSERT_TRUE(f); ASSERT_EQ(9UL, f->nlen); /* Get the list value from the dynamic field. */ rc = ib_field_mutable_value(f, ib_ftype_list_mutable_out(&l)); ASSERT_EQ(IB_OK, rc); ASSERT_EQ(1UL, ib_list_elements(l)); /* Get the single value from the list. */ f2 = (ib_field_t *)ib_list_node_data(ib_list_first(l)); ASSERT_TRUE(f2); ASSERT_EQ(10UL, f2->nlen); rc = ib_field_value(f2, ib_ftype_num_out(&n)); ASSERT_EQ(IB_OK, rc); ASSERT_EQ(5, n); /* Fetch a another subkey */ ASSERT_EQ(IB_OK, ib_data_get(data, "test_dynf:dyn_subkey2", &f)); ASSERT_TRUE(f); ASSERT_EQ(9UL, f->nlen); /* Get the list value from the dynamic field. */ rc = ib_field_mutable_value(f, ib_ftype_list_mutable_out(&l)); ASSERT_EQ(IB_OK, rc); ASSERT_EQ(1UL, ib_list_elements(l)); /* Get the single value from the list. */ f2 = (ib_field_t *)ib_list_node_data(ib_list_first(l)); ASSERT_TRUE(f2); ASSERT_EQ(11UL, f2->nlen); rc = ib_field_value(f2, ib_ftype_num_out(&n)); ASSERT_EQ(IB_OK, rc); ASSERT_EQ(5, n); ibtest_engine_destroy(ib); }
ib_status_t ib_cfgmap_init(ib_cfgmap_t *cm, void *base, const ib_cfgmap_init_t *init) { ib_cfgmap_init_t *rec = (ib_cfgmap_init_t *)init; ib_field_t *f; ib_status_t rc; /* Add tree entries that just point into the base structure. */ ib_util_log_debug("Initializing: t=%p init=%p", cm, init); cm->base = base; while (rec->name != NULL) { if (rec->fn_set != NULL && rec->fn_get != NULL) { ib_util_log_debug("INIT: %s type=%d set=%p/%p get=%p/%p", rec->name, rec->type, rec->fn_set, rec->cbdata_set, rec->fn_get, rec->cbdata_get); ib_cfgmap_handlers_data_t *data = (ib_cfgmap_handlers_data_t *)ib_mpool_alloc( cm->mp, sizeof(*data) ); if (data == NULL) { return IB_EALLOC; } data->base = base; data->init = rec; rc = ib_field_create_dynamic( &f, cm->mp, rec->name, strlen(rec->name), rec->type, ib_cfgmap_handle_get, data, ib_cfgmap_handle_set, data ); if (rc != IB_OK) { return rc; } } else { if (rec->fn_get != NULL || rec->fn_set != NULL) { return IB_EINVAL; } void *val = (void *)(((uint8_t *)base) + rec->offset); ib_util_log_debug("INIT: %s type=%d base=%p offset=%d dlen=%d %p", rec->name, rec->type, base, (int)rec->offset, (int)rec->dlen, val); /* Create a field with data that points to the base+offset. */ rc = ib_field_create_alias( &f, cm->mp, rec->name, strlen(rec->name), rec->type, val ); if (rc != IB_OK) { return rc; } } /* Add the field. */ rc = ib_hash_set(cm->hash, rec->name, (void *)f); if (rc != IB_OK) { return rc; } ++rec; } return IB_OK; }