dp_rsp_t dp_rsp_create(dp_mgr_t dp, const char * name) { size_t nameLen; dp_rsp_t r; if (dp == NULL || name == NULL) return NULL; nameLen = strlen(name); r = (dp_rsp_t)mem_alloc(dp->m_alloc, sizeof(struct dp_rsp) + nameLen + 1); if (r == NULL) return NULL; r->m_dp = dp; r->m_name = (char*)(r + 1); r->m_name_len = nameLen; r->m_bindings = NULL; r->m_processor = NULL; r->m_type = NULL; r->m_context = NULL; cpe_hash_entry_init(&r->m_hh); memcpy((char*)r->m_name, name, nameLen + 1); if (cpe_hash_table_insert_unique(&dp->m_rsps, r) != 0) { mem_free(dp->m_alloc, r); return NULL; } return r; }
static dr_metalib_source_t dr_metalib_source_create( dr_metalib_builder_t builder, const char * name, size_t capacity, dr_metalib_source_type_t type, dr_metalib_source_format_t format, dr_metalib_source_from_t from) { char * buf; dr_metalib_source_t source; size_t name_len; assert(builder); name_len = strlen(name) + 1; buf = mem_alloc(builder->m_alloc, name_len + sizeof(struct dr_metalib_source) + capacity); if (buf == NULL) return NULL; memcpy(buf, name, name_len); source = (dr_metalib_source_t)(buf + name_len); source->m_builder = builder; source->m_name = buf; source->m_type = type; source->m_format = format; source->m_from = from; source->m_state = dr_metalib_source_state_not_analize; source->m_capacity = capacity; TAILQ_INIT(&source->m_includes); TAILQ_INIT(&source->m_include_by); TAILQ_INIT(&source->m_elements); cpe_hash_entry_init(&source->m_hh); if (cpe_hash_table_insert_unique(&builder->m_sources, source) != 0) { mem_free(builder->m_alloc, buf); return NULL; } TAILQ_INSERT_TAIL(&builder->m_sources_in_order, source, m_next); return source; }
dr_dm_data_t dr_dm_data_create(dr_dm_manage_t mgr, const void * data, size_t data_size, const char ** duplicate_index) { char * buf; dr_dm_data_t role; size_t data_capacity; dr_dm_data_id_t role_id; int generate_role_id; size_t index_count; struct cpe_hash_it index_it; struct dr_dm_data_index * index; size_t i; index_count = cpe_hash_table_count(&mgr->m_indexes); if (duplicate_index) *duplicate_index = NULL; if (mgr->m_role_meta == NULL) { CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: role meta not exist!", dr_dm_manage_name(mgr)); return NULL; } if (mgr->m_id_index == NULL) { CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: role id entry not exist!", dr_dm_manage_name(mgr)); return NULL; } data_capacity = dr_meta_size(mgr->m_role_meta); if (data_size > data_capacity) { CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: data too long, data_size=%d, data_capacity=%d!", dr_dm_manage_name(mgr), (int)data_size, (int)data_capacity); return NULL; } generate_role_id = 0; role_id = dr_entry_read_int64(data, mgr->m_id_index->m_entry); if (role_id == 0) { if (mgr->m_id_generate) { if (gd_id_generator_generate(&role_id, mgr->m_id_generate) != 0) { CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: generate id from %s fail!", dr_dm_manage_name(mgr), gd_id_generator_name(mgr->m_id_generate)); return NULL; } else { generate_role_id = 1; } } } buf = (char *)mem_alloc( mgr->m_alloc, sizeof(struct cpe_hash_entry) * index_count + sizeof(struct dr_dm_data) + data_capacity); if (buf == NULL) return NULL; role = (dr_dm_data_t)(buf + sizeof(struct cpe_hash_entry) * index_count); role->m_mgr = mgr; memcpy(dr_dm_data_data(role), data, data_capacity); if (generate_role_id) { if (dr_entry_set_from_int64(dr_dm_data_data(role), role_id, mgr->m_id_index->m_entry, NULL) != 0) { CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: set generated id to data fail!", dr_dm_manage_name(mgr)); mem_free(mgr->m_alloc, buf); return NULL; } } for(i = 0; i < index_count; ++i) { cpe_hash_entry_init(((struct cpe_hash_entry*)buf) + i); } cpe_hash_it_init(&index_it, &mgr->m_indexes); while((index = cpe_hash_it_next(&index_it))) { if (dr_dm_data_index_add(index, role) != 0) { struct dr_dm_data_index * index_fall_back; CPE_ERROR( mgr->m_em, "%s: dr_dm_data_create: add to index %s: duplicate!", dr_dm_manage_name(mgr), dr_entry_name(index->m_entry)); if (duplicate_index) *duplicate_index = dr_dm_data_index_name(index); cpe_hash_it_init(&index_it, &mgr->m_indexes); while((index_fall_back = cpe_hash_it_next(&index_it)) && index_fall_back != index) { dr_dm_data_index_remove(index_fall_back, role); } mem_free(mgr->m_alloc, buf); return NULL; } } return role; }