The MIDAS RPC layer can pass std::string and std::vector data of arbitrary size.
I am adding corresponding ODB API functions to use this. Instead of taking a pointer to preallocated array
(and we must know the size ahead of time, i.e. by reading the ODB key), we pass a pointer to an
std::vector<char>, all memory allocation is taken care of by the RPC layer.
INT EXPRT db_get_data_vec(HNDLE hdb, HNDLE key_handle, std::vector<char> *data, DWORD type);
INT EXPRT db_get_data_index_vec(HNDLE hdb, HNDLE hKey, std::vector<char> *data, INT index, DWORD type);
This helps with programming MIDAS "the c++ way" and fixes subtle errors like the memory leak
in the odbxx code if an exception is thrown - free(buffer) is never reached.
//int size = rpc_tid_size(m_tid) * m_num_values;
//void *buffer = malloc(size);
//void *p = buffer;
std::vector<char> odbdata;
status = db_get_data_vec(s_hDB, m_hKey, &odbdata, m_tid);
void *p = odbdata.data();
for (int i = 0; i < m_num_values; i++) {
if (m_tid == TID_UINT8 || m_tid == TID_CHAR)
m_data[i].set(*static_cast<uint8_t *>(p));
else
mthrow("Invalid type ID " + std::to_string(m_tid));
}
//free(buffer);
next to add is db_get_value_vec(). we already have a db_get_value_string().
K.O. |