24 snprintf(buf,
sizeof(buf),
"%d", i);
71 msg +=
"Cannot find ";
94 msg +=
"JSON node type mismatch: cannot convert node type ";
96 msg +=
" to c++ type ";
108 template <
typename T>
129 if (*path==0 || *path==
'/')
143 assert(s->size() == n->size());
145 for (
unsigned i=0; i<s->size(); i++) {
147 if (strcasecmp((elem+
"/key").c_str(), (*s)[i].c_str()) == 0) {
152 if (strcasecmp(elem.c_str(), (*s)[i].c_str()) == 0) {
173 return missing_value;
194 msg +=
" JSON node is ";
198 msg +=
" instead of subdirectory";
216 void ReadKey(
const char* varname,
int *tid,
int *num_values,
int *total_size,
int *item_size,
MVOdbError* error)
231 if (tid) *tid =
GetInt(node,
"type", 0);
232 if (num_values) *num_values =
GetInt(node,
"num_values", 1);
233 if (total_size) *total_size = 0;
234 if (item_size) *item_size =
GetInt(node,
"item_size", 0);
252 if (last_written) *last_written =
GetInt(node,
"last_written", 0);
257 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)
266 assert(sv->size() == nv->size());
268 for (
size_t i=0; i<nv->size(); i++) {
269 const char* s = (*sv)[i].c_str();
274 size_t len = strlen(s);
293 tid->push_back(
GetInt(n,
"type", 0));
295 num_values->push_back(
GetInt(n,
"num_values", 1));
297 total_size->push_back(0);
299 item_size->push_back(
GetInt(n,
"item_size", 0));
301 varname->push_back((*sv)[i].substr(0, len-4));
308 void RB(
const char* varname,
bool *value,
bool create,
MVOdbError* error)
310 RBAI(varname, 0, value, error);
313 void RI(
const char* varname,
int *value,
bool create,
MVOdbError* error)
315 RIAI(varname, 0, value, error);
318 void RD(
const char* varname,
double *value,
bool create,
MVOdbError* error)
320 RDAI(varname, 0, value, error);
323 void RF(
const char* varname,
float *value,
bool create,
MVOdbError* error)
325 RFAI(varname, 0, value, error);
328 void RS(
const char* varname, std::string *value,
bool create,
int create_string_length,
MVOdbError* error)
330 RSAI(varname, 0, value, error);
335 RU16AI(varname, 0, value, error);
340 RU32AI(varname, 0, value, error);
345 RU64AI(varname, 0, value, error);
348 template <
typename T>
365 SetVarError(error, varname,
"JSON node is a subdirectory");
371 int num_values = a->size();
375 for (
int i=0; i<num_values; i++) {
378 bool ok = GetJsonValue<T>(varname, elem, &v, error);
385 bool ok = GetJsonValue<T>(varname, node, &v, error);
393 void RBA(
const char* varname, std::vector<bool> *value,
bool create,
int create_size,
MVOdbError* error)
395 RXA(varname, value, error);
398 void RIA(
const char* varname, std::vector<int> *value,
bool create,
int create_size,
MVOdbError* error)
400 RXA(varname, value, error);
403 void RDA(
const char* varname, std::vector<double> *value,
bool create,
int create_size,
MVOdbError* error)
405 RXA(varname, value, error);
408 void RFA(
const char* varname, std::vector<float> *value,
bool create,
int create_size,
MVOdbError* error)
410 RXA(varname, value, error);
413 void RSA(
const char* varname, std::vector<std::string> *value,
bool create,
int create_size,
int create_string_length,
MVOdbError* error)
415 RXA(varname, value, error);
418 void RU16A(
const char* varname, std::vector<uint16_t> *value,
bool create,
int create_size,
MVOdbError* error)
420 RXA(varname, value, error);
423 void RU32A(
const char* varname, std::vector<uint32_t> *value,
bool create,
int create_size,
MVOdbError* error)
425 RXA(varname, value, error);
428 void RU64A(
const char* varname, std::vector<uint64_t> *value,
bool create,
int create_size,
MVOdbError* error)
430 RXA(varname, value, error);
433 template <
typename T>
451 SetVarError(error, varname,
"JSON node is a subdirectory");
458 int num_values = a->size();
464 msg +=
" for array of size ";
470 if (index >= num_values) {
474 msg +=
" for array of size ";
482 GetJsonValue<T>(varname, elem, value, error);
487 msg +=
"non-zero index ";
489 msg +=
" for non-array";
494 GetJsonValue<T>(varname, node, value, error);
501 RXAI(varname, index, value, error);
506 RXAI(varname, index, value, error);
511 RXAI(varname, index, value, error);
516 RXAI(varname, index, value, error);
521 RXAI(varname, index, value, error);
526 RXAI(varname, index, value, error);
531 RXAI(varname, index, value, error);
536 RXAI(varname, index, value, error);
545 void WS(
const char* varname,
const char* v,
int string_length,
MVOdbError* error) {
SetOk(error); };
554 void WSA(
const char* varname,
const std::vector<std::string>& data,
int odb_string_length,
MVOdbError* error) {
SetOk(error); };
578 default:
SetWrongType(error, varname, node,
"int");
return false;
583bool JsonOdb::GetJsonValue<double>(
const char* varname,
const MJsonNode* node,
double* value,
MVOdbError* error)
588 default:
SetWrongType(error, varname, node,
"double");
return false;
593bool JsonOdb::GetJsonValue<float>(
const char* varname,
const MJsonNode* node,
float* value,
MVOdbError* error)
598 default:
SetWrongType(error, varname, node,
"float");
return false;
603bool JsonOdb::GetJsonValue<bool>(
const char* varname,
const MJsonNode* node,
bool* value,
MVOdbError* error)
609 default:
SetWrongType(error, varname, node,
"bool");
return false;
614bool JsonOdb::GetJsonValue<uint16_t>(
const char* varname,
const MJsonNode* node, uint16_t* value,
MVOdbError* error)
619 default:
SetWrongType(error, varname, node,
"uint16_t");
return false;
624bool JsonOdb::GetJsonValue<uint32_t>(
const char* varname,
const MJsonNode* node, uint32_t* value,
MVOdbError* error)
629 default:
SetWrongType(error, varname, node,
"uint32_t");
return false;
634bool JsonOdb::GetJsonValue<uint64_t>(
const char* varname,
const MJsonNode* node, uint64_t* value,
MVOdbError* error)
639 if (
sizeof(uint64_t) ==
sizeof(
long))
640 *value = strtoul(node->
GetString().c_str(), NULL, 0);
641 else if (
sizeof(uint64_t) ==
sizeof(
long long))
642 *value = strtoull(node->
GetString().c_str(), NULL, 0);
647 default:
SetWrongType(error, varname, node,
"uint64_t");
return false;
652bool JsonOdb::GetJsonValue<std::string>(
const char* varname,
const MJsonNode* node, std::string* value,
MVOdbError* error)
656 default: SetWrongType(error, varname, node,
"std::string");
return false;
665 FILE *fp = fopen(filename,
"r");
668 msg +=
"Cannot open file ";
672 msg +=
" fopen() errno: ";
675 msg += strerror(errno);
677 SetError(error,
true, filename, msg);
683 const char* s = fgets(buf,
sizeof(buf), fp);
695 return new JsonOdb(root, root, error);
702 return new JsonOdb(root, root, error);
Access to ODB saved in JSON format inside midas .mid files.
void WU32AI(const char *varname, int index, uint32_t v, MVOdbError *error)
void WU64(const char *varname, uint64_t v, MVOdbError *error)
void WB(const char *varname, bool v, MVOdbError *error)
void WF(const char *varname, float v, MVOdbError *error)
void RDA(const char *varname, std::vector< double > *value, bool create, int create_size, MVOdbError *error)
static const MJsonNode * FindPath(const MJsonNode *dir, const char *path, bool return_key=false)
Follow the ODB path through the JSON tree.
void WU16(const char *varname, uint16_t v, MVOdbError *error)
void WI(const char *varname, int v, MVOdbError *error)
void WD(const char *varname, double v, MVOdbError *error)
void RU16AI(const char *varname, int index, uint16_t *value, MVOdbError *error)
void SetNotFound(MVOdbError *error, const char *varname)
void WBAI(const char *varname, int index, bool v, MVOdbError *error)
void WIAI(const char *varname, int index, int v, MVOdbError *error)
void ReadKeyLastWritten(const char *varname, int *last_written, MVOdbError *error)
void RU64AI(const char *varname, int index, uint64_t *value, MVOdbError *error)
void WS(const char *varname, const char *v, int string_length, MVOdbError *error)
void RU16A(const char *varname, std::vector< uint16_t > *value, bool create, int create_size, MVOdbError *error)
void RSAI(const char *varname, int index, std::string *value, MVOdbError *error)
void RU64(const char *varname, uint64_t *value, bool create, MVOdbError *error)
void RBA(const char *varname, std::vector< bool > *value, bool create, int create_size, MVOdbError *error)
void RXA(const char *varname, std::vector< T > *value, MVOdbError *error)
void RB(const char *varname, bool *value, bool create, MVOdbError *error)
void WSA(const char *varname, const std::vector< std::string > &data, int odb_string_length, MVOdbError *error)
void RFA(const char *varname, std::vector< float > *value, bool create, int create_size, MVOdbError *error)
void RS(const char *varname, std::string *value, bool create, int create_string_length, MVOdbError *error)
void WU16A(const char *varname, const std::vector< uint16_t > &v, MVOdbError *error)
void SetPrintError(bool v)
void Delete(const char *odbname, MVOdbError *error)
void RU32A(const char *varname, std::vector< uint32_t > *value, bool create, int create_size, MVOdbError *error)
void ReadKey(const char *varname, int *tid, int *num_values, int *total_size, int *item_size, MVOdbError *error)
void RXAI(const char *varname, int index, T *value, MVOdbError *error)
bool GetPrintError() const
void WBA(const char *varname, const std::vector< bool > &v, MVOdbError *error)
void RD(const char *varname, double *value, bool create, MVOdbError *error)
void WFA(const char *varname, const std::vector< float > &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)
MVOdb * Chdir(const char *subdir, bool create, MVOdbError *error)
static int GetInt(const MJsonNode *dir, const char *name, int missing_value)
void RU16(const char *varname, uint16_t *value, bool create, MVOdbError *error)
void RU32(const char *varname, uint32_t *value, bool create, MVOdbError *error)
void WU64A(const char *varname, const std::vector< uint64_t > &v, MVOdbError *error)
void WU16AI(const char *varname, int index, uint16_t v, MVOdbError *error)
void RF(const char *varname, float *value, bool create, MVOdbError *error)
void WDAI(const char *varname, int index, double v, MVOdbError *error)
void RIAI(const char *varname, int index, int *value, MVOdbError *error)
void WDA(const char *varname, const std::vector< double > &v, MVOdbError *error)
void WU32(const char *varname, uint32_t v, MVOdbError *error)
JsonOdb(MJsonNode *root, const MJsonNode *dir, MVOdbError *error)
void RSA(const char *varname, std::vector< std::string > *value, bool create, int create_size, int create_string_length, MVOdbError *error)
void RU64A(const char *varname, std::vector< uint64_t > *value, bool create, int create_size, MVOdbError *error)
void RI(const char *varname, int *value, bool create, MVOdbError *error)
void WU64AI(const char *varname, int index, uint64_t v, MVOdbError *error)
void WSAI(const char *varname, int index, const char *v, MVOdbError *error)
void RFAI(const char *varname, int index, float *value, MVOdbError *error)
void SetVarError(MVOdbError *error, const char *varname, std::string msg)
void WIA(const char *varname, const std::vector< int > &v, MVOdbError *error)
void WU32A(const char *varname, const std::vector< uint32_t > &v, MVOdbError *error)
void RBAI(const char *varname, int index, bool *value, MVOdbError *error)
void RDAI(const char *varname, int index, double *value, MVOdbError *error)
void RIA(const char *varname, std::vector< int > *value, bool create, int create_size, MVOdbError *error)
void WFAI(const char *varname, int index, float v, MVOdbError *error)
void SetWrongType(MVOdbError *error, const char *varname, const MJsonNode *node, const char *wanted_type)
bool GetJsonValue(const char *varname, const MJsonNode *node, T *value, MVOdbError *error)
void RU32AI(const char *varname, int index, uint32_t *value, MVOdbError *error)
std::string GetString() const
find subnode with given name, NULL if not object, NULL is name not found
const MJsonNodeVector * GetArray() const
get node type: MJSON_xxx
int GetType() const
delete a node from an object
std::vector< MJsonNode * > MJsonNodeVector
std::vector< std::string > MJsonStringVector
long long GetInt() const
get string value, "" if not string or value is JSON "null"
double GetDouble() const
get 64-bit long long value, 0 if not an integer or value is JSON "null"
const MJsonNodeVector * GetObjectNodes() const
get array of object names, NULL if not object, empty array if value is JSON "null"
bool GetBool() const
get number or integer value, 0 if not a number or value is JSON "null"
const MJsonStringVector * GetObjectNames() const
get array value, NULL if not array, empty array if value is JSON "null"
const MJsonNode * FindObjectNode(const char *name) const
get array of object subnodes, NULL if not object, empty array if value is JSON "null"
static MJsonNode * Parse(const char *jsonstring)
static const char * TypeToString(int type)
get error message from MJSON_ERROR nodes
void SetError(MVOdbError *error, bool print, const std::string &path, const std::string &message)
void SetOk(MVOdbError *error)
MVOdb * MakeJsonFileOdb(const char *filename, MVOdbError *error)
static std::string toString(int i)
MVOdb * MakeJsonBufferOdb(const char *buf, int bufsize, MVOdbError *error)