120 return tv.tv_sec*1.0 +
tv.tv_usec/1000000.0;
125 MJsonNode*
errnode = MJsonNode::MakeObject();
126 errnode->AddToObject(
"code", MJsonNode::MakeInt(code));
128 errnode->AddToObject(
"data", MJsonNode::MakeString(
data));
130 MJsonNode* result = MJsonNode::MakeObject();
131 result->AddToObject(
"error",
errnode);
137 MJsonNode* result = MJsonNode::MakeObject();
138 result->AddToObject(
"result",
node);
144 MJsonNode*
node = MJsonNode::MakeObject();
153 MJsonNode* result = MJsonNode::MakeObject();
154 result->AddToObject(
"result",
node);
160 MJsonNode*
node = MJsonNode::MakeObject();
171 MJsonNode* result = MJsonNode::MakeObject();
172 result->AddToObject(
"result",
node);
185 *error = MJsonNode::MakeObject();
189 const MJsonNode*
obj = params->FindObjectNode(
name);
206 *error = MJsonNode::MakeObject();
213 if (error && *error) {
234 p->AddToObject(
"description", MJsonNode::MakeString(
description));
235 p->AddToObject(
"type", MJsonNode::MakeString(
"object"));
237 p->
required = MJsonNode::MakeArray();
239 p->AddToObject(
"required", p->
required);
246 p->AddToObject(
"description", MJsonNode::MakeString(
description));
247 p->AddToObject(
"type", MJsonNode::MakeString(
"array"));
248 p->
items = MJsonNode::MakeArray();
249 p->AddToObject(
"items", p->
items);
253static std::string
remove(
const std::string s,
char c)
255 std::string::size_type pos = s.find(
c);
256 if (pos == std::string::npos)
259 return s.substr(0, pos);
277 s->AddToObject(
"optional", MJsonNode::MakeBool(
true));
281 s->DeleteObjectNode(
"description");
282 ss->AddToSchema(s,
"");
287 items->AddToArray(s);
293 required->AddToArray(MJsonNode::MakeString(
name.c_str()));
358 MJsonNode* p = MJsonNode::MakeObject();
359 p->AddToObject(
"description", MJsonNode::MakeString(
description));
361 p->AddToObject(
"type", MJsonNode::MakeString(
"array"));
363 p->AddToObject(
"type", MJsonNode::MakeString(
"object"));
365 p->AddToObject(
"type", MJsonNode::MakeString(
"string"));
367 p->AddToObject(
"type", MJsonNode::MakeString(
"integer"));
369 p->AddToObject(
"type", MJsonNode::MakeString(
"number"));
371 p->AddToObject(
"type", MJsonNode::MakeString(
"bool"));
373 p->AddToObject(
"type", MJsonNode::MakeString(
"null"));
375 p->AddToObject(
"type", MJsonNode::MakeString(
"arraybuffer"));
377 p->AddToObject(
"type", MJsonNode::MakeString(
"json"));
381 assert(!
"invalid value of mjson_type");
388 s->AddToObject(
"description", MJsonNode::MakeString(
description));
389 s->AddToObject(
"type", MJsonNode::MakeString(
"object"));
397 s->AddToObject(
"description", MJsonNode::MakeString(
description));
398 s->AddToObject(
"type", MJsonNode::MakeString(
"array"));
413static MJsonNode*
xnull(
const MJsonNode* params)
417 doc->D(
"RPC method always returns null");
418 doc->P(
NULL, 0,
"method parameters are ignored");
436 doc->D(
"calls MIDAS cm_exist() to check if given MIDAS program is running");
437 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
438 doc->P(
"unique?",
MJSON_BOOL,
"bUnique argument to cm_exist()");
439 doc->R(
"status",
MJSON_INT,
"return status of cm_exist()");
443 MJsonNode* error =
NULL;
463 doc->D(
"calls MIDAS cm_shutdown() to stop given MIDAS program");
464 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
465 doc->P(
"unique?",
MJSON_BOOL,
"bUnique argument to cm_shutdown()");
466 doc->R(
"status",
MJSON_INT,
"return status of cm_shutdown()");
470 MJsonNode* error =
NULL;
490 doc->D(
"start MIDAS program defined in ODB /Programs/name");
491 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
492 doc->R(
"status",
MJSON_INT,
"return status of ss_system()");
496 MJsonNode* error =
NULL;
500 std::string path =
"";
501 path +=
"/Programs/";
503 path +=
"/Start command";
509 int size =
sizeof(command);
523 doc->D(
"execute custom script defined in ODB /Script (scripts show in the menu) or /CustomScript (scripts from custom pages)");
525 doc->P(
"customscript?",
MJSON_STRING,
"Execute ODB /CustomScript/xxx");
526 doc->R(
"status",
MJSON_INT,
"return status of cm_exec_script()");
535 if (
script.length() > 0) {
540 path +=
"/CustomScript";
547 if (path.length() > 0) {
568 const char*s =
strchr(path,
'[');
571 cm_msg(
MERROR, method,
"expected an array index character \'[\' in \"%s\"", path);
577 while (s && (*s != 0)) {
581 cm_msg(
MERROR, method,
"expected a number in array index in \"%s\" at \"%s\"", path, s);
592 cm_msg(
MERROR, method,
"expected a number in array index in \"%s\" at \"%s\"", path, s);
626 cm_msg(
MERROR, method,
"invalid char in array index in \"%s\" at \"%s\"", path, s);
631 printf(
"parsed array indices for \"%s\" size is %d: ", path, (
int)
list->size());
632 for (
unsigned i=0;
i<
list->size();
i++)
644 doc->D(
"get values of ODB data from given subtrees");
645 doc->P(
"paths[]",
MJSON_STRING,
"array of ODB subtree paths, see note on array indices");
647 doc->P(
"omit_last_written?",
MJSON_BOOL,
"omit the /last_written entries and the last_written[] result");
649 doc->P(
"omit_old_timestamp?",
MJSON_NUMBER,
"omit data older than given ODB timestamp");
650 doc->P(
"preserve_case?",
MJSON_BOOL,
"preserve the capitalization of ODB key names (WARNING: ODB is not case sensitive); note that this will also have side effect of setting the omit_names option");
651 doc->R(
"data[]", 0,
"values of ODB data for each path, all key names are in lower case, all symlinks are followed");
652 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_values() or db_copy_json_index() for each path");
653 doc->R(
"tid?[]",
MJSON_INT,
"odb type id for each path, absent if omit_tid is true");
654 doc->R(
"last_written?[]",
MJSON_NUMBER,
"last_written value of the ODB subtree for each path, absent if omit_last_written is true");
658 MJsonNode* error =
NULL;
669 MJsonNode*
dresult = MJsonNode::MakeArray();
670 MJsonNode*
sresult = MJsonNode::MakeArray();
671 MJsonNode*
tresult = MJsonNode::MakeArray();
672 MJsonNode*
lwresult = MJsonNode::MakeArray();
677 for (
unsigned i=0;
i<
paths->size();
i++) {
681 std::string path = (*paths)[
i]->GetString();
685 dresult->AddToArray(MJsonNode::MakeNull());
687 tresult->AddToArray(MJsonNode::MakeNull());
688 lwresult->AddToArray(MJsonNode::MakeNull());
694 dresult->AddToArray(MJsonNode::MakeNull());
696 tresult->AddToArray(MJsonNode::MakeNull());
697 lwresult->AddToArray(MJsonNode::MakeNull());
701 if (path.find(
"[") != std::string::npos) {
702 std::vector<unsigned>
list;
706 dresult->AddToArray(MJsonNode::MakeNull());
713 if (
list.size() > 1) {
714 MJsonNode *
ddresult = MJsonNode::MakeArray();
715 MJsonNode *
ssresult = MJsonNode::MakeArray();
717 for (
unsigned i=0;
i<
list.size();
i++) {
725 ddresult->AddToArray(MJsonNode::MakeJSON(buf));
728 ddresult->AddToArray(MJsonNode::MakeNull());
749 dresult->AddToArray(MJsonNode::MakeJSON(buf));
754 dresult->AddToArray(MJsonNode::MakeNull());
773 dresult->AddToArray(MJsonNode::MakeJSON(buf));
778 dresult->AddToArray(MJsonNode::MakeNull());
789 MJsonNode* result = MJsonNode::MakeObject();
791 result->AddToObject(
"data",
dresult);
792 result->AddToObject(
"status",
sresult);
794 result->AddToObject(
"tid",
tresult);
798 result->AddToObject(
"last_written",
lwresult);
809 doc->D(
"get contents of given ODB subdirectory in the \"ls\" json encoding - similar to odbedit command \"ls -l\"");
811 doc->R(
"data[]",
MJSON_OBJECT,
"keys and values of ODB data for each path");
812 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_ls() for each path");
816 MJsonNode* error =
NULL;
820 MJsonNode*
dresult = MJsonNode::MakeArray();
821 MJsonNode*
sresult = MJsonNode::MakeArray();
826 for (
unsigned i=0;
i<
paths->size();
i++) {
829 std::string path = (*paths)[
i]->GetString();
833 dresult->AddToArray(MJsonNode::MakeNull());
846 dresult->AddToArray(MJsonNode::MakeJSON(buf));
849 dresult->AddToArray(MJsonNode::MakeNull());
864 doc->D(
"get complete ODB data in the \"save\" json encoding, suitable for reloading with odbedit command \"load\"");
866 doc->R(
"data[]",
MJSON_OBJECT,
"keys and values of ODB data for each path");
867 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_save() for each path");
871 MJsonNode* error =
NULL;
875 MJsonNode*
dresult = MJsonNode::MakeArray();
876 MJsonNode*
sresult = MJsonNode::MakeArray();
881 for (
unsigned i=0;
i<
paths->size();
i++) {
884 std::string path = (*paths)[
i]->GetString();
888 dresult->AddToArray(MJsonNode::MakeNull());
901 dresult->AddToArray(MJsonNode::MakeJSON(buf));
904 dresult->AddToArray(MJsonNode::MakeNull());
919 doc->D(
"write data into ODB");
920 doc->P(
"paths[]",
MJSON_STRING,
"array of ODB subtree paths, see note on array indices");
921 doc->P(
"values[]", 0,
"array of data values written to ODB via db_paste_json() for each path");
922 doc->R(
"status[]",
MJSON_INT,
"array of return status of db_paste_json() for each path");
926 MJsonNode* error =
NULL;
932 return mjsonrpc_make_error(-32602,
"Invalid params",
"paths and values should have the same length");
935 MJsonNode*
sresult = MJsonNode::MakeArray();
940 for (
unsigned i=0;
i<
paths->size();
i++) {
943 std::string path = (*paths)[
i]->GetString();
951 const MJsonNode* v = (*values)[
i];
954 if (path.find(
"[*]") != std::string::npos) {
961 }
else if (path.find(
"[") != std::string::npos) {
962 std::vector<unsigned>
list;
975 if (
list.size() < 1) {
976 cm_msg(
MERROR,
"js_db_paste",
"invalid array indices for array path \"%s\"", path.c_str());
979 }
else if (
list.size() == 1) {
981 cm_msg(
MERROR,
"js_db_paste",
"unexpected array of values for array path \"%s\"", path.c_str());
992 cm_msg(
MERROR,
"js_db_paste",
"length of values array %d should be same as number of indices %d for array path \"%s\"", (
int)
vvalues->size(), (
int)
list.size(), path.c_str());
997 MJsonNode *
ssresult = MJsonNode::MakeArray();
999 for (
unsigned j =0;
j <
list.size();
j++) {
1000 const MJsonNode*
vv = (*vvalues)[
j];
1003 cm_msg(
MERROR,
"js_db_paste",
"internal error: NULL array value at index %d for array path \"%s\"",
j, path.c_str());
1014 MJsonNode *
ssresult = MJsonNode::MakeArray();
1015 for (
unsigned j =0;
j <
list.size();
j++) {
1034 doc->D(
"Create new ODB entries");
1035 MJSO*
o =
doc->
PA(
"array of ODB paths to be created")->
AddObject(
"",
"arguments to db_create_key() and db_set_num_values()");
1037 o->Add(
"type",
MJSON_INT,
"MIDAS TID_xxx type");
1038 o->Add(
"array_length?",
MJSON_INT,
"optional array length, default is 1");
1039 o->Add(
"string_length?",
MJSON_INT,
"for TID_STRING, optional string length, default is NAME_LENGTH");
1040 doc->R(
"status[]",
MJSON_INT,
"return status of db_create_key(), db_set_num_values() and db_set_data() (for TID_STRING) for each path");
1044 MJsonNode*
sresult = MJsonNode::MakeArray();
1050 return mjsonrpc_make_error(-32602,
"Invalid params",
"parameters must be an array of objects");
1056 for (
unsigned i=0;
i<
pp->size();
i++) {
1057 const MJsonNode* p = (*pp)[
i];
1075 assert(buf !=
NULL);
1099 doc->D(
"delete ODB keys");
1101 doc->R(
"status[]",
MJSON_INT,
"return status of db_delete_key() for each path");
1105 MJsonNode* error =
NULL;
1109 MJsonNode*
sresult = MJsonNode::MakeArray();
1114 for (
unsigned i=0;
i<
paths->size();
i++) {
1117 std::string path = (*paths)[
i]->GetString();
1136 doc->D(
"Change size of ODB arrays");
1138 doc->P(
"new_lengths[]",
MJSON_INT,
"array of new lengths for each ODB path");
1139 doc->R(
"status[]",
MJSON_INT,
"return status of db_set_num_values() for each path");
1143 MJsonNode* error =
NULL;
1149 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_lengths\" should have the same length");
1152 MJsonNode*
sresult = MJsonNode::MakeArray();
1157 for (
unsigned i=0;
i<
paths->size();
i++) {
1160 std::string path = (*paths)[
i]->GetString();
1168 int length = (*lengths)[
i]->GetInt();
1185 doc->D(
"Change size of ODB string arrays");
1187 doc->P(
"new_lengths[]",
MJSON_INT,
"array of new lengths for each ODB path");
1188 doc->P(
"new_string_lengths[]",
MJSON_INT,
"array of new string lengths for each ODB path");
1189 doc->R(
"status[]",
MJSON_INT,
"return status of db_resize_string() for each path");
1193 MJsonNode* error =
NULL;
1200 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_lengths\" should have the same length");
1204 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_string_lengths\" should have the same length");
1207 MJsonNode*
sresult = MJsonNode::MakeArray();
1212 for (
unsigned i=0;
i<
paths->size();
i++) {
1213 std::string path = (*paths)[
i]->GetString();
1215 int length = (*lengths)[
i]->GetInt();
1238 doc->D(
"get ODB keys");
1240 doc->R(
"status[]",
MJSON_INT,
"return status of db_key() for each path");
1243 doc->R(
"keys[].num_values",
MJSON_INT,
"array length, 1 for normal entries");
1245 doc->R(
"keys[].total_size",
MJSON_INT,
"data total size in bytes");
1246 doc->R(
"keys[].item_size",
MJSON_INT,
"array element size, string length for TID_STRING");
1247 doc->R(
"keys[].access_mode",
MJSON_INT,
"access mode bitmap of MODE_xxx");
1248 doc->R(
"keys[].notify_count",
MJSON_INT,
"number of hotlinks attached to this key");
1249 doc->R(
"keys[].last_written",
MJSON_INT,
"timestamp when data was last updated");
1253 MJsonNode* error =
NULL;
1257 MJsonNode*
kresult = MJsonNode::MakeArray();
1258 MJsonNode*
sresult = MJsonNode::MakeArray();
1263 for (
unsigned i=0;
i<
paths->size();
i++) {
1267 std::string path = (*paths)[
i]->GetString();
1271 kresult->AddToArray(MJsonNode::MakeNull());
1278 kresult->AddToArray(MJsonNode::MakeNull());
1283 MJsonNode*
jkey = MJsonNode::MakeObject();
1285 jkey->AddToObject(
"type", MJsonNode::MakeInt(
key.
type));
1288 jkey->AddToObject(
"name", MJsonNode::MakeString(
key.
name));
1306 doc->D(
"Change size of ODB arrays");
1308 doc->P(
"new_names[]",
MJSON_STRING,
"array of new names for each ODB path");
1309 doc->R(
"status[]",
MJSON_INT,
"return status of db_rename_key() for each path");
1313 MJsonNode* error =
NULL;
1319 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_names\" should have the same length");
1322 MJsonNode*
sresult = MJsonNode::MakeArray();
1327 for (
unsigned i=0;
i<
paths->size();
i++) {
1330 std::string path = (*paths)[
i]->GetString();
1338 std::string
new_name = (*names)[
i]->GetString();
1356 doc->D(
"Create ODB symlinks");
1357 doc->P(
"new_links[]",
MJSON_STRING,
"array of new symlinks to be created");
1358 doc->P(
"target_paths[]",
MJSON_STRING,
"array of existing ODB paths for each link");
1359 doc->R(
"status[]",
MJSON_INT,
"return status of db_create_link() for each path");
1363 MJsonNode* error =
NULL;
1369 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"target_paths\" and \"new_links\" should have the same length");
1372 MJsonNode*
sresult = MJsonNode::MakeArray();
1379 std::string
target_path = (*target_paths)[
i]->GetString();
1380 std::string
new_link = (*new_links)[
i]->GetString();
1398 doc->D(
"Change order of ODB keys in a subdirectory");
1399 doc->P(
"paths[]",
MJSON_STRING,
"array of new symlinks to be created");
1400 doc->P(
"indices[]",
MJSON_INT,
"array of existing ODB paths for each link");
1401 doc->R(
"status[]",
MJSON_INT,
"return status of db_reorder_key() for each path");
1405 MJsonNode* error =
NULL;
1411 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"indices\" should have the same length");
1414 MJsonNode*
sresult = MJsonNode::MakeArray();
1419 for (
unsigned i=0;
i<
paths->size();
i++) {
1422 std::string path = (*paths)[
i]->GetString();
1423 int index = (*indices)[
i]->GetInt();
1443 doc->D(
"Show ODB open records starting from given ODB path");
1449 MJsonNode* error =
NULL;
1465 doc->D(
"Show ODB clients");
1488 doc->D(
"get message facilities using cm_msg_facilities()");
1489 doc->R(
"status",
MJSON_INT,
"return status of cm_msg_facilities()");
1498 MJsonNode*
facilities = MJsonNode::MakeArray();
1500 for (
unsigned i=0;
i<
list.size();
i++) {
1513 doc->D(
"Generate a midas message using cm_msg1()");
1514 doc->P(
"facility?",
MJSON_STRING,
"message facility, default is \"midas\"");
1515 doc->P(
"user?",
MJSON_STRING,
"message user, default is \"javascript_commands\"");
1516 doc->P(
"type?",
MJSON_INT,
"message type, MT_xxx from midas.h, default is MT_INFO");
1518 doc->R(
"status",
MJSON_INT,
"return status of cm_msg1()");
1522 MJsonNode* error =
NULL;
1532 user =
"javascript_commands";
1545 doc->D(
"Retrieve midas messages using cm_msg_retrieve2()");
1546 doc->P(
"facility?",
MJSON_STRING,
"message facility, default is \"midas\"");
1547 doc->P(
"min_messages?",
MJSON_INT,
"get at least this many messages, default is 1");
1548 doc->P(
"time?",
MJSON_NUMBER,
"start from given timestamp, value 0 means give me newest messages, default is 0");
1549 doc->R(
"num_messages",
MJSON_INT,
"number of messages returned");
1551 doc->R(
"status",
MJSON_INT,
"return status of cm_msg_retrieve2()");
1567 MJsonNode* result = MJsonNode::MakeObject();
1569 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
1570 result->AddToObject(
"num_messages", MJsonNode::MakeInt(
num_messages));
1574 result->AddToObject(
"messages", MJsonNode::MakeString(
messages));
1592 doc->D(
"reset alarms");
1594 doc->R(
"status[]",
MJSON_INT,
"return status of al_reset_alarm() for each alarm");
1598 MJsonNode* error =
NULL;
1602 MJsonNode*
sresult = MJsonNode::MakeArray();
1604 for (
unsigned i=0;
i<
alarms->size();
i++) {
1616 doc->D(
"trigger an alarm");
1622 doc->R(
"status",
MJSON_INT,
"return status of al_trigger_alarm()");
1626 MJsonNode* error =
NULL;
1631 std::string condition =
mjsonrpc_get_param(params,
"condition", &error)->GetString();
if (error)
return error;
1643 doc->D(
"trigger an alarm");
1646 doc->P(
"first?",
MJSON_BOOL,
"see al_trigger_class() in midas.c");
1647 doc->R(
"status",
MJSON_INT,
"return status of al_trigger_class()");
1651 MJsonNode* error =
NULL;
1674 doc->D(
"get list of active history events using hs_read_event_list()");
1675 doc->R(
"status",
MJSON_INT,
"return status of hs_read_event_list()");
1684 MJsonNode*
events = MJsonNode::MakeArray();
1686 for (
unsigned i=0;
i<
list.size();
i++) {
1694typedef std::map<std::string,MidasHistoryInterface*>
MhiMap;
1735 cm_msg(
MERROR,
"GetHistory",
"Cannot configure history, hs_get_history() status %d",
status);
1761 doc->D(
"get list of history channels in /Logger/History");
1762 doc->R(
"status",
MJSON_INT,
"return success or failure status");
1763 doc->R(
"default_channel",
MJSON_STRING,
"name of the default logger history channel");
1764 doc->R(
"channels[]",
MJSON_STRING,
"all logger history channel names");
1765 doc->R(
"active_channels[]",
MJSON_STRING,
"active logger history channel names");
1769 MJsonNode* channels = MJsonNode::MakeArray();
1801 channels->AddToArray(MJsonNode::MakeString(
key.
name));
1804 INT size =
sizeof(active);
1831 "channels", channels);
1838 doc->D(
"get list of history events that existed at give time using hs_get_events()");
1839 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1840 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1841 doc->R(
"status",
MJSON_INT,
"return status of hs_get_events()");
1852 MJsonNode*
events = MJsonNode::MakeArray();
1860 time = ::time(
NULL);
1867 for (
unsigned i=0;
i<
list.size();
i++) {
1879 doc->D(
"reopen the history channel to make sure we see the latest list of events using hs_clear_cache()");
1880 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1881 doc->R(
"status",
MJSON_INT,
"return status of hs_get_events()");
1904 doc->D(
"get list of history tags for given history events that existed at give time using hs_get_tags()");
1905 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1906 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1907 doc->P(
"events[]?",
MJSON_STRING,
"array of history event names, default is get all events using hs_get_events()");
1910 doc->R(
"events[].name",
MJSON_STRING,
"array of history event names for each history event");
1911 doc->R(
"events[].status",
MJSON_INT,
"array of status ohistory tags for each history event");
1912 doc->R(
"events[].tags[]",
MJSON_STRING,
"array of history tags for each history event");
1914 doc->R(
"events[].tags[].type",
MJSON_INT,
"history tag midas data type");
1915 doc->R(
"events[].tags[].n_data?",
MJSON_INT,
"history tag number of array elements, omitted if 1");
1924 time = ::time(
NULL);
1929 MJsonNode*
events = MJsonNode::MakeArray();
1936 std::vector<std::string> event_names;
1944 if (event_names.size() < 1) {
1951 for (
unsigned i=0;
i<event_names.size();
i++) {
1952 MJsonNode*
o = MJsonNode::MakeObject();
1953 const char* event_name = event_names[
i].c_str();
1954 std::vector<TAG> tags;
1957 o->AddToObject(
"name", MJsonNode::MakeString(event_name));
1958 o->AddToObject(
"status", MJsonNode::MakeInt(
status));
1959 MJsonNode *
ta = MJsonNode::MakeArray();
1960 for (
unsigned j=0;
j<tags.size();
j++) {
1961 MJsonNode*
to = MJsonNode::MakeObject();
1963 to->AddToObject(
"name", MJsonNode::MakeString(tags[
j].
name));
1964 to->AddToObject(
"type", MJsonNode::MakeInt(tags[
j].
type));
1965 if (tags[
j].n_data != 1) {
1966 to->AddToObject(
"n_data", MJsonNode::MakeInt(tags[
j].n_data));
1970 o->AddToObject(
"tags",
ta);
1982 doc->D(
"get list of history tags for given history events that existed at give time using hs_get_last_written()");
1983 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1984 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1987 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
1990 doc->R(
"last_written[]",
MJSON_NUMBER,
"array of last-written times for each history event");
2003 MJsonNode*
lw = MJsonNode::MakeArray();
2013 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2017 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2020 std::vector<std::string> event_names(
num_var);
2024 int* var_index =
new int[
num_var];
2030 event_names[
i] = (*events_array)[
i]->GetString();
2032 var_index[
i] = (*index_array)[
i]->GetInt();
2043 time = ::time(
NULL);
2047 const char** event_name =
new const char*[
num_var];
2048 const char** tag_name =
new const char*[
num_var];
2050 event_name[
i] = event_names[
i].c_str();
2057 printf(
"%d: last_written %d\n",
i, (
int)last_written[
i]);
2059 lw->AddToArray(MJsonNode::MakeNumber(last_written[
i]));
2062 delete[] event_name;
2065 delete[] last_written;
2096 fTimeJson += MJsonNode::EncodeDouble(t);
2111 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2112 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2117 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2121 doc->R(
"data[].status",
MJSON_INT,
"status for each event");
2122 doc->R(
"data[].count",
MJSON_INT,
"number of data for each event");
2128 MJsonNode* error =
NULL;
2131 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2132 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2140 MJsonNode*
data = MJsonNode::MakeArray();
2150 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2154 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2157 std::vector<std::string> event_names(
num_var);
2159 int* var_index =
new int[
num_var];
2167 event_names[
i] = (*events_array)[
i]->GetString();
2169 var_index[
i] = (*index_array)[
i]->GetInt();
2176 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
num_var);
2182 const char** event_name =
new const char*[
num_var];
2183 const char** tag_name =
new const char*[
num_var];
2185 event_name[
i] = event_names[
i].c_str();
2194 MJsonNode*
obj = MJsonNode::MakeObject();
2195 obj->AddToObject(
"status", MJsonNode::MakeInt(
hs_status[
i]));
2196 obj->AddToObject(
"count", MJsonNode::MakeInt(
jbuf[
i]->fCount));
2197 obj->AddToObject(
"time", MJsonNode::MakeJSON(
jbuf[
i]->fTimeJson.c_str()));
2198 obj->AddToObject(
"value", MJsonNode::MakeJSON(
jbuf[
i]->fValueJson.c_str()));
2206 delete[] event_name;
2220 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2221 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2227 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2231 doc->R(
"data[].status",
MJSON_INT,
"status for each event");
2232 doc->R(
"data[].num_entries",
MJSON_INT,
"number of data points for each event");
2233 doc->R(
"data[].count[]",
MJSON_INT,
"number of data points for each bin");
2238 doc->R(
"data[].bins_first_time[]",
MJSON_NUMBER,
"first data point in each bin");
2239 doc->R(
"data[].bins_first_value[]",
MJSON_NUMBER,
"first data point in each bin");
2240 doc->R(
"data[].bins_last_time[]",
MJSON_NUMBER,
"last data point in each bin");
2241 doc->R(
"data[].bins_last_value[]",
MJSON_NUMBER,
"last data point in each bin");
2243 doc->R(
"data[].last_value",
MJSON_NUMBER,
"value of last data entry");
2247 MJsonNode* error =
NULL;
2250 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2251 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2255 return mjsonrpc_make_error(-32602,
"Invalid params",
"Value of num_bins should be 1 or more");
2264 MJsonNode*
data = MJsonNode::MakeArray();
2274 return mjsonrpc_make_error(-32602,
"Invalid params",
"Array of events should have 1 or more elements");
2278 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2282 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2285 std::vector<std::string> event_names(
num_var);
2289 int* var_index =
new int[
num_var];
2291 int* num_entries =
new int[
num_var];
2311 event_names[
i] = (*events_array)[
i]->GetString();
2313 var_index[
i] = (*index_array)[
i]->GetInt();
2332 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
num_var);
2338 const char** event_name =
new const char*[
num_var];
2339 const char** tag_name =
new const char*[
num_var];
2341 event_name[
i] = event_names[
i].c_str();
2345 int status =
mh->
hs_read_binned(start_time, end_time,
num_bins,
num_var, event_name, tag_name, var_index, num_entries,
count_bins,
mean_bins,
rms_bins,
min_bins,
max_bins,
bins_first_time,
bins_first_value,
bins_last_time,
bins_last_value,
last_time,
last_value,
hs_status);
2348 MJsonNode*
obj = MJsonNode::MakeObject();
2349 obj->AddToObject(
"status", MJsonNode::MakeInt(
hs_status[
i]));
2350 obj->AddToObject(
"num_entries", MJsonNode::MakeInt(num_entries[
i]));
2352 MJsonNode*
a1 = MJsonNode::MakeArray();
2353 MJsonNode*
a2 = MJsonNode::MakeArray();
2354 MJsonNode*
a3 = MJsonNode::MakeArray();
2355 MJsonNode*
a4 = MJsonNode::MakeArray();
2356 MJsonNode*
a5 = MJsonNode::MakeArray();
2358 MJsonNode*
b1 = MJsonNode::MakeArray();
2359 MJsonNode*
b2 = MJsonNode::MakeArray();
2360 MJsonNode*
b3 = MJsonNode::MakeArray();
2361 MJsonNode*
b4 = MJsonNode::MakeArray();
2376 obj->AddToObject(
"count",
a1);
2377 obj->AddToObject(
"mean",
a2);
2378 obj->AddToObject(
"rms",
a3);
2379 obj->AddToObject(
"min",
a4);
2380 obj->AddToObject(
"max",
a5);
2381 obj->AddToObject(
"bins_first_time",
b1);
2382 obj->AddToObject(
"bins_first_value",
b2);
2383 obj->AddToObject(
"bins_last_time",
b3);
2384 obj->AddToObject(
"bins_last_value",
b4);
2385 obj->AddToObject(
"last_time", MJsonNode::MakeNumber(
last_time[
i]));
2386 obj->AddToObject(
"last_value", MJsonNode::MakeNumber(
last_value[
i]));
2412 delete[] event_name;
2416 delete[] num_entries;
2454 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2455 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2460 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2465 MJsonNode* error =
NULL;
2468 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2469 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2485 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2489 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2492 std::vector<std::string> event_names(
num_var);
2494 int* var_index =
new int[
num_var];
2502 event_names[
i] = (*events_array)[
i]->GetString();
2504 var_index[
i] = (*index_array)[
i]->GetInt();
2511 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
int(
num_var));
2517 const char** event_name =
new const char*[
num_var];
2518 const char** tag_name =
new const char*[
num_var];
2520 event_name[
i] = event_names[
i].c_str();
2526 size_t num_values = 0;
2530 num_values +=
jbuf[
i]->fValues.size();
2547 delete[] event_name;
2560 cm_msg(
MERROR,
"js_hs_read_binned_arraybuffer",
"Cannot allocate return buffer %d bytes\n",
int(
p0_size));
2568 delete[] event_name;
2575 return mjsonrpc_make_error(-32603,
"Internal error",
"Cannot allocate buffer, too much data");
2608 size_t nv =
jbuf[
i]->fValues.size();
2609 for (
size_t j=0;
j<
nv;
j++) {
2623 delete[] event_name;
2630 MJsonNode* result = MJsonNode::MakeArrayBuffer((
char*)
p0,
p0_size);
2639 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2640 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2646 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2651 MJsonNode* error =
NULL;
2654 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2655 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2659 return mjsonrpc_make_error(-32602,
"Invalid params",
"Value of num_bins should be 1 or more");
2678 return mjsonrpc_make_error(-32602,
"Invalid params",
"Array of events should have 1 or more elements");
2682 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2686 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2689 std::vector<std::string> event_names(
num_var);
2693 int* var_index =
new int[
num_var];
2695 int* num_entries =
new int[
num_var];
2715 event_names[
i] = (*events_array)[
i]->GetString();
2717 var_index[
i] = (*index_array)[
i]->GetInt();
2734 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
int(
num_var));
2740 const char** event_name =
new const char*[
num_var];
2741 const char** tag_name =
new const char*[
num_var];
2743 event_name[
i] = event_names[
i].c_str();
2747 int status =
mh->
hs_read_binned(start_time, end_time,
num_bins,
num_var, event_name, tag_name, var_index, num_entries,
count_bins,
mean_bins,
rms_bins,
min_bins,
max_bins,
bins_first_time,
bins_first_value,
bins_last_time,
bins_last_value,
last_time,
last_value,
hs_status);
2780 delete[] event_name;
2784 delete[] num_entries;
2795 cm_msg(
MERROR,
"js_hs_read_binned_arraybuffer",
"Cannot allocate return buffer %d bytes\n",
int(
p0_size));
2820 delete[] event_name;
2824 delete[] num_entries;
2829 return mjsonrpc_make_error(-32603,
"Internal error",
"Cannot allocate buffer, too much data");
2868 *
pptr++ = start_time;
2878 *
pptr++ = num_entries[
i];
2928 delete[] event_name;
2932 delete[] num_entries;
2937 MJsonNode* result = MJsonNode::MakeArrayBuffer((
char*)
p0,
p0_size);
2951 doc->D(
"Get a list of history image files");
2952 doc->P(
"image?",
MJSON_STRING,
"image name as defined under /History/Images/<image>");
2960 MJsonNode* error =
NULL;
2963 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2964 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2966 std::vector<time_t>
vtime{};
2971 MJsonNode *
tj = MJsonNode::MakeArray();
2972 MJsonNode *
fj = MJsonNode::MakeArray();
2975 tj->AddToArray(MJsonNode::MakeInt(
vtime[
i]));
2979 MJsonNode*
data = MJsonNode::MakeObject();
2980 data->AddToObject(
"count", MJsonNode::MakeInt(
count));
2981 data->AddToObject(
"time",
tj);
2982 data->AddToObject(
"filename",
fj);
2997 doc->D(
"Get an elog message");
2999 doc->R(
"status",
MJSON_INT,
"return status of el_retrieve");
3004 MJsonNode* error =
NULL;
3006 std::string tag =
mjsonrpc_get_param(params,
"tag", &error)->GetString();
if (error)
return error;
3015 int size =
sizeof(text);
3024 MJsonNode* msg = MJsonNode::MakeObject();
3028 msg->AddToObject(
"tag", MJsonNode::MakeString(
xtag));
3030 msg->AddToObject(
"date", MJsonNode::MakeString(
date));
3031 msg->AddToObject(
"run", MJsonNode::MakeInt(
run));
3033 msg->AddToObject(
"author", MJsonNode::MakeString(author));
3035 msg->AddToObject(
"type", MJsonNode::MakeString(
type));
3037 msg->AddToObject(
"system", MJsonNode::MakeString(
system));
3039 msg->AddToObject(
"subject", MJsonNode::MakeString(
subject));
3041 msg->AddToObject(
"text", MJsonNode::MakeString(text));
3043 msg->AddToObject(
"orig_tag", MJsonNode::MakeString(
orig_tag));
3045 msg->AddToObject(
"reply_tag", MJsonNode::MakeString(
reply_tag));
3047 msg->AddToObject(
"attachment0", MJsonNode::MakeString(
attachment[0]));
3049 msg->AddToObject(
"attachment1", MJsonNode::MakeString(
attachment[1]));
3051 msg->AddToObject(
"attachment2", MJsonNode::MakeString(
attachment[2]));
3053 msg->AddToObject(
"encoding", MJsonNode::MakeString(
encoding));
3063 doc->D(
"Query elog messages");
3064 doc->P(
"last_n_hours?",
MJSON_INT,
"return messages from the last N hours");
3065 doc->R(
"status",
MJSON_INT,
"return status of el_retrieve");
3092 MJsonNode*
msg_array = MJsonNode::MakeArray();
3097 char str[256],
str2[10000], tag[256];
3101 extern const char *
mname[];
3128 if (
py1.length() > 0)
3131 if (
pd1.length() > 0)
3135 for (
m1 = 0;
m1 < 12;
m1++)
3141 if (
pd2.length() > 0) {
3145 if (
py2.length() > 0) {
3149 for (
m2 = 0;
m2 < 12;
m2++)
3157 if (
py2.length() > 0) {
3161 if (
y2>=0 &&
m2>=0 &&
d2>=0) {
3163 tms.tm_year =
y2 % 100;
3168 if (
tms.tm_year < 90)
3184 sprintf(tag,
"%02d%02d%02d.0",
tms.tm_year % 100,
tms.tm_mon + 1,
tms.tm_mday);
3185 }
else if (
r1 > 0) {
3188 }
else if (
y1>=0 &&
m1>=0 &&
d1>=0) {
3194 printf(
"js_el_query: y1 %d, m1 %d, d1 %d, y2 %d, m2 %d, d2 %d, r1 %d, r2 %d, last_n_hours %d, start time %lu, end time %lu, tag [%s]\n",
3205 size =
sizeof(text);
3223 tms.tm_year = (tag[0] -
'0') * 10 + (tag[1] -
'0');
3224 tms.tm_mon = (tag[2] -
'0') * 10 + (tag[3] -
'0') - 1;
3225 tms.tm_mday = (tag[4] -
'0') * 10 + (tag[5] -
'0');
3226 tms.tm_hour = (
date[11] -
'0') * 10 + (
date[12] -
'0');
3227 tms.tm_min = (
date[14] -
'0') * 10 + (
date[15] -
'0');
3228 tms.tm_sec = (
date[17] -
'0') * 10 + (
date[18] -
'0');
3230 if (
tms.tm_year < 90)
3260 for (
i = 0;
i < (
int)
strlen(author) && author[
i] !=
'@';
i++)
3296 MJsonNode* msg = MJsonNode::MakeObject();
3299 msg->AddToObject(
"tag", MJsonNode::MakeString(
this_tag.c_str()));
3301 msg->AddToObject(
"date", MJsonNode::MakeString(
date));
3302 msg->AddToObject(
"run", MJsonNode::MakeInt(
run));
3304 msg->AddToObject(
"author", MJsonNode::MakeString(author));
3306 msg->AddToObject(
"type", MJsonNode::MakeString(
type));
3308 msg->AddToObject(
"system", MJsonNode::MakeString(
system));
3310 msg->AddToObject(
"subject", MJsonNode::MakeString(
subject));
3312 msg->AddToObject(
"text", MJsonNode::MakeString(text));
3314 msg->AddToObject(
"orig_tag", MJsonNode::MakeString(
orig_tag));
3316 msg->AddToObject(
"reply_tag", MJsonNode::MakeString(
reply_tag));
3318 msg->AddToObject(
"attachment0", MJsonNode::MakeString(
attachment[0]));
3320 msg->AddToObject(
"attachment1", MJsonNode::MakeString(
attachment[1]));
3322 msg->AddToObject(
"attachment2", MJsonNode::MakeString(
attachment[2]));
3324 msg->AddToObject(
"encoding", MJsonNode::MakeString(
encoding));
3338 doc->D(
"Delete elog message");
3340 doc->R(
"status",
MJSON_INT,
"return status of el_delete");
3344 MJsonNode* error =
NULL;
3345 std::string tag =
mjsonrpc_get_param(params,
"tag", &error)->GetString();
if (error)
return error;
3357static MJsonNode*
jrpc(
const MJsonNode* params)
3361 doc->D(
"make RPC call into frontend program via RPC_JRPC");
3362 doc->P(
"client_name",
MJSON_STRING,
"Connect to this MIDAS client, see cm_connect_client()");
3364 doc->P(
"args",
MJSON_STRING,
"Parameters passed to client as a string, could be JSON encoded");
3365 doc->P(
"max_reply_length?",
MJSON_INT,
"Optional maximum length of client reply. MIDAS RPC does not support returning strings of arbitrary length, maximum length has to be known ahead of time.");
3366 doc->R(
"reply",
MJSON_STRING,
"Reply from client as a string, could be JSON encoded");
3367 doc->R(
"status",
MJSON_INT,
"return status of cm_connect_client() and rpc_client_call()");
3371 MJsonNode* error =
NULL;
3373 std::string
name =
mjsonrpc_get_param(params,
"client_name", &error)->GetString();
if (error)
return error;
3374 std::string cmd =
mjsonrpc_get_param(params,
"cmd", &error)->GetString();
if (error)
return error;
3411 MJsonNode*
reply = MJsonNode::MakeString(buf);
3423static MJsonNode*
brpc(
const MJsonNode* params)
3427 doc->D(
"make RPC call into frontend program via RPC_BRPC");
3428 doc->P(
"client_name",
MJSON_STRING,
"Connect to this MIDAS client, see cm_connect_client()");
3430 doc->P(
"args",
MJSON_STRING,
"Parameters passed to client as a string, could be JSON encoded");
3431 doc->P(
"max_reply_length?",
MJSON_INT,
"Optional maximum length of client reply. MIDAS RPC does not support returning data of arbitrary length, maximum length has to be known ahead of time.");
3432 doc->R(
"reply",
MJSON_STRING,
"Reply from client as a string, could be JSON encoded");
3433 doc->R(
"status",
MJSON_INT,
"return status of cm_connect_client() and rpc_client_call()");
3437 MJsonNode* error =
NULL;
3439 std::string
name =
mjsonrpc_get_param(params,
"client_name", &error)->GetString();
if (error)
return error;
3440 std::string cmd =
mjsonrpc_get_param(params,
"cmd", &error)->GetString();
if (error)
return error;
3476 return MJsonNode::MakeArrayBuffer(buf,
buf_length);
3489 doc->D(
"start and stop runs");
3490 doc->P(
"transition",
MJSON_STRING,
"requested transition: TR_START, TR_STOP, TR_PAUSE, TR_RESUME");
3491 doc->P(
"run_number?",
MJSON_INT,
"New run number, value 0 means /runinfo/run_number + 1, default is 0");
3492 doc->P(
"async_flag?",
MJSON_INT,
"Transition type. Default is multithreaded transition TR_MTHREAD");
3493 doc->P(
"debug_flag?",
MJSON_INT,
"See cm_transition(), value 1: trace to stdout, value 2: trace to midas.log");
3494 doc->R(
"status",
MJSON_INT,
"return status of cm_transition()");
3495 doc->R(
"error_string?",
MJSON_STRING,
"return error string from cm_transition()");
3499 MJsonNode* error =
NULL;
3522 if (async_flag == 0)
3529 MJsonNode* result = MJsonNode::MakeObject();
3531 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3534 result->AddToObject(
"error_string", MJsonNode::MakeString(
error_str));
3586 printf(
", size %d, serial %d, time %d, event_id %d, trigger_mask %x",
pevent->
data_size,
pevent->
serial_number,
pevent->
time_stamp,
pevent->
event_id,
pevent->
trigger_mask);
3602 s->ReplaceEvent(pevent);
3604 }
else if (
bm_match_event(s->event_id, s->trigger_mask, pevent)) {
3605 s->ReplaceEvent(pevent);
3627 s->ReplaceEvent(pevent);
3670 doc->D(
"read event buffers");
3672 doc->P(
"event_id?",
MJSON_INT,
"requested event id, -1 means any event id");
3673 doc->P(
"trigger_mask?",
MJSON_INT,
"requested trigger mask, -1 means any trigger mask");
3674 doc->P(
"get_recent?",
MJSON_BOOL,
"get last available event that matches this event request");
3675 doc->P(
"last_event_header[]?",
MJSON_INT,
"do not resend an event we already received: event header of last received event [event_id,trigger_mask,serial_number,time_stamp]");
3676 doc->P(
"timeout_millisec?",
MJSON_NUMBER,
"how long to wait for an event");
3678 doc->R(
"status",
MJSON_INT,
"return status of bm_open_buffer(), bm_request_event(), bm_set_cache_size(), bm_receive_alloc()");
3682 MJsonNode* error =
NULL;
3698 return mjsonrpc_make_error(-32602,
"Invalid params",
"last_event_header should be an array with 4 elements");
3719 HNDLE buffer_handle = 0;
3727 static std::mutex
gMutex;
3728 std::lock_guard<std::mutex> lock_guard(
gMutex);
3737 MJsonNode* result = MJsonNode::MakeObject();
3738 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3743 MJsonNode* result = MJsonNode::MakeObject();
3744 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3750 MJsonNode* result = MJsonNode::MakeObject();
3751 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3789 return MJsonNode::MakeArrayBuffer((
char*)pevent,
event_size);
3804 MJsonNode* result = MJsonNode::MakeObject();
3805 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3819 return MJsonNode::MakeArrayBuffer((
char*)pevent,
event_size);
3822 MJsonNode* result = MJsonNode::MakeObject();
3837 doc->D(
"get current MIDAS time using ss_millitime()");
3838 doc->P(
NULL, 0,
"there are no input parameters");
3856 doc->D(
"get alarm data");
3857 doc->P(
"get_all?",
MJSON_BOOL,
"get all alarms, even in alarm system not active and alarms not triggered");
3858 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
3859 doc->R(
"alarm_system_active",
MJSON_BOOL,
"value of ODB \"/Alarms/alarm system active\"");
3861 doc->R(
"alarms[].triggered",
MJSON_BOOL,
"alarm is triggered");
3864 doc->R(
"alarms[].type",
MJSON_INT,
"alarm type AT_xxx");
3868 doc->R(
"alarms[].condition",
MJSON_STRING,
"alarm ODB condition field");
3869 doc->R(
"alarms[].evaluated_value?",
MJSON_STRING,
"evaluated alarm condition (AT_EVALUATED alarms only)");
3870 doc->R(
"alarms[].periodic_next_time?",
MJSON_STRING,
"next time the periodic alarm will fire (AT_PERIODIC alarms only)");
3871 doc->R(
"alarms[].time_triggered_first",
MJSON_STRING,
"time when alarm was triggered");
3872 doc->R(
"alarms[].show_to_user",
MJSON_STRING,
"final alarm text shown to user by mhttpd");
3895 size =
sizeof(
flag);
3908 "alarms", MJsonNode::MakeObject());
3919 MJsonNode*
alarms = MJsonNode::MakeObject();
3921 for (
int i = 0;;
i++) {
3935 size =
sizeof(
flag);
3943 MJsonNode* a = MJsonNode::MakeObject();
3945 a->AddToObject(
"triggered", MJsonNode::MakeBool(
flag!=0));
3948 size =
sizeof(
BOOL);
3951 a->AddToObject(
"active", MJsonNode::MakeBool(
flag!=0));
3954 strcpy(alarm_class,
"Alarm");
3955 size =
sizeof(alarm_class);
3959 a->AddToObject(
"class", MJsonNode::MakeString(alarm_class));
3962 size =
sizeof(
atype);
3965 a->AddToObject(
"type", MJsonNode::MakeInt(
atype));
3970 strcpy(
bgcol,
"red");
3972 if (
strlen(alarm_class) > 0) {
3973 sprintf(
str,
"/Alarms/Classes/%s/Display BGColor", alarm_class);
3974 size =
sizeof(
bgcol);
3979 a->AddToObject(
"bgcolor", MJsonNode::MakeString(
bgcol));
3982 strcpy(
fgcol,
"black");
3984 if (
strlen(alarm_class) > 0) {
3985 sprintf(
str,
"/Alarms/Classes/%s/Display FGColor", alarm_class);
3986 size =
sizeof(
fgcol);
3991 a->AddToObject(
"fgcolor", MJsonNode::MakeString(
fgcol));
3994 if (
strlen(alarm_class) > 0) {
3995 size =
sizeof(
BOOL);
3996 sprintf(
str,
"/Alarms/Classes/%s/Alarm sound", alarm_class);
3999 a->AddToObject(
"alarm_sound", MJsonNode::MakeBool(
flag!=0));
4007 a->AddToObject(
"message", MJsonNode::MakeString(msg));
4011 size =
sizeof(cond);
4015 a->AddToObject(
"condition", MJsonNode::MakeString(cond));
4025 a->AddToObject(
"evaluated_value", MJsonNode::MakeString(
value.c_str()));
4030 a->AddToObject(
"show_to_user", MJsonNode::MakeString(
show_to_user.c_str()));
4037 a->AddToObject(
"time_triggered_first", MJsonNode::MakeString(
str));
4041 size =
sizeof(
last);
4059 a->AddToObject(
"periodic_next_time", MJsonNode::MakeString(
ctimebuf));
4080 doc->D(
"js_make_subdir");
4081 doc->P(
"subdir",
MJSON_STRING,
"Create folder experiment_directory/userfiles/subdir");
4082 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4087 MJsonNode* error =
NULL;
4089 std::string subdir =
mjsonrpc_get_param(params,
"subdir", &error)->GetString();
if (error)
return error;
4092 if (subdir.find(
"..") != std::string::npos) {
4109 path +=
"userfiles";
4114 if (
mkdir(path.c_str(), 0777) != 0) {
4120 if (subdir.length() > 0) {
4129 if (
mkdir(path.c_str(), 0777) != 0) {
4135 MJsonNode* r = MJsonNode::MakeObject();
4136 r->AddToObject(
"status", MJsonNode::MakeInt(
SUCCESS));
4138 r->AddToObject(
"path", MJsonNode::MakeString(path.c_str()));
4146 doc->D(
"js_ext_list_files");
4147 doc->P(
"subdir",
MJSON_STRING,
"List files in experiment_directory/userfiles/subdir");
4149 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4157 MJsonNode* error =
NULL;
4158 std::string subdir =
mjsonrpc_get_param(params,
"subdir", &error)->GetString();
if (error)
return error;
4162 if (subdir.find(
"..") != std::string::npos) {
4167 if (
fileext.find(
"..") != std::string::npos) {
4195 path +=
"userfiles";
4200 if (
mkdir(path.c_str(), 0777) != 0) {
4205 if (subdir.length() > 0) {
4213 MJsonNode* s = MJsonNode::MakeArray();
4218 for (
int i=0 ;
i<
n ;
i++) {
4226 MJsonNode* f = MJsonNode::MakeArray();
4237 for (
int i=0 ;
i<
n ;
i++) {
4239 MJsonNode*
o = MJsonNode::MakeObject();
4248 o->AddToObject(
"description", MJsonNode::MakeString(
"description"));
4250 o->AddToObject(
"modtime", MJsonNode::MakeInt(
modtime));
4252 o->AddToObject(
"size", MJsonNode::MakeInt(
fsize));
4259 MJsonNode* r = MJsonNode::MakeObject();
4260 r->AddToObject(
"status", MJsonNode::MakeInt(
SUCCESS));
4262 r->AddToObject(
"path", MJsonNode::MakeString(path.c_str()));
4263 r->AddToObject(
"subdirs", s);
4264 r->AddToObject(
"files", f);
4274 doc->D(
"js_ext_save_file");
4275 doc->P(
"filename",
MJSON_STRING,
"File name, save in experiment_directory/userfiles/filename");
4277 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4284 MJsonNode* error =
NULL;
4285 std::string filename =
mjsonrpc_get_param(params,
"filename", &error)->GetString();
if (error)
return error;
4289 if (filename.find(
"..") != std::string::npos ) {
4308 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4312 path +=
"userfiles";
4317 if (
mkdir(path.c_str(), 0777) != 0) {
4325 FILE*
fp =
fopen(path.c_str(),
"w");
4340 std::string errstr =
"no error";
4350 doc->D(
"js_ext_read_script");
4351 doc->P(
"filename",
MJSON_STRING,
"File name, read from experiment_directory/userfiles/filename");
4353 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4358 MJsonNode* error =
NULL;
4359 std::string filename =
mjsonrpc_get_param(params,
"filename", &error)->GetString();
if (error)
return error;
4362 if (filename.find(
"..") != std::string::npos ||
4363 filename.find(
"*") != std::string::npos) {
4373 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4380 path +=
"userfiles";
4385 if (
mkdir(path.c_str(), 0777) != 0) {
4393 FILE*
fp =
fopen(path.c_str(),
"r");
4406 char* buffer =
new char[file_size+1];
4407 fread(buffer, file_size, 1,
fp);
4409 buffer[file_size] =
'\0';
4417 std::string errstr =
"no error";
4419 return mjsonrpc_make_result(
"content", MJsonNode::MakeString(
content.c_str()),
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(errstr.c_str()));
4431 doc->D(
"js_read_binary_file");
4432 doc->P(
"filename",
MJSON_STRING,
"File name, read from experiment_directory/userfiles/filename");
4434 doc->R(
"status",
MJSON_INT,
"Return status of midas library calls");
4439 MJsonNode* error =
NULL;
4441 if (error)
return error;
4444 if (filename.find(
"..") != std::string::npos ||
4445 filename.find(
"*") != std::string::npos) {
4455 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4462 path +=
"userfiles";
4467 if (
mkdir(path.c_str(), 0777) != 0) {
4475 FILE*
fp =
fopen(path.c_str(),
"rb");
4488 char* buffer =
new char[file_size];
4489 fread(buffer, file_size, 1,
fp);
4495 std::string errstr =
"no error";
4497 MJsonNode* result = MJsonNode::MakeArrayBuffer(buffer, file_size);
4512 doc->D(
"get current value of mjsonrpc_debug");
4513 doc->P(
NULL, 0,
"there are no input parameters");
4525 doc->D(
"set new value of mjsonrpc_debug");
4539 doc->D(
"get current value of mjsonrpc_sleep");
4540 doc->P(
NULL, 0,
"there are no input parameters");
4552 doc->D(
"set new value of mjsonrpc_sleep");
4566 doc->D(
"get current value of mjsonrpc_time");
4567 doc->P(
NULL, 0,
"there are no input parameters");
4579 doc->D(
"set new value of mjsonrpc_time");
4593 doc->D(
"Get the MIDAS JSON-RPC schema JSON object");
4594 doc->P(
NULL, 0,
"there are no input parameters");
4606 doc->D(
"get current server timezone offset in seconds");
4607 doc->P(
NULL, 0,
"there are no input parameters");
4653 gMutex = (std::mutex*)mutex;
4659 printf(
"mjsonrpc_init!\n");
4743 printf(
"mjsonrpc_exit!\n");
4752 MJsonNode* s = MJsonNode::MakeObject();
4754 s->AddToObject(
"$schema", MJsonNode::MakeString(
"http://json-schema.org/schema#"));
4755 s->AddToObject(
"id", MJsonNode::MakeString(
"MIDAS JSON-RPC autogenerated schema"));
4756 s->AddToObject(
"title", MJsonNode::MakeString(
"MIDAS JSON-RPC schema"));
4757 s->AddToObject(
"description", MJsonNode::MakeString(
"Autogenerated schema for all MIDAS JSON-RPC methods"));
4758 s->AddToObject(
"type", MJsonNode::MakeString(
"object"));
4760 MJsonNode* m = MJsonNode::MakeObject();
4766 MJsonNode*
doc = iterator->second.fHandler(
NULL);
4768 doc = MJsonNode::MakeObject();
4769 m->AddToObject(iterator->first.c_str(),
doc);
4772 s->AddToObject(
"properties", m);
4773 s->AddToObject(
"required", MJsonNode::MakeArray());
4788 std::string
str = s->Stringify(1);
4789 printf(
"MJSON-RPC schema:\n");
4795static std::string
indent(
int x,
const char* p =
" ")
4800 for (
int i=0;
i<x;
i++)
4821 void Output(
int nest,
bool span, std::string text)
4823 if (text.length() < 1)
4836 std::vector<std::string>
tab;
4837 std::vector<std::string>
tabx;
4843 std::string
xtab =
"";
4845 for (
int n=0; ;
n++) {
4847 for (
unsigned i=0;
i<
fLines.size();
i++) {
4854 int l =
fLines[
i].text.length();
4862 tab.push_back(
indent(len,
" ") +
" | ");
4871 for (
unsigned i=0;
i<
fLines.size();
i++) {
4885 s += std::string(
" | ") +
fLines[
i].text +
pad;
4886 else if (
n == nest) {
4888 if (
n == 0 ||
n == 1)
4893 if (
n == 0 ||
n == 1)
4909 const MJsonNode*
d =
schema->FindObjectNode(
"description");
4914 std::string
xshort =
"object";
4918 const MJsonNode* properties =
schema->FindObjectNode(
"properties");
4921 const MJsonNode* r =
schema->FindObjectNode(
"required");
4944 s += nest +
"<table border=1>\n";
4947 s += nest +
"<tr>\n";
4948 s += nest +
" <td colspan=3>" +
description +
"</td>\n";
4949 s += nest +
"</tr>\n";
4954 for (
unsigned i=0;
i<
names->size();
i++) {
4955 std::string
name = (*names)[
i];
4956 const MJsonNode*
node = (*nodes)[
i];
4958 bool required =
false;
4968 const MJsonNode*
type =
node->FindObjectNode(
"type");
4969 if (
type &&
type->GetString() ==
"array")
4980 s += nest +
"<tr>\n";
4981 s += nest +
" <td>" +
name +
"</td>\n";
4982 s += nest +
" <td>";
4985 s += nest +
"</tr>\n";
4988 s += nest +
"</table>\n";
4995 const MJsonNode*
d =
schema->FindObjectNode(
"description");
5000 std::string
xshort =
"array";
5004 const MJsonNode* items =
schema->FindObjectNode(
"items");
5026 s += nest +
"<table border=1>\n";
5029 s += nest +
"<tr>\n";
5031 s += nest +
"</tr>\n";
5036 for (
unsigned i=0;
i<
nodes->size();
i++) {
5039 s += nest +
"<tr>\n";
5041 s += nest +
"</tr>\n";
5044 s += nest +
"</table>\n";
5055 const MJsonNode* t =
schema->FindObjectNode(
"type");
5057 type = t->GetString();
5061 const MJsonNode*
d =
schema->FindObjectNode(
"description");
5069 if (
type ==
"object") {
5071 }
else if (
type ==
"array") {
5101static void add(std::string* s,
const char* text)
5104 if (s->length() > 0)
5112 const MJsonNode* version =
request->FindObjectNode(
"jsonrpc");
5113 const MJsonNode* method =
request->FindObjectNode(
"method");
5114 const MJsonNode* params =
request->FindObjectNode(
"params");
5115 const MJsonNode*
id =
request->FindObjectNode(
"id");
5117 std::string
bad =
"";
5120 add(&
bad,
"jsonrpc version is missing");
5122 add(&
bad,
"method is missing");
5124 add(&
bad,
"params is missing");
5126 add(&
bad,
"id is missing");
5129 add(&
bad,
"jsonrpc version is not a string");
5130 if (version&&version->GetString() !=
"2.0")
5131 add(&
bad,
"jsonrpc version is not 2.0");
5134 add(&
bad,
"method is not a string");
5136 if (
bad.length() > 0) {
5138 response->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5140 response->AddToObject(
"id", id->Copy());
5142 response->AddToObject(
"id", MJsonNode::MakeNull());
5146 printf(
"mjsonrpc: invalid request: reply:\n");
5154 double start_time = 0;
5160 const std::string
ms = method->GetString();
5161 const char* m =
ms.c_str();
5163 MJsonNode* result =
NULL;
5167 if (
strcmp(m,
"echo") == 0) {
5169 }
else if (
strcmp(m,
"error") == 0) {
5171 }
else if (
strcmp(m,
"invalid_json") == 0) {
5173 printf(
"mjsonrpc: reply with invalid json\n");
5175 return MJsonNode::MakeJSON(
"this is invalid json data");
5176 }
else if (
strcmp(m,
"test_nan_inf") == 0) {
5179 double nan = zero/zero;
5182 MJsonNode*
n = MJsonNode::MakeArray();
5183 n->AddToArray(MJsonNode::MakeNumber(
nan));
5184 n->AddToArray(MJsonNode::MakeNumber(
plusinf));
5185 n->AddToArray(MJsonNode::MakeNumber(
minusinf));
5187 }
else if (
strcmp(m,
"test_arraybuffer") == 0) {
5189 printf(
"mjsonrpc: reply with test arraybuffer data\n");
5192 char* ptr = (
char*)
malloc(size);
5193 for (
size_t i=0;
i<size;
i++) {
5196 *((
short*)(ptr+4*2*1)) = 111;
5197 *((
int*)(ptr+4*2*2)) = 1234;
5198 *((
double*)(ptr+4*2*3)) = 3.14;
5199 return MJsonNode::MakeArrayBuffer(ptr, size);
5203 bool lock = s->second.fNeedsLocking;
5206 result = s->second.fHandler(params);
5215 printf(
"mjsonrpc: handler reply:\n");
5220 double end_time = 0;
5234 const MJsonNode *
nerror = result->FindObjectNode(
"error");
5235 const MJsonNode *
nresult = result->FindObjectNode(
"result");
5238 result->DeleteObjectNode(
"result");
5240 result->DeleteObjectNode(
"error");
5243 result =
mjsonrpc_make_error(-32603,
"Internal error",
"bad dispatcher reply: no result and no error");
5246 result->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5249 result->AddToObject(
"id", id->Copy());
5251 result->AddToObject(
"id", MJsonNode::MakeNull());
5255 result->AddToObject(
"elapsed_time", MJsonNode::MakeNumber(
elapsed_time));
5258 assert(result !=
NULL);
5271 printf(
"mjsonrpc: request:\n");
5287 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5288 reply->AddToObject(
"id", MJsonNode::MakeNull());
5291 printf(
"mjsonrpc: invalid json: reply:\n");
5305 if (a->size() < 1) {
5307 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5308 reply->AddToObject(
"id", MJsonNode::MakeNull());
5311 printf(
"mjsonrpc: invalid json: reply:\n");
5320 MJsonNode*
reply = MJsonNode::MakeArray();
5322 for (
unsigned i=0;
i<a->size();
i++) {
5324 reply->AddToArray(r);
5328 reply =
mjsonrpc_make_error(-32600,
"Invalid request",
"MJSON_ARRAYBUFFER return is not permitted for batch requests");
5329 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5330 reply->AddToObject(
"id", MJsonNode::MakeNull());
5339 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5340 reply->AddToObject(
"id", MJsonNode::MakeNull());
5343 printf(
"mjsonrpc: invalid json: reply:\n");
void Add(time_t t, double v)
std::vector< double > fValues
std::vector< double > fTimes
void Add(time_t t, double v)
virtual int hs_get_events(time_t time_from, std::vector< std::string > *pevents)=0
get list of events that exist(ed) at given time and later (value 0 means "return all events from begi...
virtual int hs_get_tags(const char *event_name, time_t time_from, std::vector< TAG > *ptags)=0
get list of history variables for given event (use event names returned by hs_get_events()) that exis...
virtual int hs_read_buffer(time_t start_time, time_t end_time, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], MidasHistoryBufferInterface *buffer[], int status[])=0
returns HS_SUCCESS
virtual int hs_get_last_written(time_t start_time, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], time_t last_written[])=0
virtual int hs_clear_cache()=0
clear internal cache, returns HS_SUCCESS
virtual int hs_read_binned(time_t start_time, time_t end_time, int num_bins, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], int num_entries[], int *count_bins[], double *mean_bins[], double *rms_bins[], double *min_bins[], double *max_bins[], time_t *bins_first_time[], double *bins_first_value[], time_t *bins_last_time[], double *bins_last_value[], time_t last_time[], double last_value[], int status[])=0
returns HS_SUCCESS
void Output(int nest, bool span, std::string text)
std::vector< NestedLine > fLines
INT transition(INT run_number, char *error)
INT al_trigger_class(const char *alarm_class, const char *alarm_message, BOOL first)
BOOL al_evaluate_condition(const char *alarm_name, const char *condition, std::string *pvalue)
INT al_reset_alarm(const char *alarm_name)
INT al_trigger_alarm(const char *alarm_name, const char *alarm_message, const char *default_class, const char *cond_str, INT type)
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
INT bm_request_event(HNDLE buffer_handle, short int event_id, short int trigger_mask, INT sampling_type, HNDLE *request_id, EVENT_HANDLER *func)
INT bm_set_cache_size(INT buffer_handle, size_t read_size, size_t write_size)
INT bm_match_event(short int event_id, short int trigger_mask, const EVENT_HEADER *pevent)
INT bm_get_buffer_handle(const char *buffer_name, INT *buffer_handle)
INT bm_receive_event_alloc(INT buffer_handle, EVENT_HEADER **ppevent, int timeout_msec)
INT cm_shutdown(const char *name, BOOL bUnique)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT cm_connect_client(const char *client_name, HNDLE *hConn)
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
std::string cm_expand_env(const char *str)
int cm_exec_script(const char *odb_path_to_script)
std::string cm_get_path()
INT cm_exist(const char *name, BOOL bUnique)
INT el_search_run(int run, char *return_tag)
INT el_retrieve(char *tag, char *date, int *run, char *author, char *type, char *syst, char *subject, char *text, int *textsize, char *orig_tag, char *reply_tag, char *attachment1, char *attachment2, char *attachment3, char *encoding)
INT el_delete_message(const char *tag)
#define DB_NO_MORE_SUBKEYS
MJSO * AddArray(const char *name, const char *description)
void D(const char *description)
MJsonNode * mjsonrpc_decode_post_data(const char *post_data)
void P(const char *name, int mjson_type, const char *description)
MJsonNode * mjsonrpc_make_result(MJsonNode *node)
MJSO * AddObject(const char *name, const char *description)
static MJSO * MakeArraySchema(const char *description)
MJSO * RA(const char *description)
MJsonNode *() mjsonrpc_handler_t(const MJsonNode *params)
void Add(const char *name, int mjson_type, const char *description)
void mjsonrpc_user_init()
void AddToSchema(MJsonNode *s, const char *name)
MJsonNode * mjsonrpc_make_error(int code, const char *message, const char *data)
MJsonNode * mjsonrpc_get_schema()
static MJSO * MakeObjectSchema(const char *description)
void mjsonrpc_set_std_mutex(void *mutex)
const MJsonNode * mjsonrpc_get_param(const MJsonNode *params, const char *name, MJsonNode **error)
std::string mjsonrpc_schema_to_text(const MJsonNode *schema)
void mjsonrpc_add_handler(const char *method, mjsonrpc_handler_t *handler, bool needs_locking)
void R(const char *name, int mjson_type, const char *description)
MJSO * PA(const char *description)
#define MAX_STRING_LENGTH
time_t ss_mktime(struct tm *tms)
INT ss_dirlink_find(const char *path, const char *pattern, char **plist)
time_t ss_file_time(const char *path)
double ss_file_size(const char *path)
INT ss_sleep(INT millisec)
bool ss_repair_utf8(char *string)
INT ss_system(const char *command)
INT ss_file_find(const char *path, const char *pattern, char **plist)
INT cm_msg1(INT message_type, const char *filename, INT line, const char *facility, const char *routine, const char *format,...)
INT EXPRT cm_msg_facilities(STRING_LIST *list)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
INT cm_msg_retrieve2(const char *facility, time_t t, INT n_message, char **messages, int *num_messages)
BOOL equal_ustring(const char *str1, const char *str2)
INT db_delete_key(HNDLE hDB, HNDLE hKey, BOOL follow_links)
INT db_find_link(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_reorder_key(HNDLE hDB, HNDLE hKey, INT idx)
INT db_create_key(HNDLE hDB, HNDLE hKey, const char *key_name, DWORD type)
INT db_copy_json_save(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end)
MJsonNode * db_scl(HNDLE hDB)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT db_copy_json_index(HNDLE hDB, HNDLE hKey, int index, char **buffer, int *buffer_size, int *buffer_end)
INT db_set_data(HNDLE hDB, HNDLE hKey, const void *data, INT buf_size, INT num_values, DWORD type)
INT db_enum_link(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT db_copy_json_ls(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end)
INT db_copy_json_values(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end, int omit_names, int omit_last_written, time_t omit_old_timestamp, int preserve_case)
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
MJsonNode * db_sor(HNDLE hDB, const char *root_path)
INT db_rename_key(HNDLE hDB, HNDLE hKey, const char *name)
INT db_enum_key(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT EXPRT db_resize_string(HNDLE hdb, HNDLE hKeyRoot, const char *key_name, int num_values, int max_string_length)
INT db_set_num_values(HNDLE hDB, HNDLE hKey, INT num_values)
INT db_create_link(HNDLE hDB, HNDLE hKey, const char *link_name, const char *destination)
INT EXPRT db_paste_json_node(HNDLE hDB, HNDLE hKeyRoot, int index, const MJsonNode *node)
INT rpc_client_call(HNDLE hConn, DWORD routine_id,...)
int hs_read_event_list(std::vector< std::string > *pevents)
int hs_find_reader_channel(HNDLE hDB, HNDLE *hKeyOut, int debug_flag)
int hs_get_history(HNDLE hDB, HNDLE hKey, int flags, int debug_flag, MidasHistoryInterface **mh)
int hs_image_retrieve(std::string image_name, time_t start_time, time_t stop_time, std::vector< time_t > &vtime, std::vector< std::string > &vfilename)
char buffer_name[NAME_LENGTH]
std::string msprintf(const char *format,...)
#define DIR_SEPARATOR_STR
std::vector< std::string > STRING_LIST
MidasHistoryInterface * mh
#define message(type, str)
static MJsonNode * brpc(const MJsonNode *params)
static MJsonNode * js_cm_transition(const MJsonNode *params)
static MJsonNode * set_sleep(const MJsonNode *params)
const MJsonNodeVector * mjsonrpc_get_param_array(const MJsonNode *params, const char *name, MJsonNode **error)
static MJsonNode * js_cm_msg1(const MJsonNode *params)
static MJsonNode * get_sleep(const MJsonNode *params)
static MJsonNode * js_al_trigger_class(const MJsonNode *params)
std::map< std::string, MethodsTableEntry > MethodsTable
static MJsonNode * js_el_delete(const MJsonNode *params)
static MJsonNode * js_hs_read_arraybuffer(const MJsonNode *params)
static MJsonNode * jrpc(const MJsonNode *params)
static MJsonNode * js_db_paste(const MJsonNode *params)
static MhiMap gHistoryChannels
static MJsonNode * js_ext_save_file(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_array(const MJsonNode *schema, int nest_level, NestedOutput *o)
static MJsonNode * js_get_timezone(const MJsonNode *params)
static MJsonNode * js_ext_list_files(const MJsonNode *params)
static void StashEvent(const std::string buffer_name, int event_id, int trigger_mask, const EVENT_HEADER *pevent)
static int parse_array_index_list(const char *method, const char *path, std::vector< unsigned > *list)
static MJsonNode * js_hs_read_binned(const MJsonNode *params)
static MJsonNode * js_ext_read_file(const MJsonNode *params)
static MJsonNode * start_program(const MJsonNode *params)
static MJsonNode * js_hs_get_last_written(const MJsonNode *params)
static MJsonNode * js_bm_receive_event(const MJsonNode *params)
static MJsonNode * js_hs_get_active_events(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_anything(const MJsonNode *schema, int nest_level, NestedOutput *o)
static MJsonNode * js_db_ls(const MJsonNode *params)
static MJsonNode * js_db_sor(const MJsonNode *params)
static std::string remove(const std::string s, char c)
static MJsonNode * js_db_copy(const MJsonNode *params)
static MJsonNode * js_db_scl(const MJsonNode *params)
static MJsonNode * js_cm_msg_retrieve(const MJsonNode *params)
static void DeleteEventStash()
static MJsonNode * xnull(const MJsonNode *params)
static MJsonNode * js_ss_millitime(const MJsonNode *params)
static MJsonNode * js_db_delete(const MJsonNode *params)
static const EVENT_HEADER * CopyEvent(const EVENT_HEADER *pevent)
MethodsTable::iterator MethodsTableIterator
static MJsonNode * js_read_binary_file(const MJsonNode *params)
static MJsonNode * js_db_rename(const MJsonNode *params)
static MJsonNode * js_cm_msg_facilities(const MJsonNode *params)
static int mjsonrpc_sleep
static MJsonNode * js_db_key(const MJsonNode *params)
static MJsonNode * js_cm_exist(const MJsonNode *params)
static MJsonNode * js_db_reorder(const MJsonNode *params)
static MidasHistoryInterface * GetHistory(const char *name)
std::map< std::string, MidasHistoryInterface * > MhiMap
static MJsonNode * js_db_resize_string(const MJsonNode *params)
static MJsonNode * mjsonrpc_handle_request(const MJsonNode *request)
static MJsonNode * js_hs_get_tags(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_object(const MJsonNode *schema, int nest_level, NestedOutput *o)
static std::mutex * gMutex
static MJsonNode * js_el_retrieve(const MJsonNode *params)
static MJsonNode * get_alarms(const MJsonNode *params)
static MJsonNode * js_el_query(const MJsonNode *params)
static MJsonNode * js_db_link(const MJsonNode *params)
static MJsonNode * exec_script(const MJsonNode *params)
static MJsonNode * get_schema(const MJsonNode *params)
static std::vector< EventStashEntry * > gEventStash
static std::string indent(int x, const char *p=" ")
static MJsonNode * js_al_reset_alarm(const MJsonNode *params)
static double GetTimeSec()
static MJsonNode * set_time(const MJsonNode *params)
static MJsonNode * set_debug(const MJsonNode *params)
static MJsonNode * js_db_resize(const MJsonNode *params)
static MJsonNode * js_hs_get_events(const MJsonNode *params)
static MJsonNode * gNullNode
static MJsonNode * js_hs_read(const MJsonNode *params)
static MJsonNode * js_make_subdir(const MJsonNode *params)
static std::mutex gEventStashMutex
static MJsonNode * js_hs_image_retrieve(const MJsonNode *params)
static const EVENT_HEADER * FindEvent(const std::string buffer_name, int event_id, int trigger_mask, int last_event_id, int last_trigger_mask, DWORD last_serial_number, DWORD last_time_stamp)
static MJsonNode * get_debug(const MJsonNode *params)
static MJsonNode * js_cm_shutdown(const MJsonNode *params)
static MethodsTable gMethodsTable
static MJsonNode * js_db_get_values(const MJsonNode *params)
static MJsonNode * js_al_trigger_alarm(const MJsonNode *params)
static MJsonNode * js_db_create(const MJsonNode *params)
static MJsonNode * mjsonrpc_make_schema(MethodsTable *h)
static MJsonNode * js_hs_read_binned_arraybuffer(const MJsonNode *params)
static MJsonNode * js_hs_get_channels(const MJsonNode *params)
static void MatchEvent(const std::string buffer_name, const EVENT_HEADER *pevent)
static MJsonNode * js_hs_reopen(const MJsonNode *params)
int gettimeofday(struct timeval *tp, void *tzp)
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
const EVENT_HEADER * pevent
void ReplaceEvent(const EVENT_HEADER *xpevent)
mjsonrpc_handler_t * fHandler
static te_expr * list(state *s)