24 sprintf(buf,
"%d", value);
49 std::string
Path(
const char* varname)
75 std::string path =
Path(subdir);
77 int status = db_find_key(
fDB, 0, path.c_str(), &hkey);
78 if (status == DB_SUCCESS) {
80 status = db_get_key(
fDB, hkey, &key);
81 if (status != DB_SUCCESS) {
97 status = db_create_key(
fDB, 0, path.c_str(),
TID_KEY);
98 if (status != DB_SUCCESS) {
108 std::string path =
Path(varname);
117 status = db_find_key(
fDB, 0, path.c_str(), &hkey);
118 if (status != DB_SUCCESS)
122 status = db_get_key(
fDB, hkey, &key);
123 if (status != DB_SUCCESS)
127 *num_elements = key.num_values;
130 *element_size = key.item_size;
133 void ReadKey(
const char* varname,
int *tid,
int *num_values,
int *total_size,
int *item_size,
MVOdbError* error)
136 if (num_values) *num_values = 0;
137 if (total_size) *total_size = 0;
138 if (item_size) *item_size = 0;
140 std::string path =
Path(varname);
145 status = db_find_key(
fDB, 0, path.c_str(), &hkey);
146 if (status != DB_SUCCESS) {
152 status = db_get_key(
fDB, hkey, &key);
153 if (status != DB_SUCCESS) {
162 *num_values = key.num_values;
165 *total_size = key.total_size;
168 *item_size = key.item_size;
175 if (last_written) *last_written = 0;
177 std::string path =
Path(varname);
182 status = db_find_key(
fDB, 0, path.c_str(), &hkey);
183 if (status != DB_SUCCESS) {
189 status = db_get_key(
fDB, hkey, &key);
190 if (status != DB_SUCCESS) {
196 *last_written = key.last_written;
201 void ReadDir(std::vector<std::string>* varname, std::vector<int> *tid, std::vector<int> *num_values, std::vector<int> *total_size, std::vector<int> *item_size,
MVOdbError* error)
203 std::vector<KEY> keys;
204 int status = db_enum(
fDB, 0,
fRoot.c_str(), NULL, &keys);
206 for (
size_t i=0; i<keys.size(); i++) {
208 tid->push_back(keys[i].type);
210 num_values->push_back(keys[i].num_values);
212 total_size->push_back(keys[i].total_size);
214 item_size->push_back(keys[i].item_size);
216 varname->push_back(keys[i].name);
219 if (status != DB_SUCCESS) {
229 std::string path =
Path(varname);
234 status = db_find_key(
fDB, 0, path.c_str(), &hkey);
236 if (status != DB_SUCCESS) {
241 status = db_set_num_values(
fDB, hkey, new_size);
242 if (status != SUCCESS) {
252 std::string path =
Path(varname);
254 int status = db_resize_string(
fDB, 0, path.c_str(), new_size, new_string_length);
255 if (status != SUCCESS) {
263 bool R(
const char* varname,
int tid,
void *value,
int size,
bool create,
MVOdbError* error)
266 std::string path =
Path(varname);
267 int status = db_get_value(
fDB, 0, path.c_str(), value, &size, tid, create);
268 if (status != DB_SUCCESS) {
276 void RI(
const char* varname,
int *value,
bool create,
MVOdbError* error)
278 R(varname,
TID_INT, value,
sizeof(
int), create, error);
283 R(varname,
TID_WORD, value,
sizeof(uint16_t), create, error);
288 R(varname,
TID_DWORD, value,
sizeof(uint32_t), create, error);
293 R(varname,
TID_QWORD, value,
sizeof(uint64_t), create, error);
296 void RD(
const char* varname,
double *value,
bool create,
MVOdbError* error)
298 bool ok =
R(varname,
TID_DOUBLE, value,
sizeof(
double), create, error);
300 float fvalue = *value;
301 ok =
R(varname,
TID_FLOAT, &fvalue,
sizeof(
float), create, error);
303 std::string path =
Path(varname);
304 fprintf(stderr,
"MVOdb::RD: Sucessfully read ODB \"%s\" of type FLOAT instead of DOUBLE\n", path.c_str());
310 void RF(
const char* varname,
float *value,
bool create,
MVOdbError* error)
312 R(varname,
TID_FLOAT, value,
sizeof(
float), create, error);
315 void RB(
const char* varname,
bool *value,
bool create,
MVOdbError* error)
319 R(varname,
TID_BOOL, &v,
sizeof(BOOL), create, error);
323 void RS(
const char* varname, std::string* value,
bool create,
int create_string_length,
MVOdbError* error)
326 std::string path =
Path(varname);
328#ifdef HAVE_DB_GET_VALUE_STRING_CREATE_STRING_LENGTH
329 int status = db_get_value_string(
fDB, 0, path.c_str(), 0, value, create, create_string_length);
331#warning This MIDAS has an old version of db_get_value_string() and RS() will ignore the create_string_length argument.
332 int status = db_get_value_string(
fDB, 0, path.c_str(), 0, value, create);
335 if (status != DB_SUCCESS) {
343 void RAI(
const char* varname,
int index,
int tid,
void *value,
int size,
MVOdbError* error)
346 std::string path =
Path(varname);
354 int status = db_get_value(
fDB, 0, path.c_str(), value, &size, tid,
FALSE);
355 if (status != DB_SUCCESS) {
364 RAI(varname, index,
TID_INT, value,
sizeof(
int), error);
369 RAI(varname, index,
TID_WORD, value,
sizeof(uint16_t), error);
374 RAI(varname, index,
TID_DWORD, value,
sizeof(uint32_t), error);
379 RAI(varname, index,
TID_QWORD, value,
sizeof(uint64_t), error);
384 RAI(varname, index,
TID_DOUBLE, value,
sizeof(
double), error);
389 RAI(varname, index,
TID_FLOAT, value,
sizeof(
float), error);
396 RAI(varname, index,
TID_BOOL, &v,
sizeof(BOOL), error);
403 std::string path =
Path(varname);
410 int status = db_get_value_string(
fDB, 0, path.c_str(), index, value,
FALSE);
412 if (status != DB_SUCCESS) {
420 bool RA(
const std::string& path,
int tid,
void* buf,
int size,
MVOdbError* error)
422 int status = db_get_value(
fDB, 0, path.c_str(), buf, &size, tid,
FALSE);
424 if (status != DB_SUCCESS) {
440 ReadKey(varname, &xtid, pnum_values, &xtotal_size, pitem_size, error);
453 template <
class X>
bool RXA(
const char* varname,
int tid, std::vector<X> *value,
bool create,
int create_size,
MVOdbError* error)
455 std::string path =
Path(varname);
463 if (create && create_size > 0) {
464 if (num_values < 0) {
467 W(varname, tid, &v,
sizeof(X), error);
468 if (error && error->
fError)
471 }
else if (num_values != create_size) {
480 if (num_values > 0) {
481 value->resize(num_values);
482 return RA(path, tid, &((*value)[0]), num_values*
sizeof(X), error);
490 WA(varname, tid, &((*value)[0]), value->size()*
sizeof(X), value->size(), error);
492 if (error && error->
fError)
495 if (create_size > 0) {
496 if (create_size != (
int)value->size()) {
504 void RIA(
const char* varname, std::vector<int> *value,
bool create,
int create_size,
MVOdbError* error)
506 RXA<int>(varname,
TID_INT, value, create, create_size, error);
509 void RFA(
const char* varname, std::vector<float> *value,
bool create,
int create_size,
MVOdbError* error)
511 RXA<float>(varname,
TID_FLOAT, value, create, create_size, error);
514 void RDA(
const char* varname, std::vector<double> *value,
bool create,
int create_size,
MVOdbError* error)
516 bool ok = RXA<double>(varname,
TID_DOUBLE, value, create, create_size, error);
518 std::vector<float> fvalue;
519 std::vector<float> *fvalue_ptr = NULL;
521 fvalue_ptr = &fvalue;
522 for (
size_t i=0; i<value->size(); i++) {
523 fvalue.push_back((*value)[i]);
526 ok = RXA<float>(varname,
TID_FLOAT, fvalue_ptr, create, create_size, error);
527 if (ok && fvalue_ptr) {
529 std::string path =
Path(varname);
530 fprintf(stderr,
"MVOdb::RDA: Sucessfully read ODB \"%s\" of type FLOAT instead of DOUBLE\n", path.c_str());
533 for (
size_t i=0; i<fvalue.size(); i++) {
534 value->push_back(fvalue[i]);
540 void RU16A(
const char* varname, std::vector<uint16_t> *value,
bool create,
int create_size,
MVOdbError* error)
542 RXA<uint16_t>(varname,
TID_WORD, value, create, create_size, error);
545 void RU32A(
const char* varname, std::vector<uint32_t> *value,
bool create,
int create_size,
MVOdbError* error)
547 RXA<uint32_t>(varname,
TID_DWORD, value, create, create_size, error);
550 void RU64A(
const char* varname, std::vector<uint64_t> *value,
bool create,
int create_size,
MVOdbError* error)
552 RXA<uint64_t>(varname,
TID_QWORD, value, create, create_size, error);
555 void RBA(
const char* varname, std::vector<bool> *value,
bool create,
int create_size,
MVOdbError* error)
557 std::vector<BOOL> xvalue;
558 std::vector<BOOL> *xvalue_ptr = NULL;
561 for (std::size_t i=0; i<value->size(); i++) {
563 xvalue.push_back(
TRUE);
565 xvalue.push_back(
FALSE);
567 xvalue_ptr = &xvalue;
570 RXA<BOOL>(varname,
TID_BOOL, xvalue_ptr, create, create_size, error);
574 for (std::size_t i=0; i<xvalue.size(); i++) {
576 value->push_back(
true);
578 value->push_back(
false);
583 void RSA(
const char* varname, std::vector<std::string> *value,
bool create,
int create_size,
int create_string_length,
MVOdbError* error)
585 std::string path =
Path(varname);
593 if (create && (create_size > 0) && (create_string_length > 0)) {
594 if (num_values < 0) {
596 WS(varname,
"", create_string_length, error);
597 if (error && error->
fError)
600 }
else if ((num_values != create_size) || (item_size != create_string_length)) {
611 if (num_values > 0) {
613 int bufsize = num_values*item_size;
614 char* buf = (
char*)malloc(bufsize);
616 memset(buf, 0, bufsize);
618 for (
int i=0; i<num_values; i++) {
619 value->push_back(buf+i*item_size);
636 int string_length = 0;
637 for (
size_t i = 0; i < value->size(); i++) {
638 if (((
int)(*value)[i].length()) > string_length)
639 string_length = (*value)[i].length();
643 if (create_string_length > string_length)
644 string_length = create_string_length;
648 int bufsize = value->size()*string_length;
651 buf = (
char*)malloc(bufsize);
653 memset(buf, 0, bufsize);
655 for (
size_t i=0; i<value->size(); i++) {
656 mstrlcpy(buf+i*string_length, (*value)[i].c_str(), string_length);
660 WA(varname,
TID_STRING, buf, bufsize, value->size(), error);
667 if (error && error->
fError)
670 if ((create_size > 0) && (create_string_length > 0)) {
671 if ((((
int)value->size()) != create_size) || (string_length != create_string_length)) {
678 void W(
const char* varname,
int tid,
const void* v,
int size,
MVOdbError* error)
680 std::string path =
Path(varname);
682 int status = db_set_value(
fDB, 0, path.c_str(), v, size, 1, tid);
684 if (status == DB_TYPE_MISMATCH) {
686 fprintf(stderr,
"MVOdb::W: Data type mismatch when writing to ODB \"%s\", deleting the old entry\n", path.c_str());
691 status = db_set_value(
fDB, 0, path.c_str(), v, size, 1, tid);
694 if (status != DB_SUCCESS) {
706 W(varname,
TID_BOOL, &vv,
sizeof(BOOL), error);
711 W(varname,
TID_INT, &v,
sizeof(
int), error);
716 W(varname,
TID_WORD, &v,
sizeof(uint16_t), error);
721 W(varname,
TID_DWORD, &v,
sizeof(uint32_t), error);
726 W(varname,
TID_QWORD, &v,
sizeof(uint64_t), error);
736 W(varname,
TID_FLOAT, &v,
sizeof(
float), error);
739 void WS(
const char* varname,
const char* v,
int string_length,
MVOdbError* error)
741 if (string_length > 0) {
742 char* buf = (
char*)malloc(string_length);
744 mstrlcpy(buf, v, string_length);
753 void WAI(
const char* varname,
int index,
int tid,
const void* v,
int size,
MVOdbError* error)
755 std::string path =
Path(varname);
767 status = db_find_key(
fDB, 0, path.c_str(), &hkey);
769 if (status != DB_SUCCESS) {
774 status = db_set_data_index(
fDB, hkey, v, size, index, tid);
776 if (status != DB_SUCCESS) {
787 WAI(varname, index,
TID_BOOL, &vv,
sizeof(BOOL), error);
792 WAI(varname, index,
TID_INT, &v,
sizeof(
int), error);
797 WAI(varname, index,
TID_WORD, &v,
sizeof(uint16_t), error);
802 WAI(varname, index,
TID_DWORD, &v,
sizeof(uint32_t), error);
807 WAI(varname, index,
TID_QWORD, &v,
sizeof(uint64_t), error);
817 WAI(varname, index,
TID_FLOAT, &v,
sizeof(
float), error);
822 int num_elements = 0;
823 int element_size = 0;
824 RAInfo(varname, &num_elements, &element_size, error);
825 if (error && error->
fError)
827 if (element_size <= 0)
829 char* buf = (
char*)malloc(element_size);
831 mstrlcpy(buf, v, element_size);
836 void WA(
const char* varname,
int tid,
const void* v,
int size,
int count,
MVOdbError* error)
838 std::string path =
Path(varname);
843 int status = db_create_key(
fDB, 0, path.c_str(), tid);
845 if (status == DB_TYPE_MISMATCH) {
847 fprintf(stderr,
"MVOdb::WA: Data type mismatch when writing to ODB \"%s\", deleting the old entry\n", path.c_str());
852 status = db_create_key(
fDB, 0, path.c_str(), tid);
855 if (status != DB_SUCCESS) {
860 int status = db_set_value(
fDB, 0, path.c_str(), v, size, count, tid);
864 if (status == DB_TYPE_MISMATCH) {
866 fprintf(stderr,
"MVOdb::WA: Data type mismatch when writing to ODB \"%s\", deleting the old entry\n", path.c_str());
871 status = db_set_value(
fDB, 0, path.c_str(), v, size, count, tid);
874 if (status != DB_SUCCESS) {
883 void WBA(
const char* varname,
const std::vector<bool>& v,
MVOdbError* error)
885 unsigned num = v.size();
888 for (
unsigned i=0; i<num; i++) {
892 WA(varname,
TID_BOOL, val, num*
sizeof(BOOL), num, error);
897 WA(varname,
TID_WORD, &v[0], v.size()*
sizeof(uint16_t), v.size(), error);
902 WA(varname,
TID_DWORD, &v[0], v.size()*
sizeof(uint32_t), v.size(), error);
907 WA(varname,
TID_QWORD, &v[0], v.size()*
sizeof(uint64_t), v.size(), error);
912 WA(varname,
TID_INT, &v[0], v.size()*
sizeof(
int), v.size(), error);
915 void WFA(
const char* varname,
const std::vector<float>& v,
MVOdbError* error)
917 WA(varname,
TID_FLOAT, &v[0], v.size()*
sizeof(
float), v.size(), error);
920 void WDA(
const char* varname,
const std::vector<double>& v,
MVOdbError* error)
922 WA(varname,
TID_DOUBLE, &v[0], v.size()*
sizeof(
double), v.size(), error);
925 void WSA(
const char* varname,
const std::vector<std::string>& v,
int odb_string_size,
MVOdbError* error)
927 unsigned num = v.size();
928 unsigned length = odb_string_size;
931 for (
unsigned i=0; i<v.size(); i++) {
932 if (v[i].length() > length)
933 length = v[i].length();
938 char val[length*num];
939 memset(val, 0, length*num);
941 for (
unsigned i=0; i<num; i++)
942 mstrlcpy(val+length*i, v[i].c_str(), length);
949 std::string path =
Path(odbname);
953 int status = db_delete(
fDB, 0, path.c_str());
955 if (status == DB_NO_KEY) {
960 if (status != DB_SUCCESS) {
void RIA(const char *varname, std::vector< int > *value, bool create, int create_size, MVOdbError *error)
void RU64(const char *varname, uint64_t *value, bool create, MVOdbError *error)
void WU16(const char *varname, uint16_t v, MVOdbError *error)
bool GetPrintError() const
MVOdb * Chdir(const char *subdir, bool create, MVOdbError *error)
void SetPrintError(bool v)
void WU16AI(const char *varname, int index, uint16_t v, MVOdbError *error)
void RD(const char *varname, double *value, bool create, MVOdbError *error)
bool R(const char *varname, int tid, void *value, int size, bool create, MVOdbError *error)
void RF(const char *varname, float *value, bool create, MVOdbError *error)
void WU64A(const char *varname, const std::vector< uint64_t > &v, MVOdbError *error)
void WIAI(const char *varname, int index, int v, MVOdbError *error)
MidasOdb(HNDLE hDB, const char *root)
void W(const char *varname, int tid, const void *v, int size, MVOdbError *error)
void RIAI(const char *varname, int index, int *value, MVOdbError *error)
void RFAI(const char *varname, int index, float *value, MVOdbError *error)
void ResizeStringArray(const char *varname, int new_size, int new_string_length, MVOdbError *error)
void RSA(const char *varname, std::vector< std::string > *value, bool create, int create_size, int create_string_length, MVOdbError *error)
void RAInfo(const char *varname, int *num_elements, int *element_size, MVOdbError *error)
void GetArraySize(const char *varname, int *pnum_values, int *pitem_size, MVOdbError *error)
void WU32(const char *varname, uint32_t v, MVOdbError *error)
void RU64A(const char *varname, std::vector< uint64_t > *value, bool create, int create_size, MVOdbError *error)
void RDA(const char *varname, std::vector< double > *value, bool create, int create_size, MVOdbError *error)
void RB(const char *varname, bool *value, bool create, MVOdbError *error)
void WU64(const char *varname, uint64_t v, MVOdbError *error)
void WDA(const char *varname, const std::vector< double > &v, MVOdbError *error)
void RSAI(const char *varname, int index, std::string *value, MVOdbError *error)
void WIA(const char *varname, const std::vector< int > &v, MVOdbError *error)
void RU32AI(const char *varname, int index, uint32_t *value, MVOdbError *error)
void RAI(const char *varname, int index, int tid, void *value, int size, MVOdbError *error)
bool RXA(const char *varname, int tid, std::vector< X > *value, bool create, int create_size, MVOdbError *error)
std::string Path(const char *varname)
void WI(const char *varname, int v, MVOdbError *error)
void WS(const char *varname, const char *v, int string_length, MVOdbError *error)
void ReadKeyLastWritten(const char *varname, int *last_written, MVOdbError *error)
void WU64AI(const char *varname, int index, uint64_t v, MVOdbError *error)
void RI(const char *varname, int *value, bool create, MVOdbError *error)
void RU32A(const char *varname, std::vector< uint32_t > *value, bool create, int create_size, MVOdbError *error)
void WSA(const char *varname, const std::vector< std::string > &v, int odb_string_size, MVOdbError *error)
void ResizeArray(const char *varname, int new_size, MVOdbError *error)
void RDAI(const char *varname, int index, double *value, MVOdbError *error)
void WBAI(const char *varname, int index, bool v, MVOdbError *error)
void RBA(const char *varname, std::vector< bool > *value, bool create, int create_size, MVOdbError *error)
void RFA(const char *varname, std::vector< float > *value, bool create, int create_size, MVOdbError *error)
void Delete(const char *odbname, MVOdbError *error)
void WB(const char *varname, bool v, MVOdbError *error)
void RU64AI(const char *varname, int index, uint64_t *value, MVOdbError *error)
void WU16A(const char *varname, const std::vector< uint16_t > &v, MVOdbError *error)
void ReadKey(const char *varname, int *tid, int *num_values, int *total_size, int *item_size, MVOdbError *error)
void WDAI(const char *varname, int index, double v, MVOdbError *error)
void WBA(const char *varname, const std::vector< bool > &v, MVOdbError *error)
void ReadDir(std::vector< std::string > *varname, std::vector< int > *tid, std::vector< int > *num_values, std::vector< int > *total_size, std::vector< int > *item_size, MVOdbError *error)
void RU16A(const char *varname, std::vector< uint16_t > *value, bool create, int create_size, MVOdbError *error)
void RU16(const char *varname, uint16_t *value, bool create, MVOdbError *error)
void WU32A(const char *varname, const std::vector< uint32_t > &v, MVOdbError *error)
void WFA(const char *varname, const std::vector< float > &v, MVOdbError *error)
void WD(const char *varname, double v, MVOdbError *error)
void WSAI(const char *varname, int index, const char *v, MVOdbError *error)
void RS(const char *varname, std::string *value, bool create, int create_string_length, MVOdbError *error)
bool RA(const std::string &path, int tid, void *buf, int size, MVOdbError *error)
void RBAI(const char *varname, int index, bool *value, MVOdbError *error)
void WU32AI(const char *varname, int index, uint32_t v, MVOdbError *error)
void RU16AI(const char *varname, int index, uint16_t *value, MVOdbError *error)
void WF(const char *varname, float v, MVOdbError *error)
void RU32(const char *varname, uint32_t *value, bool create, MVOdbError *error)
void WA(const char *varname, int tid, const void *v, int size, int count, MVOdbError *error)
void WAI(const char *varname, int index, int tid, const void *v, int size, MVOdbError *error)
void WFAI(const char *varname, int index, float v, MVOdbError *error)
void SetMidasStatus(MVOdbError *error, bool print, const std::string &path, const char *midas_func_name, int status)
void SetError(MVOdbError *error, bool print, const std::string &path, const std::string &message)
void SetOk(MVOdbError *error)
MVOdb * MakeMidasOdb(int hDB, MVOdbError *error)
static std::string toString(int value)